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