Index: Source/core/html/HTMLCanvasElement.cpp |
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp |
index f251bd5cf0b7c20519e04e5ed8d89827412f57ce..1ad92cd8df0b7757df45f909bcad59c4c0d59d98 100644 |
--- a/Source/core/html/HTMLCanvasElement.cpp |
+++ b/Source/core/html/HTMLCanvasElement.cpp |
@@ -473,6 +473,47 @@ bool HTMLCanvasElement::shouldAccelerate(const IntSize& size) const |
return true; |
} |
+class UnacceleratedSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory { |
+public: |
+ virtual PassOwnPtr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode) |
+ { |
+ return adoptPtr(new UnacceleratedImageBufferSurface(size, opacityMode)); |
+ } |
+ |
+ virtual ~UnacceleratedSurfaceFactory() { } |
+}; |
+ |
+class Accelerated2dSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory { |
+public: |
+ Accelerated2dSurfaceFactory(int msaaSampleCount) : m_msaaSampleCount(msaaSampleCount) { } |
+ |
+ virtual PassOwnPtr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode) |
+ { |
+ OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSurface(size, opacityMode, m_msaaSampleCount)); |
+ if (surface->isValid()) |
+ return surface.release(); |
+ return adoptPtr(new UnacceleratedImageBufferSurface(size, opacityMode)); |
+ } |
+ |
+ virtual ~Accelerated2dSurfaceFactory() { } |
+private: |
+ int m_msaaSampleCount; |
+}; |
+ |
+PassOwnPtr<RecordingImageBufferFallbackSurfaceFactory> HTMLCanvasElement::createSurfaceFactory(const IntSize& deviceSize, int* msaaSampleCount) const |
+{ |
+ *msaaSampleCount = 0; |
+ OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory; |
+ if (shouldAccelerate(deviceSize)) { |
+ if (document().settings()) |
+ *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASampleCount(); |
+ surfaceFactory = adoptPtr(new Accelerated2dSurfaceFactory(*msaaSampleCount)); |
+ } else { |
+ surfaceFactory = adoptPtr(new UnacceleratedSurfaceFactory()); |
+ } |
+ return surfaceFactory.release(); |
+} |
+ |
PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const IntSize& deviceSize, int* msaaSampleCount) |
{ |
OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque : Opaque; |
@@ -486,25 +527,20 @@ PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const |
// FIXME: Actually, avoid setting m_accelerationDisabled at all when |
// doing GPU-based rasterization. |
if (m_accelerationDisabled) |
- return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode)); |
- return adoptPtr(new WebGLImageBufferSurface(size(), opacityMode)); |
+ return adoptPtr(new UnacceleratedImageBufferSurface(deviceSize, opacityMode)); |
+ return adoptPtr(new WebGLImageBufferSurface(deviceSize, opacityMode)); |
} |
- if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) { |
- OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSurface(size(), opacityMode)); |
- if (surface->isValid()) |
- return surface.release(); |
- } |
+ OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); |
- if (shouldAccelerate(deviceSize)) { |
- if (document().settings()) |
- *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASampleCount(); |
- OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSurface(size(), opacityMode, *msaaSampleCount)); |
+ if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) { |
+ OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSurface(deviceSize, surfaceFactory.release(), opacityMode)); |
if (surface->isValid()) |
return surface.release(); |
+ surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); // recreate because old previous one was released |
} |
- return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode)); |
+ return surfaceFactory->createSurface(deviceSize, opacityMode); |
} |
void HTMLCanvasElement::createImageBuffer() |