aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Ben Wagner <bungeman@google.com>2018-03-29 15:02:28 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-04-02 20:54:52 +0000
commit2de1eda3d2a6d27b0a71ca3ca0f125111cccc708 (patch)
treec8d2725adedd4c6a747cf929986021de0a8b820f /src/core
parent97be6f99f6af08630ab76da6130f825d02569799 (diff)
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 <herb@google.com> Commit-Queue: Ben Wagner <bungeman@google.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkScalerContext.cpp61
1 files changed, 31 insertions, 30 deletions
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp
index 6302a80dc1..96a0f80d7d 100644
--- a/src/core/SkScalerContext.cpp
+++ b/src/core/SkScalerContext.cpp
@@ -71,38 +71,20 @@ void SkScalerContext::getAdvance(SkGlyph* glyph) {
}
void SkScalerContext::getMetrics(SkGlyph* glyph) {
- generateMetrics(glyph);
-
- // for now we have separate cache entries for devkerning on and off
- // in the future we might share caches, but make our measure/draw
- // code make the distinction. Thus we zap the values if the caller
- // has not asked for them.
- if ((fRec.fFlags & SkScalerContext::kDevKernText_Flag) == 0) {
- // no devkern, so zap the fields
- glyph->fLsbDelta = glyph->fRsbDelta = 0;
- }
-
- // if either dimension is empty, zap the image bounds of the glyph
- if (0 == glyph->fWidth || 0 == glyph->fHeight) {
- glyph->fWidth = 0;
- glyph->fHeight = 0;
- glyph->fTop = 0;
- glyph->fLeft = 0;
- glyph->fMaskFormat = 0;
- return;
- }
-
bool generatingImageFromPath = fGenerateImageFromPath;
- if (fGenerateImageFromPath) {
+ if (!generatingImageFromPath) {
+ generateMetrics(glyph);
+ } else {
SkPath devPath, fillPath;
SkMatrix fillToDevMatrix;
-
- if (!this->internalGetPath(glyph->getPackedID(), &fillPath, &devPath, &fillToDevMatrix)) {
- generatingImageFromPath = false;
+ generatingImageFromPath = this->internalGetPath(glyph->getPackedID(), &fillPath, &devPath,
+ &fillToDevMatrix);
+ if (!generatingImageFromPath) {
+ generateMetrics(glyph);
} else {
- // just use devPath
- const SkIRect ir = devPath.getBounds().roundOut();
+ generateAdvance(glyph);
+ const SkIRect ir = devPath.getBounds().roundOut();
if (ir.isEmpty() || !ir.is16Bit()) {
goto SK_ERROR;
}
@@ -124,6 +106,25 @@ void SkScalerContext::getMetrics(SkGlyph* glyph) {
}
}
+ // for now we have separate cache entries for devkerning on and off
+ // in the future we might share caches, but make our measure/draw
+ // code make the distinction. Thus we zap the values if the caller
+ // has not asked for them.
+ if ((fRec.fFlags & SkScalerContext::kDevKernText_Flag) == 0) {
+ // no devkern, so zap the fields
+ glyph->fLsbDelta = glyph->fRsbDelta = 0;
+ }
+
+ // if either dimension is empty, zap the image bounds of the glyph
+ if (0 == glyph->fWidth || 0 == glyph->fHeight) {
+ glyph->fWidth = 0;
+ glyph->fHeight = 0;
+ glyph->fTop = 0;
+ glyph->fLeft = 0;
+ glyph->fMaskFormat = 0;
+ return;
+ }
+
if (SkMask::kARGB32_Format != glyph->fMaskFormat) {
glyph->fMaskFormat = fRec.fMaskFormat;
}
@@ -428,7 +429,9 @@ void SkScalerContext::getImage(const SkGlyph& origGlyph) {
glyph = &tmpGlyph;
}
- if (fGenerateImageFromPath) {
+ if (!fGenerateImageFromPath) {
+ generateImage(*glyph);
+ } else {
SkPath devPath, fillPath;
SkMatrix fillToDevMatrix;
SkMask mask;
@@ -441,8 +444,6 @@ void SkScalerContext::getImage(const SkGlyph& origGlyph) {
SkASSERT(SkMask::kARGB32_Format != mask.fFormat);
generateMask(mask, devPath, fPreBlend);
}
- } else {
- generateImage(*glyph);
}
if (fMaskFilter) {