[gthumb] cairo utils: added _cairo_multiply and CAIRO_RGBA_TO_UINT32
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] cairo utils: added _cairo_multiply and CAIRO_RGBA_TO_UINT32
- Date: Thu, 28 Apr 2011 13:19:52 +0000 (UTC)
commit b20d05565ab6f71d5c059c857a861e8693b0aaf7
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Apr 28 12:43:01 2011 +0200
cairo utils: added _cairo_multiply and CAIRO_RGBA_TO_UINT32
gthumb/cairo-utils.c | 29 +++++++++++++++++++++++++++--
gthumb/cairo-utils.h | 9 ++++++++-
2 files changed, 35 insertions(+), 3 deletions(-)
---
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index 2da9ee4..6df2744 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -52,6 +52,15 @@ surface_pixels_free (void *data)
}
+inline int
+_cairo_multiply (int color,
+ int alpha)
+{
+ int temp = (alpha * color) + 0x80;
+ return ((temp + (temp >> 8)) >> 8);
+}
+
+
void
_gdk_color_to_cairo_color (GdkColor *g_color,
cairo_color_t *c_color)
@@ -220,6 +229,8 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
int s_stride;
unsigned char *s_pixels;
int h, w;
+ guint32 pixel;
+ guchar r, g, b, a;
if (pixbuf == NULL)
return NULL;
@@ -249,7 +260,20 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
p_iter = p_pixels;
for (w = 0; w < width; w++) {
- CAIRO_SET_RGBA (s_iter, p_iter[0], p_iter[1], p_iter[2], p_iter[3]);
+ a = p_iter[3];
+ if (a == 0xff) {
+ pixel = CAIRO_RGBA_TO_UINT32 (p_iter[0], p_iter[1], p_iter[2], 0xff);
+ }
+ else if (a == 0) {
+ pixel = 0;
+ }
+ else {
+ r = _cairo_multiply (p_iter[0], a);
+ g = _cairo_multiply (p_iter[1], a);
+ b = _cairo_multiply (p_iter[2], a);
+ pixel = CAIRO_RGBA_TO_UINT32 (r, g, b, a);
+ }
+ memcpy (s_iter, &pixel, sizeof (guint32));
s_iter += 4;
p_iter += p_n_channels;
@@ -268,7 +292,8 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
p_iter = p_pixels;
for (w = 0; w < width; w++) {
- CAIRO_SET_RGB (s_iter, p_iter[0], p_iter[1], p_iter[2]);
+ pixel = CAIRO_RGBA_TO_UINT32 (p_iter[0], p_iter[1], p_iter[2], 0xff);
+ memcpy (s_iter, &pixel, sizeof (guint32));
s_iter += 4;
p_iter += p_n_channels;
diff --git a/gthumb/cairo-utils.h b/gthumb/cairo-utils.h
index bd18cfc..9270e8c 100644
--- a/gthumb/cairo-utils.h
+++ b/gthumb/cairo-utils.h
@@ -101,8 +101,11 @@
} \
} G_STMT_END
+#define CAIRO_RGBA_TO_UINT32(red, green, blue, alpha) \
+ (((alpha) << 24) | ((red) << 16) | ((green) << 8) | (blue))
-#define interpolate_value(original, reference, distance) (CLAMP (((distance) * (reference)) + ((1.0 - (distance)) * (original)), 0, 255))
+#define interpolate_value(original, reference, distance) \
+ (CLAMP (((distance) * (reference)) + ((1.0 - (distance)) * (original)), 0, 255))
/* types */
@@ -124,6 +127,10 @@ typedef struct {
extern const unsigned char cairo_channel[4];
+/* math */
+
+int _cairo_multiply (int color,
+ int alpha);
/* colors */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]