Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Unified Diff: src/ports/SkFontHost_FreeType.cpp

Issue 1163833003: Add cmap 3,0 (symbol) as Unicode fallback. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « resources/fonts/SpiderSymbol.ttf ('k') | tests/FontHostTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ports/SkFontHost_FreeType.cpp
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index a4305bfa872b9b0aa160e82e0a36fa17b16e9962..b3a65e1985e133e93a8dc9083064e0c0dd39173f 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -352,6 +352,16 @@ static SkFaceRec* ref_ft_face(const SkTypeface* typeface) {
ft_face_setup_axes(rec->fFace, *data);
+ // FreeType will set the charmap to the "most unicode" cmap if it exists.
+ // If there are no unicode cmaps, the charmap is set to NULL.
+ // However, "symbol" cmaps should also be considered "fallback unicode" cmaps
+ // because they are effectively private use area only (even if they aren't).
+ // This is the last on the fallback list at
+ // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html
+ if (!rec->fFace->charmap) {
+ FT_Select_Charmap(rec->fFace, FT_ENCODING_MS_SYMBOL);
+ }
+
rec->fNext = gFaceRecHead;
gFaceRecHead = rec;
return rec;
@@ -446,51 +456,14 @@ static bool getWidthAdvance(FT_Face face, int gId, int16_t* data) {
}
static void populate_glyph_to_unicode(FT_Face& face, SkTDArray<SkUnichar>* glyphToUnicode) {
- // Check and see if we have Unicode cmaps.
- for (int i = 0; i < face->num_charmaps; ++i) {
- // CMaps known to support Unicode:
- // Platform ID Encoding ID Name
- // ----------- ----------- -----------------------------------
- // 0 0,1 Apple Unicode
- // 0 3 Apple Unicode 2.0 (preferred)
- // 3 1 Microsoft Unicode UCS-2
- // 3 10 Microsoft Unicode UCS-4 (preferred)
- //
- // See Apple TrueType Reference Manual
- // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6cmap.html
- // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html#ID
- // Microsoft OpenType Specification
- // http://www.microsoft.com/typography/otspec/cmap.htm
-
- FT_UShort platformId = face->charmaps[i]->platform_id;
- FT_UShort encodingId = face->charmaps[i]->encoding_id;
-
- if (platformId != 0 && platformId != 3) {
- continue;
- }
- if (platformId == 3 && encodingId != 1 && encodingId != 10) {
- continue;
- }
- bool preferredMap = ((platformId == 3 && encodingId == 10) ||
- (platformId == 0 && encodingId == 3));
-
- FT_Set_Charmap(face, face->charmaps[i]);
- if (glyphToUnicode->isEmpty()) {
- glyphToUnicode->setCount(face->num_glyphs);
- memset(glyphToUnicode->begin(), 0,
- sizeof(SkUnichar) * face->num_glyphs);
- }
+ glyphToUnicode->setCount(face->num_glyphs);
+ sk_bzero(glyphToUnicode->begin(), sizeof((*glyphToUnicode)[0]) * face->num_glyphs);
- // Iterate through each cmap entry.
- FT_UInt glyphIndex;
- for (SkUnichar charCode = FT_Get_First_Char(face, &glyphIndex);
- glyphIndex != 0;
- charCode = FT_Get_Next_Char(face, charCode, &glyphIndex)) {
- if (charCode &&
- ((*glyphToUnicode)[glyphIndex] == 0 || preferredMap)) {
- (*glyphToUnicode)[glyphIndex] = charCode;
- }
- }
+ FT_UInt glyphIndex;
+ SkUnichar charCode = FT_Get_First_Char(face, &glyphIndex);
+ while (glyphIndex) {
+ (*glyphToUnicode)[glyphIndex] = charCode;
+ charCode = FT_Get_Next_Char(face, charCode, &glyphIndex);
}
}
@@ -1507,7 +1480,8 @@ static EncodingProc find_encoding_proc(SkTypeface::Encoding enc) {
}
int SkTypeface_FreeType::onCharsToGlyphs(const void* chars, Encoding encoding,
- uint16_t glyphs[], int glyphCount) const {
+ uint16_t glyphs[], int glyphCount) const
+{
AutoFTAccess fta(this);
FT_Face face = fta.face();
if (!face) {
« no previous file with comments | « resources/fonts/SpiderSymbol.ttf ('k') | tests/FontHostTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698