⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 102088 in webkit


Ignore:
Timestamp:
Dec 5, 2011, 8:16:28 PM (15 years ago)
Author:
senorblanco@chromium.org
Message:

Allow the ImageBuffers used by SVG filters to be accelerated
https://bugs.webkit.org/show_bug.cgi?id=73842

Reviewed by Kenneth Russell.

Source/WebCore:

Regressions covered by existing SVG tests; new functionality to be
tested by the API exposed on Internals.

  • page/Settings.cpp:

(WebCore::Settings::Settings):

  • page/Settings.h:

(WebCore::Settings::setAcceleratedFiltersEnabled):
(WebCore::Settings::acceleratedFiltersEnabled):

  • platform/graphics/filters/FETile.cpp:

(WebCore::FETile::platformApplySoftware):

  • platform/graphics/filters/Filter.h:

(WebCore::Filter::Filter):
(WebCore::Filter::renderingMode):
(WebCore::Filter::setRenderingMode):

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::asImageBuffer):
(WebCore::FilterEffect::createImageBufferResult):

  • platform/graphics/skia/ImageBufferSkia.cpp:

(WebCore::ImageBuffer::platformTransformColorSpace):

  • rendering/svg/RenderSVGResourceClipper.cpp:

(WebCore::RenderSVGResourceClipper::applyClippingToContext):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::applyResource):

  • rendering/svg/RenderSVGResourceMasker.cpp:

(WebCore::RenderSVGResourceMasker::applyResource):

  • rendering/svg/RenderSVGResourcePattern.cpp:

(WebCore::RenderSVGResourcePattern::createTileImage):

  • rendering/svg/SVGImageBufferTools.cpp:

(WebCore::SVGImageBufferTools::createImageBuffer):

  • rendering/svg/SVGImageBufferTools.h:
  • testing/Internals.cpp:

(WebCore::Internals::setAcceleratedFiltersEnabled):

  • testing/Internals.h:
  • testing/Internals.idl:

Source/WebKit/chromium:

  • public/WebSettings.h:
  • src/WebSettingsImpl.cpp:

(WebKit::WebSettingsImpl::setAcceleratedFiltersEnabled):

  • src/WebSettingsImpl.h:
