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#include "ParagraphLineFetcherImpl.h" 16cb93a386Sopenharmony_cinamespace skia { 17cb93a386Sopenharmony_cinamespace textlayout { 18cb93a386Sopenharmony_ciParagraphLineFetcherImpl::ParagraphLineFetcherImpl(std::unique_ptr<Paragraph>&& paragraph) 19cb93a386Sopenharmony_ci : fRootParagraph(move(paragraph)) { 20cb93a386Sopenharmony_ci fRootParagraph->initUnicodeText(); 21cb93a386Sopenharmony_ci fUnicodeSize = fRootParagraph->unicodeText().size(); 22cb93a386Sopenharmony_ci} 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ciParagraphLineFetcherImpl::~ParagraphLineFetcherImpl() = default; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_cisize_t ParagraphLineFetcherImpl::getLineBreak(size_t startIndex, SkScalar width) const { 27cb93a386Sopenharmony_ci if (startIndex >= fRootParagraph->unicodeText().size()) { 28cb93a386Sopenharmony_ci return 0; 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci auto newParagraph = fRootParagraph->createCroppedCopy(startIndex); 31cb93a386Sopenharmony_ci if (newParagraph == nullptr) { 32cb93a386Sopenharmony_ci return 0; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci newParagraph->layout(width); 35cb93a386Sopenharmony_ci auto textRange = newParagraph->getActualTextRange(0, true); 36cb93a386Sopenharmony_ci if (textRange == EMPTY_TEXT) { 37cb93a386Sopenharmony_ci return 0; 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci auto count = newParagraph->getUnicodeIndex(textRange.end); 40cb93a386Sopenharmony_ci auto unicodeText = newParagraph->unicodeText(); 41cb93a386Sopenharmony_ci if (count < unicodeText.size() && unicodeText[count] == '\n') { 42cb93a386Sopenharmony_ci count++; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci return count; 45cb93a386Sopenharmony_ci} 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_cistd::unique_ptr<TextLineBase> ParagraphLineFetcherImpl::createLine(size_t startIndex, 48cb93a386Sopenharmony_ci size_t count) { 49cb93a386Sopenharmony_ci auto unicodeSize = fRootParagraph->unicodeText().size(); 50cb93a386Sopenharmony_ci if (startIndex >= unicodeSize) { 51cb93a386Sopenharmony_ci return nullptr; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci if (startIndex + count >= unicodeSize || count == 0) { 54cb93a386Sopenharmony_ci count = unicodeSize - startIndex; 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci fTempParagraph = fRootParagraph->createCroppedCopy(startIndex, count); 57cb93a386Sopenharmony_ci if (fTempParagraph == nullptr) { 58cb93a386Sopenharmony_ci return nullptr; 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci fTempParagraph->layout(SkFloatBits_GetFiniteFloat()); 61cb93a386Sopenharmony_ci auto textLine = fTempParagraph->GetTextLines(); 62cb93a386Sopenharmony_ci if (textLine.empty()) { 63cb93a386Sopenharmony_ci return nullptr; 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci return move(textLine.front()); 66cb93a386Sopenharmony_ci} 67cb93a386Sopenharmony_ci} // namespace textlayout 68cb93a386Sopenharmony_ci} // namespace skia 69