blob: 55e0c93b23ad03d355ea39969e31c5a7c0cb2eb2 [file] [log] [blame]
egdaniel378092f2014-12-03 10:40:13 -08001/*
2 * Copyright 2014 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
egdanielced90102014-12-05 12:40:52 -08008#include "effects/GrPorterDuffXferProcessor.h"
egdaniel378092f2014-12-03 10:40:13 -08009
egdaniel378092f2014-12-03 10:40:13 -080010#include "GrDrawState.h"
11#include "GrInvariantOutput.h"
12#include "GrProcessor.h"
egdaniel378092f2014-12-03 10:40:13 -080013#include "GrTypes.h"
14#include "GrXferProcessor.h"
15#include "gl/GrGLProcessor.h"
16#include "gl/builders/GrGLFragmentShaderBuilder.h"
17#include "gl/builders/GrGLProgramBuilder.h"
18
19class GrGLPorterDuffXferProcessor : public GrGLXferProcessor {
20public:
joshualitteb2a6762014-12-04 11:35:33 -080021 GrGLPorterDuffXferProcessor(const GrProcessor&) {}
egdaniel378092f2014-12-03 10:40:13 -080022
23 virtual ~GrGLPorterDuffXferProcessor() {}
24
25 virtual void emitCode(GrGLFPBuilder* builder,
26 const GrFragmentProcessor& fp,
27 const char* outputColor,
28 const char* inputColor,
29 const TransformedCoordsArray& coords,
30 const TextureSamplerArray& samplers) SK_OVERRIDE {
31 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
32 fsBuilder->codeAppendf("%s = %s;", outputColor, inputColor);
33 }
34
35 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {};
36
37 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyBuilder* b) {};
38
39private:
40 typedef GrGLXferProcessor INHERITED;
41};
42
43///////////////////////////////////////////////////////////////////////////////
44
45GrPorterDuffXferProcessor::GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend)
joshualitteb2a6762014-12-04 11:35:33 -080046 : fSrcBlend(srcBlend), fDstBlend(dstBlend) {
47 this->initClassID<GrPorterDuffXferProcessor>();
48}
egdaniel378092f2014-12-03 10:40:13 -080049
50GrPorterDuffXferProcessor::~GrPorterDuffXferProcessor() {
51}
52
joshualitteb2a6762014-12-04 11:35:33 -080053void GrPorterDuffXferProcessor::getGLProcessorKey(const GrGLCaps& caps,
54 GrProcessorKeyBuilder* b) const {
55 GrGLPorterDuffXferProcessor::GenKey(*this, caps, b);
56}
57
58GrGLFragmentProcessor* GrPorterDuffXferProcessor::createGLInstance() const {
59 return SkNEW_ARGS(GrGLPorterDuffXferProcessor, (*this));
egdaniel378092f2014-12-03 10:40:13 -080060}
61
62void GrPorterDuffXferProcessor::onComputeInvariantOutput(GrInvariantOutput* inout) const {
63 inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput);
64}
65
66///////////////////////////////////////////////////////////////////////////////
67
egdaniel915187b2014-12-05 12:58:28 -080068GrPorterDuffXPFactory::GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst)
69 : fSrc(src), fDst(dst) {
70 this->initClassID<GrPorterDuffXPFactory>();
71}
72
egdanielc016fb82014-12-03 11:41:54 -080073GrXPFactory* GrPorterDuffXPFactory::Create(SkXfermode::Mode mode) {
74 switch (mode) {
75 case SkXfermode::kClear_Mode: {
76 static GrPorterDuffXPFactory gClearPDXPF(kZero_GrBlendCoeff, kZero_GrBlendCoeff);
77 return SkRef(&gClearPDXPF);
78 break;
79 }
80 case SkXfermode::kSrc_Mode: {
81 static GrPorterDuffXPFactory gSrcPDXPF(kOne_GrBlendCoeff, kZero_GrBlendCoeff);
82 return SkRef(&gSrcPDXPF);
83 break;
84 }
85 case SkXfermode::kDst_Mode: {
86 static GrPorterDuffXPFactory gDstPDXPF(kZero_GrBlendCoeff, kOne_GrBlendCoeff);
87 return SkRef(&gDstPDXPF);
88 break;
89 }
90 case SkXfermode::kSrcOver_Mode: {
91 static GrPorterDuffXPFactory gSrcOverPDXPF(kOne_GrBlendCoeff, kISA_GrBlendCoeff);
92 return SkRef(&gSrcOverPDXPF);
93 break;
94 }
95 case SkXfermode::kDstOver_Mode: {
96 static GrPorterDuffXPFactory gDstOverPDXPF(kIDA_GrBlendCoeff, kOne_GrBlendCoeff);
97 return SkRef(&gDstOverPDXPF);
98 break;
99 }
100 case SkXfermode::kSrcIn_Mode: {
101 static GrPorterDuffXPFactory gSrcInPDXPF(kDA_GrBlendCoeff, kZero_GrBlendCoeff);
102 return SkRef(&gSrcInPDXPF);
103 break;
104 }
105 case SkXfermode::kDstIn_Mode: {
106 static GrPorterDuffXPFactory gDstInPDXPF(kZero_GrBlendCoeff, kSA_GrBlendCoeff);
107 return SkRef(&gDstInPDXPF);
108 break;
109 }
110 case SkXfermode::kSrcOut_Mode: {
111 static GrPorterDuffXPFactory gSrcOutPDXPF(kIDA_GrBlendCoeff, kZero_GrBlendCoeff);
112 return SkRef(&gSrcOutPDXPF);
113 break;
114 }
115 case SkXfermode::kDstOut_Mode: {
116 static GrPorterDuffXPFactory gDstOutPDXPF(kZero_GrBlendCoeff, kISA_GrBlendCoeff);
117 return SkRef(&gDstOutPDXPF);
118 break;
119 }
120 case SkXfermode::kSrcATop_Mode: {
121 static GrPorterDuffXPFactory gSrcATopPDXPF(kDA_GrBlendCoeff, kISA_GrBlendCoeff);
122 return SkRef(&gSrcATopPDXPF);
123 break;
124 }
125 case SkXfermode::kDstATop_Mode: {
126 static GrPorterDuffXPFactory gDstATopPDXPF(kIDA_GrBlendCoeff, kSA_GrBlendCoeff);
127 return SkRef(&gDstATopPDXPF);
128 break;
129 }
130 case SkXfermode::kXor_Mode: {
131 static GrPorterDuffXPFactory gXorPDXPF(kIDA_GrBlendCoeff, kISA_GrBlendCoeff);
132 return SkRef(&gXorPDXPF);
133 break;
134 }
135 case SkXfermode::kPlus_Mode: {
136 static GrPorterDuffXPFactory gPlusPDXPF(kOne_GrBlendCoeff, kOne_GrBlendCoeff);
137 return SkRef(&gPlusPDXPF);
138 break;
139 }
140 case SkXfermode::kModulate_Mode: {
141 static GrPorterDuffXPFactory gModulatePDXPF(kZero_GrBlendCoeff, kSC_GrBlendCoeff);
142 return SkRef(&gModulatePDXPF);
143 break;
144 }
145 case SkXfermode::kScreen_Mode: {
146 static GrPorterDuffXPFactory gScreenPDXPF(kOne_GrBlendCoeff, kISC_GrBlendCoeff);
147 return SkRef(&gScreenPDXPF);
148 break;
149 }
150 default:
151 return NULL;
152 }
153}
154
egdaniel378092f2014-12-03 10:40:13 -0800155const GrXferProcessor* GrPorterDuffXPFactory::createXferProcessor() const {
156 return GrPorterDuffXferProcessor::Create(fSrc, fDst);
157}
158
159bool GrPorterDuffXPFactory::supportsRGBCoverage(GrColor /*knownColor*/,
160 uint32_t knownColorFlags) const {
161 if (kOne_GrBlendCoeff == fSrc && kISA_GrBlendCoeff == fDst &&
162 kRGBA_GrColorComponentFlags == knownColorFlags) {
163 return true;
164 }
165 return false;
166}
167