xref: /aosp_15_r20/external/skia/modules/skshaper/utils/FactoryHelpers.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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