| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/graphics/OffscreenCanvasFrameDispatcherImpl.h" | 5 #include "platform/graphics/OffscreenCanvasFrameDispatcherImpl.h" |
| 6 | 6 |
| 7 #include "cc/output/compositor_frame.h" | 7 #include "cc/output/compositor_frame.h" |
| 8 #include "cc/quads/texture_draw_quad.h" | 8 #include "cc/quads/texture_draw_quad.h" |
| 9 #include "gpu/command_buffer/client/gles2_interface.h" | 9 #include "gpu/command_buffer/client/gles2_interface.h" |
| 10 #include "platform/CrossThreadFunctional.h" | 10 #include "platform/CrossThreadFunctional.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 if (!bitmap) | 63 if (!bitmap) |
| 64 return; | 64 return; |
| 65 unsigned char* pixels = bitmap->pixels(); | 65 unsigned char* pixels = bitmap->pixels(); |
| 66 DCHECK(pixels); | 66 DCHECK(pixels); |
| 67 SkImageInfo imageInfo = SkImageInfo::Make( | 67 SkImageInfo imageInfo = SkImageInfo::Make( |
| 68 m_width, m_height, kN32_SkColorType, | 68 m_width, m_height, kN32_SkColorType, |
| 69 image->isPremultiplied() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); | 69 image->isPremultiplied() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); |
| 70 // TODO(xlai): Optimize to avoid copying pixels. See crbug.com/651456. | 70 // TODO(xlai): Optimize to avoid copying pixels. See crbug.com/651456. |
| 71 // However, in the case when |image| is texture backed, this function call | 71 // However, in the case when |image| is texture backed, this function call |
| 72 // does a GPU readback which is required. | 72 // does a GPU readback which is required. |
| 73 image->imageForCurrentFrame()->readPixels(imageInfo, pixels, | 73 // TODO(ccameron): Canvas should produce sRGB images. |
| 74 imageInfo.minRowBytes(), 0, 0); | 74 // https://crbug.com/672299 |
| 75 image->imageForCurrentFrame(ColorBehavior::transformToGlobalTarget()) |
| 76 ->readPixels(imageInfo, pixels, imageInfo.minRowBytes(), 0, 0); |
| 75 resource.mailbox_holder.mailbox = bitmap->id(); | 77 resource.mailbox_holder.mailbox = bitmap->id(); |
| 76 resource.mailbox_holder.texture_target = 0; | 78 resource.mailbox_holder.texture_target = 0; |
| 77 resource.is_software = true; | 79 resource.is_software = true; |
| 78 | 80 |
| 79 // Hold ref to |bitmap|, to keep it alive until the browser ReclaimResources. | 81 // Hold ref to |bitmap|, to keep it alive until the browser ReclaimResources. |
| 80 // It guarantees that the shared bitmap is not re-used or deleted. | 82 // It guarantees that the shared bitmap is not re-used or deleted. |
| 81 m_sharedBitmaps.add(m_nextResourceId, std::move(bitmap)); | 83 m_sharedBitmaps.add(m_nextResourceId, std::move(bitmap)); |
| 82 } | 84 } |
| 83 | 85 |
| 84 void OffscreenCanvasFrameDispatcherImpl:: | 86 void OffscreenCanvasFrameDispatcherImpl:: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 98 SkImageInfo info = SkImageInfo::Make( | 100 SkImageInfo info = SkImageInfo::Make( |
| 99 m_width, m_height, kN32_SkColorType, | 101 m_width, m_height, kN32_SkColorType, |
| 100 image->isPremultiplied() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); | 102 image->isPremultiplied() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); |
| 101 RefPtr<ArrayBuffer> dstBuffer = | 103 RefPtr<ArrayBuffer> dstBuffer = |
| 102 ArrayBuffer::createOrNull(m_width * m_height, info.bytesPerPixel()); | 104 ArrayBuffer::createOrNull(m_width * m_height, info.bytesPerPixel()); |
| 103 // If it fails to create a buffer for copying the pixel data, then exit early. | 105 // If it fails to create a buffer for copying the pixel data, then exit early. |
| 104 if (!dstBuffer) | 106 if (!dstBuffer) |
| 105 return; | 107 return; |
| 106 RefPtr<Uint8Array> dstPixels = | 108 RefPtr<Uint8Array> dstPixels = |
| 107 Uint8Array::create(dstBuffer, 0, dstBuffer->byteLength()); | 109 Uint8Array::create(dstBuffer, 0, dstBuffer->byteLength()); |
| 108 image->imageForCurrentFrame()->readPixels(info, dstPixels->data(), | 110 // TODO(ccameron): Canvas should produce sRGB images. |
| 109 info.minRowBytes(), 0, 0); | 111 // https://crbug.com/672299 |
| 112 image->imageForCurrentFrame(ColorBehavior::transformToGlobalTarget()) |
| 113 ->readPixels(info, dstPixels->data(), info.minRowBytes(), 0, 0); |
| 110 | 114 |
| 111 GLuint textureId = 0u; | 115 GLuint textureId = 0u; |
| 112 gl->GenTextures(1, &textureId); | 116 gl->GenTextures(1, &textureId); |
| 113 gl->BindTexture(GL_TEXTURE_2D, textureId); | 117 gl->BindTexture(GL_TEXTURE_2D, textureId); |
| 114 GLenum format = | 118 GLenum format = |
| 115 (kN32_SkColorType == kRGBA_8888_SkColorType) ? GL_RGBA : GL_BGRA_EXT; | 119 (kN32_SkColorType == kRGBA_8888_SkColorType) ? GL_RGBA : GL_BGRA_EXT; |
| 116 gl->TexImage2D(GL_TEXTURE_2D, 0, format, m_width, m_height, 0, format, | 120 gl->TexImage2D(GL_TEXTURE_2D, 0, format, m_width, m_height, 0, format, |
| 117 GL_UNSIGNED_BYTE, 0); | 121 GL_UNSIGNED_BYTE, 0); |
| 118 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 122 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 119 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 123 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 return true; | 409 return true; |
| 406 return false; | 410 return false; |
| 407 } | 411 } |
| 408 | 412 |
| 409 void OffscreenCanvasFrameDispatcherImpl::reshape(int width, int height) { | 413 void OffscreenCanvasFrameDispatcherImpl::reshape(int width, int height) { |
| 410 m_width = width; | 414 m_width = width; |
| 411 m_height = height; | 415 m_height = height; |
| 412 } | 416 } |
| 413 | 417 |
| 414 } // namespace blink | 418 } // namespace blink |
| OLD | NEW |