Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Friends | List of all members
SkUnicode_libgrapheme Class Reference
Inheritance diagram for SkUnicode_libgrapheme:
SkUnicodeHardCodedCharProperties SkUnicode SkRefCnt SkRefCntBase

Public Member Functions

 SkUnicode_libgrapheme ()
 
 ~SkUnicode_libgrapheme () override=default
 
std::unique_ptr< SkBidiIteratormakeBidiIterator (const uint16_t text[], int count, SkBidiIterator::Direction dir) override
 
std::unique_ptr< SkBidiIteratormakeBidiIterator (const char text[], int count, SkBidiIterator::Direction dir) override
 
std::unique_ptr< SkBreakIteratormakeBreakIterator (const char locale[], BreakType breakType) override
 
std::unique_ptr< SkBreakIteratormakeBreakIterator (BreakType breakType) override
 
bool getBidiRegions (const char utf8[], int utf8Units, TextDirection dir, std::vector< BidiRegion > *results) override
 
bool getSentences (const char utf8[], int utf8Units, const char *locale, std::vector< SkUnicode::Position > *results) override
 
bool computeCodeUnitFlags (char utf8[], int utf8Units, bool replaceTabs, skia_private::TArray< SkUnicode::CodeUnitFlags, true > *results) override
 
bool computeCodeUnitFlags (char16_t utf16[], int utf16Units, bool replaceTabs, skia_private::TArray< SkUnicode::CodeUnitFlags, true > *results) override
 
bool getUtf8To16Mapping (const char utf8[], int utf8Units, std::unordered_map< Position, Position > *results)
 
bool getWords (const char utf8[], int utf8Units, const char *locale, std::vector< Position > *results) override
 
bool getUtf8Words (const char utf8[], int utf8Units, const char *locale, std::vector< Position > *results) override
 
SkString toUpper (const SkString &str) override
 
SkString toUpper (const SkString &str, const char *locale) override
 
void reorderVisual (const BidiLevel runLevels[], int levelsCount, int32_t logicalFromVisual[]) override
 
- Public Member Functions inherited from SkUnicodeHardCodedCharProperties
bool isControl (SkUnichar utf8) override
 
bool isWhitespace (SkUnichar utf8) override
 
bool isSpace (SkUnichar utf8) override
 
bool isTabulation (SkUnichar utf8) override
 
bool isHardBreak (SkUnichar utf8) override
 
bool isEmoji (SkUnichar utf8) override
 
bool isEmojiComponent (SkUnichar utf8) override
 
bool isEmojiModifierBase (SkUnichar utf8) override
 
bool isEmojiModifier (SkUnichar utf8) override
 
bool isRegionalIndicator (SkUnichar utf8) override
 
bool isIdeographic (SkUnichar utf8) override
 
- Public Member Functions inherited from SkUnicode
 ~SkUnicode () override=default
 
template<typename Callback >
void forEachCodepoint (const char *utf8, int32_t utf8Units, Callback &&callback)
 
template<typename Callback >
void forEachCodepoint (const char16_t *utf16, int32_t utf16Units, Callback &&callback)
 
template<typename Callback >
void forEachBidiRegion (const uint16_t utf16[], int utf16Units, SkBidiIterator::Direction dir, Callback &&callback)
 
template<typename Callback >
void forEachBreak (const char16_t utf16[], int utf16Units, SkUnicode::BreakType type, Callback &&callback)
 
- Public Member Functions inherited from SkRefCntBase
 SkRefCntBase ()
 
virtual ~SkRefCntBase ()
 
bool unique () const
 
void ref () const
 
void unref () const
 

Friends

class SkBreakIterator_libgrapheme
 

Additional Inherited Members

- Public Types inherited from SkUnicode
enum  CodeUnitFlags {
  kNoCodeUnitFlag = 0x00 , kPartOfWhiteSpaceBreak = 0x01 , kGraphemeStart = 0x02 , kSoftLineBreakBefore = 0x04 ,
  kHardLineBreakBefore = 0x08 , kPartOfIntraWordBreak = 0x10 , kControl = 0x20 , kTabulation = 0x40 ,
  kGlyphClusterStart = 0x80 , kIdeographic = 0x100 , kEmoji = 0x200 , kWordBreak = 0x400 ,
  kSentenceBreak = 0x800
}
 
enum class  TextDirection { kLTR , kRTL }
 
enum class  LineBreakType { kSoftLineBreak = 0 , kHardLineBreak = 100 }
 
enum class  BreakType { kWords , kGraphemes , kLines , kSentences }
 
typedef size_t Position
 
typedef uint8_t BidiLevel
 
- Static Public Member Functions inherited from SkUnicode
static bool hasTabulationFlag (SkUnicode::CodeUnitFlags flags)
 
