From 65cc3e46445a26aadd21f111e0d69fd18fd8aa11 Mon Sep 17 00:00:00 2001 From: halcanary Date: Wed, 12 Aug 2015 07:37:34 -0700 Subject: C API: add radial, sweep, and two-point conical gradient shaders Review URL: https://codereview.chromium.org/1263773006 --- src/c/sk_surface.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'src/c') diff --git a/src/c/sk_surface.cpp b/src/c/sk_surface.cpp index 84a9c541c2..ccab9dfa1a 100644 --- a/src/c/sk_surface.cpp +++ b/src/c/sk_surface.cpp @@ -556,6 +556,86 @@ sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2], return (sk_shader_t*)s; } +static const SkPoint& to_skpoint(const sk_point_t& p) { + return reinterpret_cast(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 NULL; + } + SkMatrix matrix; + if (cmatrix) { + from_c_matrix(cmatrix, &matrix); + } else { + matrix.setIdentity(); + } + SkPoint center = to_skpoint(*ccenter); + SkShader* s = SkGradientShader::CreateRadial( + center, (SkScalar)radius, + reinterpret_cast(colors), + reinterpret_cast(colorPos), + colorCount, mode, 0, &matrix); + return (sk_shader_t*)s; +} + +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(); + } + SkShader* s = SkGradientShader::CreateSweep( + (SkScalar)(ccenter->x), + (SkScalar)(ccenter->y), + reinterpret_cast(colors), + reinterpret_cast(colorPos), + colorCount, 0, &matrix); + return (sk_shader_t*)s; +} + +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 NULL; + } + SkMatrix matrix; + if (cmatrix) { + from_c_matrix(cmatrix, &matrix); + } else { + matrix.setIdentity(); + } + SkPoint skstart = to_skpoint(*start); + SkPoint skend = to_skpoint(*end); + SkShader* s = SkGradientShader::CreateTwoPointConical( + skstart, (SkScalar)startRadius, + skend, (SkScalar)endRadius, + reinterpret_cast(colors), + reinterpret_cast(colorPos), + colorCount, mode, 0, &matrix); + return (sk_shader_t*)s; +} + /////////////////////////////////////////////////////////////////////////////////////////// #include "../../include/effects/SkBlurMaskFilter.h" -- cgit v1.2.3