void WebMediaPlayerClientImpl::paintOnAndroid(WebCore::GraphicsContext* context, const IntRect& rect, uint8_t alpha) { OwnPtr<blink::WebGraphicsContext3DProvider> provider = adoptPtr(blink::Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (!provider) return; WebGraphicsContext3D* context3D = provider->context3d(); if (!context || !context3D || !m_webMediaPlayer || context->paintingDisabled()) return; if (!context3D->makeContextCurrent()) return; // Copy video texture into a RGBA texture based bitmap first as video texture on Android is GL_TEXTURE_EXTERNAL_OES // which is not supported by Skia yet. The bitmap's size needs to be the same as the video and use naturalSize() here. // Check if we could reuse existing texture based bitmap. // Otherwise, release existing texture based bitmap and allocate a new one based on video size. if (!ensureTextureBackedSkBitmap(provider->grContext(), m_bitmap, m_webMediaPlayer->naturalSize(), kTopLeft_GrSurfaceOrigin, kSkia8888_GrPixelConfig)) return; // Copy video texture to bitmap texture. WebCanvas* canvas = context->canvas(); unsigned textureId = static_cast<unsigned>((m_bitmap.getTexture())->getTextureHandle()); if (!m_webMediaPlayer->copyVideoTextureToPlatformTexture(context3D, textureId, 0, GL_RGBA, GL_UNSIGNED_BYTE, true, false)) return; // Draw the texture based bitmap onto the Canvas. If the canvas is hardware based, this will do a GPU-GPU texture copy. If the canvas is software based, // the texture based bitmap will be readbacked to system memory then draw onto the canvas. SkRect dest; dest.set(rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height()); SkPaint paint; paint.setAlpha(alpha); // It is not necessary to pass the dest into the drawBitmap call since all the context have been set up before calling paintCurrentFrameInContext. canvas->drawBitmapRect(m_bitmap, NULL, dest, &paint); }
WebGLImageBufferSurface::WebGLImageBufferSurface(const IntSize& size, OpacityMode opacityMode) : ImageBufferSurface(size, opacityMode) { m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (!m_contextProvider) return; GrContext* gr = m_contextProvider->grContext(); if (!gr) return; ensureTextureBackedSkBitmap(gr, m_bitmap, size, kDefault_GrSurfaceOrigin, kRGBA_8888_GrPixelConfig); }