https://git.reactos.org/?p=reactos.git;a=commitdiff;h=86046a9bf4af575513083…
commit 86046a9bf4af57551308331631447c7ccfa87fe9
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Mon May 27 18:35:43 2019 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Mon May 27 18:35:43 2019 +0900
[WIN32SS][NTGDI] Don't use FLOAT in ftGdiGetGlyphOutline (#1576)
Don't use FLOAT variable in ftGdiGetGlyphOutline function. CORE-15838
---
win32ss/gdi/ntgdi/freetype.c | 61 +++++++++++++++++++++++++-------------------
1 file changed, 35 insertions(+), 26 deletions(-)
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c
index 94c1413071..3b65327071 100644
--- a/win32ss/gdi/ntgdi/freetype.c
+++ b/win32ss/gdi/ntgdi/freetype.c
@@ -347,18 +347,6 @@ static __inline void FTVectorToPOINTFX(FT_Vector *vec, POINTFX *pt)
pt->y.fract |= ((pt->y.fract >> 6) | (pt->y.fract >> 12));
}
-/*
- This function builds an FT_Fixed from a float. It puts the integer part
- in the highest 16 bits and the decimal part in the lowest 16 bits of the FT_Fixed.
- It fails if the integer part of the float number is greater than SHORT_MAX.
-*/
-static __inline FT_Fixed FT_FixedFromFloat(FLOAT f)
-{
- short value = f;
- unsigned short fract = (f - value) * 0xFFFF;
- return (FT_Fixed)((long)value << 16 | (unsigned long)fract);
-}
-
/*
This function builds an FT_Fixed from a FIXED. It simply put f.value
in the highest 16 bits and f.fract in the lowest 16 bits of the FT_Fixed.
@@ -3479,14 +3467,15 @@ ftGdiGetGlyphOutline(
FT_Error error;
INT left, right, top = 0, bottom = 0;
FT_Int load_flags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH;
- FLOAT eM11, widthRatio = 1.0;
+ FLOATOBJ eM11, widthRatio, eTemp;
FT_Matrix transMat = identityMat;
BOOL needsTransform = FALSE;
INT orientation;
LONG aveWidth;
INT adv, lsb, bbx; /* These three hold to widths of the unrotated chars */
OUTLINETEXTMETRICW *potm;
- XFORM xForm;
+ XFORMOBJ xo;
+ XFORML xform;
LOGFONTW *plf;
DPRINT("%u, %08x, %p, %08lx, %p, %p\n", wch, iFormat, pgm,
@@ -3494,8 +3483,9 @@ ftGdiGetGlyphOutline(
pdcattr = dc->pdcattr;
- MatrixS2XForm(&xForm, &dc->pdcattr->mxWorldToDevice);
- eM11 = xForm.eM11;
+ XFORMOBJ_vInit(&xo, &dc->pdcattr->mxWorldToDevice);
+ XFORMOBJ_iGetXform(&xo, &xform);
+ FLOATOBJ_SetFloat(&eM11, xform.eM11);
hFont = pdcattr->hlfntNew;
TextObj = RealizeFontInit(hFont);
@@ -3557,17 +3547,33 @@ ftGdiGetGlyphOutline(
}
IntUnLockFreeType();
+ FLOATOBJ_Set1(&widthRatio);
if (aveWidth && potm)
{
- widthRatio = (FLOAT)aveWidth * eM11 /
- (FLOAT)potm->otmTextMetrics.tmAveCharWidth;
+ // widthRatio = aveWidth * eM11 / potm->otmTextMetrics.tmAveCharWidth
+ FLOATOBJ_SetLong(&widthRatio, aveWidth);
+ FLOATOBJ_Mul(&widthRatio, &eM11);
+ FLOATOBJ_DivLong(&widthRatio, potm->otmTextMetrics.tmAveCharWidth);
}
- left = (INT)(ft_face->glyph->metrics.horiBearingX * widthRatio) & -64;
- right = (INT)((ft_face->glyph->metrics.horiBearingX +
- ft_face->glyph->metrics.width) * widthRatio + 63) & -64;
+ //left = (INT)(ft_face->glyph->metrics.horiBearingX * widthRatio) & -64;
+ FLOATOBJ_SetLong(&eTemp, ft_face->glyph->metrics.horiBearingX);
+ FLOATOBJ_Mul(&eTemp, &widthRatio);
+ left = FLOATOBJ_GetLong(&eTemp) & -64;
+
+ //right = (INT)((ft_face->glyph->metrics.horiBearingX +
+ // ft_face->glyph->metrics.width) * widthRatio + 63) & -64;
+ FLOATOBJ_SetLong(&eTemp, ft_face->glyph->metrics.horiBearingX *
ft_face->glyph->metrics.width);
+ FLOATOBJ_Mul(&eTemp, &widthRatio);
+ FLOATOBJ_AddLong(&eTemp, 63);
+ right = FLOATOBJ_GetLong(&eTemp) & -64;
+
+ //adv = (INT)((ft_face->glyph->metrics.horiAdvance * widthRatio) + 63) >>
6;
+ FLOATOBJ_SetLong(&eTemp, ft_face->glyph->metrics.horiAdvance);
+ FLOATOBJ_Mul(&eTemp, &widthRatio);
+ FLOATOBJ_AddLong(&eTemp, 63);
+ adv = FLOATOBJ_GetLong(&eTemp) >> 6;
- adv = (INT)((ft_face->glyph->metrics.horiAdvance * widthRatio) + 63) >>
6;
lsb = left >> 6;
bbx = (right - left) >> 6;
@@ -3576,14 +3582,17 @@ ftGdiGetGlyphOutline(
IntLockFreeType();
/* Width scaling transform */
- if (widthRatio != 1.0)
+ if (!FLOATOBJ_Equal1(&widthRatio))
{
FT_Matrix scaleMat;
- scaleMat.xx = FT_FixedFromFloat(widthRatio);
+
+ eTemp = widthRatio;
+ FLOATOBJ_MulLong(&eTemp, 1 << 16);
+
+ scaleMat.xx = FLOATOBJ_GetLong(&eTemp);
scaleMat.xy = 0;
scaleMat.yx = 0;
- scaleMat.yy = FT_FixedFromFloat(1.0);
-
+ scaleMat.yy = INT_TO_FIXED(1);
FT_Matrix_Multiply(&scaleMat, &transMat);
needsTransform = TRUE;
}