Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Member Functions | List of all members
SkUnicode Class Referenceabstract

#include <SkUnicode.h>

Inheritance diagram for SkUnicode:
SkRefCnt SkRefCntBase SkUnicodeHardCodedCharProperties SkUnicode_icu SkUnicode_icu4x SkUnicode_client SkUnicode_libgrapheme

Classes

struct  BidiRegion
 
struct  LineBreakBefore
 

Public Types

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
 

Public Member Functions

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

Static Public Member Functions

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 77 of file SkUnicode.h.

Member Typedef Documentation

◆ BidiLevel

typedef uint8_t SkUnicode::BidiLevel

Definition at line 99 of file SkUnicode.h.

◆ Position

typedef size_t SkUnicode::Position

Definition at line 98 of file SkUnicode.h.

Member Enumeration Documentation

◆ BreakType

enum class SkUnicode::BreakType
strong
Enumerator
kWords 
kGraphemes 
kLines 
kSentences 

Definition at line 112 of file SkUnicode.h.

◆ CodeUnitFlags

Enumerator
kNoCodeUnitFlag 
kPartOfWhiteSpaceBreak 
kGraphemeStart 
kSoftLineBreakBefore 
kHardLineBreakBefore 
kPartOfIntraWordBreak 
kControl 
kTabulation 
kGlyphClusterStart 
kIdeographic 
kEmoji 
kWordBreak 
kSentenceBreak 

Definition at line 79 of file SkUnicode.h.

79 {
80 kNoCodeUnitFlag = 0x00,
82 kGraphemeStart = 0x02,
86 kControl = 0x20,
87 kTabulation = 0x40,
88 kGlyphClusterStart = 0x80,
89 kIdeographic = 0x100,
90 kEmoji = 0x200,
91 kWordBreak = 0x400,
92 kSentenceBreak = 0x800,
93 };
@ 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
@ kSentenceBreak
Definition SkUnicode.h:92
@ kGlyphClusterStart
Definition SkUnicode.h:88
@ kIdeographic
Definition SkUnicode.h:89
@ kSoftLineBreakBefore
Definition SkUnicode.h:83
@ kPartOfIntraWordBreak
Definition SkUnicode.h:85

◆ LineBreakType

enum class SkUnicode::LineBreakType
strong
Enumerator
kSoftLineBreak 
kHardLineBreak 

Definition at line 107 of file SkUnicode.h.

◆ TextDirection

enum class SkUnicode::TextDirection
strong
Enumerator
kLTR 
kRTL 

Definition at line 94 of file SkUnicode.h.

Constructor & Destructor Documentation

◆ ~SkUnicode()

SkUnicode::~SkUnicode ( )
overridedefault

Member Function Documentation

◆ computeCodeUnitFlags() [1/2]

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

◆ computeCodeUnitFlags() [2/2]

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

◆ convertUtf16ToUtf8() [1/2]

SkString SkUnicode::convertUtf16ToUtf8 ( const char16_t *  utf16,
int  utf16Units 
)
static

Definition at line 14 of file SkUnicode.cpp.

14 {
15
16 int utf8Units = SkUTF::UTF16ToUTF8(nullptr, 0, (uint16_t*)utf16, utf16Units);
17 if (utf8Units < 0) {
18 SkDEBUGF("Convert error: Invalid utf16 input");
19 return SkString();
20 }
21 AutoTArray<char> utf8(utf8Units);
22 SkDEBUGCODE(int dstLen =) SkUTF::UTF16ToUTF8(utf8.data(), utf8Units, (uint16_t*)utf16, utf16Units);
23 SkASSERT(dstLen == utf8Units);
24
25 return SkString(utf8.data(), utf8Units);
26}
#define SkASSERT(cond)
Definition SkAssert.h:116
#define SkDEBUGF(...)
Definition SkDebug.h:24
#define SkDEBUGCODE(...)
Definition SkDebug.h:23
Definition SkUTF.h:13
SK_SPI int UTF16ToUTF8(char dst[], int dstCapacity, const uint16_t src[], size_t srcLength)
Definition SkUTF.cpp:291

