From 21b89322d1cb137bc08fa476d32a4e57abe4b466 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 28 Jan 2020 14:30:48 +0200 Subject: [PATCH 1/3] Added the SkColor4f to the C API --- include/c/sk_colorspace.h | 8 ++++++++ include/c/sk_types.h | 7 +++++++ src/c/sk_colorspace.cpp | 17 +++++++++++++++++ src/c/sk_structs.cpp | 1 + src/c/sk_types_priv.h | 1 + 5 files changed, 34 insertions(+) diff --git a/include/c/sk_colorspace.h b/include/c/sk_colorspace.h index 4682b4683ca8..866d76f7bd03 100644 --- a/include/c/sk_colorspace.h +++ b/include/c/sk_colorspace.h @@ -14,6 +14,8 @@ SK_C_PLUS_PLUS_BEGIN_GUARD +// sk_colorspace_t + SK_C_API void sk_colorspace_unref(sk_colorspace_t* cColorSpace); SK_C_API sk_colorspace_t* sk_colorspace_new_srgb(void); SK_C_API sk_colorspace_t* sk_colorspace_new_srgb_linear(void); @@ -38,6 +40,12 @@ SK_C_API bool sk_colorspaceprimaries_to_xyzd50(const sk_colorspaceprimaries_t* p SK_C_API void sk_colorspace_transfer_fn_invert(const sk_colorspace_transfer_fn_t* transfer, sk_colorspace_transfer_fn_t* inverted); SK_C_API float sk_colorspace_transfer_fn_transform(const sk_colorspace_transfer_fn_t* transfer, float x); +// sk_color4f_t + +SK_C_API sk_color_t sk_color4f_to_color(const sk_color4f_t* color4f); +SK_C_API void sk_color4f_from_color(sk_color_t color, sk_color4f_t* color4f); +SK_C_API void sk_color4f_pin(const sk_color4f_t* color4f, sk_color4f_t* pinned); + SK_C_PLUS_PLUS_END_GUARD #endif diff --git a/include/c/sk_types.h b/include/c/sk_types.h index e97ce4430b83..ab138467b767 100644 --- a/include/c/sk_types.h +++ b/include/c/sk_types.h @@ -55,6 +55,13 @@ typedef uint32_t sk_pmcolor_t; #define sk_color_get_g(c) (((c) >> 8) & 0xFF) #define sk_color_get_b(c) (((c) >> 0) & 0xFF) +typedef struct sk_color4f_t { + float fR; + float fG; + float fB; + float fA; +} sk_color4f_t; + typedef enum { UNKNOWN_SK_COLORTYPE = 0, ALPHA_8_SK_COLORTYPE, diff --git a/src/c/sk_colorspace.cpp b/src/c/sk_colorspace.cpp index 8b4d7d4534d1..5bed41a1cf14 100644 --- a/src/c/sk_colorspace.cpp +++ b/src/c/sk_colorspace.cpp @@ -13,6 +13,8 @@ #include "sk_types_priv.h" +// sk_colorspace_t + void sk_colorspace_unref(sk_colorspace_t* cColorSpace) { SkSafeUnref(AsColorSpace(cColorSpace)); } @@ -105,3 +107,18 @@ float sk_colorspace_transfer_fn_transform(const sk_colorspace_transfer_fn_t* tra SkColorSpaceTransferFn fn = *AsColorSpaceTransferFn(transfer); return fn(x); } + + +// sk_color4f_t + +sk_color_t sk_color4f_to_color(const sk_color4f_t* color4f) { + return AsColor4f(color4f)->toSkColor(); +} + +void sk_color4f_from_color(sk_color_t color, sk_color4f_t* color4f) { + *color4f = ToColor4f(SkColor4f::FromColor(color)); +} + +void sk_color4f_pin(const sk_color4f_t* color4f, sk_color4f_t* pinned) { + *pinned = ToColor4f(AsColor4f(color4f)->pin()); +} diff --git a/src/c/sk_structs.cpp b/src/c/sk_structs.cpp index bb4196a735ee..a035dd8a4cf6 100644 --- a/src/c/sk_structs.cpp +++ b/src/c/sk_structs.cpp @@ -63,6 +63,7 @@ static_assert (sizeof (sk_jpegencoder_options_t) == sizeof (SkJpegEncoder::Optio static_assert (sizeof (sk_webpencoder_options_t) == sizeof (SkWebpEncoder::Options), ASSERT_MSG(SkWebpEncoder::Options, sk_webpencoder_options_t)); static_assert (sizeof (sk_textblob_builder_runbuffer_t) == sizeof (SkTextBlobBuilder::RunBuffer), ASSERT_MSG(SkTextBlobBuilder::RunBuffer, sk_textblob_builder_runbuffer_t)); static_assert (sizeof (sk_rsxform_t) == sizeof (SkRSXform), ASSERT_MSG(SkRSXform, sk_rsxform_t)); +static_assert (sizeof (sk_color4f_t) == sizeof (SkColor4f), ASSERT_MSG(SkColor4f, sk_color4f_t)); #if SK_SUPPORT_GPU static_assert (sizeof (gr_gl_framebufferinfo_t) == sizeof (GrGLFramebufferInfo), ASSERT_MSG(GrGLFramebufferInfo, gr_gl_framebufferinfo_t)); diff --git a/src/c/sk_types_priv.h b/src/c/sk_types_priv.h index 93e0314869dc..9342ef8ce5de 100644 --- a/src/c/sk_types_priv.h +++ b/src/c/sk_types_priv.h @@ -110,6 +110,7 @@ DEF_CLASS_MAP(GrContext, gr_context_t, GrContext) DEF_CLASS_MAP(GrBackendTexture, gr_backendtexture_t, GrBackendTexture) DEF_CLASS_MAP(GrBackendRenderTarget, gr_backendrendertarget_t, GrBackendRenderTarget) +DEF_STRUCT_MAP(SkColor4f, sk_color4f_t, Color4f) DEF_STRUCT_MAP(SkColorSpacePrimaries, sk_colorspaceprimaries_t, ColorSpacePrimaries) DEF_STRUCT_MAP(SkColorSpaceTransferFn, sk_colorspace_transfer_fn_t, ColorSpaceTransferFn) DEF_STRUCT_MAP(SkHighContrastConfig, sk_highcontrastconfig_t, HighContrastConfig) From 847d13d7d28458465c4d82618de7cd984841389b Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 28 Jan 2020 15:29:46 +0200 Subject: [PATCH 2/3] Add SkColor4f for SkPixmap --- include/c/sk_pixmap.h | 1 + src/c/sk_pixmap.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/c/sk_pixmap.h b/include/c/sk_pixmap.h index 46a2bd14f0a1..cbcc15e1d861 100644 --- a/include/c/sk_pixmap.h +++ b/include/c/sk_pixmap.h @@ -29,6 +29,7 @@ SK_C_API bool sk_pixmap_read_pixels(const sk_pixmap_t* cpixmap, const sk_imagein SK_C_API bool sk_pixmap_scale_pixels(const sk_pixmap_t* cpixmap, const sk_pixmap_t* dst, sk_filter_quality_t quality); SK_C_API bool sk_pixmap_extract_subset(const sk_pixmap_t* cpixmap, sk_pixmap_t* result, const sk_irect_t* subset); SK_C_API bool sk_pixmap_erase_color(const sk_pixmap_t* cpixmap, sk_color_t color, const sk_irect_t* subset); +SK_C_API bool sk_pixmap_erase_color4f(const sk_pixmap_t* cpixmap, const sk_color4f_t* color, const sk_irect_t* subset); SK_C_API sk_color_t sk_color_unpremultiply(const sk_pmcolor_t pmcolor); SK_C_API sk_pmcolor_t sk_color_premultiply(const sk_color_t color); diff --git a/src/c/sk_pixmap.cpp b/src/c/sk_pixmap.cpp index a43f56e0d4d6..846a6485ad14 100644 --- a/src/c/sk_pixmap.cpp +++ b/src/c/sk_pixmap.cpp @@ -64,10 +64,14 @@ bool sk_pixmap_extract_subset(const sk_pixmap_t* cpixmap, sk_pixmap_t* result, c return AsPixmap(cpixmap)->extractSubset(AsPixmap(result), *AsIRect(subset)); } -bool sk_pixmap_erase_color (const sk_pixmap_t* cpixmap, sk_color_t color, const sk_irect_t* subset) { +bool sk_pixmap_erase_color(const sk_pixmap_t* cpixmap, sk_color_t color, const sk_irect_t* subset) { return AsPixmap(cpixmap)->erase((SkColor)color, *AsIRect(subset)); } +bool sk_pixmap_erase_color4f(const sk_pixmap_t* cpixmap, const sk_color4f_t* color, const sk_irect_t* subset) { + return AsPixmap(cpixmap)->erase(*AsColor4f(color), AsIRect(subset)); +} + sk_color_t sk_color_unpremultiply(const sk_pmcolor_t pmcolor) { return SkUnPreMultiply::PMColorToColor(pmcolor); } From 92bf17ede386e7787ffd34900ffd95c6f5e6ce8b Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 28 Jan 2020 23:11:47 +0200 Subject: [PATCH 3/3] Add the SkShader variants --- include/c/sk_shader.h | 98 +++++++++-------------------- src/c/sk_shader.cpp | 143 ++++++++++++++++++++++++------------------ 2 files changed, 111 insertions(+), 130 deletions(-) diff --git a/include/c/sk_shader.h b/include/c/sk_shader.h index a0f292ad9bbd..74c4823781d1 100644 --- a/include/c/sk_shader.h +++ b/include/c/sk_shader.h @@ -14,76 +14,38 @@ SK_C_PLUS_PLUS_BEGIN_GUARD -SK_C_API void sk_shader_ref(sk_shader_t*); -SK_C_API void sk_shader_unref(sk_shader_t*); -SK_C_API sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t points[2], - const sk_color_t colors[], - const float colorPos[], - int colorCount, - sk_shader_tilemode_t tileMode, - const sk_matrix_t* localMatrix); -SK_C_API sk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* center, - float radius, - const sk_color_t colors[], - const float colorPos[], - int colorCount, - sk_shader_tilemode_t tileMode, - const sk_matrix_t* localMatrix); -SK_C_API sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* center, - const sk_color_t colors[], - const float colorPos[], - int colorCount, - sk_shader_tilemode_t tileMode, - float startAngle, - float endAngle, - const sk_matrix_t* localMatrix); -SK_C_API 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 tileMode, - const sk_matrix_t* localMatrix); +// SkShader + +SK_C_API void sk_shader_ref(sk_shader_t* shader); +SK_C_API void sk_shader_unref(sk_shader_t* shader); +SK_C_API sk_shader_t* sk_shader_with_local_matrix(const sk_shader_t* shader, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_with_color_filter(const sk_shader_t* shader, const sk_colorfilter_t* filter); + +// SkShaders + SK_C_API sk_shader_t* sk_shader_new_empty(void); SK_C_API sk_shader_t* sk_shader_new_color(sk_color_t color); -SK_C_API sk_shader_t* sk_shader_new_bitmap(const sk_bitmap_t* src, - sk_shader_tilemode_t tmx, - sk_shader_tilemode_t tmy, - const sk_matrix_t* localMatrix); -SK_C_API sk_shader_t* sk_shader_new_picture(sk_picture_t* src, - sk_shader_tilemode_t tmx, - sk_shader_tilemode_t tmy, - const sk_matrix_t* localMatrix, - const sk_rect_t* tile); -SK_C_API sk_shader_t* sk_shader_new_local_matrix(sk_shader_t* proxy, const sk_matrix_t* localMatrix); -SK_C_API sk_shader_t* sk_shader_new_color_filter(sk_shader_t* proxy, sk_colorfilter_t* filter); -SK_C_API sk_shader_t* sk_shader_new_perlin_noise_fractal_noise( - float baseFrequencyX, - float baseFrequencyY, - int numOctaves, - float seed, - const sk_isize_t* tileSize); -SK_C_API sk_shader_t* sk_shader_new_perlin_noise_turbulence( - float baseFrequencyX, - float baseFrequencyY, - int numOctaves, - float seed, - const sk_isize_t* tileSize); -SK_C_API sk_shader_t* sk_shader_new_perlin_noise_improved_noise( - float baseFrequencyX, - float baseFrequencyY, - int numOctaves, - float z); -SK_C_API sk_shader_t* sk_shader_new_compose( - sk_shader_t* shaderA, - sk_shader_t* shaderB); -SK_C_API sk_shader_t* sk_shader_new_compose_with_mode( - sk_shader_t* shaderA, - sk_shader_t* shaderB, - sk_blendmode_t mode); +SK_C_API sk_shader_t* sk_shader_new_color4f(const sk_color4f_t* color, const sk_colorspace_t* colorspace); +SK_C_API sk_shader_t* sk_shader_new_compose(const sk_shader_t* shaderA, const sk_shader_t* shaderB, sk_blendmode_t mode); +SK_C_API sk_shader_t* sk_shader_new_bitmap(const sk_bitmap_t* src, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_picture(sk_picture_t* src, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, const sk_matrix_t* localMatrix, const sk_rect_t* tile); + +// SkGradientShader + +SK_C_API sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t points[2], const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_linear_gradient_color4f(const sk_point_t points[2], const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* center, float radius, const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_radial_gradient_color4f(const sk_point_t* center, float radius, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* center, const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, float startAngle, float endAngle, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_sweep_gradient_color4f(const sk_point_t* center, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, float startAngle, float endAngle, const sk_matrix_t* localMatrix); +SK_C_API 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 tileMode, const sk_matrix_t* localMatrix); +SK_C_API sk_shader_t* sk_shader_new_two_point_conical_gradient_color4f(const sk_point_t* start, float startRadius, const sk_point_t* end, float endRadius, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix); + +// SkPerlinNoiseShader + +SK_C_API sk_shader_t* sk_shader_new_perlin_noise_fractal_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* tileSize); +SK_C_API sk_shader_t* sk_shader_new_perlin_noise_turbulence(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* tileSize); +SK_C_API sk_shader_t* sk_shader_new_perlin_noise_improved_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float z); SK_C_PLUS_PLUS_END_GUARD diff --git a/src/c/sk_shader.cpp b/src/c/sk_shader.cpp index 3d4b95c3ef92..4bec829e1a9d 100644 --- a/src/c/sk_shader.cpp +++ b/src/c/sk_shader.cpp @@ -17,7 +17,27 @@ #include "sk_types_priv.h" -sk_shader_t* sk_shader_new_empty() { +// SkShader + +void sk_shader_ref(sk_shader_t* shader){ + SkSafeRef(AsShader(shader)); +} + +void sk_shader_unref(sk_shader_t* shader){ + SkSafeUnref(AsShader(shader)); +} + +sk_shader_t* sk_shader_with_local_matrix(const sk_shader_t* shader, const sk_matrix_t* localMatrix) { + return ToShader(AsShader(shader)->makeWithLocalMatrix(AsMatrix(localMatrix)).release()); +} + +sk_shader_t* sk_shader_with_color_filter(const sk_shader_t* shader, const sk_colorfilter_t* filter) { + return ToShader(AsShader(shader)->makeWithColorFilter(sk_ref_sp(AsColorFilter(filter))).release()); +} + +// SkShaders + +sk_shader_t* sk_shader_new_empty(void) { return ToShader(SkShader::MakeEmptyShader().release()); } @@ -25,97 +45,96 @@ sk_shader_t* sk_shader_new_color(sk_color_t color) { return ToShader(SkShader::MakeColorShader(color).release()); } +sk_shader_t* sk_shader_new_color4f(const sk_color4f_t* color, const sk_colorspace_t* colorspace) { + return ToShader(SkShader::MakeColorShader(*AsColor4f(color), sk_ref_sp(AsColorSpace(colorspace))).release()); +} + +sk_shader_t* sk_shader_new_compose(const sk_shader_t* shaderA, const sk_shader_t* shaderB, sk_blendmode_t mode) { + return ToShader(SkShader::MakeComposeShader(sk_ref_sp(AsShader(shaderA)), sk_ref_sp(AsShader(shaderB)), (SkBlendMode)mode).release()); +} + sk_shader_t* sk_shader_new_bitmap(const sk_bitmap_t* src, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, const sk_matrix_t* localMatrix) { SkMatrix m; - if (localMatrix) { + if (localMatrix) m = AsMatrix(localMatrix); - } - return ToShader(SkShader::MakeBitmapShader( - *AsBitmap(src), (SkShader::TileMode)tmx, (SkShader::TileMode)tmy, localMatrix ? &m : nullptr).release()); + return ToShader(SkShader::MakeBitmapShader(*AsBitmap(src), (SkShader::TileMode)tmx, (SkShader::TileMode)tmy, localMatrix ? &m : nullptr).release()); } sk_shader_t* sk_shader_new_picture(sk_picture_t* src, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, const sk_matrix_t* localMatrix, const sk_rect_t* tile) { SkMatrix m; - if (localMatrix) { + if (localMatrix) m = AsMatrix(localMatrix); - } - return ToShader(SkShader::MakePictureShader( - sk_ref_sp(AsPicture(src)), (SkShader::TileMode)tmx, (SkShader::TileMode)tmy, localMatrix ? &m : nullptr, AsRect(tile)).release()); + return ToShader(SkShader::MakePictureShader(sk_ref_sp(AsPicture(src)), (SkShader::TileMode)tmx, (SkShader::TileMode)tmy, localMatrix ? &m : nullptr, AsRect(tile)).release()); } -sk_shader_t* sk_shader_new_color_filter(sk_shader_t* proxy, sk_colorfilter_t* filter) { - return ToShader(AsShader(proxy)->makeWithColorFilter(sk_ref_sp(AsColorFilter(filter))).release()); -} +// SkGradientShader -sk_shader_t* sk_shader_new_local_matrix(sk_shader_t* proxy, const sk_matrix_t* localMatrix) { - return ToShader(AsShader(proxy)->makeWithLocalMatrix(AsMatrix(localMatrix)).release()); -} - -sk_shader_t* sk_shader_new_perlin_noise_fractal_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* ctileSize) { - return ToShader(SkPerlinNoiseShader::MakeFractalNoise( - baseFrequencyX, baseFrequencyY, numOctaves, seed, AsISize(ctileSize)).release()); +sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t points[2], const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeLinear(AsPoint(points), colors, colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -sk_shader_t* sk_shader_new_perlin_noise_turbulence(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* ctileSize) { - return ToShader(SkPerlinNoiseShader::MakeTurbulence( - baseFrequencyX, baseFrequencyY, numOctaves, seed, AsISize(ctileSize)).release()); +sk_shader_t* sk_shader_new_linear_gradient_color4f(const sk_point_t points[2], const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeLinear(AsPoint(points), AsColor4f(colors), sk_ref_sp(AsColorSpace(colorspace)), colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -sk_shader_t* sk_shader_new_perlin_noise_improved_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float z) { - return ToShader(SkPerlinNoiseShader::MakeImprovedNoise( - baseFrequencyX, baseFrequencyY, numOctaves, z).release()); +sk_shader_t* sk_shader_new_radial_gradient(const sk_point_t* center, float radius, const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeRadial(*AsPoint(center), (SkScalar)radius, colors, colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -sk_shader_t* sk_shader_new_compose(sk_shader_t* shaderA, sk_shader_t* shaderB) { - return ToShader(SkShader::MakeComposeShader( - sk_ref_sp(AsShader(shaderA)), sk_ref_sp(AsShader(shaderB)), SkBlendMode::kSrcOver).release()); +sk_shader_t* sk_shader_new_radial_gradient_color4f(const sk_point_t* center, float radius, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeRadial(*AsPoint(center), (SkScalar)radius, AsColor4f(colors), sk_ref_sp(AsColorSpace(colorspace)), colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -sk_shader_t* sk_shader_new_compose_with_mode(sk_shader_t* shaderA, sk_shader_t* shaderB, sk_blendmode_t cmode) { - return ToShader(SkShader::MakeComposeShader( - sk_ref_sp(AsShader(shaderA)), sk_ref_sp(AsShader(shaderB)), (SkBlendMode)cmode).release()); +sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* center, const sk_color_t colors[], const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, float startAngle, float endAngle, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeSweep(center->x, center->y, colors, colorPos, colorCount, (SkShader::TileMode)tileMode, startAngle, endAngle, 0, localMatrix ? &m : nullptr).release()); } -void sk_shader_ref(sk_shader_t* cshader) { - SkSafeRef(AsShader(cshader)); +sk_shader_t* sk_shader_new_sweep_gradient_color4f(const sk_point_t* center, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, float startAngle, float endAngle, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeSweep(center->x, center->y, AsColor4f(colors), sk_ref_sp(AsColorSpace(colorspace)), colorPos, colorCount, (SkShader::TileMode)tileMode, startAngle, endAngle, 0, localMatrix ? &m : nullptr).release()); } -void sk_shader_unref(sk_shader_t* cshader) { - SkSafeUnref(AsShader(cshader)); +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 tileMode, const sk_matrix_t* localMatrix) { + SkMatrix m; + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeTwoPointConical(*AsPoint(start), startRadius, *AsPoint(end), endRadius, colors, colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -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) { +sk_shader_t* sk_shader_new_two_point_conical_gradient_color4f(const sk_point_t* start, float startRadius, const sk_point_t* end, float endRadius, const sk_color4f_t* colors, const sk_colorspace_t* colorspace, const float colorPos[], int colorCount, sk_shader_tilemode_t tileMode, const sk_matrix_t* localMatrix) { SkMatrix m; - if (cmatrix) { - m = AsMatrix(cmatrix); - } - return ToShader(SkGradientShader::MakeLinear( - AsPoint(pts), colors, colorPos, colorCount, (SkShader::TileMode)cmode, 0, cmatrix ? &m : nullptr).release()); + if (localMatrix) + m = AsMatrix(localMatrix); + return ToShader(SkGradientShader::MakeTwoPointConical(*AsPoint(start), startRadius, *AsPoint(end), endRadius, AsColor4f(colors), sk_ref_sp(AsColorSpace(colorspace)), colorPos, colorCount, (SkShader::TileMode)tileMode, 0, localMatrix ? &m : nullptr).release()); } -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) { - SkMatrix m; - if (cmatrix) { - m = AsMatrix(cmatrix); - } - return ToShader(SkGradientShader::MakeRadial( - *AsPoint(ccenter), (SkScalar)radius, colors, colorPos, colorCount, (SkShader::TileMode)cmode, 0, cmatrix ? &m : nullptr).release()); +// SkPerlinNoiseShader + +sk_shader_t* sk_shader_new_perlin_noise_fractal_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* tileSize) { + return ToShader(SkPerlinNoiseShader::MakeFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, seed, AsISize(tileSize)).release()); } -sk_shader_t* sk_shader_new_sweep_gradient(const sk_point_t* ccenter, const sk_color_t* colors, const float* colorPos, int colorCount, sk_shader_tilemode_t cmode, float startAngle, float endAngle, const sk_matrix_t* cmatrix) { - SkMatrix m; - if (cmatrix) { - m = AsMatrix(cmatrix); - } - return ToShader(SkGradientShader::MakeSweep( - ccenter->x, ccenter->y, colors, colorPos, colorCount, (SkShader::TileMode)cmode, startAngle, endAngle, 0, cmatrix ? &m : nullptr).release()); +sk_shader_t* sk_shader_new_perlin_noise_turbulence(float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, const sk_isize_t* tileSize) { + return ToShader(SkPerlinNoiseShader::MakeTurbulence(baseFrequencyX, baseFrequencyY, numOctaves, seed, AsISize(tileSize)).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) { - SkMatrix m; - if (cmatrix) { - m = AsMatrix(cmatrix); - } - return ToShader(SkGradientShader::MakeTwoPointConical( - *AsPoint(start), startRadius, *AsPoint(end), endRadius, colors, colorPos, colorCount, (SkShader::TileMode)cmode, 0, cmatrix ? &m : nullptr).release()); +sk_shader_t* sk_shader_new_perlin_noise_improved_noise(float baseFrequencyX, float baseFrequencyY, int numOctaves, float z) { + return ToShader(SkPerlinNoiseShader::MakeImprovedNoise(baseFrequencyX, baseFrequencyY, numOctaves, z).release()); }