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