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