1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2024 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fiddle/examples.h"
4*c8dee2aaSAndroid Build Coastguard Worker REG_FIDDLE(SkSL_Uniforms, 128, 64, false, 0) {
draw(SkCanvas * canvas)5*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) {
6*c8dee2aaSAndroid Build Coastguard Worker // Make a very wide-gamut offscreen surface:
7*c8dee2aaSAndroid Build Coastguard Worker auto rec2020 = SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear,
8*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kRec2020);
9*c8dee2aaSAndroid Build Coastguard Worker auto info = SkImageInfo::Make(128, 64, kRGBA_F16_SkColorType,
10*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType, rec2020);
11*c8dee2aaSAndroid Build Coastguard Worker auto surface = SkSurfaces::Raster(info);
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker // Effect draws horizontal gradients. Top half uses the simple uniform,
14*c8dee2aaSAndroid Build Coastguard Worker // bottom half uses a uniform tagged as a color:
15*c8dee2aaSAndroid Build Coastguard Worker const char* sksl = R"(
16*c8dee2aaSAndroid Build Coastguard Worker uniform vec4 not_a_color;
17*c8dee2aaSAndroid Build Coastguard Worker layout(color) uniform vec4 color;
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker vec4 main(vec2 xy) {
20*c8dee2aaSAndroid Build Coastguard Worker vec4 c = xy.y < 32 ? not_a_color : color;
21*c8dee2aaSAndroid Build Coastguard Worker return (c * (xy.x / 128)).rgb1;
22*c8dee2aaSAndroid Build Coastguard Worker })";
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl));
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker // Set both uniforms to be "red":
27*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeShaderBuilder builder(effect);
28*c8dee2aaSAndroid Build Coastguard Worker builder.uniform("not_a_color") = SkV4{ 1, 0, 0, 1 }; // Red?
29*c8dee2aaSAndroid Build Coastguard Worker builder.uniform("color") = SkV4{ 1, 0, 0, 1 }; // sRGB Red
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker // Fill the offscreen surface:
32*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
33*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(builder.makeShader());
34*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawPaint(paint);
35*c8dee2aaSAndroid Build Coastguard Worker
36*c8dee2aaSAndroid Build Coastguard Worker // Draw our offscreen image back to the original canvas:
37*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(surface->makeImageSnapshot(), 0, 0);
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker } // END FIDDLE
40