Diff
Copied: branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.png (from rev 125193, trunk/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.png)
(Binary files differ)
Copied: branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.txt (from rev 125193, trunk/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.txt) (0 => 125474)
--- branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.txt (rev 0)
+++ branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer-expected.txt 2012-08-14 00:33:47 UTC (rev 125474)
@@ -0,0 +1,10 @@
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x216
+ RenderBlock {HTML} at (0,0) size 800x216
+ RenderBody {BODY} at (8,8) size 784x200
+layer at (8,8) size 200x200 scrollWidth 300 scrollHeight 300
+ RenderBlock {DIV} at (0,0) size 200x200 [bgcolor=#0000FF]
+ RenderBlock {DIV} at (0,0) size 140x140 [bgcolor=#FF0000]
+layer at (8,8) size 300x300 backgroundClip at (8,8) size 200x200 clip at (8,8) size 200x200 outlineClip at (8,8) size 200x200
+ RenderBlock {DIV} at (0,0) size 300x300 [bgcolor=#00FF00]
Copied: branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer.html (from rev 125193, trunk/LayoutTests/compositing/masks/mask-of-clipped-layer.html) (0 => 125474)
--- branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer.html (rev 0)
+++ branches/chromium/1229/LayoutTests/compositing/masks/mask-of-clipped-layer.html 2012-08-14 00:33:47 UTC (rev 125474)
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style type="text/css" media="screen">
+ .hidesOverflow {
+ background-color: blue;
+ width: 200px;
+ height: 200px;
+ overflow: hidden;
+ }
+
+ .shouldNotBeVisible {
+ background-color: red;
+ width: 140px;
+ height: 140px;
+ }
+
+ .composited {
+ -webkit-transform: translatez(0);
+ }
+
+ .masked {
+ -webkit-mask-box-image: url(../resources/alpha-blocks.png);
+ background-color: lime;
+ width: 300px;
+ height: 300px;
+ }
+ </style>
+</head>
+<body>
+<!--
+ https://bugs.webkit.org/show_bug.cgi?id=93558
+
+ Scenario: The alpha-blocks mask has a checkerboard pattern of opaque/transparent
+ sections. The top-left section of the mask should be opaque, so the red div should not be
+ visible underneath the mask. However, in chromium there was a bug where the mask was
+ accidentally being resized to the clip area, incorrectly exposing the red div.
+-->
+ <div class="hidesOverflow">
+ <div class="shouldNotBeVisible">
+ <div class="composited masked">
+ </div>
+ </div>
+</body>
+</html>
Copied: branches/chromium/1229/LayoutTests/compositing/resources/alpha-blocks.png (from rev 125193, trunk/LayoutTests/compositing/resources/alpha-blocks.png)
(Binary files differ)
Modified: branches/chromium/1229/LayoutTests/platform/chromium/TestExpectations (125473 => 125474)
--- branches/chromium/1229/LayoutTests/platform/chromium/TestExpectations 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/LayoutTests/platform/chromium/TestExpectations 2012-08-14 00:33:47 UTC (rev 125474)
@@ -3504,3 +3504,6 @@
BUGWK93247 : fast/lists/list-marker-remove-crash.html = CRASH
+
+// Should only need rebaselining after bug 93558, if both squares are fully green.
+BUGWK93558 : compositing/masks/layer-mask-placement.html = IMAGE
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp 2012-08-14 00:33:47 UTC (rev 125474)
@@ -685,6 +685,8 @@
int shaderQuadLocation = -1;
int shaderEdgeLocation = -1;
int shaderMaskSamplerLocation = -1;
+ int shaderMaskTexCoordScaleLocation = -1;
+ int shaderMaskTexCoordOffsetLocation = -1;
int shaderMatrixLocation = -1;
int shaderAlphaLocation = -1;
if (useAA && maskTextureId) {
@@ -695,6 +697,8 @@
shaderQuadLocation = program->vertexShader().pointLocation();
shaderEdgeLocation = program->fragmentShader().edgeLocation();
shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocation();
+ shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoordScaleLocation();
+ shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoordOffsetLocation();
shaderMatrixLocation = program->vertexShader().matrixLocation();
shaderAlphaLocation = program->fragmentShader().alphaLocation();
} else if (!useAA && maskTextureId) {
@@ -703,6 +707,8 @@
GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocation(), 0));
shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocation();
+ shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoordScaleLocation();
+ shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoordOffsetLocation();
shaderMatrixLocation = program->vertexShader().matrixLocation();
shaderAlphaLocation = program->fragmentShader().alphaLocation();
} else if (useAA && !maskTextureId) {
@@ -724,8 +730,12 @@
}
if (shaderMaskSamplerLocation != -1) {
+ ASSERT(shaderMaskTexCoordScaleLocation != 1);
+ ASSERT(shaderMaskTexCoordOffsetLocation != 1);
GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE1));
GLC(context(), context()->uniform1i(shaderMaskSamplerLocation, 1));
+ GLC(context(), context()->uniform2f(shaderMaskTexCoordScaleLocation, quad->maskTexCoordScaleX(), quad->maskTexCoordScaleY()));
+ GLC(context(), context()->uniform2f(shaderMaskTexCoordOffsetLocation, quad->maskTexCoordOffsetX(), quad->maskTexCoordOffsetY()));
context()->bindTexture(GraphicsContext3D::TEXTURE_2D, maskTextureId);
GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0));
}
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp 2012-08-14 00:33:47 UTC (rev 125474)
@@ -656,6 +656,7 @@
: m_samplerLocation(-1)
, m_maskSamplerLocation(-1)
, m_alphaLocation(-1)
+ , m_maskTexCoordScaleLocation(-1)
{
}
@@ -665,14 +666,18 @@
"s_texture",
"s_mask",
"alpha",
+ "maskTexCoordScale",
+ "maskTexCoordOffset",
};
- int locations[3];
+ int locations[5];
getProgramUniformLocations(context, program, shaderUniforms, WTF_ARRAY_LENGTH(shaderUniforms), WTF_ARRAY_LENGTH(locations), locations, usingBindUniform, baseUniformIndex);
m_samplerLocation = locations[0];
m_maskSamplerLocation = locations[1];
m_alphaLocation = locations[2];
+ m_maskTexCoordScaleLocation = locations[3];
+ m_maskTexCoordOffsetLocation = locations[4];
ASSERT(m_samplerLocation != -1 && m_maskSamplerLocation != -1 && m_alphaLocation != -1);
}
@@ -683,11 +688,14 @@
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform sampler2D s_mask;
+ uniform vec2 maskTexCoordScale;
+ uniform vec2 maskTexCoordOffset;
uniform float alpha;
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
- vec4 maskColor = texture2D(s_mask, v_texCoord);
+ vec2 maskTexCoord = vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
+ vec4 maskColor = texture2D(s_mask, maskTexCoord);
gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha * maskColor.w;
}
);
@@ -698,6 +706,7 @@
, m_maskSamplerLocation(-1)
, m_alphaLocation(-1)
, m_edgeLocation(-1)
+ , m_maskTexCoordScaleLocation(-1)
{
}
@@ -708,8 +717,10 @@
"s_mask",
"alpha",
"edge",
+ "maskTexCoordScale",
+ "maskTexCoordOffset",
};
- int locations[4];
+ int locations[6];
getProgramUniformLocations(context, program, shaderUniforms, WTF_ARRAY_LENGTH(shaderUniforms), WTF_ARRAY_LENGTH(locations), locations, usingBindUniform, baseUniformIndex);
@@ -717,6 +728,8 @@
m_maskSamplerLocation = locations[1];
m_alphaLocation = locations[2];
m_edgeLocation = locations[3];
+ m_maskTexCoordScaleLocation = locations[4];
+ m_maskTexCoordOffsetLocation = locations[5];
ASSERT(m_samplerLocation != -1 && m_maskSamplerLocation != -1 && m_alphaLocation != -1 && m_edgeLocation != -1);
}
@@ -727,12 +740,15 @@
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform sampler2D s_mask;
+ uniform vec2 maskTexCoordScale;
+ uniform vec2 maskTexCoordOffset;
uniform float alpha;
uniform vec3 edge[8];
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
- vec4 maskColor = texture2D(s_mask, v_texCoord);
+ vec2 maskTexCoord = vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x, maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
+ vec4 maskColor = texture2D(s_mask, maskTexCoord);
vec3 pos = vec3(gl_FragCoord.xy, 1);
float a0 = clamp(dot(edge[0], pos), 0.0, 1.0);
float a1 = clamp(dot(edge[1], pos), 0.0, 1.0);
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.h (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.h 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/ShaderChromium.h 2012-08-14 00:33:47 UTC (rev 125474)
@@ -282,11 +282,15 @@
int alphaLocation() const { return m_alphaLocation; }
int samplerLocation() const { return m_samplerLocation; }
int maskSamplerLocation() const { return m_maskSamplerLocation; }
+ int maskTexCoordScaleLocation() const { return m_maskTexCoordScaleLocation; }
+ int maskTexCoordOffsetLocation() const { return m_maskTexCoordOffsetLocation; }
private:
int m_samplerLocation;
int m_maskSamplerLocation;
int m_alphaLocation;
+ int m_maskTexCoordScaleLocation;
+ int m_maskTexCoordOffsetLocation;
};
class FragmentShaderRGBATexAlphaMaskAA {
@@ -299,12 +303,16 @@
int samplerLocation() const { return m_samplerLocation; }
int maskSamplerLocation() const { return m_maskSamplerLocation; }
int edgeLocation() const { return m_edgeLocation; }
+ int maskTexCoordScaleLocation() const { return m_maskTexCoordScaleLocation; }
+ int maskTexCoordOffsetLocation() const { return m_maskTexCoordOffsetLocation; }
private:
int m_samplerLocation;
int m_maskSamplerLocation;
int m_alphaLocation;
int m_edgeLocation;
+ int m_maskTexCoordScaleLocation;
+ int m_maskTexCoordOffsetLocation;
};
class FragmentShaderYUVVideo {
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.cpp (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.cpp 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.cpp 2012-08-14 00:33:47 UTC (rev 125474)
@@ -29,17 +29,21 @@
namespace WebCore {
-PassOwnPtr<CCRenderPassDrawQuad> CCRenderPassDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, int renderPassId, bool isReplica, const CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame)
+PassOwnPtr<CCRenderPassDrawQuad> CCRenderPassDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, int renderPassId, bool isReplica, const CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame, float maskTexCoordScaleX, float maskTexCoordScaleY, float maskTexCoordOffsetX, float maskTexCoordOffsetY)
{
- return adoptPtr(new CCRenderPassDrawQuad(sharedQuadState, quadRect, renderPassId, isReplica, maskResourceId, contentsChangedSinceLastFrame));
+ return adoptPtr(new CCRenderPassDrawQuad(sharedQuadState, quadRect, renderPassId, isReplica, maskResourceId, contentsChangedSinceLastFrame, maskTexCoordScaleX, maskTexCoordScaleY, maskTexCoordOffsetX, maskTexCoordOffsetY));
}
-CCRenderPassDrawQuad::CCRenderPassDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame)
+CCRenderPassDrawQuad::CCRenderPassDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame, float maskTexCoordScaleX, float maskTexCoordScaleY, float maskTexCoordOffsetX, float maskTexCoordOffsetY)
: CCDrawQuad(sharedQuadState, CCDrawQuad::RenderPass, quadRect)
, m_renderPassId(renderPassId)
, m_isReplica(isReplica)
, m_maskResourceId(maskResourceId)
, m_contentsChangedSinceLastFrame(contentsChangedSinceLastFrame)
+ , m_maskTexCoordScaleX(maskTexCoordScaleX)
+ , m_maskTexCoordScaleY(maskTexCoordScaleY)
+ , m_maskTexCoordOffsetX(maskTexCoordOffsetX)
+ , m_maskTexCoordOffsetY(maskTexCoordOffsetY)
{
ASSERT(m_renderPassId > 0);
}
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.h (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.h 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassDrawQuad.h 2012-08-14 00:33:47 UTC (rev 125474)
@@ -38,7 +38,7 @@
class CCRenderPassDrawQuad : public CCDrawQuad {
WTF_MAKE_NONCOPYABLE(CCRenderPassDrawQuad);
public:
- static PassOwnPtr<CCRenderPassDrawQuad> create(const CCSharedQuadState*, const IntRect&, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame);
+ static PassOwnPtr<CCRenderPassDrawQuad> create(const CCSharedQuadState*, const IntRect&, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame, float maskTexCoordScaleX, float maskTexCoordScaleY, float maskTexCoordOffsetX, float maskTexCoordOffsetY);
int renderPassId() const { return m_renderPassId; }
bool isReplica() const { return m_isReplica; }
@@ -46,13 +46,22 @@
const IntRect& contentsChangedSinceLastFrame() const { return m_contentsChangedSinceLastFrame; }
static const CCRenderPassDrawQuad* materialCast(const CCDrawQuad*);
+ float maskTexCoordScaleX() const { return m_maskTexCoordScaleX; }
+ float maskTexCoordScaleY() const { return m_maskTexCoordScaleY; }
+ float maskTexCoordOffsetX() const { return m_maskTexCoordOffsetX; }
+ float maskTexCoordOffsetY() const { return m_maskTexCoordOffsetY; }
+
private:
- CCRenderPassDrawQuad(const CCSharedQuadState*, const IntRect&, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame);
+ CCRenderPassDrawQuad(const CCSharedQuadState*, const IntRect&, int renderPassId, bool isReplica, CCResourceProvider::ResourceId maskResourceId, const IntRect& contentsChangedSinceLastFrame, float maskTexCoordScaleX, float maskTexCoordScaleY, float maskTexCoordOffsetX, float maskTexCoordOffsetY);
int m_renderPassId;
bool m_isReplica;
CCResourceProvider::ResourceId m_maskResourceId;
IntRect m_contentsChangedSinceLastFrame;
+ float m_maskTexCoordScaleX;
+ float m_maskTexCoordScaleY;
+ float m_maskTexCoordOffsetX;
+ float m_maskTexCoordOffsetY;
};
}
Modified: branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp (125473 => 125474)
--- branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp 2012-08-14 00:33:47 UTC (rev 125474)
@@ -207,10 +207,22 @@
maskLayer = 0;
}
+ float maskTexCoordScaleX = 1;
+ float maskTexCoordScaleY = 1;
+ float maskTexCoordOffsetX = 1;
+ float maskTexCoordOffsetY = 1;
+ if (maskLayer) {
+ maskTexCoordScaleX = static_cast<float>(contentRect().width()) / maskLayer->contentBounds().width();
+ maskTexCoordScaleY = static_cast<float>(contentRect().height()) / maskLayer->contentBounds().height();
+ maskTexCoordOffsetX = static_cast<float>(contentRect().x()) / contentRect().width() * maskTexCoordScaleX;
+ maskTexCoordOffsetY = static_cast<float>(contentRect().y()) / contentRect().height() * maskTexCoordScaleY;
+ }
+
CCResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->contentsResourceId() : 0;
IntRect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect : IntRect();
- quadList.append(CCRenderPassDrawQuad::create(sharedQuadState, contentRect(), renderPassId, forReplica, maskResourceId, contentsChangedSinceLastFrame));
+ quadList.append(CCRenderPassDrawQuad::create(sharedQuadState, contentRect(), renderPassId, forReplica, maskResourceId, contentsChangedSinceLastFrame,
+ maskTexCoordScaleX, maskTexCoordScaleY, maskTexCoordOffsetX, maskTexCoordOffsetY));
}
}
Modified: branches/chromium/1229/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (125473 => 125474)
--- branches/chromium/1229/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp 2012-08-14 00:22:42 UTC (rev 125473)
+++ branches/chromium/1229/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp 2012-08-14 00:33:47 UTC (rev 125474)
@@ -3780,7 +3780,7 @@
IntRect quadRect = IntRect(0, 0, 1, 1);
IntRect contentsChangedRect = contentsChanged ? quadRect : IntRect();
- OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create(testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, contentsChangedRect);
+ OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create(testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, contentsChangedRect, 1, 1, 0, 0);
static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(quad.release());
}
}