From 410780677af260e32948b02c0725ef6ad761260c Mon Sep 17 00:00:00 2001 From: bungeman Date: Mon, 7 Jul 2014 08:16:37 -0700 Subject: [PATCH] Remove vertical/horizontal metrics selection. R=reed@google.com Author: bungeman@google.com Review URL: https://codereview.chromium.org/370463002 --- src/core/SkScalerContext.cpp | 21 ++----- src/core/SkScalerContext.h | 11 ++-- src/fonts/SkGScalerContext.cpp | 6 +- src/fonts/SkTestScalerContext.cpp | 3 +- src/ports/SkFontHost_FreeType.cpp | 82 +++++++++------------------ src/ports/SkFontHost_mac.cpp | 45 +++++++-------- src/ports/SkFontHost_win.cpp | 104 ++++++++++++----------------------- src/ports/SkScalerContext_win_dw.cpp | 50 +++++------------ src/ports/SkScalerContext_win_dw.h | 3 +- src/ports/SkTypeface_win_dw.cpp | 3 +- 10 files changed, 113 insertions(+), 215 deletions(-) diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 3e20bf6..b18dc1a 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -799,16 +799,7 @@ void SkScalerContext::getPath(const SkGlyph& glyph, SkPath* path) { } void SkScalerContext::getFontMetrics(SkPaint::FontMetrics* fm) { - // All of this complexity should go away when we change generateFontMetrics - // to just take one parameter (since it knows if it is vertical or not) - SkPaint::FontMetrics* mx = NULL; - SkPaint::FontMetrics* my = NULL; - if (fRec.fFlags & kVertical_Flag) { - mx = fm; - } else { - my = fm; - } - this->generateFontMetrics(mx, my); + this->generateFontMetrics(fm); } SkUnichar SkScalerContext::generateGlyphToChar(uint16_t glyph) { @@ -964,13 +955,9 @@ protected: } virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE {} virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE {} - virtual void generateFontMetrics(SkPaint::FontMetrics* mx, - SkPaint::FontMetrics* my) SK_OVERRIDE { - if (mx) { - sk_bzero(mx, sizeof(*mx)); - } - if (my) { - sk_bzero(my, sizeof(*my)); + virtual void generateFontMetrics(SkPaint::FontMetrics* metrics) SK_OVERRIDE { + if (metrics) { + sk_bzero(metrics, sizeof(*metrics)); } } }; diff --git a/src/core/SkScalerContext.h b/src/core/SkScalerContext.h index af83685..be5d3b5 100644 --- a/src/core/SkScalerContext.h +++ b/src/core/SkScalerContext.h @@ -160,6 +160,10 @@ public: return SkToBool(fRec.fFlags & kSubpixelPositioning_Flag); } + bool isVertical() const { + return SkToBool(fRec.fFlags & kVertical_Flag); + } + // remember our glyph offset/base void setBaseGlyphCount(unsigned baseGlyphCount) { fBaseGlyphCount = baseGlyphCount; @@ -245,11 +249,8 @@ protected: */ virtual void generatePath(const SkGlyph& glyph, SkPath* path) = 0; - /** Retrieves font metrics. - * TODO: there is now a vertical bit, no need for two parameters. - */ - virtual void generateFontMetrics(SkPaint::FontMetrics* mX, - SkPaint::FontMetrics* mY) = 0; + /** Retrieves font metrics. */ + virtual void generateFontMetrics(SkPaint::FontMetrics*) = 0; /** Returns the number of glyphs in the font. */ virtual unsigned generateGlyphCount() = 0; diff --git a/src/fonts/SkGScalerContext.cpp b/src/fonts/SkGScalerContext.cpp index e1ab921..e543fdb 100644 --- a/src/fonts/SkGScalerContext.cpp +++ b/src/fonts/SkGScalerContext.cpp @@ -22,8 +22,7 @@ protected: virtual void generateMetrics(SkGlyph*) SK_OVERRIDE; virtual void generateImage(const SkGlyph&) SK_OVERRIDE; virtual void generatePath(const SkGlyph&, SkPath*) SK_OVERRIDE; - virtual void generateFontMetrics(SkPaint::FontMetrics* mX, - SkPaint::FontMetrics* mY) SK_OVERRIDE; + virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; private: SkGTypeface* fFace; @@ -138,8 +137,7 @@ void SkGScalerContext::generatePath(const SkGlyph& glyph, SkPath* path) { path->transform(fMatrix); } -void SkGScalerContext::generateFontMetrics(SkPaint::FontMetrics*, - SkPaint::FontMetrics* metrics) { +void SkGScalerContext::generateFontMetrics(SkPaint::FontMetrics* metrics) { fProxy->getFontMetrics(metrics); if (metrics) { SkScalar scale = fMatrix.getScaleY(); diff --git a/src/fonts/SkTestScalerContext.cpp b/src/fonts/SkTestScalerContext.cpp index aeb5802..7d311cd 100644 --- a/src/fonts/SkTestScalerContext.cpp +++ b/src/fonts/SkTestScalerContext.cpp @@ -223,8 +223,7 @@ protected: path->transform(fMatrix); } - virtual void generateFontMetrics(SkPaint::FontMetrics* , - SkPaint::FontMetrics* metrics) SK_OVERRIDE { + virtual void generateFontMetrics(SkPaint::FontMetrics* metrics) SK_OVERRIDE { fFace->getFontMetrics(metrics); if (metrics) { SkScalar scale = fMatrix.getScaleY(); diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index 12edc49..6448beb 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -200,8 +200,7 @@ protected: virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; - virtual void generateFontMetrics(SkPaint::FontMetrics* mx, - SkPaint::FontMetrics* my) SK_OVERRIDE; + virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; virtual SkUnichar generateGlyphToChar(uint16_t glyph) SK_OVERRIDE; private: @@ -1372,22 +1371,16 @@ void SkScalerContext_FreeType::generatePath(const SkGlyph& glyph, } } -void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, - SkPaint::FontMetrics* my) { - if (NULL == mx && NULL == my) { +void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* metrics) { + if (NULL == metrics) { return; } - SkAutoMutexAcquire ac(gFTMutex); + SkAutoMutexAcquire ac(gFTMutex); if (this->setupSize()) { ERROR: - if (mx) { - sk_bzero(mx, sizeof(SkPaint::FontMetrics)); - } - if (my) { - sk_bzero(my, sizeof(SkPaint::FontMetrics)); - } + sk_bzero(metrics, sizeof(*metrics)); return; } @@ -1434,14 +1427,9 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, underlinePosition = -SkIntToScalar(face->underline_position + face->underline_thickness / 2) / upem; - if(mx) { - mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } - if(my){ - my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } + metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; + metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; + // we may be able to synthesize x_height and cap_height from outline if (!x_height) { FT_BBox bbox; @@ -1469,14 +1457,8 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, underlineThickness = 0; underlinePosition = 0; - if(mx) { - mx->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - mx->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } - if(my){ - my->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - my->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } + metrics->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; + metrics->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; } else { goto ERROR; } @@ -1497,34 +1479,22 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, leading = 0.0f; } - if (mx) { - mx->fTop = ymax * mxy; - mx->fAscent = ascent * mxy; - mx->fDescent = descent * mxy; - mx->fBottom = ymin * mxy; - mx->fLeading = leading * mxy; - mx->fAvgCharWidth = avgCharWidth * mxy; - mx->fXMin = xmin; - mx->fXMax = xmax; - mx->fXHeight = x_height; - mx->fCapHeight = cap_height; - mx->fUnderlineThickness = underlineThickness * mxy; - mx->fUnderlinePosition = underlinePosition * mxy; - } - if (my) { - my->fTop = ymax * myy; - my->fAscent = ascent * myy; - my->fDescent = descent * myy; - my->fBottom = ymin * myy; - my->fLeading = leading * myy; - my->fAvgCharWidth = avgCharWidth * myy; - my->fXMin = xmin; - my->fXMax = xmax; - my->fXHeight = x_height; - my->fCapHeight = cap_height; - my->fUnderlineThickness = underlineThickness * myy; - my->fUnderlinePosition = underlinePosition * myy; - } + SkScalar scale = myy; + if (this->isVertical()) { + scale = mxy; + } + metrics->fTop = ymax * scale; + metrics->fAscent = ascent * scale; + metrics->fDescent = descent * scale; + metrics->fBottom = ymin * scale; + metrics->fLeading = leading * scale; + metrics->fAvgCharWidth = avgCharWidth * scale; + metrics->fXMin = xmin; + metrics->fXMax = xmax; + metrics->fXHeight = x_height; + metrics->fCapHeight = cap_height; + metrics->fUnderlineThickness = underlineThickness * scale; + metrics->fUnderlinePosition = underlinePosition * scale; } void SkScalerContext_FreeType::emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph) diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp index 06e6fac..21a2b95 100755 --- a/src/ports/SkFontHost_mac.cpp +++ b/src/ports/SkFontHost_mac.cpp @@ -656,7 +656,7 @@ protected: void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; void generateImage(const SkGlyph& glyph) SK_OVERRIDE; void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; - void generateFontMetrics(SkPaint::FontMetrics* mX, SkPaint::FontMetrics* mY) SK_OVERRIDE; + void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; private: static void CTPathElement(void *info, const CGPathElement *element); @@ -1368,32 +1368,27 @@ void SkScalerContext_Mac::generatePath(const SkGlyph& glyph, SkPath* path) { } } -void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* mx, - SkPaint::FontMetrics* my) { - CGRect theBounds = CTFontGetBoundingBox(fCTFont); - - SkPaint::FontMetrics theMetrics; - theMetrics.fTop = CGToScalar(-CGRectGetMaxY_inline(theBounds)); - theMetrics.fAscent = CGToScalar(-CTFontGetAscent(fCTFont)); - theMetrics.fDescent = CGToScalar( CTFontGetDescent(fCTFont)); - theMetrics.fBottom = CGToScalar(-CGRectGetMinY_inline(theBounds)); - theMetrics.fLeading = CGToScalar( CTFontGetLeading(fCTFont)); - theMetrics.fAvgCharWidth = CGToScalar( CGRectGetWidth_inline(theBounds)); - theMetrics.fXMin = CGToScalar( CGRectGetMinX_inline(theBounds)); - theMetrics.fXMax = CGToScalar( CGRectGetMaxX_inline(theBounds)); - theMetrics.fXHeight = CGToScalar( CTFontGetXHeight(fCTFont)); - theMetrics.fUnderlineThickness = CGToScalar( CTFontGetUnderlineThickness(fCTFont)); - theMetrics.fUnderlinePosition = -CGToScalar( CTFontGetUnderlinePosition(fCTFont)); +void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* metrics) { + if (NULL == metrics) { + return; + } - theMetrics.fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - theMetrics.fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; + CGRect theBounds = CTFontGetBoundingBox(fCTFont); - if (mx != NULL) { - *mx = theMetrics; - } - if (my != NULL) { - *my = theMetrics; - } + metrics->fTop = CGToScalar(-CGRectGetMaxY_inline(theBounds)); + metrics->fAscent = CGToScalar(-CTFontGetAscent(fCTFont)); + metrics->fDescent = CGToScalar( CTFontGetDescent(fCTFont)); + metrics->fBottom = CGToScalar(-CGRectGetMinY_inline(theBounds)); + metrics->fLeading = CGToScalar( CTFontGetLeading(fCTFont)); + metrics->fAvgCharWidth = CGToScalar( CGRectGetWidth_inline(theBounds)); + metrics->fXMin = CGToScalar( CGRectGetMinX_inline(theBounds)); + metrics->fXMax = CGToScalar( CGRectGetMaxX_inline(theBounds)); + metrics->fXHeight = CGToScalar( CTFontGetXHeight(fCTFont)); + metrics->fUnderlineThickness = CGToScalar( CTFontGetUnderlineThickness(fCTFont)); + metrics->fUnderlinePosition = -CGToScalar( CTFontGetUnderlinePosition(fCTFont)); + + metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; + metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; } void SkScalerContext_Mac::CTPathElement(void *info, const CGPathElement *element) { diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp index a6ccf4d..e4aab81 100755 --- a/src/ports/SkFontHost_win.cpp +++ b/src/ports/SkFontHost_win.cpp @@ -559,8 +559,7 @@ protected: virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; - virtual void generateFontMetrics(SkPaint::FontMetrics* mX, - SkPaint::FontMetrics* mY) SK_OVERRIDE; + virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; private: DWORD getGDIGlyphPath(const SkGlyph& glyph, UINT flags, @@ -978,43 +977,27 @@ void SkScalerContext_GDI::generateMetrics(SkGlyph* glyph) { } static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; -void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my) { - if (!(mx || my)) { - return; - } - - if (mx) { - sk_bzero(mx, sizeof(*mx)); - } - if (my) { - sk_bzero(my, sizeof(*my)); +void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* metrics) { + if (NULL == metrics) { + return; } + sk_bzero(metrics, sizeof(*metrics)); SkASSERT(fDDC); #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS if (fType == SkScalerContext_GDI::kBitmap_Type || fType == SkScalerContext_GDI::kLine_Type) { #endif - if (mx) { - mx->fTop = SkIntToScalar(-fTM.tmAscent); - mx->fAscent = SkIntToScalar(-fTM.tmAscent); - mx->fDescent = SkIntToScalar(fTM.tmDescent); - mx->fBottom = SkIntToScalar(fTM.tmDescent); - mx->fLeading = SkIntToScalar(fTM.tmExternalLeading); - } - - if (my) { - my->fTop = SkIntToScalar(-fTM.tmAscent); - my->fAscent = SkIntToScalar(-fTM.tmAscent); - my->fDescent = SkIntToScalar(fTM.tmDescent); - my->fBottom = SkIntToScalar(fTM.tmDescent); - my->fLeading = SkIntToScalar(fTM.tmExternalLeading); - my->fAvgCharWidth = SkIntToScalar(fTM.tmAveCharWidth); - my->fMaxCharWidth = SkIntToScalar(fTM.tmMaxCharWidth); - my->fXMin = 0; - my->fXMax = my->fMaxCharWidth; - //my->fXHeight = 0; - } + metrics->fTop = SkIntToScalar(-fTM.tmAscent); + metrics->fAscent = SkIntToScalar(-fTM.tmAscent); + metrics->fDescent = SkIntToScalar(fTM.tmDescent); + metrics->fBottom = SkIntToScalar(fTM.tmDescent); + metrics->fLeading = SkIntToScalar(fTM.tmExternalLeading); + metrics->fAvgCharWidth = SkIntToScalar(fTM.tmAveCharWidth); + metrics->fMaxCharWidth = SkIntToScalar(fTM.tmMaxCharWidth); + metrics->fXMin = 0; + metrics->fXMax = metrics->fMaxCharWidth; + //metrics->fXHeight = 0; #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS return; } @@ -1031,45 +1014,29 @@ void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint: return; } - if (mx) { - mx->fTop = SkIntToScalar(-otm.otmrcFontBox.left); - mx->fAscent = SkIntToScalar(-otm.otmAscent); - mx->fDescent = SkIntToScalar(-otm.otmDescent); - mx->fBottom = SkIntToScalar(otm.otmrcFontBox.right); - mx->fLeading = SkIntToScalar(otm.otmLineGap); - mx->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); - mx->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); - - mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } - - if (my) { #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS - my->fTop = SkIntToScalar(-otm.otmrcFontBox.top); - my->fAscent = SkIntToScalar(-otm.otmAscent); - my->fDescent = SkIntToScalar(-otm.otmDescent); - my->fBottom = SkIntToScalar(-otm.otmrcFontBox.bottom); - my->fLeading = SkIntToScalar(otm.otmLineGap); - my->fAvgCharWidth = SkIntToScalar(otm.otmTextMetrics.tmAveCharWidth); - my->fMaxCharWidth = SkIntToScalar(otm.otmTextMetrics.tmMaxCharWidth); - my->fXMin = SkIntToScalar(otm.otmrcFontBox.left); - my->fXMax = SkIntToScalar(otm.otmrcFontBox.right); + metrics->fTop = SkIntToScalar(-otm.otmrcFontBox.top); + metrics->fAscent = SkIntToScalar(-otm.otmAscent); + metrics->fDescent = SkIntToScalar(-otm.otmDescent); + metrics->fBottom = SkIntToScalar(-otm.otmrcFontBox.bottom); + metrics->fLeading = SkIntToScalar(otm.otmLineGap); + metrics->fAvgCharWidth = SkIntToScalar(otm.otmTextMetrics.tmAveCharWidth); + metrics->fMaxCharWidth = SkIntToScalar(otm.otmTextMetrics.tmMaxCharWidth); + metrics->fXMin = SkIntToScalar(otm.otmrcFontBox.left); + metrics->fXMax = SkIntToScalar(otm.otmrcFontBox.right); #endif - my->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); - my->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); - - my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; + metrics->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); + metrics->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); - my->fXHeight = SkIntToScalar(otm.otmsXHeight); + metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; + metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - GLYPHMETRICS gm; - sk_bzero(&gm, sizeof(gm)); - DWORD len = GetGlyphOutlineW(fDDC, 'x', GGO_METRICS, &gm, 0, 0, &gMat2Identity); - if (len != GDI_ERROR && gm.gmBlackBoxY > 0) { - my->fXHeight = SkIntToScalar(gm.gmBlackBoxY); - } + metrics->fXHeight = SkIntToScalar(otm.otmsXHeight); + GLYPHMETRICS gm; + sk_bzero(&gm, sizeof(gm)); + DWORD len = GetGlyphOutlineW(fDDC, 'x', GGO_METRICS, &gm, 0, 0, &gMat2Identity); + if (len != GDI_ERROR && gm.gmBlackBoxY > 0) { + metrics->fXHeight = SkIntToScalar(gm.gmBlackBoxY); } } @@ -2409,7 +2376,8 @@ void LogFontTypeface::onFilterRec(SkScalerContextRec* rec) const { rec->fFlags |= SkScalerContext::kGenA8FromLCD_Flag; } - unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | + unsigned flagsWeDontSupport = SkScalerContext::kVertical_Flag | + SkScalerContext::kDevKernText_Flag | SkScalerContext::kForceAutohinting_Flag | SkScalerContext::kEmbeddedBitmapText_Flag | SkScalerContext::kEmbolden_Flag | diff --git a/src/ports/SkScalerContext_win_dw.cpp b/src/ports/SkScalerContext_win_dw.cpp index b6c2895..02d5bb9 100644 --- a/src/ports/SkScalerContext_win_dw.cpp +++ b/src/ports/SkScalerContext_win_dw.cpp @@ -446,18 +446,13 @@ void SkScalerContext_DW::generateMetrics(SkGlyph* glyph) { glyph->fTop = SkToS16(bbox.top); } -void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* mx, - SkPaint::FontMetrics* my) { - if (!(mx || my)) +void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* metrics) { + if (NULL == metrics) { return; - - if (mx) { - sk_bzero(mx, sizeof(*mx)); - } - if (my) { - sk_bzero(my, sizeof(*my)); } + sk_bzero(metrics, sizeof(*metrics)); + DWRITE_FONT_METRICS dwfm; if (DWRITE_MEASURING_MODE_GDI_CLASSIC == fMeasuringMode || DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode) @@ -472,33 +467,18 @@ void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* mx, } SkScalar upem = SkIntToScalar(dwfm.designUnitsPerEm); - if (mx) { - mx->fTop = -fTextSizeRender * SkIntToScalar(dwfm.ascent) / upem; - mx->fAscent = mx->fTop; - mx->fDescent = fTextSizeRender * SkIntToScalar(dwfm.descent) / upem; - mx->fBottom = mx->fDescent; - mx->fLeading = fTextSizeRender * SkIntToScalar(dwfm.lineGap) / upem; - mx->fXHeight = fTextSizeRender * SkIntToScalar(dwfm.xHeight) / upem; - mx->fUnderlineThickness = fTextSizeRender * SkIntToScalar(dwfm.underlineThickness) / upem; - mx->fUnderlinePosition = -(fTextSizeRender * SkIntToScalar(dwfm.underlinePosition) / upem); - - mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } - if (my) { - my->fTop = -fTextSizeRender * SkIntToScalar(dwfm.ascent) / upem; - my->fAscent = my->fTop; - my->fDescent = fTextSizeRender * SkIntToScalar(dwfm.descent) / upem; - my->fBottom = my->fDescent; - my->fLeading = fTextSizeRender * SkIntToScalar(dwfm.lineGap) / upem; - my->fXHeight = fTextSizeRender * SkIntToScalar(dwfm.xHeight) / upem; - my->fUnderlineThickness = fTextSizeRender * SkIntToScalar(dwfm.underlineThickness) / upem; - my->fUnderlinePosition = -(fTextSizeRender * SkIntToScalar(dwfm.underlinePosition) / upem); - - my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; - my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; - } + metrics->fTop = -fTextSizeRender * SkIntToScalar(dwfm.ascent) / upem; + metrics->fAscent = metrics->fTop; + metrics->fDescent = fTextSizeRender * SkIntToScalar(dwfm.descent) / upem; + metrics->fBottom = metrics->fDescent; + metrics->fLeading = fTextSizeRender * SkIntToScalar(dwfm.lineGap) / upem; + metrics->fXHeight = fTextSizeRender * SkIntToScalar(dwfm.xHeight) / upem; + metrics->fUnderlineThickness = fTextSizeRender * SkIntToScalar(dwfm.underlineThickness) / upem; + metrics->fUnderlinePosition = -(fTextSizeRender * SkIntToScalar(dwfm.underlinePosition) / upem); + + metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; + metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/ports/SkScalerContext_win_dw.h b/src/ports/SkScalerContext_win_dw.h index e3dbd29..e8eff0d 100644 --- a/src/ports/SkScalerContext_win_dw.h +++ b/src/ports/SkScalerContext_win_dw.h @@ -30,8 +30,7 @@ protected: virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; - virtual void generateFontMetrics(SkPaint::FontMetrics* mX, - SkPaint::FontMetrics* mY) SK_OVERRIDE; + virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; private: const void* drawDWMask(const SkGlyph& glyph); diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp index 6ff8412..5031060 100644 --- a/src/ports/SkTypeface_win_dw.cpp +++ b/src/ports/SkTypeface_win_dw.cpp @@ -242,7 +242,8 @@ void DWriteFontTypeface::onFilterRec(SkScalerContext::Rec* rec) const { rec->fMaskFormat = SkMask::kA8_Format; } - unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | + unsigned flagsWeDontSupport = SkScalerContext::kVertical_Flag | + SkScalerContext::kDevKernText_Flag | SkScalerContext::kForceAutohinting_Flag | SkScalerContext::kEmbolden_Flag | SkScalerContext::kLCD_BGROrder_Flag | -- 2.7.4