#include "LayerRendererChromium.h"
#include "cc/CCLayerImpl.h"
#include "cc/CCSingleThreadProxy.h"
-#include "cc/CCSolidColorDrawQuad.h"
+#include "cc/CCTileDrawQuad.h"
#include <gtest/gtest.h>
using namespace WebCore;
{
m_quadsAppended = true;
- Color color = m_opaqueColor ? Color::white : Color(0, 0, 0, 0);
- OwnPtr<CCDrawQuad> testBlendingDrawQuad = CCSolidColorDrawQuad::create(sharedQuadState, IntRect(5, 5, 5, 5), color);
+ IntRect opaqueRect;
+ if (opaque() || m_opaqueContents)
+ opaqueRect = m_quadRect;
+ else
+ opaqueRect = m_opaqueContentRect;
+ OwnPtr<CCDrawQuad> testBlendingDrawQuad = CCTileDrawQuad::create(sharedQuadState, m_quadRect, opaqueRect, 0, IntPoint(), IntSize(1, 1), 0, false, false, false, false, false);
+ testBlendingDrawQuad->setQuadVisibleRect(m_quadVisibleRect);
EXPECT_EQ(m_blend, testBlendingDrawQuad->needsBlending());
EXPECT_EQ(m_hasRenderSurface, !!renderSurface());
}
bool quadsAppended() const { return m_quadsAppended; }
- void setOpaqueColor(bool opaqueColor) { m_opaqueColor = opaqueColor; }
+ void setQuadRect(const IntRect& rect) { m_quadRect = rect; }
+ void setQuadVisibleRect(const IntRect& rect) { m_quadVisibleRect = rect; }
+ void setOpaqueContents(bool opaque) { m_opaqueContents = opaque; }
+ void setOpaqueContentRect(const IntRect& rect) { m_opaqueContentRect = rect; }
private:
explicit BlendStateCheckLayer(int id)
, m_blend(false)
, m_hasRenderSurface(false)
, m_quadsAppended(false)
- , m_opaqueColor(true)
+ , m_opaqueContents(false)
+ , m_quadRect(5, 5, 5, 5)
+ , m_quadVisibleRect(5, 5, 5, 5)
{
setAnchorPoint(FloatPoint(0, 0));
setBounds(IntSize(10, 10));
bool m_blend;
bool m_hasRenderSurface;
bool m_quadsAppended;
- bool m_opaqueColor;
+ bool m_opaqueContents;
+ IntRect m_quadRect;
+ IntRect m_opaqueContentRect;
+ IntRect m_quadVisibleRect;
};
// https://bugs.webkit.org/show_bug.cgi?id=75783
// Opaque layer, drawn without blending.
layer1->setOpaque(true);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setExpectation(false, false);
m_hostImpl->drawLayers();
EXPECT_TRUE(layer1->quadsAppended());
- // Layer with translucent content, but solid color is opaque, so drawn without blending.
+ // Layer with translucent content, but opaque content, so drawn without blending.
layer1->setOpaque(false);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setExpectation(false, false);
m_hostImpl->drawLayers();
EXPECT_TRUE(layer1->quadsAppended());
// Layer with translucent content and painting, so drawn with blending.
layer1->setOpaque(false);
- layer1->setOpaqueColor(false);
+ layer1->setOpaqueContents(false);
layer1->setExpectation(true, false);
m_hostImpl->drawLayers();
EXPECT_TRUE(layer1->quadsAppended());
// Layer with translucent opacity, drawn with blending.
layer1->setOpaque(true);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setOpacity(0.5);
layer1->setExpectation(true, false);
m_hostImpl->drawLayers();
// Layer with translucent opacity and painting, drawn with blending.
layer1->setOpaque(true);
- layer1->setOpaqueColor(false);
+ layer1->setOpaqueContents(false);
layer1->setOpacity(0.5);
layer1->setExpectation(true, false);
m_hostImpl->drawLayers();
// 2 opaque layers, drawn without blending.
layer1->setOpaque(true);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setOpacity(1);
layer1->setExpectation(false, false);
layer2->setOpaque(true);
- layer2->setOpaqueColor(true);
+ layer2->setOpaqueContents(true);
layer2->setOpacity(1);
layer2->setExpectation(false, false);
m_hostImpl->drawLayers();
// Parent layer with translucent content, drawn with blending.
// Child layer with opaque content, drawn without blending.
layer1->setOpaque(false);
- layer1->setOpaqueColor(false);
+ layer1->setOpaqueContents(false);
layer1->setExpectation(true, false);
layer2->setExpectation(false, false);
m_hostImpl->drawLayers();
// Parent layer with translucent content but opaque painting, drawn without blending.
// Child layer with opaque content, drawn without blending.
layer1->setOpaque(false);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setExpectation(false, false);
layer2->setExpectation(false, false);
m_hostImpl->drawLayers();
// Child layer with opaque content, drawn without blending (parent surface
// carries the inherited opacity).
layer1->setOpaque(true);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setOpacity(0.5);
layer1->setExpectation(false, true);
layer2->setExpectation(false, false);
// Draw again, but with child non-opaque, to make sure
// layer1 not culled.
layer1->setOpaque(true);
- layer1->setOpaqueColor(true);
+ layer1->setOpaqueContents(true);
layer1->setOpacity(1);
layer1->setExpectation(false, false);
layer2->setOpaque(true);
- layer2->setOpaqueColor(true);
+ layer2->setOpaqueContents(true);
layer2->setOpacity(0.5);
layer2->setExpectation(true, false);
m_hostImpl->drawLayers();
layer1->setOpacity(1);
layer1->setExpectation(false, false);
layer2->setOpaque(false);
- layer2->setOpaqueColor(false);
+ layer2->setOpaqueContents(false);
layer2->setOpacity(1);
layer2->setExpectation(true, false);
m_hostImpl->drawLayers();
layer1->setOpacity(1);
layer1->setExpectation(false, false);
layer2->setOpaque(false);
- layer2->setOpaqueColor(true);
+ layer2->setOpaqueContents(true);
layer2->setOpacity(1);
layer2->setExpectation(false, false);
m_hostImpl->drawLayers();
EXPECT_TRUE(layer1->quadsAppended());
EXPECT_TRUE(layer2->quadsAppended());
+
+ // Layer with partially opaque contents, drawn with blending.
+ layer1->setOpaque(false);
+ layer1->setQuadRect(IntRect(5, 5, 5, 5));
+ layer1->setQuadVisibleRect(IntRect(5, 5, 5, 5));
+ layer1->setOpaqueContents(false);
+ layer1->setOpaqueContentRect(IntRect(5, 5, 2, 5));
+ layer1->setExpectation(true, false);
+ m_hostImpl->drawLayers();
+ EXPECT_TRUE(layer1->quadsAppended());
+
+ // Layer with partially opaque contents partially culled, drawn with blending.
+ layer1->setOpaque(false);
+ layer1->setQuadRect(IntRect(5, 5, 5, 5));
+ layer1->setQuadVisibleRect(IntRect(5, 5, 5, 2));
+ layer1->setOpaqueContents(false);
+ layer1->setOpaqueContentRect(IntRect(5, 5, 2, 5));
+ layer1->setExpectation(true, false);
+ m_hostImpl->drawLayers();
+ EXPECT_TRUE(layer1->quadsAppended());
+
+ // Layer with partially opaque contents culled, drawn with blending.
+ layer1->setOpaque(false);
+ layer1->setQuadRect(IntRect(5, 5, 5, 5));
+ layer1->setQuadVisibleRect(IntRect(7, 5, 3, 5));
+ layer1->setOpaqueContents(false);
+ layer1->setOpaqueContentRect(IntRect(5, 5, 2, 5));
+ layer1->setExpectation(true, false);
+ m_hostImpl->drawLayers();
+ EXPECT_TRUE(layer1->quadsAppended());
+
+ // Layer with partially opaque contents and translucent contents culled, drawn without blending.
+ layer1->setOpaque(false);
+ layer1->setQuadRect(IntRect(5, 5, 5, 5));
+ layer1->setQuadVisibleRect(IntRect(5, 5, 2, 5));
+ layer1->setOpaqueContents(false);
+ layer1->setOpaqueContentRect(IntRect(5, 5, 2, 5));
+ layer1->setExpectation(false, false);
+ m_hostImpl->drawLayers();
+ EXPECT_TRUE(layer1->quadsAppended());
+
}
class ReshapeTrackerContext: public FakeWebGraphicsContext3D {