From c60561fd0c7cdadf57dff25efd41c03c1307781d Mon Sep 17 00:00:00 2001
From: Benjamin Otte <otte@gnome.org>
Date: Tue, 13 Oct 2009 22:52:45 +0200
Subject: [PATCH 07/12] [cairo] make ImageBuffer::platformTransformColorSpace surface-type safe

The code just does an intermediate copy to an image surface, if the
desired surface is not already an image surface.
---
 .../platform/graphics/cairo/ImageBufferCairo.cpp   |   27 +++++++++++++++++---
 1 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp b/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp
index dd7da31..9f0a3a0 100644
--- a/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp
+++ b/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp
@@ -122,10 +122,20 @@ Image* ImageBuffer::image() const
 
 void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable)
 {
-    ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE);
+    cairo_surface_t *image;
+    if (cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE) {
+        image = m_data.m_surface;
+    } else {
+        image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, m_size.width(), m_size.height());
+        cairo_t* cr = cairo_create(image);
+        cairo_set_source_surface(cr, m_data.m_surface, 0, 0);
+        cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+        cairo_paint(cr);
+        cairo_destroy(cr);
+    }
 
-    unsigned char* dataSrc = cairo_image_surface_get_data(m_data.m_surface);
-    int stride = cairo_image_surface_get_stride(m_data.m_surface);
+    unsigned char* dataSrc = cairo_image_surface_get_data(image);
+    int stride = cairo_image_surface_get_stride(image);
     for (int y = 0; y < m_size.height(); ++y) {
         unsigned* row = reinterpret_cast<unsigned*>(dataSrc + stride * y);
         for (int x = 0; x < m_size.width(); x++) {
@@ -138,7 +148,16 @@ void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable)
             *pixel = premultipliedARGBFromColor(pixelColor);
         }
     }
-    cairo_surface_mark_dirty_rectangle (m_data.m_surface, 0, 0, m_size.width(), m_size.height());
+    cairo_surface_mark_dirty_rectangle (image, 0, 0, m_size.width(), m_size.height());
+
+    if (image != m_data.m_surface) {
+        cairo_t* cr = cairo_create(m_data.m_surface);
+        cairo_set_source_surface(cr, image, 0, 0);
+        cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+        cairo_paint(cr);
+        cairo_destroy(cr);
+        cairo_surface_destroy (image);
+    }
 }
 
 static cairo_surface_t * createSurfaceForImageData(ImageData* source, bool alpha)
-- 
1.6.3.3

