| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "sk_types_priv.h" |
| #include "SkMatrix.h" |
| |
| static void from_c_matrix(const sk_matrix_t* cmatrix, SkMatrix* matrix) { |
| matrix->setAll(cmatrix->mat[0], cmatrix->mat[1], cmatrix->mat[2], |
| cmatrix->mat[3], cmatrix->mat[4], cmatrix->mat[5], |
| cmatrix->mat[6], cmatrix->mat[7], cmatrix->mat[8]); |
| } |
| |
| #include "../../include/effects/SkGradientShader.h" |
| #include "sk_shader.h" |
| |
| const struct { |
| sk_shader_tilemode_t fC; |
| SkShader::TileMode fSK; |
| } gTileModeMap[] = { |
| { CLAMP_SK_SHADER_TILEMODE, SkShader::kClamp_TileMode }, |
| { REPEAT_SK_SHADER_TILEMODE, SkShader::kRepeat_TileMode }, |
| { MIRROR_SK_SHADER_TILEMODE, SkShader::kMirror_TileMode }, |
| }; |
| |
| static bool from_c_tilemode(sk_shader_tilemode_t cMode, SkShader::TileMode* skMode) { |
| for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) { |
| if (cMode == gTileModeMap[i].fC) { |
| if (skMode) { |
| *skMode = gTileModeMap[i].fSK; |
| } |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| void sk_shader_ref(sk_shader_t* cshader) { |
| SkSafeRef(AsShader(cshader)); |
| } |
| |
| void sk_shader_unref(sk_shader_t* cshader) { |
| SkSafeUnref(AsShader(cshader)); |
| } |
| |
| sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2], |
| const sk_color_t colors[], |
| const float colorPos[], |
| int colorCount, |
| sk_shader_tilemode_t cmode, |
| const sk_matrix_t* cmatrix) { |
| SkShader::TileMode mode; |
| if (!from_c_tilemode(cmode, &mode)) { |
| return nullptr; |
| } |
| SkMatrix matrix; |
| if (cmatrix) { |
| from_c_matrix(cmatrix, &matrix); |
| } else { |
| matrix.setIdentity(); |
| } |
| return (sk_shader_t*)SkGradientShader::MakeLinear(reinterpret_cast<const SkPoint*>(pts), |
| reinterpret_cast<const SkColor*>(colors), |
| colorPos, colorCount, |
| mode, 0, &matrix).release(); |
| } |
| |
| static const SkPoint& to_skpoint(const sk_point_t& p) { |
| return reinterpret_cast<const SkPoint&>(p); |
| } |
| |
| sk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* ccenter, |
| float radius, |
| const sk_color_t colors[], |
| const float colorPos[], |
| int colorCount, |
| sk_shader_tilemode_t cmode, |
| const sk_matrix_t* cmatrix) { |
| SkShader::TileMode mode; |
| if (!from_c_tilemode(cmode, &mode)) { |
| return nullptr; |
| } |
| SkMatrix matrix; |
| if (cmatrix) { |
| from_c_matrix(cmatrix, &matrix); |
| } else { |
| matrix.setIdentity(); |
| } |
| SkPoint center = to_skpoint(*ccenter); |
| return (sk_shader_t*)SkGradientShader::MakeRadial(center, (SkScalar)radius, |
| reinterpret_cast<const SkColor*>(colors), |
| reinterpret_cast<const SkScalar*>(colorPos), |
| colorCount, mode, 0, &matrix).release(); |
| } |
| |
| sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* ccenter, |
| const sk_color_t colors[], |
| const float colorPos[], |
| int colorCount, |
| const sk_matrix_t* cmatrix) { |
| SkMatrix matrix; |
| if (cmatrix) { |
| from_c_matrix(cmatrix, &matrix); |
| } else { |
| matrix.setIdentity(); |
| } |
| return (sk_shader_t*)SkGradientShader::MakeSweep((SkScalar)(ccenter->x), |
| (SkScalar)(ccenter->y), |
| reinterpret_cast<const SkColor*>(colors), |
| reinterpret_cast<const SkScalar*>(colorPos), |
| colorCount, 0, &matrix).release(); |
| } |
| |
| sk_shader_t* sk_shader_new_two_point_conical_gradient(const sk_point_t* start, |
| float startRadius, |
| const sk_point_t* end, |
| float endRadius, |
| const sk_color_t colors[], |
| const float colorPos[], |
| int colorCount, |
| sk_shader_tilemode_t cmode, |
| const sk_matrix_t* cmatrix) { |
| SkShader::TileMode mode; |
| if (!from_c_tilemode(cmode, &mode)) { |
| return nullptr; |
| } |
| SkMatrix matrix; |
| if (cmatrix) { |
| from_c_matrix(cmatrix, &matrix); |
| } else { |
| matrix.setIdentity(); |
| } |
| SkPoint skstart = to_skpoint(*start); |
| SkPoint skend = to_skpoint(*end); |
| return (sk_shader_t*)SkGradientShader::MakeTwoPointConical(skstart, (SkScalar)startRadius, |
| skend, (SkScalar)endRadius, |
| reinterpret_cast<const SkColor*>(colors), |
| reinterpret_cast<const SkScalar*>(colorPos), |
| colorCount, mode, 0, &matrix).release(); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////////////////// |
| |
| #include "sk_maskfilter.h" |
| #include "SkMaskFilter.h" |
| |
| const struct { |
| sk_blurstyle_t fC; |
| SkBlurStyle fSk; |
| } gBlurStylePairs[] = { |
| { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle }, |
| { SOLID_SK_BLUR_STYLE, kSolid_SkBlurStyle }, |
| { OUTER_SK_BLUR_STYLE, kOuter_SkBlurStyle }, |
| { INNER_SK_BLUR_STYLE, kInner_SkBlurStyle }, |
| }; |
| |
| static bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) { |
| for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) { |
| if (gBlurStylePairs[i].fC == csrc) { |
| if (dst) { |
| *dst = gBlurStylePairs[i].fSk; |
| } |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| void sk_maskfilter_ref(sk_maskfilter_t* cfilter) { |
| SkSafeRef(AsMaskFilter(cfilter)); |
| } |
| |
| void sk_maskfilter_unref(sk_maskfilter_t* cfilter) { |
| SkSafeUnref(AsMaskFilter(cfilter)); |
| } |
| |
| sk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) { |
| SkBlurStyle style; |
| if (!find_blurstyle(cstyle, &style)) { |
| return nullptr; |
| } |
| return ToMaskFilter(SkMaskFilter::MakeBlur(style, sigma).release()); |
| } |