Diff
Modified: trunk/Source/WebCore/ChangeLog (102087 => 102088)
--- trunk/Source/WebCore/ChangeLog 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/ChangeLog 2011-12-06 04:16:28 UTC (rev 102088)
@@ -1,3 +1,45 @@
+2011-12-05 Stephen White <[email protected]>
+
+ Allow the ImageBuffers used by SVG filters to be accelerated
+ https://bugs.webkit.org/show_bug.cgi?id=73842
+
+ Reviewed by Kenneth Russell.
+
+ 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:
+
2011-12-05 Benjamin Poulain <[email protected]>
Upstream htmlSelectMultipleItems needed for <select multiple> by iOS
Modified: trunk/Source/WebCore/page/Settings.cpp (102087 => 102088)
--- trunk/Source/WebCore/page/Settings.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/page/Settings.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -170,6 +170,7 @@
, m_allowScriptsToCloseWindows(false)
, m_canvasUsesAcceleratedDrawing(false)
, m_acceleratedDrawingEnabled(false)
+ , m_acceleratedFiltersEnabled(false)
// FIXME: This should really be disabled by default as it makes platforms that don't support the feature download files
// they can't use by. Leaving enabled for now to not change existing behavior.
, m_downloadableBinaryFontsEnabled(true)
Modified: trunk/Source/WebCore/page/Settings.h (102087 => 102088)
--- trunk/Source/WebCore/page/Settings.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/page/Settings.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -301,6 +301,9 @@
void setAcceleratedDrawingEnabled(bool enabled) { m_acceleratedDrawingEnabled = enabled; }
bool acceleratedDrawingEnabled() const { return m_acceleratedDrawingEnabled; }
+ void setAcceleratedFiltersEnabled(bool enabled) { m_acceleratedFiltersEnabled = enabled; }
+ bool acceleratedFiltersEnabled() const { return m_acceleratedFiltersEnabled; }
+
void setAcceleratedCompositingEnabled(bool);
bool acceleratedCompositingEnabled() const { return m_acceleratedCompositingEnabled; }
@@ -573,6 +576,7 @@
bool m_allowScriptsToCloseWindows : 1;
bool m_canvasUsesAcceleratedDrawing : 1;
bool m_acceleratedDrawingEnabled : 1;
+ bool m_acceleratedFiltersEnabled : 1;
bool m_downloadableBinaryFontsEnabled : 1;
bool m_xssAuditorEnabled : 1;
bool m_acceleratedCompositingEnabled : 1;
Modified: trunk/Source/WebCore/platform/graphics/filters/FETile.cpp (102087 => 102088)
--- trunk/Source/WebCore/platform/graphics/filters/FETile.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/platform/graphics/filters/FETile.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -67,7 +67,7 @@
}
OwnPtr<ImageBuffer> tileImage;
- if (!SVGImageBufferTools::createImageBuffer(tileRect, tileRect, tileImage, ColorSpaceDeviceRGB))
+ if (!SVGImageBufferTools::createImageBuffer(tileRect, tileRect, tileImage, ColorSpaceDeviceRGB, filter()->renderingMode()))
return;
GraphicsContext* tileImageContext = tileImage->context();
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (102087 => 102088)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -32,6 +32,7 @@
class Filter : public RefCounted<Filter> {
public:
+ Filter() : m_renderingMode(Unaccelerated) { }
virtual ~Filter() { }
void setSourceImage(PassOwnPtr<ImageBuffer> sourceImage) { m_sourceImage = sourceImage; }
@@ -40,6 +41,9 @@
FloatSize filterResolution() const { return m_filterResolution; }
void setFilterResolution(const FloatSize& filterResolution) { m_filterResolution = filterResolution; }
+ RenderingMode renderingMode() const { return m_renderingMode; }
+ void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }
+
virtual float applyHorizontalScale(float value) const { return value * m_filterResolution.width(); }
virtual float applyVerticalScale(float value) const { return value * m_filterResolution.height(); }
@@ -51,6 +55,7 @@
private:
OwnPtr<ImageBuffer> m_sourceImage;
FloatSize m_filterResolution;
+ RenderingMode m_renderingMode;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp (102087 => 102088)
--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -118,7 +118,7 @@
return 0;
if (m_imageBufferResult)
return m_imageBufferResult.get();
- m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB);
+ m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB, m_filter->renderingMode());
IntRect destinationRect(IntPoint(), m_absolutePaintRect.size());
if (m_premultipliedImageResult)
m_imageBufferResult->putPremultipliedImageData(m_premultipliedImageResult.get(), destinationRect.size(), destinationRect, IntPoint());
@@ -255,7 +255,7 @@
ASSERT(!hasResult());
if (m_absolutePaintRect.isEmpty())
return 0;
- m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB);
+ m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB, m_filter->renderingMode());
if (!m_imageBufferResult)
return 0;
ASSERT(m_imageBufferResult->context());
Modified: trunk/Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp (102087 => 102088)
--- trunk/Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -178,6 +178,10 @@
void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable)
{
+ // FIXME: Disable color space conversions on accelerated canvases (for now).
+ if (m_data.m_platformContext.isAccelerated())
+ return;
+
const SkBitmap& bitmap = *context()->platformContext()->bitmap();
if (bitmap.isNull())
return;
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -179,7 +179,7 @@
FloatRect clampedAbsoluteTargetRect = SVGImageBufferTools::clampedAbsoluteTargetRect(absoluteTargetRect);
if (shouldCreateClipData && !clampedAbsoluteTargetRect.isEmpty()) {
- if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, clipperData->clipMaskImage, ColorSpaceDeviceRGB))
+ if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, clipperData->clipMaskImage, ColorSpaceDeviceRGB, Unaccelerated))
return false;
GraphicsContext* maskContext = clipperData->clipMaskImage->context();
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -35,8 +35,10 @@
#include "ImageBuffer.h"
#include "ImageData.h"
#include "IntRect.h"
+#include "Page.h"
#include "RenderSVGResource.h"
#include "RenderSVGResourceFilterPrimitive.h"
+#include "Settings.h"
#include "SVGElement.h"
#include "SVGFilter.h"
#include "SVGFilterElement.h"
@@ -229,13 +231,17 @@
absoluteDrawingRegion.scale(scale.width(), scale.height());
OwnPtr<ImageBuffer> sourceGraphic;
- if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB)) {
+ RenderingMode renderingMode = object->document()->page()->settings()->acceleratedFiltersEnabled() ? Accelerated : Unaccelerated;
+ if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB, renderingMode)) {
ASSERT(!m_filter.contains(object));
filterData->savedContext = context;
m_filter.set(object, filterData.leakPtr());
return false;
}
+ // Set the rendering mode from the page's settings.
+ filterData->filter->setRenderingMode(renderingMode);
+
GraphicsContext* sourceGraphicContext = sourceGraphic->context();
ASSERT(sourceGraphicContext);
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -92,7 +92,7 @@
return false;
OwnPtr<ImageBuffer> maskImage;
- if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskImage, ColorSpaceDeviceRGB))
+ if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskImage, ColorSpaceDeviceRGB, Unaccelerated))
return false;
GraphicsContext* maskImageContext = maskImage->context();
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -106,7 +106,7 @@
const SVGRenderStyle* svgStyle = style()->svgStyle();
ASSERT(svgStyle);
ColorSpace colorSpace = svgStyle->colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB;
- if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskerData->maskImage, colorSpace))
+ if (!SVGImageBufferTools::createImageBuffer(absoluteTargetRect, clampedAbsoluteTargetRect, maskerData->maskImage, colorSpace, Unaccelerated))
return false;
GraphicsContext* maskImageContext = maskerData->maskImage->context();
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -252,7 +252,7 @@
OwnPtr<ImageBuffer> tileImage;
- if (!SVGImageBufferTools::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, tileImage, ColorSpaceDeviceRGB))
+ if (!SVGImageBufferTools::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, tileImage, ColorSpaceDeviceRGB, Unaccelerated))
return nullptr;
GraphicsContext* tileImageContext = tileImage->context();
Modified: trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -52,7 +52,7 @@
}
}
-bool SVGImageBufferTools::createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>& imageBuffer, ColorSpace colorSpace)
+bool SVGImageBufferTools::createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>& imageBuffer, ColorSpace colorSpace, RenderingMode renderingMode)
{
IntSize imageSize(roundedImageBufferSize(clampedAbsoluteTargetRect.size()));
IntSize unclampedImageSize(SVGImageBufferTools::roundedImageBufferSize(absoluteTargetRect.size()));
@@ -61,7 +61,7 @@
if (imageSize.isEmpty())
return false;
- OwnPtr<ImageBuffer> image = ImageBuffer::create(imageSize, colorSpace);
+ OwnPtr<ImageBuffer> image = ImageBuffer::create(imageSize, colorSpace, renderingMode);
if (!image)
return false;
Modified: trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.h (102087 => 102088)
--- trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/rendering/svg/SVGImageBufferTools.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -35,7 +35,7 @@
class SVGImageBufferTools {
WTF_MAKE_NONCOPYABLE(SVGImageBufferTools);
public:
- static bool createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, ColorSpace);
+ static bool createImageBuffer(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, ColorSpace, RenderingMode);
static void renderSubtreeToImageBuffer(ImageBuffer*, RenderObject*, const AffineTransform&);
static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&);
Modified: trunk/Source/WebCore/testing/Internals.cpp (102087 => 102088)
--- trunk/Source/WebCore/testing/Internals.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/testing/Internals.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -314,6 +314,16 @@
document->settings()->setAcceleratedDrawingEnabled(enabled);
}
+void Internals::setAcceleratedFiltersEnabled(Document* document, bool enabled, ExceptionCode& ec)
+{
+ if (!document || !document->settings()) {
+ ec = INVALID_ACCESS_ERR;
+ return;
+ }
+
+ document->settings()->setAcceleratedFiltersEnabled(enabled);
+}
+
void Internals::setEnableScrollAnimator(Document* document, bool enabled, ExceptionCode& ec)
{
if (!document || !document->settings()) {
Modified: trunk/Source/WebCore/testing/Internals.h (102087 => 102088)
--- trunk/Source/WebCore/testing/Internals.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/testing/Internals.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -79,6 +79,7 @@
void setEnableCompositingForFixedPosition(Document*, bool enabled, ExceptionCode&);
void setEnableCompositingForScrollableFrames(Document*, bool enabled, ExceptionCode&);
void setAcceleratedDrawingEnabled(Document*, bool enabled, ExceptionCode&);
+ void setAcceleratedFiltersEnabled(Document*, bool enabled, ExceptionCode&);
void setEnableScrollAnimator(Document*, bool enabled, ExceptionCode&);
void setZoomAnimatorTransform(Document*, float scale, float tx, float ty, ExceptionCode&);
Modified: trunk/Source/WebCore/testing/Internals.idl (102087 => 102088)
--- trunk/Source/WebCore/testing/Internals.idl 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebCore/testing/Internals.idl 2011-12-06 04:16:28 UTC (rev 102088)
@@ -52,6 +52,7 @@
void setEnableCompositingForFixedPosition(in Document document, in boolean enabled) raises(DOMException);
void setEnableCompositingForScrollableFrames(in Document document, in boolean enabled) raises(DOMException);
void setAcceleratedDrawingEnabled(in Document document, in boolean enabled) raises(DOMException);
+ void setAcceleratedFiltersEnabled(in Document document, in boolean enabled) raises(DOMException);
void setEnableScrollAnimator(in Document document, in boolean enabled) raises(DOMException);
void setZoomAnimatorTransform(in Document document, in float scale, in float tx, in float ty) raises(DOMException);
float getPageScaleFactor(in Document document) raises(DOMException);
Modified: trunk/Source/WebKit/chromium/ChangeLog (102087 => 102088)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-12-06 04:16:28 UTC (rev 102088)
@@ -1,3 +1,15 @@
+2011-12-05 Stephen White <[email protected]>
+
+ Allow the ImageBuffers used by SVG filters to be accelerated
+ https://bugs.webkit.org/show_bug.cgi?id=73842
+
+ Reviewed by Kenneth Russell.
+
+ * public/WebSettings.h:
+ * src/WebSettingsImpl.cpp:
+ (WebKit::WebSettingsImpl::setAcceleratedFiltersEnabled):
+ * src/WebSettingsImpl.h:
+
2011-12-05 Adam Barth <[email protected]>
[Chromium] Chromium fails to compile due to missing WebContentLayerClient.h
Modified: trunk/Source/WebKit/chromium/public/WebSettings.h (102087 => 102088)
--- trunk/Source/WebKit/chromium/public/WebSettings.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebKit/chromium/public/WebSettings.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -117,6 +117,7 @@
virtual void setLegacyAccelerated2dCanvasEnabled(bool) = 0;
virtual void setMinimumAccelerated2dCanvasSize(int) = 0;
virtual void setAcceleratedDrawingEnabled(bool) = 0;
+ virtual void setAcceleratedFiltersEnabled(bool) = 0;
virtual void setMemoryInfoEnabled(bool) = 0;
virtual void setHyperlinkAuditingEnabled(bool) = 0;
virtual void setAsynchronousSpellCheckingEnabled(bool) = 0;
Modified: trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp (102087 => 102088)
--- trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp 2011-12-06 04:16:28 UTC (rev 102088)
@@ -358,6 +358,11 @@
m_settings->setAcceleratedDrawingEnabled(enabled);
}
+void WebSettingsImpl::setAcceleratedFiltersEnabled(bool enabled)
+{
+ m_settings->setAcceleratedFiltersEnabled(enabled);
+}
+
void WebSettingsImpl::setAccelerated2dCanvasEnabled(bool enabled)
{
m_settings->setAccelerated2dCanvasEnabled(enabled);
Modified: trunk/Source/WebKit/chromium/src/WebSettingsImpl.h (102087 => 102088)
--- trunk/Source/WebKit/chromium/src/WebSettingsImpl.h 2011-12-06 04:07:02 UTC (rev 102087)
+++ trunk/Source/WebKit/chromium/src/WebSettingsImpl.h 2011-12-06 04:16:28 UTC (rev 102088)
@@ -109,6 +109,7 @@
virtual void setLegacyAccelerated2dCanvasEnabled(bool);
virtual void setMinimumAccelerated2dCanvasSize(int);
virtual void setAcceleratedDrawingEnabled(bool);
+ virtual void setAcceleratedFiltersEnabled(bool);
virtual void setMemoryInfoEnabled(bool);
virtual void setHyperlinkAuditingEnabled(bool);
virtual void setAsynchronousSpellCheckingEnabled(bool);