aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictoria Lease <violets@google.com>2012-06-13 10:23:10 -0700
committerVictoria Lease <violets@google.com>2012-06-13 13:09:18 -0700
commit79bf51281ffa537ddfbb54dededdad5aa9e466e8 (patch)
tree513ecd82d2a8e3430628a98164b0366ffcc1c7e2
parentc6c5c1d498aef6fc1d1f2e80c5488d374d33db49 (diff)
downloadexternal_skia-79bf51281ffa537ddfbb54dededdad5aa9e466e8.zip
external_skia-79bf51281ffa537ddfbb54dededdad5aa9e466e8.tar.gz
external_skia-79bf51281ffa537ddfbb54dededdad5aa9e466e8.tar.bz2
Skia solution to fake-bold fallback fonts.
This version of the fake-bold-for-fallback-fonts fix addresses the issue succinctly inside of Skia, with no need for Skia's clients to be aware of the issue. Attempts to draw a bold parent font flag the embolden flag in the associated SkScalerContext while leaving the SkPaint's fake bold flag unmodified. This depends upon change Icdd13f6b, which arranges for FreeType's FontHost to ignore redundant embolden requests. Bug: 6629786 Change-Id: I4132a232896f72f632caefd79add2f00c36a578a
-rw-r--r--src/core/SkPaint.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 07fe9b0..e1932a7 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1447,7 +1447,8 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
const SkMatrix* deviceMatrix, Rec* rec) {
SkASSERT(deviceMatrix == NULL || !deviceMatrix->hasPerspective());
- rec->fOrigFontID = SkTypeface::UniqueID(paint.getTypeface());
+ SkTypeface* typeface = paint.getTypeface();
+ rec->fOrigFontID = SkTypeface::UniqueID(typeface);
rec->fFontID = rec->fOrigFontID;
rec->fTextSize = paint.getTextSize();
rec->fPreScaleX = paint.getTextScaleX();
@@ -1468,10 +1469,21 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
unsigned flags = 0;
- if (paint.isFakeBoldText()) {
#ifdef SK_USE_FREETYPE_EMBOLDEN
+ // It is possible that the SkTypeface used to draw glyphs has
+ // different properties than the SkTypeface set in the SkPaint.
+ // If we are asked to render bold text with a bold font, and are
+ // forced to fall back to a font with normal weight for some
+ // glyphs, we need to use fake bold to render those glyphs. In
+ // order to do that, we set SkScalerContext's "embolden" flag
+ // here if we are trying to draw bold text via any means, and
+ // ignore it at the glyph outline generation stage if the font
+ // actually being used is already bold.
+ if (paint.isFakeBoldText() || (typeface && typeface->isBold())) {
flags |= SkScalerContext::kEmbolden_Flag;
+ }
#else
+ if (paint.isFakeBoldText()) {
SkScalar fakeBoldScale = SkScalarInterpFunc(paint.getTextSize(),
kStdFakeBoldInterpKeys,
kStdFakeBoldInterpValues,
@@ -1484,8 +1496,8 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
} else {
strokeWidth += extra;
}
-#endif
}
+#endif
if (paint.isDevKernText()) {
flags |= SkScalerContext::kDevKernText_Flag;