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