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 "effect_filter.h"
17 
18 #include "filter/filter.h"
19 #include "sk_image_chain.h"
20 #include "sk_image_filter_factory.h"
21 
22 #include "utils/log.h"
23 
24 using namespace OHOS;
25 using namespace Rosen;
26 
CastToFilter(OH_Filter * filter)27 static Filter* CastToFilter(OH_Filter* filter)
28 {
29     return reinterpret_cast<Filter*>(filter);
30 }
31 
CastToOH_Filter(Filter * filter)32 static OH_Filter* CastToOH_Filter(Filter* filter)
33 {
34     return reinterpret_cast<OH_Filter*>(filter);
35 }
36 
OH_Filter_CreateEffect(OH_PixelmapNative * pixelmap,OH_Filter ** filter)37 EffectErrorCode OH_Filter_CreateEffect(OH_PixelmapNative* pixelmap, OH_Filter** filter)
38 {
39     if (!pixelmap || !filter) {
40         return EFFECT_BAD_PARAMETER;
41     }
42     *filter = CastToOH_Filter(new Filter(pixelmap->GetInnerPixelmap()));
43     if (*filter == nullptr) {
44         return EFFECT_BAD_PARAMETER;
45     }
46     return EFFECT_SUCCESS;
47 }
48 
OH_Filter_Release(OH_Filter * filter)49 EffectErrorCode OH_Filter_Release(OH_Filter* filter)
50 {
51     if (filter == nullptr) {
52         return EFFECT_BAD_PARAMETER;
53     }
54     delete CastToFilter(filter);
55     return EFFECT_SUCCESS;
56 }
57 
OH_Filter_Blur(OH_Filter * filter,float radius)58 EffectErrorCode OH_Filter_Blur(OH_Filter* filter, float radius)
59 {
60     if (!filter || !(CastToFilter(filter)->Blur(radius))) {
61         return EFFECT_BAD_PARAMETER;
62     }
63     return EFFECT_SUCCESS;
64 }
65 
OH_Filter_BlurWithTileMode(OH_Filter * filter,float radius,EffectTileMode tileMode)66 EffectErrorCode OH_Filter_BlurWithTileMode(OH_Filter* filter, float radius, EffectTileMode tileMode)
67 {
68     SkTileMode skTileMode = static_cast<SkTileMode>(tileMode);
69     if (!filter || !(CastToFilter(filter)->Blur(radius, skTileMode))) {
70         return EFFECT_BAD_PARAMETER;
71     }
72     return EFFECT_SUCCESS;
73 }
74 
OH_Filter_Brighten(OH_Filter * filter,float brightness)75 EffectErrorCode OH_Filter_Brighten(OH_Filter* filter, float brightness)
76 {
77     if (!filter || !(CastToFilter(filter)->Brightness(brightness))) {
78         return EFFECT_BAD_PARAMETER;
79     }
80     return EFFECT_SUCCESS;
81 }
82 
OH_Filter_GrayScale(OH_Filter * filter)83 EffectErrorCode OH_Filter_GrayScale(OH_Filter* filter)
84 {
85     if (!filter || !(CastToFilter(filter)->Grayscale())) {
86         return EFFECT_BAD_PARAMETER;
87     }
88     return EFFECT_SUCCESS;
89 }
90 
OH_Filter_Invert(OH_Filter * filter)91 EffectErrorCode OH_Filter_Invert(OH_Filter* filter)
92 {
93     if (!filter || !(CastToFilter(filter)->Invert())) {
94         return EFFECT_BAD_PARAMETER;
95     }
96     return EFFECT_SUCCESS;
97 }
98 
OH_Filter_SetColorMatrix(OH_Filter * filter,OH_Filter_ColorMatrix * matrix)99 EffectErrorCode OH_Filter_SetColorMatrix(OH_Filter* filter, OH_Filter_ColorMatrix* matrix)
100 {
101     if (!filter || !matrix) {
102         return EFFECT_BAD_PARAMETER;
103     }
104     PixelColorMatrix colorMatrix;
105     for (size_t i = 0; i < colorMatrix.MATRIX_SIZE; i++) {
106         colorMatrix.val[i] = matrix->val[i];
107     }
108     if (!(CastToFilter(filter)->SetColorMatrix(colorMatrix))) {
109         return EFFECT_BAD_PARAMETER;
110     }
111     return EFFECT_SUCCESS;
112 }
113 
OH_Filter_GetEffectPixelMap(OH_Filter * filter,OH_PixelmapNative ** pixelmap)114 EffectErrorCode OH_Filter_GetEffectPixelMap(OH_Filter* filter, OH_PixelmapNative** pixelmap)
115 {
116     if (!pixelmap || !filter) {
117         return EFFECT_BAD_PARAMETER;
118     }
119     *pixelmap = new OH_PixelmapNative(CastToFilter(filter)->GetPixelMap());
120     if (*pixelmap == nullptr) {
121         return EFFECT_BAD_PARAMETER;
122     }
123     return EFFECT_SUCCESS;
124 }