DO NOT MERGE 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.

This is a cherry-pick of change I4132a232 from master.

Bug: 6629786
Change-Id: I389d6793e5472d664f6ac7b894927dbfd811be12
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 @@
                               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 @@
 
     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 @@
         } else {
             strokeWidth += extra;
         }
-#endif
     }
+#endif
 
     if (paint.isDevKernText()) {
         flags |= SkScalerContext::kDevKernText_Flag;