[chromium] Background filters for composited layers
authordanakj@chromium.org <danakj@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Apr 2012 05:28:44 +0000 (05:28 +0000)
committerdanakj@chromium.org <danakj@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Apr 2012 05:28:44 +0000 (05:28 +0000)
commit70a7aec159e7e79eb3be6898be992d7c269c7081
tree614603f2f51ed1e8696d054675b5d64d855704e1
parent28cee62b7d9146520168aed112329214e0e8c8ff
[chromium] Background filters for composited layers
https://bugs.webkit.org/show_bug.cgi?id=80046

Reviewed by Adrienne Walker.

Source/WebCore:

Adds background filters to LayerChromium/CCLayerImpl. These filters are
applied to any pixels in the contents behind the layer and seen through
it.

This is done by adding a backgroundTexture() to the render surface, which
holds the read-back contents of the target framebuffer, background filter
applied, in the surface's own coordinate space. Then this is drawn back
into the frame buffer before the contents of the surface itself is drawn.

Tests: platform/chromium/compositing/filters/background-filter-blur-off-axis.html
       platform/chromium/compositing/filters/background-filter-blur-outsets.html
       platform/chromium/compositing/filters/background-filter-blur.html

* platform/graphics/chromium/LayerChromium.cpp:
(WebCore::LayerChromium::setBackgroundFilters):
(WebCore):
(WebCore::LayerChromium::pushPropertiesTo):
* platform/graphics/chromium/LayerChromium.h:
(LayerChromium):
(WebCore::LayerChromium::backgroundFilters):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::drawBackgroundFilters):
(WebCore):
(WebCore::LayerRendererChromium::drawRenderSurfaceQuad):
(WebCore::LayerRendererChromium::getFramebufferTexture):
(WebCore::LayerRendererChromium::isCurrentRenderSurface):
(WebCore::LayerRendererChromium::useRenderSurface):
(WebCore::LayerRendererChromium::useManagedTexture):
(WebCore::LayerRendererChromium::bindFramebufferToTexture):
(WebCore::LayerRendererChromium::setScissorToRect):
* platform/graphics/chromium/LayerRendererChromium.h:
(LayerRendererChromium):
* platform/graphics/chromium/RenderSurfaceChromium.h:
(WebCore::RenderSurfaceChromium::setBackgroundFilters):
(WebCore::RenderSurfaceChromium::backgroundFilters):
(RenderSurfaceChromium):
* platform/graphics/chromium/cc/CCLayerImpl.cpp:
(WebCore::CCLayerImpl::setBackgroundFilters):
(WebCore):
* platform/graphics/chromium/cc/CCLayerImpl.h:
(CCLayerImpl):
(WebCore::CCLayerImpl::backgroundFilters):
* platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp:
(WebCore::subtreeShouldRenderToSeparateSurface):
(WebCore::calculateDrawTransformsAndVisibilityInternal):
* platform/graphics/chromium/cc/CCRenderSurface.cpp:
(WebCore::CCRenderSurface::drawableContentRect):
(WebCore::CCRenderSurface::prepareBackgroundTexture):
(WebCore):
(WebCore::CCRenderSurface::releaseBackgroundTexture):
(WebCore::CCRenderSurface::computeDeviceTransform):
(WebCore::CCRenderSurface::computeDeviceBoundingBox):
(WebCore::CCRenderSurface::computeReadbackDeviceBoundingBox):
(WebCore::CCRenderSurface::readbackDeviceContentRect):
(WebCore::copyTextureToFramebuffer):
(WebCore::CCRenderSurface::copyDeviceToBackgroundTexture):
(WebCore::getSkBitmapTextureId):
(WebCore::CCRenderSurface::drawContents):
(WebCore::CCRenderSurface::drawReplica):
(WebCore::CCRenderSurface::drawLayer):
(WebCore::CCRenderSurface::drawSurface):
(WebCore::CCRenderSurface::applyFilters):
* platform/graphics/chromium/cc/CCRenderSurface.h:
(CCRenderSurface):
(WebCore::CCRenderSurface::setBackgroundFilters):
(WebCore::CCRenderSurface::backgroundFilters):
(WebCore::CCRenderSurface::backgroundTexture):
* testing/Internals.cpp:
(WebCore):
(WebCore::Internals::setBackgroundBlurOnNode):
* testing/Internals.h:
(Internals):
* testing/Internals.idl:

Source/WebKit/chromium:

* tests/CCLayerImplTest.cpp:
(WebCore::TEST):

LayoutTests:

* platform/chromium/compositing/filters/background-filter-blur-expected.png: Added.
* platform/chromium/compositing/filters/background-filter-blur-expected.txt: Added.
* platform/chromium/compositing/filters/background-filter-blur-off-axis-expected.png: Added.
* platform/chromium/compositing/filters/background-filter-blur-off-axis-expected.txt: Added.
* platform/chromium/compositing/filters/background-filter-blur-off-axis.html: Added.
* platform/chromium/compositing/filters/background-filter-blur-outsets-expected.png: Added.
* platform/chromium/compositing/filters/background-filter-blur-outsets-expected.txt: Added.
* platform/chromium/compositing/filters/background-filter-blur-outsets.html: Added.
* platform/chromium/compositing/filters/background-filter-blur.html: Added.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@114081 268f45cc-cd09-0410-ab3c-d52691b4dbfc
26 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-expected.png [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-off-axis-expected.png [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-off-axis-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-off-axis.html [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-outsets-expected.png [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-outsets-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur-outsets.html [new file with mode: 0644]
LayoutTests/platform/chromium/compositing/filters/background-filter-blur.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/chromium/LayerChromium.cpp
Source/WebCore/platform/graphics/chromium/LayerChromium.h
Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h
Source/WebCore/platform/graphics/chromium/RenderSurfaceChromium.h
Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp
Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp
Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp
Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h
Source/WebCore/testing/Internals.cpp
Source/WebCore/testing/Internals.h
Source/WebCore/testing/Internals.idl
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/tests/CCLayerImplTest.cpp