1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2024 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkShaperFactoryHelpers_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define SkShaperFactoryHelpers_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper_factory.h"
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper_harfbuzz.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper_skunicode.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skunicode/include/SkUnicode.h"
17*c8dee2aaSAndroid Build Coastguard Worker #endif
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_CORETEXT_AVAILABLE)
20*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper_coretext.h"
21*c8dee2aaSAndroid Build Coastguard Worker #endif
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_ICU_IMPLEMENTATION)
24*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skunicode/include/SkUnicode_icu.h"
25*c8dee2aaSAndroid Build Coastguard Worker #endif
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION)
28*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skunicode/include/SkUnicode_libgrapheme.h"
29*c8dee2aaSAndroid Build Coastguard Worker #endif
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION)
32*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skunicode/include/SkUnicode_icu4x.h"
33*c8dee2aaSAndroid Build Coastguard Worker #endif
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker namespace SkShapers {
36*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
37*c8dee2aaSAndroid Build Coastguard Worker class HarfbuzzFactory final : public Factory {
38*c8dee2aaSAndroid Build Coastguard Worker public:
HarfbuzzFactory()39*c8dee2aaSAndroid Build Coastguard Worker HarfbuzzFactory() {
40*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_ICU_IMPLEMENTATION)
41*c8dee2aaSAndroid Build Coastguard Worker fUnicode = SkUnicodes::ICU::Make();
42*c8dee2aaSAndroid Build Coastguard Worker #endif
43*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION)
44*c8dee2aaSAndroid Build Coastguard Worker if (!fUnicode) {
45*c8dee2aaSAndroid Build Coastguard Worker fUnicode = SkUnicodes::ICU4X::Make();
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker #endif
48*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION)
49*c8dee2aaSAndroid Build Coastguard Worker if (!fUnicode) {
50*c8dee2aaSAndroid Build Coastguard Worker fUnicode = SkUnicodes::Libgrapheme::Make();
51*c8dee2aaSAndroid Build Coastguard Worker }
52*c8dee2aaSAndroid Build Coastguard Worker #endif
53*c8dee2aaSAndroid Build Coastguard Worker }
makeShaper(sk_sp<SkFontMgr> fallback)54*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper> makeShaper(sk_sp<SkFontMgr> fallback) override {
55*c8dee2aaSAndroid Build Coastguard Worker return SkShapers::HB::ShaperDrivenWrapper(fUnicode, fallback);
56*c8dee2aaSAndroid Build Coastguard Worker }
57*c8dee2aaSAndroid Build Coastguard Worker
makeBidiRunIterator(const char * utf8,size_t utf8Bytes,uint8_t bidiLevel)58*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper::BiDiRunIterator> makeBidiRunIterator(const char* utf8,
59*c8dee2aaSAndroid Build Coastguard Worker size_t utf8Bytes,
60*c8dee2aaSAndroid Build Coastguard Worker uint8_t bidiLevel) override {
61*c8dee2aaSAndroid Build Coastguard Worker return SkShapers::unicode::BidiRunIterator(fUnicode, utf8, utf8Bytes, bidiLevel);
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker
makeScriptRunIterator(const char * utf8,size_t utf8Bytes,SkFourByteTag script)64*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper::ScriptRunIterator> makeScriptRunIterator(const char* utf8,
65*c8dee2aaSAndroid Build Coastguard Worker size_t utf8Bytes,
66*c8dee2aaSAndroid Build Coastguard Worker SkFourByteTag script) override {
67*c8dee2aaSAndroid Build Coastguard Worker return SkShapers::HB::ScriptRunIterator(utf8, utf8Bytes, script);
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
getUnicode()70*c8dee2aaSAndroid Build Coastguard Worker SkUnicode* getUnicode() override { return fUnicode.get(); }
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker private:
73*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkUnicode> fUnicode;
74*c8dee2aaSAndroid Build Coastguard Worker };
75*c8dee2aaSAndroid Build Coastguard Worker #endif // defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_CORETEXT_AVAILABLE)
78*c8dee2aaSAndroid Build Coastguard Worker class CoreTextFactory final : public Factory {
makeShaper(sk_sp<SkFontMgr>)79*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper> makeShaper(sk_sp<SkFontMgr>) override {
80*c8dee2aaSAndroid Build Coastguard Worker return SkShapers::CT::CoreText();
81*c8dee2aaSAndroid Build Coastguard Worker }
makeBidiRunIterator(const char * utf8,size_t utf8Bytes,uint8_t bidiLevel)82*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper::BiDiRunIterator> makeBidiRunIterator(const char* utf8,
83*c8dee2aaSAndroid Build Coastguard Worker size_t utf8Bytes,
84*c8dee2aaSAndroid Build Coastguard Worker uint8_t bidiLevel) override {
85*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<SkShaper::TrivialBiDiRunIterator>(0, 0);
86*c8dee2aaSAndroid Build Coastguard Worker }
makeScriptRunIterator(const char * utf8,size_t utf8Bytes,SkFourByteTag script)87*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkShaper::ScriptRunIterator> makeScriptRunIterator(const char* utf8,
88*c8dee2aaSAndroid Build Coastguard Worker size_t utf8Bytes,
89*c8dee2aaSAndroid Build Coastguard Worker SkFourByteTag script) override {
90*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<SkShaper::TrivialScriptRunIterator>(0, 0);
91*c8dee2aaSAndroid Build Coastguard Worker }
getUnicode()92*c8dee2aaSAndroid Build Coastguard Worker SkUnicode* getUnicode() override { return nullptr; }
93*c8dee2aaSAndroid Build Coastguard Worker };
94*c8dee2aaSAndroid Build Coastguard Worker #endif // defined(SK_SHAPER_CORETEXT_AVAILABLE)
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker // This convenience function will return a set of callbacks that has the "best" text shaping
97*c8dee2aaSAndroid Build Coastguard Worker // depending on what parts of Skia the client has compiled in. For example, if the clients
98*c8dee2aaSAndroid Build Coastguard Worker // have compiled in SkShaper and a version of SkUnicode, callbacks which produce the
99*c8dee2aaSAndroid Build Coastguard Worker // appropriate types will be returned.
100*c8dee2aaSAndroid Build Coastguard Worker //
101*c8dee2aaSAndroid Build Coastguard Worker // This must be inline (and defined in this header) because the *client* has to compile this code
102*c8dee2aaSAndroid Build Coastguard Worker // with all defines set by *their* dependencies (which may include defines from SkShaper and
103*c8dee2aaSAndroid Build Coastguard Worker // SkUnicode modules).
BestAvailable()104*c8dee2aaSAndroid Build Coastguard Worker inline sk_sp<Factory> BestAvailable() {
105*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
106*c8dee2aaSAndroid Build Coastguard Worker return sk_make_sp<SkShapers::HarfbuzzFactory>();
107*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_SHAPER_CORETEXT_AVAILABLE)
108*c8dee2aaSAndroid Build Coastguard Worker return sk_make_sp<SkShapers::CoreTextFactory>();
109*c8dee2aaSAndroid Build Coastguard Worker #else
110*c8dee2aaSAndroid Build Coastguard Worker return SkShapers::Primitive::Factory();
111*c8dee2aaSAndroid Build Coastguard Worker #endif
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
114*c8dee2aaSAndroid Build Coastguard Worker }; // namespace SkShapers
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker #endif // SkShaperFactoryHelpers_DEFINED
117