Draw underline and strikeout using Polygon to more closely mimic
what Windows does. Take 2
Dmitry Timoshkov
dmitry at baikal.ru
Tue Sep 27 10:07:04 CDT 2005
Hello,
here is another version of the patch which leaves old (non-path logic)
intact as suggested by Alexandre, and introduces new code for an on-path
branch which uses Polygon to draw underline and strikeout.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Draw underline and strikeout for ExtTextOut on an open path using
Polygon to more closely mimic what Windows does.
--- cvs/hq/wine/dlls/gdi/font.c 2005-09-22 13:31:35.000000000 +0900
+++ wine/dlls/gdi/font.c 2005-09-27 23:53:39.000000000 +0900
@@ -2060,8 +2060,6 @@ done:
if(!size)
{
- TEXTMETRICW tm;
- GetTextMetricsW(hdc, &tm);
underlinePos = 0;
underlineWidth = tm.tmAscent / 20 + 1;
strikeoutPos = tm.tmAscent / 2;
@@ -2078,36 +2076,85 @@ done:
HeapFree(GetProcessHeap(), 0, otm);
}
- if(lf.lfUnderline)
+ if (PATH_IsPathOpen(dc->path))
{
- POINT pts[2], oldpt;
- HPEN hpen = CreatePen(PS_SOLID, underlineWidth, GetTextColor(hdc));
- hpen = SelectObject(hdc, hpen);
- pts[0].x = x;
- pts[0].y = y;
- pts[1].x = x + xwidth;
- pts[1].y = y - ywidth;
- DPtoLP(hdc, pts, 2);
- MoveToEx(hdc, pts[0].x - underlinePos * sinEsc, pts[0].y - underlinePos * cosEsc, &oldpt);
- LineTo(hdc, pts[1].x - underlinePos * sinEsc, pts[1].y - underlinePos * cosEsc);
- MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
- DeleteObject(SelectObject(hdc, hpen));
+ POINT pts[5];
+ HPEN hpen;
+ HBRUSH hbrush = CreateSolidBrush(GetTextColor(hdc));
+
+ hbrush = SelectObject(hdc, hbrush);
+ hpen = SelectObject(hdc, GetStockObject(NULL_PEN));
+
+ if (lf.lfUnderline)
+ {
+ pts[0].x = x - underlinePos * sinEsc;
+ pts[0].y = y - underlinePos * cosEsc;
+ pts[1].x = x + xwidth - underlinePos * sinEsc;
+ pts[1].y = y - ywidth - underlinePos * cosEsc;
+ pts[2].x = pts[1].x + underlineWidth * sinEsc;
+ pts[2].y = pts[1].y + underlineWidth * cosEsc;
+ pts[3].x = pts[0].x + underlineWidth * sinEsc;
+ pts[3].y = pts[0].y + underlineWidth * cosEsc;
+ pts[4].x = pts[0].x;
+ pts[4].y = pts[0].y;
+ DPtoLP(hdc, pts, 5);
+ Polygon(hdc, pts, 5);
+ }
+
+ if (lf.lfStrikeOut)
+ {
+ pts[0].x = x - strikeoutPos * sinEsc;
+ pts[0].y = y - strikeoutPos * cosEsc;
+ pts[1].x = x + xwidth - strikeoutPos * sinEsc;
+ pts[1].y = y - ywidth - strikeoutPos * cosEsc;
+ pts[2].x = pts[1].x + strikeoutWidth * sinEsc;
+ pts[2].y = pts[1].y + strikeoutWidth * cosEsc;
+ pts[3].x = pts[0].x + strikeoutWidth * sinEsc;
+ pts[3].y = pts[0].y + strikeoutWidth * cosEsc;
+ pts[4].x = pts[0].x;
+ pts[4].y = pts[0].y;
+ DPtoLP(hdc, pts, 5);
+ Polygon(hdc, pts, 5);
+ }
+
+ SelectObject(hdc, hpen);
+ hbrush = SelectObject(hdc, hbrush);
+ DeleteObject(hbrush);
}
-
- if(lf.lfStrikeOut)
+ else
{
POINT pts[2], oldpt;
- HPEN hpen = CreatePen(PS_SOLID, strikeoutWidth, GetTextColor(hdc));
- hpen = SelectObject(hdc, hpen);
- pts[0].x = x;
- pts[0].y = y;
- pts[1].x = x + xwidth;
- pts[1].y = y - ywidth;
- DPtoLP(hdc, pts, 2);
- MoveToEx(hdc, pts[0].x - strikeoutPos * sinEsc, pts[0].y - strikeoutPos * cosEsc, &oldpt);
- LineTo(hdc, pts[1].x - strikeoutPos * sinEsc, pts[1].y - strikeoutPos * cosEsc);
- MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
- DeleteObject(SelectObject(hdc, hpen));
+ HPEN hpen;
+
+ if (lf.lfUnderline)
+ {
+ hpen = CreatePen(PS_SOLID, underlineWidth, GetTextColor(hdc));
+ hpen = SelectObject(hdc, hpen);
+ pts[0].x = x;
+ pts[0].y = y;
+ pts[1].x = x + xwidth;
+ pts[1].y = y - ywidth;
+ DPtoLP(hdc, pts, 2);
+ MoveToEx(hdc, pts[0].x - underlinePos * sinEsc, pts[0].y - underlinePos * cosEsc, &oldpt);
+ LineTo(hdc, pts[1].x - underlinePos * sinEsc, pts[1].y - underlinePos * cosEsc);
+ MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
+ DeleteObject(SelectObject(hdc, hpen));
+ }
+
+ if (lf.lfStrikeOut)
+ {
+ hpen = CreatePen(PS_SOLID, strikeoutWidth, GetTextColor(hdc));
+ hpen = SelectObject(hdc, hpen);
+ pts[0].x = x;
+ pts[0].y = y;
+ pts[1].x = x + xwidth;
+ pts[1].y = y - ywidth;
+ DPtoLP(hdc, pts, 2);
+ MoveToEx(hdc, pts[0].x - strikeoutPos * sinEsc, pts[0].y - strikeoutPos * cosEsc, &oldpt);
+ LineTo(hdc, pts[1].x - strikeoutPos * sinEsc, pts[1].y - strikeoutPos * cosEsc);
+ MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
+ DeleteObject(SelectObject(hdc, hpen));
+ }
}
}
More information about the wine-patches
mailing list