• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright 2019 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8// Ignores its own input color and invokes 'fp' with a constant color
9// The constant color can either be specified as a literal or as a
10// uniform, controlled by useUniform.
11
12in fragmentProcessor fp;
13layout(key) in bool useUniform;
14layout(when=useUniform, ctype=SkPMColor4f) in uniform half4 uniformColor;
15layout(when=!useUniform, key, ctype=SkPMColor4f) in half4 literalColor;
16
17@make {
18    static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> fp,
19                                                     const SkPMColor4f& color,
20                                                     bool useUniform = true) {
21        return std::unique_ptr<GrFragmentProcessor>(
22            new GrOverrideInputFragmentProcessor(std::move(fp), useUniform, color, color));
23    }
24}
25
26@class {
27    static OptimizationFlags OptFlags(const std::unique_ptr<GrFragmentProcessor>& fp,
28                                      const SkPMColor4f& color) {
29        auto childFlags = ProcessorOptimizationFlags(fp.get());
30        auto flags = kNone_OptimizationFlags;
31        if (childFlags & kConstantOutputForConstantInput_OptimizationFlag) {
32            flags |= kConstantOutputForConstantInput_OptimizationFlag;
33        }
34        if ((childFlags & kPreservesOpaqueInput_OptimizationFlag) && color.isOpaque()) {
35            flags |= kPreservesOpaqueInput_OptimizationFlag;
36        }
37        return flags;
38    }
39
40    SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override {
41        return ConstantOutputForConstantInput(this->childProcessor(0), uniformColor);
42    }
43}
44
45@optimizationFlags { OptFlags(fp, useUniform ? uniformColor : literalColor) }
46
47void main() {
48    half4 constColor;
49    @if(useUniform) {
50        constColor = uniformColor;
51    } else {
52        constColor = literalColor;
53    }
54    sk_OutColor = sample(fp, constColor);
55}
56