• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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