| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
| (...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 ////////////////////////////////////////////////////////////////////////////// | 878 ////////////////////////////////////////////////////////////////////////////// |
| 879 | 879 |
| 880 #if SK_SUPPORT_GPU | 880 #if SK_SUPPORT_GPU |
| 881 | 881 |
| 882 #include "GrEffect.h" | 882 #include "GrEffect.h" |
| 883 #include "GrCoordTransform.h" | 883 #include "GrCoordTransform.h" |
| 884 #include "GrEffectUnitTest.h" | 884 #include "GrEffectUnitTest.h" |
| 885 #include "GrTBackendEffectFactory.h" | 885 #include "GrTBackendEffectFactory.h" |
| 886 #include "gl/GrGLEffect.h" | 886 #include "gl/GrGLEffect.h" |
| 887 | 887 |
| 888 template GrGLSLExpr3 GrGLSL::min<GrGLSLExpr3>(const GrGLSLExpr3&, const GrGLSLEx
pr3&); |
| 889 template GrGLSLExpr3 GrGLSL::max<GrGLSLExpr3>(const GrGLSLExpr3&, const GrGLSLEx
pr3&); |
| 890 |
| 888 /** | 891 /** |
| 889 * GrEffect that implements the all the separable xfer modes that cannot be expr
essed as Coeffs. | 892 * GrEffect that implements the all the separable xfer modes that cannot be expr
essed as Coeffs. |
| 890 */ | 893 */ |
| 891 class XferEffect : public GrEffect { | 894 class XferEffect : public GrEffect { |
| 892 public: | 895 public: |
| 893 static bool IsSupportedMode(SkXfermode::Mode mode) { | 896 static bool IsSupportedMode(SkXfermode::Mode mode) { |
| 894 return mode > SkXfermode::kLastCoeffMode && mode <= SkXfermode::kLastMod
e; | 897 return mode > SkXfermode::kLastCoeffMode && mode <= SkXfermode::kLastMod
e; |
| 895 } | 898 } |
| 896 | 899 |
| 897 static GrEffectRef* Create(SkXfermode::Mode mode, GrTexture* background) { | 900 static GrEffectRef* Create(SkXfermode::Mode mode, GrTexture* background) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 919 | 922 |
| 920 class GLEffect : public GrGLEffect { | 923 class GLEffect : public GrGLEffect { |
| 921 public: | 924 public: |
| 922 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 925 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) |
| 923 : GrGLEffect(factory) { | 926 : GrGLEffect(factory) { |
| 924 } | 927 } |
| 925 virtual void emitCode(GrGLShaderBuilder* builder, | 928 virtual void emitCode(GrGLShaderBuilder* builder, |
| 926 const GrDrawEffect& drawEffect, | 929 const GrDrawEffect& drawEffect, |
| 927 EffectKey key, | 930 EffectKey key, |
| 928 const char* outputColor, | 931 const char* outputColor, |
| 929 const char* inputColor, | 932 const GrGLSLExpr4& inputColorExpr, |
| 930 const TransformedCoordsArray& coords, | 933 const TransformedCoordsArray& coords, |
| 931 const TextureSamplerArray& samplers) SK_OVERRIDE { | 934 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 932 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode(); | 935 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode(); |
| 933 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>()
.backgroundAccess().getTexture(); | 936 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>()
.backgroundAccess().getTexture(); |
| 934 const char* dstColor; | 937 const char* dstColor; |
| 935 if (backgroundTex) { | 938 if (backgroundTex) { |
| 936 dstColor = "bgColor"; | 939 dstColor = "bgColor"; |
| 937 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor); | 940 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor); |
| 938 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), c
oords[0].type()); | 941 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), c
oords[0].type()); |
| 939 builder->fsCodeAppendf(";\n"); | 942 builder->fsCodeAppendf(";\n"); |
| 940 } else { | 943 } else { |
| 941 dstColor = builder->dstColor(); | 944 dstColor = builder->dstColor(); |
| 942 } | 945 } |
| 943 SkASSERT(NULL != dstColor); | 946 SkASSERT(NULL != dstColor); |
| 944 | 947 |
| 945 // We don't try to optimize for this case at all | |
| 946 if (NULL == inputColor) { | |
| 947 builder->fsCodeAppendf("\t\tconst vec4 ones = vec4(1);\n"); | |
| 948 inputColor = "ones"; | |
| 949 } | |
| 950 builder->fsCodeAppendf("\t\t// SkXfermode::Mode: %s\n", SkXfermode::
ModeName(mode)); | 948 builder->fsCodeAppendf("\t\t// SkXfermode::Mode: %s\n", SkXfermode::
ModeName(mode)); |
| 951 | 949 |
| 950 GrGLSLExpr1 one(1); |
| 951 GrGLSLExpr4 dstColorExpr(dstColor); |
| 952 // These all perform src-over on the alpha channel. | 952 // These all perform src-over on the alpha channel. |
| 953 builder->fsCodeAppendf("\t\t%s.a = %s.a + (1.0 - %s.a) * %s.a;\n", | 953 builder->fsCodeAppendf("\t\t%s.a = %s;\n", |
| 954 outputColor, inputColor, inputColor, dstColo
r); | 954 outputColor, |
| 955 (inputColorExpr.a() + (one - inputColorExpr.a
()) * dstColorExpr.a()).c_str()); |
| 956 |
| 957 const char* inputColor = inputColorExpr.c_str(); // Shorthand for be
low. |
| 955 | 958 |
| 956 switch (mode) { | 959 switch (mode) { |
| 957 case SkXfermode::kOverlay_Mode: | 960 case SkXfermode::kOverlay_Mode: |
| 958 // Overlay is Hard-Light with the src and dst reversed | 961 // Overlay is Hard-Light with the src and dst reversed |
| 959 HardLight(builder, outputColor, dstColor, inputColor); | 962 HardLight(builder, outputColor, dstColor, inputColor); |
| 960 break; | 963 break; |
| 961 case SkXfermode::kDarken_Mode: | 964 case SkXfermode::kDarken_Mode: |
| 962 builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.r
gb + %s.rgb, " | 965 case SkXfermode::kLighten_Mode: { |
| 963 "(1.0 - %s.a) * %s.r
gb + %s.rgb);\n", | 966 GrGLSLExpr3 (*minOrMax)(const GrGLSLExpr3&, const GrGLSLExpr
3&); |
| 964 outputColor, | 967 minOrMax = mode == SkXfermode::kDarken_Mode ? &GrGLSL::min<G
rGLSLExpr3> : &GrGLSL::max<GrGLSLExpr3>; |
| 965 inputColor, dstColor, inputColor, | 968 |
| 966 dstColor, inputColor, dstColor); | 969 builder->fsCodeAppendf("\t\t%s.rgb = %s;\n", outputColor, |
| 970 minOrMax((one - inputColorExpr.a()) *
dstColorExpr.rgb() + inputColorExpr.rgb(), |
| 971 (one - dstColorExpr.a()) * inpu
tColorExpr.rgb() + dstColorExpr.rgb()).c_str()); |
| 967 break; | 972 break; |
| 968 case SkXfermode::kLighten_Mode: | 973 } |
| 969 builder->fsCodeAppendf("\t\t%s.rgb = max((1.0 - %s.a) * %s.r
gb + %s.rgb, " | |
| 970 "(1.0 - %s.a) * %s.r
gb + %s.rgb);\n", | |
| 971 outputColor, | |
| 972 inputColor, dstColor, inputColor, | |
| 973 dstColor, inputColor, dstColor); | |
| 974 break; | |
| 975 case SkXfermode::kColorDodge_Mode: | 974 case SkXfermode::kColorDodge_Mode: |
| 976 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'r'); | 975 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'r'); |
| 977 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'g'); | 976 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'g'); |
| 978 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'b'); | 977 ColorDodgeComponent(builder, outputColor, inputColor, dstCol
or, 'b'); |
| 979 break; | 978 break; |
| 980 case SkXfermode::kColorBurn_Mode: | 979 case SkXfermode::kColorBurn_Mode: |
| 981 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'r'); | 980 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'r'); |
| 982 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'g'); | 981 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'g'); |
| 983 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'b'); | 982 ColorBurnComponent(builder, outputColor, inputColor, dstColo
r, 'b'); |
| 984 break; | 983 break; |
| (...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1944 return proc16; | 1943 return proc16; |
| 1945 } | 1944 } |
| 1946 | 1945 |
| 1947 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1946 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1947 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
| 1950 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
| 1951 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1950 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
| 1952 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1951 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
| 1953 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1952 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |