| Index: src/ports/SkFontHost_win.cpp
|
| diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp
|
| index 8aefd1431a525f6e4d2a34775f9b0895bee1d6de..f772d8c57e13b28faebe8ed7f4238001a2f7f271 100644
|
| --- a/src/ports/SkFontHost_win.cpp
|
| +++ b/src/ports/SkFontHost_win.cpp
|
| @@ -584,6 +584,10 @@ static FIXED float2FIXED(float x) {
|
| return SkFixedToFIXED(SkFloatToFixed(x));
|
| }
|
|
|
| +static inline float FIXED2float(FIXED x) {
|
| + return SkFixedToFloat(SkFIXEDToFixed(x));
|
| +}
|
| +
|
| static BYTE compute_quality(const SkScalerContext::Rec& rec) {
|
| switch (rec.fMaskFormat) {
|
| case SkMask::kBW_Format:
|
| @@ -856,7 +860,7 @@ void SkScalerContext_GDI::generateMetrics(SkGlyph* glyph) {
|
| // Bitmap FON cannot underhang, but vector FON may.
|
| // There appears no means of determining underhang of vector FON.
|
| glyph->fLeft = SkToS16(0);
|
| - glyph->fAdvanceX = SkIntToFixed(glyph->fWidth);
|
| + glyph->fAdvanceX = glyph->fWidth;
|
| glyph->fAdvanceY = 0;
|
|
|
| // Vector FON will transform nicely, but bitmap FON do not.
|
| @@ -876,8 +880,8 @@ void SkScalerContext_GDI::generateMetrics(SkGlyph* glyph) {
|
| }
|
|
|
| // Apply matrix to advance.
|
| - glyph->fAdvanceY = SkFixedMul(-SkFIXEDToFixed(fMat22.eM12), glyph->fAdvanceX);
|
| - glyph->fAdvanceX = SkFixedMul(SkFIXEDToFixed(fMat22.eM11), glyph->fAdvanceX);
|
| + glyph->fAdvanceY = -FIXED2float(fMat22.eM12) * glyph->fAdvanceX;
|
| + glyph->fAdvanceX *= FIXED2float(fMat22.eM11);
|
|
|
| return;
|
| }
|
| @@ -922,8 +926,9 @@ void SkScalerContext_GDI::generateMetrics(SkGlyph* glyph) {
|
| glyph->fTop -= 2;
|
| glyph->fLeft -= 2;
|
| }
|
| - glyph->fAdvanceX = SkIntToFixed(gm.gmCellIncX);
|
| - glyph->fAdvanceY = SkIntToFixed(gm.gmCellIncY);
|
| + // TODO(benjaminwagner): What is the type of gm.gmCellInc[XY]?
|
| + glyph->fAdvanceX = (float)((int)gm.gmCellIncX);
|
| + glyph->fAdvanceY = (float)((int)gm.gmCellIncY);
|
| glyph->fRsbDelta = 0;
|
| glyph->fLsbDelta = 0;
|
|
|
| @@ -933,16 +938,16 @@ void SkScalerContext_GDI::generateMetrics(SkGlyph* glyph) {
|
| if (GDI_ERROR != status) {
|
| SkPoint advance;
|
| fHiResMatrix.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIncY), &advance);
|
| - glyph->fAdvanceX = SkScalarToFixed(advance.fX);
|
| - glyph->fAdvanceY = SkScalarToFixed(advance.fY);
|
| + glyph->fAdvanceX = SkScalarToFloat(advance.fX);
|
| + glyph->fAdvanceY = SkScalarToFloat(advance.fY);
|
| }
|
| } else if (!isAxisAligned(this->fRec)) {
|
| status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, nullptr, &fGsA);
|
| if (GDI_ERROR != status) {
|
| SkPoint advance;
|
| fG_inv.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIncY), &advance);
|
| - glyph->fAdvanceX = SkScalarToFixed(advance.fX);
|
| - glyph->fAdvanceY = SkScalarToFixed(advance.fY);
|
| + glyph->fAdvanceX = SkScalarToFloat(advance.fX);
|
| + glyph->fAdvanceY = SkScalarToFloat(advance.fY);
|
| }
|
| }
|
| }
|
|
|