bool ImageBuffer::copyToPlatformTexture(GraphicsContext3D& context, Platform3DObject texture, GC3Denum internalFormat, GC3Denum destType, GC3Dint level, bool premultiplyAlpha, bool flipY) { if (!m_layerBridge || !platformLayer() || !isValid()) return false; Platform3DObject sourceTexture = m_layerBridge->backBufferTexture(); if (!context.makeContextCurrent()) return false; Extensions3D* extensions = context.extensions(); if (!extensions->supports("GL_CHROMIUM_copy_texture") || !extensions->supports("GL_CHROMIUM_flipy") || !extensions->canUseCopyTextureCHROMIUM(internalFormat, destType, level)) return false; // The canvas is stored in a premultiplied format, so unpremultiply if necessary. context.pixelStorei(Extensions3D::UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, !premultiplyAlpha); // The canvas is stored in an inverted position, so the flip semantics are reversed. context.pixelStorei(Extensions3D::UNPACK_FLIP_Y_CHROMIUM, !flipY); extensions->copyTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, sourceTexture, texture, level, internalFormat, destType); context.pixelStorei(Extensions3D::UNPACK_FLIP_Y_CHROMIUM, false); context.pixelStorei(Extensions3D::UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, false); context.flush(); return true; }
bool WebMediaPlayerClientImpl::copyVideoTextureToPlatformTexture(WebCore::GraphicsContext3D* context, Platform3DObject texture, GC3Dint level, GC3Denum type, GC3Denum internalFormat, bool premultiplyAlpha, bool flipY) { if (!context || !m_webMediaPlayer) return false; Extensions3D* extensions = context->extensions(); if (!extensions || !extensions->supports("GL_CHROMIUM_copy_texture") || !extensions->supports("GL_CHROMIUM_flipy") || !extensions->canUseCopyTextureCHROMIUM(internalFormat, type, level) || !context->makeContextCurrent()) return false; WebGraphicsContext3D* webGraphicsContext3D = context->webContext(); return m_webMediaPlayer->copyVideoTextureToPlatformTexture(webGraphicsContext3D, texture, level, internalFormat, type, premultiplyAlpha, flipY); }