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 #ifdef ENABLE_DRAWING_ADAPTER 23 namespace SkiaRsText { 24 #endif 25 class SkBidiFactory : public SkRefCnt { 26 public: 27 std::unique_ptr<SkBidiIterator> MakeIterator(const uint16_t utf16[], 28 int utf16Units, 29 SkBidiIterator::Direction dir) const; 30 std::unique_ptr<SkBidiIterator> MakeIterator(const char utf8[], 31 int utf8Units, 32 SkBidiIterator::Direction dir) const; 33 bool ExtractBidi(const char utf8[], 34 int utf8Units, 35 SkUnicode::TextDirection dir, 36 std::vector<SkUnicode::BidiRegion>* bidiRegions) const; 37 38 virtual const char* errorName(UErrorCode status) const = 0; 39 40 using BidiCloseCallback = void(*)(UBiDi* bidi); 41 virtual BidiCloseCallback bidi_close_callback() const = 0; 42 virtual UBiDiDirection bidi_getDirection(const UBiDi* bidi) const = 0; 43 virtual SkBidiIterator::Position bidi_getLength(const UBiDi* bidi) const = 0; 44 virtual SkBidiIterator::Level bidi_getLevelAt(const UBiDi* bidi, int pos) const = 0; 45 virtual UBiDi* bidi_openSized(int32_t maxLength, 46 int32_t maxRunCount, 47 UErrorCode* pErrorCode) const = 0; 48 virtual void bidi_setPara(UBiDi* bidi, 49 const UChar* text, 50 int32_t length, 51 UBiDiLevel paraLevel, 52 UBiDiLevel* embeddingLevels, 53 UErrorCode* status) const = 0; 54 virtual void bidi_reorderVisual(const SkUnicode::BidiLevel runLevels[], 55 int levelsCount, 56 int32_t logicalFromVisual[]) const = 0; 57 }; 58 59 #ifdef ENABLE_DRAWING_ADAPTER 60 } 61 using SkBidiFactory = SkiaRsText::SkBidiFactory; 62 #endif // ENABLE_DRAWING_ADAPTER 63 #endif // SkUnicode_icu_bidi_DEFINED 64