1 /*
2 * Copyright (c) 2023-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 "drawing_image_filter.h"
17
18 #include "drawing_canvas_utils.h"
19 #include "drawing_helper.h"
20
21 #include "effect/image_filter.h"
22 #include "effect/image_filter_lazy.h"
23
24 using namespace OHOS;
25 using namespace Rosen;
26 using namespace Drawing;
27
CatsToRect(const OH_Drawing_Rect & cRect)28 static const Rect& CatsToRect(const OH_Drawing_Rect& cRect)
29 {
30 return reinterpret_cast<const Rect&>(cRect);
31 }
32
OH_Drawing_ImageFilterCreateBlur(float sigmaX,float sigmaY,OH_Drawing_TileMode cTileMode,OH_Drawing_ImageFilter * input)33 OH_Drawing_ImageFilter* OH_Drawing_ImageFilterCreateBlur(float sigmaX, float sigmaY, OH_Drawing_TileMode cTileMode,
34 OH_Drawing_ImageFilter* input)
35 {
36 NativeHandle<ImageFilter>* inputHandle = nullptr;
37 if (input) {
38 inputHandle = Helper::CastTo<OH_Drawing_ImageFilter*, NativeHandle<ImageFilter>*>(input);
39 }
40 NativeHandle<ImageFilter>* imageFilterHandle = new NativeHandle<ImageFilter>;
41 imageFilterHandle->value = ImageFilterLazy::CreateBlur(sigmaX, sigmaY, static_cast<TileMode>(cTileMode),
42 inputHandle ? inputHandle->value : nullptr, ImageBlurType::GAUSS);
43 if (imageFilterHandle->value == nullptr) {
44 delete imageFilterHandle;
45 return nullptr;
46 }
47 return Helper::CastTo<NativeHandle<ImageFilter>*, OH_Drawing_ImageFilter*>(imageFilterHandle);
48 }
49
OH_Drawing_ImageFilterCreateBlurWithCrop(float sigmaX,float sigmaY,OH_Drawing_TileMode cTileMode,OH_Drawing_ImageFilter * input,const OH_Drawing_Rect * rect)50 OH_Drawing_ImageFilter* OH_Drawing_ImageFilterCreateBlurWithCrop(float sigmaX, float sigmaY,
51 OH_Drawing_TileMode cTileMode, OH_Drawing_ImageFilter* input, const OH_Drawing_Rect* rect)
52 {
53 NativeHandle<ImageFilter>* inputHandle = nullptr;
54 if (input) {
55 inputHandle = Helper::CastTo<OH_Drawing_ImageFilter*, NativeHandle<ImageFilter>*>(input);
56 }
57 NativeHandle<ImageFilter>* imageFilterHandle = new NativeHandle<ImageFilter>;
58 if (rect == nullptr) {
59 imageFilterHandle->value = ImageFilterLazy::CreateBlur(sigmaX, sigmaY, static_cast<TileMode>(cTileMode),
60 inputHandle ? inputHandle->value : nullptr, ImageBlurType::GAUSS);
61 } else {
62 imageFilterHandle->value = ImageFilterLazy::CreateBlur(sigmaX, sigmaY, static_cast<TileMode>(cTileMode),
63 inputHandle ? inputHandle->value : nullptr, ImageBlurType::GAUSS, CatsToRect(*rect));
64 }
65
66 if (imageFilterHandle->value == nullptr) {
67 delete imageFilterHandle;
68 return nullptr;
69 }
70 return Helper::CastTo<NativeHandle<ImageFilter>*, OH_Drawing_ImageFilter*>(imageFilterHandle);
71 }
72
OH_Drawing_ImageFilterCreateFromColorFilter(OH_Drawing_ColorFilter * cf,OH_Drawing_ImageFilter * input)73 OH_Drawing_ImageFilter* OH_Drawing_ImageFilterCreateFromColorFilter(
74 OH_Drawing_ColorFilter* cf, OH_Drawing_ImageFilter* input)
75 {
76 if (cf == nullptr) {
77 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
78 return nullptr;
79 }
80 NativeHandle<ColorFilter>* colorFilterHandle = Helper::CastTo<OH_Drawing_ColorFilter*,
81 NativeHandle<ColorFilter>*>(cf);
82 NativeHandle<ImageFilter>* inputHandle = nullptr;
83 if (input) {
84 inputHandle = Helper::CastTo<OH_Drawing_ImageFilter*, NativeHandle<ImageFilter>*>(input);
85 }
86 NativeHandle<ImageFilter>* imageFilterHandle = new NativeHandle<ImageFilter>;
87 imageFilterHandle->value = ImageFilterLazy::CreateColorFilter(colorFilterHandle->value,
88 inputHandle ? inputHandle->value : nullptr);
89 if (imageFilterHandle->value == nullptr) {
90 delete imageFilterHandle;
91 return nullptr;
92 }
93 return Helper::CastTo<NativeHandle<ImageFilter>*, OH_Drawing_ImageFilter*>(imageFilterHandle);
94 }
95
OH_Drawing_ImageFilterCreateOffset(float x,float y,OH_Drawing_ImageFilter * imageFilter)96 OH_Drawing_ImageFilter* OH_Drawing_ImageFilterCreateOffset(float x, float y, OH_Drawing_ImageFilter* imageFilter)
97 {
98 NativeHandle<ImageFilter>* inputHandle = imageFilter ? Helper::CastTo<OH_Drawing_ImageFilter*,
99 NativeHandle<ImageFilter>*>(imageFilter) : nullptr;
100 NativeHandle<ImageFilter>* imageFilterHandle = new NativeHandle<ImageFilter>;
101 imageFilterHandle->value =
102 ImageFilterLazy::CreateOffset(x, y, inputHandle ? inputHandle->value : nullptr);
103 if (imageFilterHandle->value == nullptr) {
104 delete imageFilterHandle;
105 return nullptr;
106 }
107 return Helper::CastTo<NativeHandle<ImageFilter>*, OH_Drawing_ImageFilter*>(imageFilterHandle);
108 }
109
OH_Drawing_ImageFilterCreateFromShaderEffect(OH_Drawing_ShaderEffect * shaderEffect)110 OH_Drawing_ImageFilter* OH_Drawing_ImageFilterCreateFromShaderEffect(OH_Drawing_ShaderEffect* shaderEffect)
111 {
112 if (shaderEffect == nullptr) {
113 return nullptr;
114 }
115 NativeHandle<ShaderEffect>* shaderFilterHandle =
116 Helper::CastTo<OH_Drawing_ShaderEffect*, NativeHandle<ShaderEffect>*>(shaderEffect);
117 if (shaderFilterHandle->value == nullptr) {
118 return nullptr;
119 }
120 NativeHandle<ImageFilter>* imageFilterHandle = new NativeHandle<ImageFilter>;
121 imageFilterHandle->value = ImageFilterLazy::CreateShader(shaderFilterHandle->value);
122 if (imageFilterHandle->value == nullptr) {
123 delete imageFilterHandle;
124 return nullptr;
125 }
126 return Helper::CastTo<NativeHandle<ImageFilter>*, OH_Drawing_ImageFilter*>(imageFilterHandle);
127 }
128
OH_Drawing_ImageFilterDestroy(OH_Drawing_ImageFilter * cImageFilter)129 void OH_Drawing_ImageFilterDestroy(OH_Drawing_ImageFilter* cImageFilter)
130 {
131 if (!cImageFilter) {
132 return;
133 }
134 delete Helper::CastTo<OH_Drawing_ImageFilter*, NativeHandle<ImageFilter>*>(cImageFilter);
135 }
136