diff options
Diffstat (limited to 'WebCore/rendering/RenderLayerCompositor.cpp')
-rw-r--r-- | WebCore/rendering/RenderLayerCompositor.cpp | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/WebCore/rendering/RenderLayerCompositor.cpp b/WebCore/rendering/RenderLayerCompositor.cpp index e6ea32a..638c628 100644 --- a/WebCore/rendering/RenderLayerCompositor.cpp +++ b/WebCore/rendering/RenderLayerCompositor.cpp @@ -100,6 +100,7 @@ RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) , m_rootPlatformLayer(0) , m_updateCompositingLayersTimer(this, &RenderLayerCompositor::updateCompositingLayersTimerFired) , m_hasAcceleratedCompositing(true) + , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(ChromeClient::AllTriggers)) , m_showDebugBorders(false) , m_showRepaintCounter(false) , m_compositingConsultsOverlap(true) @@ -136,7 +137,7 @@ void RenderLayerCompositor::cacheAcceleratedCompositingFlags() bool hasAcceleratedCompositing = false; bool showDebugBorders = false; bool showRepaintCounter = false; - + if (Settings* settings = m_renderView->document()->settings()) { hasAcceleratedCompositing = settings->acceleratedCompositingEnabled(); showDebugBorders = settings->showDebugBorders(); @@ -148,18 +149,26 @@ void RenderLayerCompositor::cacheAcceleratedCompositingFlags() if (hasAcceleratedCompositing) { Frame* frame = m_renderView->frameView()->frame(); Page* page = frame ? frame->page() : 0; - if (page) - hasAcceleratedCompositing = page->chrome()->client()->allowsAcceleratedCompositing(); + if (page) { + ChromeClient* chromeClient = page->chrome()->client(); + m_compositingTriggers = chromeClient->allowedCompositingTriggers(); + hasAcceleratedCompositing = m_compositingTriggers; + } } if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBorders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter) setCompositingLayersNeedRebuild(); - + m_hasAcceleratedCompositing = hasAcceleratedCompositing; m_showDebugBorders = showDebugBorders; m_showRepaintCounter = showRepaintCounter; } +bool RenderLayerCompositor::canRender3DTransforms() const +{ + return hasAcceleratedCompositing() && (m_compositingTriggers & ChromeClient::ThreeDTransformTrigger); +} + void RenderLayerCompositor::setCompositingLayersNeedRebuild(bool needRebuild) { if (inCompositingMode()) @@ -1223,7 +1232,7 @@ bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer) c || requiresCompositingForCanvas(renderer) || requiresCompositingForPlugin(renderer) || requiresCompositingForIFrame(renderer) - || renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden + || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden) || clipsCompositingDescendants(layer) || requiresCompositingForAnimation(renderer); } @@ -1279,6 +1288,9 @@ bool RenderLayerCompositor::clipsCompositingDescendants(const RenderLayer* layer bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* renderer) const { + if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) + return false; + RenderStyle* style = renderer->style(); // Note that we ask the renderer if it has a transform, because the style may have transforms, // but the renderer may be an inline that doesn't suppport them. @@ -1287,6 +1299,8 @@ bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* render bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer) const { + if (!(m_compositingTriggers & ChromeClient::VideoTrigger)) + return false; #if ENABLE(VIDEO) if (renderer->isVideo()) { RenderVideo* video = toRenderVideo(renderer); @@ -1313,6 +1327,9 @@ bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer) bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer) const { + if (!(m_compositingTriggers & ChromeClient::CanvasTrigger)) + return false; + if (renderer->isCanvas()) { HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(renderer->node()); return canvas->renderingContext() && canvas->renderingContext()->isAccelerated(); @@ -1322,6 +1339,9 @@ bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer) bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer) const { + if (!(m_compositingTriggers & ChromeClient::PluginTrigger)) + return false; + bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing()) || (renderer->isApplet() && toRenderApplet(renderer)->allowsAcceleratedCompositing()); if (!composite) @@ -1366,6 +1386,9 @@ bool RenderLayerCompositor::requiresCompositingForIFrame(RenderObject* renderer) bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* renderer) const { + if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) + return false; + if (AnimationController* animController = renderer->animation()) { return (animController->isRunningAnimationOnRenderer(renderer, CSSPropertyOpacity) && inCompositingMode()) || animController->isRunningAnimationOnRenderer(renderer, CSSPropertyWebkitTransform); |