44 float maxSampleRadius,
45 std::string_view childShaderNames[],
49 , fRuntimeEffectBuilder(builder)
50 , fMaxSampleRadius(maxSampleRadius) {
53 for (
int i = 0; i < inputCount; i++) {
64 friend void ::SkRegisterRuntimeImageFilterFlattenable();
89 bounds.outset(maxSampleRadius);
93 mutable SkSpinlock fRuntimeEffectLock;
96 float fMaxSampleRadius;
101 std::string_view childShaderName,
105 if (childShaderName.empty()) {
106 auto children = builder.effect()->children();
107 if (children.size() != 1) {
110 childShaderName = children.front().name;
118 std::string_view childShaderNames[],
121 if (maxSampleRadius < 0.f) {
126 return child && child->type == SkRuntimeEffect::ChildType::kShader;
129 for (
int i = 0; i < inputCount; i++) {
130 std::string_view
name = childShaderNames[i];
132 if (
name.empty() || !child_is_shader(builder.effect()->findChild(
name))) {
137 for (
int j = 0; j < i; j++) {
138 if (
name == childShaderNames[j]) {
145 inputs, inputCount));
163 if (!
buffer.validate(effect !=
nullptr)) {
169 if (!
buffer.validate(uniforms->size() == effect->uniformSize())) {
178 for (
int i = 0; i <
common.inputCount(); i++) {
179 buffer.readString(&childShaderNameStrings[i]);
180 childShaderNames[i] = childShaderNameStrings[i].c_str();
187 std::string_view
name = child.name;
188 switch (child.type) {
189 case SkRuntimeEffect::ChildType::kBlender: {
193 case SkRuntimeEffect::ChildType::kColorFilter: {
197 case SkRuntimeEffect::ChildType::kShader: {
204 float maxSampleRadius = 0.f;
206 maxSampleRadius =
buffer.readScalar();
219 fRuntimeEffectLock.acquire();
226 buffer.writeFlattenable(fRuntimeEffectBuilder.
children()[
x].flattenable());
228 fRuntimeEffectLock.release();
230 buffer.writeScalar(fMaxSampleRadius);
244 for (
int i = 0; i < inputCount; ++i) {
250 ShaderFlags::kNonTrivialSampling);
255 fRuntimeEffectLock.acquire();
256 for (
int i = 0; i < inputCount; i++) {
257 fRuntimeEffectBuilder.
child(fChildShaderNames[i].c_str()) = inputs[i];
263 for (
int i = 0; i < inputCount; i++) {
264 fRuntimeEffectBuilder.
child(fChildShaderNames[i].c_str()) =
nullptr;
266 fRuntimeEffectLock.release();
277 if (inputCount <= 0) {
282 this->applyMaxSampleRadius(mapping, desiredOutput);
#define SK_FLATTENABLE_HOOKS(type)
#define SK_REGISTER_FLATTENABLE(type)
#define SK_IMAGEFILTER_UNFLATTEN_COMMON(localVar, expectedCount)
sk_sp< SkRuntimeEffect > SkMakeCachedRuntimeEffect(SkRuntimeEffect::Result(*make)(SkString sksl, const SkRuntimeEffect::Options &), SkString sksl)
void SkRegisterRuntimeImageFilterFlattenable()
skif::LayerSpace< SkIRect > getChildInputLayerBounds(int index, const skif::Mapping &mapping, const skif::LayerSpace< SkIRect > &desiredOutput, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const
void flatten(SkWriteBuffer &) const override
skif::FilterResult getChildOutput(int index, const skif::Context &ctx) const
static sk_sp< SkImageFilter > RuntimeShader(const SkRuntimeShaderBuilder &builder, std::string_view childShaderName, sk_sp< SkImageFilter > input)
@ kRuntimeImageFilterSampleRadius
static SkRect MakeLargeS32()
BuilderChild child(std::string_view name)
sk_sp< const SkData > uniforms() const
const SkRuntimeEffect * effect() const
SkSpan< const SkRuntimeEffect::ChildPtr > children() const
static Result MakeForShader(SkString sksl, const Options &)
const std::string & source() const
void flatten(SkWriteBuffer &) const override
skif::FilterResult onFilterImage(const skif::Context &) const override
std::optional< skif::LayerSpace< SkIRect > > onGetOutputLayerBounds(const skif::Mapping &mapping, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const override
MatrixCapability onGetCTMCapability() const override
skif::LayerSpace< SkIRect > onGetInputLayerBounds(const skif::Mapping &mapping, const skif::LayerSpace< SkIRect > &desiredOutput, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const override
bool onAffectsTransparentBlack() const override
SkRuntimeImageFilter(const SkRuntimeShaderBuilder &builder, float maxSampleRadius, std::string_view childShaderNames[], const sk_sp< SkImageFilter > inputs[], int inputCount)
SkRect computeFastBounds(const SkRect &src) const override
sk_sp< SkShader > makeShader(const SkMatrix *localMatrix=nullptr) const
constexpr size_t size() const
void resize(size_t count)
void reserve_exact(int n)
const LayerSpace< SkIRect > & desiredOutput() const
Context withNewDesiredOutput(const LayerSpace< SkIRect > &desiredOutput) const
const Mapping & mapping() const
LayerSpace< T > paramToLayer(const ParameterSpace< T > ¶mGeometry) const
static const uint8_t buffer[]
Optional< SkRect > bounds