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