| // 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_PremultipliedAlpha, 200, 200, false, 0) { | |
| // Interactive version of this demo available at: | |
| // https://shaders.skia.org/?id=8a80c2a7bcd9fb6b39460fd6acc1e828e5725d0210b72719ef696b02e1557435 | |
| void draw(SkCanvas* canvas) { | |
| const char* sksl = | |
| "const half3 iColor = half3(0, 0.5, 0.75);" | |
| "half4 main(float2 coord) {" | |
| " float alpha = 1 - (coord.y / 150);" | |
| " if (coord.x < 100) {" | |
| " /* Correctly premultiplied version of color */" | |
| " return iColor.rgb1 * alpha;" | |
| " } else {" | |
| " /* Returning an unpremultiplied color (just setting alpha) leads to over-bright colors. */" | |
| " return half4(iColor, alpha);" | |
| " }" | |
| "}"; | |
| auto [effect, err] = SkRuntimeEffect::MakeForShader(SkString(sksl)); | |
| sk_sp<SkShader> myShader = effect->makeShader(/*uniforms=*/ nullptr, | |
| /*children=*/ {}); | |
| // Fill canvas with gray, first: | |
| canvas->drawColor(SK_ColorGRAY); | |
| // Blend our test shader on top of that: | |
| SkPaint p; | |
| p.setShader(myShader); | |
| canvas->drawPaint(p); | |
| } | |
| } // END FIDDLE |