https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3f3714bad425842d2c5c9de30ff6e9c9176e0739

commit 3f3714bad425842d2c5c9de30ff6e9c9176e0739
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Fri Nov 25 11:23:29 2022 +0900
Commit:     GitHub <[email protected]>
CommitDate: Fri Nov 25 11:23:29 2022 +0900

    [NTGDI][FREETYPE] Font cache: Use FT_Matrix instead of MATRIX (#4900)
    
    - Use FT_Matrix instead of MATRIX in FONT_CACHE_ENTRY structure.
    - Use FtMatrixFromMx and FT_Set_Transform instead of 
FtSetCoordinateTransform.
    CORE-11848
---
 win32ss/gdi/ntgdi/font.h     |   2 +-
 win32ss/gdi/ntgdi/freetype.c | 103 +++++++++++++++++--------------------------
 2 files changed, 41 insertions(+), 64 deletions(-)

diff --git a/win32ss/gdi/ntgdi/font.h b/win32ss/gdi/ntgdi/font.h
index 908a9f5b65f..2ed0f2d93be 100644
--- a/win32ss/gdi/ntgdi/font.h
+++ b/win32ss/gdi/ntgdi/font.h
@@ -33,7 +33,7 @@ typedef struct _FONT_CACHE_ENTRY
     int Width;
     int Escapement;
     FT_Render_Mode RenderMode;
-    MATRIX mxWorldToDevice;
+    FT_Matrix matTransform;
 } FONT_CACHE_ENTRY, *PFONT_CACHE_ENTRY;
 
 
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c
index 7d3e20555f3..553b1c8d1cb 100644
--- a/win32ss/gdi/ntgdi/freetype.c
+++ b/win32ss/gdi/ntgdi/freetype.c
@@ -749,7 +749,7 @@ VOID FASTCALL IntEscapeMatrix(FT_Matrix *pmat, LONG 
lfEscapement)
 }
 
 VOID FASTCALL
-FtMatrixFromMx(FT_Matrix *pmat, PMATRIX pmx)
+FtMatrixFromMx(FT_Matrix *pmat, const MATRIX *pmx)
 {
     FLOATOBJ ef;
 
@@ -760,44 +760,21 @@ FtMatrixFromMx(FT_Matrix *pmat, PMATRIX pmx)
 
     ef = pmx->efM21;
     FLOATOBJ_MulLong(&ef, 0x00010000);
-    pmat->xy = FLOATOBJ_GetLong(&ef);
+    pmat->xy = -FLOATOBJ_GetLong(&ef); /* (*1) See below */
 
     ef = pmx->efM12;
     FLOATOBJ_MulLong(&ef, 0x00010000);
-    pmat->yx = FLOATOBJ_GetLong(&ef);
+    pmat->yx = -FLOATOBJ_GetLong(&ef); /* (*1) See below */
 
     ef = pmx->efM22;
     FLOATOBJ_MulLong(&ef, 0x00010000);
     pmat->yy = FLOATOBJ_GetLong(&ef);
-}
-
-VOID
-FtSetCoordinateTransform(
-    FT_Face face,
-    PMATRIX pmx)
-{
-    FT_Matrix ftmatrix;
-    FLOATOBJ efTemp;
-
-    /* Create a freetype matrix, by converting to 16.16 fixpoint format */
-    efTemp = pmx->efM11;
-    FLOATOBJ_MulLong(&efTemp, 0x00010000);
-    ftmatrix.xx = FLOATOBJ_GetLong(&efTemp);
 
-    efTemp = pmx->efM12;
-    FLOATOBJ_MulLong(&efTemp, 0x00010000);
-    ftmatrix.xy = FLOATOBJ_GetLong(&efTemp);
-
-    efTemp = pmx->efM21;
-    FLOATOBJ_MulLong(&efTemp, 0x00010000);
-    ftmatrix.yx = FLOATOBJ_GetLong(&efTemp);
-
-    efTemp = pmx->efM22;
-    FLOATOBJ_MulLong(&efTemp, 0x00010000);
-    ftmatrix.yy = FLOATOBJ_GetLong(&efTemp);
-
-    /* Set the transformation matrix */
-    FT_Set_Transform(face, &ftmatrix, 0);
+    // (*1): Y direction is mirrored as follows:
+    //
+    // [  M11  -M12 ]   [  X ]    [   M11*X + M12*Y  ]
+    // [            ] * [    ] == [                  ]
+    // [ -M21   M22 ]   [ -Y ]    [ -(M21*X + M22*Y) ].
 }
 
 static BOOL
