Title: [119718] trunk/Source
Revision
119718
Author
[email protected]
Date
2012-06-07 07:00:41 -0700 (Thu, 07 Jun 2012)

Log Message

[BlackBerry] Allow WebPageCompositor to blend a transparent web page
https://bugs.webkit.org/show_bug.cgi?id=88233

Patch by Arvid Nilsson <[email protected]> on 2012-06-07
Reviewed by Rob Buis.

RIM PR #159998

Source/WebCore:

Add a parameter to LayerRenderer::compositeBuffer() indicating whether
the buffer contents are opaque, and set the GL blend mode accordingly.

This is not currently testable using BlackBerry testing infrastructure.

Reviewed internally by Jakob Petsovits.

* platform/graphics/blackberry/LayerRenderer.cpp:
(WebCore::LayerRenderer::compositeBuffer):
* platform/graphics/blackberry/LayerRenderer.h:
(LayerRenderer):

Source/WebKit/blackberry:

Keep track of the web page background color in the compositor so we can
determine whether the contents of the root layer are transparent.

Reviewed internally by Jakob Petsovits.

* Api/BackingStore.cpp:
(BlackBerry::WebKit::BackingStorePrivate::compositeContents):
* Api/BackingStore_p.h:
(BackingStorePrivate):
* Api/WebPage.cpp:
(BlackBerry::WebKit::WebPagePrivate::setCompositor):
(BlackBerry::WebKit::WebPagePrivate::setCompositorBackgroundColor):
(WebKit):
(BlackBerry::WebKit::WebPagePrivate::createCompositor):
(BlackBerry::WebKit::WebPagePrivate::didChangeSettings):
* Api/WebPageCompositor.cpp:
(BlackBerry::WebKit::WebPageCompositorPrivate::render):
(BlackBerry::WebKit::WebPageCompositorPrivate::setBackgroundColor):
(WebKit):
* Api/WebPageCompositor_p.h:
(BlackBerry::WebKit::WebPageCompositorPrivate::backgroundColor):
(WebPageCompositorPrivate):
* Api/WebPage_p.h:
(WebPagePrivate):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (119717 => 119718)


--- trunk/Source/WebCore/ChangeLog	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebCore/ChangeLog	2012-06-07 14:00:41 UTC (rev 119718)
@@ -1,3 +1,24 @@
+2012-06-07  Arvid Nilsson  <[email protected]>
+
+        [BlackBerry] Allow WebPageCompositor to blend a transparent web page
+        https://bugs.webkit.org/show_bug.cgi?id=88233
+
+        Reviewed by Rob Buis.
+
+        RIM PR #159998
+
+        Add a parameter to LayerRenderer::compositeBuffer() indicating whether
+        the buffer contents are opaque, and set the GL blend mode accordingly.
+
+        This is not currently testable using BlackBerry testing infrastructure.
+
+        Reviewed internally by Jakob Petsovits.
+
+        * platform/graphics/blackberry/LayerRenderer.cpp:
+        (WebCore::LayerRenderer::compositeBuffer):
+        * platform/graphics/blackberry/LayerRenderer.h:
+        (LayerRenderer):
+
 2012-06-07  Alexei Filippov  <[email protected]>
 
         Web Inspector: reuse edge_count field of heap snapshot to store retained size

Modified: trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp (119717 => 119718)


--- trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp	2012-06-07 14:00:41 UTC (rev 119718)
@@ -402,7 +402,7 @@
 
 static float texcoords[4 * 2] = { 0, 0,  0, 1,  1, 1,  1, 0 };
 
-void LayerRenderer::compositeBuffer(const TransformationMatrix& transform, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer* buffer, float opacity)
+void LayerRenderer::compositeBuffer(const TransformationMatrix& transform, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer* buffer, bool contentsOpaque, float opacity)
 {
     if (!buffer)
         return;
@@ -415,7 +415,8 @@
     if (!vertices.boundingBox().intersects(m_clipRect))
         return;
 
-    if (opacity < 1.0f) {
+    bool blending = !contentsOpaque || opacity < 1.0f;
+    if (blending) {
         glEnable(GL_BLEND);
         glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
     }
@@ -431,7 +432,7 @@
         BlackBerry::Platform::Graphics::releaseBufferGLTexture(buffer);
     }
 
-    if (opacity < 1.0f)
+    if (blending)
         glDisable(GL_BLEND);
 }
 

Modified: trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.h (119717 => 119718)


--- trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.h	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.h	2012-06-07 14:00:41 UTC (rev 119718)
@@ -106,7 +106,7 @@
     // 3. Prepares all the layers for compositing
     // transform is the model-view-project matrix that goes all the way from contents to normalized device coordinates.
     void compositeLayers(const TransformationMatrix&, LayerCompositingThread* rootLayer);
