Index: Source/core/html/HTMLCanvasElement.cpp |
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp |
index 1c2a8180f7870b72fc0a0db4e3acf48a3e621790..f8db1d2de7de8a593be8143c001474461dc517f7 100644 |
--- a/Source/core/html/HTMLCanvasElement.cpp |
+++ b/Source/core/html/HTMLCanvasElement.cpp |
@@ -591,7 +591,7 @@ PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const |
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 |
+ surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); // recreate because previous one was released |
} |
return surfaceFactory->createSurface(deviceSize, opacityMode); |
@@ -599,12 +599,12 @@ PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const |
void HTMLCanvasElement::createImageBuffer() |
{ |
- createImageBufferInternal(); |
+ createImageBufferInternal(nullptr); |
if (m_didFailToCreateImageBuffer && m_context->is2d()) |
toCanvasRenderingContext2D(m_context.get())->loseContext(); |
} |
-void HTMLCanvasElement::createImageBufferInternal() |
+void HTMLCanvasElement::createImageBufferInternal(PassOwnPtr<ImageBufferSurface> externalSurface) |
{ |
ASSERT(!m_imageBuffer); |
ASSERT(!m_contextStateSaver); |
@@ -615,8 +615,13 @@ void HTMLCanvasElement::createImageBufferInternal() |
if (!canCreateImageBuffer(size())) |
return; |
- int msaaSampleCount; |
- OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaSampleCount); |
+ int msaaSampleCount = 0; |
+ OwnPtr<ImageBufferSurface> surface; |
+ if (externalSurface) { |
+ surface = externalSurface; |
+ } else { |
+ surface = createImageBufferSurface(size(), &msaaSampleCount); |
+ } |
m_imageBuffer = ImageBuffer::create(surface.release()); |
if (!m_imageBuffer) |
return; |
@@ -732,6 +737,12 @@ ImageBuffer* HTMLCanvasElement::buffer() const |
return m_imageBuffer.get(); |
} |
+void HTMLCanvasElement::createImageBufferUsingSurface(PassOwnPtr<ImageBufferSurface> surface) |
+{ |
+ discardImageBuffer(); |
+ createImageBufferInternal(surface); |
+} |
+ |
void HTMLCanvasElement::ensureUnacceleratedImageBuffer() |
{ |
ASSERT(m_context); |
@@ -855,4 +866,9 @@ FloatSize HTMLCanvasElement::sourceSize() const |
return FloatSize(width(), height()); |
} |
+bool HTMLCanvasElement::isOpaque() const |
+{ |
+ return m_context && !m_context->hasAlpha(); |
} |
+ |
+} // blink |