@@ -3135,25 +3112,13 @@ ftGdiGetRasterizerCaps(LPRASTERIZER_STATUS lprs)
     return FALSE;
 }
 
-static
-BOOL
-SameScaleMatrix(
-    PMATRIX pmx1,
-    PMATRIX pmx2)
-{
-    return (FLOATOBJ_Equal(&pmx1->efM11, &pmx2->efM11) &&
-            FLOATOBJ_Equal(&pmx1->efM12, &pmx2->efM12) &&
-            FLOATOBJ_Equal(&pmx1->efM21, &pmx2->efM21) &&
-            FLOATOBJ_Equal(&pmx1->efM22, &pmx2->efM22));
-}
-
 FT_BitmapGlyph APIENTRY
 ftGdiGlyphCacheGet(
     FT_Face Face,
     INT GlyphIndex,
     INT Height,
     FT_Render_Mode RenderMode,
-    PMATRIX pmx)
+    const FT_Matrix *pmatTransform)
 {
     PLIST_ENTRY CurrentEntry;
     PFONT_CACHE_ENTRY FontEntry;
@@ -3169,7 +3134,7 @@ ftGdiGlyphCacheGet(
             (FontEntry->GlyphIndex == GlyphIndex) &&
             (FontEntry->Height == Height) &&
             (FontEntry->RenderMode == RenderMode) &&
-            (SameScaleMatrix(&FontEntry->mxWorldToDevice, pmx)))
+            (memcmp(&FontEntry->matTransform, pmatTransform, 
sizeof(*pmatTransform)) == 0))
             break;
     }
 
