• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 
16 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
18 
19 #include "bridge/declarative_frontend/declarative_frontend.h"
20 #include "bridge/declarative_frontend/engine/functions/js_drag_function.h"
21 #include "bridge/declarative_frontend/engine/js_object_template.h"
22 #include "bridge/declarative_frontend/frontend_delegate_declarative.h"
23 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_image_data.h"
24 #include "bridge/js_frontend/engine/jsi/ark_js_runtime.h"
25 #include "core/components/common/properties/text_style.h"
26 #include "core/components_ng/pattern/text_field/text_field_model.h"
27 #include "core/interfaces/native/node/node_api.h"
28 
29 namespace OHOS::Rosen {
30     class BrightnessBlender;
31 }
32 
33 namespace OHOS::Ace::NG {
34 using ArkUIRuntimeCallInfo = panda::JsiRuntimeCallInfo;
35 
36 enum class ResourceType : uint32_t {
37     COLOR = 10001,
38     FLOAT,
39     STRING,
40     PLURAL,
41     BOOLEAN,
42     INTARRAY,
43     INTEGER,
44     PATTERN,
45     STRARRAY,
46     MEDIA = 20000,
47     RAWFILE = 30000,
48     NONE = 40000
49 };
50 class ArkTSUtils {
51 public:
52     static uint32_t ColorAlphaAdapt(uint32_t origin);
53     static bool ParseJsColorContent(const EcmaVM* vm, const Local<JSValueRef>& value);
54     static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
55     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
56     static bool ParseJsColorAlpha(
57         const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, const Color& defaultColor);
58     static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
59     static void CompleteResourceObject(const EcmaVM* vm, Local<panda::ObjectRef>& jsObj);
60     static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result);
61     static bool ParseJsDimensionFromResource(
62         const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result);
63     static bool ParseJsDimensionFromResourceNG(
64         const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result);
65     static bool ParseStringArray(
66         const EcmaVM* vm, const Local<JSValueRef>& arg, std::string* array, int32_t defaultLength);
67     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result);
68     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, uint32_t &result);
69     static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result);
70     static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result);
71     static bool ParseAllBorder(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
72     static bool ParseAllRadius(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
73     static bool ParseJsFontFamiliesToString(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string &result);
74     static bool ParseJsFontFamilies(
75         const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result);
76     static bool ParseJsFontFamiliesFromResource(
77         const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result);
78     static bool ParseJsLengthMetrics(
79         const EcmaVM *vm, const Local<JSValueRef> &obj, CalcDimension &result);
80     static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
81         DimensionUnit defaultUnit, bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
82     static bool ParseJsDimensionFp(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
83         bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
84     static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
85         bool isSupportPercent = true);
86     static bool ParseJsDimensionVp(
87         const EcmaVM *vm, const Local<JSValueRef> &value, CalcDimension &result, bool enableCheckInvalidvalue = true);
88     static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
89         DimensionUnit defaultUnit, bool isSupportPercent = true);
90     static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
91         bool isSupportPercent = true);
92     static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
93     static bool ParseJsMediaFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
94     static bool ParseResourceToDouble(const EcmaVM* vm, const Local<JSValueRef>& jsValue, double& result);
95     static bool ParseJsIntegerArray(const EcmaVM* vm, Local<JSValueRef> values, std::vector<uint32_t>& result);
96     static bool ParseJsString(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
97     static panda::Local<panda::ObjectRef> GetContext(EcmaVM* vm);
98     static bool ParseJsStringFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
99     static uint32_t parseShadowColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
100     static uint32_t parseShadowFill(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
101     static uint32_t parseShadowType(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
102     static double parseShadowRadius(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
103     static double parseShadowOffset(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
104     static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId);
105     static void ParseJsSymbolFontFamilyName(const EcmaVM *vm, const Local<JSValueRef> &jsValue,
106         std::string& customFamilyName);
107     static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args,
108         std::optional<CalcDimension>& optionalDimension);
109     static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args,
110         std::optional<CalcDimension>& optionalDimension);
111     static void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim,
112         std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units);
113     template <class T>
ParseArray(const EcmaVM * vm,const Local<JSValueRef> & arg,T * array,int32_t defaultLength,std::function<T (const EcmaVM *,const Local<JSValueRef> &)> getValue)114     static bool ParseArray(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength,
115         std::function<T(const EcmaVM *, const Local<JSValueRef> &)> getValue)
116     {
117         CHECK_NULL_RETURN(vm, false);
118         CHECK_NULL_RETURN(array, false);
119         if (defaultLength <= 0) {
120             return false;
121         }
122         auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg);
123         if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
124             return false;
125         }
126         int32_t length = static_cast<int32_t>(handle->Length(vm));
127         if (length != defaultLength) {
128             return false;
129         }
130         for (int32_t i = 0; i < length; i++) {
131             auto value = handle->GetValueAt(vm, arg, i);
132             *(array + i) = getValue(vm, value);
133         }
134         return true;
135     }
136     static void GetStringFromJS(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
137     static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result);
138     static void GetJsMediaBundleInfo(
139         const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& bundleName, std::string& moduleName);
140     static bool ParseJsColorStrategy(
141         const EcmaVM* vm, const Local<JSValueRef>& value, ForegroundColorStrategy& strategy);
142     static bool GetJsPasswordIcon(const EcmaVM *vm, const Local<JSValueRef> &jsOnIconSrc,
143         const Local<JSValueRef> &jsOffIconSrc, PasswordIcon& result);
144     static void ParsePadding(
145         const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result);
146     static bool ParseResponseRegion(
147         const EcmaVM* vm, const Local<JSValueRef>& jsValue,
148         ArkUI_Float32* regionValues, int32_t* regionUnits, uint32_t length);
149     template<typename T>
GetTheme()150     static RefPtr<T> GetTheme()
151     {
152         auto pipelineContext = PipelineBase::GetCurrentContext();
153         CHECK_NULL_RETURN(pipelineContext, nullptr);
154         auto themeManager = pipelineContext->GetThemeManager();
155         CHECK_NULL_RETURN(themeManager, nullptr);
156         return themeManager->GetTheme<T>();
157     }
IsPercentStr(std::string & percent)158     static bool IsPercentStr(std::string& percent)
159     {
160         if (percent.find("%") != std::string::npos) {
161             size_t index = percent.find("%");
162             percent = percent.substr(0, index);
163             return true;
164         }
165         return false;
166     }
167     static BorderStyle ConvertBorderStyle(int32_t value);
168     static void PushOuterBorderDimensionVector(
169         const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options);
170     static void ParseOuterBorderWidth(
171         ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values);
172     static void PushOuterBorderColorVector(
173         const std::optional<Color>& valueColor, std::vector<uint32_t> &options);
174     static void ParseOuterBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo,
175         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
176     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
177         EcmaVM* vm, std::vector<ArkUI_Float32>& values, int32_t argsIndex);
178     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
179         EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex);
180     static void PushOuterBorderStyleVector(
181         const std::optional<BorderStyle>& value, std::vector<uint32_t> &options);
182     static void ParseOuterBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo,
183         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
184     static void SetBorderWidthArray(const EcmaVM* vm, const Local<JSValueRef>& args,
185         ArkUI_Float32 values[], int units[], int index);
186     static ArkUISizeType ParseJsToArkUISize(const EcmaVM *vm, const Local<JSValueRef> &arg);
187     static bool IsDrawable(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
188     static RefPtr<PixelMap> GetDrawablePixmap(const EcmaVM* vm, Local<JSValueRef> obj);
189     static Rosen::BrightnessBlender* CreateRSBrightnessBlenderFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
190     static void* UnwrapNapiValue(const EcmaVM* vm, const Local<JSValueRef>& obj);
191 #if !defined(PREVIEW)
192     static RefPtr<PixelMap> CreatePixelMapFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
193 #endif
194     static bool ParseSelectionMenuOptions(ArkUIRuntimeCallInfo* info, const EcmaVM* vm,
195         NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClickCallback);
196     static void ParseOnCreateMenu(const EcmaVM* vm, FrameNode* frameNode,
197         const Local<JSValueRef>& jsValueOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback);
198     static Local<panda::ArrayRef> CreateJsSystemMenuItems(
199         const EcmaVM* vm, const std::vector<NG::MenuItemParam>& systemMenuItems);
200     static Local<panda::ObjectRef> CreateJsTextMenuItem(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
201     static Local<panda::ObjectRef> CreateJsTextMenuId(const EcmaVM* vm, const std::string& id);
202     static void WrapMenuParams(
203         const EcmaVM* vm, std::vector<NG::MenuOptionsParam>& menuParams, const Local<JSValueRef>& menuItems);
204     static void ParseOnMenuItemClick(const EcmaVM* vm, FrameNode* frameNode,
205         const Local<JSValueRef>& jsValueOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClickCallback);
206     static Local<panda::ArrayRef> CreateJsOnMenuItemClick(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
207     static Local<panda::ObjectRef> CreateJsTextRange(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
208     static void ThrowError(const EcmaVM* vm, const std::string& msg, int32_t code);
209     static bool CheckKeysPressed(
210         const EcmaVM* vm, const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes);
211     static Local<JSValueRef> GetModifierKeyState(
212         ArkUIRuntimeCallInfo* info, const std::vector<KeyCode>& pressedKeyCodes);
213     static Local<JSValueRef> JsGetModifierKeyState(ArkUIRuntimeCallInfo* info);
214     static Local<JSValueRef> JsGetHorizontalAxisValue(ArkUIRuntimeCallInfo* info);
215     static Local<JSValueRef> JsGetVerticalAxisValue(ArkUIRuntimeCallInfo* info);
216 
217     template<typename T>
ToJSValueWithVM(const EcmaVM * vm,T val)218     static panda::Local<panda::JSValueRef> ToJSValueWithVM(const EcmaVM* vm, T val)
219     {
220         if constexpr (std::is_same_v<T, bool>) {
221             return panda::BooleanRef::New(vm, val);
222         } else if constexpr (std::is_same_v<T, int64_t>) {
223             return panda::NumberRef::New(vm, val);
224         } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) {
225             return panda::IntegerRef::New(vm, val);
226         } else if constexpr (std::is_unsigned_v<T>) {
227             return panda::IntegerRef::NewFromUnsigned(vm, val);
228         } else if constexpr (std::is_floating_point_v<T>) {
229             return panda::NumberRef::New(vm, val);
230         } else if constexpr (std::is_same_v<T, std::string>) {
231             return panda::StringRef::NewFromUtf8(vm, val.c_str());
232         } else if constexpr (std::is_same_v<T, const char*>) {
233             return panda::StringRef::NewFromUtf8(vm, val);
234         } else if constexpr (std::is_same_v<T, std::u16string>) {
235             return panda::StringRef::NewFromUtf16(vm, val.c_str());
236         }
237         return panda::JSValueRef::Undefined(vm);
238     }
239     static Local<panda::ArrayRef> ChoosePointToJSValue(const EcmaVM* vm, std::vector<int> input);
240 };
241 } // namespace OHOS::Ace::NG
242 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
243