| // 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 |