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 |