| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrConfigConversionEffect.h" | 8 #include "GrConfigConversionEffect.h" |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 #include "GrTBackendEffectFactory.h" | 10 #include "GrTBackendEffectFactory.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 | 24 |
| 25 virtual void emitCode(GrGLShaderBuilder* builder, | 25 virtual void emitCode(GrGLShaderBuilder* builder, |
| 26 const GrEffectStage&, | 26 const GrEffectStage&, |
| 27 EffectKey key, | 27 EffectKey key, |
| 28 const char* vertexCoords, | 28 const char* vertexCoords, |
| 29 const char* outputColor, | 29 const char* outputColor, |
| 30 const char* inputColor, | 30 const char* inputColor, |
| 31 const TextureSamplerArray& samplers) SK_OVERRIDE { | 31 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 32 const char* coords; | 32 const char* coords; |
| 33 GrSLType coordsType = fEffectMatrix.emitCode(builder, key, vertexCoords,
&coords); | 33 GrSLType coordsType = fEffectMatrix.emitCode(builder, key, vertexCoords,
&coords); |
| 34 builder->fFSCode.appendf("\t\t%s = ", outputColor); | 34 builder->fsCodeAppendf("\t\t%s = ", outputColor); |
| 35 builder->appendTextureLookup(&builder->fFSCode, samplers[0], coords, coo
rdsType); | 35 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| 36 builder->fFSCode.append(";\n"); | 36 samplers[0], |
| 37 coords, |
| 38 coordsType); |
| 39 builder->fsCodeAppend(";\n"); |
| 37 if (GrConfigConversionEffect::kNone_PMConversion == fPMConversion) { | 40 if (GrConfigConversionEffect::kNone_PMConversion == fPMConversion) { |
| 38 GrAssert(fSwapRedAndBlue); | 41 GrAssert(fSwapRedAndBlue); |
| 39 builder->fFSCode.appendf("\t%s = %s.bgra;\n", outputColor, outputCol
or); | 42 builder->fsCodeAppendf("\t%s = %s.bgra;\n", outputColor, outputColor
); |
| 40 } else { | 43 } else { |
| 41 const char* swiz = fSwapRedAndBlue ? "bgr" : "rgb"; | 44 const char* swiz = fSwapRedAndBlue ? "bgr" : "rgb"; |
| 42 switch (fPMConversion) { | 45 switch (fPMConversion) { |
| 43 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion: | 46 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion: |
| 44 builder->fFSCode.appendf( | 47 builder->fsCodeAppendf( |
| 45 "\t\t%s = vec4(ceil(%s.%s * %s.a * 255.0) / 255.0, %s.a)
;\n", | 48 "\t\t%s = vec4(ceil(%s.%s * %s.a * 255.0) / 255.0, %s.a)
;\n", |
| 46 outputColor, outputColor, swiz, outputColor, outputColor
); | 49 outputColor, outputColor, swiz, outputColor, outputColor
); |
| 47 break; | 50 break; |
| 48 case GrConfigConversionEffect::kMulByAlpha_RoundDown_PMConversio
n: | 51 case GrConfigConversionEffect::kMulByAlpha_RoundDown_PMConversio
n: |
| 49 builder->fFSCode.appendf( | 52 builder->fsCodeAppendf( |
| 50 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0) / 255.0, %s.a
);\n", | 53 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0) / 255.0, %s.a
);\n", |
| 51 outputColor, outputColor, swiz, outputColor, outputColor
); | 54 outputColor, outputColor, swiz, outputColor, outputColor
); |
| 52 break; | 55 break; |
| 53 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion: | 56 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion: |
| 54 builder->fFSCode.appendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,
0) : vec4(ceil(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", | 57 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0)
: vec4(ceil(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", |
| 55 outputColor, outputColor, outputColor, swiz, outputColor
, outputColor); | 58 outputColor, outputColor, outputColor, swiz, outputColor
, outputColor); |
| 56 break; | 59 break; |
| 57 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio
n: | 60 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio
n: |
| 58 builder->fFSCode.appendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,
0) : vec4(floor(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", | 61 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0)
: vec4(floor(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", |
| 59 outputColor, outputColor, outputColor, swiz, outputColor
, outputColor); | 62 outputColor, outputColor, outputColor, swiz, outputColor
, outputColor); |
| 60 break; | 63 break; |
| 61 default: | 64 default: |
| 62 GrCrash("Unknown conversion op."); | 65 GrCrash("Unknown conversion op."); |
| 63 break; | 66 break; |
| 64 } | 67 } |
| 65 } | 68 } |
| 66 GrGLSLMulVarBy4f(&builder->fFSCode, 2, outputColor, inputColor); | 69 SkString modulate; |
| 70 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 71 builder->fsCodeAppend(modulate.c_str()); |
| 67 } | 72 } |
| 68 | 73 |
| 69 void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) { | 74 void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) { |
| 70 const GrConfigConversionEffect& effect = | 75 const GrConfigConversionEffect& effect = |
| 71 GetEffectFromStage<GrConfigConversionEffect>(stage); | 76 GetEffectFromStage<GrConfigConversionEffect>(stage); |
| 72 fEffectMatrix.setData(uman, | 77 fEffectMatrix.setData(uman, |
| 73 effect.getMatrix(), | 78 effect.getMatrix(), |
| 74 stage.getCoordChangeMatrix(), | 79 stage.getCoordChangeMatrix(), |
| 75 effect.texture(0)); | 80 effect.texture(0)); |
| 76 } | 81 } |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 // The PM conversions assume colors are 0..255 | 282 // The PM conversions assume colors are 0..255 |
| 278 return NULL; | 283 return NULL; |
| 279 } | 284 } |
| 280 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture, | 285 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture, |
| 281 swapRedAndB
lue, | 286 swapRedAndB
lue, |
| 282 pmConversio
n, | 287 pmConversio
n, |
| 283 matrix))); | 288 matrix))); |
| 284 return CreateEffectRef(effect); | 289 return CreateEffectRef(effect); |
| 285 } | 290 } |
| 286 } | 291 } |
| OLD | NEW |