diff options
author | 2011-03-30 18:36:29 +0000 | |
---|---|---|
committer | 2011-03-30 18:36:29 +0000 | |
commit | 325cb9aa17b94258b362082eb3a799524f4345f3 (patch) | |
tree | ba2f296cc1337cb858ee2ea1289e153dc512588a /src/ports | |
parent | e733071abeb9cce9f524f5a85851bc7fbb8d867b (diff) |
Improve the SkAdvancedTypefaceMetrics interface w.r.t. vertical advances.
Add a template function to type safe-combine bits of a bit field.
Review URL: http://codereview.appspot.com/4313053
git-svn-id: http://skia.googlecode.com/svn/trunk@1020 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports')
-rw-r--r-- | src/ports/SkFontHost_FONTPATH.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 45 | ||||
-rw-r--r-- | src/ports/SkFontHost_mac_atsui.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkFontHost_mac_coretext.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkFontHost_none.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkFontHost_simple.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkFontHost_win.cpp | 5 |
7 files changed, 38 insertions, 27 deletions
diff --git a/src/ports/SkFontHost_FONTPATH.cpp b/src/ports/SkFontHost_FONTPATH.cpp index 98f4ba5dc7..afab8749f7 100644 --- a/src/ports/SkFontHost_FONTPATH.cpp +++ b/src/ports/SkFontHost_FONTPATH.cpp @@ -271,7 +271,8 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { sk_throw(); // not implemented return NULL; } diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index 1c0b269fa7..e058a362bb 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -344,7 +344,8 @@ static bool getWidthAdvance(FT_Face face, int gId, int16_t* data) { // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { #if defined(SK_BUILD_FOR_MAC) || defined(ANDROID) return NULL; #else @@ -386,12 +387,6 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( } } - SkASSERT(!FT_HAS_VERTICAL(face)); -#ifdef FT_IS_CID_KEYED - SkASSERT(FT_IS_CID_KEYED(face) == - (info->fType == SkAdvancedTypefaceMetrics::kType1CID_Font)); -#endif - info->fStyle = 0; if (FT_IS_FIXED_WIDTH(face)) info->fStyle |= SkAdvancedTypefaceMetrics::kFixedPitch_Style; @@ -463,8 +458,12 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax, face->bbox.xMax, face->bbox.yMin); - if (perGlyphInfo && canEmbed(face) && FT_IS_SCALABLE(face) && - info->fType != SkAdvancedTypefaceMetrics::kOther_Font) { + if (!canEmbed(face) || !FT_IS_SCALABLE(face) || + info->fType == SkAdvancedTypefaceMetrics::kOther_Font) { + perGlyphInfo = SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo; + } + + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { if (FT_IS_FIXED_WIDTH(face)) { appendRange(&info->fGlyphWidths, 0); int16_t advance = face->max_advance_width; @@ -492,18 +491,24 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( info->fGlyphWidths.reset( getAdvanceData(face, face->num_glyphs, &getWidthAdvance)); } + } - if (info->fType == SkAdvancedTypefaceMetrics::kType1_Font) { - // Postscript fonts may contain more than 255 glyphs, so we end up - // using multiple font descriptions with a glyph ordering. Record - // the name of each glyph. - info->fGlyphNames.reset( - new SkAutoTArray<SkString>(face->num_glyphs)); - for (int gID = 0; gID < face->num_glyphs; gID++) { - char glyphName[128]; // PS limit for names is 127 bytes. - FT_Get_Glyph_Name(face, gID, glyphName, 128); - info->fGlyphNames->get()[gID].set(glyphName); - } + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kVAdvance_PerGlyphInfo && + FT_HAS_VERTICAL(face)) { + SkASSERT(false); // Not implemented yet. + } + + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo && + info->fType == SkAdvancedTypefaceMetrics::kType1_Font) { + // Postscript fonts may contain more than 255 glyphs, so we end up + // using multiple font descriptions with a glyph ordering. Record + // the name of each glyph. + info->fGlyphNames.reset( + new SkAutoTArray<SkString>(face->num_glyphs)); + for (int gID = 0; gID < face->num_glyphs; gID++) { + char glyphName[128]; // PS limit for names is 127 bytes. + FT_Get_Glyph_Name(face, gID, glyphName, 128); + info->fGlyphNames->get()[gID].set(glyphName); } } diff --git a/src/ports/SkFontHost_mac_atsui.cpp b/src/ports/SkFontHost_mac_atsui.cpp index 1d40a42a94..5bc438a4b6 100644 --- a/src/ports/SkFontHost_mac_atsui.cpp +++ b/src/ports/SkFontHost_mac_atsui.cpp @@ -481,7 +481,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented"); return NULL; } diff --git a/src/ports/SkFontHost_mac_coretext.cpp b/src/ports/SkFontHost_mac_coretext.cpp index 6ffe17b403..5f75d19fc2 100644 --- a/src/ports/SkFontHost_mac_coretext.cpp +++ b/src/ports/SkFontHost_mac_coretext.cpp @@ -676,7 +676,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented"); return NULL; } diff --git a/src/ports/SkFontHost_none.cpp b/src/ports/SkFontHost_none.cpp index d56c94aa5e..91546f8043 100644 --- a/src/ports/SkFontHost_none.cpp +++ b/src/ports/SkFontHost_none.cpp @@ -35,7 +35,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(char const*) { // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented"); return NULL; } diff --git a/src/ports/SkFontHost_simple.cpp b/src/ports/SkFontHost_simple.cpp index 60334e7856..54d326efb2 100644 --- a/src/ports/SkFontHost_simple.cpp +++ b/src/ports/SkFontHost_simple.cpp @@ -592,7 +592,8 @@ SkStream* SkFontHost::OpenStream(uint32_t fontID) { #if 0 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented"); return NULL; } diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp index e6f83c10e1..d95bd80f6e 100644 --- a/src/ports/SkFontHost_win.cpp +++ b/src/ports/SkFontHost_win.cpp @@ -613,7 +613,8 @@ static bool getWidthAdvance(HDC hdc, int gId, int16_t* advance) { // static SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( - uint32_t fontID, bool perGlyphInfo) { + uint32_t fontID, + SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) { SkAutoMutexAcquire ac(gFTMutex); LogFontTypeface* rec = LogFontTypeface::FindById(fontID); LOGFONT lf = rec->logFont(); @@ -721,7 +722,7 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( // If bit 2 is set, the embedding is read-only. if (otm.otmfsType & 0x1) { info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - } else if (perGlyphInfo) { + } else if (perGlyphInfo & kHAdvance_PerGlyphInfo) { info->fGlyphWidths.reset( getAdvanceData(hdc, glyphCount, &getWidthAdvance)); } |