-    void compositeBuffer(const TransformationMatrix&, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer*, float opacity);
+    void compositeBuffer(const TransformationMatrix&, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer*, bool contentsOpaque, float opacity);
     void drawCheckerboardPattern(const TransformationMatrix&, const FloatRect& contents);
 
     // Keep track of layers that need cleanup when the LayerRenderer is destroyed

Modified: trunk/Source/WebKit/blackberry/Api/BackingStore.cpp (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/BackingStore.cpp	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/BackingStore.cpp	2012-06-07 14:00:41 UTC (rev 119718)
@@ -1637,7 +1637,7 @@
 }
 
 #if USE(ACCELERATED_COMPOSITING)
-void BackingStorePrivate::compositeContents(WebCore::LayerRenderer* layerRenderer, const WebCore::TransformationMatrix& transform, const WebCore::FloatRect& contents)
+void BackingStorePrivate::compositeContents(WebCore::LayerRenderer* layerRenderer, const WebCore::TransformationMatrix& transform, const WebCore::FloatRect& contents, bool contentsOpaque)
 {
     const Platform::IntRect transformedContentsRect = Platform::IntRect(Platform::IntPoint(0, 0), m_client->transformedContentsSize());
     Platform::IntRect transformedContents = enclosingIntRect(m_webPage->d->m_transformationMatrix->mapRect(contents));
@@ -1691,7 +1691,7 @@
         if (!committed)
             layerRenderer->drawCheckerboardPattern(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(dirtyRect)));
         else {
-            layerRenderer->compositeBuffer(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(wholeRect)), tileBuffer->nativeBuffer(), 1.0f);
+            layerRenderer->compositeBuffer(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(wholeRect)), tileBuffer->nativeBuffer(), contentsOpaque, 1.0f);
 
             // Intersect the rendered region.
             Platform::IntRectRegion notRenderedRegion = Platform::IntRectRegion::subtractRegions(dirtyTileRect, tileBuffer->renderedRegion());

Modified: trunk/Source/WebKit/blackberry/Api/BackingStore_p.h (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/BackingStore_p.h	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/BackingStore_p.h	2012-06-07 14:00:41 UTC (rev 119718)
@@ -202,7 +202,7 @@
     // Note that contents is expressed in untransformed content coordinates.
     // Preconditions: You have to call prepareFrame and setViewport on the LayerRenderer before
     //                calling this.
-    void compositeContents(WebCore::LayerRenderer*, const WebCore::TransformationMatrix&, const WebCore::FloatRect& contents);
+    void compositeContents(WebCore::LayerRenderer*, const WebCore::TransformationMatrix&, const WebCore::FloatRect& contents, bool contentsOpaque);
 
     void blendCompositingSurface(const Platform::IntRect& dstRect);
     void clearCompositingSurface();

Modified: trunk/Source/WebKit/blackberry/Api/WebPage.cpp (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/WebPage.cpp	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/WebPage.cpp	2012-06-07 14:00:41 UTC (rev 119718)
@@ -5731,14 +5731,23 @@
     }
 
     m_compositor = compositor;
-    if (m_compositor)
+    if (m_compositor) {
         m_compositor->setPage(this);
 
+        m_compositor->setBackgroundColor(m_webSettings->backgroundColor());
+    }
+
     // The previous compositor, if any, has now released it's OpenGL resources,
     // so we can safely free the owned context, if any.
     m_ownedContext.clear();
 }
 
+void WebPagePrivate::setCompositorBackgroundColor(const Color& backgroundColor)
+{
+    if (m_compositor)
+        m_compositor->setBackgroundColor(backgroundColor);
+}
+
 void WebPagePrivate::commitRootLayer(const IntRect& layoutRectForCompositing,
                                      const IntSize& contentsSizeForCompositing,
                                      bool drawsRootLayer)
@@ -5972,6 +5981,10 @@
     m_compositor = WebPageCompositorPrivate::create(this, 0);
     m_compositor->setContext(m_ownedContext.get());
 
+    // The compositor is created in a sync message, so there's no risk of race condition on the
+    // WebSettings.
+    m_compositor->setBackgroundColor(m_webSettings->backgroundColor());
+
     return true;
 }
 
@@ -6270,6 +6283,9 @@
     if (m_mainFrame && m_mainFrame->view()) {
         Color backgroundColor(webSettings->backgroundColor());
         m_mainFrame->view()->updateBackgroundRecursively(backgroundColor, backgroundColor.hasAlpha());
+
+        Platform::userInterfaceThreadMessageClient()->dispatchMessage(
+            createMethodCallMessage(&WebPagePrivate::setCompositorBackgroundColor, this, backgroundColor));
     }
 }
 