◆ convertUtf16ToUtf8() [2/2]

SkString SkUnicode::convertUtf16ToUtf8 ( const std::u16string &  utf16)
static

Definition at line 28 of file SkUnicode.cpp.

28 {
29 return convertUtf16ToUtf8(utf16.c_str(), utf16.size());
30}
static SkString convertUtf16ToUtf8(const char16_t *utf16, int utf16Units)
Definition SkUnicode.cpp:14

◆ convertUtf8ToUtf16() [1/2]

std::u16string SkUnicode::convertUtf8ToUtf16 ( const char *  utf8,
int  utf8Units 
)
static

Definition at line 32 of file SkUnicode.cpp.

32 {
33
34 int utf16Units = SkUTF::UTF8ToUTF16(nullptr, 0, utf8, utf8Units);
35 if (utf16Units < 0) {
36 SkDEBUGF("Convert error: Invalid utf8 input");
37 return std::u16string();
38 }
39
40 AutoTArray<uint16_t> utf16(utf16Units);
41 SkDEBUGCODE(int dstLen =) SkUTF::UTF8ToUTF16(utf16.data(), utf16Units, utf8, utf8Units);
42 SkASSERT(dstLen == utf16Units);
43
44 return std::u16string((char16_t *)utf16.data(), utf16Units);
45}
SK_SPI int UTF8ToUTF16(uint16_t dst[], int dstCapacity, const char src[], size_t srcByteLength)
Definition SkUTF.cpp:259
Definition ref_ptr.h:256

◆ convertUtf8ToUtf16() [2/2]

std::u16string SkUnicode::convertUtf8ToUtf16 ( const SkString utf8)
static

Definition at line 47 of file SkUnicode.cpp.

47 {
48 return convertUtf8ToUtf16(utf8.c_str(), utf8.size());
49}
static std::u16string convertUtf8ToUtf16(const char *utf8, int utf8Units)
Definition SkUnicode.cpp:32

◆ extractBidi()

static bool SkUnicode::extractBidi ( const char  utf8[],
int  utf8Units,
TextDirection  dir,
std::vector< BidiRegion > *  bidiRegions 
)
static

◆ extractUtfConversionMapping()

template<typename Appender8 , typename Appender16 >
static bool SkUnicode::extractUtfConversionMapping ( SkSpan< const char >  utf8,
Appender8 &&  appender8,
Appender16 &&  appender16 
)
inlinestatic

Definition at line 193 of file SkUnicode.h.

193 {
194 size_t size8 = 0;
195 size_t size16 = 0;
196 auto ptr = utf8.begin();
197 auto end = utf8.end();
198 while (ptr < end) {
199
200 size_t index = SkToSizeT(ptr - utf8.begin());
201 SkUnichar u = SkUTF::NextUTF8(&ptr, end);
202
203 // All UTF8 code units refer to the same codepoint
204 size_t next = SkToSizeT(ptr - utf8.begin());
205 for (auto i = index; i < next; ++i) {
206 //fUTF16IndexForUTF8Index.emplace_back(fUTF8IndexForUTF16Index.size());
207 appender16(size8);
208 ++size16;
209 }
210 //SkASSERT(fUTF16IndexForUTF8Index.size() == next);
211 SkASSERT(size16 == next);
212 if (size16 != next) {
213 return false;
214 }
215
216 // One or two UTF16 code units refer to the same codepoint
217 uint16_t buffer[2];
218 size_t count = SkUTF::ToUTF16(u, buffer);
219 //fUTF8IndexForUTF16Index.emplace_back(index);
220 appender8(index);
221 ++size8;
222 if (count > 1) {
223 //fUTF8IndexForUTF16Index.emplace_back(index);
224 appender8(index);
225 ++size8;
226 }
227 }
228 //fUTF16IndexForUTF8Index.emplace_back(fUTF8IndexForUTF16Index.size());
229 appender16(size8);
230 ++size16;
231 //fUTF8IndexForUTF16Index.emplace_back(fText.size());
232 appender8(utf8.size());
233 ++size8;
234
235 return true;
236 }
int count
static float next(float f)
constexpr size_t SkToSizeT(S x)
Definition SkTo.h:31
int32_t SkUnichar
Definition SkTypes.h:175
glong glong end
static const uint8_t buffer[]
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)
Definition SkUTF.cpp:118
SK_SPI size_t ToUTF16(SkUnichar uni, uint16_t utf16[2]=nullptr)
Definition SkUTF.cpp:243

