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