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