Changeset 119718 in webkit


Ignore:
Timestamp:
Jun 7, 2012 7:00:41 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

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

Patch by Arvid Nilsson <anilsson@rim.com> 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):

Location:
trunk/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r119714 r119718  
     12012-06-07  Arvid Nilsson  <anilsson@rim.com>
     2
     3        [BlackBerry] Allow WebPageCompositor to blend a transparent web page
     4        https://bugs.webkit.org/show_bug.cgi?id=88233
     5
     6        Reviewed by Rob Buis.
     7
     8        RIM PR #159998
     9
     10        Add a parameter to LayerRenderer::compositeBuffer() indicating whether
     11        the buffer contents are opaque, and set the GL blend mode accordingly.
     12
     13        This is not currently testable using BlackBerry testing infrastructure.
     14
     15        Reviewed internally by Jakob Petsovits.
     16
     17        * platform/graphics/blackberry/LayerRenderer.cpp:
     18        (WebCore::LayerRenderer::compositeBuffer):
     19        * platform/graphics/blackberry/LayerRenderer.h:
     20        (LayerRenderer):
     21
    1222012-06-07  Alexei Filippov  <alexeif@chromium.org>
    223
  • trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp

    r118710 r119718  
    403403static float texcoords[4 * 2] = { 0, 0,  0, 1,  1, 1,  1, 0 };
    404404
    405 void LayerRenderer::compositeBuffer(const TransformationMatrix& transform, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer* buffer, float opacity)
     405void LayerRenderer::compositeBuffer(const TransformationMatrix& transform, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer* buffer, bool contentsOpaque, float opacity)
    406406{
    407407    if (!buffer)
     
    416416        return;
    417417
    418     if (opacity < 1.0f) {
     418    bool blending = !contentsOpaque || opacity < 1.0f;
     419    if (blending) {
    419420        glEnable(GL_BLEND);
    420421        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
     
    432433    }
    433434
    434     if (opacity < 1.0f)
     435    if (blending)
    435436        glDisable(GL_BLEND);
    436437}
  • trunk/Source/WebCore/platform/graphics/blackberry/LayerRenderer.h

    r118710 r119718  
    107107    // transform is the model-view-project matrix that goes all the way from contents to normalized device coordinates.
    108108    void compositeLayers(const TransformationMatrix&, LayerCompositingThread* rootLayer);
    109     void compositeBuffer(const TransformationMatrix&, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer*, float opacity);
     109    void compositeBuffer(const TransformationMatrix&, const FloatRect& contents, BlackBerry::Platform::Graphics::Buffer*, bool contentsOpaque, float opacity);
    110110    void drawCheckerboardPattern(const TransformationMatrix&, const FloatRect& contents);
    111111
  • trunk/Source/WebKit/blackberry/Api/BackingStore.cpp

    r119496 r119718  
    16381638
    16391639#if USE(ACCELERATED_COMPOSITING)
    1640 void BackingStorePrivate::compositeContents(WebCore::LayerRenderer* layerRenderer, const WebCore::TransformationMatrix& transform, const WebCore::FloatRect& contents)
     1640void BackingStorePrivate::compositeContents(WebCore::LayerRenderer* layerRenderer, const WebCore::TransformationMatrix& transform, const WebCore::FloatRect& contents, bool contentsOpaque)
    16411641{
    16421642    const Platform::IntRect transformedContentsRect = Platform::IntRect(Platform::IntPoint(0, 0), m_client->transformedContentsSize());
     
    16921692            layerRenderer->drawCheckerboardPattern(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(dirtyRect)));
    16931693        else {
    1694             layerRenderer->compositeBuffer(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(wholeRect)), tileBuffer->nativeBuffer(), 1.0f);
     1694            layerRenderer->compositeBuffer(transform, m_webPage->d->mapFromTransformedFloatRect(Platform::FloatRect(wholeRect)), tileBuffer->nativeBuffer(), contentsOpaque, 1.0f);
    16951695
    16961696            // Intersect the rendered region.
  • trunk/Source/WebKit/blackberry/Api/BackingStore_p.h

    r118696 r119718  
    203203    // Preconditions: You have to call prepareFrame and setViewport on the LayerRenderer before
    204204    //                calling this.
    205     void compositeContents(WebCore::LayerRenderer*, const WebCore::TransformationMatrix&, const WebCore::FloatRect& contents);
     205    void compositeContents(WebCore::LayerRenderer*, const WebCore::TransformationMatrix&, const WebCore::FloatRect& contents, bool contentsOpaque);
    206206
    207207    void blendCompositingSurface(const Platform::IntRect& dstRect);
  • trunk/Source/WebKit/blackberry/Api/WebPage.cpp

    r119713 r119718  
    57325732
    57335733    m_compositor = compositor;
    5734     if (m_compositor)
     5734    if (m_compositor) {
    57355735        m_compositor->setPage(this);
     5736
     5737        m_compositor->setBackgroundColor(m_webSettings->backgroundColor());
     5738    }
    57365739
    57375740    // The previous compositor, if any, has now released it's OpenGL resources,
    57385741    // so we can safely free the owned context, if any.
    57395742    m_ownedContext.clear();
     5743}
     5744
     5745void WebPagePrivate::setCompositorBackgroundColor(const Color& backgroundColor)
     5746{
     5747    if (m_compositor)
     5748        m_compositor->setBackgroundColor(backgroundColor);
    57405749}
    57415750
     
    59725981    m_compositor = WebPageCompositorPrivate::create(this, 0);
    59735982    m_compositor->setContext(m_ownedContext.get());
     5983
     5984    // The compositor is created in a sync message, so there's no risk of race condition on the
     5985    // WebSettings.
     5986    m_compositor->setBackgroundColor(m_webSettings->backgroundColor());
    59745987
    59755988    return true;
     
    62716284        Color backgroundColor(webSettings->backgroundColor());
    62726285        m_mainFrame->view()->updateBackgroundRecursively(backgroundColor, backgroundColor.hasAlpha());
     6286
     6287        Platform::userInterfaceThreadMessageClient()->dispatchMessage(
     6288            createMethodCallMessage(&WebPagePrivate::setCompositorBackgroundColor, this, backgroundColor));
    62736289    }
    62746290}
  • trunk/Source/WebKit/blackberry/Api/WebPageCompositor.cpp

    r119185 r119718  
    130130
    131131    if (!drawsRootLayer())
    132         m_webPage->m_backingStore->d->compositeContents(m_layerRenderer.get(), transform, contents);
     132        m_webPage->m_backingStore->d->compositeContents(m_layerRenderer.get(), transform, contents, !m_backgroundColor.hasAlpha());
    133133
    134134    compositeLayers(transform);
     
    193193}
    194194
     195void WebPageCompositorPrivate::setBackgroundColor(const Color& color)
     196{
     197    m_backgroundColor = color;
     198}
     199
    195200void WebPageCompositorPrivate::releaseLayerResources()
    196201{
  • trunk/Source/WebKit/blackberry/Api/WebPageCompositor_p.h

    r119436 r119718  
    8585    void setLastCompositingResults(const WebCore::LayerRenderingResults& results) { m_lastCompositingResults = results; }
    8686
     87    WebCore::Color backgroundColor() const { return m_backgroundColor; }
     88    void setBackgroundColor(const WebCore::Color&);
     89
    8790    void releaseLayerResources();
    8891
     
    112115    WebCore::IntSize m_contentsSizeForCompositing;
    113116    WebCore::LayerRenderingResults m_lastCompositingResults;
     117    WebCore::Color m_backgroundColor;
    114118    bool m_drawsRootLayer;
    115119};
  • trunk/Source/WebKit/blackberry/Api/WebPage_p.h

    r119679 r119718  
    397397    WebPageCompositorPrivate* compositor() const { return m_compositor.get(); }
    398398    void setCompositor(PassRefPtr<WebPageCompositorPrivate>, EGLContext compositingContext);
     399    void setCompositorBackgroundColor(const WebCore::Color&);
    399400    bool createCompositor();
    400401    void destroyCompositor();
  • trunk/Source/WebKit/blackberry/ChangeLog

    r119713 r119718  
     12012-06-07  Arvid Nilsson  <anilsson@rim.com>
     2
     3        [BlackBerry] Allow WebPageCompositor to blend a transparent web page
     4        https://bugs.webkit.org/show_bug.cgi?id=88233
     5
     6        Reviewed by Rob Buis.
     7
     8        RIM PR #159998
     9
     10        Keep track of the web page background color in the compositor so we can
     11        determine whether the contents of the root layer are transparent.
     12
     13        Reviewed internally by Jakob Petsovits.
     14
     15        * Api/BackingStore.cpp:
     16        (BlackBerry::WebKit::BackingStorePrivate::compositeContents):
     17        * Api/BackingStore_p.h:
     18        (BackingStorePrivate):
     19        * Api/WebPage.cpp:
     20        (BlackBerry::WebKit::WebPagePrivate::setCompositor):
     21        (BlackBerry::WebKit::WebPagePrivate::setCompositorBackgroundColor):
     22        (WebKit):
     23        (BlackBerry::WebKit::WebPagePrivate::createCompositor):
     24        (BlackBerry::WebKit::WebPagePrivate::didChangeSettings):
     25        * Api/WebPageCompositor.cpp:
     26        (BlackBerry::WebKit::WebPageCompositorPrivate::render):
     27        (BlackBerry::WebKit::WebPageCompositorPrivate::setBackgroundColor):
     28        (WebKit):
     29        * Api/WebPageCompositor_p.h:
     30        (BlackBerry::WebKit::WebPageCompositorPrivate::backgroundColor):
     31        (WebPageCompositorPrivate):
     32        * Api/WebPage_p.h:
     33        (WebPagePrivate):
     34
    1352012-06-07  Jonathan Dong  <jonathan.dong@torchmobile.com.cn>
    236
Note: See TracChangeset for help on using the changeset viewer.