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