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