// Copyright 2024 Google LLC. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #include "tools/fiddle/examples.h" REG_FIDDLE(SkSL_EvaluatingImageShader, 128, 128, false, 5) { void draw(SkCanvas* canvas) { // Turn `image` into an SkShader: sk_sp imageShader = image->makeShader(SkSamplingOptions(SkFilterMode::kLinear)); const char* sksl = "uniform shader image;" "half4 main(float2 coord) {" " return image.eval(coord).bgra;" // Sample 'image', then swap red and blue "}"; // Parse the SkSL, and create an SkRuntimeEffect object: auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl)); // SkRuntimeEffect::makeShader expects an SkSpan, one per `uniform shader`: SkRuntimeEffect::ChildPtr children[] = { imageShader }; // Create an SkShader from our SkSL, with `imageShader` bound to `image`: sk_sp myShader = effect->makeShader(/*uniforms=*/ nullptr, /*children=*/ { children, 1 }); // Fill the surface with `myShader`: SkPaint p; p.setShader(myShader); canvas->drawPaint(p); } } // END FIDDLE