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 |