1 /*
2  * Copyright (c) 2023 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_filter.h"
17 
18 #include "drawing_canvas_utils.h"
19 
20 #include "effect/filter.h"
21 
22 using namespace OHOS;
23 using namespace Rosen;
24 using namespace Drawing;
25 
CastToFilter(OH_Drawing_Filter * cFilter)26 static Filter* CastToFilter(OH_Drawing_Filter* cFilter)
27 {
28     return reinterpret_cast<Filter*>(cFilter);
29 }
30 
CastToImageFilter(OH_Drawing_ImageFilter * cImageFilter)31 static ImageFilter* CastToImageFilter(OH_Drawing_ImageFilter* cImageFilter)
32 {
33     return reinterpret_cast<ImageFilter*>(cImageFilter);
34 }
35 
CastToMaskFilter(OH_Drawing_MaskFilter * cMaskFilter)36 static MaskFilter* CastToMaskFilter(OH_Drawing_MaskFilter* cMaskFilter)
37 {
38     return reinterpret_cast<MaskFilter*>(cMaskFilter);
39 }
40 
CastToColorFilter(OH_Drawing_ColorFilter * cColorFilter)41 static ColorFilter* CastToColorFilter(OH_Drawing_ColorFilter* cColorFilter)
42 {
43     return reinterpret_cast<ColorFilter*>(cColorFilter);
44 }
45 
OH_Drawing_FilterCreate()46 OH_Drawing_Filter* OH_Drawing_FilterCreate()
47 {
48     return (OH_Drawing_Filter*)new Filter();
49 }
50 
OH_Drawing_FilterSetImageFilter(OH_Drawing_Filter * cFliter,OH_Drawing_ImageFilter * cImageFilter)51 void OH_Drawing_FilterSetImageFilter(OH_Drawing_Filter* cFliter, OH_Drawing_ImageFilter* cImageFilter)
52 {
53     Filter* filter = CastToFilter(cFliter);
54     if (filter == nullptr) {
55         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
56         return;
57     }
58     if (cImageFilter == nullptr) {
59         filter->SetImageFilter(nullptr);
60         return;
61     }
62     filter->SetImageFilter(std::shared_ptr<ImageFilter>{CastToImageFilter(cImageFilter), [](auto p) {}});
63 }
64 
OH_Drawing_FilterSetMaskFilter(OH_Drawing_Filter * cFliter,OH_Drawing_MaskFilter * cMaskFilter)65 void OH_Drawing_FilterSetMaskFilter(OH_Drawing_Filter* cFliter, OH_Drawing_MaskFilter* cMaskFilter)
66 {
67     Filter* filter = CastToFilter(cFliter);
68     if (filter == nullptr) {
69         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
70         return;
71     }
72     if (cMaskFilter == nullptr) {
73         filter->SetMaskFilter(nullptr);
74         return;
75     }
76     filter->SetMaskFilter(std::shared_ptr<MaskFilter>{CastToMaskFilter(cMaskFilter), [](auto p) {}});
77 }
78 
OH_Drawing_FilterSetColorFilter(OH_Drawing_Filter * cFliter,OH_Drawing_ColorFilter * cColorFilter)79 void OH_Drawing_FilterSetColorFilter(OH_Drawing_Filter* cFliter, OH_Drawing_ColorFilter* cColorFilter)
80 {
81     Filter* filter = CastToFilter(cFliter);
82     if (filter == nullptr) {
83         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
84         return;
85     }
86     if (cColorFilter == nullptr) {
87         filter->SetColorFilter(nullptr);
88         return;
89     }
90     filter->SetColorFilter(std::shared_ptr<ColorFilter>{CastToColorFilter(cColorFilter), [](auto p) {}});
91 }
92 
OH_Drawing_FilterGetColorFilter(OH_Drawing_Filter * cFliter,OH_Drawing_ColorFilter * cColorFilter)93 void OH_Drawing_FilterGetColorFilter(OH_Drawing_Filter* cFliter, OH_Drawing_ColorFilter* cColorFilter)
94 {
95     Filter* filter = CastToFilter(cFliter);
96     if (filter == nullptr) {
97         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
98         return;
99     }
100     ColorFilter* colorFilter = CastToColorFilter(cColorFilter);
101     if (colorFilter == nullptr) {
102         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
103         return;
104     }
105     std::shared_ptr<ColorFilter> colorFilterPtr = filter->GetColorFilter();
106     if (colorFilterPtr == nullptr) {
107         *colorFilter = ColorFilter(ColorFilter::FilterType::NO_TYPE);
108         return;
109     }
110     *colorFilter = *(colorFilterPtr.get());
111 }
112 
OH_Drawing_FilterDestroy(OH_Drawing_Filter * cFilter)113 void OH_Drawing_FilterDestroy(OH_Drawing_Filter* cFilter)
114 {
115     if (!cFilter) {
116         return;
117     }
118     delete CastToFilter(cFilter);
119 }
120