xref: /aosp_15_r20/external/skia/modules/skunicode/src/SkUnicode_icu_bidi.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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