Modified: trunk/Source/WebKit/blackberry/Api/WebPageCompositor.cpp (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/WebPageCompositor.cpp	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/WebPageCompositor.cpp	2012-06-07 14:00:41 UTC (rev 119718)
@@ -129,7 +129,7 @@
     transform *= *m_webPage->m_transformationMatrix;
 
     if (!drawsRootLayer())
-        m_webPage->m_backingStore->d->compositeContents(m_layerRenderer.get(), transform, contents);
+        m_webPage->m_backingStore->d->compositeContents(m_layerRenderer.get(), transform, contents, !m_backgroundColor.hasAlpha());
 
     compositeLayers(transform);
 }
@@ -192,6 +192,11 @@
     return true;
 }
 
+void WebPageCompositorPrivate::setBackgroundColor(const Color& color)
+{
+    m_backgroundColor = color;
+}
+
 void WebPageCompositorPrivate::releaseLayerResources()
 {
     if (m_layerRenderer)

Modified: trunk/Source/WebKit/blackberry/Api/WebPageCompositor_p.h (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/WebPageCompositor_p.h	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/WebPageCompositor_p.h	2012-06-07 14:00:41 UTC (rev 119718)
@@ -84,6 +84,9 @@
     WebCore::LayerRenderingResults lastCompositingResults() const { return m_lastCompositingResults; }
     void setLastCompositingResults(const WebCore::LayerRenderingResults& results) { m_lastCompositingResults = results; }
 
+    WebCore::Color backgroundColor() const { return m_backgroundColor; }
+    void setBackgroundColor(const WebCore::Color&);
+
     void releaseLayerResources();
 
     WebPagePrivate* page() const { return m_webPage; }
@@ -111,6 +114,7 @@
     WebCore::IntRect m_layoutRectForCompositing;
     WebCore::IntSize m_contentsSizeForCompositing;
     WebCore::LayerRenderingResults m_lastCompositingResults;
+    WebCore::Color m_backgroundColor;
     bool m_drawsRootLayer;
 };
 

Modified: trunk/Source/WebKit/blackberry/Api/WebPage_p.h (119717 => 119718)


--- trunk/Source/WebKit/blackberry/Api/WebPage_p.h	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/Api/WebPage_p.h	2012-06-07 14:00:41 UTC (rev 119718)
@@ -396,6 +396,7 @@
     bool isAcceleratedCompositingActive() const { return m_compositor; }
     WebPageCompositorPrivate* compositor() const { return m_compositor.get(); }
     void setCompositor(PassRefPtr<WebPageCompositorPrivate>, EGLContext compositingContext);
+    void setCompositorBackgroundColor(const WebCore::Color&);
     bool createCompositor();
     void destroyCompositor();
     void syncDestroyCompositorOnCompositingThread();

Modified: trunk/Source/WebKit/blackberry/ChangeLog (119717 => 119718)


--- trunk/Source/WebKit/blackberry/ChangeLog	2012-06-07 13:45:02 UTC (rev 119717)
+++ trunk/Source/WebKit/blackberry/ChangeLog	2012-06-07 14:00:41 UTC (rev 119718)
@@ -1,3 +1,37 @@
+2012-06-07  Arvid Nilsson  <[email protected]>
+
+        [BlackBerry] Allow WebPageCompositor to blend a transparent web page
+        https://bugs.webkit.org/show_bug.cgi?id=88233
+
+        Reviewed by Rob Buis.
+
+        RIM PR #159998
+
+        Keep track of the web page background color in the compositor so we can
+        determine whether the contents of the root layer are transparent.
+
+        Reviewed internally by Jakob Petsovits.
+
+        * Api/BackingStore.cpp:
+        (BlackBerry::WebKit::BackingStorePrivate::compositeContents):
+        * Api/BackingStore_p.h:
+        (BackingStorePrivate):
+        * Api/WebPage.cpp:
+        (BlackBerry::WebKit::WebPagePrivate::setCompositor):
+        (BlackBerry::WebKit::WebPagePrivate::setCompositorBackgroundColor):
+        (WebKit):
+        (BlackBerry::WebKit::WebPagePrivate::createCompositor):
+        (BlackBerry::WebKit::WebPagePrivate::didChangeSettings):
+        * Api/WebPageCompositor.cpp:
+        (BlackBerry::WebKit::WebPageCompositorPrivate::render):
+        (BlackBerry::WebKit::WebPageCompositorPrivate::setBackgroundColor):
+        (WebKit):
+        * Api/WebPageCompositor_p.h:
+        (BlackBerry::WebKit::WebPageCompositorPrivate::backgroundColor):
+        (WebPageCompositorPrivate):
+        * Api/WebPage_p.h:
+        (WebPagePrivate):
+
 2012-06-07  Jonathan Dong  <[email protected]>
 
         [BlackBerry] Add enable credential autofill and enable form autofill feature control in WebSetting
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to