Title: [105470] trunk/Source
Revision
105470
Author
[email protected]
Date
2012-01-19 18:21:07 -0800 (Thu, 19 Jan 2012)

Log Message

[chromium] Draw gutter quads outside root content layer
https://bugs.webkit.org/show_bug.cgi?id=76328

Patch by Alexandre Elias <[email protected]> on 2012-01-19
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

Source/WebCore:

* 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):

Source/WebKit/chromium:

* src/NonCompositedContentHost.cpp:
(WebKit::NonCompositedContentHost::NonCompositedContentHost):
* tests/CCLayerImplTest.cpp:
(WebCore::TEST):
* tests/CCTiledLayerImplTest.cpp:
(WebCore::TEST):
* tests/LayerChromiumTest.cpp:

Modified Paths

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));
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to