Location:
trunk/Source
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r102086 r102088  
     12011-12-05  Stephen White  <senorblanco@chromium.org>
     2
     3        Allow the ImageBuffers used by SVG filters to be accelerated
     4        https://bugs.webkit.org/show_bug.cgi?id=73842
     5
     6        Reviewed by Kenneth Russell.
     7
     8        Regressions covered by existing SVG tests; new functionality to be
     9        tested by the API exposed on Internals.
     10
     11        * page/Settings.cpp:
     12        (WebCore::Settings::Settings):
     13        * page/Settings.h:
     14        (WebCore::Settings::setAcceleratedFiltersEnabled):
     15        (WebCore::Settings::acceleratedFiltersEnabled):
     16        * platform/graphics/filters/FETile.cpp:
     17        (WebCore::FETile::platformApplySoftware):
     18        * platform/graphics/filters/Filter.h:
     19        (WebCore::Filter::Filter):
     20        (WebCore::Filter::renderingMode):
     21        (WebCore::Filter::setRenderingMode):
     22        * platform/graphics/filters/FilterEffect.cpp:
     23        (WebCore::FilterEffect::asImageBuffer):
     24        (WebCore::FilterEffect::createImageBufferResult):
     25        * platform/graphics/skia/ImageBufferSkia.cpp:
     26        (WebCore::ImageBuffer::platformTransformColorSpace):
     27        * rendering/svg/RenderSVGResourceClipper.cpp:
     28        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
     29        * rendering/svg/RenderSVGResourceFilter.cpp:
     30        (WebCore::RenderSVGResourceFilter::applyResource):
     31        * rendering/svg/RenderSVGResourceMasker.cpp:
     32        (WebCore::RenderSVGResourceMasker::applyResource):
     33        * rendering/svg/RenderSVGResourcePattern.cpp:
     34        (WebCore::RenderSVGResourcePattern::createTileImage):
     35        * rendering/svg/SVGImageBufferTools.cpp:
     36        (WebCore::SVGImageBufferTools::createImageBuffer):
     37        * rendering/svg/SVGImageBufferTools.h:
     38        * testing/Internals.cpp:
     39        (WebCore::Internals::setAcceleratedFiltersEnabled):
     40        * testing/Internals.h:
     41        * testing/Internals.idl:
     42
    1432011-12-05  Benjamin Poulain  <bpoulain@apple.com>
    244
  • trunk/Source/WebCore/page/Settings.cpp

    r101977 r102088  
    171171    , m_canvasUsesAcceleratedDrawing(false)
    172172    , m_acceleratedDrawingEnabled(false)
     173    , m_acceleratedFiltersEnabled(false)
    173174    // FIXME: This should really be disabled by default as it makes platforms that don't support the feature download files
    174175    // they can't use by. Leaving enabled for now to not change existing behavior.
  • trunk/Source/WebCore/page/Settings.h

    r101977 r102088  
    301301        void setAcceleratedDrawingEnabled(bool enabled) { m_acceleratedDrawingEnabled = enabled; }
    302302        bool acceleratedDrawingEnabled() const { return m_acceleratedDrawingEnabled; }
     303
     304        void setAcceleratedFiltersEnabled(bool enabled) { m_acceleratedFiltersEnabled = enabled; }
     305        bool acceleratedFiltersEnabled() const { return m_acceleratedFiltersEnabled; }
    303306
    304307        void setAcceleratedCompositingEnabled(bool);
     
    574577        bool m_canvasUsesAcceleratedDrawing : 1;
    575578        bool m_acceleratedDrawingEnabled : 1;
     579        bool m_acceleratedFiltersEnabled : 1;
    576580        bool m_downloadableBinaryFontsEnabled : 1;
    577581        bool m_xssAuditorEnabled : 1;
  • trunk/Source/WebCore/platform/graphics/filters/FETile.cpp

    r97853 r102088  
    6868
    6969    OwnPtr<ImageBuffer> tileImage;
    70     if (!SVGImageBufferTools::createImageBuffer(tileRect, tileRect, tileImage, ColorSpaceDeviceRGB))
     70    if (!SVGImageBufferTools::createImageBuffer(tileRect, tileRect, tileImage, ColorSpaceDeviceRGB, filter()->renderingMode()))
    7171        return;
    7272
  • trunk/Source/WebCore/platform/graphics/filters/Filter.h

    r99854 r102088  
    3333class Filter : public RefCounted<Filter> {
    3434public:
     35    Filter() : m_renderingMode(Unaccelerated) { }
    3536    virtual ~Filter() { }
    3637
     
    4041    FloatSize filterResolution() const { return m_filterResolution; }
    4142    void setFilterResolution(const FloatSize& filterResolution) { m_filterResolution = filterResolution; }
     43
     44    RenderingMode renderingMode() const { return m_renderingMode; }
     45    void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }
    4246
    4347    virtual float applyHorizontalScale(float value) const { return value * m_filterResolution.width(); }
     
    5256    OwnPtr<ImageBuffer> m_sourceImage;
    5357    FloatSize m_filterResolution;
     58    RenderingMode m_renderingMode;
    5459};
    5560
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r97853 r102088  
    119119    if (m_imageBufferResult)
    120120        return m_imageBufferResult.get();
    121     m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB);
     121    m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB, m_filter->renderingMode());
    122122    IntRect destinationRect(IntPoint(), m_absolutePaintRect.size());
    123123    if (m_premultipliedImageResult)
     
    256256    if (m_absolutePaintRect.isEmpty())
    257257        return 0;
    258     m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB);
     258    m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB, m_filter->renderingMode());
    259259    if (!m_imageBufferResult)
    260260        return 0;
  • trunk/Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp

    r101325 r102088  
    179179void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable)
    180180{
     181    // FIXME: Disable color space conversions on accelerated canvases (for now).
     182    if (m_data.m_platformContext.isAccelerated())
     183        return;
     184
    181185    const SkBitmap& bitmap = *context()->platformContext()->bitmap();
    182186    if (bitmap.isNull())
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp

    r101517 r102088  
    180180
    181181    if (shouldCreateClipData && !clampedAbsoluteTargetRect.isEmpty()) {
    182         if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, clipperData->clipMaskImage, ColorSpaceDeviceRGB))
     182        if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, clipperData->clipMaskImage, ColorSpaceDeviceRGB, Unaccelerated))
    183183            return false;
    184184
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r101517 r102088  
    3636#include "ImageData.h"
    3737#include "IntRect.h"
     38#include "Page.h"
    3839#include "RenderSVGResource.h"
    3940#include "RenderSVGResourceFilterPrimitive.h"
     41#include "Settings.h"
    4042#include "SVGElement.h"
    4143#include "SVGFilter.h"
     
    230232
    231233    OwnPtr<ImageBuffer> sourceGraphic;
    232     if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB)) {
     234    RenderingMode renderingMode = object->document()->page()->settings()->acceleratedFiltersEnabled() ? Accelerated : Unaccelerated;
     235    if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB, renderingMode)) {
    233236        ASSERT(!m_filter.contains(object));
    234237        filterData->savedContext = context;
     
    237240    }
    238241   
     242    // Set the rendering mode from the page's settings.
     243    filterData->filter->setRenderingMode(renderingMode);
     244
    239245    GraphicsContext* sourceGraphicContext = sourceGraphic->context();
    240246    ASSERT(sourceGraphicContext);
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp

    r101517 r102088  
    9393
    9494    OwnPtr<ImageBuffer> maskImage;
    95     if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskImage, ColorSpaceDeviceRGB))
     95    if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskImage, ColorSpaceDeviceRGB, Unaccelerated))
    9696        return false;
    9797
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp

    r99929 r102088  
    107107        ASSERT(svgStyle);
    108108        ColorSpace colorSpace = svgStyle->colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB;
    109         if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskerData->maskImage, colorSpace))
     109        if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskerData->maskImage, colorSpace, Unaccelerated))
    110110            return false;
    111111
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp

    r101517 r102088  
    253253    OwnPtr<ImageBuffer> tileImage;
    254254
    255     if (!SVGImageBufferTools::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, tileImage, ColorSpaceDeviceRGB))
     255    if (!SVGImageBufferTools::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, tileImage, ColorSpaceDeviceRGB, Unaccelerated))
    256256        return nullptr;
    257257
  • trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp

    r96408 r102088  
    5353}
    5454
    55 bool SVGImageBufferTools::createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>& imageBuffer, ColorSpace colorSpace)
     55bool SVGImageBufferTools::createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>& imageBuffer, ColorSpace colorSpace, RenderingMode renderingMode)
    5656{
    5757    IntSize imageSize(roundedImageBufferSize(clampedAbsoluteTargetRect.size()));
     
    6262        return false;
    6363
    64     OwnPtr<ImageBuffer> image = ImageBuffer::create(imageSize, colorSpace);
     64    OwnPtr<ImageBuffer> image = ImageBuffer::create(imageSize, colorSpace, renderingMode);
    6565    if (!image)
    6666        return false;
  • trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.h

    r96155 r102088  
    3636    WTF_MAKE_NONCOPYABLE(SVGImageBufferTools);
    3737public:
    38     static bool createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, ColorSpace);
     38    static bool createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, ColorSpace, RenderingMode);
    3939    static void renderSubtreeToImageBuffer(ImageBuffer*, RenderObject*, const AffineTransform&);
    4040    static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&);
  • trunk/Source/WebCore/testing/Internals.cpp

    r101875 r102088  
    315315}
    316316
     317void Internals::setAcceleratedFiltersEnabled(Document* document, bool enabled, ExceptionCode& ec)
     318{
     319    if (!document || !document->settings()) {
     320        ec = INVALID_ACCESS_ERR;
     321        return;
     322    }
     323
     324    document->settings()->setAcceleratedFiltersEnabled(enabled);
     325}
     326
    317327void Internals::setEnableScrollAnimator(Document* document, bool enabled, ExceptionCode& ec)
    318328{
  • trunk/Source/WebCore/testing/Internals.h

    r101875 r102088  
    8080    void setEnableCompositingForScrollableFrames(Document*, bool enabled, ExceptionCode&);
    8181    void setAcceleratedDrawingEnabled(Document*, bool enabled, ExceptionCode&);
     82    void setAcceleratedFiltersEnabled(Document*, bool enabled, ExceptionCode&);
    8283
    8384    void setEnableScrollAnimator(Document*, bool enabled, ExceptionCode&);
  • trunk/Source/WebCore/testing/Internals.idl

    r101875 r102088  
    5353        void setEnableCompositingForScrollableFrames(in Document document, in boolean enabled) raises(DOMException);
    5454        void setAcceleratedDrawingEnabled(in Document document, in boolean enabled) raises(DOMException);
     55        void setAcceleratedFiltersEnabled(in Document document, in boolean enabled) raises(DOMException);
    5556        void setEnableScrollAnimator(in Document document, in boolean enabled) raises(DOMException);
    5657        void setZoomAnimatorTransform(in Document document, in float scale, in float tx, in float ty) raises(DOMException);
  • trunk/Source/WebKit/chromium/ChangeLog

    r102078 r102088  
     12011-12-05  Stephen White  <senorblanco@chromium.org>
     2
     3        Allow the ImageBuffers used by SVG filters to be accelerated
     4        https://bugs.webkit.org/show_bug.cgi?id=73842
     5
     6        Reviewed by Kenneth Russell.
     7
     8        * public/WebSettings.h:
     9        * src/WebSettingsImpl.cpp:
     10        (WebKit::WebSettingsImpl::setAcceleratedFiltersEnabled):
     11        * src/WebSettingsImpl.h:
     12
    1132011-12-05  Adam Barth  <abarth@webkit.org>
    214
  • trunk/Source/WebKit/chromium/public/WebSettings.h

    r101576 r102088  
    118118    virtual void setMinimumAccelerated2dCanvasSize(int) = 0;
    119119    virtual void setAcceleratedDrawingEnabled(bool) = 0;
     120    virtual void setAcceleratedFiltersEnabled(bool) = 0;
    120121    virtual void setMemoryInfoEnabled(bool) = 0;
    121122    virtual void setHyperlinkAuditingEnabled(bool) = 0;
  • trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp

    r102044 r102088  
    359359}
    360360
     361void WebSettingsImpl::setAcceleratedFiltersEnabled(bool enabled)
     362{
     363    m_settings->setAcceleratedFiltersEnabled(enabled);
     364}
     365
    361366void WebSettingsImpl::setAccelerated2dCanvasEnabled(bool enabled)
    362367{
  • trunk/Source/WebKit/chromium/src/WebSettingsImpl.h

    r101977 r102088  
    110110    virtual void setMinimumAccelerated2dCanvasSize(int);
    111111    virtual void setAcceleratedDrawingEnabled(bool);
     112    virtual void setAcceleratedFiltersEnabled(bool);
    112113    virtual void setMemoryInfoEnabled(bool);
    113114    virtual void setHyperlinkAuditingEnabled(bool);
Note: See TracChangeset for help on using the changeset viewer.