X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libdocument%2Fev-document-misc.c;h=14bc3a354a3d86cd122293499fecf7e1e91020b9;hb=f9c2880d31bb2f5d4411849b9207c5d26a5c616a;hp=3e85c7dd2c7ce6099bd4e942ab1ce0c593a1c9c7;hpb=a953c6011f2fba7441758469118a886a33458e50;p=evince.git diff --git a/libdocument/ev-document-misc.c b/libdocument/ev-document-misc.c index 3e85c7dd..14bc3a35 100644 --- a/libdocument/ev-document-misc.c +++ b/libdocument/ev-document-misc.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2009 Juanjo Marín * Copyright (c) 2007 Carlos Garcia Campos * Copyright (C) 2000-2003 Marco Pesenti Gritti * @@ -17,10 +18,14 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "ev-document-misc.h" +#include + #include + #include +#include "ev-document-misc.h" + /* Returns a new GdkPixbuf that is suitable for placing in the thumbnail view. * It is four pixels wider and taller than the source. If source_pixbuf is not * NULL, then it will fill the return pixbuf with the contents of @@ -151,8 +156,9 @@ ev_document_misc_surface_from_pixbuf (GdkPixbuf *pixbuf) { cairo_surface_t *surface; cairo_t *cr; - - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + + surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ? + CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf)); cr = cairo_create (surface); @@ -218,10 +224,10 @@ ev_document_misc_pixbuf_from_surface (cairo_surface_t *surface) p[3] = (has_alpha) ? p[3] : 0xff; #else tmp = p[0]; - p[0] = (has_alpha) ? p[3] : 0xff; - p[3] = p[2]; - p[2] = p[1]; - p[1] = tmp; + p[0] = p[1]; + p[1] = p[2]; + p[2] = p[3]; + p[3] = (has_alpha) ? tmp : 0xff; #endif p += pixbuf_n_channels; } @@ -239,8 +245,6 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface, cairo_surface_t *new_surface; cairo_t *cr; gint width, height; - gboolean has_alpha; - cairo_format_t surface_format; gint new_width = dest_width; gint new_height = dest_height; @@ -258,13 +262,8 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface, new_height = dest_width; } - surface_format = cairo_image_surface_get_format (surface); - has_alpha = (surface_format == CAIRO_FORMAT_ARGB32); - new_surface = cairo_surface_create_similar (surface, - has_alpha ? - CAIRO_CONTENT_COLOR_ALPHA : - CAIRO_CONTENT_COLOR, + cairo_surface_get_content (surface), new_width, new_height); cr = cairo_create (new_surface); @@ -296,4 +295,71 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface, return new_surface; } - + +void +ev_document_misc_invert_surface (cairo_surface_t *surface) { +#if CAIRO_VERSION > CAIRO_VERSION_ENCODE(1, 9, 2) + cairo_t *cr; + + cr = cairo_create (surface); + + /* white + DIFFERENCE -> invert */ + cairo_set_operator (cr, CAIRO_OPERATOR_DIFFERENCE); + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint(cr); + cairo_destroy (cr); +#else + guchar *data; + gint rowstride; + gint width, height; + gint x, y; + + data = cairo_image_surface_get_data (surface); + rowstride = cairo_image_surface_get_stride (surface); + width = cairo_image_surface_get_width (surface); + height = cairo_image_surface_get_height (surface); + + for (y = 0; y < height; y++) { + guchar *p = data + y * rowstride; + + for (x = 0; x < width; x++) { + p[0] = 255 - p[0]; + p[1] = 255 - p[1]; + p[2] = 255 - p[2]; + p += 4; + } + } + + cairo_surface_mark_dirty (surface); +#endif +} + +void +ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf) +{ + guchar *data, *p; + guint width, height, x, y, rowstride, n_channels; + + n_channels = gdk_pixbuf_get_n_channels (pixbuf); + g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB); + g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8); + + /* First grab a pointer to the raw pixel data. */ + data = gdk_pixbuf_get_pixels (pixbuf); + + /* Find the number of bytes per row (could be padded). */ + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + + width = gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + for (x = 0; x < width; x++) { + for (y = 0; y < height; y++) { + /* Calculate pixel's offset into the data array. */ + p = data + x * n_channels + y * rowstride; + /* Change the RGB values*/ + p[0] = 255 - p[0]; + p[1] = 255 - p[1]; + p[2] = 255 - p[2]; + } + } +}