/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ // Ignores its own input color and invokes 'fp' with a constant color // The constant color can either be specified as a literal or as a // uniform, controlled by useUniform. in fragmentProcessor fp; layout(key) in bool useUniform; layout(when=useUniform, ctype=SkPMColor4f) in uniform half4 uniformColor; layout(when=!useUniform, key, ctype=SkPMColor4f) in half4 literalColor; @make { static std::unique_ptr Make(std::unique_ptr fp, const SkPMColor4f& color, bool useUniform = true) { return std::unique_ptr( new GrOverrideInputFragmentProcessor(std::move(fp), useUniform, color, color)); } } @class { static OptimizationFlags OptFlags(const std::unique_ptr& fp, const SkPMColor4f& color) { auto childFlags = ProcessorOptimizationFlags(fp.get()); auto flags = kNone_OptimizationFlags; if (childFlags & kConstantOutputForConstantInput_OptimizationFlag) { flags |= kConstantOutputForConstantInput_OptimizationFlag; } if ((childFlags & kPreservesOpaqueInput_OptimizationFlag) && color.isOpaque()) { flags |= kPreservesOpaqueInput_OptimizationFlag; } return flags; } SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override { return ConstantOutputForConstantInput(this->childProcessor(0), uniformColor); } } @optimizationFlags { OptFlags(fp, useUniform ? uniformColor : literalColor) } void main() { half4 constColor; @if(useUniform) { constColor = uniformColor; } else { constColor = literalColor; } sk_OutColor = sample(fp, constColor); }