1 /*
2 * Copyright (c) 2021-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 #include "bridge/declarative_frontend/jsview/js_matrix2d.h"
17 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
18 #include "core/components/common/properties/paint_state.h"
19 #include "frameworks/core/components_ng/render/adapter/matrix2d.h"
20
21 namespace OHOS::Ace::Framework {
22 constexpr int JS_MATRIX2D_PARAMETER_COUNTS_0 = 0;
23 constexpr int JS_MATRIX2D_PARAMETER_COUNTS_1 = 1;
24 constexpr int JS_MATRIX2D_PARAMETER_COUNTS_2 = 2;
25 constexpr int JS_MATRIX2D_PARAMETER_COUNTS_3 = 3;
26
Constructor(const JSCallbackInfo & info)27 void JSMatrix2d::Constructor(const JSCallbackInfo& info)
28 {
29 auto matrix2d = Referenced::MakeRefPtr<JSMatrix2d>();
30 matrix2d->IncRefCount();
31 info.SetReturnValue(Referenced::RawPtr(matrix2d));
32 }
33
Destructor(JSMatrix2d * matrix2d)34 void JSMatrix2d::Destructor(JSMatrix2d* matrix2d)
35 {
36 if (matrix2d != nullptr) {
37 matrix2d->DecRefCount();
38 }
39 }
40
JSBind(BindingTarget globalObj)41 void JSMatrix2d::JSBind(BindingTarget globalObj)
42 {
43 JSClass<JSMatrix2d>::Declare("Matrix2D");
44 JSClass<JSMatrix2d>::CustomProperty("scaleX", &JSMatrix2d::JsGetScaleX, &JSMatrix2d::JsSetScaleX);
45 JSClass<JSMatrix2d>::CustomProperty("rotateY", &JSMatrix2d::JsGetRotateY, &JSMatrix2d::JsSetRotateY);
46 JSClass<JSMatrix2d>::CustomProperty("rotateX", &JSMatrix2d::JsGetRotateX, &JSMatrix2d::JsSetRotateX);
47 JSClass<JSMatrix2d>::CustomProperty("scaleY", &JSMatrix2d::JsGetScaleY, &JSMatrix2d::JsSetScaleY);
48 JSClass<JSMatrix2d>::CustomProperty("translateX", &JSMatrix2d::JsGetTranslateX, &JSMatrix2d::JsSetTranslateX);
49 JSClass<JSMatrix2d>::CustomProperty("translateY", &JSMatrix2d::JsGetTranslateY, &JSMatrix2d::JsSetTranslateY);
50 JSClass<JSMatrix2d>::CustomMethod("identity", &JSMatrix2d::JsIdentity);
51 JSClass<JSMatrix2d>::CustomMethod("invert", &JSMatrix2d::JsInvert);
52 JSClass<JSMatrix2d>::CustomMethod("rotate", &JSMatrix2d::JsRotate);
53 JSClass<JSMatrix2d>::CustomMethod("translate", &JSMatrix2d::JsTranslate);
54 JSClass<JSMatrix2d>::CustomMethod("scale", &JSMatrix2d::JsScale);
55 JSClass<JSMatrix2d>::CustomMethod("multiply", &JSMatrix2d::JSMultiply);
56
57 JSClass<JSMatrix2d>::Bind(globalObj, JSMatrix2d::Constructor, JSMatrix2d::Destructor);
58 }
59
JsSetScaleX(const JSCallbackInfo & info)60 void JSMatrix2d::JsSetScaleX(const JSCallbackInfo& info)
61 {
62 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
63 LOGE("The argv is wrong.");
64 return;
65 }
66 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
67 double scaleX = 0;
68 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], scaleX);
69 transform_.scaleX = scaleX;
70 }
71 }
72
JsSetRotateY(const JSCallbackInfo & info)73 void JSMatrix2d::JsSetRotateY(const JSCallbackInfo& info)
74 {
75 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
76 LOGE("The argv is wrong.");
77 return;
78 }
79 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
80 double rotateY = 0;
81 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], rotateY);
82 transform_.skewY = rotateY;
83 }
84 }
85
JsSetRotateX(const JSCallbackInfo & info)86 void JSMatrix2d::JsSetRotateX(const JSCallbackInfo& info)
87 {
88 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
89 LOGE("The argv is wrong.");
90 return;
91 }
92 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
93 double rotateX = 0;
94 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], rotateX);
95 transform_.skewX = rotateX;
96 }
97 }
98
JsSetScaleY(const JSCallbackInfo & info)99 void JSMatrix2d::JsSetScaleY(const JSCallbackInfo& info)
100 {
101 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
102 LOGE("The argv is wrong.");
103 return;
104 }
105 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
106 double scaleY = 0;
107 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], scaleY);
108 transform_.scaleY = scaleY;
109 }
110 }
111
JsSetTranslateX(const JSCallbackInfo & info)112 void JSMatrix2d::JsSetTranslateX(const JSCallbackInfo& info)
113 {
114 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
115 LOGE("The argv is wrong.");
116 return;
117 }
118 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
119 double translateX = 0;
120 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], translateX);
121 translateX = SystemProperties::Vp2Px(translateX);
122 transform_.translateX = translateX;
123 }
124 }
125
JsSetTranslateY(const JSCallbackInfo & info)126 void JSMatrix2d::JsSetTranslateY(const JSCallbackInfo& info)
127 {
128 if (info.Length() != JS_MATRIX2D_PARAMETER_COUNTS_1) {
129 LOGE("The argv is wrong.");
130 return;
131 }
132 if (info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
133 double translateY = 0;
134 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], translateY);
135 translateY = SystemProperties::Vp2Px(translateY);
136 transform_.translateY = translateY;
137 }
138 }
139
JsGetScaleX(const JSCallbackInfo & info)140 void JSMatrix2d::JsGetScaleX(const JSCallbackInfo& info)
141 {
142 auto returnValue = JSVal(ToJSValue(transform_.scaleX));
143 auto returnPtr = JSRef<JSVal>::Make(returnValue);
144 info.SetReturnValue(returnPtr);
145 }
146
JsGetRotateY(const JSCallbackInfo & info)147 void JSMatrix2d::JsGetRotateY(const JSCallbackInfo& info)
148 {
149 auto returnValue = JSVal(ToJSValue(transform_.skewY));
150 auto returnPtr = JSRef<JSVal>::Make(returnValue);
151 info.SetReturnValue(returnPtr);
152 }
153
JsGetRotateX(const JSCallbackInfo & info)154 void JSMatrix2d::JsGetRotateX(const JSCallbackInfo& info)
155 {
156 auto returnValue = JSVal(ToJSValue(transform_.skewX));
157 auto returnPtr = JSRef<JSVal>::Make(returnValue);
158 info.SetReturnValue(returnPtr);
159 }
160
JsGetScaleY(const JSCallbackInfo & info)161 void JSMatrix2d::JsGetScaleY(const JSCallbackInfo& info)
162 {
163 auto returnValue = JSVal(ToJSValue(transform_.scaleY));
164 auto returnPtr = JSRef<JSVal>::Make(returnValue);
165 info.SetReturnValue(returnPtr);
166 }
167
JsGetTranslateX(const JSCallbackInfo & info)168 void JSMatrix2d::JsGetTranslateX(const JSCallbackInfo& info)
169 {
170 double translateX = SystemProperties::Px2Vp(transform_.translateX);
171 auto returnValue = JSVal(ToJSValue(translateX));
172 auto returnPtr = JSRef<JSVal>::Make(returnValue);
173 info.SetReturnValue(returnPtr);
174 }
175
JsGetTranslateY(const JSCallbackInfo & info)176 void JSMatrix2d::JsGetTranslateY(const JSCallbackInfo& info)
177 {
178 double translateY = SystemProperties::Px2Vp(transform_.translateY);
179 auto returnValue = JSVal(ToJSValue(translateY));
180 auto returnPtr = JSRef<JSVal>::Make(returnValue);
181 info.SetReturnValue(returnPtr);
182 }
183
JsIdentity(const JSCallbackInfo & info)184 void JSMatrix2d::JsIdentity(const JSCallbackInfo& info)
185 {
186 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_0) {
187 LOGE("The argv is wrong.");
188 return;
189 }
190 NG::Matrix2D::Identity(transform_);
191 info.SetReturnValue(info.This());
192 }
193
JsInvert(const JSCallbackInfo & info)194 void JSMatrix2d::JsInvert(const JSCallbackInfo& info)
195 {
196 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_0) {
197 LOGE("The argv is wrong.");
198 return;
199 }
200 bool retValue = NG::Matrix2D::Invert(transform_);
201 if (!retValue) {
202 transform_.scaleX = NAN;
203 transform_.scaleY = NAN;
204 transform_.skewX = NAN;
205 transform_.skewY = NAN;
206 transform_.translateX = NAN;
207 transform_.translateY = NAN;
208 }
209 info.SetReturnValue(info.This());
210 }
211
JsRotate(const JSCallbackInfo & info)212 void JSMatrix2d::JsRotate(const JSCallbackInfo& info)
213 {
214 if (info.Length() < JS_MATRIX2D_PARAMETER_COUNTS_1 || info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_3) {
215 LOGE("The argv is wrong, it is supposed to have at least 1 argument, and less than 4 arguments");
216 return;
217 }
218 double degree = 0;
219 double rx = 0;
220 double ry = 0;
221 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_0 && info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
222 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], degree);
223 }
224 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_1 && info[JS_MATRIX2D_PARAMETER_COUNTS_1]->IsNumber()) {
225 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_1], rx);
226 rx = SystemProperties::Vp2Px(rx);
227 }
228 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_2 && info[JS_MATRIX2D_PARAMETER_COUNTS_2]->IsNumber()) {
229 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_2], ry);
230 ry = SystemProperties::Vp2Px(ry);
231 }
232 NG::Matrix2D::Rotate(transform_, degree, rx, ry);
233 info.SetReturnValue(info.This());
234 }
235
JsTranslate(const JSCallbackInfo & info)236 void JSMatrix2d::JsTranslate(const JSCallbackInfo& info)
237 {
238 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_2) {
239 LOGE("The argv is wrong, it is supposed to have at most 2 arguments.");
240 return;
241 }
242 double tx = 0;
243 double ty = 0;
244 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_0 && info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
245 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], tx);
246 tx = SystemProperties::Vp2Px(tx);
247 }
248 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_1 && info[JS_MATRIX2D_PARAMETER_COUNTS_1]->IsNumber()) {
249 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_1], ty);
250 ty = SystemProperties::Vp2Px(ty);
251 }
252 NG::Matrix2D::Translate(transform_, tx, ty);
253 info.SetReturnValue(info.This());
254 }
255
JsScale(const JSCallbackInfo & info)256 void JSMatrix2d::JsScale(const JSCallbackInfo& info)
257 {
258 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_2) {
259 LOGE("The argv is wrong, it is supposed to have at most 2 arguments.");
260 return;
261 }
262 double sx = 1.0f;
263 double sy = 1.0f;
264 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_0 && info[JS_MATRIX2D_PARAMETER_COUNTS_0]->IsNumber()) {
265 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_0], sx);
266 }
267 if (info.Length() > JS_MATRIX2D_PARAMETER_COUNTS_1 && info[JS_MATRIX2D_PARAMETER_COUNTS_1]->IsNumber()) {
268 JSViewAbstract::ParseJsDouble(info[JS_MATRIX2D_PARAMETER_COUNTS_1], sy);
269 }
270 NG::Matrix2D::Scale(transform_, sx, sy);
271 info.SetReturnValue(info.This());
272 }
273
ToString() const274 std::string JSMatrix2d::ToString() const
275 {
276 auto jsonValue = JsonUtil::Create(true);
277 jsonValue->Put("scaleX", transform_.scaleX);
278 jsonValue->Put("scaleY", transform_.scaleY);
279 jsonValue->Put("skewX", transform_.skewX);
280 jsonValue->Put("skewY", transform_.skewY);
281 jsonValue->Put("translateX", transform_.translateX);
282 jsonValue->Put("translateY", transform_.translateY);
283 return jsonValue->ToString();
284 }
285 } // namespace OHOS::Ace::Framework
286