Diff
Modified: trunk/Source/WebCore/ChangeLog (105469 => 105470)
--- trunk/Source/WebCore/ChangeLog 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/ChangeLog 2012-01-20 02:21:07 UTC (rev 105470)
@@ -1,3 +1,32 @@
+2012-01-19 Alexandre Elias <[email protected]>
+
+ [chromium] Draw gutter quads outside root content layer
+ https://bugs.webkit.org/show_bug.cgi?id=76328
+
+ Reviewed by James Robinson.
+
+ Add new layer property "backgroundCoversViewport". If the content
+ layers don't fully cover the render surface, this code calculates the
+ difference between the root clip rect and the root content layer and
+ draws up to four background-color quads in exactly the area that would
+ be undrawn.
+
+ Test: CCTiledLayerImplTest::backgroundCoversViewport
+
+ * platform/graphics/chromium/LayerChromium.cpp:
+ (WebCore::LayerChromium::LayerChromium):
+ (WebCore::LayerChromium::setBackgroundCoversViewport):
+ (WebCore::LayerChromium::pushPropertiesTo):
+ * platform/graphics/chromium/LayerChromium.h:
+ (WebCore::LayerChromium::backgroundCoversViewport):
+ * platform/graphics/chromium/cc/CCLayerImpl.cpp:
+ (WebCore::CCLayerImpl::CCLayerImpl):
+ (WebCore::CCLayerImpl::setBackgroundCoversViewport):
+ * platform/graphics/chromium/cc/CCLayerImpl.h:
+ (WebCore::CCLayerImpl::backgroundCoversViewport):
+ * platform/graphics/chromium/cc/CCTiledLayerImpl.cpp:
+ (WebCore::CCTiledLayerImpl::appendQuads):
+
2012-01-19 Cary Clark <[email protected]>
[Skia Mac] Match style of platform error underline for misspellings
Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.cpp (105469 => 105470)
--- trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -61,6 +61,7 @@
, m_scrollable(false)
, m_anchorPoint(0.5, 0.5)
, m_backgroundColor(0, 0, 0, 0)
+ , m_backgroundCoversViewport(false)
, m_debugBorderWidth(0)
, m_opacity(1.0)
, m_anchorPointZ(0)
@@ -284,6 +285,14 @@
setNeedsCommit();
}
+void LayerChromium::setBackgroundCoversViewport(bool backgroundCoversViewport)
+{
+ if (m_backgroundCoversViewport == backgroundCoversViewport)
+ return;
+ m_backgroundCoversViewport = backgroundCoversViewport;
+ setNeedsCommit();
+}
+
void LayerChromium::setMasksToBounds(bool masksToBounds)
{
if (m_masksToBounds == masksToBounds)
@@ -415,6 +424,7 @@
layer->setAnchorPoint(m_anchorPoint);
layer->setAnchorPointZ(m_anchorPointZ);
layer->setBackgroundColor(m_backgroundColor);
+ layer->setBackgroundCoversViewport(m_backgroundCoversViewport);
layer->setBounds(m_bounds);
layer->setContentBounds(contentBounds());
layer->setDebugBorderColor(m_debugBorderColor);
Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h (105469 => 105470)
--- trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h 2012-01-20 02:21:07 UTC (rev 105470)
@@ -84,6 +84,9 @@
void setBackgroundColor(const Color&);
Color backgroundColor() const { return m_backgroundColor; }
+ void setBackgroundCoversViewport(bool);
+ bool backgroundCoversViewport() const { return m_backgroundCoversViewport; }
+
void setBounds(const IntSize&);
const IntSize& bounds() const { return m_bounds; }
virtual IntSize contentBounds() const { return bounds(); }
@@ -249,6 +252,7 @@
FloatPoint m_position;
FloatPoint m_anchorPoint;
Color m_backgroundColor;
+ bool m_backgroundCoversViewport;
Color m_debugBorderColor;
float m_debugBorderWidth;
float m_opacity;
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp (105469 => 105470)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -34,6 +34,7 @@
#include "LayerRendererChromium.h"
#include "cc/CCDebugBorderDrawQuad.h"
#include "cc/CCLayerSorter.h"
+#include "cc/CCSolidColorDrawQuad.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
@@ -44,6 +45,7 @@
, m_anchorPoint(0.5, 0.5)
, m_anchorPointZ(0)
, m_scrollable(false)
+ , m_backgroundCoversViewport(false)
, m_doubleSided(true)
, m_layerPropertyChanged(false)
, m_masksToBounds(false)
@@ -128,8 +130,41 @@
void CCLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
{
+ appendGutterQuads(quadList, sharedQuadState);
}
+void CCLayerImpl::appendGutterQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
+{
+ if (!backgroundCoversViewport() || !backgroundColor().isValid())
+ return;
+
+ const IntRect& layerRect = visibleLayerRect();
+ IntRect clip = screenSpaceTransform().inverse().mapRect(clipRect());
+
+ if (layerRect.isEmpty()) {
+ quadList.append(CCSolidColorDrawQuad::create(sharedQuadState, clip, backgroundColor()));
+ return;
+ }
+
+ IntRect gutterRects[4];
+ for (int i = 0; i < 4; i++)
+ gutterRects[i] = clip;
+ gutterRects[0].shiftMaxYEdgeTo(layerRect.y());
+ gutterRects[1].shiftYEdgeTo(layerRect.maxY());
+ gutterRects[2].shiftMaxXEdgeTo(layerRect.x());
+ gutterRects[3].shiftXEdgeTo(layerRect.maxX());
+
+ gutterRects[2].shiftYEdgeTo(layerRect.y());
+ gutterRects[3].shiftYEdgeTo(layerRect.y());
+ gutterRects[2].shiftMaxYEdgeTo(layerRect.maxY());
+ gutterRects[3].shiftMaxYEdgeTo(layerRect.maxY());
+
+ for (int i = 0; i < 4; i++) {
+ if (!gutterRects[i].isEmpty())
+ quadList.append(CCSolidColorDrawQuad::create(sharedQuadState, gutterRects[i], backgroundColor()));
+ }
+}
+
void CCLayerImpl::appendDebugBorderQuad(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState) const
{
if (!hasDebugBorders())
@@ -339,6 +374,15 @@
m_layerPropertyChanged = true;
}
+void CCLayerImpl::setBackgroundCoversViewport(bool backgroundCoversViewport)
+{
+ if (m_backgroundCoversViewport == backgroundCoversViewport)
+ return;
+
+ m_backgroundCoversViewport = backgroundCoversViewport;
+ m_layerPropertyChanged = true;
+}
+
void CCLayerImpl::setMasksToBounds(bool masksToBounds)
{
if (m_masksToBounds == masksToBounds)
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h (105469 => 105470)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h 2012-01-20 02:21:07 UTC (rev 105470)
@@ -97,6 +97,9 @@
void setBackgroundColor(const Color&);
Color backgroundColor() const { return m_backgroundColor; }
+ void setBackgroundCoversViewport(bool);
+ bool backgroundCoversViewport() const { return m_backgroundCoversViewport; }
+
void setMasksToBounds(bool);
bool masksToBounds() const { return m_masksToBounds; }
@@ -204,6 +207,8 @@
// Transformation used to transform quads provided in appendQuads.
virtual TransformationMatrix quadTransform() const;
+ void appendGutterQuads(CCQuadList&, const CCSharedQuadState*);
+
private:
void setParent(CCLayerImpl* parent) { m_parent = parent; }
friend class TreeSynchronizer;
@@ -233,6 +238,7 @@
IntPoint m_scrollPosition;
bool m_scrollable;
Color m_backgroundColor;
+ bool m_backgroundCoversViewport;
// Whether the "back" of this layer should draw.
bool m_doubleSided;
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCTiledLayerImpl.cpp (105469 => 105470)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCTiledLayerImpl.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCTiledLayerImpl.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -122,9 +122,14 @@
{
const IntRect& layerRect = visibleLayerRect();
- if (m_skipsDraw || !m_tiler || m_tiler->isEmpty() || layerRect.isEmpty())
+ if (m_skipsDraw)
return;
+ appendGutterQuads(quadList, sharedQuadState);
+
+ if (!m_tiler || m_tiler->isEmpty() || layerRect.isEmpty())
+ return;
+
int left, top, right, bottom;
m_tiler->layerRectToTileIndices(layerRect, left, top, right, bottom);
for (int j = top; j <= bottom; ++j) {
Modified: trunk/Source/WebKit/chromium/ChangeLog (105469 => 105470)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-01-20 02:21:07 UTC (rev 105470)
@@ -1,3 +1,26 @@
+2012-01-19 Alexandre Elias <[email protected]>
+
+ [chromium] Draw gutter quads outside root content layer
+ https://bugs.webkit.org/show_bug.cgi?id=76328
+
+ Reviewed by James Robinson.
+
+ Add new layer property "backgroundCoversViewport". If the content
+ layers don't fully cover the render surface, this code calculates the
+ difference between the root clip rect and the root content layer and
+ draws up to four background-color quads in exactly the area that would
+ be undrawn.
+
+ Test: CCTiledLayerImplTest::backgroundCoversViewport
+
+ * src/NonCompositedContentHost.cpp:
+ (WebKit::NonCompositedContentHost::NonCompositedContentHost):
+ * tests/CCLayerImplTest.cpp:
+ (WebCore::TEST):
+ * tests/CCTiledLayerImplTest.cpp:
+ (WebCore::TEST):
+ * tests/LayerChromiumTest.cpp:
+
2012-01-19 Greg Billock <[email protected]>
Web Intents chromium API modifications to track IntentRequest invocation method
Modified: trunk/Source/WebKit/chromium/src/NonCompositedContentHost.cpp (105469 => 105470)
--- trunk/Source/WebKit/chromium/src/NonCompositedContentHost.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebKit/chromium/src/NonCompositedContentHost.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -45,6 +45,7 @@
#endif
m_graphicsLayer->setDrawsContent(true);
m_graphicsLayer->platformLayer()->setIsNonCompositedContent(true);
+ m_graphicsLayer->platformLayer()->setBackgroundCoversViewport(true);
m_graphicsLayer->platformLayer()->setOpaque(true);
}
Modified: trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp (105469 => 105470)
--- trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -112,6 +112,7 @@
EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->setDebugBorderWidth(arbitraryNumber));
EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->setDrawsContent(true));
EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->setBackgroundColor(Color::gray));
+ EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->setBackgroundCoversViewport(true));
// Special case: check that sublayer transform changes all layer's descendants, but not the layer itself.
root->resetAllChangeTrackingForSubtree();
Modified: trunk/Source/WebKit/chromium/tests/CCTiledLayerImplTest.cpp (105469 => 105470)
--- trunk/Source/WebKit/chromium/tests/CCTiledLayerImplTest.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebKit/chromium/tests/CCTiledLayerImplTest.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -252,5 +252,73 @@
}
}
+TEST(CCTiledLayerImplTest, backgroundCoversViewport)
+{
+ DebugScopedSetImplThread scopedImplThread;
+ const IntSize tileSize(10, 10);
+ const int numTilesX = 2;
+ const int numTilesY = 2;
+ const unsigned numTiles = numTilesX * numTilesY;
+ const IntSize layerSize(tileSize.width() * numTilesX, tileSize.height() * numTilesY);
+ RefPtr<CCTiledLayerImpl> layer = createLayer(tileSize, layerSize, CCLayerTilingData::NoBorderTexels);
+ layer->setBackgroundColor(Color::gray);
+ layer->setBackgroundCoversViewport(true);
+
+ // No gutter rects
+ {
+ IntRect clipRect = IntRect(IntPoint(), layerSize);
+ layer->setClipRect(clipRect);
+ layer->setVisibleLayerRect(IntRect(IntPoint(), layerSize));
+
+ OwnPtr<CCSharedQuadState> sharedQuadState = layer->createSharedQuadState();
+
+ CCQuadList quads;
+ layer->appendQuads(quads, sharedQuadState.get());
+ EXPECT_EQ(quads.size(), numTiles);
+
+ for (size_t i = 0; i < quads.size(); ++i)
+ EXPECT_EQ(quads[i]->material(), CCDrawQuad::TiledContent);
+ }
+
+ // Empty visible content area (fullscreen gutter rect)
+ {
+ IntRect clipRect = IntRect(100, 100, 100, 100);
+ layer->setClipRect(clipRect);
+ layer->setVisibleLayerRect(IntRect());
+
+ OwnPtr<CCSharedQuadState> sharedQuadState = layer->createSharedQuadState();
+ CCQuadList quads;
+ layer->appendQuads(quads, sharedQuadState.get());
+
+ for (size_t i = 0; i < quads.size(); ++i)
+ EXPECT_EQ(quads[i]->material(), CCDrawQuad::SolidColor);
+
+ verifyQuadsExactlyCoverRect(quads, clipRect);
+ }
+
+ // Content area in middle of clip rect (four surrounding gutter rects)
+ {
+ IntRect clipRect = IntRect(-50, -50, 100, 100);
+ layer->setClipRect(clipRect);
+ layer->setVisibleLayerRect(IntRect(IntPoint(), layerSize));
+
+ OwnPtr<CCSharedQuadState> sharedQuadState = layer->createSharedQuadState();
+ CCQuadList quads;
+ layer->appendQuads(quads, sharedQuadState.get());
+
+ unsigned numContentTiles = 0, numGutterTiles = 0;
+ for (size_t i = 0; i < quads.size(); ++i) {
+ if (quads[i]->material() == CCDrawQuad::TiledContent)
+ numContentTiles++;
+ else if (quads[i]->material() == CCDrawQuad::SolidColor)
+ numGutterTiles++;
+ }
+ EXPECT_EQ(numContentTiles, numTiles);
+ EXPECT_GE(numGutterTiles, 4u);
+
+ verifyQuadsExactlyCoverRect(quads, clipRect);
+ }
+}
+
} // namespace
Modified: trunk/Source/WebKit/chromium/tests/LayerChromiumTest.cpp (105469 => 105470)
--- trunk/Source/WebKit/chromium/tests/LayerChromiumTest.cpp 2012-01-20 02:03:48 UTC (rev 105469)
+++ trunk/Source/WebKit/chromium/tests/LayerChromiumTest.cpp 2012-01-20 02:21:07 UTC (rev 105470)
@@ -519,6 +519,7 @@
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setAnchorPoint(FloatPoint(1.23f, 4.56f)));
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setAnchorPointZ(0.7f));
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setBackgroundColor(Color(0.4f, 0.4f, 0.4f)));
+ EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setBackgroundCoversViewport(true));
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setMasksToBounds(true));
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setMaskLayer(dummyLayer.get()));
EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setOpacity(0.5f));