| Index: src/ports/SkFontHost_win.cpp
|
| ===================================================================
|
| --- src/ports/SkFontHost_win.cpp (revision 7941)
|
| +++ src/ports/SkFontHost_win.cpp (working copy)
|
| @@ -813,13 +813,21 @@
|
| glyph->fRsbDelta = 0;
|
| glyph->fLsbDelta = 0;
|
|
|
| - // Note: need to use GGO_GRAY8_BITMAP instead of GGO_METRICS because GGO_METRICS returns a smaller
|
| - // BlackBlox; we need the bigger one in case we need the image. fAdvance is the same.
|
| - uint32_t ret = GetGlyphOutlineW(fDDC, glyph->getGlyphID(0), GGO_GRAY8_BITMAP | GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22);
|
| + // Note 1: Don't use GGO_GRAY8_BITMAP because it always returns outline-based metrics.
|
| + // When embedded bitmap exists, bitmap-based metrics have to be used.
|
| + // If not, slightly smaller metrics is returned (anti-alias gap)
|
| + // so outset is necessary.
|
| + // Note 2: Don't change glyph shape because in that case GetGlyphOutline always returns
|
| + // outline-based metrics.
|
| + fMat22.eM12 = SkFixedToFIXED(-SkFIXEDToFixed(fMat22.eM12));
|
| + fMat22.eM22 = SkFixedToFIXED(-SkFIXEDToFixed(fMat22.eM22));
|
| + uint32_t ret = GetGlyphOutlineW(fDDC, glyph->getGlyphID(0), GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22);
|
| if (GDI_ERROR == ret) {
|
| ensure_typeface_accessible(fRec.fFontID);
|
| - ret = GetGlyphOutlineW(fDDC, glyph->getGlyphID(0), GGO_GRAY8_BITMAP | GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22);
|
| + ret = GetGlyphOutlineW(fDDC, glyph->getGlyphID(0), GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22);
|
| }
|
| + fMat22.eM12 = SkFixedToFIXED(-SkFIXEDToFixed(fMat22.eM12));
|
| + fMat22.eM22 = SkFixedToFIXED(-SkFIXEDToFixed(fMat22.eM22));
|
|
|
| if (GDI_ERROR != ret) {
|
| if (ret == 0) {
|
| @@ -828,21 +836,16 @@
|
| }
|
| glyph->fWidth = gm.gmBlackBoxX;
|
| glyph->fHeight = gm.gmBlackBoxY;
|
| - glyph->fTop = SkToS16(gm.gmptGlyphOrigin.y - gm.gmBlackBoxY);
|
| + glyph->fTop = SkToS16(-gm.gmptGlyphOrigin.y);
|
| glyph->fLeft = SkToS16(gm.gmptGlyphOrigin.x);
|
| glyph->fAdvanceX = SkIntToFixed(gm.gmCellIncX);
|
| glyph->fAdvanceY = -SkIntToFixed(gm.gmCellIncY);
|
|
|
| // we outset in all dimensions, since the image may bleed outside
|
| // of the computed bounds returned by GetGlyphOutline.
|
| - // This was deduced by trial and error for small text (e.g. 8pt), so there
|
| - // maybe a more precise way to make this adjustment...
|
| - //
|
| - // This test shows us clipping the tops of some of the CJK fonts unless we
|
| - // increase the top of the box by 2, hence the height by 4. This seems to
|
| - // correspond to an embedded bitmap font, but not sure.
|
| - // LayoutTests/fast/text/backslash-to-yen-sign-euc.html
|
| - //
|
| + // it is because we ignore grayscale or ClearType anti-alias
|
| + // in getting metrics.
|
| + // Note: GetGlyphOutline doesn't support ClearType.
|
| if (glyph->fWidth) { // don't outset an empty glyph
|
| glyph->fWidth += 4;
|
| glyph->fHeight += 4;
|
|
|