| Index: src/ports/SkFontHost_win.cpp
|
| ===================================================================
|
| --- src/ports/SkFontHost_win.cpp (revision 10422)
|
| +++ src/ports/SkFontHost_win.cpp (working copy)
|
| @@ -550,14 +550,17 @@
|
| * Used to find the magnitude of advances.
|
| */
|
| MAT2 fGsA;
|
| + /** The total matrix without the textSize. */
|
| MAT2 fMat22;
|
| + /** Scales font to EM size. */
|
| + MAT2 fHighResMat22;
|
| HDC fDDC;
|
| HFONT fSavefont;
|
| HFONT fFont;
|
| - HFONT fHiResFont;
|
| SCRIPT_CACHE fSC;
|
| int fGlyphCount;
|
|
|
| + /** The total matrix which also removes EM scale. */
|
| SkMatrix fHiResMatrix;
|
| /** fG_inv is the inverse of the rotational part of the total matrix.
|
| * Used to set the direction of advances.
|
| @@ -595,7 +598,6 @@
|
| , fDDC(0)
|
| , fSavefont(0)
|
| , fFont(0)
|
| - , fHiResFont(0)
|
| , fSC(0)
|
| , fGlyphCount(-1)
|
| {
|
| @@ -735,16 +737,17 @@
|
| success = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm);
|
| }
|
| if (0 != success) {
|
| - lf.lfHeight = -SkToS32(otm.otmEMSquare);
|
| - fHiResFont = CreateFontIndirect(&lf);
|
| - if (!fHiResFont) {
|
| - return;
|
| - }
|
| + SkScalar scale = SkIntToScalar(otm.otmEMSquare);
|
|
|
| - // construct a matrix to go from HIRES logical units to our device units
|
| - fRec.getSingleMatrix(&fHiResMatrix);
|
| - SkScalar scale = SkScalarInvert(SkIntToScalar(otm.otmEMSquare));
|
| - fHiResMatrix.preScale(scale, scale);
|
| + SkScalar textScale = scale / textSize;
|
| + fHighResMat22.eM11 = float2FIXED(textScale);
|
| + fHighResMat22.eM12 = float2FIXED(0);
|
| + fHighResMat22.eM21 = float2FIXED(0);
|
| + fHighResMat22.eM22 = float2FIXED(textScale);
|
| +
|
| + SkScalar invScale = SkScalarInvert(scale);
|
| + fHiResMatrix = A;
|
| + fHiResMatrix.preScale(invScale, invScale);
|
| }
|
| }
|
|
|
| @@ -778,9 +781,6 @@
|
| if (fFont) {
|
| ::DeleteObject(fFont);
|
| }
|
| - if (fHiResFont) {
|
| - ::DeleteObject(fHiResFont);
|
| - }
|
| if (fSC) {
|
| ::ScriptFreeCache(&fSC);
|
| }
|
| @@ -827,7 +827,6 @@
|
| this->generateMetrics(glyph);
|
| }
|
|
|
| -static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
|
| void SkScalerContext_Windows::generateMetrics(SkGlyph* glyph) {
|
| SkASSERT(fDDC);
|
|
|
| @@ -898,17 +897,15 @@
|
| glyph->fRsbDelta = 0;
|
| glyph->fLsbDelta = 0;
|
|
|
| - if (fHiResFont) {
|
| - SelectObject(fDDC, fHiResFont);
|
| + if (this->isSubpixel()) {
|
| sk_bzero(&gm, sizeof(gm));
|
| - status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &gMat2Identity);
|
| + status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &fHighResMat22);
|
| 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);
|
| }
|
| - SelectObject(fDDC, fFont);
|
| } else if (!isAxisAligned(this->fRec)) {
|
| status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &fGsA);
|
| if (GDI_ERROR != status) {
|
| @@ -920,6 +917,7 @@
|
| }
|
| }
|
|
|
| +static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
|
| void SkScalerContext_Windows::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my) {
|
| if (!(mx || my)) {
|
| return;
|
|
|