Changeset 126095 in webkit


Ignore:
Timestamp:
Aug 20, 2012 4:57:24 PM (12 years ago)
Author:
abarth@webkit.org
Message:

WebWidget should be able to paint into a zoomed canvas without aliasing
https://bugs.webkit.org/show_bug.cgi?id=92043

Reviewed by James Robinson.

If accelerated compositing is enabled, WebWidget::paint reads back from
the compositor rather than re-painting the widget. That approach works
well if the canvas we're rendering into is at a similar resolution to
the pixels in the compositor, but if the canvas has been scaled (e.g.,
to help the user disambiguate links), then reading back from the
compositor will cause aliasing artifacts.

This patch adds an option to paint to let the embedder request a
software re-rendering of the widget to avoid these aliasing artifacts.

  • public/WebWidget.h:

(WebKit::WebWidget::paint):

  • src/WebPagePopupImpl.cpp:

(WebKit::WebPagePopupImpl::paint):

  • src/WebPagePopupImpl.h:

(WebPagePopupImpl):

  • src/WebPopupMenuImpl.cpp:

(WebKit::WebPopupMenuImpl::paint):

  • src/WebPopupMenuImpl.h:
  • src/WebViewImpl.cpp:

(WebKit::canvasBackgroundForTransparencey):
(WebKit):
(WebKit::WebViewImpl::paint):

  • src/WebViewImpl.h:

(WebViewImpl):

Location:
trunk/Source/WebKit/chromium
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/chromium/ChangeLog

    r126091 r126095  
     12012-08-20  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
    1342012-08-20  James Robinson  <jamesr@chromium.org>
    235
  • trunk/Source/WebKit/chromium/public/WebWidget.h

    r124670 r126095  
    9191    virtual void layout() { }
    9292
     93    enum PaintOptions {
     94        // Attempt to fulfill the painting request by reading back from the
     95        // compositor, assuming we're using a compositor to render.
     96        ReadbackFromCompositorIfAvailable,
     97
     98        // Force the widget to rerender onto the canvas using software. This
     99        // mode ignores 3d transforms and ignores GPU-resident content, such
     100        // as video, canvas, and WebGL.
     101        //
     102        // Note: This option exists on OS(ANDROID) and will hopefully be
     103        //       removed once the link disambiguation feature renders using
     104        //       the compositor.
     105        ForceSoftwareRenderingAndIgnoreGPUResidentContent,
     106    };
     107
    93108    // Called to paint the rectangular region within the WebWidget
    94109    // onto the specified canvas at (viewPort.x,viewPort.y). You MUST call
     
    98113    // processed, it should be assumed that another call to layout is
    99114    // warranted before painting again).
    100     virtual void paint(WebCanvas*, const WebRect& viewPort) { }
     115    virtual void paint(WebCanvas*, const WebRect& viewPort, PaintOptions = ReadbackFromCompositorIfAvailable) { }
    101116
    102117    // In non-threaded compositing mode, triggers compositing of the current
  • trunk/Source/WebKit/chromium/src/WebPagePopupImpl.cpp

    r125764 r126095  
    226226}
    227227
    228 void WebPagePopupImpl::paint(WebCanvas* canvas, const WebRect& rect)
     228void WebPagePopupImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions)
    229229{
    230230    PageWidgetDelegate::paint(m_page.get(), 0, canvas, rect, PageWidgetDelegate::Opaque);
  • trunk/Source/WebKit/chromium/src/WebPagePopupImpl.h

    r125169 r126095  
    7373    virtual void composite(bool) OVERRIDE;
    7474    virtual void layout() OVERRIDE;
    75     virtual void paint(WebCanvas*, const WebRect&) OVERRIDE;
     75    virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE;
    7676    virtual void resize(const WebSize&) OVERRIDE;
    7777    virtual void close() OVERRIDE;
  • trunk/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp

    r119423 r126095  
    194194}
    195195
    196 void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect)
     196void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions)
    197197{
    198198    if (!m_widget)
  • trunk/Source/WebKit/chromium/src/WebPopupMenuImpl.h

    r114800 r126095  
    7474    virtual void animate(double frameBeginTime) OVERRIDE;
    7575    virtual void layout() OVERRIDE;
    76     virtual void paint(WebCanvas*, const WebRect&) OVERRIDE;
     76    virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE;
    7777    virtual void themeChanged() OVERRIDE;
    7878    virtual void setCompositorSurfaceReady() OVERRIDE;
  • trunk/Source/WebKit/chromium/src/WebViewImpl.cpp

    r126076 r126095  
    16871687#endif
    16881688
    1689 void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect)
    1690 {
    1691     if (isAcceleratedCompositingActive()) {
     1689void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions option)
     1690{
     1691#if !OS(ANDROID)
     1692    // ReadbackFromCompositorIfAvailable is the only option available on non-Android.
     1693    // Ideally, Android would always use ReadbackFromCompositorIfAvailable as well.
     1694    ASSERT(option == ReadbackFromCompositorIfAvailable);
     1695#endif
     1696
     1697    if (option == ReadbackFromCompositorIfAvailable && isAcceleratedCompositingActive()) {
    16921698#if USE(ACCELERATED_COMPOSITING)
    16931699        // If a canvas was passed in, we use it to grab a copy of the
     
    17011707#endif
    17021708    } else {
     1709        FrameView* view = page()->mainFrame()->view();
     1710        PaintBehavior oldPaintBehavior = view->paintBehavior();
     1711        if (isAcceleratedCompositingActive()) {
     1712            ASSERT(option == ForceSoftwareRenderingAndIgnoreGPUResidentContent);           
     1713            view->setPaintBehavior(oldPaintBehavior | PaintBehaviorFlattenCompositingLayers);
     1714        }
     1715
    17031716        double paintStart = currentTime();
    17041717        PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque);
     
    17071720        WebKit::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintDurationMS", (paintEnd - paintStart) * 1000, 0, 120, 30);
    17081721        WebKit::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintMegapixPerSecond", pixelsPerSec / 1000000, 10, 210, 30);
     1722
     1723        if (isAcceleratedCompositingActive()) {
     1724            ASSERT(option == ForceSoftwareRenderingAndIgnoreGPUResidentContent);           
     1725            view->setPaintBehavior(oldPaintBehavior);
     1726        }
    17091727    }
    17101728}
  • trunk/Source/WebKit/chromium/src/WebViewImpl.h

    r126076 r126095  
    144144    virtual void animate(double);
    145145    virtual void layout(); // Also implements WebLayerTreeViewClient::layout()
    146     virtual void paint(WebCanvas*, const WebRect&);
     146    virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable);
    147147    virtual void themeChanged();
    148148    virtual void composite(bool finish);
Note: See TracChangeset for help on using the changeset viewer.