1/*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "modules/skparagraph/src/TextLineBaseImpl.h"
17
18namespace skia {
19namespace textlayout {
20#ifdef OHOS_SUPPORT
21TextLineBaseImpl::TextLineBaseImpl(std::unique_ptr<TextLine> visitorTextLine)
22                : fVisitorTextLine(std::move(visitorTextLine))
23#else
24TextLineBaseImpl::TextLineBaseImpl(TextLine* visitorTextLine) : fVisitorTextLine(visitorTextLine)
25#endif
26{
27}
28
29size_t TextLineBaseImpl::getGlyphCount() const
30{
31    if (!fVisitorTextLine) {
32        return 0;
33    }
34    fVisitorTextLine->ensureTextBlobCachePopulated();
35    return fVisitorTextLine->getGlyphCount();
36}
37
38std::vector<std::unique_ptr<RunBase>> TextLineBaseImpl::getGlyphRuns() const
39{
40    if (!fVisitorTextLine) {
41        return {};
42    }
43    fVisitorTextLine->ensureTextBlobCachePopulated();
44    return fVisitorTextLine->getGlyphRuns();
45}
46
47SkRange<size_t> TextLineBaseImpl::getTextRange() const
48{
49    if (!fVisitorTextLine) {
50        return {};
51    }
52    return fVisitorTextLine->text();
53}
54
55void TextLineBaseImpl::paint(ParagraphPainter* painter, SkScalar x, SkScalar y)
56{
57    if (!fVisitorTextLine || !painter) {
58        return;
59    }
60    return fVisitorTextLine->paint(painter, x, y);
61}
62
63#ifdef OHOS_SUPPORT
64std::unique_ptr<TextLineBase> TextLineBaseImpl::createTruncatedLine(double width, EllipsisModal ellipsisMode,
65    const std::string& ellipsisStr)
66{
67    if (!fVisitorTextLine) {
68        return nullptr;
69    }
70
71    return fVisitorTextLine->createTruncatedLine(width, ellipsisMode, ellipsisStr);
72}
73
74double TextLineBaseImpl::getTypographicBounds(double* ascent, double* descent, double* leading) const
75{
76    if (!fVisitorTextLine) {
77        return 0.0;
78    }
79
80    return fVisitorTextLine->getTypographicBounds(ascent, descent, leading);
81}
82
83RSRect TextLineBaseImpl::getImageBounds() const
84{
85    if (!fVisitorTextLine) {
86        return {};
87    }
88
89    return fVisitorTextLine->getImageBounds();
90}
91
92double TextLineBaseImpl::getTrailingSpaceWidth() const
93{
94    if (!fVisitorTextLine) {
95        return 0.0;
96    }
97
98    return fVisitorTextLine->getTrailingSpaceWidth();
99}
100
101int32_t TextLineBaseImpl::getStringIndexForPosition(SkPoint point) const
102{
103    if (!fVisitorTextLine) {
104        return 0;
105    }
106
107    return fVisitorTextLine->getStringIndexForPosition(point);
108}
109
110double TextLineBaseImpl::getOffsetForStringIndex(int32_t index) const
111{
112    if (!fVisitorTextLine) {
113        return 0.0;
114    }
115
116    return fVisitorTextLine->getOffsetForStringIndex(index);
117}
118
119std::map<int32_t, double> TextLineBaseImpl::getIndexAndOffsets(bool& isHardBreak) const
120{
121    if (!fVisitorTextLine) {
122        return {};
123    }
124
125    return fVisitorTextLine->getIndexAndOffsets(isHardBreak);
126}
127
128double TextLineBaseImpl::getAlignmentOffset(double alignmentFactor, double alignmentWidth) const
129{
130    if (!fVisitorTextLine) {
131        return 0.0;
132    }
133
134    return fVisitorTextLine->getAlignmentOffset(alignmentFactor, alignmentWidth);
135}
136#endif
137}  // namespace textlayout
138}  // namespace skia