static bool hasHardLineBreakFlag (SkUnicode::CodeUnitFlags flags)
 
static bool hasSoftLineBreakFlag (SkUnicode::CodeUnitFlags flags)
 
static bool hasGraphemeStartFlag (SkUnicode::CodeUnitFlags flags)
 
static bool hasControlFlag (SkUnicode::CodeUnitFlags flags)
 
static bool hasPartOfWhiteSpaceBreakFlag (SkUnicode::CodeUnitFlags flags)
 
static bool extractBidi (const char utf8[], int utf8Units, TextDirection dir, std::vector< BidiRegion > *bidiRegions)
 
static SkString convertUtf16ToUtf8 (const char16_t *utf16, int utf16Units)
 
static SkString convertUtf16ToUtf8 (const std::u16string &utf16)
 
static std::u16string convertUtf8ToUtf16 (const char *utf8, int utf8Units)
 
static std::u16string convertUtf8ToUtf16 (const SkString &utf8)
 
template<typename Appender8 , typename Appender16 >
static bool extractUtfConversionMapping (SkSpan< const char > utf8, Appender8 &&appender8, Appender16 &&appender16)
 

Detailed Description

Definition at line 30 of file SkUnicode_libgrapheme.cpp.

Constructor & Destructor Documentation

◆ SkUnicode_libgrapheme()

SkUnicode_libgrapheme::SkUnicode_libgrapheme ( )
inline

Definition at line 32 of file SkUnicode_libgrapheme.cpp.

32{ }

◆ ~SkUnicode_libgrapheme()

SkUnicode_libgrapheme::~SkUnicode_libgrapheme ( )
overridedefault

Member Function Documentation

◆ computeCodeUnitFlags() [1/2]

bool SkUnicode_libgrapheme::computeCodeUnitFlags ( char  utf8[],
int  utf8Units,
bool  replaceTabs,
skia_private::TArray< SkUnicode::CodeUnitFlags, true > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 60 of file SkUnicode_libgrapheme.cpp.

63 {
64 results->clear();
65 results->push_back_n(utf8Units + 1, CodeUnitFlags::kNoCodeUnitFlag);
66
67 size_t lineBreak = 0;
68 (*results)[lineBreak] |= CodeUnitFlags::kSoftLineBreakBefore;
69 while (lineBreak < utf8Units) {
70 lineBreak += grapheme_next_line_break_utf8(utf8 + lineBreak, utf8Units - lineBreak);
71 // Check if the previous code unit is a hard break.
72 auto codePoint = utf8[lineBreak - 1];
73 (*results)[lineBreak] |= this->isHardBreak(codePoint)
76 }
77 (*results)[utf8Units] |= CodeUnitFlags::kSoftLineBreakBefore;
78
79 size_t graphemeBreak = 0;
80 (*results)[graphemeBreak] |= CodeUnitFlags::kGraphemeStart;
81 while (graphemeBreak < utf8Units) {
82 graphemeBreak += grapheme_next_character_break_utf8(utf8 + graphemeBreak, utf8Units - graphemeBreak);
83 (*results)[graphemeBreak] |= CodeUnitFlags::kGraphemeStart;
84 }
85
86 const char* current = utf8;
87 const char* end = utf8 + utf8Units;
88 while (current < end) {
89 auto before = current - utf8;
90 SkUnichar unichar = SkUTF::NextUTF8(&current, end);
91 if (unichar < 0) unichar = 0xFFFD;
92 auto after = current - utf8;
93 if (replaceTabs && this->isTabulation(unichar)) {
94 results->at(before) |= SkUnicode::kTabulation;
95 if (replaceTabs) {
96 unichar = ' ';
97 utf8[before] = ' ';
98 }
99 }
100 for (auto i = before; i < after; ++i) {
101 if (this->isSpace(unichar)) {
103 }
104 if (this->isWhitespace(unichar)) {
106 }
107 if (this->isControl(unichar)) {
108 results->at(i) |= SkUnicode::kControl;
109 }
110 }
111 }
112 return true;
113 }
int32_t SkUnichar
Definition SkTypes.h:175
bool isTabulation(SkUnichar utf8) override
bool isSpace(SkUnichar utf8) override
bool isHardBreak(SkUnichar utf8) override
bool isControl(SkUnichar utf8) override
bool isWhitespace(SkUnichar utf8) override
@ kNoCodeUnitFlag
Definition SkUnicode.h:80
@ kPartOfWhiteSpaceBreak
Definition SkUnicode.h:81
@ kHardLineBreakBefore
Definition SkUnicode.h:84
@ kTabulation
Definition SkUnicode.h:87
@ kGraphemeStart
Definition SkUnicode.h:82
@ kSoftLineBreakBefore
Definition SkUnicode.h:83
@ kPartOfIntraWordBreak
Definition SkUnicode.h:85
T * push_back_n(int n)
Definition SkTArray.h:262
glong glong end
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)
Definition SkUTF.cpp:118

