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

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

Issue 24364008: Update PDF backend to support fallback fonts on Android. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 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 | Annotate | Revision Log
« src/pdf/SkPDFDevice.cpp ('K') | « src/pdf/SkPDFDevice.cpp ('k') | no next file » | 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 /* 2 /*
3 * Copyright 2013 The Android Open Source Project 3 * Copyright 2013 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkFontConfigInterface.h" 9 #include "SkFontConfigInterface.h"
10 #include "SkTypeface_android.h" 10 #include "SkTypeface_android.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 * contains the specified chararacter. if no font is found, returns false. 96 * contains the specified chararacter. if no font is found, returns false.
97 */ 97 */
98 bool getFallbackFamilyNameForChar(SkUnichar uni, const char* lang, SkString* name); 98 bool getFallbackFamilyNameForChar(SkUnichar uni, const char* lang, SkString* name);
99 /** 99 /**
100 * 100 *
101 */ 101 */
102 SkTypeface* getTypefaceForChar(SkUnichar uni, SkTypeface::Style style, 102 SkTypeface* getTypefaceForChar(SkUnichar uni, SkTypeface::Style style,
103 SkPaintOptionsAndroid::FontVariant fontVarian t); 103 SkPaintOptionsAndroid::FontVariant fontVarian t);
104 SkTypeface* nextLogicalTypeface(SkFontID currFontID, SkFontID origFontID, 104 SkTypeface* nextLogicalTypeface(SkFontID currFontID, SkFontID origFontID,
105 const SkPaintOptionsAndroid& options); 105 const SkPaintOptionsAndroid& options);
106 SkTypeface* getTypefaceForGlyphID(uint16_t glyphID, const SkTypeface* origTy peface,
107 const SkPaintOptionsAndroid& options,
108 int* lowerBounds, int* upperBounds);
106 109
107 private: 110 private:
108 void addFallbackFamily(FamilyRecID fontRecID); 111 void addFallbackFamily(FamilyRecID fontRecID);
109 SkTypeface* getTypefaceForFontRec(FontRecID fontRecID); 112 SkTypeface* getTypefaceForFontRec(FontRecID fontRecID);
110 FallbackFontList* getCurrentLocaleFallbackFontList(); 113 FallbackFontList* getCurrentLocaleFallbackFontList();
111 FallbackFontList* findFallbackFontList(const SkLanguage& lang, bool isOrigin al = true); 114 FallbackFontList* findFallbackFontList(const SkLanguage& lang, bool isOrigin al = true);
112 115
113 SkTArray<FontRec> fFonts; 116 SkTArray<FontRec> fFonts;
114 SkTArray<FamilyRec> fFontFamilies; 117 SkTArray<FamilyRec> fFontFamilies;
115 SkTDict<FamilyRecID> fFamilyNameDict; 118 SkTDict<FamilyRecID> fFamilyNameDict;
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 } 666 }
664 667
665 DEBUG_FONT(("---- nextLogicalFont: currFontID=%d, origFontID=%d, currRecID=% d, " 668 DEBUG_FONT(("---- nextLogicalFont: currFontID=%d, origFontID=%d, currRecID=% d, "
666 "lang=%s, variant=%d, nextFallbackIndex[%d,%d] => nextLogicalTyp eface=%d", 669 "lang=%s, variant=%d, nextFallbackIndex[%d,%d] => nextLogicalTyp eface=%d",
667 currFontID, origFontID, currFontRecID, opts.getLanguage().getTag ().c_str(), 670 currFontID, origFontID, currFontRecID, opts.getLanguage().getTag ().c_str(),
668 variant, nextFallbackFontIndex, currentFallbackList->getAt(nextF allbackFontIndex), 671 variant, nextFallbackFontIndex, currentFallbackList->getAt(nextF allbackFontIndex),
669 (nextLogicalTypeface) ? nextLogicalTypeface->uniqueID() : 0)); 672 (nextLogicalTypeface) ? nextLogicalTypeface->uniqueID() : 0));
670 return SkSafeRef(nextLogicalTypeface); 673 return SkSafeRef(nextLogicalTypeface);
671 } 674 }
672 675
676 SkTypeface* SkFontConfigInterfaceAndroid::getTypefaceForGlyphID(uint16_t glyphID ,
677 const SkTypeface * origTypeface,
678 const SkPaintOpt ionsAndroid& opts,
679 int* lBounds, in t* uBounds) {
680 // Skia does not support font fallback by default. This enables clients such
681 // as WebKit to customize their font selection. In any case, clients can use
682 // GetFallbackFamilyNameForChar() to get the fallback font for individual
683 // characters.
684 if (!opts.isUsingFontFallbacks()) {
685 return NULL;
686 }
687
688 SkTypeface* currentTypeface = NULL;
689 int lowerBounds = 0; //inclusive
690 int upperBounds = origTypeface->countGlyphs(); //exclusive
691
692 // check to see if the glyph is in the bounds of the origTypeface
693 if (glyphID < upperBounds) {
694 currentTypeface = const_cast<SkTypeface*>(origTypeface);
scroggo 2013/10/01 21:00:14 It appears you do not modify currentTypeface. It s
djsollen 2013/10/02 16:16:41 But I do return that value and I can't return a co
695 } else {
696 FallbackFontList* currentFallbackList = findFallbackFontList(opts.getLan guage());
697 SkASSERT(currentFallbackList);
698
699 // If an object is set to prefer "kDefault_Variant" it means they have n o preference
700 // In this case, we set the value to "kCompact_Variant"
701 SkPaintOptionsAndroid::FontVariant variant = opts.getFontVariant();
702 if (variant == SkPaintOptionsAndroid::kDefault_Variant) {
703 variant = SkPaintOptionsAndroid::kCompact_Variant;
704 }
705
706 int32_t acceptedVariants = SkPaintOptionsAndroid::kDefault_Variant | var iant;
707 SkTypeface::Style origStyle = origTypeface->style();
708
709 for (int x = 0; x < currentFallbackList->count(); ++x) {
710 FamilyRecID familyRecID = currentFallbackList->getAt(x);
711 if ((fFontFamilies[familyRecID].fPaintOptions.getFontVariant() & acc eptedVariants) != 0) {
scroggo 2013/10/01 21:00:14 100 chars
712 FontRecID matchedFont = find_best_style(fFontFamilies[familyRecI D], origStyle);
713 currentTypeface = this->getTypefaceForFontRec(matchedFont);
714 lowerBounds = upperBounds;
715 upperBounds += currentTypeface->countGlyphs();
716 if (glyphID < upperBounds) {
717 break;
718 }
719 }
720 }
721 }
722
723 if (currentTypeface) {
scroggo 2013/10/01 21:00:14 nit: explicit NULL check.
724 if (lBounds) {
725 *lBounds = lowerBounds;
726 }
727 if (uBounds) {
728 *uBounds = upperBounds;
729 }
730 }
731 return SkSafeRef(currentTypeface);
scroggo 2013/10/01 21:00:14 Why not return SkRef(currentTypeface) inside the i
732 }
733
673 /////////////////////////////////////////////////////////////////////////////// 734 ///////////////////////////////////////////////////////////////////////////////
674 735
675 bool SkGetFallbackFamilyNameForChar(SkUnichar uni, SkString* name) { 736 bool SkGetFallbackFamilyNameForChar(SkUnichar uni, SkString* name) {
676 SkString locale = SkFontConfigParser::GetLocale(); 737 SkString locale = SkFontConfigParser::GetLocale();
677 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface(); 738 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface();
678 return fontConfig->getFallbackFamilyNameForChar(uni, locale.c_str(), name); 739 return fontConfig->getFallbackFamilyNameForChar(uni, locale.c_str(), name);
679 } 740 }
680 741
681 bool SkGetFallbackFamilyNameForChar(SkUnichar uni, const char* lang, SkString* n ame) { 742 bool SkGetFallbackFamilyNameForChar(SkUnichar uni, const char* lang, SkString* n ame) {
682 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface(); 743 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface();
(...skipping 12 matching lines...) Expand all
695 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix) ); 756 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix) );
696 } 757 }
697 758
698 SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, SkFontID origFontI D, 759 SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, SkFontID origFontI D,
699 const SkPaintOptionsAndroid& options) { 760 const SkPaintOptionsAndroid& options) {
700 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface(); 761 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface();
701 return fontConfig->nextLogicalTypeface(currFontID, origFontID, options); 762 return fontConfig->nextLogicalTypeface(currFontID, origFontID, options);
702 763
703 } 764 }
704 765
766 SkTypeface* SkGetTypefaceForGlyphID(uint16_t glyphID, const SkTypeface* origType face,
767 const SkPaintOptionsAndroid& options,
768 int* lowerBounds, int* upperBounds) {
769 SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface();
770 return fontConfig->getTypefaceForGlyphID(glyphID, origTypeface, options,
771 lowerBounds, upperBounds);
772 }
773
705 /////////////////////////////////////////////////////////////////////////////// 774 ///////////////////////////////////////////////////////////////////////////////
706 775
707 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 776 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
708 777
709 struct HB_UnicodeMapping { 778 struct HB_UnicodeMapping {
710 // TODO: when the WebView no longer needs harfbuzz_old, remove 779 // TODO: when the WebView no longer needs harfbuzz_old, remove
711 HB_Script script_old; 780 HB_Script script_old;
712 hb_script_t script; 781 hb_script_t script;
713 const SkUnichar unicode; 782 const SkUnichar unicode;
714 }; 783 };
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 return SkCreateTypefaceForScriptNG(getHBScriptFromHBScriptOld(script), style , fontVariant); 920 return SkCreateTypefaceForScriptNG(getHBScriptFromHBScriptOld(script), style , fontVariant);
852 } 921 }
853 922
854 #endif 923 #endif
855 924
856 /////////////////////////////////////////////////////////////////////////////// 925 ///////////////////////////////////////////////////////////////////////////////
857 926
858 SkFontMgr* SkFontMgr::Factory() { 927 SkFontMgr* SkFontMgr::Factory() {
859 return NULL; 928 return NULL;
860 } 929 }
OLDNEW
« src/pdf/SkPDFDevice.cpp ('K') | « src/pdf/SkPDFDevice.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698