@@ -3230,7 +3195,7 @@ ftGdiGlyphCacheSet(
     FT_Face Face,
     INT GlyphIndex,
     INT Height,
-    PMATRIX pmx,
+    const FT_Matrix *pmatTransform,
     FT_GlyphSlot GlyphSlot,
     FT_Render_Mode RenderMode)
 {
@@ -3284,7 +3249,7 @@ ftGdiGlyphCacheSet(
     NewEntry->BitmapGlyph = BitmapGlyph;
     NewEntry->Height = Height;
     NewEntry->RenderMode = RenderMode;
-    NewEntry->mxWorldToDevice = *pmx;
+    NewEntry->matTransform = *pmatTransform;
 
     InsertHeadList(&g_FontCacheListHead, &NewEntry->ListEntry);
     if (++g_FontCacheNumEntries > MAX_FONT_CACHE)
@@ -3776,7 +3741,7 @@ ftGdiGetGlyphOutline(
     INT left, right, top = 0, bottom = 0;
     FT_Int load_flags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH;
     FLOATOBJ eM11, widthRatio, eTemp;
-    FT_Matrix transMat = identityMat;
+    FT_Matrix mat, transMat = identityMat;
     BOOL needsTransform = FALSE;
     INT orientation;
     LONG aveWidth;
@@ -3829,7 +3794,8 @@ ftGdiGetGlyphOutline(
 
     IntLockFreeType();
     TextIntUpdateSize(dc, TextObj, FontGDI, FALSE);
-    FtSetCoordinateTransform(ft_face, DC_pmxWorldToDevice(dc));
+    FtMatrixFromMx(&mat, DC_pmxWorldToDevice(dc));
+    FT_Set_Transform(ft_face, &mat, 0);
 
     TEXTOBJ_UnlockText(TextObj);
 
@@ -4238,7 +4204,7 @@ ftGdiGetRealGlyph(
     INT glyph_index,
     LONG lfHeight,
     FT_Render_Mode RenderMode,
-    PMATRIX pmxWorldToDevice,
+    const FT_Matrix *pmat,
     BOOL EmuBold,
     BOOL EmuItalic)
 {
@@ -4253,7 +4219,7 @@ ftGdiGetRealGlyph(
     else
     {
         realglyph = ftGdiGlyphCacheGet(face, glyph_index, lfHeight,
-                                       RenderMode, pmxWorldToDevice);
+                                       RenderMode, pmat);
         if (realglyph)
             return realglyph;
 
@@ -4278,7 +4244,7 @@ ftGdiGetRealGlyph(
     else
     {
         realglyph = ftGdiGlyphCacheSet(face, glyph_index, lfHeight,
-                                       pmxWorldToDevice, glyph, RenderMode);
+                                       pmat, glyph, RenderMode);
     }
 
     if (!realglyph)
@@ -4305,6 +4271,7 @@ TextIntGetTextExtentPoint(PDC dc,
     INT glyph_index, i, previous;
     ULONGLONG TotalWidth64 = 0;
     FT_Render_Mode RenderMode;
+    FT_Matrix mat;
     PMATRIX pmxWorldToDevice;
     LOGFONTW *plf;
     BOOL use_kerning, EmuBold, EmuItalic;
@@ -4333,7 +4300,8 @@ TextIntGetTextExtentPoint(PDC dc,
 
     /* Get the DC's world-to-device transformation matrix */
     pmxWorldToDevice = DC_pmxWorldToDevice(dc);
-    FtSetCoordinateTransform(face, pmxWorldToDevice);
+    FtMatrixFromMx(&mat, pmxWorldToDevice);
+    FT_Set_Transform(face, &mat, 0);
 
     use_kerning = FT_HAS_KERNING(face);
     previous = 0;
@@ -4343,7 +4311,7 @@ TextIntGetTextExtentPoint(PDC dc,
         glyph_index = get_glyph_index_flagged(face, *String, GTEF_INDICES, fl);
 
         realglyph = ftGdiGetRealGlyph(face, glyph_index, plf->lfHeight, 
RenderMode,
-                                      pmxWorldToDevice, EmuBold, EmuItalic);
+                                      &mat, EmuBold, EmuItalic);
         if (!realglyph)
             break;
 
@@ -4585,6 +4553,7 @@ ftGdiGetTextMetricsW(
     ULONG Error;
     NTSTATUS Status = STATUS_SUCCESS;
     LOGFONTW *plf;
+    FT_Matrix mat;
 
     if (!ptmwi)
     {
@@ -4609,7 +4578,8 @@ ftGdiGetTextMetricsW(
 
         IntLockFreeType();
         Error = IntRequestFontSize(dc, FontGDI, plf->lfWidth, plf->lfHeight);
-        FtSetCoordinateTransform(Face, DC_pmxWorldToDevice(dc));
+        FtMatrixFromMx(&mat, DC_pmxWorldToDevice(dc));
+        FT_Set_Transform(Face, &mat, 0);
         IntUnLockFreeType();
 
         if (0 != Error)
@@ -5894,7 +5864,7 @@ ftGdiGetTextWidth(
     LONG lfHeight,
     UINT fuOptions,
     FT_Render_Mode RenderMode,
-    PMATRIX pmxWorldToDevice,
+    const FT_Matrix *pmat,
     BOOL EmuBold,
     BOOL EmuItalic)
 {
@@ -5912,7 +5882,7 @@ ftGdiGetTextWidth(
         glyph_index = get_glyph_index_flagged(face, *String, ETO_GLYPH_INDEX, 
fuOptions);
 
         realglyph = ftGdiGetRealGlyph(face, glyph_index, lfHeight, RenderMode,
-                                      pmxWorldToDevice, EmuBold, EmuItalic);
+                                      pmat, EmuBold, EmuItalic);
         if (!realglyph)
             return FALSE;
 
@@ -5972,6 +5942,7 @@ IntExtTextOutW(
     PTEXTOBJ TextObj;
     EXLATEOBJ exloRGB2Dst, exloDst2RGB;
     FT_Render_Mode RenderMode;
+    FT_Matrix mat;
     POINT Start;
     USHORT DxShift;
     PMATRIX pmxWorldToDevice;
@@ -6119,7 +6090,8 @@ IntExtTextOutW(
     if (pdcattr->iGraphicsMode == GM_ADVANCED)
     {
         pmxWorldToDevice = DC_pmxWorldToDevice(dc);
-        FtSetCoordinateTransform(face, pmxWorldToDevice);
+        FtMatrixFromMx(&mat, pmxWorldToDevice);
+        FT_Set_Transform(face, &mat, 0);
 
         fixAscender = ScaleLong(FontGDI->tmAscent, &pmxWorldToDevice->efM22) 
<< 6;
         fixDescender = ScaleLong(FontGDI->tmDescent, &pmxWorldToDevice->efM22) 
<< 6;
@@ -6127,7 +6099,8 @@ IntExtTextOutW(
     else
     {
         pmxWorldToDevice = (PMATRIX)&gmxWorldToDeviceDefault;
-        FtSetCoordinateTransform(face, pmxWorldToDevice);
+        FtMatrixFromMx(&mat, pmxWorldToDevice);
+        FT_Set_Transform(face, &mat, 0);
 
         fixAscender = FontGDI->tmAscent << 6;
         fixDescender = FontGDI->tmDescent << 6;
@@ -6156,7 +6129,7 @@ IntExtTextOutW(
                                lfHeight,
                                fuOptions,
                                RenderMode,
-                               pmxWorldToDevice,
+                               &mat,
                                EmuBold, EmuItalic))
         {
             IntUnLockFreeType();
@@ -6229,7 +6202,7 @@ IntExtTextOutW(
         glyph_index = get_glyph_index_flagged(face, *String++, 
ETO_GLYPH_INDEX, fuOptions);
 
         realglyph = ftGdiGetRealGlyph(face, glyph_index, lfHeight, RenderMode,
-                                      pmxWorldToDevice, EmuBold, EmuItalic);
+                                      &mat, EmuBold, EmuItalic);
         if (!realglyph)
         {
             bResult = FALSE;
@@ -6626,6 +6599,7 @@ NtGdiGetCharABCWidthsW(
     PFONTGDI FontGDI;
     FT_Face face;
     FT_CharMap charmap, found = NULL;
+    FT_Matrix mat;
     UINT i, glyph_index, BufferSize;
     HFONT hFont = 0;
     NTSTATUS Status = STATUS_SUCCESS;
@@ -6749,7 +6723,8 @@ NtGdiGetCharABCWidthsW(
     plf = &TextObj->logfont.elfEnumLogfontEx.elfLogFont;
     IntLockFreeType();
     IntRequestFontSize(dc, FontGDI, plf->lfWidth, plf->lfHeight);
-    FtSetCoordinateTransform(face, pmxWorldToDevice);
+    FtMatrixFromMx(&mat, pmxWorldToDevice);
+    FT_Set_Transform(face, &mat, 0);
 
     for (i = FirstChar; i < FirstChar+Count; i++)
     {
@@ -6831,6 +6806,7 @@ NtGdiGetCharWidthW(
     PFONTGDI FontGDI;
     FT_Face face;
     FT_CharMap charmap, found = NULL;
+    FT_Matrix mat;
     UINT i, glyph_index, BufferSize;
     HFONT hFont = 0;
     PMATRIX pmxWorldToDevice;
@@ -6939,7 +6915,8 @@ NtGdiGetCharWidthW(
     plf = &TextObj->logfont.elfEnumLogfontEx.elfLogFont;
     IntLockFreeType();
     IntRequestFontSize(dc, FontGDI, plf->lfWidth, plf->lfHeight);
-    FtSetCoordinateTransform(face, pmxWorldToDevice);
+    FtMatrixFromMx(&mat, pmxWorldToDevice);
+    FT_Set_Transform(face, &mat, 0);
 
     for (i = FirstChar; i < FirstChar+Count; i++)
     {

Reply via email to