• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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