| Index: WebKit/chromium/src/WebViewImpl.cpp
|
| ===================================================================
|
| --- WebKit/chromium/src/WebViewImpl.cpp (revision 55428)
|
| +++ WebKit/chromium/src/WebViewImpl.cpp (working copy)
|
| @@ -110,6 +110,13 @@
|
| #include "RenderTheme.h"
|
| #endif
|
|
|
| +#if USE(ACCELERATED_COMPOSITING)
|
| +#include "webkit/glue/webkit_glue.h"
|
| +#if WEBKIT_USING_SKIA
|
| +#include "skia/LayerSkia.h"
|
| +#endif
|
| +#endif
|
| +
|
| // Get rid of WTF's pow define so we can use std::pow.
|
| #undef pow
|
| #include <cmath> // for std::pow
|
| @@ -245,6 +252,10 @@
|
| , m_suggestionsPopup(0)
|
| , m_isTransparent(false)
|
| , m_tabsToLinks(false)
|
| +#if USE(ACCELERATED_COMPOSITING)
|
| + , m_layerRenderer(0)
|
| + , m_isAcceleratedCompositing(false)
|
| +#endif
|
| {
|
| // WebKit/win/WebView.cpp does the same thing, except they call the
|
| // KJS specific wrapper around this method. We need to have threading
|
| @@ -873,9 +884,27 @@
|
|
|
| void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect)
|
| {
|
| - WebFrameImpl* webframe = mainFrameImpl();
|
| - if (webframe)
|
| - webframe->paint(canvas, rect);
|
| +
|
| +#if USE(ACCELERATED_COMPOSITING)
|
| + if (!isAcceleratedCompositing()) {
|
| +#endif
|
| + WebFrameImpl* webframe = mainFrameImpl();
|
| + if (webframe)
|
| + webframe->paint(canvas, rect);
|
| +#if USE(ACCELERATED_COMPOSITING)
|
| + } else {
|
| + // Draw the contents of the root layer
|
| + updateRootLayerContents(rect);
|
| +
|
| + // Composite everything into the canvas that's passed to us.
|
| + m_layerRenderer->updateLayerContents();
|
| + SkIRect canvasIRect;
|
| + canvasIRect.set(rect.x, rect.y, rect.x+rect.width, rect.y+rect.height);
|
| + SkRect canvasRect;
|
| + canvasRect.set(canvasIRect);
|
| + m_layerRenderer->drawLayersInCanvas(static_cast<skia::PlatformCanvas*>(canvas), canvasRect);
|
| + }
|
| +#endif
|
| }
|
|
|
| // FIXME: m_currentInputEvent should be removed once ChromeClient::show() can
|
| @@ -1916,4 +1945,83 @@
|
| return m_tabsToLinks;
|
| }
|
|
|
| +#if USE(ACCELERATED_COMPOSITING)
|
| +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
|
| +{
|
| + setAcceleratedCompositing(layer ? true : false);
|
| + if (m_layerRenderer)
|
| + m_layerRenderer->setRootLayer(layer);
|
| +}
|
| +
|
| +void WebViewImpl::setAcceleratedCompositing(bool accelerated)
|
| +{
|
| + if (m_isAcceleratedCompositing == accelerated)
|
| + return;
|
| +
|
| + if (accelerated) {
|
| + m_layerRenderer = LayerRendererSkia::create();
|
| + if (m_layerRenderer) {
|
| + m_isAcceleratedCompositing = true;
|
| + }
|
| + } else {
|
| + m_layerRenderer = 0;
|
| + m_isAcceleratedCompositing = false;
|
| + }
|
| +}
|
| +
|
| +void WebViewImpl::updateRootLayerContents(const WebRect& rect)
|
| +{
|
| + if (!isAcceleratedCompositing())
|
| + return;
|
| +
|
| + WebFrameImpl* webframe = mainFrameImpl();
|
| + if (webframe) {
|
| + FrameView* view = webframe->frameView();
|
| + if (view) {
|
| + WebRect viewRect = view->frameRect();
|
| +
|
| +
|
| + SkIRect scrollFrame;
|
| + scrollFrame.set(view->scrollX(), view->scrollY(), view->layoutWidth()+view->scrollX(), view->layoutHeight()+view->scrollY());
|
| + m_layerRenderer->setScrollFrame(scrollFrame);
|
| + LayerSkia* rootLayer = m_layerRenderer->rootLayer();
|
| + if (rootLayer) {
|
| + SkIRect rootLayerBounds;
|
| + IntRect visibleRect = view->visibleContentRect(true);
|
| +
|
| + // Set the backing store size used by the root layer to be the size of the visible
|
| + // area. Note that the root layer bounds could be larger than the backing store size
|
| + // but there's no reason to waste memory by allocating backing store larger than the
|
| + // visible portion.
|
| + rootLayerBounds.set(0, 0, visibleRect.width(), visibleRect.height());
|
| + rootLayer->setBackingStoreRect(rootLayerBounds);
|
| + GraphicsContext* rootLayerContext = rootLayer->graphicsContext();
|
| + rootLayerContext->save();
|
| +
|
| + webframe->paintWithContext(*(rootLayer->graphicsContext()), rect);
|
| + rootLayerContext->restore();
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +void WebViewImpl::setRootLayerNeedsDisplay()
|
| +{
|
| + // TODO(vangelis): For now we're posting a repaint event for the entire page
|
| + // which is an overkill.
|
| + WebFrameImpl* webframe = mainFrameImpl();
|
| + if (webframe) {
|
| + FrameView* view = webframe->frameView();
|
| + if (view) {
|
| + IntRect visibleRect = view->visibleContentRect(true);
|
| + m_client->didInvalidateRect(visibleRect);
|
| + }
|
| + }
|
| +
|
| + if (m_layerRenderer)
|
| + m_layerRenderer->setNeedsDisplay();
|
| +}
|
| +
|
| +#endif
|
| +
|
| } // namespace WebKit
|
|
|