1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 9cb93a386Sopenharmony_ci#include "src/c/sk_types_priv.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_cistatic void from_c_matrix(const sk_matrix_t* cmatrix, SkMatrix* matrix) { 12cb93a386Sopenharmony_ci matrix->setAll(cmatrix->mat[0], cmatrix->mat[1], cmatrix->mat[2], 13cb93a386Sopenharmony_ci cmatrix->mat[3], cmatrix->mat[4], cmatrix->mat[5], 14cb93a386Sopenharmony_ci cmatrix->mat[6], cmatrix->mat[7], cmatrix->mat[8]); 15cb93a386Sopenharmony_ci} 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#include "include/c/sk_shader.h" 18cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciconst struct { 21cb93a386Sopenharmony_ci sk_shader_tilemode_t fC; 22cb93a386Sopenharmony_ci SkTileMode fSK; 23cb93a386Sopenharmony_ci} gTileModeMap[] = { 24cb93a386Sopenharmony_ci { CLAMP_SK_SHADER_TILEMODE, SkTileMode::kClamp }, 25cb93a386Sopenharmony_ci { REPEAT_SK_SHADER_TILEMODE, SkTileMode::kRepeat }, 26cb93a386Sopenharmony_ci { MIRROR_SK_SHADER_TILEMODE, SkTileMode::kMirror }, 27cb93a386Sopenharmony_ci}; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cistatic bool from_c_tilemode(sk_shader_tilemode_t cMode, SkTileMode* skMode) { 30cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) { 31cb93a386Sopenharmony_ci if (cMode == gTileModeMap[i].fC) { 32cb93a386Sopenharmony_ci if (skMode) { 33cb93a386Sopenharmony_ci *skMode = gTileModeMap[i].fSK; 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci return true; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci return false; 39cb93a386Sopenharmony_ci} 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_civoid sk_shader_ref(sk_shader_t* cshader) { 42cb93a386Sopenharmony_ci SkSafeRef(AsShader(cshader)); 43cb93a386Sopenharmony_ci} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_civoid sk_shader_unref(sk_shader_t* cshader) { 46cb93a386Sopenharmony_ci SkSafeUnref(AsShader(cshader)); 47cb93a386Sopenharmony_ci} 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_cisk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2], 50cb93a386Sopenharmony_ci const sk_color_t colors[], 51cb93a386Sopenharmony_ci const float colorPos[], 52cb93a386Sopenharmony_ci int colorCount, 53cb93a386Sopenharmony_ci sk_shader_tilemode_t cmode, 54cb93a386Sopenharmony_ci const sk_matrix_t* cmatrix) { 55cb93a386Sopenharmony_ci SkTileMode mode; 56cb93a386Sopenharmony_ci if (!from_c_tilemode(cmode, &mode)) { 57cb93a386Sopenharmony_ci return nullptr; 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci SkMatrix matrix; 60cb93a386Sopenharmony_ci if (cmatrix) { 61cb93a386Sopenharmony_ci from_c_matrix(cmatrix, &matrix); 62cb93a386Sopenharmony_ci } else { 63cb93a386Sopenharmony_ci matrix.setIdentity(); 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci return (sk_shader_t*)SkGradientShader::MakeLinear(reinterpret_cast<const SkPoint*>(pts), 66cb93a386Sopenharmony_ci reinterpret_cast<const SkColor*>(colors), 67cb93a386Sopenharmony_ci colorPos, colorCount, 68cb93a386Sopenharmony_ci mode, 0, &matrix).release(); 69cb93a386Sopenharmony_ci} 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_cistatic const SkPoint& to_skpoint(const sk_point_t& p) { 72cb93a386Sopenharmony_ci return reinterpret_cast<const SkPoint&>(p); 73cb93a386Sopenharmony_ci} 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_cisk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* ccenter, 76cb93a386Sopenharmony_ci float radius, 77cb93a386Sopenharmony_ci const sk_color_t colors[], 78cb93a386Sopenharmony_ci const float colorPos[], 79cb93a386Sopenharmony_ci int colorCount, 80cb93a386Sopenharmony_ci sk_shader_tilemode_t cmode, 81cb93a386Sopenharmony_ci const sk_matrix_t* cmatrix) { 82cb93a386Sopenharmony_ci SkTileMode mode; 83cb93a386Sopenharmony_ci if (!from_c_tilemode(cmode, &mode)) { 84cb93a386Sopenharmony_ci return nullptr; 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci SkMatrix matrix; 87cb93a386Sopenharmony_ci if (cmatrix) { 88cb93a386Sopenharmony_ci from_c_matrix(cmatrix, &matrix); 89cb93a386Sopenharmony_ci } else { 90cb93a386Sopenharmony_ci matrix.setIdentity(); 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci SkPoint center = to_skpoint(*ccenter); 93cb93a386Sopenharmony_ci return (sk_shader_t*)SkGradientShader::MakeRadial(center, (SkScalar)radius, 94cb93a386Sopenharmony_ci reinterpret_cast<const SkColor*>(colors), 95cb93a386Sopenharmony_ci reinterpret_cast<const SkScalar*>(colorPos), 96cb93a386Sopenharmony_ci colorCount, mode, 0, &matrix).release(); 97cb93a386Sopenharmony_ci} 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_cisk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* ccenter, 100cb93a386Sopenharmony_ci const sk_color_t colors[], 101cb93a386Sopenharmony_ci const float colorPos[], 102cb93a386Sopenharmony_ci int colorCount, 103cb93a386Sopenharmony_ci const sk_matrix_t* cmatrix) { 104cb93a386Sopenharmony_ci SkMatrix matrix; 105cb93a386Sopenharmony_ci if (cmatrix) { 106cb93a386Sopenharmony_ci from_c_matrix(cmatrix, &matrix); 107cb93a386Sopenharmony_ci } else { 108cb93a386Sopenharmony_ci matrix.setIdentity(); 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci return (sk_shader_t*)SkGradientShader::MakeSweep((SkScalar)(ccenter->x), 111cb93a386Sopenharmony_ci (SkScalar)(ccenter->y), 112cb93a386Sopenharmony_ci reinterpret_cast<const SkColor*>(colors), 113cb93a386Sopenharmony_ci reinterpret_cast<const SkScalar*>(colorPos), 114cb93a386Sopenharmony_ci colorCount, 0, &matrix).release(); 115cb93a386Sopenharmony_ci} 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_cisk_shader_t* sk_shader_new_two_point_conical_gradient(const sk_point_t* start, 118cb93a386Sopenharmony_ci float startRadius, 119cb93a386Sopenharmony_ci const sk_point_t* end, 120cb93a386Sopenharmony_ci float endRadius, 121cb93a386Sopenharmony_ci const sk_color_t colors[], 122cb93a386Sopenharmony_ci const float colorPos[], 123cb93a386Sopenharmony_ci int colorCount, 124cb93a386Sopenharmony_ci sk_shader_tilemode_t cmode, 125cb93a386Sopenharmony_ci const sk_matrix_t* cmatrix) { 126cb93a386Sopenharmony_ci SkTileMode mode; 127cb93a386Sopenharmony_ci if (!from_c_tilemode(cmode, &mode)) { 128cb93a386Sopenharmony_ci return nullptr; 129cb93a386Sopenharmony_ci } 130cb93a386Sopenharmony_ci SkMatrix matrix; 131cb93a386Sopenharmony_ci if (cmatrix) { 132cb93a386Sopenharmony_ci from_c_matrix(cmatrix, &matrix); 133cb93a386Sopenharmony_ci } else { 134cb93a386Sopenharmony_ci matrix.setIdentity(); 135cb93a386Sopenharmony_ci } 136cb93a386Sopenharmony_ci SkPoint skstart = to_skpoint(*start); 137cb93a386Sopenharmony_ci SkPoint skend = to_skpoint(*end); 138cb93a386Sopenharmony_ci return (sk_shader_t*)SkGradientShader::MakeTwoPointConical(skstart, (SkScalar)startRadius, 139cb93a386Sopenharmony_ci skend, (SkScalar)endRadius, 140cb93a386Sopenharmony_ci reinterpret_cast<const SkColor*>(colors), 141cb93a386Sopenharmony_ci reinterpret_cast<const SkScalar*>(colorPos), 142cb93a386Sopenharmony_ci colorCount, mode, 0, &matrix).release(); 143cb93a386Sopenharmony_ci} 144cb93a386Sopenharmony_ci 145cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////// 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ci#include "include/c/sk_maskfilter.h" 148cb93a386Sopenharmony_ci#include "include/core/SkMaskFilter.h" 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ciconst struct { 151cb93a386Sopenharmony_ci sk_blurstyle_t fC; 152cb93a386Sopenharmony_ci SkBlurStyle fSk; 153cb93a386Sopenharmony_ci} gBlurStylePairs[] = { 154cb93a386Sopenharmony_ci { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle }, 155cb93a386Sopenharmony_ci { SOLID_SK_BLUR_STYLE, kSolid_SkBlurStyle }, 156cb93a386Sopenharmony_ci { OUTER_SK_BLUR_STYLE, kOuter_SkBlurStyle }, 157cb93a386Sopenharmony_ci { INNER_SK_BLUR_STYLE, kInner_SkBlurStyle }, 158cb93a386Sopenharmony_ci}; 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_cistatic bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) { 161cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) { 162cb93a386Sopenharmony_ci if (gBlurStylePairs[i].fC == csrc) { 163cb93a386Sopenharmony_ci if (dst) { 164cb93a386Sopenharmony_ci *dst = gBlurStylePairs[i].fSk; 165cb93a386Sopenharmony_ci } 166cb93a386Sopenharmony_ci return true; 167cb93a386Sopenharmony_ci } 168cb93a386Sopenharmony_ci } 169cb93a386Sopenharmony_ci return false; 170cb93a386Sopenharmony_ci} 171cb93a386Sopenharmony_ci 172cb93a386Sopenharmony_civoid sk_maskfilter_ref(sk_maskfilter_t* cfilter) { 173cb93a386Sopenharmony_ci SkSafeRef(AsMaskFilter(cfilter)); 174cb93a386Sopenharmony_ci} 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_civoid sk_maskfilter_unref(sk_maskfilter_t* cfilter) { 177cb93a386Sopenharmony_ci SkSafeUnref(AsMaskFilter(cfilter)); 178cb93a386Sopenharmony_ci} 179cb93a386Sopenharmony_ci 180cb93a386Sopenharmony_cisk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) { 181cb93a386Sopenharmony_ci SkBlurStyle style; 182cb93a386Sopenharmony_ci if (!find_blurstyle(cstyle, &style)) { 183cb93a386Sopenharmony_ci return nullptr; 184cb93a386Sopenharmony_ci } 185cb93a386Sopenharmony_ci return ToMaskFilter(SkMaskFilter::MakeBlur(style, sigma).release()); 186cb93a386Sopenharmony_ci} 187