Changeset 126344 in webkit
- Timestamp:
- Aug 22, 2012, 1:24:56 PM (14 years ago)
- Location:
- trunk/Source/WebKit/chromium
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
public/WebWidget.h (modified) (3 diffs)
-
src/WebPagePopupImpl.cpp (modified) (1 diff)
-
src/WebPagePopupImpl.h (modified) (1 diff)
-
src/WebPopupMenuImpl.cpp (modified) (1 diff)
-
src/WebPopupMenuImpl.h (modified) (1 diff)
-
src/WebViewImpl.cpp (modified) (3 diffs)
-
src/WebViewImpl.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/chromium/ChangeLog
r126340 r126344 1 2012-08-22 Adam Barth <abarth@webkit.org> 2 3 WebWidget should be able to paint into a zoomed canvas without aliasing 4 https://bugs.webkit.org/show_bug.cgi?id=92043 5 6 Reviewed by James Robinson. 7 8 If accelerated compositing is enabled, WebWidget::paint reads back from 9 the compositor rather than re-painting the widget. That approach works 10 well if the canvas we're rendering into is at a similar resolution to 11 the pixels in the compositor, but if the canvas has been scaled (e.g., 12 to help the user disambiguate links), then reading back from the 13 compositor will cause aliasing artifacts. 14 15 This patch adds an option to paint to let the embedder request a 16 software re-rendering of the widget to avoid these aliasing artifacts. 17 18 * public/WebWidget.h: 19 (WebKit::WebWidget::paint): 20 * src/WebPagePopupImpl.cpp: 21 (WebKit::WebPagePopupImpl::paint): 22 * src/WebPagePopupImpl.h: 23 (WebPagePopupImpl): 24 * src/WebPopupMenuImpl.cpp: 25 (WebKit::WebPopupMenuImpl::paint): 26 * src/WebPopupMenuImpl.h: 27 * src/WebViewImpl.cpp: 28 (WebKit::canvasBackgroundForTransparencey): 29 (WebKit): 30 (WebKit::WebViewImpl::paint): 31 * src/WebViewImpl.h: 32 (WebViewImpl): 33 1 34 2012-08-22 Eric Penner <epenner@google.com> 2 35 -
trunk/Source/WebKit/chromium/public/WebWidget.h
r126111 r126344 42 42 #define WEBKIT_HAS_NEW_FULLSCREEN_API 1 43 43 #define WEBWIDGET_HAS_SETCOMPOSITORSURFACEREADY 1 44 #define WEBWIDGET_HAS_PAINT_OPTIONS 1 44 45 45 46 namespace WebKit { … … 91 92 virtual void layout() { } 92 93 94 enum PaintOptions { 95 // Attempt to fulfill the painting request by reading back from the 96 // compositor, assuming we're using a compositor to render. 97 ReadbackFromCompositorIfAvailable, 98 99 // Force the widget to rerender onto the canvas using software. This 100 // mode ignores 3d transforms and ignores GPU-resident content, such 101 // as video, canvas, and WebGL. 102 // 103 // Note: This option exists on OS(ANDROID) and will hopefully be 104 // removed once the link disambiguation feature renders using 105 // the compositor. 106 ForceSoftwareRenderingAndIgnoreGPUResidentContent, 107 }; 108 93 109 // Called to paint the rectangular region within the WebWidget 94 110 // onto the specified canvas at (viewPort.x,viewPort.y). You MUST call … … 98 114 // processed, it should be assumed that another call to layout is 99 115 // warranted before painting again). 100 virtual void paint(WebCanvas*, const WebRect& viewPort ) { }116 virtual void paint(WebCanvas*, const WebRect& viewPort, PaintOptions = ReadbackFromCompositorIfAvailable) { } 101 117 102 118 // In non-threaded compositing mode, triggers compositing of the current -
trunk/Source/WebKit/chromium/src/WebPagePopupImpl.cpp
r126111 r126344 226 226 } 227 227 228 void WebPagePopupImpl::paint(WebCanvas* canvas, const WebRect& rect )228 void WebPagePopupImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions) 229 229 { 230 230 PageWidgetDelegate::paint(m_page.get(), 0, canvas, rect, PageWidgetDelegate::Opaque); -
trunk/Source/WebKit/chromium/src/WebPagePopupImpl.h
r126111 r126344 73 73 virtual void composite(bool) OVERRIDE; 74 74 virtual void layout() OVERRIDE; 75 virtual void paint(WebCanvas*, const WebRect& ) OVERRIDE;75 virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE; 76 76 virtual void resize(const WebSize&) OVERRIDE; 77 77 virtual void close() OVERRIDE; -
trunk/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp
r126111 r126344 194 194 } 195 195 196 void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect )196 void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions) 197 197 { 198 198 if (!m_widget) -
trunk/Source/WebKit/chromium/src/WebPopupMenuImpl.h
r126111 r126344 74 74 virtual void animate(double frameBeginTime) OVERRIDE; 75 75 virtual void layout() OVERRIDE; 76 virtual void paint(WebCanvas*, const WebRect& ) OVERRIDE;76 virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE; 77 77 virtual void themeChanged() OVERRIDE; 78 78 virtual void setCompositorSurfaceReady() OVERRIDE; -
trunk/Source/WebKit/chromium/src/WebViewImpl.cpp
r126323 r126344 1686 1686 #endif 1687 1687 1688 void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect) 1689 { 1690 if (isAcceleratedCompositingActive()) { 1688 void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions option) 1689 { 1690 #if !OS(ANDROID) 1691 // ReadbackFromCompositorIfAvailable is the only option available on non-Android. 1692 // Ideally, Android would always use ReadbackFromCompositorIfAvailable as well. 1693 ASSERT(option == ReadbackFromCompositorIfAvailable); 1694 #endif 1695 1696 if (option == ReadbackFromCompositorIfAvailable && isAcceleratedCompositingActive()) { 1691 1697 #if USE(ACCELERATED_COMPOSITING) 1692 1698 // If a canvas was passed in, we use it to grab a copy of the … … 1700 1706 #endif 1701 1707 } else { 1708 FrameView* view = page()->mainFrame()->view(); 1709 PaintBehavior oldPaintBehavior = view->paintBehavior(); 1710 if (isAcceleratedCompositingActive()) { 1711 ASSERT(option == ForceSoftwareRenderingAndIgnoreGPUResidentContent); 1712 view->setPaintBehavior(oldPaintBehavior | PaintBehaviorFlattenCompositingLayers); 1713 } 1714 1702 1715 double paintStart = currentTime(); 1703 1716 PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); … … 1706 1719 WebKit::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintDurationMS", (paintEnd - paintStart) * 1000, 0, 120, 30); 1707 1720 WebKit::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintMegapixPerSecond", pixelsPerSec / 1000000, 10, 210, 30); 1721 1722 if (isAcceleratedCompositingActive()) { 1723 ASSERT(option == ForceSoftwareRenderingAndIgnoreGPUResidentContent); 1724 view->setPaintBehavior(oldPaintBehavior); 1725 } 1708 1726 } 1709 1727 } -
trunk/Source/WebKit/chromium/src/WebViewImpl.h
r126323 r126344 144 144 virtual void animate(double); 145 145 virtual void layout(); // Also implements WebLayerTreeViewClient::layout() 146 virtual void paint(WebCanvas*, const WebRect& );146 virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable); 147 147 virtual void themeChanged(); 148 148 virtual void composite(bool finish);
Note:
See TracChangeset
for help on using the changeset viewer.