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

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

Issue 1702073002: Move SkTArray to include/private. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix kilobench. Created 4 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/SkFontConfigInterface_direct.h ('k') | tools/ThermalManager.h » ('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 2009-2015 Google Inc. 2 * Copyright 2009-2015 Google Inc.
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 /* migrated from chrome/src/skia/ext/SkFontHost_fontconfig_direct.cpp */ 8 /* migrated from chrome/src/skia/ext/SkFontHost_fontconfig_direct.cpp */
9 9
10 #include "SkBuffer.h" 10 #include "SkBuffer.h"
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 const char* famName = get_name(match, FC_FAMILY); 575 const char* famName = get_name(match, FC_FAMILY);
576 if (famName && !find_name(names, famName)) { 576 if (famName && !find_name(names, famName)) {
577 *names.append() = famName; 577 *names.append() = famName;
578 *sizes.append() = strlen(famName) + 1; 578 *sizes.append() = strlen(famName) + 1;
579 } 579 }
580 } 580 }
581 581
582 return SkDataTable::NewCopyArrays((const void*const*)names.begin(), 582 return SkDataTable::NewCopyArrays((const void*const*)names.begin(),
583 sizes.begin(), names.count()); 583 sizes.begin(), names.count());
584 } 584 }
585
586 bool SkFontConfigInterfaceDirect::matchFamilySet(const char inFamilyName[],
587 SkString* outFamilyName,
588 SkTArray<FontIdentity>* ids) {
589 SkAutoMutexAcquire ac(mutex_);
590
591 #if 0
592 SkString familyStr(familyName ? familyName : "");
593 if (familyStr.size() > kMaxFontFamilyLength) {
594 return false;
595 }
596
597 SkAutoMutexAcquire ac(mutex_);
598
599 FcPattern* pattern = FcPatternCreate();
600
601 if (familyName) {
602 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName);
603 }
604 FcPatternAddBool(pattern, FC_SCALABLE, FcTrue);
605
606 FcConfigSubstitute(nullptr, pattern, FcMatchPattern);
607 FcDefaultSubstitute(pattern);
608
609 // Font matching:
610 // CSS often specifies a fallback list of families:
611 // font-family: a, b, c, serif;
612 // However, fontconfig will always do its best to find *a* font when asked
613 // for something so we need a way to tell if the match which it has found is
614 // "good enough" for us. Otherwise, we can return nullptr which gets piped u p
615 // and lets WebKit know to try the next CSS family name. However, fontconfig
616 // configs allow substitutions (mapping "Arial -> Helvetica" etc) and we
617 // wish to support that.
618 //
619 // Thus, if a specific family is requested we set @family_requested. Then we
620 // record two strings: the family name after config processing and the
621 // family name after resolving. If the two are equal, it's a good match.
622 //
623 // So consider the case where a user has mapped Arial to Helvetica in their
624 // config.
625 // requested family: "Arial"
626 // post_config_family: "Helvetica"
627 // post_match_family: "Helvetica"
628 // -> good match
629 //
630 // and for a missing font:
631 // requested family: "Monaco"
632 // post_config_family: "Monaco"
633 // post_match_family: "Times New Roman"
634 // -> BAD match
635 //
636 // However, we special-case fallback fonts; see IsFallbackFontAllowed().
637
638 const char* post_config_family = get_name(pattern, FC_FAMILY);
639
640 FcResult result;
641 FcFontSet* font_set = FcFontSort(0, pattern, 0, 0, &result);
642 if (!font_set) {
643 FcPatternDestroy(pattern);
644 return false;
645 }
646
647 FcPattern* match = this->MatchFont(font_set, post_config_family, familyStr);
648 if (!match) {
649 FcPatternDestroy(pattern);
650 FcFontSetDestroy(font_set);
651 return false;
652 }
653
654 FcPatternDestroy(pattern);
655
656 // From here out we just extract our results from 'match'
657
658 if (FcPatternGetString(match, FC_FAMILY, 0, &post_config_family) != FcResult Match) {
659 FcFontSetDestroy(font_set);
660 return false;
661 }
662
663 FcChar8* c_filename;
664 if (FcPatternGetString(match, FC_FILE, 0, &c_filename) != FcResultMatch) {
665 FcFontSetDestroy(font_set);
666 return false;
667 }
668
669 int face_index;
670 if (FcPatternGetInteger(match, FC_INDEX, 0, &face_index) != FcResultMatch) {
671 FcFontSetDestroy(font_set);
672 return false;
673 }
674
675 FcFontSetDestroy(font_set);
676
677 if (outIdentity) {
678 outIdentity->fTTCIndex = face_index;
679 outIdentity->fString.set((const char*)c_filename);
680 }
681 if (outFamilyName) {
682 outFamilyName->set((const char*)post_config_family);
683 }
684 if (outStyle) {
685 *outStyle = GetFontStyle(match);
686 }
687 return true;
688
689 ////////////////////
690
691 int count;
692 FcPattern** match = this->MatchFont(font_set, post_config_family, &count );
693 if (!match) {
694 FcPatternDestroy(pattern);
695 FcFontSetDestroy(font_set);
696 return nullptr;
697 }
698
699 FcPatternDestroy(pattern);
700
701 SkTDArray<FcPattern*> trimmedMatches;
702 for (int i = 0; i < count; ++i) {
703 const char* justName = find_just_name(get_name(match[i], FC_FILE));
704 if (!is_lower(*justName)) {
705 *trimmedMatches.append() = match[i];
706 }
707 }
708
709 SkFontStyleSet_FC* sset = new SkFontStyleSet_FC (trimmedMatches.begin(), trimmedMatches.count());
710 #endif
711 return false;
712 }
OLDNEW
« no previous file with comments | « src/ports/SkFontConfigInterface_direct.h ('k') | tools/ThermalManager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698