• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
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 #include "ani_common.h"
16 #include "ani_paragraph_style_converter.h"
17 #include "ani_text_style_converter.h"
18 #include "ani_text_utils.h"
19 #include "utils/text_log.h"
20 
21 namespace OHOS::Text::ANI {
22 using namespace OHOS::Rosen;
ParseParagraphStyleToNative(ani_env * env,ani_object obj)23 std::unique_ptr<TypographyStyle> AniParagraphStyleConverter::ParseParagraphStyleToNative(ani_env* env, ani_object obj)
24 {
25     ani_class cls = nullptr;
26     ani_status ret = env->FindClass(ANI_INTERFACE_PARAGRAPH_STYLE, &cls);
27     if (ret != ANI_OK) {
28         TEXT_LOGE("Failed to find class, ret %{public}d", ret);
29         return nullptr;
30     }
31     ani_boolean isObj = false;
32     ret = env->Object_InstanceOf(obj, cls, &isObj);
33     if (!isObj) {
34         TEXT_LOGE("Object mismatch, ret %{public}d", ret);
35         return nullptr;
36     }
37     std::unique_ptr<TypographyStyle> paragraphStyle = std::make_unique<TypographyStyle>();
38 
39     double maxLines;
40     if (AniTextUtils::ReadOptionalDoubleField(env, obj, "maxLines", maxLines) == ANI_OK) {
41         paragraphStyle->maxLines = static_cast<size_t>(maxLines);
42     }
43 
44     ani_ref textStyleRef = nullptr;
45     TextStyle textStyle;
46     if (AniTextUtils::ReadOptionalField(env, obj, "textStyle", textStyleRef) == ANI_OK && textStyleRef != nullptr) {
47         ret = AniTextStyleConverter::ParseTextStyleToNative(env, reinterpret_cast<ani_object>(textStyleRef), textStyle);
48         if (ret == ANI_OK) {
49             paragraphStyle->SetTextStyle(textStyle);
50         }
51     }
52     paragraphStyle->ellipsis = textStyle.ellipsis;
53     paragraphStyle->ellipsisModal = textStyle.ellipsisModal;
54 
55     AniTextUtils::ReadOptionalEnumField(env, obj, "textDirection", paragraphStyle->textDirection);
56     AniTextUtils::ReadOptionalEnumField(env, obj, "align", paragraphStyle->textAlign);
57     AniTextUtils::ReadOptionalEnumField(env, obj, "wordBreak", paragraphStyle->wordBreakType);
58     AniTextUtils::ReadOptionalEnumField(env, obj, "breakStrategy", paragraphStyle->breakStrategy);
59     AniTextUtils::ReadOptionalEnumField(env, obj, "textHeightBehavior", paragraphStyle->textHeightBehavior);
60 
61     ani_ref strutStyleRef = nullptr;
62     if (AniTextUtils::ReadOptionalField(env, obj, "strutStyle", strutStyleRef) == ANI_OK && strutStyleRef != nullptr) {
63         ParseParagraphStyleStrutStyleToNative(env, reinterpret_cast<ani_object>(strutStyleRef), paragraphStyle);
64     }
65 
66     ani_ref tabRef = nullptr;
67     if (AniTextUtils::ReadOptionalField(env, obj, "tab", tabRef) == ANI_OK && tabRef != nullptr) {
68         ParseTextTabToNative(env, reinterpret_cast<ani_object>(tabRef), paragraphStyle->tab);
69     }
70 
71     return paragraphStyle;
72 }
73 
ParseParagraphStyleStrutStyleToNative(ani_env * env,ani_object obj,std::unique_ptr<TypographyStyle> & paragraphStyle)74 void AniParagraphStyleConverter::ParseParagraphStyleStrutStyleToNative(
75     ani_env* env, ani_object obj, std::unique_ptr<TypographyStyle>& paragraphStyle)
76 {
77     AniTextUtils::ReadOptionalEnumField(env, obj, "fontStyle", paragraphStyle->lineStyleFontStyle);
78     AniTextUtils::ReadOptionalEnumField(env, obj, "fontWidth", paragraphStyle->lineStyleFontWidth);
79     AniTextUtils::ReadOptionalEnumField(env, obj, "fontWeight", paragraphStyle->lineStyleFontWeight);
80 
81     AniTextUtils::ReadOptionalDoubleField(env, obj, "fontSize", paragraphStyle->lineStyleFontSize);
82     AniTextUtils::ReadOptionalDoubleField(env, obj, "height", paragraphStyle->lineStyleHeightScale);
83     AniTextUtils::ReadOptionalDoubleField(env, obj, "leading", paragraphStyle->lineStyleSpacingScale);
84 
85     AniTextUtils::ReadOptionalBoolField(env, obj, "forceHeight", paragraphStyle->lineStyleOnly);
86     AniTextUtils::ReadOptionalBoolField(env, obj, "enabled", paragraphStyle->useLineStyle);
87     AniTextUtils::ReadOptionalBoolField(env, obj, "heightOverride", paragraphStyle->lineStyleHeightOnly);
88     AniTextUtils::ReadOptionalBoolField(env, obj, "halfLeading", paragraphStyle->lineStyleHalfLeading);
89 
90     ani_ref aniFontFamilies = nullptr;
91     if (AniTextUtils::ReadOptionalField(env, obj, "fontFamilies", aniFontFamilies) == ANI_OK
92         && aniFontFamilies != nullptr) {
93         std::vector<std::string> fontFamilies;
94         ParseFontFamiliesToNative(env, reinterpret_cast<ani_array_ref>(aniFontFamilies), fontFamilies);
95         paragraphStyle->lineStyleFontFamilies = fontFamilies;
96     }
97 }
98 
ParseTextTabToNative(ani_env * env,ani_object obj,TextTab & textTab)99 void AniParagraphStyleConverter::ParseTextTabToNative(ani_env* env, ani_object obj, TextTab& textTab)
100 {
101     AniTextUtils::ReadOptionalEnumField(env, obj, "alignment", textTab.alignment);
102     ani_double tempLocation;
103     env->Object_GetPropertyByName_Double(obj, "location", &tempLocation);
104     textTab.location = static_cast<float>(tempLocation);
105 }
106 
ParseFontFamiliesToNative(ani_env * env,ani_array_ref obj,std::vector<std::string> & fontFamilies)107 void AniParagraphStyleConverter::ParseFontFamiliesToNative(
108     ani_env* env, ani_array_ref obj, std::vector<std::string>& fontFamilies)
109 {
110     ani_size arrayLength = 0;
111     env->Array_GetLength(obj, &arrayLength);
112     for (size_t i = 0; i < arrayLength; i++) {
113         ani_ref tempString = nullptr;
114         env->Array_Get_Ref(obj, i, &tempString);
115         ani_string aniTempString = reinterpret_cast<ani_string>(tempString);
116         std::string fontFamiliesString;
117         ani_status ret = AniTextUtils::AniToStdStringUtf8(env, aniTempString, fontFamiliesString);
118         if (ret == ANI_OK) {
119             fontFamilies.push_back(fontFamiliesString);
120         }
121     }
122 }
123 } // namespace OHOS::Text::ANI
124