https://git.reactos.org/?p=reactos.git;a=commitdiff;h=86046a9bf4af5755130833...
commit 86046a9bf4af57551308331631447c7ccfa87fe9 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Mon May 27 18:35:43 2019 +0900 Commit: GitHub noreply@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; }