Commit 318ef6fa authored by Carlos Garcia Campos's avatar Carlos Garcia Campos

[libdocument] Add a function to invert colors of an image cairo surface

See bgo#321823.
parent d461d1ef
...@@ -296,6 +296,44 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface, ...@@ -296,6 +296,44 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface,
return new_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 void
ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf) ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf)
{ {
......
...@@ -51,6 +51,7 @@ cairo_surface_t *ev_document_misc_surface_rotate_and_scale (cairo_surface_t *sur ...@@ -51,6 +51,7 @@ cairo_surface_t *ev_document_misc_surface_rotate_and_scale (cairo_surface_t *sur
gint dest_width, gint dest_width,
gint dest_height, gint dest_height,
gint dest_rotation); gint dest_rotation);
void ev_document_misc_invert_surface (cairo_surface_t *surface);
void ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf); void ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf);
G_END_DECLS G_END_DECLS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment