https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f7bc0543cbec592ef04171...
commit f7bc0543cbec592ef04171a1197defc78823b3b5 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Wed May 1 16:51:00 2019 +0900 Commit: GitHub noreply@github.com CommitDate: Wed May 1 16:51:00 2019 +0900
[WIN32SS][NTGDI] Fix ExtTextOut about TA_UPDATECP (#1546)
Add WORLD_XFORM_CHANGED flag to some positioning functions. Fix IntExtTextOutW function for TA_UPDATECP alignment, so that it can correctly update the current position. CORE-14994 --- win32ss/gdi/ntgdi/coord.c | 24 +++++++++++++++--------- win32ss/gdi/ntgdi/freetype.c | 7 +++++-- 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/win32ss/gdi/ntgdi/coord.c b/win32ss/gdi/ntgdi/coord.c index adaee5f0abb..bea04e28aa0 100644 --- a/win32ss/gdi/ntgdi/coord.c +++ b/win32ss/gdi/ntgdi/coord.c @@ -600,7 +600,7 @@ NtGdiOffsetViewportOrgEx( } pdcattr->ptlViewportOrg.x += XOffset; pdcattr->ptlViewportOrg.y += YOffset; - pdcattr->flXform |= PAGE_XLATE_CHANGED | DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
DC_UnlockDc(dc);
@@ -652,7 +652,7 @@ NtGdiOffsetWindowOrgEx(
pdcattr->ptlWindowOrg.x += XOffset; pdcattr->ptlWindowOrg.y += YOffset; - pdcattr->flXform |= PAGE_XLATE_CHANGED|DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
DC_UnlockDc(dc);
@@ -701,6 +701,7 @@ NtGdiScaleViewportExtEx(
pdcattr->flXform |= (PAGE_EXTENTS_CHANGED | INVALIDATE_ATTRIBUTES | + WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID);
if (pdcattr->iMapMode == MM_ISOTROPIC) @@ -802,7 +803,10 @@ NtGdiScaleWindowExtEx(
IntMirrorWindowOrg(pDC);
- pdcattr->flXform |= (PAGE_EXTENTS_CHANGED|INVALIDATE_ATTRIBUTES|DEVICE_TO_WORLD_INVALID); + pdcattr->flXform |= (PAGE_EXTENTS_CHANGED | + INVALIDATE_ATTRIBUTES | + WORLD_XFORM_CHANGED | + DEVICE_TO_WORLD_INVALID);
Ret = TRUE; } @@ -896,8 +900,9 @@ IntGdiSetMapMode( pdcattr->iMapMode = MapMode;
/* Update xform flags */ - pdcattr->flXform = flXform | (PAGE_XLATE_CHANGED|PAGE_EXTENTS_CHANGED| - INVALIDATE_ATTRIBUTES|DEVICE_TO_PAGE_INVALID|DEVICE_TO_WORLD_INVALID); + pdcattr->flXform = flXform | (PAGE_XLATE_CHANGED | PAGE_EXTENTS_CHANGED | + INVALIDATE_ATTRIBUTES | DEVICE_TO_PAGE_INVALID | + WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID);
return iPrevMapMode; } @@ -929,7 +934,7 @@ GreSetViewportOrgEx(
pdcattr->ptlViewportOrg.x = X; pdcattr->ptlViewportOrg.y = Y; - pdcattr->flXform |= PAGE_XLATE_CHANGED | DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
DC_UnlockDc(dc); return TRUE; @@ -980,7 +985,7 @@ NtGdiSetViewportOrgEx(
pdcattr->ptlViewportOrg.x = X; pdcattr->ptlViewportOrg.y = Y; - pdcattr->flXform |= PAGE_XLATE_CHANGED | DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
DC_UnlockDc(dc);
@@ -1032,7 +1037,7 @@ NtGdiSetWindowOrgEx(
pdcattr->ptlWindowOrg.x = X; pdcattr->ptlWindowOrg.y = Y; - pdcattr->flXform |= PAGE_XLATE_CHANGED | DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
DC_UnlockDc(dc);
@@ -1068,7 +1073,7 @@ IntMirrorWindowOrg(PDC dc) X = (X * pdcattr->szlWindowExt.cx) / cx;
pdcattr->ptlWindowOrg.x = pdcattr->lWindowOrgx - X; // Now set the inverted win origion. - pdcattr->flXform |= PAGE_XLATE_CHANGED | DEVICE_TO_WORLD_INVALID; + pdcattr->flXform |= PAGE_XLATE_CHANGED | WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID;
return; } @@ -1108,6 +1113,7 @@ DC_vSetLayout(
pdcattr->flXform |= (PAGE_EXTENTS_CHANGED | INVALIDATE_ATTRIBUTES | + WORLD_XFORM_CHANGED | DEVICE_TO_WORLD_INVALID); }
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 7d19d159f8a..0f04a3a5d15 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -6306,8 +6306,11 @@ IntExtTextOutW( MouseSafetyOnDrawEnd(dc->ppdev); }
- if (pdcattr->flTextAlign & TA_UPDATECP) { - pdcattr->ptlCurrent.x = DestRect.right - dc->ptlDCOrig.x; + if (pdcattr->flTextAlign & TA_UPDATECP) + { + pdcattr->ptlCurrent.x = vecs[2].x - dc->ptlDCOrig.x; + pdcattr->ptlCurrent.y = vecs[2].y - dc->ptlDCOrig.y; + IntDPtoLP(dc, &pdcattr->ptlCurrent, 1); }
IntUnLockFreeType();