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.
11 #include "SkComposeShader.h"
12 #include "SkColorFilter.h"
13 #include "SkGradientShader.h"
14 #include "SkPerlinNoiseShader.h"
16 #include "sk_shader.h"
18 #include "sk_types_priv.h"
20 sk_shader_t* sk_shader_new_empty() {
21 return ToShader(SkShader::MakeEmptyShader().release());
24 sk_shader_t* sk_shader_new_color(sk_color_t color) {
25 return ToShader(SkShader::MakeColorShader(color).release());
28 sk_shader_t* sk_shader_new_bitmap(const sk_bitmap_t* src,
29 sk_shader_tilemode_t tmx,
30 sk_shader_tilemode_t tmy,
31 const sk_matrix_t* localMatrix) {
34 from_c(localMatrix, &matrix);
38 sk_sp<SkShader> s = SkShader::MakeBitmapShader(
40 (SkShader::TileMode)tmx,
41 (SkShader::TileMode)tmy,
43 return ToShader(s.release());
46 sk_shader_t* sk_shader_new_picture(sk_picture_t* src,
47 sk_shader_tilemode_t tmx,
48 sk_shader_tilemode_t tmy,
49 const sk_matrix_t* localMatrix,
50 const sk_rect_t* tile) {
53 from_c(localMatrix, &matrix);
58 sk_sp<SkShader> s = SkShader::MakePictureShader(
59 sk_ref_sp(AsPicture(src)),
60 (SkShader::TileMode)tmx,
61 (SkShader::TileMode)tmy,
64 return ToShader(s.release());
67 sk_shader_t* sk_shader_new_color_filter(sk_shader_t* proxy,
68 sk_colorfilter_t* filter) {
69 sk_sp<SkShader> s = AsShader(proxy)->makeWithColorFilter(sk_ref_sp(AsColorFilter(filter)));
70 return ToShader(s.release());
73 sk_shader_t* sk_shader_new_local_matrix(sk_shader_t* proxy,
74 const sk_matrix_t* localMatrix) {
77 from_c(localMatrix, &matrix);
81 sk_sp<SkShader> s = AsShader(proxy)->makeWithLocalMatrix(matrix);
82 return ToShader(s.release());
85 sk_shader_t* sk_shader_new_perlin_noise_fractal_noise(
90 const sk_isize_t* ctileSize) {
92 const SkISize* tileSize = AsISize(ctileSize);
93 sk_sp<SkShader> s = SkPerlinNoiseShader::MakeFractalNoise(
99 return ToShader(s.release());
102 sk_shader_t* sk_shader_new_perlin_noise_turbulence(
103 float baseFrequencyX,
104 float baseFrequencyY,
107 const sk_isize_t* ctileSize) {
109 const SkISize* tileSize = AsISize(ctileSize);
110 sk_sp<SkShader> s = SkPerlinNoiseShader::MakeTurbulence(
116 return ToShader(s.release());
119 sk_shader_t* sk_shader_new_compose(
120 sk_shader_t* shaderA,
121 sk_shader_t* shaderB) {
123 sk_sp<SkShader> s = SkShader::MakeComposeShader(
124 sk_ref_sp(AsShader(shaderA)),
125 sk_ref_sp(AsShader(shaderB)),
126 SkBlendMode::kSrcOver);
127 return ToShader(s.release());
130 sk_shader_t* sk_shader_new_compose_with_mode(
131 sk_shader_t* shaderA,
132 sk_shader_t* shaderB,
133 sk_blendmode_t cmode) {
135 sk_sp<SkShader> s = SkShader::MakeComposeShader(
136 sk_ref_sp(AsShader(shaderA)),
137 sk_ref_sp(AsShader(shaderB)),
139 return ToShader(s.release());
142 void sk_shader_ref(sk_shader_t* cshader) {
143 SkSafeRef(AsShader(cshader));
146 void sk_shader_unref(sk_shader_t* cshader) {
147 SkSafeUnref(AsShader(cshader));
150 sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2],
151 const sk_color_t colors[],
152 const float colorPos[],
154 sk_shader_tilemode_t cmode,
155 const sk_matrix_t* cmatrix) {
158 from_c(cmatrix, &matrix);
160 matrix.setIdentity();
162 return (sk_shader_t*)SkGradientShader::MakeLinear(reinterpret_cast<const SkPoint*>(pts),
163 reinterpret_cast<const SkColor*>(colors),
164 colorPos, colorCount,
165 (SkShader::TileMode)cmode, 0, &matrix).release();
168 sk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* ccenter,
170 const sk_color_t colors[],
171 const float colorPos[],
173 sk_shader_tilemode_t cmode,
174 const sk_matrix_t* cmatrix) {
177 from_c(cmatrix, &matrix);
179 matrix.setIdentity();
181 SkPoint center = AsPoint(*ccenter);
182 return (sk_shader_t*)SkGradientShader::MakeRadial(center, (SkScalar)radius,
183 reinterpret_cast<const SkColor*>(colors),
184 reinterpret_cast<const SkScalar*>(colorPos),
185 colorCount, (SkShader::TileMode)cmode, 0, &matrix).release();
188 sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* ccenter,
189 const sk_color_t colors[],
190 const float colorPos[],
192 const sk_matrix_t* cmatrix) {
195 from_c(cmatrix, &matrix);
197 matrix.setIdentity();
199 return (sk_shader_t*)SkGradientShader::MakeSweep((SkScalar)(ccenter->x),
200 (SkScalar)(ccenter->y),
201 reinterpret_cast<const SkColor*>(colors),
202 reinterpret_cast<const SkScalar*>(colorPos),
203 colorCount, 0, &matrix).release();
206 sk_shader_t* sk_shader_new_two_point_conical_gradient(const sk_point_t* start,
208 const sk_point_t* end,
210 const sk_color_t colors[],
211 const float colorPos[],
213 sk_shader_tilemode_t cmode,
214 const sk_matrix_t* cmatrix) {
217 from_c(cmatrix, &matrix);
219 matrix.setIdentity();
221 SkPoint skstart = AsPoint(*start);
222 SkPoint skend = AsPoint(*end);
223 return (sk_shader_t*)SkGradientShader::MakeTwoPointConical(skstart, (SkScalar)startRadius,
224 skend, (SkScalar)endRadius,
225 reinterpret_cast<const SkColor*>(colors),
226 reinterpret_cast<const SkScalar*>(colorPos),
227 colorCount, (SkShader::TileMode)cmode, 0, &matrix).release();