Index: src/ports/SkFontHost_win.cpp |
diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp |
index 67927fd81cc6d8449630ec4047fd498ac941168d..dc248fb31dbe93244b41c87926cc8b50de4e770a 100755 |
--- a/src/ports/SkFontHost_win.cpp |
+++ b/src/ports/SkFontHost_win.cpp |
@@ -616,8 +616,8 @@ SkScalerContext_GDI::SkScalerContext_GDI(SkTypeface* rawTypeface, |
SetGraphicsMode(fDDC, GM_ADVANCED); |
SetBkMode(fDDC, TRANSPARENT); |
- // When GDI hinting, remove the entire Y scale to prevent 'subpixel' metrics. |
- // When not hinting, remove only the gdiTextSize scale which will be applied by GDI. |
+ // When GDI hinting, remove the entire Y scale from sA and GsA. (Prevents 'linear' metrics.) |
+ // When not hinting, remove only the integer Y scale from sA and GsA. (Applied by GDI.) |
SkScalerContextRec::PreMatrixScale scaleConstraints = |
(fRec.getHinting() == SkPaint::kNo_Hinting || fRec.getHinting() == SkPaint::kSlight_Hinting) |
? SkScalerContextRec::kVerticalInteger_PreMatrixScale |
@@ -633,7 +633,19 @@ SkScalerContext_GDI::SkScalerContext_GDI(SkTypeface* rawTypeface, |
fGsA.eM21 = SkScalarToFIXED(-GsA.get(SkMatrix::kMSkewX)); |
fGsA.eM22 = SkScalarToFIXED(GsA.get(SkMatrix::kMScaleY)); |
- SkScalar gdiTextSize = scale.fY; |
+ // When not hinting, scale was computed with kVerticalInteger, so is already an integer. |
+ // The sA and GsA transforms will be used to create 'linear' metrics. |
+ |
+ // When hinting, scale was computed with kVertical, stating that our port can handle |
+ // non-integer scales. This is done so that sA and GsA are computed without any 'residual' |
+ // scale in them, preventing 'linear' metrics. However, GDI cannot actually handle non-integer |
+ // scales so we need to round in this case. This is fine, since all of the scale has been |
+ // removed from sA and GsA, so GDI will be handling the scale completely. |
+ SkScalar gdiTextSize = SkScalarRoundToScalar(scale.fY); |
+ |
+ // GDI will not accept a size of zero, so round the range [0, 1] to 1. |
+ // If the size was non-zero, the scale factors will also be non-zero and 1px tall text is drawn. |
+ // If the size actually was zero, the scale factors will also be zero, so GDI will draw nothing. |
if (gdiTextSize == 0) { |
gdiTextSize = SK_Scalar1; |
} |