xref: /aosp_15_r20/external/skia/modules/skunicode/src/SkUnicode.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2022 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 #include "include/private/base/SkDebug.h"
8 #include "include/private/base/SkTemplates.h"
9 #include "modules/skunicode/include/SkUnicode.h"
10 #include "src/base/SkBitmaskEnum.h"
11 
12 using namespace skia_private;
13 
convertUtf16ToUtf8(const char16_t * utf16,int utf16Units)14 SkString SkUnicode::convertUtf16ToUtf8(const char16_t* utf16, int utf16Units) {
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 }
27 
convertUtf16ToUtf8(const std::u16string & utf16)28 SkString SkUnicode::convertUtf16ToUtf8(const std::u16string& utf16) {
29     return convertUtf16ToUtf8(utf16.c_str(), utf16.size());
30 }
31 
convertUtf8ToUtf16(const char * utf8,int utf8Units)32 std::u16string SkUnicode::convertUtf8ToUtf16(const char* utf8, int utf8Units) {
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 }
46 
convertUtf8ToUtf16(const SkString & utf8)47 std::u16string SkUnicode::convertUtf8ToUtf16(const SkString& utf8) {
48     return convertUtf8ToUtf16(utf8.c_str(), utf8.size());
49 }
50 
hasTabulationFlag(SkUnicode::CodeUnitFlags flags)51 bool SkUnicode::hasTabulationFlag(SkUnicode::CodeUnitFlags flags) {
52     return (flags & SkUnicode::kTabulation) == SkUnicode::kTabulation;
53 }
54 
hasHardLineBreakFlag(SkUnicode::CodeUnitFlags flags)55 bool SkUnicode::hasHardLineBreakFlag(SkUnicode::CodeUnitFlags flags) {
56     return (flags & SkUnicode::kHardLineBreakBefore) == SkUnicode::kHardLineBreakBefore;
57 }
58 
hasSoftLineBreakFlag(SkUnicode::CodeUnitFlags flags)59 bool SkUnicode::hasSoftLineBreakFlag(SkUnicode::CodeUnitFlags flags) {
60     return (flags & SkUnicode::kSoftLineBreakBefore) == SkUnicode::kSoftLineBreakBefore;
61 }
62 
hasGraphemeStartFlag(SkUnicode::CodeUnitFlags flags)63 bool SkUnicode::hasGraphemeStartFlag(SkUnicode::CodeUnitFlags flags) {
64     return (flags & SkUnicode::kGraphemeStart) == SkUnicode::kGraphemeStart;
65 }
66 
hasControlFlag(SkUnicode::CodeUnitFlags flags)67 bool SkUnicode::hasControlFlag(SkUnicode::CodeUnitFlags flags) {
68     return (flags & SkUnicode::kControl) == SkUnicode::kControl;
69 }
70 
hasPartOfWhiteSpaceBreakFlag(SkUnicode::CodeUnitFlags flags)71 bool SkUnicode::hasPartOfWhiteSpaceBreakFlag(SkUnicode::CodeUnitFlags flags) {
72     return (flags & SkUnicode::kPartOfWhiteSpaceBreak) == SkUnicode::kPartOfWhiteSpaceBreak;
73 }
74