• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "effect_kit_ffi.h"
16 
17 #include "cj_color_picker.h"
18 #include "cj_filter.h"
19 #include "effect_errors.h"
20 #include "effect_utils.h"
21 #include "media_errors.h"
22 #include "pixel_map_impl.h"
23 
24 namespace OHOS {
25 namespace CJEffectKit {
26 using namespace OHOS::FFI;
27 using namespace OHOS::Media;
28 using namespace OHOS::Rosen;
29 
30 const int64_t EFFECTKIT_ERROR = -1;
31 
BuildCJColor(ColorManager::Color color,CJColor & cjColor)32 void BuildCJColor(ColorManager::Color color, CJColor& cjColor)
33 {
34     cjColor.r = static_cast<int>(color.r * 255.0f);
35     cjColor.g = static_cast<int>(color.g * 255.0f);
36     cjColor.b = static_cast<int>(color.b * 255.0f);
37     cjColor.a = static_cast<int>(color.a * 255.0f);
38 }
39 
40 extern "C" {
FfiEffectKitCreateEffect(int64_t sourceId,uint32_t * errorCode)41 int64_t FfiEffectKitCreateEffect(int64_t sourceId, uint32_t* errorCode)
42 {
43     auto instance = FFIData::GetData<PixelMapImpl>(sourceId);
44     if (!instance) {
45         EFFECT_LOG_E("[PixelMap] instance not exist %{public}" PRId64, sourceId);
46         return EFFECTKIT_ERROR;
47     }
48     return CJFilter::CreateEffect(instance, *errorCode);
49 }
50 
FfiEffectKitBlur(int64_t id,float radius)51 void FfiEffectKitBlur(int64_t id, float radius)
52 {
53     auto instance = FFIData::GetData<CJFilter>(id);
54     if (!instance) {
55         EFFECT_LOG_E("[CJFilter] instance not exist %{public}" PRId64, id);
56         return;
57     }
58     instance->Blur(radius);
59     return;
60 }
61 
FfiEffectKitInvert(int64_t id)62 void FfiEffectKitInvert(int64_t id)
63 {
64     auto instance = FFIData::GetData<CJFilter>(id);
65     if (!instance) {
66         EFFECT_LOG_E("[CJFilter] instance not exist %{public}" PRId64, id);
67         return;
68     }
69     instance->Invert();
70     return;
71 }
72 
FfiEffectKitBrightness(int64_t id,float bright)73 void FfiEffectKitBrightness(int64_t id, float bright)
74 {
75     auto instance = FFIData::GetData<CJFilter>(id);
76     if (!instance) {
77         EFFECT_LOG_E("[CJFilter] instance not exist %{public}" PRId64, id);
78         return;
79     }
80     instance->Brightness(bright);
81     return;
82 }
83 
FfiEffectKitGrayscale(int64_t id)84 void FfiEffectKitGrayscale(int64_t id)
85 {
86     auto instance = FFIData::GetData<CJFilter>(id);
87     if (!instance) {
88         EFFECT_LOG_E("[CJFilter] instance not exist %{public}" PRId64, id);
89         return;
90     }
91     instance->Grayscale();
92     return;
93 }
94 
FfiEffectKitSetColorMatrix(int64_t id,CArrFloat cjColorMatrix,uint32_t * errorCode)95 void FfiEffectKitSetColorMatrix(int64_t id, CArrFloat cjColorMatrix, uint32_t* errorCode)
96 {
97     std::vector<float> naColor;
98     for (int i = 0; i < cjColorMatrix.size; i++) {
99         naColor.push_back(cjColorMatrix.head[i]);
100     }
101     auto instance = FFIData::GetData<CJFilter>(id);
102     if (!instance) {
103         EFFECT_LOG_E("[CJFilter] instance not exist %{public}" PRId64, id);
104         return;
105     }
106     instance->SetColorMatrix(naColor, *errorCode);
107     return;
108 }
109 
FfiEffectKitGetEffectPixelMap()110 int64_t FfiEffectKitGetEffectPixelMap()
111 {
112     std::shared_ptr<OHOS::Media::PixelMap> map = CJFilter::GetEffectPixelMap();
113     if (map == nullptr) {
114         return EFFECTKIT_ERROR;
115     }
116     auto native = FFIData::Create<PixelMapImpl>(map);
117     if (!native) {
118         return EFFECTKIT_ERROR;
119     }
120     return native->GetID();
121 }
122 
FfiEffectKitCreateColorPicker(int64_t sourceId,uint32_t * errorCode)123 int64_t FfiEffectKitCreateColorPicker(int64_t sourceId, uint32_t* errorCode)
124 {
125     auto instance = FFIData::GetData<PixelMapImpl>(sourceId);
126     if (!instance) {
127         EFFECT_LOG_E("[PixelMap] instance not exist %{public}" PRId64, sourceId);
128         *errorCode = static_cast<int32_t>(Rosen::ERR_INVALID_PARAM);
129         return EFFECTKIT_ERROR;
130     }
131     return CJColorPicker::CreateColorPicker(instance, *errorCode);
132 }
133 
FfiEffectKitCreateColorPickerRegion(int64_t sourceId,CArrDouble region,uint32_t * errorCode)134 int64_t FfiEffectKitCreateColorPickerRegion(int64_t sourceId, CArrDouble region, uint32_t* errorCode)
135 {
136     auto instance = FFIData::GetData<PixelMapImpl>(sourceId);
137     if (!instance) {
138         EFFECT_LOG_E("[PixelMap] instance not exist %{public}" PRId64, sourceId);
139         *errorCode = static_cast<int32_t>(Rosen::ERR_INVALID_PARAM);
140         return EFFECTKIT_ERROR;
141     }
142     std::vector<double> cRegion;
143     for (int i = 0; i < region.size; i++) {
144         cRegion.push_back(region.head[i]);
145     }
146     return CJColorPicker::CreateColorPicker(instance, cRegion, *errorCode);
147 }
148 
FfiEffectKitGetMainColor(uint32_t * errorCode)149 CJColor FfiEffectKitGetMainColor(uint32_t* errorCode)
150 {
151     ColorManager::Color color;
152     *errorCode = CJColorPicker::GetMainColor(color);
153     CJColor cjColor = { 0, 0, 0, 0 };
154     BuildCJColor(color, cjColor);
155     return cjColor;
156 }
157 
FfiEffectKitGetLargestProportionColor(uint32_t * errorCode)158 CJColor FfiEffectKitGetLargestProportionColor(uint32_t* errorCode)
159 {
160     ColorManager::Color color;
161     *errorCode = CJColorPicker::GetLargestProportionColor(color);
162     CJColor cjColor = { 0, 0, 0, 0 };
163     BuildCJColor(color, cjColor);
164     return cjColor;
165 }
166 
FfiEffectKitGetHighestSaturationColor(uint32_t * errorCode)167 CJColor FfiEffectKitGetHighestSaturationColor(uint32_t* errorCode)
168 {
169     ColorManager::Color color;
170     *errorCode = CJColorPicker::GetHighestSaturationColor(color);
171     CJColor cjColor = { 0, 0, 0, 0 };
172     BuildCJColor(color, cjColor);
173     return cjColor;
174 }
175 
FfiEffectKitGetAverageColor(uint32_t * errorCode)176 CJColor FfiEffectKitGetAverageColor(uint32_t* errorCode)
177 {
178     ColorManager::Color color;
179     *errorCode = CJColorPicker::GetAverageColor(color);
180     CJColor cjColor = { 0, 0, 0, 0 };
181     BuildCJColor(color, cjColor);
182     return cjColor;
183 }
184 
FfiEffectKitIsBlackOrWhiteOrGrayColor(uint32_t color,uint32_t * errorCode)185 bool FfiEffectKitIsBlackOrWhiteOrGrayColor(uint32_t color, uint32_t* errorCode)
186 {
187     return CJColorPicker::IsBlackOrWhiteOrGrayColor(color, *errorCode);
188 }
189 
FfiEffectKitGetTopProportionColors(double colorCount,uint32_t * errorCode)190 CArrCJColor FfiEffectKitGetTopProportionColors(double colorCount, uint32_t* errorCode)
191 {
192     std::vector<ColorManager::Color> colors = CJColorPicker::GetTopProportionColors(colorCount, *errorCode);
193     CArrCJColor data = { .head = nullptr, .size = 0 };
194     data.size = static_cast<int64_t>(colors.size());
195     if (data.size == 0) {
196         return data;
197     }
198     CJColor* retValue = static_cast<CJColor*>(malloc(sizeof(CJColor) * data.size));
199     if (retValue == nullptr) {
200         EFFECT_LOG_E("malloc failed");
201         return data;
202     }
203     for (int i = 0; i < data.size; i++) {
204         CJColor cjColor = { 0, 0, 0, 0 };
205         BuildCJColor(colors[i], cjColor);
206         retValue[i] = cjColor;
207     }
208     data.head = retValue;
209     return data;
210 }
211 }
212 } // namespace CJEffectKit
213 } // namespace OHOS