blob: b87e841a040795a326ce51be9d92debef8fedbf4 [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkShaperFactoryHelpers_DEFINED
#define SkShaperFactoryHelpers_DEFINED
#include "modules/skshaper/include/SkShaper.h"
#include "modules/skshaper/include/SkShaper_factory.h"
#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
#include "modules/skshaper/include/SkShaper_harfbuzz.h"
#include "modules/skshaper/include/SkShaper_skunicode.h"
#include "modules/skunicode/include/SkUnicode.h"
#endif
#if defined(SK_SHAPER_CORETEXT_AVAILABLE)
#include "modules/skshaper/include/SkShaper_coretext.h"
#endif
#if defined(SK_UNICODE_ICU_IMPLEMENTATION)
#include "modules/skunicode/include/SkUnicode_icu.h"
#endif
#if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION)
#include "modules/skunicode/include/SkUnicode_libgrapheme.h"
#endif
#if defined(SK_UNICODE_ICU4X_IMPLEMENTATION)
#include "modules/skunicode/include/SkUnicode_icu4x.h"
#endif
namespace SkShapers {
#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
class HarfbuzzFactory final : public Factory {
public:
HarfbuzzFactory() {
#if defined(SK_UNICODE_ICU_IMPLEMENTATION)
fUnicode = SkUnicodes::ICU::Make();
#endif
#if defined(SK_UNICODE_ICU4X_IMPLEMENTATION)
if (!fUnicode) {
fUnicode = SkUnicodes::ICU4X::Make();
}
#endif
#if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION)
if (!fUnicode) {
fUnicode = SkUnicodes::Libgrapheme::Make();
}
#endif
}
std::unique_ptr<SkShaper> makeShaper(sk_sp<SkFontMgr> fallback) override {
return SkShapers::HB::ShaperDrivenWrapper(fUnicode, fallback);
}
std::unique_ptr<SkShaper::BiDiRunIterator> makeBidiRunIterator(const char* utf8,
size_t utf8Bytes,
uint8_t bidiLevel) override {
return SkShapers::unicode::BidiRunIterator(fUnicode, utf8, utf8Bytes, bidiLevel);
}
std::unique_ptr<SkShaper::ScriptRunIterator> makeScriptRunIterator(const char* utf8,
size_t utf8Bytes,
SkFourByteTag script) override {
return SkShapers::HB::ScriptRunIterator(utf8, utf8Bytes, script);
}
SkUnicode* getUnicode() override { return fUnicode.get(); }
private:
sk_sp<SkUnicode> fUnicode;
};
#endif // defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
#if defined(SK_SHAPER_CORETEXT_AVAILABLE)
class CoreTextFactory final : public Factory {
std::unique_ptr<SkShaper> makeShaper(sk_sp<SkFontMgr>) override {
return SkShapers::CT::CoreText();
}
std::unique_ptr<SkShaper::BiDiRunIterator> makeBidiRunIterator(const char* utf8,
size_t utf8Bytes,
uint8_t bidiLevel) override {
return std::make_unique<SkShaper::TrivialBiDiRunIterator>(0, 0);
}
std::unique_ptr<SkShaper::ScriptRunIterator> makeScriptRunIterator(const char* utf8,
size_t utf8Bytes,
SkFourByteTag script) override {
return std::make_unique<SkShaper::TrivialScriptRunIterator>(0, 0);
}
SkUnicode* getUnicode() override { return nullptr; }
};
#endif // defined(SK_SHAPER_CORETEXT_AVAILABLE)
// This convenience function will return a set of callbacks that has the "best" text shaping
// depending on what parts of Skia the client has compiled in. For example, if the clients
// have compiled in SkShaper and a version of SkUnicode, callbacks which produce the
// appropriate types will be returned.
//
// This must be inline (and defined in this header) because the *client* has to compile this code
// with all defines set by *their* dependencies (which may include defines from SkShaper and
// SkUnicode modules).
inline sk_sp<Factory> BestAvailable() {
#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
return sk_make_sp<SkShapers::HarfbuzzFactory>();
#elif defined(SK_SHAPER_CORETEXT_AVAILABLE)
return sk_make_sp<SkShapers::CoreTextFactory>();
#else
return SkShapers::Primitive::Factory();
#endif
}
}; // namespace SkShapers
#endif // SkShaperFactoryHelpers_DEFINED