1 /* 2 * Copyright 2023 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkUnicode_icu_bidi_DEFINED 8 #define SkUnicode_icu_bidi_DEFINED 9 10 #include "include/core/SkRefCnt.h" 11 #include "modules/skunicode/include/SkUnicode.h" 12 13 #include <unicode/ubidi.h> 14 #include <unicode/umachine.h> 15 #include <unicode/utypes.h> 16 #include <cstdint> 17 #include <memory> 18 #include <vector> 19 20 // Some versions of SkUnicode need a small subset of ICU to do bidi things. This 21 // allows us to have the same API for the subset as well as the full ICU. 22 class SkBidiFactory : public SkRefCnt { 23 public: 24 std::unique_ptr<SkBidiIterator> MakeIterator(const uint16_t utf16[], 25 int utf16Units, 26 SkBidiIterator::Direction dir) const; 27 std::unique_ptr<SkBidiIterator> MakeIterator(const char utf8[], 28 int utf8Units, 29 SkBidiIterator::Direction dir) const; 30 bool ExtractBidi(const char utf8[], 31 int utf8Units, 32 SkUnicode::TextDirection dir, 33 std::vector<SkUnicode::BidiRegion>* bidiRegions) const; 34 35 virtual const char* errorName(UErrorCode status) const = 0; 36 37 using BidiCloseCallback = void(*)(UBiDi* bidi); 38 virtual BidiCloseCallback bidi_close_callback() const = 0; 39 virtual UBiDiDirection bidi_getDirection(const UBiDi* bidi) const = 0; 40 virtual SkBidiIterator::Position bidi_getLength(const UBiDi* bidi) const = 0; 41 virtual SkBidiIterator::Level bidi_getLevelAt(const UBiDi* bidi, int pos) const = 0; 42 virtual UBiDi* bidi_openSized(int32_t maxLength, 43 int32_t maxRunCount, 44 UErrorCode* pErrorCode) const = 0; 45 virtual void bidi_setPara(UBiDi* bidi, 46 const UChar* text, 47 int32_t length, 48 UBiDiLevel paraLevel, 49 UBiDiLevel* embeddingLevels, 50 UErrorCode* status) const = 0; 51 virtual void bidi_reorderVisual(const SkUnicode::BidiLevel runLevels[], 52 int levelsCount, 53 int32_t logicalFromVisual[]) const = 0; 54 }; 55 56 #endif // SkUnicode_icu_bidi_DEFINED 57