| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "effects/GrXfermodeFragmentProcessor.h" | 8 #include "effects/GrXfermodeFragmentProcessor.h" |
| 9 | 9 |
| 10 #include "GrFragmentProcessor.h" | 10 #include "GrFragmentProcessor.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 } | 82 } |
| 83 | 83 |
| 84 GrGLSLFragmentProcessor* ComposeTwoFragmentProcessor::onCreateGLSLInstance() con
st{ | 84 GrGLSLFragmentProcessor* ComposeTwoFragmentProcessor::onCreateGLSLInstance() con
st{ |
| 85 return new GLComposeTwoFragmentProcessor(*this); | 85 return new GLComposeTwoFragmentProcessor(*this); |
| 86 } | 86 } |
| 87 | 87 |
| 88 ///////////////////////////////////////////////////////////////////// | 88 ///////////////////////////////////////////////////////////////////// |
| 89 | 89 |
| 90 void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) { | 90 void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) { |
| 91 | 91 |
| 92 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; | 92 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 93 const ComposeTwoFragmentProcessor& cs = args.fFp.cast<ComposeTwoFragmentProc
essor>(); | 93 const ComposeTwoFragmentProcessor& cs = args.fFp.cast<ComposeTwoFragmentProc
essor>(); |
| 94 | 94 |
| 95 const char* inputColor = nullptr; | 95 const char* inputColor = nullptr; |
| 96 if (args.fInputColor) { | 96 if (args.fInputColor) { |
| 97 inputColor = "inputColor"; | 97 inputColor = "inputColor"; |
| 98 fsBuilder->codeAppendf("vec4 inputColor = vec4(%s.rgb, 1.0);", args.fInp
utColor); | 98 fragBuilder->codeAppendf("vec4 inputColor = vec4(%s.rgb, 1.0);", args.fI
nputColor); |
| 99 } | 99 } |
| 100 | 100 |
| 101 // declare outputColor and emit the code for each of the two children | 101 // declare outputColor and emit the code for each of the two children |
| 102 SkString srcColor("src"); | 102 SkString srcColor("src"); |
| 103 this->emitChild(0, inputColor, &srcColor, args); | 103 this->emitChild(0, inputColor, &srcColor, args); |
| 104 | 104 |
| 105 SkString dstColor("dst"); | 105 SkString dstColor("dst"); |
| 106 this->emitChild(1, inputColor, &dstColor, args); | 106 this->emitChild(1, inputColor, &dstColor, args); |
| 107 | 107 |
| 108 // emit blend code | 108 // emit blend code |
| 109 SkXfermode::Mode mode = cs.getMode(); | 109 SkXfermode::Mode mode = cs.getMode(); |
| 110 fsBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeName(mo
de)); | 110 fragBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeName(
mode)); |
| 111 GrGLSLBlend::AppendMode(fsBuilder, srcColor.c_str(), dstColor.c_str(), args.
fOutputColor, mode); | 111 GrGLSLBlend::AppendMode(fragBuilder, |
| 112 srcColor.c_str(), |
| 113 dstColor.c_str(), |
| 114 args.fOutputColor, |
| 115 mode); |
| 112 | 116 |
| 113 // re-multiply the output color by the input color's alpha | 117 // re-multiply the output color by the input color's alpha |
| 114 if (args.fInputColor) { | 118 if (args.fInputColor) { |
| 115 fsBuilder->codeAppendf("%s *= %s.a;", args.fOutputColor, args.fInputColo
r); | 119 fragBuilder->codeAppendf("%s *= %s.a;", args.fOutputColor, args.fInputCo
lor); |
| 116 } | 120 } |
| 117 } | 121 } |
| 118 | 122 |
| 119 const GrFragmentProcessor* GrXfermodeFragmentProcessor::CreateFromTwoProcessors( | 123 const GrFragmentProcessor* GrXfermodeFragmentProcessor::CreateFromTwoProcessors( |
| 120 const GrFragmentProcessor* src, const GrFragmentProcessor* dst, SkXferm
ode::Mode mode) { | 124 const GrFragmentProcessor* src, const GrFragmentProcessor* dst, SkXferm
ode::Mode mode) { |
| 121 switch (mode) { | 125 switch (mode) { |
| 122 case SkXfermode::kClear_Mode: | 126 case SkXfermode::kClear_Mode: |
| 123 return GrConstColorProcessor::Create(GrColor_TRANSPARENT_BLACK, | 127 return GrConstColorProcessor::Create(GrColor_TRANSPARENT_BLACK, |
| 124 GrConstColorProcessor::kIgnore_
InputMode); | 128 GrConstColorProcessor::kIgnore_
InputMode); |
| 125 case SkXfermode::kSrc_Mode: | 129 case SkXfermode::kSrc_Mode: |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 typedef GrFragmentProcessor INHERITED; | 216 typedef GrFragmentProcessor INHERITED; |
| 213 }; | 217 }; |
| 214 | 218 |
| 215 ////////////////////////////////////////////////////////////////////////////// | 219 ////////////////////////////////////////////////////////////////////////////// |
| 216 | 220 |
| 217 class GLComposeOneFragmentProcessor : public GrGLSLFragmentProcessor { | 221 class GLComposeOneFragmentProcessor : public GrGLSLFragmentProcessor { |
| 218 public: | 222 public: |
| 219 GLComposeOneFragmentProcessor(const GrProcessor& processor) {} | 223 GLComposeOneFragmentProcessor(const GrProcessor& processor) {} |
| 220 | 224 |
| 221 void emitCode(EmitArgs& args) override { | 225 void emitCode(EmitArgs& args) override { |
| 222 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuild
er(); | 226 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 223 SkXfermode::Mode mode = args.fFp.cast<ComposeOneFragmentProcessor>().mod
e(); | 227 SkXfermode::Mode mode = args.fFp.cast<ComposeOneFragmentProcessor>().mod
e(); |
| 224 ComposeOneFragmentProcessor::Child child = | 228 ComposeOneFragmentProcessor::Child child = |
| 225 args.fFp.cast<ComposeOneFragmentProcessor>().child(); | 229 args.fFp.cast<ComposeOneFragmentProcessor>().child(); |
| 226 SkString childColor("child"); | 230 SkString childColor("child"); |
| 227 this->emitChild(0, nullptr, &childColor, args); | 231 this->emitChild(0, nullptr, &childColor, args); |
| 228 | 232 |
| 229 const char* inputColor = args.fInputColor; | 233 const char* inputColor = args.fInputColor; |
| 230 // We don't try to optimize for this case at all | 234 // We don't try to optimize for this case at all |
| 231 if (!inputColor) { | 235 if (!inputColor) { |
| 232 fsBuilder->codeAppendf("const vec4 ones = vec4(1);"); | 236 fragBuilder->codeAppendf("const vec4 ones = vec4(1);"); |
| 233 inputColor = "ones"; | 237 inputColor = "ones"; |
| 234 } | 238 } |
| 235 | 239 |
| 236 // emit blend code | 240 // emit blend code |
| 237 fsBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeNam
e(mode)); | 241 fragBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeN
ame(mode)); |
| 238 const char* childStr = childColor.c_str(); | 242 const char* childStr = childColor.c_str(); |
| 239 if (ComposeOneFragmentProcessor::kDst_Child == child) { | 243 if (ComposeOneFragmentProcessor::kDst_Child == child) { |
| 240 GrGLSLBlend::AppendMode(fsBuilder, inputColor, childStr, args.fOutpu
tColor, mode); | 244 GrGLSLBlend::AppendMode(fragBuilder, inputColor, childStr, args.fOut
putColor, mode); |
| 241 } else { | 245 } else { |
| 242 GrGLSLBlend::AppendMode(fsBuilder, childStr, inputColor, args.fOutpu
tColor, mode); | 246 GrGLSLBlend::AppendMode(fragBuilder, childStr, inputColor, args.fOut
putColor, mode); |
| 243 } | 247 } |
| 244 } | 248 } |
| 245 | 249 |
| 246 private: | 250 private: |
| 247 typedef GrGLSLFragmentProcessor INHERITED; | 251 typedef GrGLSLFragmentProcessor INHERITED; |
| 248 }; | 252 }; |
| 249 | 253 |
| 250 ///////////////////////////////////////////////////////////////////// | 254 ///////////////////////////////////////////////////////////////////// |
| 251 | 255 |
| 252 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(ComposeOneFragmentProcessor); | 256 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(ComposeOneFragmentProcessor); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 case SkXfermode::kClear_Mode: | 294 case SkXfermode::kClear_Mode: |
| 291 return GrConstColorProcessor::Create(GrColor_TRANSPARENT_BLACK, | 295 return GrConstColorProcessor::Create(GrColor_TRANSPARENT_BLACK, |
| 292 GrConstColorProcessor::kIgnore_
InputMode); | 296 GrConstColorProcessor::kIgnore_
InputMode); |
| 293 case SkXfermode::kDst_Mode: | 297 case SkXfermode::kDst_Mode: |
| 294 return nullptr; | 298 return nullptr; |
| 295 default: | 299 default: |
| 296 return new ComposeOneFragmentProcessor(src, mode, | 300 return new ComposeOneFragmentProcessor(src, mode, |
| 297 ComposeOneFragmentProcessor::
kSrc_Child); | 301 ComposeOneFragmentProcessor::
kSrc_Child); |
| 298 } | 302 } |
| 299 } | 303 } |
| OLD | NEW |