diff --git a/include/c/sk_imagefilter.h b/include/c/sk_imagefilter.h index 528250a4bc79..468a9c6616c4 100644 --- a/include/c/sk_imagefilter.h +++ b/include/c/sk_imagefilter.h @@ -47,7 +47,7 @@ SK_C_API sk_imagefilter_t* sk_imagefilter_new_spot_lit_diffuse(const sk_point3_t SK_C_API sk_imagefilter_t* sk_imagefilter_new_distant_lit_specular(const sk_point3_t* direction, sk_color_t lightColor, float surfaceScale, float ks, float shininess, const sk_imagefilter_t* input, const sk_rect_t* cropRect); SK_C_API sk_imagefilter_t* sk_imagefilter_new_point_lit_specular(const sk_point3_t* location, sk_color_t lightColor, float surfaceScale, float ks, float shininess, const sk_imagefilter_t* input, const sk_rect_t* cropRect); SK_C_API sk_imagefilter_t* sk_imagefilter_new_spot_lit_specular(const sk_point3_t* location, const sk_point3_t* target, float specularExponent, float cutoffAngle, sk_color_t lightColor, float surfaceScale, float ks, float shininess, const sk_imagefilter_t* input, const sk_rect_t* cropRect); - +SK_C_API sk_imagefilter_t* sk_imagefilter_new_runtime_shader(const sk_runtimeshaderbuilder_t* builder, float maxSampleRadius, const char* childShaderNames[], const sk_imagefilter_t* inputs[], int inputCount); SK_C_PLUS_PLUS_END_GUARD diff --git a/include/c/sk_runtimeeffect.h b/include/c/sk_runtimeeffect.h index fe56b447f403..dccd86171448 100644 --- a/include/c/sk_runtimeeffect.h +++ b/include/c/sk_runtimeeffect.h @@ -31,6 +31,9 @@ SK_C_API void sk_runtimeeffect_get_child_name(const sk_runtimeeffect_t* effect, SK_C_API void sk_runtimeeffect_get_child_from_index(const sk_runtimeeffect_t* effect, int index, sk_runtimeeffect_child_t* cchild); SK_C_API void sk_runtimeeffect_get_child_from_name(const sk_runtimeeffect_t* effect, const char* name, size_t len, sk_runtimeeffect_child_t* cchild); +SK_C_API sk_runtimeshaderbuilder_t* sk_runtimeshaderbuilder_new(const sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount); +SK_C_API void sk_runtimeshaderbuilder_destructor(sk_runtimeshaderbuilder_t* builder); + SK_C_PLUS_PLUS_END_GUARD #endif diff --git a/include/c/sk_types.h b/include/c/sk_types.h index 9d55044d588e..5752d3502816 100644 --- a/include/c/sk_types.h +++ b/include/c/sk_types.h @@ -1053,6 +1053,8 @@ typedef struct { int fIndex; } sk_runtimeeffect_child_t; +typedef struct sk_runtimeshaderbuilder_t sk_runtimeshaderbuilder_t; + typedef enum { NEAREST_SK_FILTER_MODE, LINEAR_SK_FILTER_MODE, diff --git a/include/effects/SkRuntimeEffect.h b/include/effects/SkRuntimeEffect.h index 8f47b5306428..0b1e1528eb6a 100644 --- a/include/effects/SkRuntimeEffect.h +++ b/include/effects/SkRuntimeEffect.h @@ -430,6 +430,10 @@ class SkRuntimeEffectBuilder { : fEffect(std::move(effect)) , fUniforms(std::move(uniforms)) , fChildren(fEffect->children().size()) {} + explicit SkRuntimeEffectBuilder(sk_sp effect, sk_sp uniforms, std::vector children) + : fEffect(std::move(effect)) + , fUniforms(std::move(uniforms)) + , fChildren(std::move(children)) {} SkRuntimeEffectBuilder(SkRuntimeEffectBuilder&&) = default; SkRuntimeEffectBuilder(const SkRuntimeEffectBuilder&) = default; @@ -475,6 +479,8 @@ class SK_API SkRuntimeShaderBuilder : public SkRuntimeEffectBuilder { explicit SkRuntimeShaderBuilder(sk_sp); // This is currently required by Android Framework but may go away if that dependency // can be removed. + explicit SkRuntimeShaderBuilder(sk_sp effect, sk_sp uniforms, std::vector children) + : SkRuntimeEffectBuilder(std::move(effect), std::move(uniforms), std::move(children)) {} SkRuntimeShaderBuilder(const SkRuntimeShaderBuilder&) = default; ~SkRuntimeShaderBuilder(); diff --git a/src/c/sk_imagefilter.cpp b/src/c/sk_imagefilter.cpp index fe98b1c79e02..7502479928b9 100644 --- a/src/c/sk_imagefilter.cpp +++ b/src/c/sk_imagefilter.cpp @@ -143,3 +143,15 @@ sk_imagefilter_t* sk_imagefilter_new_point_lit_specular(const sk_point3_t* locat sk_imagefilter_t* sk_imagefilter_new_spot_lit_specular(const sk_point3_t* location, const sk_point3_t* target, float specularExponent, float cutoffAngle, sk_color_t lightColor, float surfaceScale, float ks, float shininess, const sk_imagefilter_t* input, const sk_rect_t* cropRect) { return ToImageFilter(SkImageFilters::SpotLitSpecular(*AsPoint3(location), *AsPoint3(target), specularExponent, cutoffAngle, lightColor, surfaceScale, ks, shininess, sk_ref_sp(AsImageFilter(input)), AsRect(cropRect)).release()); } + +sk_imagefilter_t* sk_imagefilter_new_runtime_shader(const sk_runtimeshaderbuilder_t* builder, float maxSampleRadius, const char* childShaderNames[], const sk_imagefilter_t* inputs[], int inputCount){ + std::vector childShaderNameVector(inputCount); + std::vector> inputsVector(inputCount); + for (size_t i = 0; i < inputCount; i++) { + childShaderNameVector[i] = childShaderNames[i]; + inputsVector[i] = sk_ref_sp(AsImageFilter(inputs[i])); + } + + sk_sp imageFilter = SkImageFilters::RuntimeShader(*AsRuntimeShaderBuilder(builder), childShaderNameVector.data(), inputsVector.data(), inputCount); + return ToImageFilter(imageFilter.release()); +} diff --git a/src/c/sk_runtimeeffect.cpp b/src/c/sk_runtimeeffect.cpp index a700576d6903..352d610ed9f8 100644 --- a/src/c/sk_runtimeeffect.cpp +++ b/src/c/sk_runtimeeffect.cpp @@ -129,3 +129,17 @@ void sk_runtimeeffect_get_child_from_index(const sk_runtimeeffect_t* effect, int void sk_runtimeeffect_get_child_from_name(const sk_runtimeeffect_t* effect, const char* name, size_t len, sk_runtimeeffect_child_t* cchild) { *cchild = *ToRuntimeEffectChild(AsRuntimeEffect(effect)->findChild(std::string_view(name, len))); } + +sk_runtimeshaderbuilder_t* sk_runtimeshaderbuilder_new(const sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount) +{ + std::vector skChildren(childCount); + for (size_t i = 0; i < childCount; i++) { + skChildren[i] = sk_ref_sp(AsFlattenable(children[i])); + } + SkRuntimeShaderBuilder* builder = new SkRuntimeShaderBuilder(sk_ref_sp(AsRuntimeEffect(effect)), sk_ref_sp(AsData(uniforms)), std::move(skChildren)); + return ToRuntimeShaderBuilder(builder); +} + +void sk_runtimeshaderbuilder_destructor(sk_runtimeshaderbuilder_t* builder) { + delete AsRuntimeShaderBuilder(builder); +} diff --git a/src/c/sk_types_priv.h b/src/c/sk_types_priv.h index 080cf2268509..ff8e923c422c 100644 --- a/src/c/sk_types_priv.h +++ b/src/c/sk_types_priv.h @@ -134,6 +134,7 @@ DEF_CLASS_MAP(SkRegion, sk_region_t, Region) DEF_CLASS_MAP(SkRRect, sk_rrect_t, RRect) DEF_CLASS_MAP(SkRTreeFactory, sk_rtree_factory_t, RTreeFactory) DEF_CLASS_MAP(SkRuntimeEffect, sk_runtimeeffect_t, RuntimeEffect) +DEF_CLASS_MAP(SkRuntimeShaderBuilder, sk_runtimeshaderbuilder_t, RuntimeShaderBuilder) DEF_CLASS_MAP(SkShader, sk_shader_t, Shader) DEF_CLASS_MAP(SkStream, sk_stream_t, Stream) DEF_CLASS_MAP(SkStreamAsset, sk_stream_asset_t, StreamAsset)