• 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 
51 struct NodeInfo {
52     std::string nodeTag;
53     ColorMode localColorMode;
54 };
55 class ArkTSUtils {
56 public:
57     static uint32_t ColorAlphaAdapt(uint32_t origin);
58     static bool ParseJsColorContent(const EcmaVM* vm, const Local<JSValueRef>& value);
59     static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
60     static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result,
61         RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo);
62     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& color,
63         std::vector<RefPtr<ResourceObject>>& resObjs, const NodeInfo& nodeInfo);
64     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
65     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result,
66         RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo);
67     static bool ParseJsColorAlpha(
68         const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, const Color& defaultColor);
69     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value,
70         Color& result, const Color& defaultColor, RefPtr<ResourceObject>& resourceObject,
71         const NodeInfo& nodeInfo);
72     static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
73     static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result,
74         RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo);
75     static void CompleteResourceObject(const EcmaVM* vm, Local<panda::ObjectRef>& jsObj);
76     static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result);
77     static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result,
78         RefPtr<ResourceObject>& resourceObject);
79     static bool ParseColorMetricsToColor(const EcmaVM *vm, const Local<JSValueRef> &jsValue, Color& result);
80     static bool ParseColorMetricsToColor(
81         const EcmaVM* vm, const Local<JSValueRef>& jsValue, Color& result, RefPtr<ResourceObject>& resourceObject);
82     static bool ParseJsDimensionFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj,
83         DimensionUnit dimensionUnit, CalcDimension& result, RefPtr<ResourceObject>& resourceObject);
84     static bool ParseJsDimensionFromResourceByName(const EcmaVM* vm, const Local<panda::ObjectRef>& jsObj,
85         DimensionUnit dimensionUnit, const RefPtr<ResourceObject>& resourceObject,
86         const RefPtr<ResourceWrapper>& resourceWrapper, CalcDimension& result);
87     static bool ParseJsDimensionFromResourceNG(
88         const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result);
89     static bool ParseJsDimensionFromResourceNG(const EcmaVM* vm, const Local<JSValueRef>& jsObj,
90         DimensionUnit dimensionUnit, CalcDimension& result, RefPtr<ResourceObject>& resourceObject);
91     static bool ParseJsDimensionNGFromResourceByName(const EcmaVM* vm, const Local<panda::ObjectRef>& jsObj,
92         DimensionUnit dimensionUnit, const RefPtr<ResourceObject>& resourceObject,
93         const RefPtr<ResourceWrapper>& resourceWrapper, CalcDimension& result);
94     static bool ParseStringArray(
95         const EcmaVM* vm, const Local<JSValueRef>& arg, std::string* array, int32_t defaultLength);
96     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result);
97     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, uint32_t &result);
98     static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result);
99     static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result,
100         RefPtr<ResourceObject>& resourceObject);
101     static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result);
102     static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result,
103         RefPtr<ResourceObject>& resourceObject);
104     static bool ParseAllBorder(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
105     static bool ParseAllBorder(const EcmaVM* vm, const Local<JSValueRef>& args, CalcDimension& result,
106         RefPtr<ResourceObject>& resourceObject);
107     static bool ParseAllRadius(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
108     static bool ParseAllRadius(const EcmaVM* vm, const Local<JSValueRef>& args, CalcDimension& result,
109         RefPtr<ResourceObject>& resourceObject);
110     static bool ParseJsFontFamiliesToString(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string &result);
111     static bool ParseJsFontFamiliesToString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result,
112         RefPtr<ResourceObject>& resourceObject);
113     static bool ParseJsFontFamilies(
114         const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result);
115     static bool ParseJsFontFamilies(const EcmaVM *vm, const Local<JSValueRef> &jsValue,
116         std::vector<std::string> &result, RefPtr<ResourceObject>& resourceObject);
117     static bool ParseJsFontFamiliesFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue,
118         std::vector<std::string> &result, RefPtr<ResourceObject>& resourceObject);
119     static bool ParseJsLengthMetrics(
120         const EcmaVM *vm, const Local<JSValueRef> &obj, CalcDimension &result);
121     static bool ParseJsLengthMetrics(const EcmaVM* vm, const Local<JSValueRef>& jsValue, CalcDimension& result,
122         RefPtr<ResourceObject>& resourceObj);
123     static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
124         DimensionUnit defaultUnit, bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
125     static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
126         DimensionUnit defaultUnit, RefPtr<ResourceObject>& resourceObject,
127         bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
128     static bool ParseJsDimensionFp(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
129         bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
130     static bool ParseJsDimensionFp(const EcmaVM* vm, const Local<JSValueRef>& jsValue, CalcDimension& result,
131         RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
132     static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
133         bool isSupportPercent = true);
134     static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
135         RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true);
136     static bool ParseJsDimensionVp(
137         const EcmaVM *vm, const Local<JSValueRef> &value, CalcDimension &result, bool enableCheckInvalidvalue = true);
138     static bool ParseJsDimensionVp(const EcmaVM* vm, const Local<JSValueRef>& value,
139         CalcDimension& result, RefPtr<ResourceObject>& resourceObject, bool enableCheckInvalidvalue = true);
140     static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
141         DimensionUnit defaultUnit, bool isSupportPercent = true);
142     static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
143         DimensionUnit defaultUnit, RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true);
144     static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
145         bool isSupportPercent = true);
146     static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
147         RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true);
148     static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
149     static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result,
150         RefPtr<ResourceObject>& resourceObject);
151     static bool ParseJsMediaFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result,
152         RefPtr<ResourceObject>& resourceObject);
153     static bool ParseResourceToDouble(const EcmaVM* vm, const Local<JSValueRef>& jsValue, double& result,
154         RefPtr<ResourceObject>& resourceObject);
155     static bool ParseJsIntegerArray(const EcmaVM* vm, Local<JSValueRef> values, std::vector<uint32_t>& result);
156     static bool ParseJsString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result,
157         RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo);
158     static bool ParseJsString(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
159     static bool ParseJsString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result,
160         RefPtr<ResourceObject>& resourceObject);
161     static panda::Local<panda::ObjectRef> GetContext(EcmaVM* vm);
162     static bool ParseJsStringFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
163     static bool ParseJsStringFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result,
164         RefPtr<ResourceObject>& resourceObject);
165     static uint32_t parseShadowColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
166     static uint32_t parseShadowColorWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
167         RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt);
168     static uint32_t parseShadowFill(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
169     static uint32_t parseShadowType(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
170     static double parseShadowRadius(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
171     static double parseShadowRadiusWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
172         RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt);
173     static double parseShadowOffset(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
174     static double parseShadowOffsetWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
175         RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt);
176     static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId);
177     static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId,
178         RefPtr<ResourceObject>& resourceObject);
179     static void ParseJsSymbolFontFamilyName(const EcmaVM *vm, const Local<JSValueRef> &jsValue,
180         std::string& customFamilyName);
181     static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args,
182         std::optional<CalcDimension>& optionalDimension);
183     static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args,
184         std::optional<CalcDimension>& optionalDimension, RefPtr<ResourceObject>& resObj);
185     static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args,
186         std::optional<CalcDimension>& optionalDimension);
187     static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args,
188         std::optional<CalcDimension>& optionalDimension, RefPtr<ResourceObject>& resObj);
189     static void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim,
190         std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units);
191     static void ParseJsAngle(const EcmaVM* vm, const Local<JSValueRef>& value, std::optional<float>& angle);
192     static bool ParseJsInt32(const EcmaVM* vm, const Local<JSValueRef>& value, int32_t& result);
193     static bool ParseJsIgnoresLayoutSafeAreaEdges(
194         const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUI_Int32>& edges);
195     static void ParseGradientCenter(const EcmaVM* vm, const Local<JSValueRef>& value,
196         std::vector<ArkUIInt32orFloat32>& values, std::vector<RefPtr<ResourceObject>>& vectorResObj);
197     static void ParseGradientCenter(
198         const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& values);
199     static void ParseGradientColorStops(const EcmaVM *vm, const Local<JSValueRef>& value,
200         std::vector<ArkUIInt32orFloat32>& colors, std::vector<RefPtr<ResourceObject>>& vectorResObj,
201         const NodeInfo& nodeInfo);
202     static void ParseGradientColorStops(
203         const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& colors);
204     static void ParseGradientAngle(
205         const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& values);
206     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)207     static bool ParseArray(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength,
208         std::function<T(const EcmaVM *, const Local<JSValueRef> &)> getValue)
209     {
210         CHECK_NULL_RETURN(vm, false);
211         CHECK_NULL_RETURN(array, false);
212         if (defaultLength <= 0) {
213             return false;
214         }
215         auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg);
216         if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
217             return false;
218         }
219         int32_t length = static_cast<int32_t>(handle->Length(vm));
220         if (length != defaultLength) {
221             return false;
222         }
223         for (int32_t i = 0; i < length; i++) {
224             auto value = handle->GetValueAt(vm, arg, i);
225             *(array + i) = getValue(vm, value);
226         }
227         return true;
228     }
229     template <class T>
230     static bool ParseArrayWithResObj(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength,
231         std::function<T(const EcmaVM *, const Local<JSValueRef> &, RefPtr<ResourceObject> &,
232         const std::optional<NodeInfo> &)> getValue,
233         std::vector<RefPtr<ResourceObject>>& resObjArray, const std::optional<NodeInfo>& nodeInfo = std::nullopt)
234     {
235         CHECK_NULL_RETURN(vm, false);
236         CHECK_NULL_RETURN(array, false);
237         if (defaultLength <= 0) {
238             return false;
239         }
240         auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg);
241         if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
242             return false;
243         }
244         int32_t length = static_cast<int32_t>(handle->Length(vm));
245         if (length != defaultLength) {
246             return false;
247         }
248         for (int32_t i = 0; i < length; i++) {
249             RefPtr<ResourceObject> resObj;
250             auto value = handle->GetValueAt(vm, arg, i);
251             *(array + i) = getValue(vm, value, resObj, nodeInfo);
252             resObjArray.emplace_back(resObj);
253         }
254         return true;
255     }
256     static void GetStringFromJS(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
257     static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result);
258     static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
259         RefPtr<ResourceObject>& resourceObject);
260     static void GetJsMediaBundleInfo(
261         const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& bundleName, std::string& moduleName);
262     static bool ParseJsColorStrategy(
263         const EcmaVM* vm, const Local<JSValueRef>& value, ForegroundColorStrategy& strategy);
264     static bool GetJsPasswordIcon(const EcmaVM *vm, const Local<JSValueRef> &jsOnIconSrc,
265         const Local<JSValueRef> &jsOffIconSrc, PasswordIcon& result);
266     static void ParsePadding(
267         const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result);
268     static void ParsePadding(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen,
269                              ArkUISizeType& result, RefPtr<ResourceObject>& resObj);
270     static bool ParseResponseRegion(
271         const EcmaVM* vm, const Local<JSValueRef>& jsValue,
272         ArkUI_Float32* regionValues, int32_t* regionUnits, uint32_t length);
273     template<typename T>
GetTheme()274     static RefPtr<T> GetTheme()
275     {
276         auto pipelineContext = PipelineBase::GetCurrentContext();
277         CHECK_NULL_RETURN(pipelineContext, nullptr);
278         auto themeManager = pipelineContext->GetThemeManager();
279         CHECK_NULL_RETURN(themeManager, nullptr);
280         return themeManager->GetTheme<T>();
281     }
IsPercentStr(std::string & percent)282     static bool IsPercentStr(std::string& percent)
283     {
284         if (percent.find("%") != std::string::npos) {
285             size_t index = percent.find("%");
286             percent = percent.substr(0, index);
287             return true;
288         }
289         return false;
290     }
291     static BorderStyle ConvertBorderStyle(int32_t value);
292     static void PushOuterBorderDimensionVector(
293         const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options);
294     static void ParseOuterBorderWidth(
295         ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values);
296     static void PushOuterBorderColorVector(
297         const std::optional<Color>& valueColor, std::vector<uint32_t> &options);
298     static void ParseOuterBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo,
299         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
300     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
301         EcmaVM* vm, std::vector<ArkUI_Float32>& values, int32_t argsIndex);
302     static void SetTextBackgroundStyle(std::shared_ptr<TextBackgroundStyle> style, Color color,
303         RefPtr<ResourceObject>& colorResObj, const ArkUI_Float32* values, const ArkUI_Int32* units);
304     static void RegisterTextBackgroundStyleResource(std::shared_ptr<TextBackgroundStyle> textBackgroundStyle,
305         RefPtr<ResourceObject>& resObjTopLeft, RefPtr<ResourceObject>& resObjTopRight,
306         RefPtr<ResourceObject>& resObjBottomLeft, RefPtr<ResourceObject>& resObjBottomRight);
307     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
308         EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex);
309     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
310         EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex,
311         std::shared_ptr<TextBackgroundStyle> style);
312     static void PushOuterBorderStyleVector(
313         const std::optional<BorderStyle>& value, std::vector<uint32_t> &options);
314     static void ParseOuterBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo,
315         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
316     static void SetBorderWidthArray(const EcmaVM* vm, const Local<JSValueRef>& args,
317         ArkUI_Float32 values[], int units[], int index);
318     static ArkUISizeType ParseJsToArkUISize(const EcmaVM *vm, const Local<JSValueRef> &arg,
319         RefPtr<ResourceObject>& resObj);
320     static bool IsDrawable(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
321     static RefPtr<PixelMap> GetDrawablePixmap(const EcmaVM* vm, Local<JSValueRef> obj);
322     static Rosen::BrightnessBlender* CreateRSBrightnessBlenderFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
323     static void* UnwrapNapiValue(const EcmaVM* vm, const Local<JSValueRef>& obj);
324 #if !defined(PREVIEW)
325     static RefPtr<PixelMap> CreatePixelMapFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
326 #endif
327     static bool ParseSelectionMenuOptions(ArkUIRuntimeCallInfo* info, const EcmaVM* vm,
328         NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClickCallback,
329         NG::OnPrepareMenuCallback& onPrepareMenuCallback);
330     static void ParseOnCreateMenu(const EcmaVM* vm, FrameNode* frameNode,
331         const Local<JSValueRef>& jsValueOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback);
332     static void ParseOnPrepareMenu(const EcmaVM* vm, FrameNode* frameNode,
333         const Local<JSValueRef>& jsValueOnPrepareMenu, NG::OnPrepareMenuCallback& onPrepareMenuCallback);
334     static Local<panda::ArrayRef> CreateJsSystemMenuItems(
335         const EcmaVM* vm, const std::vector<NG::MenuItemParam>& systemMenuItems);
336     static Local<panda::ObjectRef> CreateJsTextMenuItem(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
337     static Local<panda::ObjectRef> CreateJsTextMenuId(const EcmaVM* vm, const std::string& id);
338     static void ParseMenuItemsSymbolId(
339         const EcmaVM* vm, const Local<JSValueRef>& jsStartIcon, NG::MenuOptionsParam& menuOptionsParam);
340     static void WrapMenuParams(const EcmaVM* vm, std::vector<NG::MenuOptionsParam>& menuParams,
341         const Local<JSValueRef>& menuItems, bool enableLabelInfo);
342     static void ParseOnMenuItemClick(const EcmaVM* vm, FrameNode* frameNode,
343         const Local<JSValueRef>& jsValueOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClickCallback);
344     static Local<panda::ArrayRef> CreateJsOnMenuItemClick(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
345     static Local<panda::ObjectRef> CreateJsTextRange(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
346     static void ThrowError(const EcmaVM* vm, const std::string& msg, int32_t code);
347     static bool CheckKeysPressed(
348         const EcmaVM* vm, const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes);
349     static Local<JSValueRef> GetModifierKeyState(
350         ArkUIRuntimeCallInfo* info, const std::vector<KeyCode>& pressedKeyCodes);
351     static Local<JSValueRef> JsGetModifierKeyState(ArkUIRuntimeCallInfo* info);
352     static Local<JSValueRef> JsGetHorizontalAxisValue(ArkUIRuntimeCallInfo* info);
353     static Local<JSValueRef> JsGetVerticalAxisValue(ArkUIRuntimeCallInfo* info);
354 
355     template<typename T>
ToJSValueWithVM(const EcmaVM * vm,T val)356     static panda::Local<panda::JSValueRef> ToJSValueWithVM(const EcmaVM* vm, T val)
357     {
358         if constexpr (std::is_same_v<T, bool>) {
359             return panda::BooleanRef::New(vm, val);
360         } else if constexpr (std::is_same_v<T, int64_t>) {
361             return panda::NumberRef::New(vm, val);
362         } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) {
363             return panda::IntegerRef::New(vm, val);
364         } else if constexpr (std::is_unsigned_v<T>) {
365             return panda::IntegerRef::NewFromUnsigned(vm, val);
366         } else if constexpr (std::is_floating_point_v<T>) {
367             return panda::NumberRef::New(vm, val);
368         } else if constexpr (std::is_same_v<T, std::string>) {
369             return panda::StringRef::NewFromUtf8(vm, val.c_str());
370         } else if constexpr (std::is_same_v<T, const char*>) {
371             return panda::StringRef::NewFromUtf8(vm, val);
372         } else if constexpr (std::is_same_v<T, std::u16string>) {
373             return panda::StringRef::NewFromUtf16(vm, val.c_str());
374         }
375         return panda::JSValueRef::Undefined(vm);
376     }
377     static Local<panda::ArrayRef> ChoosePointToJSValue(const EcmaVM* vm, std::vector<int> input);
378     static NodeInfo MakeNativeNodeInfo(ArkUINodeHandle node);
379     static void CompleteResourceObjectFromColor(RefPtr<ResourceObject>& resObj,
380         Color& color, bool state, const NodeInfo& nodeInfo);
381 
382 private:
383     static bool CheckDarkResource(const RefPtr<ResourceObject>& resObj);
384 };
385 } // namespace OHOS::Ace::NG
386 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
387