Changeset 160894 in webkit
- Timestamp:
- Dec 19, 2013 7:48:10 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r160887 r160894 1 2013-12-19 Simon Fraser <simon.fraser@apple.com> 2 3 Clarify the behavior of composited canvases 4 https://bugs.webkit.org/show_bug.cgi?id=126042 5 6 Reviewed by Tim Horton. 7 8 Different platforms composite 2D and 3D canvases in different ways. 9 10 "Accelerated 2D" canvases, and WebGL are always set as GraphicsLayer 11 contents. 12 13 "IOSurface" canvases (Mac and iOS-only) get a compositing layer, but 14 paint into it (because this is fast, and a convenient way to get 15 synchronization). 16 17 So make these behaviors explicit in RenderLayerBacking and RenderLayerCompositor. 18 No behavior changes on OS X, bug fix on iOS. 19 20 * rendering/RenderLayerBacking.cpp: 21 (WebCore::canvasCompositingStrategy): 22 (WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration): 23 (WebCore::RenderLayerBacking::containsPaintedContent): 24 (WebCore::RenderLayerBacking::contentChanged): 25 * rendering/RenderLayerBacking.h: 26 * rendering/RenderLayerCompositor.cpp: 27 (WebCore::RenderLayerCompositor::requiresCompositingForCanvas): 28 1 29 2013-12-19 Joseph Pecoraro <pecoraro@apple.com> 2 30 -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r160595 r160894 82 82 static IntRect clipBox(RenderBox& renderer); 83 83 84 static inline bool isAcceleratedCanvas(RenderObject* renderer) 85 { 86 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) 87 if (renderer->isCanvas()) { 88 const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node()); 89 if (CanvasRenderingContext* context = canvas->renderingContext()) 90 return context->isAccelerated(); 91 } 84 CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject& renderer) 85 { 86 ASSERT(renderer.isCanvas()); 87 88 const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.node()); 89 CanvasRenderingContext* context = canvas->renderingContext(); 90 if (!context || !context->isAccelerated()) 91 return UnacceleratedCanvas; 92 93 if (context->is3d()) 94 return CanvasAsLayerContents; 95 96 #if ENABLE(ACCELERATED_2D_CANVAS) 97 return CanvasAsLayerContents; 92 98 #else 93 UNUSED_PARAM(renderer); 94 #endif 95 return false; 99 return CanvasPaintedToLayer; // On Mac and iOS we paint accelerated canvases into their layers. 100 #endif 96 101 } 97 102 … … 627 632 #endif 628 633 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) 629 else if ( isAcceleratedCanvas(&renderer())) {634 else if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) { 630 635 const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer().element()); 631 636 if (CanvasRenderingContext* context = canvas->renderingContext()) … … 1833 1838 return m_owningLayer.hasBoxDecorationsOrBackground(); 1834 1839 #endif 1835 #if PLATFORM(MAC) && !PLATFORM(IOS) && USE(CA) 1836 # elif ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) || PLATFORM(IOS_SIMULATOR)1837 if ( isAcceleratedCanvas(&renderer()))1840 1841 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) 1842 if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) 1838 1843 return m_owningLayer.hasBoxDecorationsOrBackground(); 1839 1844 #endif … … 1884 1889 1885 1890 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) 1886 if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && isAcceleratedCanvas(&renderer())) {1891 if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) { 1887 1892 m_graphicsLayer->setContentsNeedsDisplay(); 1888 1893 return; -
trunk/Source/WebCore/rendering/RenderLayerBacking.h
r160236 r160894 329 329 }; 330 330 331 enum CanvasCompositingStrategy { 332 UnacceleratedCanvas, 333 CanvasPaintedToLayer, 334 CanvasAsLayerContents 335 }; 336 CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject&); 337 331 338 } // namespace WebCore 332 339 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r160672 r160894 2264 2264 2265 2265 if (renderer.isCanvas()) { 2266 HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element());2267 2266 #if USE(COMPOSITING_FOR_SMALL_CANVASES) 2268 2267 bool isCanvasLargeEnoughToForceCompositing = true; 2269 2268 #else 2269 HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element()); 2270 2270 bool isCanvasLargeEnoughToForceCompositing = canvas->size().area() >= canvasAreaThresholdRequiringCompositing; 2271 2271 #endif 2272 return canvas->renderingContext() && canvas->renderingContext()->isAccelerated() && (canvas->renderingContext()->is3d() || isCanvasLargeEnoughToForceCompositing); 2272 CanvasCompositingStrategy compositingStrategy = canvasCompositingStrategy(renderer); 2273 return compositingStrategy == CanvasAsLayerContents || (compositingStrategy == CanvasPaintedToLayer && isCanvasLargeEnoughToForceCompositing); 2273 2274 } 2274 2275
Note: See TracChangeset
for help on using the changeset viewer.