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
16 #include "cj_common_ffi.h"
17 #include "cj_drawing_log.h"
18 #include "cj_drawing_util.h"
19 #include "matrix_impl/cj_matrix.h"
20
21 namespace OHOS {
22 namespace CJDrawing {
23 using namespace OHOS::FFI;
24 extern "C" {
25 // Matrix
FfiGraphicDrawingMatrixCreate(int64_t id)26 FFI_EXPORT int64_t FfiGraphicDrawingMatrixCreate(int64_t id)
27 {
28 ROSEN_LOGD("FfiGraphicDrawingMatrixCreate start");
29 return CjMatrix::CreateCjMatrix(id);
30 }
31
FfiGraphicDrawingMatrixSetRotation(int64_t id,float degree,float px,float py)32 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetRotation(int64_t id, float degree, float px, float py)
33 {
34 ROSEN_LOGD("FfiGraphicDrawingMatrixSetRotation start");
35 auto instance = FFIData::GetData<CjMatrix>(id);
36 if (instance == nullptr) {
37 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
38 }
39 return instance->SetRotation(degree, px, py);
40 }
41
FfiGraphicDrawingMatrixSetScale(int64_t id,float sx,float sy,float px,float py)42 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetScale(int64_t id, float sx, float sy, float px, float py)
43 {
44 ROSEN_LOGD("FfiGraphicDrawingMatrixSetScale start");
45 auto instance = FFIData::GetData<CjMatrix>(id);
46 if (instance == nullptr) {
47 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
48 }
49 return instance->SetScale(sx, sy, px, py);
50 }
51
FfiGraphicDrawingMatrixSetTranslation(int64_t id,float dx,float dy)52 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetTranslation(int64_t id, float dx, float dy)
53 {
54 ROSEN_LOGD("FfiGraphicDrawingMatrixSetTranslation start");
55 auto instance = FFIData::GetData<CjMatrix>(id);
56 if (instance == nullptr) {
57 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
58 }
59 return instance->SetTranslation(dx, dy);
60 }
61
FfiGraphicDrawingMatrixSetSkew(int64_t id,float kx,float ky,float px,float py)62 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetSkew(int64_t id, float kx, float ky, float px, float py)
63 {
64 ROSEN_LOGD("FfiGraphicDrawingMatrixSetSkew start");
65 auto instance = FFIData::GetData<CjMatrix>(id);
66 if (instance == nullptr) {
67 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
68 }
69 return instance->SetSkew(kx, ky, px, py);
70 }
71
FfiGraphicDrawingMatrixSetConcat(int64_t id,int64_t matrix1,int64_t matrix2)72 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetConcat(int64_t id, int64_t matrix1, int64_t matrix2)
73 {
74 ROSEN_LOGD("FfiGraphicDrawingMatrixSetConcat start");
75 auto instance = FFIData::GetData<CjMatrix>(id);
76 if (instance == nullptr) {
77 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
78 }
79 auto cjMatrix1 = FFIData::GetData<CjMatrix>(matrix1);
80 if (cjMatrix1 == nullptr) {
81 return ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED);
82 }
83 auto cjMatrix2 = FFIData::GetData<CjMatrix>(matrix2);
84 if (cjMatrix2 == nullptr) {
85 return ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED);
86 }
87 return instance->SetConcat(*cjMatrix1, *cjMatrix2);
88 }
89
FfiGraphicDrawingMatrixSetSinCos(int64_t id,float sinValue,float cosValue,float px,float py)90 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetSinCos(int64_t id, float sinValue, float cosValue, float px, float py)
91 {
92 ROSEN_LOGD("FfiGraphicDrawingMatrixSetSinCos start");
93 auto instance = FFIData::GetData<CjMatrix>(id);
94 if (instance == nullptr) {
95 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
96 }
97 return instance->SetSinCos(sinValue, cosValue, px, py);
98 }
99
FfiGraphicDrawingMatrixSetMatrix(int64_t id,CArrFloat values)100 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetMatrix(int64_t id, CArrFloat values)
101 {
102 ROSEN_LOGD("FfiGraphicDrawingMatrixSetMatrix start");
103 auto instance = FFIData::GetData<CjMatrix>(id);
104 if (instance == nullptr) {
105 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
106 }
107 return instance->SetMatrix(values);
108 }
109
FfiGraphicDrawingMatrixSetMatrixByMatrix(int64_t id,int64_t matrix)110 FFI_EXPORT int32_t FfiGraphicDrawingMatrixSetMatrixByMatrix(int64_t id, int64_t matrix)
111 {
112 ROSEN_LOGD("FfiGraphicDrawingMatrixSetMatrixByMatrix start");
113 auto instance = FFIData::GetData<CjMatrix>(id);
114 if (instance == nullptr) {
115 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
116 }
117 auto cjMatrix = FFIData::GetData<CjMatrix>(matrix);
118 if (cjMatrix == nullptr) {
119 return ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED);
120 }
121 return instance->SetMatrixByMatrix(*cjMatrix);
122 }
123
FfiGraphicDrawingMatrixPostRotate(int64_t id,float degree,float px,float py)124 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPostRotate(int64_t id, float degree, float px, float py)
125 {
126 ROSEN_LOGD("FfiGraphicDrawingMatrixPostRotate start");
127 auto instance = FFIData::GetData<CjMatrix>(id);
128 if (instance == nullptr) {
129 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
130 }
131 return instance->PostRotate(degree, px, py);
132 }
133
FfiGraphicDrawingMatrixPostScale(int64_t id,float sx,float sy,float px,float py)134 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPostScale(int64_t id, float sx, float sy, float px, float py)
135 {
136 ROSEN_LOGD("FfiGraphicDrawingMatrixPostScale start");
137 auto instance = FFIData::GetData<CjMatrix>(id);
138 if (instance == nullptr) {
139 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
140 }
141 return instance->PostScale(sx, sy, px, py);
142 }
143
FfiGraphicDrawingMatrixPostTranslate(int64_t id,float dx,float dy)144 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPostTranslate(int64_t id, float dx, float dy)
145 {
146 ROSEN_LOGD("FfiGraphicDrawingMatrixPostTranslate start");
147 auto instance = FFIData::GetData<CjMatrix>(id);
148 if (instance == nullptr) {
149 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
150 }
151 return instance->PostTranslate(dx, dy);
152 }
153
FfiGraphicDrawingMatrixPostSkew(int64_t id,float kx,float ky,float px,float py)154 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPostSkew(int64_t id, float kx, float ky, float px, float py)
155 {
156 ROSEN_LOGD("FfiGraphicDrawingMatrixPostSkew start");
157 auto instance = FFIData::GetData<CjMatrix>(id);
158 if (instance == nullptr) {
159 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
160 }
161 return instance->PostSkew(kx, ky, px, py);
162 }
163
FfiGraphicDrawingMatrixPostConcat(int64_t id,int64_t matrix)164 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPostConcat(int64_t id, int64_t matrix)
165 {
166 ROSEN_LOGD("FfiGraphicDrawingMatrixPostConcat start");
167 auto instance = FFIData::GetData<CjMatrix>(id);
168 if (instance == nullptr) {
169 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
170 }
171 auto cjMatrix = FFIData::GetData<CjMatrix>(matrix);
172 if (cjMatrix == nullptr) {
173 return ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED);
174 }
175 return instance->PostConcat(*cjMatrix);
176 }
177
FfiGraphicDrawingMatrixPreRotate(int64_t id,float degree,float px,float py)178 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPreRotate(int64_t id, float degree, float px, float py)
179 {
180 ROSEN_LOGD("FfiGraphicDrawingMatrixPreRotate start");
181 auto instance = FFIData::GetData<CjMatrix>(id);
182 if (instance == nullptr) {
183 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
184 }
185 return instance->PreRotate(degree, px, py);
186 }
187
FfiGraphicDrawingMatrixPreScale(int64_t id,float sx,float sy,float px,float py)188 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPreScale(int64_t id, float sx, float sy, float px, float py)
189 {
190 ROSEN_LOGD("FfiGraphicDrawingMatrixPreScale start");
191 auto instance = FFIData::GetData<CjMatrix>(id);
192 if (instance == nullptr) {
193 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
194 }
195 return instance->PreScale(sx, sy, px, py);
196 }
197
FfiGraphicDrawingMatrixPreTranslate(int64_t id,float dx,float dy)198 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPreTranslate(int64_t id, float dx, float dy)
199 {
200 ROSEN_LOGD("FfiGraphicDrawingMatrixPreTranslate start");
201 auto instance = FFIData::GetData<CjMatrix>(id);
202 if (instance == nullptr) {
203 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
204 }
205 return instance->PreTranslate(dx, dy);
206 }
207
FfiGraphicDrawingMatrixPreSkew(int64_t id,float kx,float ky,float px,float py)208 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPreSkew(int64_t id, float kx, float ky, float px, float py)
209 {
210 ROSEN_LOGD("FfiGraphicDrawingMatrixPreSkew start");
211 auto instance = FFIData::GetData<CjMatrix>(id);
212 if (instance == nullptr) {
213 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
214 }
215 return instance->PreSkew(kx, ky, px, py);
216 }
217
FfiGraphicDrawingMatrixPreConcat(int64_t id,int64_t matrix)218 FFI_EXPORT int32_t FfiGraphicDrawingMatrixPreConcat(int64_t id, int64_t matrix)
219 {
220 ROSEN_LOGD("FfiGraphicDrawingMatrixPreConcat start");
221 auto instance = FFIData::GetData<CjMatrix>(id);
222 if (instance == nullptr) {
223 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
224 }
225 auto cjMatrix = FFIData::GetData<CjMatrix>(matrix);
226 if (cjMatrix == nullptr) {
227 return ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED);
228 }
229 return instance->PreConcat(*cjMatrix);
230 }
231
FfiGraphicDrawingMatrixInvert(int64_t id,int64_t matrix)232 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixInvert(int64_t id, int64_t matrix)
233 {
234 ROSEN_LOGD("FfiGraphicDrawingMatrixInvert start");
235 auto instance = FFIData::GetData<CjMatrix>(id);
236 if (instance == nullptr) {
237 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
238 }
239 auto cjMatrix = FFIData::GetData<CjMatrix>(matrix);
240 if (cjMatrix == nullptr) {
241 return {.code = ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED), .data = false};
242 }
243 return instance->Invert(*cjMatrix);
244 }
245
FfiGraphicDrawingMatrixReset(int64_t id)246 FFI_EXPORT int32_t FfiGraphicDrawingMatrixReset(int64_t id)
247 {
248 ROSEN_LOGD("FfiGraphicDrawingMatrixReset start");
249 auto instance = FFIData::GetData<CjMatrix>(id);
250 if (instance == nullptr) {
251 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
252 }
253 return instance->Reset();
254 }
255
FfiGraphicDrawingMatrixIsEqual(int64_t id,int64_t matrix)256 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixIsEqual(int64_t id, int64_t matrix)
257 {
258 ROSEN_LOGD("FfiGraphicDrawingMatrixIsEqual start");
259 auto instance = FFIData::GetData<CjMatrix>(id);
260 if (instance == nullptr) {
261 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
262 }
263 auto cjMatrix = FFIData::GetData<CjMatrix>(matrix);
264 if (cjMatrix == nullptr) {
265 return {.code = ParserErr(CjDrawingErrorCode::ERROR_PARAM_VERIFICATION_FAILED), .data = false};
266 }
267 return instance->IsEqual(*cjMatrix);
268 }
269
FfiGraphicDrawingMatrixIsIdentity(int64_t id)270 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixIsIdentity(int64_t id)
271 {
272 ROSEN_LOGD("FfiGraphicDrawingMatrixIsIdentity start");
273 auto instance = FFIData::GetData<CjMatrix>(id);
274 if (instance == nullptr) {
275 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
276 }
277 return instance->IsIdentity();
278 }
279
FfiGraphicDrawingMatrixIsAffine(int64_t id)280 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixIsAffine(int64_t id)
281 {
282 ROSEN_LOGD("FfiGraphicDrawingMatrixIsAffine start");
283 auto instance = FFIData::GetData<CjMatrix>(id);
284 if (instance == nullptr) {
285 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
286 }
287 return instance->IsAffine();
288 }
289
FfiGraphicDrawingMatrixRectStaysRect(int64_t id)290 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixRectStaysRect(int64_t id)
291 {
292 ROSEN_LOGD("FfiGraphicDrawingMatrixRectStaysRect start");
293 auto instance = FFIData::GetData<CjMatrix>(id);
294 if (instance == nullptr) {
295 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
296 }
297 return instance->RectStaysRect();
298 }
299
FfiGraphicDrawingMatrixGetValue(int64_t id,int64_t index)300 FFI_EXPORT RetDataScalar FfiGraphicDrawingMatrixGetValue(int64_t id, int64_t index)
301 {
302 ROSEN_LOGD("FfiGraphicDrawingMatrixGetValue start");
303 auto instance = FFIData::GetData<CjMatrix>(id);
304 if (instance == nullptr) {
305 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = 0.0};
306 }
307 return instance->GetValue(index);
308 }
309
FfiGraphicDrawingMatrixGetAll(int64_t id,CArrFloat arr)310 FFI_EXPORT int32_t FfiGraphicDrawingMatrixGetAll(int64_t id, CArrFloat arr)
311 {
312 ROSEN_LOGD("FfiGraphicDrawingMatrixGetAll start");
313 auto instance = FFIData::GetData<CjMatrix>(id);
314 if (instance == nullptr) {
315 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
316 }
317 return instance->GetAll(arr);
318 }
319
FfiGraphicDrawingMatrixMapRadius(int64_t id,float radius)320 FFI_EXPORT RetDataScalar FfiGraphicDrawingMatrixMapRadius(int64_t id, float radius)
321 {
322 ROSEN_LOGD("FfiGraphicDrawingMatrixMapRadius start");
323 auto instance = FFIData::GetData<CjMatrix>(id);
324 if (instance == nullptr) {
325 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = 0.0};
326 }
327 return instance->MapRadius(radius);
328 }
329
FfiGraphicDrawingMatrixMapPoints(int64_t id,CArrPoint src,CArrPoint dst)330 FFI_EXPORT int32_t FfiGraphicDrawingMatrixMapPoints(int64_t id, CArrPoint src, CArrPoint dst)
331 {
332 ROSEN_LOGD("FfiGraphicDrawingMatrixMapPoints start");
333 auto instance = FFIData::GetData<CjMatrix>(id);
334 if (instance == nullptr) {
335 return ParserErr(CjDrawingErrorCode::INTERNAL_ERROR);
336 }
337 return instance->MapPoints(src, dst);
338 }
339
FfiGraphicDrawingMatrixMapRect(int64_t id,CRect * dst,CRect src)340 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixMapRect(int64_t id, CRect *dst, CRect src)
341 {
342 ROSEN_LOGD("FfiGraphicDrawingMatrixMapRect start");
343 auto instance = FFIData::GetData<CjMatrix>(id);
344 if (instance == nullptr) {
345 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
346 }
347 return instance->MapRect(*dst, src);
348 }
349
FfiGraphicDrawingMatrixSetRectToRect(int64_t id,CRect src,CRect dst,int32_t scaleToFit)350 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixSetRectToRect(int64_t id, CRect src, CRect dst, int32_t scaleToFit)
351 {
352 ROSEN_LOGD("FfiGraphicDrawingMatrixSetRectToRect start");
353 auto instance = FFIData::GetData<CjMatrix>(id);
354 if (instance == nullptr) {
355 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
356 }
357 return instance->SetRectToRect(src, dst, scaleToFit);
358 }
359
FfiGraphicDrawingMatrixSetPolyToPoly(int64_t id,CArrPoint src,CArrPoint dst,int64_t count)360 FFI_EXPORT RetDataBool FfiGraphicDrawingMatrixSetPolyToPoly(int64_t id, CArrPoint src, CArrPoint dst, int64_t count)
361 {
362 ROSEN_LOGD("FfiGraphicDrawingMatrixSetPolyToPoly start");
363 auto instance = FFIData::GetData<CjMatrix>(id);
364 if (instance == nullptr) {
365 return {.code = ParserErr(CjDrawingErrorCode::INTERNAL_ERROR), .data = false};
366 }
367 return instance->SetPolyToPoly(src, dst, count);
368 }
369 }
370 } // namespace CJDrawing
371 } // namespace OHOS
372