// 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_Uniforms, 128, 64, false, 0) { void draw(SkCanvas* canvas) { // Make a very wide-gamut offscreen surface: auto rec2020 = SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, SkNamedGamut::kRec2020); auto info = SkImageInfo::Make(128, 64, kRGBA_F16_SkColorType, kPremul_SkAlphaType, rec2020); auto surface = SkSurfaces::Raster(info); // Effect draws horizontal gradients. Top half uses the simple uniform, // bottom half uses a uniform tagged as a color: const char* sksl = R"( uniform vec4 not_a_color; layout(color) uniform vec4 color; vec4 main(vec2 xy) { vec4 c = xy.y < 32 ? not_a_color : color; return (c * (xy.x / 128)).rgb1; })"; auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl)); // Set both uniforms to be "red": SkRuntimeShaderBuilder builder(effect); builder.uniform("not_a_color") = SkV4{ 1, 0, 0, 1 }; // Red? builder.uniform("color") = SkV4{ 1, 0, 0, 1 }; // sRGB Red // Fill the offscreen surface: SkPaint paint; paint.setShader(builder.makeShader()); surface->getCanvas()->drawPaint(paint); // Draw our offscreen image back to the original canvas: canvas->drawImage(surface->makeImageSnapshot(), 0, 0); } } // END FIDDLE