◆ forEachBidiRegion()

template<typename Callback >
void SkUnicode::forEachBidiRegion ( const uint16_t  utf16[],
int  utf16Units,
SkBidiIterator::Direction  dir,
Callback &&  callback 
)
inline

Definition at line 266 of file SkUnicode.h.

266 {
267 auto iter = makeBidiIterator(utf16, utf16Units, dir);
268 const uint16_t* start16 = utf16;
269 const uint16_t* end16 = utf16 + utf16Units;
270 SkBidiIterator::Level currentLevel = 0;
271
272 SkBidiIterator::Position pos16 = 0;
273 while (pos16 <= iter->getLength()) {
274 auto level = iter->getLevelAt(pos16);
275 if (pos16 == 0) {
276 currentLevel = level;
277 } else if (level != currentLevel) {
278 callback(pos16, start16 - utf16, currentLevel);
279 currentLevel = level;
280 }
281 if (start16 == end16) {
282 break;
283 }
284 SkUnichar u = SkUTF::NextUTF16(&start16, end16);
285 pos16 += SkUTF::ToUTF16(u);
286 }
287 }
int32_t Position
Definition SkUnicode.h:45
uint8_t Level
Definition SkUnicode.h:46
virtual std::unique_ptr< SkBidiIterator > makeBidiIterator(const uint16_t text[], int count, SkBidiIterator::Direction)=0
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
SK_SPI SkUnichar NextUTF16(const uint16_t **ptr, const uint16_t *end)
Definition SkUTF.cpp:159

◆ forEachBreak()

template<typename Callback >
void SkUnicode::forEachBreak ( const char16_t  utf16[],
int  utf16Units,
SkUnicode::BreakType  type,
Callback &&  callback 
)
inline

Definition at line 290 of file SkUnicode.h.

290 {
291 auto iter = makeBreakIterator(type);
292 iter->setText(utf16, utf16Units);
293 auto pos = iter->first();
294 do {
295 callback(pos, iter->status());
296 pos = iter->next();
297 } while (!iter->isDone());
298 }
SkPoint pos
virtual std::unique_ptr< SkBreakIterator > makeBreakIterator(const char locale[], BreakType breakType)=0

◆ forEachCodepoint() [1/2]

template<typename Callback >
void SkUnicode::forEachCodepoint ( const char *  utf8,
int32_t  utf8Units,
Callback &&  callback 
)
inline

Definition at line 239 of file SkUnicode.h.

239 {
240 const char* current = utf8;
241 const char* end = utf8 + utf8Units;
242 while (current < end) {
243 auto before = current - utf8;
244 SkUnichar unichar = SkUTF::NextUTF8(&current, end);
245 if (unichar < 0) unichar = 0xFFFD;
246 auto after = current - utf8;
247 uint16_t buffer[2];
248 size_t count = SkUTF::ToUTF16(unichar, buffer);
249 callback(unichar, before, after, count);
250 }
251 }

◆ forEachCodepoint() [2/2]

template<typename Callback >
void SkUnicode::forEachCodepoint ( const char16_t *  utf16,
int32_t  utf16Units,
Callback &&  callback 
)
inline

Definition at line 254 of file SkUnicode.h.

254 {
255 const char16_t* current = utf16;
256 const char16_t* end = utf16 + utf16Units;
257 while (current < end) {
258 auto before = current - utf16;
259 SkUnichar unichar = SkUTF::NextUTF16((const uint16_t**)&current, (const uint16_t*)end);
260 auto after = current - utf16;
261 callback(unichar, before, after);
262 }
263 }

◆ getBidiRegions()

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

