diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-20 04:39:12 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-20 04:39:12 +0000 |
commit | a9e9a25471be22471ae42cf2eb1733ed15887243 (patch) | |
tree | 35438dabb7fb045c869c1bafd024dba0064119ce /src/ports | |
parent | 385afd8b7127b5578d6f272e6b9e7080c2afd229 (diff) |
This patch makes SkScalerContext_FreeType to be the only one which embolden the glyphs.
Add bench cases for different font styles.
BUG=
R=bungeman@google.com, reed@google.com
Author: zheng.xu@arm.com
Review URL: https://codereview.chromium.org/101423004
git-svn-id: http://skia.googlecode.com/svn/trunk@12792 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports')
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 41 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType_common.cpp | 17 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType_common.h | 1 |
3 files changed, 27 insertions, 32 deletions
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index 6b29c1d31e..97046f4ba8 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); }; /////////////////////////////////////////////////////////////////////////// @@ -1139,10 +1142,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; } @@ -1192,6 +1192,7 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) { glyph->zeroMetrics(); return; } + emboldenIfNeeded(fFace, fFace->glyph); switch ( fFace->glyph->format ) { case FT_GLYPH_FORMAT_OUTLINE: @@ -1201,10 +1202,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); @@ -1218,11 +1215,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; @@ -1301,6 +1293,7 @@ void SkScalerContext_FreeType::generateImage(const SkGlyph& glyph) { return; } + emboldenIfNeeded(fFace, fFace->glyph); generateGlyphImage(fFace, glyph); } @@ -1328,6 +1321,7 @@ void SkScalerContext_FreeType::generatePath(const SkGlyph& glyph, path->reset(); return; } + emboldenIfNeeded(fFace, fFace->glyph); generateGlyphPath(fFace, path); @@ -1469,6 +1463,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" diff --git a/src/ports/SkFontHost_FreeType_common.cpp b/src/ports/SkFontHost_FreeType_common.cpp index 065a83a41c..e4323d81a1 100644 --- a/src/ports/SkFontHost_FreeType_common.cpp +++ b/src/ports/SkFontHost_FreeType_common.cpp @@ -344,11 +344,6 @@ void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly FT_BBox bbox; FT_Bitmap target; - if (fRec.fFlags & SkScalerContext::kEmbolden_Flag && - !(face->style_flags & FT_STYLE_FLAG_BOLD)) { - emboldenOutline(face, outline); - } - int dx = 0, dy = 0; if (fRec.fFlags & SkScalerContext::kSubpixelPositioning_Flag) { dx = SkFixedToFDot6(glyph.getSubXFixed()); @@ -547,10 +542,6 @@ static int cubic_proc(const FT_Vector* pt0, const FT_Vector* pt1, void SkScalerContext_FreeType_Base::generateGlyphPath(FT_Face face, SkPath* path) { - if (fRec.fFlags & SkScalerContext::kEmbolden_Flag) { - emboldenOutline(face, &face->glyph->outline); - } - FT_Outline_Funcs funcs; funcs.move_to = move_proc; @@ -569,11 +560,3 @@ void SkScalerContext_FreeType_Base::generateGlyphPath(FT_Face face, path->close(); } - -void SkScalerContext_FreeType_Base::emboldenOutline(FT_Face face, FT_Outline* outline) -{ - FT_Pos strength; - strength = FT_MulFix(face->units_per_EM, face->size->metrics.y_scale) - / 24; - FT_Outline_Embolden(outline, strength); -} diff --git a/src/ports/SkFontHost_FreeType_common.h b/src/ports/SkFontHost_FreeType_common.h index 0021dfdd80..aef4d82044 100644 --- a/src/ports/SkFontHost_FreeType_common.h +++ b/src/ports/SkFontHost_FreeType_common.h @@ -39,7 +39,6 @@ protected: void generateGlyphImage(FT_Face face, const SkGlyph& glyph); void generateGlyphPath(FT_Face face, SkPath* path); - void emboldenOutline(FT_Face face, FT_Outline* outline); private: typedef SkScalerContext INHERITED; |