Index: cc/output/shader.cc |
diff --git a/cc/output/shader.cc b/cc/output/shader.cc |
index 287ffcc9b4662cc0d18366f1c7ecfbe6c9254d3c..7c994a2211299f40cec3b215ec96e7195f1fd575 100644 |
--- a/cc/output/shader.cc |
+++ b/cc/output/shader.cc |
@@ -741,19 +741,24 @@ std::string VertexShaderVideoTransform::GetShaderBody() { |
}); |
} |
-#define BLEND_MODE_UNIFORMS "s_backdropTexture", "backdropRect" |
-#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 2 : 0) |
+#define BLEND_MODE_UNIFORMS "s_backdropTexture", \ |
+ "s_originalBackdropTexture", \ |
+ "backdropRect" |
+#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0) |
#define BLEND_MODE_SET_LOCATIONS(X, POS) \ |
if (has_blend_mode()) { \ |
- DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \ |
+ DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ |
backdrop_location_ = locations[POS]; \ |
- backdrop_rect_location_ = locations[POS + 1]; \ |
+ original_backdrop_location_ = locations[POS + 1]; \ |
+ backdrop_rect_location_ = locations[POS + 2]; \ |
} |
FragmentTexBlendMode::FragmentTexBlendMode() |
: backdrop_location_(-1), |
+ original_backdrop_location_(-1), |
backdrop_rect_location_(-1), |
- blend_mode_(BLEND_MODE_NONE) { |
+ blend_mode_(BLEND_MODE_NONE), |
+ mask_for_background_(false) { |
} |
std::string FragmentTexBlendMode::SetBlendModeFunctions( |
@@ -762,11 +767,14 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions( |
return shader_string; |
if (!has_blend_mode()) { |
- return "#define ApplyBlendMode(X) (X)\n" + shader_string; |
+ return "#define ApplyBlendMode(X) (X)\n" |
+ "#define ApplyBlendModeWithMask(X, Y) (X)\n" + |
+ shader_string; |
} |
static const std::string kFunctionApplyBlendMode = SHADER0([]() { |
uniform sampler2D s_backdropTexture; |
+ uniform sampler2D s_originalBackdropTexture; |
uniform TexCoordPrecision vec4 backdropRect; |
vec4 GetBackdropColor() { |
@@ -780,6 +788,20 @@ std::string FragmentTexBlendMode::SetBlendModeFunctions( |
vec4 dst = GetBackdropColor(); |
return Blend(src, dst); |
} |
+ |
+ vec4 GetBackdropColorWithMask(float mask) { |
+ TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy; |
+ bgTexCoord.x /= backdropRect.z; |
+ bgTexCoord.y /= backdropRect.w; |
+ vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord); |
+ vec4 original_backdrop = texture2D(s_originalBackdropTexture, bgTexCoord); |
enne (OOO)
2015/03/03 23:27:47
Would it be more precise to call this unfiltered,
|
+ return mix(original_backdrop, backdrop, mask); |
+ } |
+ |
+ vec4 ApplyBlendModeWithMask(vec4 src, float mask) { |
+ vec4 dst = GetBackdropColorWithMask(mask); |
+ return Blend(src, dst); |
+ } |
}); |
return "precision mediump float;" + GetHelperFunctions() + |
@@ -1577,7 +1599,7 @@ void FragmentShaderRGBATexAlphaMask::Init(GLES2Interface* context, |
std::string FragmentShaderRGBATexAlphaMask::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody()); |
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background())); |
} |
std::string FragmentShaderRGBATexAlphaMask::GetShaderHead() { |
@@ -1592,17 +1614,21 @@ std::string FragmentShaderRGBATexAlphaMask::GetShaderHead() { |
}); |
} |
-std::string FragmentShaderRGBATexAlphaMask::GetShaderBody() { |
+std::string FragmentShaderRGBATexAlphaMask::GetShaderBody( |
+ bool mask_for_background) { |
return SHADER0([]() { |
void main() { |
vec4 texColor = texture2D(s_texture, v_texCoord); |
TexCoordPrecision vec2 maskTexCoord = |
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
- vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w); |
- } |
- }); |
+ vec4 maskColor = TextureLookup(s_mask, maskTexCoord); }) + |
+ (mask_for_background |
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask( |
+ texColor * alpha * maskColor.w, maskColor.w); }) |
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w); })) + |
+ SHADER0([]() {}}); |
} |
void FragmentShaderRGBATexAlphaMask::FillLocations( |
@@ -1614,6 +1640,8 @@ void FragmentShaderRGBATexAlphaMask::FillLocations( |
locations->alpha = alpha_location(); |
locations->backdrop = backdrop_location(); |
locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
} |
FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA() |
@@ -1654,7 +1682,7 @@ void FragmentShaderRGBATexAlphaMaskAA::Init(GLES2Interface* context, |
std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody()); |
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background())); |
} |
std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderHead() { |
@@ -1670,7 +1698,8 @@ std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderHead() { |
}); |
} |
-std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody() { |
+std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody( |
+ bool mask_for_background) { |
return SHADER0([]() { |
void main() { |
vec4 texColor = texture2D(s_texture, v_texCoord); |
@@ -1680,10 +1709,13 @@ std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderBody() { |
vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
- float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa); |
- } |
- }); |
+ float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); }) + |
+ (mask_for_background |
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask( |
+ texColor * alpha * maskColor.w * aa, maskColor.w); }) |
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w * aa); })) + |
+ SHADER0([]() {}}); |
} |
void FragmentShaderRGBATexAlphaMaskAA::FillLocations( |
@@ -1695,6 +1727,8 @@ void FragmentShaderRGBATexAlphaMaskAA::FillLocations( |
locations->alpha = alpha_location(); |
locations->backdrop = backdrop_location(); |
locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
} |
FragmentShaderRGBATexAlphaMaskColorMatrixAA:: |
@@ -1742,7 +1776,7 @@ void FragmentShaderRGBATexAlphaMaskColorMatrixAA::Init( |
std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody()); |
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background())); |
} |
std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderHead() { |
@@ -1760,7 +1794,8 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderHead() { |
}); |
} |
-std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody() { |
+std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody( |
+ bool mask_for_background) { |
return SHADER0([]() { |
void main() { |
vec4 texColor = texture2D(s_texture, v_texCoord); |
@@ -1775,10 +1810,13 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderBody() { |
vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
vec4 d4 = min(edge_dist[0], edge_dist[1]); |
vec2 d2 = min(d4.xz, d4.yw); |
- float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa); |
- } |
- }); |
+ float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); }) + |
+ (mask_for_background |
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask( |
enne (OOO)
2015/03/03 23:27:47
Can you make this easier to read and reduce the co
|
+ texColor * alpha * maskColor.w * aa, maskColor.w); }) |
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w * aa); })) + |
+ SHADER0([]() {}}); |
} |
void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations( |
@@ -1792,6 +1830,8 @@ void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations( |
locations->color_offset = color_offset_location(); |
locations->backdrop = backdrop_location(); |
locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
} |
FragmentShaderRGBATexAlphaColorMatrixAA:: |
@@ -1910,7 +1950,7 @@ void FragmentShaderRGBATexAlphaMaskColorMatrix::Init(GLES2Interface* context, |
std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderString( |
TexCoordPrecision precision, |
SamplerType sampler) const { |
- return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody()); |
+ return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody(mask_for_background())); |
} |
std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderHead() { |
@@ -1927,7 +1967,8 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderHead() { |
}); |
} |
-std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody() { |
+std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody( |
+ bool mask_for_background) { |
return SHADER0([]() { |
void main() { |
vec4 texColor = texture2D(s_texture, v_texCoord); |
@@ -1939,10 +1980,13 @@ std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderBody() { |
TexCoordPrecision vec2 maskTexCoord = |
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, |
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y); |
- vec4 maskColor = TextureLookup(s_mask, maskTexCoord); |
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w); |
- } |
- }); |
+ vec4 maskColor = TextureLookup(s_mask, maskTexCoord); }) + |
+ (mask_for_background |
+ ? SHADER0([]() { gl_FragColor = ApplyBlendModeWithMask( |
+ texColor * alpha * maskColor.w, maskColor.w); }) |
+ : SHADER0([]() { gl_FragColor = ApplyBlendMode( |
+ texColor * alpha * maskColor.w); })) + |
+ SHADER0([]() {}}); |
} |
void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations( |
@@ -1956,6 +2000,8 @@ void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations( |
locations->color_offset = color_offset_location(); |
locations->backdrop = backdrop_location(); |
locations->backdrop_rect = backdrop_rect_location(); |
+ if (mask_for_background()) |
+ locations->original_backdrop = original_backdrop_location(); |
} |
FragmentShaderYUVVideo::FragmentShaderYUVVideo() |