| Index: content/renderer/media/renderer_gpu_video_accelerator_factories.cc
|
| diff --git a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
|
| index 2d87c218cce59f62145fea34b07087a2bb2aa4be..94e0d78217fa621974b945fd79bbaee2756e8fd3 100644
|
| --- a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
|
| +++ b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
|
| @@ -200,12 +200,22 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels(
|
| gles2->FramebufferTexture2D(
|
| GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_texture, 0);
|
| gles2->PixelStorei(GL_PACK_ALIGNMENT, 4);
|
| +
|
| #if SK_B32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_R32_SHIFT == 16 && \
|
| SK_A32_SHIFT == 24
|
| GLenum skia_format = GL_BGRA_EXT;
|
| + GLenum read_format = GL_BGRA_EXT;
|
| + GLint supported_format = 0;
|
| + GLint supported_type = 0;
|
| + gles2->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &supported_format);
|
| + gles2->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &supported_type);
|
| + if (supported_format != GL_BGRA_EXT || supported_type != GL_UNSIGNED_BYTE) {
|
| + read_format = GL_RGBA;
|
| + }
|
| #elif SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \
|
| SK_A32_SHIFT == 24
|
| GLenum skia_format = GL_RGBA;
|
| + GLenum read_format = GL_RGBA;
|
| #else
|
| #error Unexpected Skia ARGB_8888 layout!
|
| #endif
|
| @@ -213,11 +223,28 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels(
|
| visible_rect.y(),
|
| visible_rect.width(),
|
| visible_rect.height(),
|
| - skia_format,
|
| + read_format,
|
| GL_UNSIGNED_BYTE,
|
| pixels.pixelRef()->pixels());
|
| gles2->DeleteFramebuffers(1, &fb);
|
| gles2->DeleteTextures(1, &tmp_texture);
|
| +
|
| + if (skia_format != read_format) {
|
| + DCHECK(read_format == GL_RGBA);
|
| + int pixel_count = visible_rect.width() * visible_rect.height();
|
| + uint32_t* pixels_ptr = static_cast<uint32_t*>(pixels.pixelRef()->pixels());
|
| + for (int i = 0; i < pixel_count; ++i) {
|
| + uint32_t r = pixels_ptr[i] & 0xFF;
|
| + uint32_t g = (pixels_ptr[i] >> 8) & 0xFF;
|
| + uint32_t b = (pixels_ptr[i] >> 16) & 0xFF;
|
| + uint32_t a = (pixels_ptr[i] >> 24) & 0xFF;
|
| + pixels_ptr[i] = (r << SK_R32_SHIFT) |
|
| + (g << SK_G32_SHIFT) |
|
| + (b << SK_B32_SHIFT) |
|
| + (a << SK_A32_SHIFT);
|
| + }
|
| + }
|
| +
|
| DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
|
| }
|
|
|
|
|