Index: src/ports/SkFontHost_win.cpp |
=================================================================== |
--- a/src/ports/SkFontHost_win.cpp (revision 11569) |
+++ b/src/ports/SkFontHost_win.cpp (working copy) |
@@ -663,17 +663,25 @@ |
SkMatrix GA(G); |
GA.preConcat(A); |
- // textSize is the actual device size we want (as opposed to the size the user requested). |
+ // realTextSize is the actual device size we want (as opposed to the size the user requested). |
+ // gdiTextSizde is the size we request from GDI. |
// If the scale is negative, this means the matrix will do the flip anyway. |
- SkScalar textSize = SkScalarAbs(SkScalarRoundToScalar(GA.get(SkMatrix::kMScaleY))); |
- if (textSize == 0) { |
- textSize = SK_Scalar1; |
+ SkScalar realTextSize = SkScalarAbs(GA.get(SkMatrix::kMScaleY)); |
+ SkScalar gdiTextSize = SkScalarRoundToScalar(realTextSize); |
+ if (gdiTextSize == 0) { |
+ gdiTextSize = SK_Scalar1; |
} |
+ // When not hinting, remove only the gdiTextSize scale which will be applied by GDI. |
+ // When GDI hinting, remove the entire Y scale to prevent 'subpixel' metrics. |
+ SkScalar scale = (fRec.getHinting() == SkPaint::kNo_Hinting || |
+ fRec.getHinting() == SkPaint::kSlight_Hinting) |
+ ? SkScalarInvert(gdiTextSize) |
+ : SkScalarInvert(realTextSize); |
+ |
// sA is the total matrix A without the textSize (so GDI knows the text size separately). |
// When this matrix is used with GetGlyphOutline, no further processing is needed. |
SkMatrix sA(A); |
- SkScalar scale = SkScalarInvert(textSize); |
sA.preScale(scale, scale); //remove text size |
// GsA is the non-rotational part of A without the text height scale. |
@@ -692,7 +700,7 @@ |
G.get(SkMatrix::kMPersp0), G.get(SkMatrix::kMPersp1), G.get(SkMatrix::kMPersp2)); |
LOGFONT lf = typeface->fLogFont; |
- lf.lfHeight = -SkScalarTruncToInt(textSize); |
+ lf.lfHeight = -SkScalarTruncToInt(gdiTextSize); |
lf.lfQuality = compute_quality(fRec); |
fFont = CreateFontIndirect(&lf); |
if (!fFont) { |
@@ -742,7 +750,7 @@ |
this->forceGenerateImageFromPath(); |
} |
- // Create a hires font if we need linear metrics. |
+ // Create a hires matrix if we need linear metrics. |
if (this->isSubpixel()) { |
OUTLINETEXTMETRIC otm; |
UINT success = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
@@ -751,17 +759,17 @@ |
success = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
} |
if (0 != success) { |
- SkScalar scale = SkIntToScalar(otm.otmEMSquare); |
+ SkScalar upem = SkIntToScalar(otm.otmEMSquare); |
- SkScalar textScale = scale / textSize; |
- fHighResMat22.eM11 = float2FIXED(textScale); |
+ SkScalar gdiTextSizeToEMScale = upem / gdiTextSize; |
+ fHighResMat22.eM11 = float2FIXED(gdiTextSizeToEMScale); |
fHighResMat22.eM12 = float2FIXED(0); |
fHighResMat22.eM21 = float2FIXED(0); |
- fHighResMat22.eM22 = float2FIXED(textScale); |
+ fHighResMat22.eM22 = float2FIXED(gdiTextSizeToEMScale); |
- SkScalar invScale = SkScalarInvert(scale); |
+ SkScalar removeEMScale = SkScalarInvert(upem); |
fHiResMatrix = A; |
- fHiResMatrix.preScale(invScale, invScale); |
+ fHiResMatrix.preScale(removeEMScale, removeEMScale); |
} |
} |