// 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_EvaluatingNestedShaders, 128, 128, false, 5) {
// Create a linear gradient from white (left) to black (right)
sk_sp<SkShader> makeGradientShader() {
  const char* sksl =
    "half4 main(float2 coord) {"
    "  float t = coord.x / 128;"
    "  half4 white = half4(1);"
    "  half4 black = half4(0,0,0,1);"
    "  return mix(white, black, t);"
    "}";
  auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl));
  return effect->makeShader(/*uniforms=*/ nullptr, /*children=*/ {});
}

void draw(SkCanvas* canvas) {
  // Turn `image` into an SkShader:
  sk_sp<SkShader> imageShader = image->makeShader(SkSamplingOptions(SkFilterMode::kLinear));

  const char* sksl =
    "uniform shader input_1;"
    "uniform shader input_2;"
    "half4 main(float2 coord) {"
    "  return input_1.eval(coord) * input_2.eval(coord);"
    "}";
  SkRuntimeEffect::ChildPtr children[] = { /*input_1=*/ imageShader,
                                           /*input_2=*/ makeGradientShader() };

  // Create SkShader from SkSL, then fill surface: // SK_FOLD_START

  // Create an SkShader from our SkSL, with `children` bound to the inputs:
  auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl));
  sk_sp<SkShader> myShader = effect->makeShader(/*uniforms=*/ nullptr,
                                                /*children=*/ children);

  // Fill the surface with `myShader`:
  SkPaint p;
  p.setShader(myShader);
  canvas->drawPaint(p);
  // SK_FOLD_END
}
}  // END FIDDLE
