xref: /aosp_15_r20/external/skia/modules/skparagraph/utils/TestFontCollection.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/utils/TestFontCollection.h"
3*c8dee2aaSAndroid Build Coastguard Worker 
4*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
5*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/ParagraphImpl.h"
6*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkUTF.h"
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkOSFile.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_TYPEFACE_FACTORY_FREETYPE)
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/ports/SkTypeface_FreeType.h"
12*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_TYPEFACE_FACTORY_CORETEXT)
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/ports/SkTypeface_mac_ct.h"
14*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_TYPEFACE_FACTORY_DIRECTWRITE)
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/ports/SkTypeface_win_dw.h"
16*c8dee2aaSAndroid Build Coastguard Worker #endif
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
19*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker namespace skia {
22*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout {
23*c8dee2aaSAndroid Build Coastguard Worker 
TestFontCollection(const std::string & resourceDir,bool testOnly,bool loadFonts)24*c8dee2aaSAndroid Build Coastguard Worker TestFontCollection::TestFontCollection(const std::string& resourceDir, bool testOnly, bool loadFonts)
25*c8dee2aaSAndroid Build Coastguard Worker   : fResourceDir(resourceDir)
26*c8dee2aaSAndroid Build Coastguard Worker   , fFontsFound(0) {
27*c8dee2aaSAndroid Build Coastguard Worker     if (fDirs == resourceDir) {
28*c8dee2aaSAndroid Build Coastguard Worker       return;
29*c8dee2aaSAndroid Build Coastguard Worker     }
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker     fFontProvider = sk_make_sp<TypefaceFontProvider>();
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker     if (loadFonts) {
34*c8dee2aaSAndroid Build Coastguard Worker         SkOSFile::Iter iter(fResourceDir.c_str());
35*c8dee2aaSAndroid Build Coastguard Worker         SkString path;
36*c8dee2aaSAndroid Build Coastguard Worker         while (iter.next(&path)) {
37*c8dee2aaSAndroid Build Coastguard Worker             addFontFromFile(path.c_str());
38*c8dee2aaSAndroid Build Coastguard Worker         }
39*c8dee2aaSAndroid Build Coastguard Worker     }
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     fFontsFound = fFontProvider->countFamilies();
42*c8dee2aaSAndroid Build Coastguard Worker     if (testOnly) {
43*c8dee2aaSAndroid Build Coastguard Worker         this->setTestFontManager(fFontProvider);
44*c8dee2aaSAndroid Build Coastguard Worker     } else {
45*c8dee2aaSAndroid Build Coastguard Worker         this->setAssetFontManager(fFontProvider);
46*c8dee2aaSAndroid Build Coastguard Worker     }
47*c8dee2aaSAndroid Build Coastguard Worker     this->disableFontFallback();
48*c8dee2aaSAndroid Build Coastguard Worker     fDirs = resourceDir;
49*c8dee2aaSAndroid Build Coastguard Worker }
50*c8dee2aaSAndroid Build Coastguard Worker 
addFontFromFile(const std::string & path,const std::string & familyName)51*c8dee2aaSAndroid Build Coastguard Worker bool TestFontCollection::addFontFromFile(const std::string& path, const std::string& familyName) {
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     SkString file_path;
54*c8dee2aaSAndroid Build Coastguard Worker     file_path.printf("%s/%s", fResourceDir.c_str(), path.c_str());
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkStreamAsset> file = SkFILEStream::Make(file_path.c_str());
57*c8dee2aaSAndroid Build Coastguard Worker     if (!file) {
58*c8dee2aaSAndroid Build Coastguard Worker         return false;
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_TYPEFACE_FACTORY_FREETYPE)
61*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> face =
62*c8dee2aaSAndroid Build Coastguard Worker             SkTypeface_FreeType::MakeFromStream(std::move(file), SkFontArguments());
63*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_TYPEFACE_FACTORY_CORETEXT)
64*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> face = SkTypeface_Mac::MakeFromStream(std::move(file), SkFontArguments());
65*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_TYPEFACE_FACTORY_DIRECTWRITE)
66*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> face = DWriteFontTypeface::MakeFromStream(std::move(file), SkFontArguments());
67*c8dee2aaSAndroid Build Coastguard Worker #else
68*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> face = nullptr;
69*c8dee2aaSAndroid Build Coastguard Worker #endif
70*c8dee2aaSAndroid Build Coastguard Worker     if (familyName.empty()) {
71*c8dee2aaSAndroid Build Coastguard Worker         fFontProvider->registerTypeface(std::move(face));
72*c8dee2aaSAndroid Build Coastguard Worker     } else {
73*c8dee2aaSAndroid Build Coastguard Worker         fFontProvider->registerTypeface(std::move(face), SkString(familyName.c_str()));
74*c8dee2aaSAndroid Build Coastguard Worker     }
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     return true;
77*c8dee2aaSAndroid Build Coastguard Worker }
78*c8dee2aaSAndroid Build Coastguard Worker }  // namespace textlayout
79*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skia
80