Index: src/ports/SkFontHost_FreeType.cpp |
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp |
index f79e27b7ed06890e7d4d5a4c3bab75286c1f4f45..62c7c128a7fbb33921c1923fd7c5d48b10830089 100644 |
--- a/src/ports/SkFontHost_FreeType.cpp |
+++ b/src/ports/SkFontHost_FreeType.cpp |
@@ -1,4 +1,4 @@ |
- |
+ |
/* |
* Copyright 2006 The Android Open Source Project |
* |
@@ -216,6 +216,9 @@ private: |
bool getCBoxForLetter(char letter, FT_BBox* bbox); |
// Caller must lock gFTMutex before calling this function. |
void updateGlyphIfLCD(SkGlyph* glyph); |
+ // Caller must lock gFTMutex before calling this function. |
+ // update FreeType2 glyph slot with glyph emboldened |
+ void emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph); |
}; |
/////////////////////////////////////////////////////////////////////////// |
@@ -1136,10 +1139,7 @@ bool SkScalerContext_FreeType::getCBoxForLetter(char letter, FT_BBox* bbox) { |
return false; |
if (FT_Load_Glyph(fFace, glyph_id, fLoadGlyphFlags) != 0) |
return false; |
- if ((fRec.fFlags & kEmbolden_Flag) && |
- !(fFace->style_flags & FT_STYLE_FLAG_BOLD)) { |
- emboldenOutline(fFace, &fFace->glyph->outline); |
- } |
+ emboldenIfNeeded(fFace, fFace->glyph); |
FT_Outline_Get_CBox(&fFace->glyph->outline, bbox); |
return true; |
} |
@@ -1189,6 +1189,7 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) { |
glyph->zeroMetrics(); |
return; |
} |
+ emboldenIfNeeded(fFace, fFace->glyph); |
switch ( fFace->glyph->format ) { |
case FT_GLYPH_FORMAT_OUTLINE: |
@@ -1198,10 +1199,6 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) { |
glyph->fTop = 0; |
glyph->fLeft = 0; |
} else { |
- if (fRec.fFlags & kEmbolden_Flag && !(fFace->style_flags & FT_STYLE_FLAG_BOLD)) { |
- emboldenOutline(fFace, &fFace->glyph->outline); |
- } |
- |
FT_BBox bbox; |
getBBoxForCurrentGlyph(glyph, &bbox, true); |
@@ -1215,11 +1212,6 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) { |
break; |
case FT_GLYPH_FORMAT_BITMAP: |
- if (fRec.fFlags & kEmbolden_Flag) { |
- FT_GlyphSlot_Own_Bitmap(fFace->glyph); |
- FT_Bitmap_Embolden(gFTLibrary, &fFace->glyph->bitmap, kBitmapEmboldenStrength, 0); |
- } |
- |
if (fRec.fFlags & SkScalerContext::kVertical_Flag) { |
FT_Vector vector; |
vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.horiBearingX; |
@@ -1298,6 +1290,7 @@ void SkScalerContext_FreeType::generateImage(const SkGlyph& glyph) { |
return; |
} |
+ emboldenIfNeeded(fFace, fFace->glyph); |
generateGlyphImage(fFace, glyph); |
} |
@@ -1325,6 +1318,7 @@ void SkScalerContext_FreeType::generatePath(const SkGlyph& glyph, |
path->reset(); |
return; |
} |
+ emboldenIfNeeded(fFace, fFace->glyph); |
generateGlyphPath(fFace, path); |
@@ -1466,6 +1460,25 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
} |
} |
+void SkScalerContext_FreeType::emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph) |
+{ |
+ if (fRec.fFlags & SkScalerContext::kEmbolden_Flag) { |
+ switch ( glyph->format ) { |
+ case FT_GLYPH_FORMAT_OUTLINE: |
+ FT_Pos strength; |
+ strength = FT_MulFix(face->units_per_EM, face->size->metrics.y_scale) / 24; |
+ FT_Outline_Embolden(&glyph->outline, strength); |
+ break; |
+ case FT_GLYPH_FORMAT_BITMAP: |
+ FT_GlyphSlot_Own_Bitmap(glyph); |
+ FT_Bitmap_Embolden(glyph->library, &glyph->bitmap, kBitmapEmboldenStrength, 0); |
+ break; |
+ default: |
+ SkDEBUGFAIL("unknown glyph format"); |
+ } |
+ } |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
#include "SkUtils.h" |