2 * Copyright 2016 Xamarin Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkImageFilter.h"
9 #include "SkColorFilter.h"
10 #include "SkAlphaThresholdFilter.h"
11 #include "SkBlurImageFilter.h"
12 #include "SkColorFilterImageFilter.h"
13 #include "SkComposeImageFilter.h"
14 #include "SkDisplacementMapEffect.h"
15 #include "SkDropShadowImageFilter.h"
16 #include "SkLightingImageFilter.h"
17 #include "SkMagnifierImageFilter.h"
18 #include "SkMatrixConvolutionImageFilter.h"
19 #include "SkMergeImageFilter.h"
20 #include "SkMorphologyImageFilter.h"
21 #include "SkOffsetImageFilter.h"
22 #include "SkPictureImageFilter.h"
23 #include "SkTileImageFilter.h"
24 #include "SkXfermodeImageFilter.h"
25 #include "SkArithmeticImageFilter.h"
27 #include "sk_imagefilter.h"
29 #include "sk_types_priv.h"
31 sk_imagefilter_croprect_t* sk_imagefilter_croprect_new() {
32 return (sk_imagefilter_croprect_t*) new SkImageFilter::CropRect();
35 sk_imagefilter_croprect_t* sk_imagefilter_croprect_new_with_rect(const sk_rect_t* rect, uint32_t flags) {
36 return (sk_imagefilter_croprect_t*) new SkImageFilter::CropRect(*AsRect(rect), flags);
39 void sk_imagefilter_croprect_destructor(sk_imagefilter_croprect_t* cropRect) {
40 delete AsImageFilterCropRect(cropRect);
43 void sk_imagefilter_croprect_get_rect(sk_imagefilter_croprect_t* cropRect, sk_rect_t* rect) {
45 *rect = ToRect(AsImageFilterCropRect(cropRect)->rect());
49 uint32_t sk_imagefilter_croprect_get_flags(sk_imagefilter_croprect_t* cropRect) {
50 return AsImageFilterCropRect(cropRect)->flags();
53 void sk_imagefilter_unref(sk_imagefilter_t* cfilter) {
54 SkSafeUnref(AsImageFilter(cfilter));
57 sk_imagefilter_t* sk_imagefilter_new_matrix(
58 const sk_matrix_t* cmatrix,
59 sk_filter_quality_t cquality,
60 sk_imagefilter_t* input /*NULL*/) {
63 from_c(cmatrix, &matrix);
65 sk_sp<SkImageFilter> filter = SkImageFilter::MakeMatrixFilter(matrix, (SkFilterQuality)cquality, sk_ref_sp(AsImageFilter(input)));
66 return ToImageFilter(filter.release());
69 sk_imagefilter_t* sk_imagefilter_new_alpha_threshold(
70 const sk_irect_t* region,
73 sk_imagefilter_t* input /*NULL*/) {
75 SkRegion r = SkRegion(AsIRect(*region));
77 sk_sp<SkImageFilter> filter = SkAlphaThresholdFilter::Make(r, innerThreshold, outerThreshold, sk_ref_sp(AsImageFilter(input)));
78 return ToImageFilter(filter.release());
81 sk_imagefilter_t* sk_imagefilter_new_blur(
84 sk_imagefilter_t* input /*NULL*/,
85 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
87 sk_sp<SkImageFilter> filter = SkImageFilter::MakeBlur(sigmaX, sigmaY, sk_ref_sp(AsImageFilter(input)), AsImageFilterCropRect(cropRect));
88 return ToImageFilter(filter.release());
91 sk_imagefilter_t* sk_imagefilter_new_color_filter(
93 sk_imagefilter_t* input /*NULL*/,
94 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
96 sk_sp<SkImageFilter> filter = SkColorFilterImageFilter::Make(sk_ref_sp(AsColorFilter(cf)), sk_ref_sp(AsImageFilter(input)), AsImageFilterCropRect(cropRect));
97 return ToImageFilter(filter.release());
100 sk_imagefilter_t* sk_imagefilter_new_compose(
101 sk_imagefilter_t* outer,
102 sk_imagefilter_t* inner) {
104 sk_sp<SkImageFilter> filter = SkComposeImageFilter::Make(sk_ref_sp(AsImageFilter(outer)), sk_ref_sp(AsImageFilter(inner)));
105 return ToImageFilter(filter.release());
108 sk_imagefilter_t* sk_imagefilter_new_displacement_map_effect(
109 sk_displacement_map_effect_channel_selector_type_t xChannelSelector,
110 sk_displacement_map_effect_channel_selector_type_t yChannelSelector,
112 sk_imagefilter_t* displacement,
113 sk_imagefilter_t* color /*NULL*/,
114 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
116 sk_sp<SkImageFilter> filter = SkDisplacementMapEffect::Make(
117 (SkDisplacementMapEffect::ChannelSelectorType)xChannelSelector,
118 (SkDisplacementMapEffect::ChannelSelectorType)yChannelSelector,
120 sk_ref_sp(AsImageFilter(displacement)),
121 sk_ref_sp(AsImageFilter(color)),
122 AsImageFilterCropRect(cropRect));
123 return ToImageFilter(filter.release());
126 sk_imagefilter_t* sk_imagefilter_new_drop_shadow(
132 sk_drop_shadow_image_filter_shadow_mode_t cShadowMode,
133 sk_imagefilter_t* input /*NULL*/,
134 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
136 sk_sp<SkImageFilter> filter = SkDropShadowImageFilter::Make(
142 (SkDropShadowImageFilter::ShadowMode)cShadowMode,
143 sk_ref_sp(AsImageFilter(input)),
144 AsImageFilterCropRect(cropRect));
145 return ToImageFilter(filter.release());
148 sk_imagefilter_t* sk_imagefilter_new_distant_lit_diffuse(
149 const sk_point3_t* direction,
150 sk_color_t lightColor,
153 sk_imagefilter_t* input /*NULL*/,
154 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
156 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeDistantLitDiffuse(
157 *AsPoint3(direction),
161 sk_ref_sp(AsImageFilter(input)),
162 AsImageFilterCropRect(cropRect));
163 return ToImageFilter(filter.release());
166 sk_imagefilter_t* sk_imagefilter_new_point_lit_diffuse(
167 const sk_point3_t* location,
168 sk_color_t lightColor,
171 sk_imagefilter_t* input /*NULL*/,
172 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
174 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakePointLitDiffuse(
179 sk_ref_sp(AsImageFilter(input)),
180 AsImageFilterCropRect(cropRect));
181 return ToImageFilter(filter.release());
184 sk_imagefilter_t* sk_imagefilter_new_spot_lit_diffuse(
185 const sk_point3_t* location,
186 const sk_point3_t* target,
187 float specularExponent,
189 sk_color_t lightColor,
192 sk_imagefilter_t* input /*NULL*/,
193 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
195 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeSpotLitDiffuse(
203 sk_ref_sp(AsImageFilter(input)),
204 AsImageFilterCropRect(cropRect));
205 return ToImageFilter(filter.release());
208 sk_imagefilter_t* sk_imagefilter_new_distant_lit_specular(
209 const sk_point3_t* direction,
210 sk_color_t lightColor,
214 sk_imagefilter_t* input /*NULL*/,
215 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
217 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeDistantLitSpecular(
218 *AsPoint3(direction),
223 sk_ref_sp(AsImageFilter(input)),
224 AsImageFilterCropRect(cropRect));
225 return ToImageFilter(filter.release());
228 sk_imagefilter_t* sk_imagefilter_new_point_lit_specular(
229 const sk_point3_t* location,
230 sk_color_t lightColor,
234 sk_imagefilter_t* input /*NULL*/,
235 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
237 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakePointLitSpecular(
243 sk_ref_sp(AsImageFilter(input)),
244 AsImageFilterCropRect(cropRect));
245 return ToImageFilter(filter.release());
248 sk_imagefilter_t* sk_imagefilter_new_spot_lit_specular(
249 const sk_point3_t* location,
250 const sk_point3_t* target,
251 float specularExponent,
253 sk_color_t lightColor,
257 sk_imagefilter_t* input /*NULL*/,
258 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
260 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeSpotLitSpecular(
269 sk_ref_sp(AsImageFilter(input)),
270 AsImageFilterCropRect(cropRect));
271 return ToImageFilter(filter.release());
274 sk_imagefilter_t* sk_imagefilter_new_magnifier(
275 const sk_rect_t* src,
277 sk_imagefilter_t* input /*NULL*/) {
279 sk_sp<SkImageFilter> filter = SkMagnifierImageFilter::Make(
282 sk_ref_sp(AsImageFilter(input)));
283 return ToImageFilter(filter.release());
286 sk_imagefilter_t* sk_imagefilter_new_matrix_convolution(
287 const sk_isize_t* kernelSize,
288 const float kernel[],
291 const sk_ipoint_t* kernelOffset,
292 sk_matrix_convolution_tilemode_t ctileMode,
294 sk_imagefilter_t* input /*NULL*/,
295 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
297 sk_sp<SkImageFilter> filter = SkMatrixConvolutionImageFilter::Make(
298 *AsISize(kernelSize),
302 *AsIPoint(kernelOffset),
303 (SkMatrixConvolutionImageFilter::TileMode)ctileMode,
305 sk_ref_sp(AsImageFilter(input)),
306 AsImageFilterCropRect(cropRect));
307 return ToImageFilter(filter.release());
310 sk_imagefilter_t* sk_imagefilter_new_merge(
311 sk_imagefilter_t* cfilters[],
313 const sk_blendmode_t cmodes[] /*NULL*/,
314 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
316 sk_sp<SkImageFilter>* filters = new sk_sp<SkImageFilter>[count];
317 for (int i = 0; i < count; i++) {
318 filters[i] = sk_ref_sp(AsImageFilter(cfilters[i]));
321 sk_sp<SkImageFilter> filter = SkMergeImageFilter::MakeN(
324 (SkBlendMode*)cmodes,
325 AsImageFilterCropRect(cropRect));
327 return ToImageFilter(filter.release());
330 sk_imagefilter_t* sk_imagefilter_new_dilate(
333 sk_imagefilter_t* input /*NULL*/,
334 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
336 sk_sp<SkImageFilter> filter = SkDilateImageFilter::Make(
339 sk_ref_sp(AsImageFilter(input)),
340 AsImageFilterCropRect(cropRect));
341 return ToImageFilter(filter.release());
344 sk_imagefilter_t* sk_imagefilter_new_erode(
347 sk_imagefilter_t* input /*NULL*/,
348 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
350 sk_sp<SkImageFilter> filter = SkErodeImageFilter::Make(
353 sk_ref_sp(AsImageFilter(input)),
354 AsImageFilterCropRect(cropRect));
355 return ToImageFilter(filter.release());
358 sk_imagefilter_t* sk_imagefilter_new_offset(
361 sk_imagefilter_t* input /*NULL*/,
362 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
364 sk_sp<SkImageFilter> filter = SkOffsetImageFilter::Make(
367 sk_ref_sp(AsImageFilter(input)),
368 AsImageFilterCropRect(cropRect));
369 return ToImageFilter(filter.release());
372 sk_imagefilter_t* sk_imagefilter_new_picture(
373 sk_picture_t* picture) {
375 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(
376 sk_ref_sp(AsPicture(picture)));
377 return ToImageFilter(filter.release());
380 sk_imagefilter_t* sk_imagefilter_new_picture_with_croprect(
381 sk_picture_t* picture,
382 const sk_rect_t* cropRect) {
384 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(
385 sk_ref_sp(AsPicture(picture)),
387 return ToImageFilter(filter.release());
390 sk_imagefilter_t* sk_imagefilter_new_picture_for_localspace(
391 sk_picture_t* picture,
392 const sk_rect_t* cropRect,
393 sk_filter_quality_t filterQuality) {
395 sk_sp<SkImageFilter> filter = SkPictureImageFilter::MakeForLocalSpace(
396 sk_ref_sp(AsPicture(picture)),
398 (SkFilterQuality)filterQuality);
399 return ToImageFilter(filter.release());
402 sk_imagefilter_t* sk_imagefilter_new_tile(
403 const sk_rect_t* src,
404 const sk_rect_t* dst,
405 sk_imagefilter_t* input) {
407 sk_sp<SkImageFilter> filter = SkTileImageFilter::Make(
410 sk_ref_sp(AsImageFilter(input)));
411 return ToImageFilter(filter.release());
414 sk_imagefilter_t* sk_imagefilter_new_xfermode(
415 sk_blendmode_t cmode,
416 sk_imagefilter_t* background,
417 sk_imagefilter_t* foreground /*NULL*/,
418 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
420 sk_sp<SkImageFilter> filter = SkXfermodeImageFilter::Make(
422 sk_ref_sp(AsImageFilter(background)),
423 sk_ref_sp(AsImageFilter(foreground)),
424 AsImageFilterCropRect(cropRect));
425 return ToImageFilter(filter.release());
428 SK_API sk_imagefilter_t* sk_imagefilter_new_arithmetic(
429 float k1, float k2, float k3, float k4,
431 sk_imagefilter_t* background,
432 sk_imagefilter_t* foreground /*NULL*/,
433 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
435 sk_sp<SkImageFilter> filter = SkArithmeticImageFilter::Make(
438 sk_ref_sp(AsImageFilter(background)),
439 sk_ref_sp(AsImageFilter(foreground)),
440 AsImageFilterCropRect(cropRect));
441 return ToImageFilter(filter.release());