| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/output/shader.h" | 5 #include "cc/output/shader.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 for (size_t i = 0; i < count; i++) { | 45 for (size_t i = 0; i < count; i++) { |
| 46 locations[i] = (*base_uniform_index)++; | 46 locations[i] = (*base_uniform_index)++; |
| 47 context->BindUniformLocationCHROMIUM(program, locations[i], uniforms[i]); | 47 context->BindUniformLocationCHROMIUM(program, locations[i], uniforms[i]); |
| 48 } | 48 } |
| 49 } | 49 } |
| 50 | 50 |
| 51 static std::string SetFragmentTexCoordPrecision( | 51 static std::string SetFragmentTexCoordPrecision( |
| 52 TexCoordPrecision requested_precision, | 52 TexCoordPrecision requested_precision, |
| 53 std::string shader_string) { | 53 std::string shader_string) { |
| 54 switch (requested_precision) { | 54 switch (requested_precision) { |
| 55 case TEX_COORD_PRECISION_HIGH: | 55 case TexCoordPrecisionHigh: |
| 56 DCHECK_NE(shader_string.find("TexCoordPrecision"), std::string::npos); | 56 DCHECK_NE(shader_string.find("TexCoordPrecision"), std::string::npos); |
| 57 return "#ifdef GL_FRAGMENT_PRECISION_HIGH\n" | 57 return "#ifdef GL_FRAGMENT_PRECISION_HIGH\n" |
| 58 " #define TexCoordPrecision highp\n" | 58 " #define TexCoordPrecision highp\n" |
| 59 "#else\n" | 59 "#else\n" |
| 60 " #define TexCoordPrecision mediump\n" | 60 " #define TexCoordPrecision mediump\n" |
| 61 "#endif\n" + | 61 "#endif\n" + |
| 62 shader_string; | 62 shader_string; |
| 63 case TEX_COORD_PRECISION_MEDIUM: | 63 case TexCoordPrecisionMedium: |
| 64 DCHECK_NE(shader_string.find("TexCoordPrecision"), std::string::npos); | 64 DCHECK_NE(shader_string.find("TexCoordPrecision"), std::string::npos); |
| 65 return "#define TexCoordPrecision mediump\n" + shader_string; | 65 return "#define TexCoordPrecision mediump\n" + shader_string; |
| 66 case TEX_COORD_PRECISION_NA: | 66 case TexCoordPrecisionNA: |
| 67 DCHECK_EQ(shader_string.find("TexCoordPrecision"), std::string::npos); | 67 DCHECK_EQ(shader_string.find("TexCoordPrecision"), std::string::npos); |
| 68 DCHECK_EQ(shader_string.find("texture2D"), std::string::npos); | 68 DCHECK_EQ(shader_string.find("texture2D"), std::string::npos); |
| 69 DCHECK_EQ(shader_string.find("texture2DRect"), std::string::npos); | 69 DCHECK_EQ(shader_string.find("texture2DRect"), std::string::npos); |
| 70 return shader_string; | 70 return shader_string; |
| 71 default: | 71 default: |
| 72 NOTREACHED(); | 72 NOTREACHED(); |
| 73 break; | 73 break; |
| 74 } | 74 } |
| 75 return shader_string; | 75 return shader_string; |
| 76 } | 76 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 97 GLint range[2] = {14, 14}; | 97 GLint range[2] = {14, 14}; |
| 98 GLint precision = 10; | 98 GLint precision = 10; |
| 99 GLC(context, | 99 GLC(context, |
| 100 context->GetShaderPrecisionFormat( | 100 context->GetShaderPrecisionFormat( |
| 101 GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, range, &precision)); | 101 GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, range, &precision)); |
| 102 *highp_threshold_cache = 1 << precision; | 102 *highp_threshold_cache = 1 << precision; |
| 103 } | 103 } |
| 104 | 104 |
| 105 int highp_threshold = std::max(*highp_threshold_cache, highp_threshold_min); | 105 int highp_threshold = std::max(*highp_threshold_cache, highp_threshold_min); |
| 106 if (x > highp_threshold || y > highp_threshold) | 106 if (x > highp_threshold || y > highp_threshold) |
| 107 return TEX_COORD_PRECISION_HIGH; | 107 return TexCoordPrecisionHigh; |
| 108 return TEX_COORD_PRECISION_MEDIUM; | 108 return TexCoordPrecisionMedium; |
| 109 } | 109 } |
| 110 | 110 |
| 111 static std::string SetFragmentSamplerType(SamplerType requested_type, | 111 static std::string SetFragmentSamplerType(SamplerType requested_type, |
| 112 std::string shader_string) { | 112 std::string shader_string) { |
| 113 switch (requested_type) { | 113 switch (requested_type) { |
| 114 case SAMPLER_TYPE_2D: | 114 case SamplerType2D: |
| 115 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); | 115 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); |
| 116 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); | 116 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); |
| 117 return "#define SamplerType sampler2D\n" | 117 return "#define SamplerType sampler2D\n" |
| 118 "#define TextureLookup texture2D\n" + | 118 "#define TextureLookup texture2D\n" + |
| 119 shader_string; | 119 shader_string; |
| 120 case SAMPLER_TYPE_2D_RECT: | 120 case SamplerType2DRect: |
| 121 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); | 121 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); |
| 122 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); | 122 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); |
| 123 return "#extension GL_ARB_texture_rectangle : require\n" | 123 return "#extension GL_ARB_texture_rectangle : require\n" |
| 124 "#define SamplerType sampler2DRect\n" | 124 "#define SamplerType sampler2DRect\n" |
| 125 "#define TextureLookup texture2DRect\n" + | 125 "#define TextureLookup texture2DRect\n" + |
| 126 shader_string; | 126 shader_string; |
| 127 case SAMPLER_TYPE_EXTERNAL_OES: | 127 case SamplerTypeExternalOES: |
| 128 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); | 128 DCHECK_NE(shader_string.find("SamplerType"), std::string::npos); |
| 129 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); | 129 DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos); |
| 130 return "#extension GL_OES_EGL_image_external : require\n" | 130 return "#extension GL_OES_EGL_image_external : require\n" |
| 131 "#define SamplerType samplerExternalOES\n" | 131 "#define SamplerType samplerExternalOES\n" |
| 132 "#define TextureLookup texture2D\n" + | 132 "#define TextureLookup texture2D\n" + |
| 133 shader_string; | 133 shader_string; |
| 134 case SAMPLER_TYPE_NA: | 134 case SamplerTypeNA: |
| 135 DCHECK_EQ(shader_string.find("SamplerType"), std::string::npos); | 135 DCHECK_EQ(shader_string.find("SamplerType"), std::string::npos); |
| 136 DCHECK_EQ(shader_string.find("TextureLookup"), std::string::npos); | 136 DCHECK_EQ(shader_string.find("TextureLookup"), std::string::npos); |
| 137 return shader_string; | 137 return shader_string; |
| 138 default: | 138 default: |
| 139 NOTREACHED(); | 139 NOTREACHED(); |
| 140 break; | 140 break; |
| 141 } | 141 } |
| 142 return shader_string; | 142 return shader_string; |
| 143 } | 143 } |
| 144 | 144 |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 #define BLEND_MODE_SET_LOCATIONS(X, POS) \ | 727 #define BLEND_MODE_SET_LOCATIONS(X, POS) \ |
| 728 if (has_blend_mode()) { \ | 728 if (has_blend_mode()) { \ |
| 729 DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \ | 729 DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \ |
| 730 backdrop_location_ = locations[POS]; \ | 730 backdrop_location_ = locations[POS]; \ |
| 731 backdrop_rect_location_ = locations[POS + 1]; \ | 731 backdrop_rect_location_ = locations[POS + 1]; \ |
| 732 } | 732 } |
| 733 | 733 |
| 734 FragmentTexBlendMode::FragmentTexBlendMode() | 734 FragmentTexBlendMode::FragmentTexBlendMode() |
| 735 : backdrop_location_(-1), | 735 : backdrop_location_(-1), |
| 736 backdrop_rect_location_(-1), | 736 backdrop_rect_location_(-1), |
| 737 blend_mode_(BLEND_MODE_NONE) { | 737 blend_mode_(BlendModeNone) { |
| 738 } | 738 } |
| 739 | 739 |
| 740 std::string FragmentTexBlendMode::SetBlendModeFunctions( | 740 std::string FragmentTexBlendMode::SetBlendModeFunctions( |
| 741 std::string shader_string) const { | 741 std::string shader_string) const { |
| 742 if (shader_string.find("ApplyBlendMode") == std::string::npos) | 742 if (shader_string.find("ApplyBlendMode") == std::string::npos) |
| 743 return shader_string; | 743 return shader_string; |
| 744 | 744 |
| 745 if (!has_blend_mode()) { | 745 if (!has_blend_mode()) { |
| 746 return "#define ApplyBlendMode(X) (X)\n" + shader_string; | 746 return "#define ApplyBlendMode(X) (X)\n" + shader_string; |
| 747 } | 747 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 hueLumColor.r, sat); | 901 hueLumColor.r, sat); |
| 902 } else { | 902 } else { |
| 903 hueLumColor.bgr = set_saturation_helper(hueLumColor.b, hueLumColor.g, | 903 hueLumColor.bgr = set_saturation_helper(hueLumColor.b, hueLumColor.g, |
| 904 hueLumColor.r, sat); | 904 hueLumColor.r, sat); |
| 905 } | 905 } |
| 906 return hueLumColor; | 906 return hueLumColor; |
| 907 } | 907 } |
| 908 }); | 908 }); |
| 909 | 909 |
| 910 switch (blend_mode_) { | 910 switch (blend_mode_) { |
| 911 case BLEND_MODE_OVERLAY: | 911 case BlendModeOverlay: |
| 912 case BLEND_MODE_HARD_LIGHT: | 912 case BlendModeHardLight: |
| 913 return kFunctionHardLight; | 913 return kFunctionHardLight; |
| 914 case BLEND_MODE_COLOR_DODGE: | 914 case BlendModeColorDodge: |
| 915 return kFunctionColorDodgeComponent; | 915 return kFunctionColorDodgeComponent; |
| 916 case BLEND_MODE_COLOR_BURN: | 916 case BlendModeColorBurn: |
| 917 return kFunctionColorBurnComponent; | 917 return kFunctionColorBurnComponent; |
| 918 case BLEND_MODE_SOFT_LIGHT: | 918 case BlendModeSoftLight: |
| 919 return kFunctionSoftLightComponentPosDstAlpha; | 919 return kFunctionSoftLightComponentPosDstAlpha; |
| 920 case BLEND_MODE_HUE: | 920 case BlendModeHue: |
| 921 case BLEND_MODE_SATURATION: | 921 case BlendModeSaturation: |
| 922 return kFunctionLum + kFunctionSat; | 922 return kFunctionLum + kFunctionSat; |
| 923 case BLEND_MODE_COLOR: | 923 case BlendModeColor: |
| 924 case BLEND_MODE_LUMINOSITY: | 924 case BlendModeLuminosity: |
| 925 return kFunctionLum; | 925 return kFunctionLum; |
| 926 default: | 926 default: |
| 927 return std::string(); | 927 return std::string(); |
| 928 } | 928 } |
| 929 } | 929 } |
| 930 | 930 |
| 931 std::string FragmentTexBlendMode::GetBlendFunction() const { | 931 std::string FragmentTexBlendMode::GetBlendFunction() const { |
| 932 return "vec4 Blend(vec4 src, vec4 dst) {" | 932 return "vec4 Blend(vec4 src, vec4 dst) {" |
| 933 " vec4 result;" | 933 " vec4 result;" |
| 934 " result.a = src.a + (1.0 - src.a) * dst.a;" + | 934 " result.a = src.a + (1.0 - src.a) * dst.a;" + |
| 935 GetBlendFunctionBodyForRGB() + | 935 GetBlendFunctionBodyForRGB() + |
| 936 " return result;" | 936 " return result;" |
| 937 "}"; | 937 "}"; |
| 938 } | 938 } |
| 939 | 939 |
| 940 std::string FragmentTexBlendMode::GetBlendFunctionBodyForRGB() const { | 940 std::string FragmentTexBlendMode::GetBlendFunctionBodyForRGB() const { |
| 941 switch (blend_mode_) { | 941 switch (blend_mode_) { |
| 942 case BLEND_MODE_NORMAL: | 942 case BlendModeNormal: |
| 943 return "result.rgb = src.rgb + dst.rgb * (1.0 - src.a);"; | 943 return "result.rgb = src.rgb + dst.rgb * (1.0 - src.a);"; |
| 944 case BLEND_MODE_SCREEN: | 944 case BlendModeScreen: |
| 945 return "result.rgb = src.rgb + (1.0 - src.rgb) * dst.rgb;"; | 945 return "result.rgb = src.rgb + (1.0 - src.rgb) * dst.rgb;"; |
| 946 case BLEND_MODE_LIGHTEN: | 946 case BlendModeLighten: |
| 947 return "result.rgb = max((1.0 - src.a) * dst.rgb + src.rgb," | 947 return "result.rgb = max((1.0 - src.a) * dst.rgb + src.rgb," |
| 948 " (1.0 - dst.a) * src.rgb + dst.rgb);"; | 948 " (1.0 - dst.a) * src.rgb + dst.rgb);"; |
| 949 case BLEND_MODE_OVERLAY: | 949 case BlendModeOverlay: |
| 950 return "result.rgb = hardLight(dst, src);"; | 950 return "result.rgb = hardLight(dst, src);"; |
| 951 case BLEND_MODE_DARKEN: | 951 case BlendModeDarken: |
| 952 return "result.rgb = min((1.0 - src.a) * dst.rgb + src.rgb," | 952 return "result.rgb = min((1.0 - src.a) * dst.rgb + src.rgb," |
| 953 " (1.0 - dst.a) * src.rgb + dst.rgb);"; | 953 " (1.0 - dst.a) * src.rgb + dst.rgb);"; |
| 954 case BLEND_MODE_COLOR_DODGE: | 954 case BlendModeColorDodge: |
| 955 return "result.r = getColorDodgeComponent(src.r, src.a, dst.r, dst.a);" | 955 return "result.r = getColorDodgeComponent(src.r, src.a, dst.r, dst.a);" |
| 956 "result.g = getColorDodgeComponent(src.g, src.a, dst.g, dst.a);" | 956 "result.g = getColorDodgeComponent(src.g, src.a, dst.g, dst.a);" |
| 957 "result.b = getColorDodgeComponent(src.b, src.a, dst.b, dst.a);"; | 957 "result.b = getColorDodgeComponent(src.b, src.a, dst.b, dst.a);"; |
| 958 case BLEND_MODE_COLOR_BURN: | 958 case BlendModeColorBurn: |
| 959 return "result.r = getColorBurnComponent(src.r, src.a, dst.r, dst.a);" | 959 return "result.r = getColorBurnComponent(src.r, src.a, dst.r, dst.a);" |
| 960 "result.g = getColorBurnComponent(src.g, src.a, dst.g, dst.a);" | 960 "result.g = getColorBurnComponent(src.g, src.a, dst.g, dst.a);" |
| 961 "result.b = getColorBurnComponent(src.b, src.a, dst.b, dst.a);"; | 961 "result.b = getColorBurnComponent(src.b, src.a, dst.b, dst.a);"; |
| 962 case BLEND_MODE_HARD_LIGHT: | 962 case BlendModeHardLight: |
| 963 return "result.rgb = hardLight(src, dst);"; | 963 return "result.rgb = hardLight(src, dst);"; |
| 964 case BLEND_MODE_SOFT_LIGHT: | 964 case BlendModeSoftLight: |
| 965 return "if (0.0 == dst.a) {" | 965 return "if (0.0 == dst.a) {" |
| 966 " result.rgb = src.rgb;" | 966 " result.rgb = src.rgb;" |
| 967 "} else {" | 967 "} else {" |
| 968 " result.r = getSoftLightComponent(src.r, src.a, dst.r, dst.a);" | 968 " result.r = getSoftLightComponent(src.r, src.a, dst.r, dst.a);" |
| 969 " result.g = getSoftLightComponent(src.g, src.a, dst.g, dst.a);" | 969 " result.g = getSoftLightComponent(src.g, src.a, dst.g, dst.a);" |
| 970 " result.b = getSoftLightComponent(src.b, src.a, dst.b, dst.a);" | 970 " result.b = getSoftLightComponent(src.b, src.a, dst.b, dst.a);" |
| 971 "}"; | 971 "}"; |
| 972 case BLEND_MODE_DIFFERENCE: | 972 case BlendModeDifference: |
| 973 return "result.rgb = src.rgb + dst.rgb -" | 973 return "result.rgb = src.rgb + dst.rgb -" |
| 974 " 2.0 * min(src.rgb * dst.a, dst.rgb * src.a);"; | 974 " 2.0 * min(src.rgb * dst.a, dst.rgb * src.a);"; |
| 975 case BLEND_MODE_EXCLUSION: | 975 case BlendModeExclusion: |
| 976 return "result.rgb = dst.rgb + src.rgb - 2.0 * dst.rgb * src.rgb;"; | 976 return "result.rgb = dst.rgb + src.rgb - 2.0 * dst.rgb * src.rgb;"; |
| 977 case BLEND_MODE_MULTIPLY: | 977 case BlendModeMultiply: |
| 978 return "result.rgb = (1.0 - src.a) * dst.rgb +" | 978 return "result.rgb = (1.0 - src.a) * dst.rgb +" |
| 979 " (1.0 - dst.a) * src.rgb + src.rgb * dst.rgb;"; | 979 " (1.0 - dst.a) * src.rgb + src.rgb * dst.rgb;"; |
| 980 case BLEND_MODE_HUE: | 980 case BlendModeHue: |
| 981 return "vec4 dstSrcAlpha = dst * src.a;" | 981 return "vec4 dstSrcAlpha = dst * src.a;" |
| 982 "result.rgb =" | 982 "result.rgb =" |
| 983 " set_luminance(set_saturation(src.rgb * dst.a," | 983 " set_luminance(set_saturation(src.rgb * dst.a," |
| 984 " dstSrcAlpha.rgb)," | 984 " dstSrcAlpha.rgb)," |
| 985 " dstSrcAlpha.a," | 985 " dstSrcAlpha.a," |
| 986 " dstSrcAlpha.rgb);" | 986 " dstSrcAlpha.rgb);" |
| 987 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 987 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
| 988 case BLEND_MODE_SATURATION: | 988 case BlendModeSaturation: |
| 989 return "vec4 dstSrcAlpha = dst * src.a;" | 989 return "vec4 dstSrcAlpha = dst * src.a;" |
| 990 "result.rgb = set_luminance(set_saturation(dstSrcAlpha.rgb," | 990 "result.rgb = set_luminance(set_saturation(dstSrcAlpha.rgb," |
| 991 " src.rgb * dst.a)," | 991 " src.rgb * dst.a)," |
| 992 " dstSrcAlpha.a," | 992 " dstSrcAlpha.a," |
| 993 " dstSrcAlpha.rgb);" | 993 " dstSrcAlpha.rgb);" |
| 994 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 994 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
| 995 case BLEND_MODE_COLOR: | 995 case BlendModeColor: |
| 996 return "vec4 srcDstAlpha = src * dst.a;" | 996 return "vec4 srcDstAlpha = src * dst.a;" |
| 997 "result.rgb = set_luminance(srcDstAlpha.rgb," | 997 "result.rgb = set_luminance(srcDstAlpha.rgb," |
| 998 " srcDstAlpha.a," | 998 " srcDstAlpha.a," |
| 999 " dst.rgb * src.a);" | 999 " dst.rgb * src.a);" |
| 1000 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 1000 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
| 1001 case BLEND_MODE_LUMINOSITY: | 1001 case BlendModeLuminosity: |
| 1002 return "vec4 srcDstAlpha = src * dst.a;" | 1002 return "vec4 srcDstAlpha = src * dst.a;" |
| 1003 "result.rgb = set_luminance(dst.rgb * src.a," | 1003 "result.rgb = set_luminance(dst.rgb * src.a," |
| 1004 " srcDstAlpha.a," | 1004 " srcDstAlpha.a," |
| 1005 " srcDstAlpha.rgb);" | 1005 " srcDstAlpha.rgb);" |
| 1006 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; | 1006 "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;"; |
| 1007 case BLEND_MODE_NONE: | 1007 case BlendModeNone: |
| 1008 case NumBlendModes: |
| 1008 NOTREACHED(); | 1009 NOTREACHED(); |
| 1009 } | 1010 } |
| 1010 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; | 1011 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; |
| 1011 } | 1012 } |
| 1012 | 1013 |
| 1013 FragmentTexAlphaBinding::FragmentTexAlphaBinding() | 1014 FragmentTexAlphaBinding::FragmentTexAlphaBinding() |
| 1014 : sampler_location_(-1), alpha_location_(-1) { | 1015 : sampler_location_(-1), alpha_location_(-1) { |
| 1015 } | 1016 } |
| 1016 | 1017 |
| 1017 void FragmentTexAlphaBinding::Init(GLES2Interface* context, | 1018 void FragmentTexAlphaBinding::Init(GLES2Interface* context, |
| (...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 vec2 texCoord = | 2141 vec2 texCoord = |
| 2141 clamp(v_texCoord, 0.0, 1.0) * texTransform.zw + texTransform.xy; | 2142 clamp(v_texCoord, 0.0, 1.0) * texTransform.zw + texTransform.xy; |
| 2142 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0); | 2143 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0); |
| 2143 float picker = abs(coord.x - coord.y); // NOLINT | 2144 float picker = abs(coord.x - coord.y); // NOLINT |
| 2144 gl_FragColor = mix(color1, color2, picker) * alpha; | 2145 gl_FragColor = mix(color1, color2, picker) * alpha; |
| 2145 } | 2146 } |
| 2146 }); | 2147 }); |
| 2147 } | 2148 } |
| 2148 | 2149 |
| 2149 } // namespace cc | 2150 } // namespace cc |
| OLD | NEW |