Draw underline and strikeout for ExtTextOut on an open path using
Polygon to more closely mimic what Windows does.
This commit is contained in:
parent
b55060844b
commit
cc748043cd
103
dlls/gdi/font.c
103
dlls/gdi/font.c
|
@ -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));
|
||||
|
||||
if(lf.lfStrikeOut)
|
||||
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);
|
||||
}
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue