/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ in fragmentProcessor inputFP; layout(key) in bool clampToPremul; @optimizationFlags { ProcessorOptimizationFlags(inputFP.get()) & (kConstantOutputForConstantInput_OptimizationFlag | kPreservesOpaqueInput_OptimizationFlag) } half4 clampedPM(half4 inputColor) { half alpha = saturate(inputColor.a); return half4(clamp(inputColor.rgb, 0, alpha), alpha); } half4 main() { half4 inputColor = sample(inputFP); return clampToPremul ? clampedPM(inputColor) : saturate(inputColor); } @class { SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& inColor) const override { SkPMColor4f input = ConstantOutputForConstantInput(this->childProcessor(0), inColor); float clampedAlpha = SkTPin(input.fA, 0.f, 1.f); float clampVal = clampToPremul ? clampedAlpha : 1.f; return {SkTPin(input.fR, 0.f, clampVal), SkTPin(input.fG, 0.f, clampVal), SkTPin(input.fB, 0.f, clampVal), clampedAlpha}; } } @test(d) { return GrClampFragmentProcessor::Make(d->inputFP(), d->fRandom->nextBool()); }