From 2de1eda3d2a6d27b0a71ca3ca0f125111cccc708 Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Thu, 29 Mar 2018 15:02:28 -0400 Subject: SkScalerContext::getMetrics to not request metrics it will ignore. Before this change SkScalerContext::getMetrics always calls generateMetrics to force the subclass to create full metrics. However, if the SkScalerContext is going to draw from outlines then there is no reason to do so since it is immediately going to overwrite those metrics by computing its own from the path. This also puts off other decisions being made based on the glyph metrics until after the metrics are fully computed. The logic in SkScalerContext::getImage is updated to be similar to the logic in the new SkScalerContext::getMetrics. Change-Id: I1798c9244277fab85595fb39fc3a85ef7eb33620 Reviewed-on: https://skia-review.googlesource.com/117085 Reviewed-by: Herb Derby Commit-Queue: Ben Wagner --- tools/fonts/SkTestTypeface.cpp | 57 +++++++----------------------------------- tools/fonts/SkTestTypeface.h | 1 - 2 files changed, 9 insertions(+), 49 deletions(-) (limited to 'tools/fonts') diff --git a/tools/fonts/SkTestTypeface.cpp b/tools/fonts/SkTestTypeface.cpp index 52751c9f59..c2d220154c 100644 --- a/tools/fonts/SkTestTypeface.cpp +++ b/tools/fonts/SkTestTypeface.cpp @@ -98,16 +98,6 @@ SkTestTypeface::SkTestTypeface(sk_sp testFont, const SkFontStyle& st } void SkTestTypeface::getAdvance(SkGlyph* glyph) { - // TODO(benjaminwagner): Update users to use floats. - glyph->fAdvanceX = SkFixedToFloat(fTestFont->fWidths[glyph->getGlyphID()]); - glyph->fAdvanceY = 0; -} - -void SkTestTypeface::getFontMetrics(SkPaint::FontMetrics* metrics) { - *metrics = fTestFont->fMetrics; -} - -void SkTestTypeface::getMetrics(SkGlyph* glyph) { SkGlyphID glyphID = glyph->getGlyphID(); glyphID = glyphID < fTestFont->fCharCodesCount ? glyphID : 0; @@ -116,6 +106,10 @@ void SkTestTypeface::getMetrics(SkGlyph* glyph) { glyph->fAdvanceY = 0; } +void SkTestTypeface::getFontMetrics(SkPaint::FontMetrics* metrics) { + *metrics = fTestFont->fMetrics; +} + void SkTestTypeface::getPath(SkGlyphID glyphID, SkPath* path) { glyphID = glyphID < fTestFont->fCharCodesCount ? glyphID : 0; *path = *fTestFont->fPaths[glyphID]; @@ -211,46 +205,13 @@ protected: } void generateMetrics(SkGlyph* glyph) override { - this->getTestTypeface()->getMetrics(glyph); - - const SkVector advance = fMatrix.mapXY(SkFloatToScalar(glyph->fAdvanceX), - SkFloatToScalar(glyph->fAdvanceY)); - glyph->fAdvanceX = SkScalarToFloat(advance.fX); - glyph->fAdvanceY = SkScalarToFloat(advance.fY); - - SkPath path; - this->getTestTypeface()->getPath(glyph->getGlyphID(), &path); - path.transform(fMatrix); - - SkRect storage; - const SkPaint paint; - const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(), - &storage, - SkPaint::kFill_Style); - SkIRect ibounds; - newBounds.roundOut(&ibounds); - glyph->fLeft = ibounds.fLeft; - glyph->fTop = ibounds.fTop; - glyph->fWidth = ibounds.width(); - glyph->fHeight = ibounds.height(); + glyph->zeroMetrics(); + this->generateAdvance(glyph); + // Always generates from paths, so SkScalerContext::getMetrics will figure the bounds. } - void generateImage(const SkGlyph& glyph) override { - SkPath path; - this->getTestTypeface()->getPath(glyph.getGlyphID(), &path); - - SkBitmap bm; - bm.installPixels(SkImageInfo::MakeN32Premul(glyph.fWidth, glyph.fHeight), - glyph.fImage, glyph.rowBytes()); - bm.eraseColor(0); - - SkCanvas canvas(bm); - canvas.translate(-SkIntToScalar(glyph.fLeft), - -SkIntToScalar(glyph.fTop)); - canvas.concat(fMatrix); - SkPaint paint; - paint.setAntiAlias(true); - canvas.drawPath(path, paint); + void generateImage(const SkGlyph&) override { + SK_ABORT("Should have generated from path."); } void generatePath(SkGlyphID glyph, SkPath* path) override { diff --git a/tools/fonts/SkTestTypeface.h b/tools/fonts/SkTestTypeface.h index b520fb6e5c..d3365f972a 100644 --- a/tools/fonts/SkTestTypeface.h +++ b/tools/fonts/SkTestTypeface.h @@ -66,7 +66,6 @@ public: SkTestTypeface(sk_sp, const SkFontStyle& style); void getAdvance(SkGlyph* glyph); void getFontMetrics(SkPaint::FontMetrics* metrics); - void getMetrics(SkGlyph* glyph); void getPath(SkGlyphID glyph, SkPath* path); protected: SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, -- cgit v1.2.3