Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Unified Diff: Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp

Issue 7664004: Merge 92908 - Readback composited webgl results for printing (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
===================================================================
--- Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp (revision 93076)
+++ Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp (working copy)
@@ -90,7 +90,7 @@
#if USE(SKIA)
, m_grContext(0)
#elif USE(CG)
- , m_renderOutput(0)
+ , m_renderOutputSize(0)
#else
#error Must port to your platform
#endif
@@ -99,10 +99,6 @@
GraphicsContext3DInternal::~GraphicsContext3DInternal()
{
-#if USE(CG)
- if (m_renderOutput)
- delete[] m_renderOutput;
-#endif
#if USE(SKIA)
if (m_grContext) {
m_grContext->contextDestroyed();
@@ -205,16 +201,15 @@
return m_layerComposited;
}
-void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
+void GraphicsContext3DInternal::paintFramebufferToCanvas(int framebuffer, int width, int height, bool premultiplyAlpha, ImageBuffer* imageBuffer)
{
- HTMLCanvasElement* canvas = context->canvas();
- ImageBuffer* imageBuffer = canvas->buffer();
unsigned char* pixels = 0;
+ size_t bufferSize = 4 * width * height;
#if USE(SKIA)
const SkBitmap* canvasBitmap = imageBuffer->context()->platformContext()->bitmap();
const SkBitmap* readbackBitmap = 0;
ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config);
- if (canvasBitmap->width() == m_impl->width() && canvasBitmap->height() == m_impl->height()) {
+ if (canvasBitmap->width() == width && canvasBitmap->height() == height) {
// This is the fastest and most common case. We read back
// directly into the canvas's backing store.
readbackBitmap = canvasBitmap;
@@ -223,10 +218,10 @@
// We need to allocate a temporary bitmap for reading back the
// pixel data. We will then use Skia to rescale this bitmap to
// the size of the canvas's backing store.
- if (m_resizingBitmap.width() != m_impl->width() || m_resizingBitmap.height() != m_impl->height()) {
+ if (m_resizingBitmap.width() != width || m_resizingBitmap.height() != height) {
m_resizingBitmap.setConfig(SkBitmap::kARGB_8888_Config,
- m_impl->width(),
- m_impl->height());
+ width,
+ height);
if (!m_resizingBitmap.allocPixels())
return;
}
@@ -237,17 +232,19 @@
SkAutoLockPixels bitmapLock(*readbackBitmap);
pixels = static_cast<unsigned char*>(readbackBitmap->getPixels());
#elif USE(CG)
- if (m_renderOutput)
- pixels = m_renderOutput;
+ if (!m_renderOutput || m_renderOutputSize != bufferSize) {
+ m_renderOutput = adoptArrayPtr(new unsigned char[bufferSize]);
+ m_renderOutputSize = bufferSize;
+ }
+
+ pixels = m_renderOutput.get();
#else
#error Must port to your platform
#endif
- m_impl->readBackFramebuffer(pixels, 4 * m_impl->width() * m_impl->height());
+ m_impl->readBackFramebuffer(pixels, 4 * width * height, framebuffer, width, height);
- if (!m_impl->getContextAttributes().premultipliedAlpha) {
- size_t bufferSize = 4 * m_impl->width() * m_impl->height();
-
+ if (premultiplyAlpha) {
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);
@@ -265,15 +262,27 @@
canvas.drawBitmapRect(m_resizingBitmap, 0, dst);
}
#elif USE(CG)
- if (m_renderOutput && context->is3d()) {
- WebGLRenderingContext* webGLContext = static_cast<WebGLRenderingContext*>(context);
- webGLContext->graphicsContext3D()->paintToCanvas(m_renderOutput, m_impl->width(), m_impl->height(), canvas->width(), canvas->height(), imageBuffer->context()->platformContext());
- }
+ GraphicsContext3D::paintToCanvas(pixels, width, height, imageBuffer->width(), imageBuffer->height(), imageBuffer->context()->platformContext());
#else
#error Must port to your platform
#endif
}
+void GraphicsContext3DInternal::paintRenderingResultsToCanvas(CanvasRenderingContext* context)
+{
+ ImageBuffer* imageBuffer = context->canvas()->buffer();
+ paintFramebufferToCanvas(0, m_impl->width(), m_impl->height(), !m_impl->getContextAttributes().premultipliedAlpha, imageBuffer);
+}
+
+bool GraphicsContext3DInternal::paintCompositedResultsToCanvas(CanvasRenderingContext* context)
+{
+#if USE(ACCELERATED_COMPOSITING)
+ if (platformLayer())
+ return platformLayer()->paintRenderedResultsToCanvas(context->canvas()->buffer());
+#endif
+ return false;
+}
+
PassRefPtr<ImageData> GraphicsContext3DInternal::paintRenderingResultsToImageData()
{
if (m_impl->getContextAttributes().premultipliedAlpha)
@@ -283,7 +292,7 @@
unsigned char* pixels = imageData->data()->data()->data();
size_t bufferSize = 4 * m_impl->width() * m_impl->height();
- m_impl->readBackFramebuffer(pixels, bufferSize);
+ m_impl->readBackFramebuffer(pixels, bufferSize, 0, m_impl->width(), m_impl->height());
for (size_t i = 0; i < bufferSize; i += 4)
std::swap(pixels[i], pixels[i + 2]);
@@ -303,17 +312,6 @@
return;
m_impl->reshape(width, height);
-
-#if USE(CG)
- // Need to reallocate the client-side backing store.
- // FIXME: make this more efficient.
- if (m_renderOutput) {
- delete[] m_renderOutput;
- m_renderOutput = 0;
- }
- int rowBytes = width * 4;
- m_renderOutput = new unsigned char[height * rowBytes];
-#endif // USE(CG)
}
IntSize GraphicsContext3DInternal::getInternalFramebufferSize() const
@@ -1178,6 +1176,7 @@
DELEGATE_TO_INTERNAL_1(paintRenderingResultsToCanvas, CanvasRenderingContext*)
DELEGATE_TO_INTERNAL_R(paintRenderingResultsToImageData, PassRefPtr<ImageData>)
+DELEGATE_TO_INTERNAL_1R(paintCompositedResultsToCanvas, CanvasRenderingContext*, bool)
bool GraphicsContext3D::paintsIntoCanvasBuffer() const
{
« no previous file with comments | « Source/WebKit/chromium/src/Extensions3DChromium.cpp ('k') | Source/WebKit/chromium/src/GraphicsContext3DInternal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698