Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: src/ports/SkFontHost_win.cpp

Issue 25739002: Snap GDI matrix when snapping height. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698