| Index: src/ports/SkFontConfigInterface_android.cpp
|
| diff --git a/src/ports/SkFontConfigInterface_android.cpp b/src/ports/SkFontConfigInterface_android.cpp
|
| index 3a4c02e539d2f0fbd4d8f90bde28c2daa7d5f952..7885faee9a51d35da0696209a3622d6ff3b5a514 100644
|
| --- a/src/ports/SkFontConfigInterface_android.cpp
|
| +++ b/src/ports/SkFontConfigInterface_android.cpp
|
| @@ -103,6 +103,9 @@ public:
|
| SkPaintOptionsAndroid::FontVariant fontVariant);
|
| SkTypeface* nextLogicalTypeface(SkFontID currFontID, SkFontID origFontID,
|
| const SkPaintOptionsAndroid& options);
|
| + SkTypeface* getTypefaceForGlyphID(uint16_t glyphID, const SkTypeface* origTypeface,
|
| + const SkPaintOptionsAndroid& options,
|
| + int* lowerBounds, int* upperBounds);
|
|
|
| private:
|
| void addFallbackFamily(FamilyRecID fontRecID);
|
| @@ -670,6 +673,64 @@ SkTypeface* SkFontConfigInterfaceAndroid::nextLogicalTypeface(SkFontID currFontI
|
| return SkSafeRef(nextLogicalTypeface);
|
| }
|
|
|
| +SkTypeface* SkFontConfigInterfaceAndroid::getTypefaceForGlyphID(uint16_t glyphID,
|
| + const SkTypeface* origTypeface,
|
| + const SkPaintOptionsAndroid& opts,
|
| + int* lBounds, int* uBounds) {
|
| + // Skia does not support font fallback by default. This enables clients such
|
| + // as WebKit to customize their font selection. In any case, clients can use
|
| + // GetFallbackFamilyNameForChar() to get the fallback font for individual
|
| + // characters.
|
| + if (!opts.isUsingFontFallbacks()) {
|
| + return NULL;
|
| + }
|
| +
|
| + SkTypeface* currentTypeface = NULL;
|
| + int lowerBounds = 0; //inclusive
|
| + int upperBounds = origTypeface->countGlyphs(); //exclusive
|
| +
|
| + // check to see if the glyph is in the bounds of the origTypeface
|
| + if (glyphID < upperBounds) {
|
| + currentTypeface = const_cast<SkTypeface*>(origTypeface);
|
| + } else {
|
| + FallbackFontList* currentFallbackList = findFallbackFontList(opts.getLanguage());
|
| + SkASSERT(currentFallbackList);
|
| +
|
| + // If an object is set to prefer "kDefault_Variant" it means they have no preference
|
| + // In this case, we set the value to "kCompact_Variant"
|
| + SkPaintOptionsAndroid::FontVariant variant = opts.getFontVariant();
|
| + if (variant == SkPaintOptionsAndroid::kDefault_Variant) {
|
| + variant = SkPaintOptionsAndroid::kCompact_Variant;
|
| + }
|
| +
|
| + int32_t acceptedVariants = SkPaintOptionsAndroid::kDefault_Variant | variant;
|
| + SkTypeface::Style origStyle = origTypeface->style();
|
| +
|
| + for (int x = 0; x < currentFallbackList->count(); ++x) {
|
| + FamilyRecID familyRecID = currentFallbackList->getAt(x);
|
| + if ((fFontFamilies[familyRecID].fPaintOptions.getFontVariant() & acceptedVariants) != 0) {
|
| + FontRecID matchedFont = find_best_style(fFontFamilies[familyRecID], origStyle);
|
| + currentTypeface = this->getTypefaceForFontRec(matchedFont);
|
| + lowerBounds = upperBounds;
|
| + upperBounds += currentTypeface->countGlyphs();
|
| + if (glyphID < upperBounds) {
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (currentTypeface) {
|
| + if (lBounds) {
|
| + *lBounds = lowerBounds;
|
| + }
|
| + if (uBounds) {
|
| + *uBounds = upperBounds;
|
| + }
|
| + }
|
| + return SkSafeRef(currentTypeface);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| bool SkGetFallbackFamilyNameForChar(SkUnichar uni, SkString* name) {
|
| @@ -702,6 +763,14 @@ SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, SkFontID origFontI
|
|
|
| }
|
|
|
| +SkTypeface* SkGetTypefaceForGlyphID(uint16_t glyphID, const SkTypeface* origTypeface,
|
| + const SkPaintOptionsAndroid& options,
|
| + int* lowerBounds, int* upperBounds) {
|
| + SkFontConfigInterfaceAndroid* fontConfig = getSingletonInterface();
|
| + return fontConfig->getTypefaceForGlyphID(glyphID, origTypeface, options,
|
| + lowerBounds, upperBounds);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
|
|
|