@@ -178,6 +178,8 @@ class SkFontStyleSet_Android : public SkFontStyleSet {
178178 if (family.fNames .count () > 0 ) {
179179 cannonicalFamilyName = &family.fNames [0 ];
180180 }
181+ fFallbackFor = family.fFallbackFor ;
182+
181183 // TODO? make this lazy
182184 for (int i = 0 ; i < family.fFonts .count (); ++i) {
183185 const FontFileInfo& fontFile = family.fFonts [i];
@@ -268,6 +270,7 @@ class SkFontStyleSet_Android : public SkFontStyleSet {
268270
269271private:
270272 SkTArray<sk_sp<SkTypeface_AndroidSystem>> fStyles ;
273+ SkString fFallbackFor ;
271274
272275 friend struct NameToFamily ;
273276 friend class SkFontMgr_Android ;
@@ -370,12 +373,16 @@ class SkFontMgr_Android : public SkFontMgr {
370373 }
371374
372375 static sk_sp<SkTypeface_AndroidSystem> find_family_style_character (
376+ const SkString& familyName,
373377 const SkTArray<NameToFamily, true >& fallbackNameToFamilyMap,
374378 const SkFontStyle& style, bool elegant,
375379 const SkString& langTag, SkUnichar character)
376380 {
377381 for (int i = 0 ; i < fallbackNameToFamilyMap.count (); ++i) {
378382 SkFontStyleSet_Android* family = fallbackNameToFamilyMap[i].styleSet ;
383+ if (familyName != family->fFallbackFor ) {
384+ continue ;
385+ }
379386 sk_sp<SkTypeface_AndroidSystem> face (family->matchStyle (style));
380387
381388 if (!langTag.isEmpty () &&
@@ -414,28 +421,31 @@ class SkFontMgr_Android : public SkFontMgr {
414421 // As a result, it is not possible to know the variant context from the font alone.
415422 // TODO: add 'is_elegant' and 'is_compact' bits to 'style' request.
416423
417- // The first time match anything elegant, second time anything not elegant.
418- for (int elegant = 2 ; elegant --> 0 ;) {
419- for (int bcp47Index = bcp47Count; bcp47Index --> 0 ;) {
420- SkLanguage lang (bcp47[bcp47Index]);
421- while (!lang.getTag ().isEmpty ()) {
422- sk_sp<SkTypeface_AndroidSystem> matchingTypeface =
423- find_family_style_character (fFallbackNameToFamilyMap ,
424- style, SkToBool (elegant),
425- lang.getTag (), character);
426- if (matchingTypeface) {
427- return matchingTypeface.release ();
424+ SkString familyNameString (familyName);
425+ for (const SkString& currentFamilyName : { familyNameString, SkString () }) {
426+ // The first time match anything elegant, second time anything not elegant.
427+ for (int elegant = 2 ; elegant --> 0 ;) {
428+ for (int bcp47Index = bcp47Count; bcp47Index --> 0 ;) {
429+ SkLanguage lang (bcp47[bcp47Index]);
430+ while (!lang.getTag ().isEmpty ()) {
431+ sk_sp<SkTypeface_AndroidSystem> matchingTypeface =
432+ find_family_style_character (currentFamilyName, fFallbackNameToFamilyMap ,
433+ style, SkToBool (elegant),
434+ lang.getTag (), character);
435+ if (matchingTypeface) {
436+ return matchingTypeface.release ();
437+ }
438+
439+ lang = lang.getParent ();
428440 }
429-
430- lang = lang.getParent ();
431441 }
432- }
433- sk_sp<SkTypeface_AndroidSystem> matchingTypeface =
434- find_family_style_character ( fFallbackNameToFamilyMap ,
435- style, SkToBool (elegant),
436- SkString (), character);
437- if ( matchingTypeface) {
438- return matchingTypeface. release ();
442+ sk_sp<SkTypeface_AndroidSystem> matchingTypeface =
443+ find_family_style_character (currentFamilyName, fFallbackNameToFamilyMap ,
444+ style, SkToBool (elegant) ,
445+ SkString (), character);
446+ if (matchingTypeface) {
447+ return matchingTypeface. release ();
448+ }
439449 }
440450 }
441451 return nullptr ;
@@ -521,30 +531,37 @@ class SkFontMgr_Android : public SkFontMgr {
521531 SkTArray<NameToFamily, true > fNameToFamilyMap ;
522532 SkTArray<NameToFamily, true > fFallbackNameToFamilyMap ;
523533
524- void buildNameToFamilyMap (SkTDArray<FontFamily*> families, const bool isolated) {
525- for (int i = 0 ; i < families.count (); i++) {
526- FontFamily& family = *families[i];
527-
528- SkTArray<NameToFamily, true >* nameToFamily = &fNameToFamilyMap ;
529- if (family.fIsFallbackFont ) {
530- nameToFamily = &fFallbackNameToFamilyMap ;
534+ void addFamily (FontFamily& family, const bool isolated, int familyIndex) {
535+ SkTArray<NameToFamily, true >* nameToFamily = &fNameToFamilyMap ;
536+ if (family.fIsFallbackFont ) {
537+ nameToFamily = &fFallbackNameToFamilyMap ;
531538
532- if (0 == family.fNames .count ()) {
533- SkString& fallbackName = family.fNames .push_back ();
534- fallbackName.printf (" %.2x##fallback" , i);
535- }
539+ if (0 == family.fNames .count ()) {
540+ SkString& fallbackName = family.fNames .push_back ();
541+ fallbackName.printf (" %.2x##fallback" , familyIndex);
536542 }
543+ }
537544
538- sk_sp<SkFontStyleSet_Android> newSet =
539- sk_make_sp<SkFontStyleSet_Android>(family, fScanner , isolated);
540- if (0 == newSet->count ()) {
541- continue ;
542- }
545+ sk_sp<SkFontStyleSet_Android> newSet =
546+ sk_make_sp<SkFontStyleSet_Android>(family, fScanner , isolated);
547+ if (0 == newSet->count ()) {
548+ return ;
549+ }
543550
544- for (const SkString& name : family.fNames ) {
545- nameToFamily->emplace_back (NameToFamily{name, newSet.get ()});
546- }
547- fStyleSets .emplace_back (std::move (newSet));
551+ for (const SkString& name : family.fNames ) {
552+ nameToFamily->emplace_back (NameToFamily{name, newSet.get ()});
553+ }
554+ fStyleSets .emplace_back (std::move (newSet));
555+ }
556+ void buildNameToFamilyMap (SkTDArray<FontFamily*> families, const bool isolated) {
557+ int familyIndex = 0 ;
558+ for (FontFamily* family : families) {
559+ addFamily (*family, isolated, familyIndex++);
560+ family->fallbackFamilies .foreach ([this , isolated, &familyIndex]
561+ (SkString, std::unique_ptr<FontFamily>* fallbackFamily) {
562+ addFamily (*(*fallbackFamily).get (), isolated, familyIndex++);
563+ }
564+ );
548565 }
549566 }
550567
0 commit comments