diff options
author | Arturo Espinosa <unammx@src.gnome.org> | 1999-10-07 05:11:27 +0000 |
---|---|---|
committer | Arturo Espinosa <unammx@src.gnome.org> | 1999-10-07 05:11:27 +0000 |
commit | e29e536d202b83027cec8c2b9c0b69ec4d79b8ee (patch) | |
tree | 941e5ec572be5c31ee028241808c3fdc21c2feee /gdk/gdkpixbuf-drawable.c | |
parent | 4f771b6d26c0877933badc401fdb77b8f3a6f4ee (diff) | |
download | gtk+-e29e536d202b83027cec8c2b9c0b69ec4d79b8ee.tar.gz |
Added files from Cody Russell
Diffstat (limited to 'gdk/gdkpixbuf-drawable.c')
-rw-r--r-- | gdk/gdkpixbuf-drawable.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c new file mode 100644 index 0000000000..472424a5b2 --- /dev/null +++ b/gdk/gdkpixbuf-drawable.c @@ -0,0 +1,135 @@ +/* + * creates an ArtPixBuf from a Drawable + * + * Author: + * Cody Russell <bratsche@dfw.net> + */ +#include <config.h> +#include <stdio.h> +#include <string.h> +#include <glib.h> +#include <gmodule.h> +#include "gdk-pixbuf.h" + +/* private function */ + +static ArtPixBuf * +art_pixbuf_from_drawable_core (GdkWindow *window, + gint x, gint y, + gint width, gint height, + gint with_alpha) +{ + GdkImage *image; + ArtPixBuf *pixbuf; + GdkColormap *colormap; + art_u8 *buff; + art_u8 *pixels; + gulong pixel; + gint rowstride; + art_u8 r, g, b; + gint xx, yy; + gint fatness; + + g_return_val_if_fail (window != NULL, NULL); + + image = gdk_image_get (window, x, y, width, height); + colormap = gdk_rgb_get_cmap (); + + fatness = with_alpha ? 4 : 3; + rowstride = width * fatness; + + buff = art_alloc (rowstride * height); + pixels = buff; + + switch (image->depth) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + for (yy = 0; yy < height; yy++) + { + for (xx = 0; xx < width; xx++) + { + pixel = gdk_image_get_pixel (image, xx, yy); + pixels[0] = colormap->colors[pixel].red; + pixels[1] = colormap->colors[pixel].green; + pixels[2] = colormap->colors[pixel].blue; + if (with_alpha) + pixels[3] = 0; + pixels += fatness; + + } + } + break; + + case 16: + case 15: + for (yy = 0; yy < height; yy++) + { + for (xx = 0; xx < width; xx++) + { + pixel = gdk_image_get_pixel (image, xx, yy); + r = (pixel >> 8) & 0xf8; + g = (pixel >> 3) & 0xfc; + b = (pixel << 3) & 0xf8; + pixels[0] = r; + pixels[1] = g; + pixels[2] = b; + if (with_alpha) + pixels[3] = 0; /* GdkImages don't have alpha =) */ + pixels += fatness; + } + } + break; + + case 24: + case 32: + for (yy = 0; yy < height; yy++) + { + for (xx = 0; xx < width; xx++) + { + pixel = gdk_image_get_pixel (image, xx, yy); + r = (pixel >> 16) & 0xff; + g = (pixel >> 8) & 0xff; + b = pixel & 0xff; + pixels[0] = r; + pixels[1] = g; + pixels[2] = b; + if (with_alpha) + pixels[3] = 0; /* GdkImages don't have alpha.. */ + pixels += fatness; + } + } + break; + + default: + g_error ("art_pixbuf_from_drawable_core (): Unknown depth."); + } + + return with_alpha ? art_pixbuf_new_rgba (buff, width, height, rowstride) : + art_pixbuf_new_rgb (buff, width, height, rowstride); +} + +/* Public functions */ + +ArtPixBuf * +art_pixbuf_rgb_from_drawable (GdkWindow *window, + gint x, gint y, + gint width, gint height) +{ + return art_pixbuf_from_drawable_core (window, x, y, width, height, 0); +} + +ArtPixBuf * +art_pixbuf_rgba_from_drawable (GdkWindow *window, + gint x, gint y, + gint width, gint height) +{ + return art_pixbuf_from_drawable_core (window, x, y, width, height, 1); +} |