Skip to content

Commit 7a3037d

Browse files
mattleibowCopilot
andcommitted
Restore children param in image filter C API, keep STArray
Children parameter is passed through to the builder for future use with static shader/blender/colorfilter children alongside image filter inputs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0cd0b72 commit 7a3037d

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

include/c/sk_runtimeeffect.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ SK_C_API void sk_runtimeeffect_unref(sk_runtimeeffect_t* effect);
1919
SK_C_API sk_shader_t* sk_runtimeeffect_make_shader(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount, const sk_matrix_t* localMatrix);
2020
SK_C_API sk_colorfilter_t* sk_runtimeeffect_make_color_filter(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount);
2121
SK_C_API sk_blender_t* sk_runtimeeffect_make_blender(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount);
22-
SK_C_API sk_imagefilter_t* sk_runtimeeffect_make_image_filter(sk_runtimeeffect_t* effect, sk_data_t* uniforms, const char* childShaderName, const sk_imagefilter_t* input);
23-
SK_C_API sk_imagefilter_t* sk_runtimeeffect_make_image_filter_with_children(sk_runtimeeffect_t* effect, sk_data_t* uniforms, float maxSampleRadius, const char** childShaderNames, const sk_imagefilter_t** inputs, int inputCount);
22+
SK_C_API sk_imagefilter_t* sk_runtimeeffect_make_image_filter(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount, const char* childShaderName, const sk_imagefilter_t* input);
23+
SK_C_API sk_imagefilter_t* sk_runtimeeffect_make_image_filter_with_children(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount, float maxSampleRadius, const char** childShaderNames, const sk_imagefilter_t** inputs, int inputCount);
2424
SK_C_API size_t sk_runtimeeffect_get_uniform_byte_size(const sk_runtimeeffect_t* effect);
2525

2626
SK_C_API size_t sk_runtimeeffect_get_uniforms_size(const sk_runtimeeffect_t* effect);

src/c/sk_runtimeeffect.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
#include "src/c/sk_types_priv.h"
2020

21-
using namespace skia_private;
22-
2321
sk_runtimeeffect_t* sk_runtimeeffect_make_for_color_filter(sk_string_t* sksl, sk_string_t* error) {
2422
auto [effect, errorMessage] = SkRuntimeEffect::MakeForColorFilter(AsString(*sksl));
2523
if (error && errorMessage.size() > 0)
@@ -135,18 +133,28 @@ void sk_runtimeeffect_get_child_from_name(const sk_runtimeeffect_t* effect, cons
135133
*cchild = *ToRuntimeEffectChild(AsRuntimeEffect(effect)->findChild(std::string_view(name, len)));
136134
}
137135

138-
sk_imagefilter_t* sk_runtimeeffect_make_image_filter(sk_runtimeeffect_t* effect, sk_data_t* uniforms, const char* childShaderName, const sk_imagefilter_t* input) {
136+
sk_imagefilter_t* sk_runtimeeffect_make_image_filter(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount, const char* childShaderName, const sk_imagefilter_t* input) {
139137
SkRuntimeShaderBuilder builder(sk_ref_sp(AsRuntimeEffect(effect)), sk_ref_sp(AsData(uniforms)));
140138

139+
auto effectChildren = AsRuntimeEffect(effect)->children();
140+
for (size_t i = 0; i < childCount && i < effectChildren.size(); i++) {
141+
builder.child(effectChildren[i].name) = sk_ref_sp(AsFlattenable(children[i]));
142+
}
143+
141144
std::string_view name = childShaderName ? std::string_view(childShaderName) : std::string_view();
142145
return ToImageFilter(SkImageFilters::RuntimeShader(builder, name, sk_ref_sp(AsImageFilter(input))).release());
143146
}
144147

145-
sk_imagefilter_t* sk_runtimeeffect_make_image_filter_with_children(sk_runtimeeffect_t* effect, sk_data_t* uniforms, float maxSampleRadius, const char** childShaderNames, const sk_imagefilter_t** inputs, int inputCount) {
148+
sk_imagefilter_t* sk_runtimeeffect_make_image_filter_with_children(sk_runtimeeffect_t* effect, sk_data_t* uniforms, sk_flattenable_t** children, size_t childCount, float maxSampleRadius, const char** childShaderNames, const sk_imagefilter_t** inputs, int inputCount) {
146149
SkRuntimeShaderBuilder builder(sk_ref_sp(AsRuntimeEffect(effect)), sk_ref_sp(AsData(uniforms)));
147150

148-
STArray<4, std::string_view> names(inputCount);
149-
STArray<4, sk_sp<SkImageFilter>> skInputs(inputCount);
151+
auto effectChildren = AsRuntimeEffect(effect)->children();
152+
for (size_t i = 0; i < childCount && i < effectChildren.size(); i++) {
153+
builder.child(effectChildren[i].name) = sk_ref_sp(AsFlattenable(children[i]));
154+
}
155+
156+
skia_private::STArray<4, std::string_view> names(inputCount);
157+
skia_private::STArray<4, sk_sp<SkImageFilter>> skInputs(inputCount);
150158
for (int i = 0; i < inputCount; i++) {
151159
names.push_back(std::string_view(childShaderNames[i]));
152160
skInputs.push_back(sk_ref_sp(AsImageFilter(inputs[i])));

0 commit comments

Comments
 (0)