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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « resources/fonts/SpiderSymbol.ttf ('k') | tests/FontHostTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkAdvancedTypefaceMetrics.h" 8 #include "SkAdvancedTypefaceMetrics.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 FT_Error err = FT_Open_Face(gFTLibrary->library(), &args, data->getIndex(), &rec->fFace); 345 FT_Error err = FT_Open_Face(gFTLibrary->library(), &args, data->getIndex(), &rec->fFace);
346 if (err) { 346 if (err) {
347 SkDEBUGF(("ERROR: unable to open font '%x'\n", fontID)); 347 SkDEBUGF(("ERROR: unable to open font '%x'\n", fontID));
348 SkDELETE(rec); 348 SkDELETE(rec);
349 return NULL; 349 return NULL;
350 } 350 }
351 SkASSERT(rec->fFace); 351 SkASSERT(rec->fFace);
352 352
353 ft_face_setup_axes(rec->fFace, *data); 353 ft_face_setup_axes(rec->fFace, *data);
354 354
355 // FreeType will set the charmap to the "most unicode" cmap if it exists.
356 // If there are no unicode cmaps, the charmap is set to NULL.
357 // However, "symbol" cmaps should also be considered "fallback unicode" cmap s
358 // because they are effectively private use area only (even if they aren't).
359 // This is the last on the fallback list at
360 // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cma p.html
361 if (!rec->fFace->charmap) {
362 FT_Select_Charmap(rec->fFace, FT_ENCODING_MS_SYMBOL);
363 }
364
355 rec->fNext = gFaceRecHead; 365 rec->fNext = gFaceRecHead;
356 gFaceRecHead = rec; 366 gFaceRecHead = rec;
357 return rec; 367 return rec;
358 } 368 }
359 369
360 // Caller must lock gFTMutex before calling this function. 370 // Caller must lock gFTMutex before calling this function.
361 static void unref_ft_face(FT_Face face) { 371 static void unref_ft_face(FT_Face face) {
362 gFTMutex.assertHeld(); 372 gFTMutex.assertHeld();
363 373
364 SkFaceRec* rec = gFaceRecHead; 374 SkFaceRec* rec = gFaceRecHead;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 FT_Fixed advance = 0; 449 FT_Fixed advance = 0;
440 if (FT_Get_Advances(face, gId, 1, FT_LOAD_NO_SCALE, &advance)) { 450 if (FT_Get_Advances(face, gId, 1, FT_LOAD_NO_SCALE, &advance)) {
441 return false; 451 return false;
442 } 452 }
443 SkASSERT(data); 453 SkASSERT(data);
444 *data = advance; 454 *data = advance;
445 return true; 455 return true;
446 } 456 }
447 457
448 static void populate_glyph_to_unicode(FT_Face& face, SkTDArray<SkUnichar>* glyph ToUnicode) { 458 static void populate_glyph_to_unicode(FT_Face& face, SkTDArray<SkUnichar>* glyph ToUnicode) {
449 // Check and see if we have Unicode cmaps. 459 glyphToUnicode->setCount(face->num_glyphs);
450 for (int i = 0; i < face->num_charmaps; ++i) { 460 sk_bzero(glyphToUnicode->begin(), sizeof((*glyphToUnicode)[0]) * face->num_g lyphs);
451 // CMaps known to support Unicode:
452 // Platform ID Encoding ID Name
453 // ----------- ----------- -----------------------------------
454 // 0 0,1 Apple Unicode
455 // 0 3 Apple Unicode 2.0 (preferred)
456 // 3 1 Microsoft Unicode UCS-2
457 // 3 10 Microsoft Unicode UCS-4 (preferred)
458 //
459 // See Apple TrueType Reference Manual
460 // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6cmap.html
461 // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html#ID
462 // Microsoft OpenType Specification
463 // http://www.microsoft.com/typography/otspec/cmap.htm
464 461
465 FT_UShort platformId = face->charmaps[i]->platform_id; 462 FT_UInt glyphIndex;
466 FT_UShort encodingId = face->charmaps[i]->encoding_id; 463 SkUnichar charCode = FT_Get_First_Char(face, &glyphIndex);
467 464 while (glyphIndex) {
468 if (platformId != 0 && platformId != 3) { 465 (*glyphToUnicode)[glyphIndex] = charCode;
469 continue; 466 charCode = FT_Get_Next_Char(face, charCode, &glyphIndex);
470 }
471 if (platformId == 3 && encodingId != 1 && encodingId != 10) {
472 continue;
473 }
474 bool preferredMap = ((platformId == 3 && encodingId == 10) ||
475 (platformId == 0 && encodingId == 3));
476
477 FT_Set_Charmap(face, face->charmaps[i]);
478 if (glyphToUnicode->isEmpty()) {
479 glyphToUnicode->setCount(face->num_glyphs);
480 memset(glyphToUnicode->begin(), 0,
481 sizeof(SkUnichar) * face->num_glyphs);
482 }
483
484 // Iterate through each cmap entry.
485 FT_UInt glyphIndex;
486 for (SkUnichar charCode = FT_Get_First_Char(face, &glyphIndex);
487 glyphIndex != 0;
488 charCode = FT_Get_Next_Char(face, charCode, &glyphIndex)) {
489 if (charCode &&
490 ((*glyphToUnicode)[glyphIndex] == 0 || preferredMap)) {
491 (*glyphToUnicode)[glyphIndex] = charCode;
492 }
493 }
494 } 467 }
495 } 468 }
496 469
497 SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( 470 SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics(
498 PerGlyphInfo perGlyphInfo, 471 PerGlyphInfo perGlyphInfo,
499 const uint32_t* glyphIDs, 472 const uint32_t* glyphIDs,
500 uint32_t glyphIDsCount) const { 473 uint32_t glyphIDsCount) const {
501 #if defined(SK_BUILD_FOR_MAC) 474 #if defined(SK_BUILD_FOR_MAC)
502 return NULL; 475 return NULL;
503 #else 476 #else
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 1473
1501 static EncodingProc find_encoding_proc(SkTypeface::Encoding enc) { 1474 static EncodingProc find_encoding_proc(SkTypeface::Encoding enc) {
1502 static const EncodingProc gProcs[] = { 1475 static const EncodingProc gProcs[] = {
1503 next_utf8, next_utf16, next_utf32 1476 next_utf8, next_utf16, next_utf32
1504 }; 1477 };
1505 SkASSERT((size_t)enc < SK_ARRAY_COUNT(gProcs)); 1478 SkASSERT((size_t)enc < SK_ARRAY_COUNT(gProcs));
1506 return gProcs[enc]; 1479 return gProcs[enc];
1507 } 1480 }
1508 1481
1509 int SkTypeface_FreeType::onCharsToGlyphs(const void* chars, Encoding encoding, 1482 int SkTypeface_FreeType::onCharsToGlyphs(const void* chars, Encoding encoding,
1510 uint16_t glyphs[], int glyphCount) const { 1483 uint16_t glyphs[], int glyphCount) cons t
1484 {
1511 AutoFTAccess fta(this); 1485 AutoFTAccess fta(this);
1512 FT_Face face = fta.face(); 1486 FT_Face face = fta.face();
1513 if (!face) { 1487 if (!face) {
1514 if (glyphs) { 1488 if (glyphs) {
1515 sk_bzero(glyphs, glyphCount * sizeof(glyphs[0])); 1489 sk_bzero(glyphs, glyphCount * sizeof(glyphs[0]));
1516 } 1490 }
1517 return 0; 1491 return 0;
1518 } 1492 }
1519 1493
1520 EncodingProc next_uni_proc = find_encoding_proc(encoding); 1494 EncodingProc next_uni_proc = find_encoding_proc(encoding);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1777 (*axes)[i].fTag = ftAxis.tag; 1751 (*axes)[i].fTag = ftAxis.tag;
1778 (*axes)[i].fMinimum = ftAxis.minimum; 1752 (*axes)[i].fMinimum = ftAxis.minimum;
1779 (*axes)[i].fDefault = ftAxis.def; 1753 (*axes)[i].fDefault = ftAxis.def;
1780 (*axes)[i].fMaximum = ftAxis.maximum; 1754 (*axes)[i].fMaximum = ftAxis.maximum;
1781 } 1755 }
1782 } 1756 }
1783 1757
1784 FT_Done_Face(face); 1758 FT_Done_Face(face);
1785 return true; 1759 return true;
1786 } 1760 }
OLDNEW
« 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