2 * Copyright 2014 Google Inc.
3 * Copyright 2015 Xamarin Inc.
4 * Copyright 2017 Microsoft Corporation. All rights reserved.
6 * Use of this source code is governed by a BSD-style license that can be
7 * found in the LICENSE file.
10 #include "SkImageFilter.h"
11 #include "SkColorFilter.h"
12 #include "SkAlphaThresholdFilter.h"
13 #include "SkBlurImageFilter.h"
14 #include "SkColorFilterImageFilter.h"
15 #include "SkComposeImageFilter.h"
16 #include "SkDisplacementMapEffect.h"
17 #include "SkDropShadowImageFilter.h"
18 #include "SkLightingImageFilter.h"
19 #include "SkMagnifierImageFilter.h"
20 #include "SkMatrixConvolutionImageFilter.h"
21 #include "SkMergeImageFilter.h"
22 #include "SkMorphologyImageFilter.h"
23 #include "SkOffsetImageFilter.h"
24 #include "SkPictureImageFilter.h"
25 #include "SkTileImageFilter.h"
26 #include "SkXfermodeImageFilter.h"
27 #include "SkArithmeticImageFilter.h"
28 #include "SkImageSource.h"
29 #include "SkPaintImageFilter.h"
32 #include "sk_imagefilter.h"
34 #include "sk_types_priv.h"
36 sk_imagefilter_croprect_t* sk_imagefilter_croprect_new() {
37 return (sk_imagefilter_croprect_t*) new SkImageFilter::CropRect();
40 sk_imagefilter_croprect_t* sk_imagefilter_croprect_new_with_rect(const sk_rect_t* rect, uint32_t flags) {
41 return (sk_imagefilter_croprect_t*) new SkImageFilter::CropRect(*AsRect(rect), flags);
44 void sk_imagefilter_croprect_destructor(sk_imagefilter_croprect_t* cropRect) {
45 delete AsImageFilterCropRect(cropRect);
48 void sk_imagefilter_croprect_get_rect(sk_imagefilter_croprect_t* cropRect, sk_rect_t* rect) {
50 *rect = ToRect(AsImageFilterCropRect(cropRect)->rect());
54 uint32_t sk_imagefilter_croprect_get_flags(sk_imagefilter_croprect_t* cropRect) {
55 return AsImageFilterCropRect(cropRect)->flags();
58 void sk_imagefilter_unref(sk_imagefilter_t* cfilter) {
59 SkSafeUnref(AsImageFilter(cfilter));
62 sk_imagefilter_t* sk_imagefilter_new_matrix(
63 const sk_matrix_t* cmatrix,
64 sk_filter_quality_t cquality,
65 sk_imagefilter_t* input /*NULL*/) {
68 from_c(cmatrix, &matrix);
70 sk_sp<SkImageFilter> filter = SkImageFilter::MakeMatrixFilter(matrix, (SkFilterQuality)cquality, sk_ref_sp(AsImageFilter(input)));
71 return ToImageFilter(filter.release());
74 sk_imagefilter_t* sk_imagefilter_new_alpha_threshold(
75 const sk_irect_t* region,
78 sk_imagefilter_t* input /*NULL*/) {
80 SkRegion r = SkRegion(AsIRect(*region));
82 sk_sp<SkImageFilter> filter = SkAlphaThresholdFilter::Make(r, innerThreshold, outerThreshold, sk_ref_sp(AsImageFilter(input)));
83 return ToImageFilter(filter.release());
86 sk_imagefilter_t* sk_imagefilter_new_blur(
89 sk_imagefilter_t* input /*NULL*/,
90 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
92 sk_sp<SkImageFilter> filter = SkImageFilter::MakeBlur(sigmaX, sigmaY, sk_ref_sp(AsImageFilter(input)), AsImageFilterCropRect(cropRect));
93 return ToImageFilter(filter.release());
96 sk_imagefilter_t* sk_imagefilter_new_color_filter(
98 sk_imagefilter_t* input /*NULL*/,
99 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
101 sk_sp<SkImageFilter> filter = SkColorFilterImageFilter::Make(sk_ref_sp(AsColorFilter(cf)), sk_ref_sp(AsImageFilter(input)), AsImageFilterCropRect(cropRect));
102 return ToImageFilter(filter.release());
105 sk_imagefilter_t* sk_imagefilter_new_compose(
106 sk_imagefilter_t* outer,
107 sk_imagefilter_t* inner) {
109 sk_sp<SkImageFilter> filter = SkComposeImageFilter::Make(sk_ref_sp(AsImageFilter(outer)), sk_ref_sp(AsImageFilter(inner)));
110 return ToImageFilter(filter.release());
113 sk_imagefilter_t* sk_imagefilter_new_displacement_map_effect(
114 sk_displacement_map_effect_channel_selector_type_t xChannelSelector,
115 sk_displacement_map_effect_channel_selector_type_t yChannelSelector,
117 sk_imagefilter_t* displacement,
118 sk_imagefilter_t* color /*NULL*/,
119 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
121 sk_sp<SkImageFilter> filter = SkDisplacementMapEffect::Make(
122 (SkDisplacementMapEffect::ChannelSelectorType)xChannelSelector,
123 (SkDisplacementMapEffect::ChannelSelectorType)yChannelSelector,
125 sk_ref_sp(AsImageFilter(displacement)),
126 sk_ref_sp(AsImageFilter(color)),
127 AsImageFilterCropRect(cropRect));
128 return ToImageFilter(filter.release());
131 sk_imagefilter_t* sk_imagefilter_new_drop_shadow(
137 sk_drop_shadow_image_filter_shadow_mode_t cShadowMode,
138 sk_imagefilter_t* input /*NULL*/,
139 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
141 sk_sp<SkImageFilter> filter = SkDropShadowImageFilter::Make(
147 (SkDropShadowImageFilter::ShadowMode)cShadowMode,
148 sk_ref_sp(AsImageFilter(input)),
149 AsImageFilterCropRect(cropRect));
150 return ToImageFilter(filter.release());
153 sk_imagefilter_t* sk_imagefilter_new_distant_lit_diffuse(
154 const sk_point3_t* direction,
155 sk_color_t lightColor,
158 sk_imagefilter_t* input /*NULL*/,
159 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
161 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeDistantLitDiffuse(
162 *AsPoint3(direction),
166 sk_ref_sp(AsImageFilter(input)),
167 AsImageFilterCropRect(cropRect));
168 return ToImageFilter(filter.release());
171 sk_imagefilter_t* sk_imagefilter_new_point_lit_diffuse(
172 const sk_point3_t* location,
173 sk_color_t lightColor,
176 sk_imagefilter_t* input /*NULL*/,
177 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
179 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakePointLitDiffuse(
184 sk_ref_sp(AsImageFilter(input)),
185 AsImageFilterCropRect(cropRect));
186 return ToImageFilter(filter.release());
189 sk_imagefilter_t* sk_imagefilter_new_spot_lit_diffuse(
190 const sk_point3_t* location,
191 const sk_point3_t* target,
192 float specularExponent,
194 sk_color_t lightColor,
197 sk_imagefilter_t* input /*NULL*/,
198 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
200 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeSpotLitDiffuse(
208 sk_ref_sp(AsImageFilter(input)),
209 AsImageFilterCropRect(cropRect));
210 return ToImageFilter(filter.release());
213 sk_imagefilter_t* sk_imagefilter_new_distant_lit_specular(
214 const sk_point3_t* direction,
215 sk_color_t lightColor,
219 sk_imagefilter_t* input /*NULL*/,
220 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
222 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeDistantLitSpecular(
223 *AsPoint3(direction),
228 sk_ref_sp(AsImageFilter(input)),
229 AsImageFilterCropRect(cropRect));
230 return ToImageFilter(filter.release());
233 sk_imagefilter_t* sk_imagefilter_new_point_lit_specular(
234 const sk_point3_t* location,
235 sk_color_t lightColor,
239 sk_imagefilter_t* input /*NULL*/,
240 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
242 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakePointLitSpecular(
248 sk_ref_sp(AsImageFilter(input)),
249 AsImageFilterCropRect(cropRect));
250 return ToImageFilter(filter.release());
253 sk_imagefilter_t* sk_imagefilter_new_spot_lit_specular(
254 const sk_point3_t* location,
255 const sk_point3_t* target,
256 float specularExponent,
258 sk_color_t lightColor,
262 sk_imagefilter_t* input /*NULL*/,
263 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
265 sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeSpotLitSpecular(
274 sk_ref_sp(AsImageFilter(input)),
275 AsImageFilterCropRect(cropRect));
276 return ToImageFilter(filter.release());
279 sk_imagefilter_t* sk_imagefilter_new_magnifier(
280 const sk_rect_t* src,
282 sk_imagefilter_t* input, /*NULL*/
283 const sk_imagefilter_croprect_t* cropRect) {
285 sk_sp<SkImageFilter> filter = SkMagnifierImageFilter::Make(
288 sk_ref_sp(AsImageFilter(input)),
289 AsImageFilterCropRect(cropRect));
290 return ToImageFilter(filter.release());
293 sk_imagefilter_t* sk_imagefilter_new_matrix_convolution(
294 const sk_isize_t* kernelSize,
295 const float kernel[],
298 const sk_ipoint_t* kernelOffset,
299 sk_matrix_convolution_tilemode_t ctileMode,
301 sk_imagefilter_t* input /*NULL*/,
302 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
304 sk_sp<SkImageFilter> filter = SkMatrixConvolutionImageFilter::Make(
305 *AsISize(kernelSize),
309 *AsIPoint(kernelOffset),
310 (SkMatrixConvolutionImageFilter::TileMode)ctileMode,
312 sk_ref_sp(AsImageFilter(input)),
313 AsImageFilterCropRect(cropRect));
314 return ToImageFilter(filter.release());
317 sk_imagefilter_t* sk_imagefilter_new_merge(
318 sk_imagefilter_t* cfilters[],
320 const sk_blendmode_t cmodes[] /*NULL*/,
321 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
323 sk_sp<SkImageFilter>* filters = new sk_sp<SkImageFilter>[count];
324 for (int i = 0; i < count; i++) {
325 filters[i] = sk_ref_sp(AsImageFilter(cfilters[i]));
328 sk_sp<SkImageFilter> filter = SkMergeImageFilter::MakeN(
331 (SkBlendMode*)cmodes,
332 AsImageFilterCropRect(cropRect));
334 return ToImageFilter(filter.release());
337 sk_imagefilter_t* sk_imagefilter_new_dilate(
340 sk_imagefilter_t* input /*NULL*/,
341 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
343 sk_sp<SkImageFilter> filter = SkDilateImageFilter::Make(
346 sk_ref_sp(AsImageFilter(input)),
347 AsImageFilterCropRect(cropRect));
348 return ToImageFilter(filter.release());
351 sk_imagefilter_t* sk_imagefilter_new_erode(
354 sk_imagefilter_t* input /*NULL*/,
355 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
357 sk_sp<SkImageFilter> filter = SkErodeImageFilter::Make(
360 sk_ref_sp(AsImageFilter(input)),
361 AsImageFilterCropRect(cropRect));
362 return ToImageFilter(filter.release());
365 sk_imagefilter_t* sk_imagefilter_new_offset(
368 sk_imagefilter_t* input /*NULL*/,
369 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
371 sk_sp<SkImageFilter> filter = SkOffsetImageFilter::Make(
374 sk_ref_sp(AsImageFilter(input)),
375 AsImageFilterCropRect(cropRect));
376 return ToImageFilter(filter.release());
379 sk_imagefilter_t* sk_imagefilter_new_picture(
380 sk_picture_t* picture) {
382 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(
383 sk_ref_sp(AsPicture(picture)));
384 return ToImageFilter(filter.release());
387 sk_imagefilter_t* sk_imagefilter_new_picture_with_croprect(
388 sk_picture_t* picture,
389 const sk_rect_t* cropRect) {
391 sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(
392 sk_ref_sp(AsPicture(picture)),
394 return ToImageFilter(filter.release());
397 sk_imagefilter_t* sk_imagefilter_new_picture_for_localspace(
398 sk_picture_t* picture,
399 const sk_rect_t* cropRect,
400 sk_filter_quality_t filterQuality) {
402 sk_sp<SkImageFilter> filter = SkPictureImageFilter::MakeForLocalSpace(
403 sk_ref_sp(AsPicture(picture)),
405 (SkFilterQuality)filterQuality);
406 return ToImageFilter(filter.release());
409 sk_imagefilter_t* sk_imagefilter_new_tile(
410 const sk_rect_t* src,
411 const sk_rect_t* dst,
412 sk_imagefilter_t* input) {
414 sk_sp<SkImageFilter> filter = SkTileImageFilter::Make(
417 sk_ref_sp(AsImageFilter(input)));
418 return ToImageFilter(filter.release());
421 sk_imagefilter_t* sk_imagefilter_new_xfermode(
422 sk_blendmode_t cmode,
423 sk_imagefilter_t* background,
424 sk_imagefilter_t* foreground /*NULL*/,
425 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
427 sk_sp<SkImageFilter> filter = SkXfermodeImageFilter::Make(
429 sk_ref_sp(AsImageFilter(background)),
430 sk_ref_sp(AsImageFilter(foreground)),
431 AsImageFilterCropRect(cropRect));
432 return ToImageFilter(filter.release());
435 SK_API sk_imagefilter_t* sk_imagefilter_new_arithmetic(
436 float k1, float k2, float k3, float k4,
438 sk_imagefilter_t* background,
439 sk_imagefilter_t* foreground /*NULL*/,
440 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
442 sk_sp<SkImageFilter> filter = SkArithmeticImageFilter::Make(
445 sk_ref_sp(AsImageFilter(background)),
446 sk_ref_sp(AsImageFilter(foreground)),
447 AsImageFilterCropRect(cropRect));
448 return ToImageFilter(filter.release());
451 sk_imagefilter_t* sk_imagefilter_new_image_source(
453 const sk_rect_t* srcRect,
454 const sk_rect_t* dstRect,
455 sk_filter_quality_t filterQuality) {
457 sk_sp<SkImageFilter> filter = SkImageSource::Make(
458 sk_ref_sp(AsImage(image)),
461 (SkFilterQuality)filterQuality);
462 return ToImageFilter(filter.release());
465 sk_imagefilter_t* sk_imagefilter_new_image_source_default(
468 sk_sp<SkImageFilter> filter = SkImageSource::Make(
469 sk_ref_sp(AsImage(image)));
470 return ToImageFilter(filter.release());
473 sk_imagefilter_t* sk_imagefilter_new_paint(
474 const sk_paint_t* paint,
475 const sk_imagefilter_croprect_t* cropRect /*NULL*/) {
477 sk_sp<SkImageFilter> filter = SkPaintImageFilter::Make(
479 AsImageFilterCropRect(cropRect));
480 return ToImageFilter(filter.release());