blob: 5c842a890a8b708d921e780f7d0da8ba39b1eabc [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
8#include "GrPorterDuffXferProcessor.h"
9
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
egdanielc016fb82014-12-03 11:41:54 -080068GrXPFactory* GrPorterDuffXPFactory::Create(SkXfermode::Mode mode) {
69 switch (mode) {
70 case SkXfermode::kClear_Mode: {
71 static GrPorterDuffXPFactory gClearPDXPF(kZero_GrBlendCoeff, kZero_GrBlendCoeff);
72 return SkRef(&gClearPDXPF);
73 break;
74 }
75 case SkXfermode::kSrc_Mode: {
76 static GrPorterDuffXPFactory gSrcPDXPF(kOne_GrBlendCoeff, kZero_GrBlendCoeff);
77 return SkRef(&gSrcPDXPF);
78 break;
79 }
80 case SkXfermode::kDst_Mode: {
81 static GrPorterDuffXPFactory gDstPDXPF(kZero_GrBlendCoeff, kOne_GrBlendCoeff);
82 return SkRef(&gDstPDXPF);
83 break;
84 }
85 case SkXfermode::kSrcOver_Mode: {
86 static GrPorterDuffXPFactory gSrcOverPDXPF(kOne_GrBlendCoeff, kISA_GrBlendCoeff);
87 return SkRef(&gSrcOverPDXPF);
88 break;
89 }
90 case SkXfermode::kDstOver_Mode: {
91 static GrPorterDuffXPFactory gDstOverPDXPF(kIDA_GrBlendCoeff, kOne_GrBlendCoeff);
92 return SkRef(&gDstOverPDXPF);
93 break;
94 }
95 case SkXfermode::kSrcIn_Mode: {
96 static GrPorterDuffXPFactory gSrcInPDXPF(kDA_GrBlendCoeff, kZero_GrBlendCoeff);
97 return SkRef(&gSrcInPDXPF);
98 break;
99 }
100 case SkXfermode::kDstIn_Mode: {
101 static GrPorterDuffXPFactory gDstInPDXPF(kZero_GrBlendCoeff, kSA_GrBlendCoeff);
102 return SkRef(&gDstInPDXPF);
103 break;
104 }
105 case SkXfermode::kSrcOut_Mode: {
106 static GrPorterDuffXPFactory gSrcOutPDXPF(kIDA_GrBlendCoeff, kZero_GrBlendCoeff);
107 return SkRef(&gSrcOutPDXPF);
108 break;
109 }
110 case SkXfermode::kDstOut_Mode: {
111 static GrPorterDuffXPFactory gDstOutPDXPF(kZero_GrBlendCoeff, kISA_GrBlendCoeff);
112 return SkRef(&gDstOutPDXPF);
113 break;
114 }
115 case SkXfermode::kSrcATop_Mode: {
116 static GrPorterDuffXPFactory gSrcATopPDXPF(kDA_GrBlendCoeff, kISA_GrBlendCoeff);
117 return SkRef(&gSrcATopPDXPF);
118 break;
119 }
120 case SkXfermode::kDstATop_Mode: {
121 static GrPorterDuffXPFactory gDstATopPDXPF(kIDA_GrBlendCoeff, kSA_GrBlendCoeff);
122 return SkRef(&gDstATopPDXPF);
123 break;
124 }
125 case SkXfermode::kXor_Mode: {
126 static GrPorterDuffXPFactory gXorPDXPF(kIDA_GrBlendCoeff, kISA_GrBlendCoeff);
127 return SkRef(&gXorPDXPF);
128 break;
129 }
130 case SkXfermode::kPlus_Mode: {
131 static GrPorterDuffXPFactory gPlusPDXPF(kOne_GrBlendCoeff, kOne_GrBlendCoeff);
132 return SkRef(&gPlusPDXPF);
133 break;
134 }
135 case SkXfermode::kModulate_Mode: {
136 static GrPorterDuffXPFactory gModulatePDXPF(kZero_GrBlendCoeff, kSC_GrBlendCoeff);
137 return SkRef(&gModulatePDXPF);
138 break;
139 }
140 case SkXfermode::kScreen_Mode: {
141 static GrPorterDuffXPFactory gScreenPDXPF(kOne_GrBlendCoeff, kISC_GrBlendCoeff);
142 return SkRef(&gScreenPDXPF);
143 break;
144 }
145 default:
146 return NULL;
147 }
148}
149
egdaniel378092f2014-12-03 10:40:13 -0800150const GrXferProcessor* GrPorterDuffXPFactory::createXferProcessor() const {
151 return GrPorterDuffXferProcessor::Create(fSrc, fDst);
152}
153
154bool GrPorterDuffXPFactory::supportsRGBCoverage(GrColor /*knownColor*/,
155 uint32_t knownColorFlags) const {
156 if (kOne_GrBlendCoeff == fSrc && kISA_GrBlendCoeff == fDst &&
157 kRGBA_GrColorComponentFlags == knownColorFlags) {
158 return true;
159 }
160 return false;
161}
162