summaryrefslogtreecommitdiff
path: root/gdk-pixbuf/gdk-pixbuf-util.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-01-08 16:12:49 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-01-08 16:12:49 +0000
commitb24d44e421ed429bec40de42650b26c4ba82fbf2 (patch)
tree8e49e4748cd84382444ea43aa3539d40d899e961 /gdk-pixbuf/gdk-pixbuf-util.c
parentfff24bb03dea4a62b571bfa2a12e701a622065fd (diff)
downloadgdk-pixbuf-b24d44e421ed429bec40de42650b26c4ba82fbf2.tar.gz
- Massive cleanup, make actually legible. - Fix some clamp-to-range bugs
Tue Jan 8 10:58:04 2002 Owen Taylor <otaylor@redhat.com> * gdk-pixbuf-util.c (gdk_pixbuf_saturate_and_pixelate): - Massive cleanup, make actually legible. - Fix some clamp-to-range bugs found by Jim Cape (#68231). - Add a g_return_if_fail() if src and dest alpha don't match. - Allow for src_rowstride != dest_rowstride.
Diffstat (limited to 'gdk-pixbuf/gdk-pixbuf-util.c')
-rw-r--r--gdk-pixbuf/gdk-pixbuf-util.c88
1 files changed, 42 insertions, 46 deletions
diff --git a/gdk-pixbuf/gdk-pixbuf-util.c b/gdk-pixbuf/gdk-pixbuf-util.c
index 32ecb7346..9ee844a28 100644
--- a/gdk-pixbuf/gdk-pixbuf-util.c
+++ b/gdk-pixbuf/gdk-pixbuf-util.c
@@ -151,8 +151,6 @@ gdk_pixbuf_copy_area (const GdkPixbuf *src_pixbuf,
-#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
-
/**
* gdk_pixbuf_saturate_and_pixelate:
* @src: source image
@@ -182,7 +180,7 @@ gdk_pixbuf_saturate_and_pixelate(const GdkPixbuf *src,
g_return_if_fail (GDK_IS_PIXBUF (dest));
g_return_if_fail (gdk_pixbuf_get_height (src) == gdk_pixbuf_get_height (dest));
g_return_if_fail (gdk_pixbuf_get_width (src) == gdk_pixbuf_get_width (dest));
- g_return_if_fail (gdk_pixbuf_get_rowstride (src) == gdk_pixbuf_get_rowstride (dest));
+ g_return_if_fail (gdk_pixbuf_get_has_alpha (src) == gdk_pixbuf_get_has_alpha (dest));
g_return_if_fail (gdk_pixbuf_get_colorspace (src) == gdk_pixbuf_get_colorspace (dest));
if (saturation == 1.0 && !pixelate) {
@@ -190,60 +188,58 @@ gdk_pixbuf_saturate_and_pixelate(const GdkPixbuf *src,
memcpy (gdk_pixbuf_get_pixels (dest),
gdk_pixbuf_get_pixels (src),
gdk_pixbuf_get_height (src) * gdk_pixbuf_get_rowstride (src));
-
- return;
} else {
- gint i, j;
- gint width, height, has_alpha, rowstride;
- guchar *target_pixels;
- guchar *original_pixels;
- guchar *current_pixel;
+ int i, j, t;
+ int width, height, has_alpha, src_rowstride, dest_rowstride, bytes_per_pixel;
+ guchar *src_line;
+ guchar *dest_line;
+ guchar *src_pixel;
+ guchar *dest_pixel;
guchar intensity;
has_alpha = gdk_pixbuf_get_has_alpha (src);
+ bytes_per_pixel = has_alpha ? 4 : 3;
width = gdk_pixbuf_get_width (src);
height = gdk_pixbuf_get_height (src);
- rowstride = gdk_pixbuf_get_rowstride (src);
+ src_rowstride = gdk_pixbuf_get_rowstride (src);
+ dest_rowstride = gdk_pixbuf_get_rowstride (dest);
- target_pixels = gdk_pixbuf_get_pixels (dest);
- original_pixels = gdk_pixbuf_get_pixels (src);
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++) {
- current_pixel = original_pixels + i*rowstride + j*(has_alpha?4:3);
- intensity = INTENSITY (*(current_pixel), *(current_pixel + 1), *(current_pixel + 2));
- if (pixelate && (i+j)%2 == 0) {
- *(target_pixels + i*rowstride + j*(has_alpha?4:3)) = intensity/2 + 127;
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 1) = intensity/2 + 127;
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 2) = intensity/2 + 127;
- } else if (pixelate) {
+ src_line = gdk_pixbuf_get_pixels (src);
+ dest_line = gdk_pixbuf_get_pixels (dest);
+
#define DARK_FACTOR 0.7
- *(target_pixels + i*rowstride + j*(has_alpha?4:3)) =
- (guchar) (((1.0 - saturation) * intensity
- + saturation * (*(current_pixel)))) * DARK_FACTOR;
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 1) =
- (guchar) (((1.0 - saturation) * intensity
- + saturation * (*(current_pixel + 1)))) * DARK_FACTOR;
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 2) =
- (guchar) (((1.0 - saturation) * intensity
- + saturation * (*(current_pixel + 2)))) * DARK_FACTOR;
+#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
+#define CLAMP_UCHAR(v) (t = (v), CLAMP (t, 0, 255))
+#define SATURATE(v) ((1.0 - saturation) * intensity + saturation * (v))
+
+ for (i = 0 ; i < height ; i++) {
+ src_pixel = src_line;
+ src_line += src_rowstride;
+ dest_pixel = dest_line;
+ dest_line += dest_rowstride;
+
+ for (j = 0 ; j < width ; j++) {
+ intensity = INTENSITY (src_pixel[0], src_pixel[1], src_pixel[2]);
+ if (pixelate && (i + j) % 2 == 0) {
+ dest_pixel[0] = intensity / 2 + 127;
+ dest_pixel[1] = intensity / 2 + 127;
+ dest_pixel[2] = intensity / 2 + 127;
+ } else if (pixelate) {
+ dest_pixel[0] = CLAMP_UCHAR ((SATURATE (src_pixel[0])) * DARK_FACTOR);
+ dest_pixel[1] = CLAMP_UCHAR ((SATURATE (src_pixel[1])) * DARK_FACTOR);
+ dest_pixel[2] = CLAMP_UCHAR ((SATURATE (src_pixel[2])) * DARK_FACTOR);
} else {
- *(target_pixels + i*rowstride + j*(has_alpha?4:3)) =
- (guchar) ((1.0 - saturation) * intensity
- + saturation * (*(current_pixel)));
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 1) =
- (guchar) ((1.0 - saturation) * intensity
- + saturation * (*(current_pixel + 1)));
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 2) =
- (guchar) ((1.0 - saturation) * intensity
- + saturation * (*(current_pixel + 2)));
+ dest_pixel[0] = CLAMP_UCHAR (SATURATE (src_pixel[0]));
+ dest_pixel[1] = CLAMP_UCHAR (SATURATE (src_pixel[1]));
+ dest_pixel[2] = CLAMP_UCHAR (SATURATE (src_pixel[2]));
}
-
+
if (has_alpha)
- *(target_pixels + i*rowstride + j*(has_alpha?4:3) + 3) = *(current_pixel + 3);
- }
- }
+ dest_pixel[3] = src_pixel[3];
- return;
+ src_pixel += bytes_per_pixel;
+ dest_pixel += bytes_per_pixel;
+ }
+ }
}
}