1 /*
2 * Copyright (c) 2024 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/cj_frontend/interfaces/cj_ffi/cj_image_animator_ffi.h"
17
18 #include "cj_lambda.h"
19 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
20 #include "core/common/container.h"
21 #include "core/components_ng/pattern/image_animator/image_animator_model.h"
22
23 using namespace OHOS::Ace;
24 using namespace OHOS::Ace::Framework;
25
26 namespace {
27
28 const std::vector<Animator::Status> ANIMATOR_STATUS = { Animator::Status::IDLE, Animator::Status::RUNNING,
29 Animator::Status::PAUSED, Animator::Status::STOPPED };
30 const std::vector<FillMode> FILL_MODES = { FillMode::NONE, FillMode::FORWARDS, FillMode::BACKWARDS, FillMode::BOTH };
31
ParseImages(const FfiImage & ffiImages,ImageProperties & imageProperties)32 void ParseImages(const FfiImage& ffiImages, ImageProperties& imageProperties)
33 {
34 imageProperties.src = ffiImages.src;
35 imageProperties.duration = ffiImages.duration;
36
37 Dimension widthDime(ffiImages.width, static_cast<DimensionUnit>(ffiImages.widthUnit));
38 Dimension heightDime(ffiImages.height, static_cast<DimensionUnit>(ffiImages.heightUnit));
39 Dimension topDime(ffiImages.top, static_cast<DimensionUnit>(ffiImages.topUnit));
40 Dimension leftDime(ffiImages.left, static_cast<DimensionUnit>(ffiImages.leftUnit));
41
42 imageProperties.width = widthDime;
43 imageProperties.height = heightDime;
44 imageProperties.top = topDime;
45 imageProperties.left = leftDime;
46 }
47
48 } // namespace
49
50 extern "C" {
FfiOHOSAceFrameworkImageAnimatorCreate()51 void FfiOHOSAceFrameworkImageAnimatorCreate()
52 {
53 ImageAnimatorModel::GetInstance()->Create();
54 }
55
FfiOHOSAceFrameworkImageAnimatorSetImages(VectorFfiImageHandle vecContent)56 void FfiOHOSAceFrameworkImageAnimatorSetImages(VectorFfiImageHandle vecContent)
57 {
58 auto imagesVec = *reinterpret_cast<std::vector<FfiImage>*>(vecContent);
59 std::vector<ImageProperties> images;
60 for (size_t i = 0; i< imagesVec.size(); ++i) {
61 ImageProperties imageProperties;
62 ParseImages(imagesVec[i], imageProperties);
63 images.push_back(imageProperties);
64 }
65 ImageAnimatorModel::GetInstance()->SetImages(std::move(images));
66 }
67
FfiOHOSAceFrameworkImageAnimatorSetState(int32_t state)68 void FfiOHOSAceFrameworkImageAnimatorSetState(int32_t state)
69 {
70 if (!Utils::CheckParamsValid(state, ANIMATOR_STATUS.size())) {
71 LOGE("invalid value for animator state");
72 return;
73 }
74 ImageAnimatorModel::GetInstance()->SetState(static_cast<int32_t>(ANIMATOR_STATUS[state]));
75 }
76
FfiOHOSAceFrameworkImageAnimatorSetDuration(int32_t duration)77 void FfiOHOSAceFrameworkImageAnimatorSetDuration(int32_t duration)
78 {
79 ImageAnimatorModel::GetInstance()->SetDuration(duration);
80 }
81
FfiOHOSAceFrameworkImageAnimatorSetReverse(bool isReverse)82 void FfiOHOSAceFrameworkImageAnimatorSetReverse(bool isReverse)
83 {
84 ImageAnimatorModel::GetInstance()->SetIsReverse(isReverse);
85 }
86
FfiOHOSAceFrameworkImageAnimatorSetFixedSize(bool fixedSize)87 void FfiOHOSAceFrameworkImageAnimatorSetFixedSize(bool fixedSize)
88 {
89 ImageAnimatorModel::GetInstance()->SetFixedSize(fixedSize);
90 }
91
FfiOHOSAceFrameworkImageAnimatorSetPreDecode(int32_t preDecode)92 void FfiOHOSAceFrameworkImageAnimatorSetPreDecode(int32_t preDecode)
93 {
94 ImageAnimatorModel::GetInstance()->SetPreDecode(preDecode);
95 }
96
FfiOHOSAceFrameworkImageAnimatorSetFillMode(int32_t mode)97 void FfiOHOSAceFrameworkImageAnimatorSetFillMode(int32_t mode)
98 {
99 if (!Utils::CheckParamsValid(mode, FILL_MODES.size())) {
100 LOGE("invalid value for animator fillMode");
101 return;
102 }
103 ImageAnimatorModel::GetInstance()->SetFillMode(static_cast<int32_t>(FILL_MODES[mode]));
104 }
105
FfiOHOSAceFrameworkImageAnimatorSetIterations(int32_t iteration)106 void FfiOHOSAceFrameworkImageAnimatorSetIterations(int32_t iteration)
107 {
108 ImageAnimatorModel::GetInstance()->SetIteration(iteration);
109 }
110
FfiOHOSAceFrameworkImageAnimatorOnStart(void (* callback)())111 void FfiOHOSAceFrameworkImageAnimatorOnStart(void (*callback)())
112 {
113 ImageAnimatorModel::GetInstance()->SetOnStart(CJLambda::Create(callback));
114 }
115
FfiOHOSAceFrameworkImageAnimatorOnPause(void (* callback)())116 void FfiOHOSAceFrameworkImageAnimatorOnPause(void (*callback)())
117 {
118 ImageAnimatorModel::GetInstance()->SetOnPause(CJLambda::Create(callback));
119 }
120
FfiOHOSAceFrameworkImageAnimatorOnRepeat(void (* callback)())121 void FfiOHOSAceFrameworkImageAnimatorOnRepeat(void (*callback)())
122 {
123 ImageAnimatorModel::GetInstance()->SetOnRepeat(CJLambda::Create(callback));
124 }
125
FfiOHOSAceFrameworkImageAnimatorOnCancel(void (* callback)())126 void FfiOHOSAceFrameworkImageAnimatorOnCancel(void (*callback)())
127 {
128 ImageAnimatorModel::GetInstance()->SetOnCancel(CJLambda::Create(callback));
129 }
130
FfiOHOSAceFrameworkImageAnimatorOnFinish(void (* callback)())131 void FfiOHOSAceFrameworkImageAnimatorOnFinish(void (*callback)())
132 {
133 ImageAnimatorModel::GetInstance()->SetOnFinish(CJLambda::Create(callback));
134 }
135
FfiCJCreateVectorFfiImage(int64_t size)136 VectorFfiImageHandle FfiCJCreateVectorFfiImage(int64_t size)
137 {
138 LOGE("Create FfiImage Vector");
139 return new std::vector<FfiImage>(size);
140 }
141
FfiCJVectorFfiImageSetElement(VectorFfiImageHandle vec,int64_t index,FfiImage image)142 void FfiCJVectorFfiImageSetElement(VectorFfiImageHandle vec, int64_t index, FfiImage image)
143 {
144 LOGI("FfiImage Vector Set Element");
145 auto actualVec = reinterpret_cast<std::vector<FfiImage>*>(vec);
146 (*actualVec)[index] = image;
147 LOGI("FfiImage Vector Set Element Success");
148 }
149
FfiCJVectorFfiImageDelete(VectorFfiImageHandle vec)150 void FfiCJVectorFfiImageDelete(VectorFfiImageHandle vec)
151 {
152 auto actualVec = reinterpret_cast<std::vector<FfiImage>*>(vec);
153 delete actualVec;
154 }
155 }
156