◆ computeCodeUnitFlags() [2/2]

bool SkUnicode_libgrapheme::computeCodeUnitFlags ( char16_t  utf16[],
int  utf16Units,
bool  replaceTabs,
skia_private::TArray< SkUnicode::CodeUnitFlags, true > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 115 of file SkUnicode_libgrapheme.cpp.

116 {
117 SkASSERT(false);
118 return false;
119 }
#define SkASSERT(cond)
Definition SkAssert.h:116

◆ getBidiRegions()

bool SkUnicode_libgrapheme::getBidiRegions ( const char  utf8[],
int  utf8Units,
TextDirection  dir,
std::vector< BidiRegion > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 45 of file SkUnicode_libgrapheme.cpp.

48 {
49 return fBidiFact->ExtractBidi(utf8, utf8Units, dir, results);
50 }
bool ExtractBidi(const char utf8[], int utf8Units, SkUnicode::TextDirection dir, std::vector< SkUnicode::BidiRegion > *bidiRegions) const

◆ getSentences()

bool SkUnicode_libgrapheme::getSentences ( const char  utf8[],
int  utf8Units,
const char *  locale,
std::vector< SkUnicode::Position > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 52 of file SkUnicode_libgrapheme.cpp.

55 {
56 SkDEBUGF("Method 'getSentences' is not implemented\n");
57 return false;
58 }
#define SkDEBUGF(...)
Definition SkDebug.h:24

◆ getUtf8To16Mapping()

bool SkUnicode_libgrapheme::getUtf8To16Mapping ( const char  utf8[],
int  utf8Units,
std::unordered_map< Position, Position > *  results 
)
inline

Definition at line 121 of file SkUnicode_libgrapheme.cpp.

121 {
122 int utf16Units = 0;
123 const char* ptr8 = utf8;
124 const char* end8 = utf8 + utf8Units;
125 while (ptr8 < end8) {
126 results->emplace(ptr8 - utf8, utf16Units);
127 SkUnichar uni = SkUTF::NextUTF8(&ptr8, end8);
128 if (uni < 0) {
129 return false;
130 }
131
132 uint16_t utf16[2];
133 size_t count = SkUTF::ToUTF16(uni, utf16);
134 if (count == 0) {
135 return false;
136 }
137 utf16Units += count;
138 }
139 results->emplace(utf8Units, utf16Units);
140 return true;
141 }
int count
SK_SPI size_t ToUTF16(SkUnichar uni, uint16_t utf16[2]=nullptr)
Definition SkUTF.cpp:243

◆ getUtf8Words()

bool SkUnicode_libgrapheme::getUtf8Words ( const char  utf8[],
int  utf8Units,
const char *  locale,
std::vector< Position > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 159 of file SkUnicode_libgrapheme.cpp.

162 {
163 // Let's consider sort line breaks, whitespaces and CJK codepoints instead
164 std::vector<CodeUnitFlags> breaks(utf8Units + 1, CodeUnitFlags::kNoCodeUnitFlag);
165
166 size_t lineBreak = 0;
167 breaks[lineBreak] = CodeUnitFlags::kSoftLineBreakBefore;
168 while (lineBreak < utf8Units) {
169 lineBreak += grapheme_next_line_break_utf8(utf8 + lineBreak, utf8Units - lineBreak);
170 breaks[lineBreak] = CodeUnitFlags::kSoftLineBreakBefore;
171 }
172 breaks[lineBreak] = CodeUnitFlags::kSoftLineBreakBefore;
173
174 const char* current = utf8;
175 const char* end = utf8 + utf8Units;
176 while (current < end) {
177 auto index = current - utf8;
178 SkUnichar unichar = SkUTF::NextUTF8(&current, end);
179 if (this->isWhitespace(unichar)) {
181 } else if (this->isIdeographic(unichar)) {
182 breaks[index] = CodeUnitFlags::kIdeographic;
183 }
184 }
185
186 bool whitespaces = false;
187 for (size_t i = 0; i < breaks.size(); ++i) {
188 auto b = breaks[i];
190 results->emplace_back(i);
191 whitespaces = false;
192 } else if (b == CodeUnitFlags::kIdeographic) {
193 results->emplace_back(i);
194 whitespaces = false;
196 if (!whitespaces) {
197 results->emplace_back(i);
198 }
199 whitespaces = true;
200 } else {
201 whitespaces = false;
202 }
203 }
204
205 return true;
206
207 /*
208 size_t wordBreak = 0;
209 while (wordBreak < utf8Units) {
210 wordBreak += grapheme_next_word_break_utf8(utf8 + wordBreak, utf8Units - wordBreak);
211 results->emplace_back(wordBreak);
212 }
213 return true;
214 */
215 }
bool isIdeographic(SkUnichar utf8) override
@ kIdeographic
Definition SkUnicode.h:89
static bool b

◆ getWords()

bool SkUnicode_libgrapheme::getWords ( const char  utf8[],
int  utf8Units,
const char *  locale,
std::vector< Position > *  results 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 143 of file SkUnicode_libgrapheme.cpp.

143 {
144 std::unordered_map<Position, Position> mapping;
145 if (!getUtf8To16Mapping(utf8, utf8Units, &mapping)) {
146 return false;
147 }
148 size_t wordBreak = 0;
149 while (wordBreak < utf8Units) {
150 wordBreak += grapheme_next_word_break_utf8(utf8 + wordBreak, utf8Units - wordBreak);
151 if (mapping.find(wordBreak) == mapping.end()) {
152 return false;
153 }
154 results->emplace_back(mapping[wordBreak]);
155 }
156 return true;
157 }
bool getUtf8To16Mapping(const char utf8[], int utf8Units, std::unordered_map< Position, Position > *results)

◆ makeBidiIterator() [1/2]

std::unique_ptr< SkBidiIterator > SkUnicode_libgrapheme::makeBidiIterator ( const char  text[],
int  count,
SkBidiIterator::Direction  dir 
)
overridevirtual

Implements SkUnicode.

Definition at line 286 of file SkUnicode_libgrapheme.cpp.

288 {
289 return fBidiFact->MakeIterator(text, count, dir);
290}
std::unique_ptr< SkBidiIterator > MakeIterator(const uint16_t utf16[], int utf16Units, SkBidiIterator::Direction dir) const
std::u16string text

◆ makeBidiIterator() [2/2]

std::unique_ptr< SkBidiIterator > SkUnicode_libgrapheme::makeBidiIterator ( const uint16_t  text[],
int  count,
SkBidiIterator::Direction  dir 
)
overridevirtual

Implements SkUnicode.

Definition at line 282 of file SkUnicode_libgrapheme.cpp.

283 {
284 return fBidiFact->MakeIterator(text, count, dir);
285}

◆ makeBreakIterator() [1/2]

std::unique_ptr< SkBreakIterator > SkUnicode_libgrapheme::makeBreakIterator ( BreakType  breakType)
overridevirtual

Implements SkUnicode.

Definition at line 295 of file SkUnicode_libgrapheme.cpp.

295 {
296 return std::make_unique<SkBreakIterator_libgrapheme>(this);
297}

◆ makeBreakIterator() [2/2]

std::unique_ptr< SkBreakIterator > SkUnicode_libgrapheme::makeBreakIterator ( const char  locale[],
BreakType  breakType 
)
overridevirtual

Implements SkUnicode.

Definition at line 291 of file SkUnicode_libgrapheme.cpp.

292 {
293 return std::make_unique<SkBreakIterator_libgrapheme>(this);
294}

◆ reorderVisual()

void SkUnicode_libgrapheme::reorderVisual ( const BidiLevel  runLevels[],
int  levelsCount,
int32_t  logicalFromVisual[] 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 227 of file SkUnicode_libgrapheme.cpp.

229 {
230 fBidiFact->bidi_reorderVisual(runLevels, levelsCount, logicalFromVisual);
231 }
virtual void bidi_reorderVisual(const SkUnicode::BidiLevel runLevels[], int levelsCount, int32_t logicalFromVisual[]) const =0

◆ toUpper() [1/2]

SkString SkUnicode_libgrapheme::toUpper ( const SkString str)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 217 of file SkUnicode_libgrapheme.cpp.

217 {
218 return this->toUpper(str, nullptr);
219 }
SkString toUpper(const SkString &str) override

◆ toUpper() [2/2]

SkString SkUnicode_libgrapheme::toUpper ( const SkString str,
const char *  locale 
)
inlineoverridevirtual

Implements SkUnicode.

Definition at line 221 of file SkUnicode_libgrapheme.cpp.

221 {
222 SkString res(" ", str.size());
223 grapheme_to_uppercase_utf8(str.data(), str.size(), res.data(), res.size());
224 return res;
225 }
size_t size() const
Definition SkString.h:131
const char * data() const
Definition SkString.h:132

Friends And Related Symbol Documentation

◆ SkBreakIterator_libgrapheme

friend class SkBreakIterator_libgrapheme
friend

Definition at line 233 of file SkUnicode_libgrapheme.cpp.


The documentation for this class was generated from the following file: