Chromium Code Reviews| Index: Source/platform/graphics/gpu/DrawingBuffer.cpp |
| diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| index 60a9d9862c845d8daf7e086ded9f085bd0552242..5996ff8feb6ead894f07fc13219b828fe4c38253 100644 |
| --- a/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| +++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| @@ -459,7 +459,7 @@ bool DrawingBuffer::initialize(const IntSize& size) |
| } |
| bool DrawingBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, |
| - GLenum destType, GLint level, bool premultiplyAlpha, bool flipY, SourceBuffer source) |
| + GLenum destType, GLint level, bool premultiplyAlpha, bool flipY, SourceDrawingBuffer sourceBuffer) |
| { |
| if (m_contentsChanged) { |
| if (m_multisampleMode != None) { |
| @@ -478,7 +478,7 @@ bool DrawingBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platfor |
| // Contexts may be in a different share group. We must transfer the texture through a mailbox first |
| WebExternalTextureMailbox mailbox; |
| GLint textureId = 0; |
| - if (source == Front && m_frontColorBuffer.texInfo.textureId) { |
| + if (sourceBuffer == FrontBuffer && m_frontColorBuffer.texInfo.textureId) { |
| textureId = m_frontColorBuffer.texInfo.textureId; |
| mailbox = m_frontColorBuffer.mailbox; |
| } else { |
| @@ -887,7 +887,7 @@ void DrawingBuffer::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer) |
| paintFramebufferToCanvas(framebuffer(), size().width(), size().height(), !m_actualAttributes.premultipliedAlpha, imageBuffer); |
| } |
| -PassRefPtr<Uint8ClampedArray> DrawingBuffer::paintRenderingResultsToImageData(int& width, int& height) |
| +PassRefPtr<Uint8ClampedArray> DrawingBuffer::paintRenderingResultsToImageData(int& width, int& height, SourceDrawingBuffer sourceBuffer) |
| { |
| if (m_actualAttributes.premultipliedAlpha) |
| return nullptr; |
| @@ -903,10 +903,29 @@ PassRefPtr<Uint8ClampedArray> DrawingBuffer::paintRenderingResultsToImageData(in |
| RefPtr<Uint8ClampedArray> pixels = Uint8ClampedArray::createUninitialized(width * height * 4); |
| - m_context->bindFramebuffer(GL_FRAMEBUFFER, framebuffer()); |
| + GLint fbo = 0; |
| + if (sourceBuffer == FrontBuffer && m_frontColorBuffer.texInfo.textureId) { |
| + GLint fbo = m_context->createFramebuffer(); |
|
Yuki
2014/11/27 04:30:22
Hi dongseong.hwang,
It seems that you're shadowin
dshwang
2014/11/27 09:46:30
Thank you very much for noting! it's a mistake.
|
| + m_context->bindFramebuffer(GL_FRAMEBUFFER, fbo); |
| + m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_frontColorBuffer.texInfo.textureId, 0); |
| + } else { |
| + m_context->bindFramebuffer(GL_FRAMEBUFFER, framebuffer()); |
| + } |
| + |
| readBackFramebuffer(pixels->data(), width, height, ReadbackRGBA, WebGLImageConversion::AlphaDoNothing); |
| flipVertically(pixels->data(), width, height); |
| + if (fbo) { |
| + m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); |
| + m_context->deleteFramebuffer(fbo); |
| + } |
| + |
| + if (m_framebufferBinding) { |
| + restoreFramebufferBinding(); |
| + } else { |
| + bind(); |
| + } |
| + |
| return pixels.release(); |
| } |