◆ getSentences()

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

◆ getUtf8Words()

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

◆ getWords()

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

◆ hasControlFlag()

bool SkUnicode::hasControlFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 67 of file SkUnicode.cpp.

67 {
69}
FlutterSemanticsFlag flags

◆ hasGraphemeStartFlag()

bool SkUnicode::hasGraphemeStartFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 63 of file SkUnicode.cpp.

◆ hasHardLineBreakFlag()

bool SkUnicode::hasHardLineBreakFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 55 of file SkUnicode.cpp.

◆ hasPartOfWhiteSpaceBreakFlag()

bool SkUnicode::hasPartOfWhiteSpaceBreakFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 71 of file SkUnicode.cpp.

◆ hasSoftLineBreakFlag()

bool SkUnicode::hasSoftLineBreakFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 59 of file SkUnicode.cpp.

◆ hasTabulationFlag()

bool SkUnicode::hasTabulationFlag ( SkUnicode::CodeUnitFlags  flags)
static

Definition at line 51 of file SkUnicode.cpp.

◆ isControl()

virtual bool SkUnicode::isControl ( SkUnichar  utf8)
pure virtual

◆ isEmoji()

virtual bool SkUnicode::isEmoji ( SkUnichar  utf8)
pure virtual

Returns if a code point may start an emoji sequence. Returns true for '#', '*', and '0'-'9' since they may start an emoji sequence. To determine if a list of code points begins with an emoji sequence, use getEmojiSequence.

Implemented in SkUnicode_icu, SkUnicodeHardCodedCharProperties, and SkUnicode_icu4x.

◆ isEmojiComponent()

virtual bool SkUnicode::isEmojiComponent ( SkUnichar  utf8)
pure virtual

◆ isEmojiModifier()

virtual bool SkUnicode::isEmojiModifier ( SkUnichar  utf8)
pure virtual

◆ isEmojiModifierBase()

virtual bool SkUnicode::isEmojiModifierBase ( SkUnichar  utf8)
pure virtual

◆ isHardBreak()

virtual bool SkUnicode::isHardBreak ( SkUnichar  utf8)
pure virtual

◆ isIdeographic()

virtual bool SkUnicode::isIdeographic ( SkUnichar  utf8)
pure virtual

◆ isRegionalIndicator()

virtual bool SkUnicode::isRegionalIndicator ( SkUnichar  utf8)
pure virtual

◆ isSpace()

virtual bool SkUnicode::isSpace ( SkUnichar  utf8)
pure virtual

◆ isTabulation()

virtual bool SkUnicode::isTabulation ( SkUnichar  utf8)
pure virtual

◆ isWhitespace()

virtual bool SkUnicode::isWhitespace ( SkUnichar  utf8)
pure virtual

◆ makeBidiIterator() [1/2]

virtual std::unique_ptr< SkBidiIterator > SkUnicode::makeBidiIterator ( const char  text[],
int  count,
SkBidiIterator::Direction   
)
pure virtual

◆ makeBidiIterator() [2/2]

virtual std::unique_ptr< SkBidiIterator > SkUnicode::makeBidiIterator ( const uint16_t  text[],
int  count,
SkBidiIterator::Direction   
)
pure virtual

◆ makeBreakIterator() [1/2]

virtual std::unique_ptr< SkBreakIterator > SkUnicode::makeBreakIterator ( BreakType  type)
pure virtual

◆ makeBreakIterator() [2/2]

virtual std::unique_ptr< SkBreakIterator > SkUnicode::makeBreakIterator ( const char  locale[],
BreakType  breakType 
)
pure virtual

◆ reorderVisual()

virtual void SkUnicode::reorderVisual ( const BidiLevel  runLevels[],
int  levelsCount,
int32_t  logicalFromVisual[] 
)
pure virtual

◆ toUpper() [1/2]

virtual SkString SkUnicode::toUpper ( const SkString )
pure virtual

◆ toUpper() [2/2]

virtual SkString SkUnicode::toUpper ( const SkString ,
const char *  locale 
)
pure virtual

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