1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC. 2cb93a386Sopenharmony_ci 3cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 4cb93a386Sopenharmony_ci#include "modules/skparagraph/include/FontCollection.h" 5cb93a386Sopenharmony_ci#include "modules/skparagraph/include/Paragraph.h" 6cb93a386Sopenharmony_ci#include "modules/skparagraph/include/ParagraphBuilder.h" 7cb93a386Sopenharmony_ci#include "modules/skparagraph/include/ParagraphStyle.h" 8cb93a386Sopenharmony_ci#include "modules/skparagraph/include/TextStyle.h" 9cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphBuilderImpl.h" 10cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphImpl.h" 11cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 12cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphLineFetcherImpl.h" 13cb93a386Sopenharmony_ci#include "utils/text_trace.h" 14cb93a386Sopenharmony_ci#endif 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci#include <algorithm> 17cb93a386Sopenharmony_ci#include <utility> 18cb93a386Sopenharmony_ci#include "src/core/SkStringUtils.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cinamespace skia { 21cb93a386Sopenharmony_cinamespace textlayout { 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cistd::unique_ptr<ParagraphBuilder> ParagraphBuilder::make( 24cb93a386Sopenharmony_ci const ParagraphStyle& style, sk_sp<FontCollection> fontCollection) { 25cb93a386Sopenharmony_ci return ParagraphBuilderImpl::make(style, fontCollection); 26cb93a386Sopenharmony_ci} 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_cistd::unique_ptr<ParagraphBuilder> ParagraphBuilderImpl::make( 29cb93a386Sopenharmony_ci const ParagraphStyle& style, sk_sp<FontCollection> fontCollection) { 30cb93a386Sopenharmony_ci return std::make_unique<ParagraphBuilderImpl>(style, fontCollection); 31cb93a386Sopenharmony_ci} 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_cistd::unique_ptr<ParagraphBuilder> ParagraphBuilderImpl::make( 34cb93a386Sopenharmony_ci const ParagraphStyle& style, sk_sp<FontCollection> fontCollection, std::unique_ptr<SkUnicode> unicode) { 35cb93a386Sopenharmony_ci if (nullptr == unicode) { 36cb93a386Sopenharmony_ci return nullptr; 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci return std::make_unique<ParagraphBuilderImpl>(style, fontCollection, std::move(unicode)); 39cb93a386Sopenharmony_ci} 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ciParagraphBuilderImpl::ParagraphBuilderImpl( 42cb93a386Sopenharmony_ci const ParagraphStyle& style, sk_sp<FontCollection> fontCollection, std::unique_ptr<SkUnicode> unicode) 43cb93a386Sopenharmony_ci : ParagraphBuilder(style, fontCollection) 44cb93a386Sopenharmony_ci , fUtf8() 45cb93a386Sopenharmony_ci , fFontCollection(std::move(fontCollection)) 46cb93a386Sopenharmony_ci , fParagraphStyle(style) 47cb93a386Sopenharmony_ci , fUnicode(std::move(unicode)) 48cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 49cb93a386Sopenharmony_ci , fTextIsFinalized(false) 50cb93a386Sopenharmony_ci , fUsingClientInfo(false) 51cb93a386Sopenharmony_ci#endif 52cb93a386Sopenharmony_ci{ 53cb93a386Sopenharmony_ci startStyledBlock(); 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ciParagraphBuilderImpl::ParagraphBuilderImpl( 57cb93a386Sopenharmony_ci const ParagraphStyle& style, sk_sp<FontCollection> fontCollection) 58cb93a386Sopenharmony_ci : ParagraphBuilderImpl(style, fontCollection, SkUnicode::Make()) 59cb93a386Sopenharmony_ci{ } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ciParagraphBuilderImpl::~ParagraphBuilderImpl() = default; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_civoid ParagraphBuilderImpl::pushStyle(const TextStyle& style) { 64cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 65cb93a386Sopenharmony_ci TEXT_TRACE_FUNC(); 66cb93a386Sopenharmony_ci#endif 67cb93a386Sopenharmony_ci fTextStyles.push_back(style); 68cb93a386Sopenharmony_ci if (!fStyledBlocks.empty() && fStyledBlocks.back().fRange.end == fUtf8.size() && 69cb93a386Sopenharmony_ci fStyledBlocks.back().fStyle == style) { 70cb93a386Sopenharmony_ci // Just continue with the same style 71cb93a386Sopenharmony_ci } else { 72cb93a386Sopenharmony_ci // Go with the new style 73cb93a386Sopenharmony_ci startStyledBlock(); 74cb93a386Sopenharmony_ci } 75cb93a386Sopenharmony_ci} 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_civoid ParagraphBuilderImpl::pop() { 78cb93a386Sopenharmony_ci if (!fTextStyles.empty()) { 79cb93a386Sopenharmony_ci fTextStyles.pop_back(); 80cb93a386Sopenharmony_ci } else { 81cb93a386Sopenharmony_ci // In this case we use paragraph style and skip Pop operation 82cb93a386Sopenharmony_ci SkDEBUGF("SkParagraphBuilder.Pop() called too many times.\n"); 83cb93a386Sopenharmony_ci } 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci this->startStyledBlock(); 86cb93a386Sopenharmony_ci} 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciconst TextStyle& ParagraphBuilderImpl::internalPeekStyle() { 89cb93a386Sopenharmony_ci if (fTextStyles.empty()) { 90cb93a386Sopenharmony_ci return fParagraphStyle.getTextStyle(); 91cb93a386Sopenharmony_ci } else { 92cb93a386Sopenharmony_ci return fTextStyles.back(); 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci} 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ciTextStyle ParagraphBuilderImpl::peekStyle() { 97cb93a386Sopenharmony_ci return this->internalPeekStyle(); 98cb93a386Sopenharmony_ci} 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_civoid ParagraphBuilderImpl::addText(const std::u16string& text) { 101cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 102cb93a386Sopenharmony_ci SkASSERT(!fTextIsFinalized); 103cb93a386Sopenharmony_ci#endif 104cb93a386Sopenharmony_ci auto utf8 = SkUnicode::convertUtf16ToUtf8(text); 105cb93a386Sopenharmony_ci fUtf8.append(utf8); 106cb93a386Sopenharmony_ci} 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_civoid ParagraphBuilderImpl::addText(const char* text) { 109cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 110cb93a386Sopenharmony_ci SkASSERT(!fTextIsFinalized); 111cb93a386Sopenharmony_ci#endif 112cb93a386Sopenharmony_ci fUtf8.append(text); 113cb93a386Sopenharmony_ci} 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_civoid ParagraphBuilderImpl::addText(const char* text, size_t len) { 116cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 117cb93a386Sopenharmony_ci SkASSERT(!fTextIsFinalized); 118cb93a386Sopenharmony_ci#endif 119cb93a386Sopenharmony_ci fUtf8.append(text, len); 120cb93a386Sopenharmony_ci} 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_civoid ParagraphBuilderImpl::addPlaceholder(const PlaceholderStyle& placeholderStyle) { 123cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 124cb93a386Sopenharmony_ci SkASSERT(!fTextIsFinalized); 125cb93a386Sopenharmony_ci#endif 126cb93a386Sopenharmony_ci addPlaceholder(placeholderStyle, false); 127cb93a386Sopenharmony_ci} 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_civoid ParagraphBuilderImpl::addPlaceholder(const PlaceholderStyle& placeholderStyle, bool lastOne) { 130cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 131cb93a386Sopenharmony_ci // The very last placeholder is added automatically 132cb93a386Sopenharmony_ci // and only AFTER finalize() is called 133cb93a386Sopenharmony_ci SkASSERT(!fTextIsFinalized && !lastOne); 134cb93a386Sopenharmony_ci#endif 135cb93a386Sopenharmony_ci if (!fUtf8.isEmpty() && !lastOne) { 136cb93a386Sopenharmony_ci // We keep the very last text style 137cb93a386Sopenharmony_ci this->endRunIfNeeded(); 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci BlockRange stylesBefore(fPlaceholders.empty() ? 0 : fPlaceholders.back().fBlocksBefore.end + 1, 141cb93a386Sopenharmony_ci fStyledBlocks.size()); 142cb93a386Sopenharmony_ci TextRange textBefore(fPlaceholders.empty() ? 0 : fPlaceholders.back().fRange.end, 143cb93a386Sopenharmony_ci fUtf8.size()); 144cb93a386Sopenharmony_ci auto start = fUtf8.size(); 145cb93a386Sopenharmony_ci auto topStyle = internalPeekStyle(); 146cb93a386Sopenharmony_ci if (!lastOne) { 147cb93a386Sopenharmony_ci pushStyle(topStyle.cloneForPlaceholder()); 148cb93a386Sopenharmony_ci addText(std::u16string(1ull, 0xFFFC)); 149cb93a386Sopenharmony_ci pop(); 150cb93a386Sopenharmony_ci } 151cb93a386Sopenharmony_ci auto end = fUtf8.size(); 152cb93a386Sopenharmony_ci fPlaceholders.emplace_back(start, end, placeholderStyle, topStyle, stylesBefore, textBefore); 153cb93a386Sopenharmony_ci} 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_civoid ParagraphBuilderImpl::endRunIfNeeded() { 156cb93a386Sopenharmony_ci if (fStyledBlocks.empty()) { 157cb93a386Sopenharmony_ci return; 158cb93a386Sopenharmony_ci } 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci auto& last = fStyledBlocks.back(); 161cb93a386Sopenharmony_ci if (last.fRange.start == fUtf8.size()) { 162cb93a386Sopenharmony_ci fStyledBlocks.pop_back(); 163cb93a386Sopenharmony_ci } else { 164cb93a386Sopenharmony_ci last.fRange.end = fUtf8.size(); 165cb93a386Sopenharmony_ci } 166cb93a386Sopenharmony_ci} 167cb93a386Sopenharmony_ci 168cb93a386Sopenharmony_civoid ParagraphBuilderImpl::startStyledBlock() { 169cb93a386Sopenharmony_ci endRunIfNeeded(); 170cb93a386Sopenharmony_ci fStyledBlocks.emplace_back(fUtf8.size(), fUtf8.size(), internalPeekStyle()); 171cb93a386Sopenharmony_ci} 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_civoid ParagraphBuilderImpl::finalize() { 174cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 175cb93a386Sopenharmony_ci if (fTextIsFinalized) { 176cb93a386Sopenharmony_ci return; 177cb93a386Sopenharmony_ci } 178cb93a386Sopenharmony_ci#endif 179cb93a386Sopenharmony_ci if (!fUtf8.isEmpty()) { 180cb93a386Sopenharmony_ci this->endRunIfNeeded(); 181cb93a386Sopenharmony_ci } 182cb93a386Sopenharmony_ci 183cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 184cb93a386Sopenharmony_ci fTextIsFinalized = true; 185cb93a386Sopenharmony_ci#endif 186cb93a386Sopenharmony_ci} 187cb93a386Sopenharmony_ci 188cb93a386Sopenharmony_cistd::unique_ptr<Paragraph> ParagraphBuilderImpl::Build() { 189cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 190cb93a386Sopenharmony_ci TEXT_TRACE_FUNC(); 191cb93a386Sopenharmony_ci#endif 192cb93a386Sopenharmony_ci this->finalize(); 193cb93a386Sopenharmony_ci // Add one fake placeholder with the rest of the text 194cb93a386Sopenharmony_ci this->addPlaceholder(PlaceholderStyle(), true); 195cb93a386Sopenharmony_ci 196cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 197cb93a386Sopenharmony_ci SkASSERT(fUsingClientInfo); 198cb93a386Sopenharmony_ci fUTF8IndexForUTF16Index.clear(); 199cb93a386Sopenharmony_ci fUTF16IndexForUTF8Index.clear(); 200cb93a386Sopenharmony_ci // This is the place where SkUnicode is paired with SkParagraph 201cb93a386Sopenharmony_ci fUnicode = SkUnicode::MakeClientBasedUnicode(this->getText(), 202cb93a386Sopenharmony_ci std::move(fWordsUtf16), 203cb93a386Sopenharmony_ci std::move(fGraphemeBreaksUtf8), 204cb93a386Sopenharmony_ci std::move(fLineBreaksUtf8)); 205cb93a386Sopenharmony_ci#endif 206cb93a386Sopenharmony_ci 207cb93a386Sopenharmony_ci SkASSERT(fUnicode); 208cb93a386Sopenharmony_ci return std::make_unique<ParagraphImpl>( 209cb93a386Sopenharmony_ci fUtf8, fParagraphStyle, fStyledBlocks, fPlaceholders, fFontCollection, fUnicode); 210cb93a386Sopenharmony_ci} 211cb93a386Sopenharmony_ci 212cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 213cb93a386Sopenharmony_cistd::unique_ptr<ParagraphLineFetcher> ParagraphBuilderImpl::buildLineFetcher() { 214cb93a386Sopenharmony_ci if (fUtf8.isEmpty()) { 215cb93a386Sopenharmony_ci return nullptr; 216cb93a386Sopenharmony_ci } 217cb93a386Sopenharmony_ci fParagraphStyle.setMaxLines(1); 218cb93a386Sopenharmony_ci fParagraphStyle.setTextAlign(TextAlign::kLeft); 219cb93a386Sopenharmony_ci return std::make_unique<ParagraphLineFetcherImpl>(Build()); 220cb93a386Sopenharmony_ci} 221cb93a386Sopenharmony_ci#endif 222cb93a386Sopenharmony_ci 223cb93a386Sopenharmony_ciSkSpan<char> ParagraphBuilderImpl::getText() { 224cb93a386Sopenharmony_ci this->finalize(); 225cb93a386Sopenharmony_ci return SkSpan<char>(fUtf8.isEmpty() ? nullptr : const_cast<char*>(fUtf8.c_str()), fUtf8.size()); 226cb93a386Sopenharmony_ci} 227cb93a386Sopenharmony_ci 228cb93a386Sopenharmony_ciconst ParagraphStyle& ParagraphBuilderImpl::getParagraphStyle() const { 229cb93a386Sopenharmony_ci return fParagraphStyle; 230cb93a386Sopenharmony_ci} 231cb93a386Sopenharmony_ci 232cb93a386Sopenharmony_civoid ParagraphBuilderImpl::ensureUTF16Mapping() { 233cb93a386Sopenharmony_ci fillUTF16MappingOnce([&] { 234cb93a386Sopenharmony_ci SkUnicode::extractUtfConversionMapping( 235cb93a386Sopenharmony_ci this->getText(), 236cb93a386Sopenharmony_ci [&](size_t index) { fUTF8IndexForUTF16Index.emplace_back(index); }, 237cb93a386Sopenharmony_ci [&](size_t index) { fUTF16IndexForUTF8Index.emplace_back(index); }); 238cb93a386Sopenharmony_ci }); 239cb93a386Sopenharmony_ci} 240cb93a386Sopenharmony_ci 241cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 242cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setWordsUtf8(std::vector<SkUnicode::Position> wordsUtf8) { 243cb93a386Sopenharmony_ci ensureUTF16Mapping(); 244cb93a386Sopenharmony_ci std::vector<SkUnicode::Position> wordsUtf16; 245cb93a386Sopenharmony_ci for (SkUnicode::Position indexUtf8: wordsUtf8) { 246cb93a386Sopenharmony_ci wordsUtf16.emplace_back(fUTF16IndexForUTF8Index[indexUtf8]); 247cb93a386Sopenharmony_ci } 248cb93a386Sopenharmony_ci setWordsUtf16(wordsUtf16); 249cb93a386Sopenharmony_ci} 250cb93a386Sopenharmony_ci 251cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setWordsUtf16(std::vector<SkUnicode::Position> wordsUtf16) { 252cb93a386Sopenharmony_ci fUsingClientInfo = true; 253cb93a386Sopenharmony_ci fWordsUtf16 = std::move(wordsUtf16); 254cb93a386Sopenharmony_ci} 255cb93a386Sopenharmony_ci 256cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setGraphemeBreaksUtf8(std::vector<SkUnicode::Position> graphemeBreaksUtf8) { 257cb93a386Sopenharmony_ci fUsingClientInfo = true; 258cb93a386Sopenharmony_ci fGraphemeBreaksUtf8 = std::move(graphemeBreaksUtf8); 259cb93a386Sopenharmony_ci} 260cb93a386Sopenharmony_ci 261cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setGraphemeBreaksUtf16(std::vector<SkUnicode::Position> graphemeBreaksUtf16) { 262cb93a386Sopenharmony_ci ensureUTF16Mapping(); 263cb93a386Sopenharmony_ci std::vector<SkUnicode::Position> graphemeBreaksUtf8; 264cb93a386Sopenharmony_ci for (SkUnicode::Position indexUtf16: graphemeBreaksUtf16) { 265cb93a386Sopenharmony_ci graphemeBreaksUtf8.emplace_back(fUTF8IndexForUTF16Index[indexUtf16]); 266cb93a386Sopenharmony_ci } 267cb93a386Sopenharmony_ci setGraphemeBreaksUtf8(graphemeBreaksUtf8); 268cb93a386Sopenharmony_ci} 269cb93a386Sopenharmony_ci 270cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setLineBreaksUtf8(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf8) { 271cb93a386Sopenharmony_ci fUsingClientInfo = true; 272cb93a386Sopenharmony_ci fLineBreaksUtf8 = std::move(lineBreaksUtf8); 273cb93a386Sopenharmony_ci} 274cb93a386Sopenharmony_ci 275cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setLineBreaksUtf16(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf16) { 276cb93a386Sopenharmony_ci ensureUTF16Mapping(); 277cb93a386Sopenharmony_ci std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf8; 278cb93a386Sopenharmony_ci for (SkUnicode::LineBreakBefore lineBreakUtf16: lineBreaksUtf16) { 279cb93a386Sopenharmony_ci lineBreaksUtf8.emplace_back(SkUnicode::LineBreakBefore( 280cb93a386Sopenharmony_ci fUTF8IndexForUTF16Index[lineBreakUtf16.pos], lineBreakUtf16.breakType)); 281cb93a386Sopenharmony_ci } 282cb93a386Sopenharmony_ci setLineBreaksUtf8(lineBreaksUtf8); 283cb93a386Sopenharmony_ci} 284cb93a386Sopenharmony_ci#else 285cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setWordsUtf8(std::vector<SkUnicode::Position> wordsUtf8) { 286cb93a386Sopenharmony_ci SkASSERT(false); 287cb93a386Sopenharmony_ci} 288cb93a386Sopenharmony_ci 289cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setWordsUtf16(std::vector<SkUnicode::Position> wordsUtf16) { 290cb93a386Sopenharmony_ci SkASSERT(false); 291cb93a386Sopenharmony_ci} 292cb93a386Sopenharmony_ci 293cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setGraphemeBreaksUtf8(std::vector<SkUnicode::Position> graphemesUtf8) { 294cb93a386Sopenharmony_ci SkASSERT(false); 295cb93a386Sopenharmony_ci} 296cb93a386Sopenharmony_ci 297cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setGraphemeBreaksUtf16(std::vector<SkUnicode::Position> graphemesUtf16) { 298cb93a386Sopenharmony_ci SkASSERT(false); 299cb93a386Sopenharmony_ci} 300cb93a386Sopenharmony_ci 301cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setLineBreaksUtf8(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf8) { 302cb93a386Sopenharmony_ci SkASSERT(false); 303cb93a386Sopenharmony_ci} 304cb93a386Sopenharmony_ci 305cb93a386Sopenharmony_civoid ParagraphBuilderImpl::setLineBreaksUtf16(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf16) { 306cb93a386Sopenharmony_ci SkASSERT(false); 307cb93a386Sopenharmony_ci} 308cb93a386Sopenharmony_ci#endif 309cb93a386Sopenharmony_ci 310cb93a386Sopenharmony_civoid ParagraphBuilderImpl::Reset() { 311cb93a386Sopenharmony_ci 312cb93a386Sopenharmony_ci fTextStyles.reset(); 313cb93a386Sopenharmony_ci fUtf8.reset(); 314cb93a386Sopenharmony_ci fStyledBlocks.reset(); 315cb93a386Sopenharmony_ci fPlaceholders.reset(); 316cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 317cb93a386Sopenharmony_ci fUTF8IndexForUTF16Index.clear(); 318cb93a386Sopenharmony_ci fUTF16IndexForUTF8Index.clear(); 319cb93a386Sopenharmony_ci fWordsUtf16.clear(); 320cb93a386Sopenharmony_ci fGraphemeBreaksUtf8.clear(); 321cb93a386Sopenharmony_ci fLineBreaksUtf8.clear(); 322cb93a386Sopenharmony_ci fTextIsFinalized = false; 323cb93a386Sopenharmony_ci#endif 324cb93a386Sopenharmony_ci startStyledBlock(); 325cb93a386Sopenharmony_ci} 326cb93a386Sopenharmony_ci 327cb93a386Sopenharmony_cibool ParagraphBuilderImpl::RequiresClientICU() { 328cb93a386Sopenharmony_ci#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION) 329cb93a386Sopenharmony_ci return true; 330cb93a386Sopenharmony_ci#else 331cb93a386Sopenharmony_ci return false; 332cb93a386Sopenharmony_ci#endif 333cb93a386Sopenharmony_ci} 334cb93a386Sopenharmony_ci 335cb93a386Sopenharmony_ci} // namespace textlayout 336cb93a386Sopenharmony_ci} // namespace skia 337