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

Side by Side Diff: src/ports/SkFontConfigParser_android.cpp

Issue 912053003: Fix append_fallback_font_families_for_locale. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Full test and address comments. Created 5 years, 10 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 | « src/ports/SkFontConfigParser_android.h ('k') | tests/FontConfigParser.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 2011 The Android Open Source Project 2 * Copyright 2011 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 "SkFontConfigParser_android.h" 8 #include "SkFontConfigParser_android.h"
9 #include "SkFontMgr_android.h" 9 #include "SkFontMgr_android.h"
10 #include "SkStream.h" 10 #include "SkStream.h"
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 */ 495 */
496 static void append_fallback_font_families_for_locale(SkTDArray<FontFamily*>& fal lbackFonts, 496 static void append_fallback_font_families_for_locale(SkTDArray<FontFamily*>& fal lbackFonts,
497 const char* dir, 497 const char* dir,
498 const SkString& basePath) 498 const SkString& basePath)
499 { 499 {
500 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) 500 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
501 // The framework is beyond Android 4.2 and can therefore skip this function 501 // The framework is beyond Android 4.2 and can therefore skip this function
502 return; 502 return;
503 #endif 503 #endif
504 504
505 DIR* fontDirectory = opendir(dir); 505 SkAutoTCallIProc<DIR, closedir> fontDirectory(opendir(dir));
506 if (fontDirectory != NULL){ 506 if (NULL == fontDirectory) {
507 struct dirent* dirEntry = readdir(fontDirectory); 507 return;
508 while (dirEntry) { 508 }
509 509
510 // The size of both the prefix, suffix, and a minimum valid language code 510 for (struct dirent* dirEntry; (dirEntry = readdir(fontDirectory));) {
511 static const size_t minSize = strlen(LOCALE_FALLBACK_FONTS_PREFIX) + 511 // The size of both the prefix, suffix, and a minimum valid language cod e
512 strlen(LOCALE_FALLBACK_FONTS_SUFFIX) + 2; 512 static const size_t minSize = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1
513 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1
514 + 2;
513 515
514 SkString fileName(dirEntry->d_name); 516 SkString fileName(dirEntry->d_name);
515 if (fileName.size() >= minSize && 517 if (fileName.size() < minSize ||
516 fileName.startsWith(LOCALE_FALLBACK_FONTS_PREFIX) && 518 !fileName.startsWith(LOCALE_FALLBACK_FONTS_PREFIX) ||
517 fileName.endsWith(LOCALE_FALLBACK_FONTS_SUFFIX)) { 519 !fileName.endsWith(LOCALE_FALLBACK_FONTS_SUFFIX))
520 {
521 continue;
522 }
518 523
519 static const size_t fixedLen = strlen(LOCALE_FALLBACK_FONTS_PREF IX) - 524 static const size_t fixedLen = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1
520 strlen(LOCALE_FALLBACK_FONTS_SUFF IX); 525 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1;
521 526
522 SkString locale(fileName.c_str() - strlen(LOCALE_FALLBACK_FONTS_ PREFIX), 527 SkString locale(fileName.c_str() + sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1,
523 fileName.size() - fixedLen); 528 fileName.size() - fixedLen);
524 529
525 SkString absoluteFilename; 530 SkString absoluteFilename;
526 absoluteFilename.printf("%s/%s", dir, fileName.c_str()); 531 absoluteFilename.printf("%s/%s", dir, fileName.c_str());
527 532
528 SkTDArray<FontFamily*> langSpecificFonts; 533 SkTDArray<FontFamily*> langSpecificFonts;
529 parse_config_file(absoluteFilename.c_str(), langSpecificFonts, b asePath, true); 534 parse_config_file(absoluteFilename.c_str(), langSpecificFonts, basePath, true);
530 535
531 for (int i = 0; i < langSpecificFonts.count(); ++i) { 536 for (int i = 0; i < langSpecificFonts.count(); ++i) {
532 FontFamily* family = langSpecificFonts[i]; 537 FontFamily* family = langSpecificFonts[i];
533 family->fLanguage = SkLanguage(locale); 538 family->fLanguage = SkLanguage(locale);
534 *fallbackFonts.append() = family; 539 *fallbackFonts.append() = family;
535 }
536 }
537
538 // proceed to the next entry in the directory
539 dirEntry = readdir(fontDirectory);
540 } 540 }
541 // cleanup the directory reference
542 closedir(fontDirectory);
543 } 541 }
544 } 542 }
545 543
546 static void append_system_fallback_font_families(SkTDArray<FontFamily*>& fallbac kFonts, 544 static void append_system_fallback_font_families(SkTDArray<FontFamily*>& fallbac kFonts,
547 const SkString& basePath) 545 const SkString& basePath)
548 { 546 {
549 parse_config_file(FALLBACK_FONTS_FILE, fallbackFonts, basePath, true); 547 parse_config_file(FALLBACK_FONTS_FILE, fallbackFonts, basePath, true);
550 append_fallback_font_families_for_locale(fallbackFonts, 548 append_fallback_font_families_for_locale(fallbackFonts,
551 LOCALE_FALLBACK_FONTS_SYSTEM_DIR, 549 LOCALE_FALLBACK_FONTS_SYSTEM_DIR,
552 basePath); 550 basePath);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 // Append all the fallback fonts to system fonts 595 // Append all the fallback fonts to system fonts
598 SkTDArray<FontFamily*> fallbackFonts; 596 SkTDArray<FontFamily*> fallbackFonts;
599 append_system_fallback_font_families(fallbackFonts, basePath); 597 append_system_fallback_font_families(fallbackFonts, basePath);
600 mixin_vendor_fallback_font_families(fallbackFonts, basePath); 598 mixin_vendor_fallback_font_families(fallbackFonts, basePath);
601 fontFamilies.append(fallbackFonts.count(), fallbackFonts.begin()); 599 fontFamilies.append(fallbackFonts.count(), fallbackFonts.begin());
602 } 600 }
603 601
604 void SkFontConfigParser::GetCustomFontFamilies(SkTDArray<FontFamily*>& fontFamil ies, 602 void SkFontConfigParser::GetCustomFontFamilies(SkTDArray<FontFamily*>& fontFamil ies,
605 const SkString& basePath, 603 const SkString& basePath,
606 const char* fontsXml, 604 const char* fontsXml,
607 const char* fallbackFontsXml) 605 const char* fallbackFontsXml,
606 const char* langFallbackFontsDir)
608 { 607 {
609 if (fontsXml) { 608 if (fontsXml) {
610 parse_config_file(fontsXml, fontFamilies, basePath, false); 609 parse_config_file(fontsXml, fontFamilies, basePath, false);
611 } 610 }
612 if (fallbackFontsXml) { 611 if (fallbackFontsXml) {
613 parse_config_file(fallbackFontsXml, fontFamilies, basePath, true); 612 parse_config_file(fallbackFontsXml, fontFamilies, basePath, true);
614 } 613 }
614 if (langFallbackFontsDir) {
615 append_fallback_font_families_for_locale(fontFamilies,
616 langFallbackFontsDir,
617 basePath);
618 }
615 } 619 }
616 620
617 SkLanguage SkLanguage::getParent() const { 621 SkLanguage SkLanguage::getParent() const {
618 SkASSERT(!fTag.isEmpty()); 622 SkASSERT(!fTag.isEmpty());
619 const char* tag = fTag.c_str(); 623 const char* tag = fTag.c_str();
620 624
621 // strip off the rightmost "-.*" 625 // strip off the rightmost "-.*"
622 const char* parentTagEnd = strrchr(tag, '-'); 626 const char* parentTagEnd = strrchr(tag, '-');
623 if (parentTagEnd == NULL) { 627 if (parentTagEnd == NULL) {
624 return SkLanguage(); 628 return SkLanguage();
625 } 629 }
626 size_t parentTagLen = parentTagEnd - tag; 630 size_t parentTagLen = parentTagEnd - tag;
627 return SkLanguage(tag, parentTagLen); 631 return SkLanguage(tag, parentTagLen);
628 } 632 }
OLDNEW
« no previous file with comments | « src/ports/SkFontConfigParser_android.h ('k') | tests/FontConfigParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698