1c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon/*
2c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * Copyright 2015 Google Inc.
3c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon *
4c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * Use of this source code is governed by a BSD-style license that can be
5c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * found in the LICENSE file.
6c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon */
7c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
8c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon#ifndef GrColorProcessor_DEFINED
9c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon#define GrColorProcessor_DEFINED
10c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
11c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon#include "GrFragmentProcessor.h"
12c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
13c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon/**
14c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * This is a simple GrFragmentProcessor that outputs a constant color. It may do one of the
15c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * following with its input color: ignore it, or multiply it by the constant color, multiply its
16c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon * alpha by the constant color and ignore the input color's r, g, and b.
17c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon */
18c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomonclass GrConstColorProcessor : public GrFragmentProcessor {
19c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomonpublic:
20c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    enum InputMode {
21c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon        kIgnore_InputMode,
22c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon        kModulateRGBA_InputMode,
23c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon        kModulateA_InputMode,
24c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
25c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon        kLastInputMode = kModulateA_InputMode
26c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    };
27c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    static const int kInputModeCnt = kLastInputMode + 1;
28c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
29618d304eb394d64779be0ecdc5eff898242faa8fBrian Osman    static sk_sp<GrFragmentProcessor> Make(GrColor4f color, InputMode mode) {
3006ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman        return sk_sp<GrFragmentProcessor>(new GrConstColorProcessor(color, mode));
31c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    }
32c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
33c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    const char* name() const override { return "Color"; }
34c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
35e004bfc0a5e28cc083158f1a75e981ffd58a8134robertphillips    SkString dumpInfo() const override {
36e004bfc0a5e28cc083158f1a75e981ffd58a8134robertphillips        SkString str;
37618d304eb394d64779be0ecdc5eff898242faa8fBrian Osman        str.appendf("Color: 0x%08x", fColor.toGrColor());
38e004bfc0a5e28cc083158f1a75e981ffd58a8134robertphillips        return str;
39e004bfc0a5e28cc083158f1a75e981ffd58a8134robertphillips    }
40e004bfc0a5e28cc083158f1a75e981ffd58a8134robertphillips
41618d304eb394d64779be0ecdc5eff898242faa8fBrian Osman    GrColor4f color() const { return fColor; }
42c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
43c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    InputMode inputMode() const { return fMode; }
44c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
45c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomonprivate:
46587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon    static OptimizationFlags OptFlags(GrColor4f color, InputMode mode) {
47587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        OptimizationFlags flags = kConstantOutputForConstantInput_OptimizationFlag;
48587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        if (mode != kIgnore_InputMode) {
49f3b995b628ef76bff28b9721dd1e182336156086Brian Salomon            flags |= kCompatibleWithCoverageAsAlpha_OptimizationFlag;
50587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        }
51587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        if (color.isOpaque()) {
52587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon            flags |= kPreservesOpaqueInput_OptimizationFlag;
53587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        }
54587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon        return flags;
55587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon    }
56587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon
57587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon    GrConstColorProcessor(GrColor4f color, InputMode mode)
58587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon            : INHERITED(OptFlags(color, mode)), fColor(color), fMode(mode) {
59c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon        this->initClassID<GrConstColorProcessor>();
60c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    }
61c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
6257d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
63b1daa86732fe70aa4630c89d75ff0fd619d77c77wangyix
6494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
654b3050b410254d0cb38df9a30ae2e209124fa1a2wangyix
66c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    bool onIsEqual(const GrFragmentProcessor&) const override;
67c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
68587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon    GrColor4f constantOutputForConstantInput(GrColor4f input) const override;
69c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
70c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
71c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
72618d304eb394d64779be0ecdc5eff898242faa8fBrian Osman    GrColor4f   fColor;
73c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    InputMode   fMode;
74c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
75c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon    typedef GrFragmentProcessor INHERITED;
76c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon};
77c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon
78c9c3e62b4ef6ec288549a0ad1d252986d7f0889dbsalomon#endif
79