diff options
Diffstat (limited to 'Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp')
-rw-r--r-- | Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp b/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp index 3d937ac..54c18e3 100644 --- a/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp +++ b/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp @@ -82,6 +82,7 @@ namespace WebCore { GraphicsContext3DInternal::GraphicsContext3DInternal() : m_webViewImpl(0) , m_initializedAvailableExtensions(false) + , m_layerComposited(false) #if USE(SKIA) #elif PLATFORM(CG) , m_renderOutput(0) @@ -160,6 +161,24 @@ WebGLLayerChromium* GraphicsContext3DInternal::platformLayer() const } #endif +void GraphicsContext3DInternal::markContextChanged() +{ +#if USE(ACCELERATED_COMPOSITING) + platformLayer()->setTextureUpdated(); +#endif + m_layerComposited = false; +} + +void GraphicsContext3DInternal::markLayerComposited() +{ + m_layerComposited = true; +} + +bool GraphicsContext3DInternal::layerComposited() const +{ + return m_layerComposited; +} + void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingContext* context) { HTMLCanvasElement* canvas = context->canvas(); @@ -200,6 +219,16 @@ void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingCon m_impl->readBackFramebuffer(pixels, 4 * m_impl->width() * m_impl->height()); + if (!m_impl->getContextAttributes().premultipliedAlpha) { + size_t bufferSize = 4 * m_impl->width() * m_impl->height(); + + for (size_t i = 0; i < bufferSize; i += 4) { + pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255); + pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255); + pixels[i + 2] = std::min(255, pixels[i + 2] * pixels[i + 3] / 255); + } + } + #if USE(SKIA) if (m_resizingBitmap.readyToDraw()) { // We need to draw the resizing bitmap into the canvas's backing store. @@ -218,6 +247,23 @@ void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingCon #endif } +PassRefPtr<ImageData> GraphicsContext3DInternal::paintRenderingResultsToImageData() +{ + if (m_impl->getContextAttributes().premultipliedAlpha) + return 0; + + RefPtr<ImageData> imageData = ImageData::create(IntSize(m_impl->width(), m_impl->height())); + unsigned char* pixels = imageData->data()->data()->data(); + size_t bufferSize = 4 * m_impl->width() * m_impl->height(); + + m_impl->readBackFramebuffer(pixels, bufferSize); + + for (size_t i = 0; i < bufferSize; i += 4) + std::swap(pixels[i], pixels[i + 2]); + + return imageData.release(); +} + bool GraphicsContext3DInternal::paintsIntoCanvasBuffer() const { // If the gpu compositor is on then skip the readback and software rendering path. @@ -1058,7 +1104,16 @@ DELEGATE_TO_INTERNAL_6(vertexAttribPointer, GC3Duint, GC3Dint, GC3Denum, GC3Dboo DELEGATE_TO_INTERNAL_4(viewport, GC3Dint, GC3Dint, GC3Dsizei, GC3Dsizei) +DELEGATE_TO_INTERNAL(markLayerComposited) +DELEGATE_TO_INTERNAL(markContextChanged) + +bool GraphicsContext3D::layerComposited() const +{ + return m_internal->layerComposited(); +} + DELEGATE_TO_INTERNAL_1(paintRenderingResultsToCanvas, CanvasRenderingContext*) +DELEGATE_TO_INTERNAL_R(paintRenderingResultsToImageData, PassRefPtr<ImageData>) bool GraphicsContext3D::paintsIntoCanvasBuffer() const { |