diff options
author | Michael Zucchi <zucchi@zedzone.mmc.com.au> | 1999-12-09 00:43:53 +0000 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 1999-12-09 00:43:53 +0000 |
commit | 6b23587aefd002b06047f2b31489bfd268fd8cbe (patch) | |
tree | 143b7d35d7816621c2c0dde545524a8e64a6ae56 /gdk/gdkpixbuf-drawable.c | |
parent | 880f5ade6b0f63556d59eb76c458ce6d8fd47d73 (diff) | |
download | gtk+-6b23587aefd002b06047f2b31489bfd268fd8cbe.tar.gz |
Filled in body of function. (rgbconvert): Added GdkColormap parameter, and
1999-12-09 Michael Zucchi <zucchi@zedzone.mmc.com.au>
* gdk-pixbuf/gdk-pixbuf-drawable.c (gdk_pixbuf_get_from_drawable):
Filled in body of function.
(rgbconvert): Added GdkColormap parameter, and to all conversion
functions also.
* gdk-pixbuf/Makefile.am: Re-enabled building of
textpixbuf-drawable.
* gdk-pixbuf/testpixbuf-drawable.c (main): Changed to use
gdk_pixbuf_get_from_drawable().
Diffstat (limited to 'gdk/gdkpixbuf-drawable.c')
-rw-r--r-- | gdk/gdkpixbuf-drawable.c | 121 |
1 files changed, 42 insertions, 79 deletions
diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c index 70f1550f86..ad519f045d 100644 --- a/gdk/gdkpixbuf-drawable.c +++ b/gdk/gdkpixbuf-drawable.c @@ -1,9 +1,11 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GdkPixbuf library - convert X drawable information to RGB * * Copyright (C) 1999 Michael Zucchi * * Authors: Michael Zucchi <zucchi@zedzone.mmc.com.au> * Cody Russell <bratsche@dfw.net> + * Federico * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -52,7 +54,7 @@ static unsigned long mask_table[] = { no alpha */ static void -rgb1 (GdkImage *image, art_u8 *pixels, int rowstride) +rgb1 (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -61,7 +63,6 @@ rgb1 (GdkImage *image, art_u8 *pixels, int rowstride) register unsigned char data; unsigned char *o; unsigned char *srow = image->mem, *orow = pixels; - GdkColormap *colormap; d (printf ("1 bits/pixel\n")); @@ -72,8 +73,6 @@ rgb1 (GdkImage *image, art_u8 *pixels, int rowstride) height = image->height; bpl = image->bpl; - colormap = gdk_rgb_get_cmap (); - for (yy = 0; yy < height; yy++) { s = srow; o = orow; @@ -94,7 +93,7 @@ rgb1 (GdkImage *image, art_u8 *pixels, int rowstride) with alpha */ static void -rgb1a (GdkImage *image, art_u8 *pixels, int rowstride) +rgb1a (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -104,7 +103,6 @@ rgb1a (GdkImage *image, art_u8 *pixels, int rowstride) unsigned char *o; unsigned char *srow = image->mem, *orow = pixels; unsigned long remap[2]; - GdkColormap *colormap; d (printf ("1 bits/pixel\n")); @@ -115,8 +113,6 @@ rgb1a (GdkImage *image, art_u8 *pixels, int rowstride) height = image->height; bpl = image->bpl; - colormap = gdk_rgb_get_cmap (); - for (xx = 0; xx < 2; xx++) { #ifdef LITTLE remap[xx] = 0xff000000 @@ -149,7 +145,7 @@ rgb1a (GdkImage *image, art_u8 *pixels, int rowstride) no alpha */ static void -rgb8 (GdkImage *image, art_u8 *pixels, int rowstride) +rgb8 (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -159,7 +155,6 @@ rgb8 (GdkImage *image, art_u8 *pixels, int rowstride) unsigned char *srow = image->mem, *orow = pixels; register unsigned char *s; register unsigned char *o; - GdkColormap *colormap; width = image->width; height = image->height; @@ -167,7 +162,6 @@ rgb8 (GdkImage *image, art_u8 *pixels, int rowstride) d (printf ("8 bit, no alpha output\n")); - colormap = gdk_rgb_get_cmap (); mask = mask_table[image->depth]; for (yy = 0; yy < height; yy++) { @@ -189,14 +183,13 @@ rgb8 (GdkImage *image, art_u8 *pixels, int rowstride) with alpha */ static void -rgb8a (GdkImage *image, art_u8 *pixels, int rowstride) +rgb8a (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; int bpl; unsigned long mask; register unsigned long data; - GdkColormap *colormap; unsigned long remap[256]; register unsigned char *s; /* read 2 pixels at once */ register unsigned long *o; @@ -208,7 +201,6 @@ rgb8a (GdkImage *image, art_u8 *pixels, int rowstride) d (printf ("8 bit, with alpha output\n")); - colormap = gdk_rgb_get_cmap (); mask = mask_table[image->depth]; for (xx = 0; xx < colormap->size; xx++) { @@ -243,7 +235,7 @@ rgb8a (GdkImage *image, art_u8 *pixels, int rowstride) data in lsb format */ static void -rgb565lsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb565lsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -308,7 +300,7 @@ rgb565lsb (GdkImage *image, art_u8 *pixels, int rowstride) data in msb format */ static void -rgb565msb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb565msb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -373,7 +365,7 @@ rgb565msb (GdkImage *image, art_u8 *pixels, int rowstride) data in lsb format */ static void -rgb565alsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb565alsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -426,7 +418,7 @@ rgb565alsb (GdkImage *image, art_u8 *pixels, int rowstride) data in msb format */ static void -rgb565amsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb565amsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -475,7 +467,7 @@ rgb565amsb (GdkImage *image, art_u8 *pixels, int rowstride) data in lsb format */ static void -rgb555lsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb555lsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -540,7 +532,7 @@ rgb555lsb (GdkImage *image, art_u8 *pixels, int rowstride) data in msb format */ static void -rgb555msb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb555msb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -601,7 +593,7 @@ rgb555msb (GdkImage *image, art_u8 *pixels, int rowstride) data in lsb format */ static void -rgb555alsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb555alsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -654,7 +646,7 @@ rgb555alsb (GdkImage *image, art_u8 *pixels, int rowstride) data in msb format */ static void -rgb555amsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb555amsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -703,7 +695,7 @@ rgb555amsb (GdkImage *image, art_u8 *pixels, int rowstride) static void -rgb888alsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb888alsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -736,7 +728,7 @@ rgb888alsb (GdkImage *image, art_u8 *pixels, int rowstride) } static void -rgb888lsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb888lsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -766,7 +758,7 @@ rgb888lsb (GdkImage *image, art_u8 *pixels, int rowstride) } static void -rgb888amsb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb888amsb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -814,7 +806,7 @@ rgb888amsb (GdkImage *image, art_u8 *pixels, int rowstride) } static void -rgb888msb (GdkImage *image, art_u8 *pixels, int rowstride) +rgb888msb (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *colormap) { int xx, yy; int width, height; @@ -844,7 +836,7 @@ rgb888msb (GdkImage *image, art_u8 *pixels, int rowstride) } } -typedef void (* cfunc) (GdkImage *image, art_u8 *pixels, int rowstride); +typedef void (* cfunc) (GdkImage *image, art_u8 *pixels, int rowstride, GdkColormap *cmap); static cfunc convert_map[] = { rgb1,rgb1,rgb1a,rgb1a, @@ -858,7 +850,7 @@ static cfunc convert_map[] = { perform actual conversion */ static void -rgbconvert (GdkImage *image, art_u8 *pixels, int rowstride, int alpha) +rgbconvert (GdkImage *image, art_u8 *pixels, int rowstride, int alpha, GdkColormap *cmap) { int index = (image->byte_order == GDK_MSB_FIRST) | (alpha != 0) << 1; int bank=0; @@ -887,55 +879,9 @@ rgbconvert (GdkImage *image, art_u8 *pixels, int rowstride, int alpha) } index |= bank << 2; - (* convert_map[index]) (image, pixels, rowstride); + (* convert_map[index]) (image, pixels, rowstride, cmap); } -static GdkPixbuf * -gdk_pixbuf_from_drawable_core (GdkPixmap * window, gint x, gint y, gint width, - gint height, gint with_alpha) -{ - GdkImage *image; - ArtPixBuf *art_pixbuf; - art_u8 *buff; - art_u8 *pixels; - gint rowstride; - gint fatness; - gint screen_width, screen_height; - gint window_width, window_height, window_x, window_y; - int bpl; - - g_return_val_if_fail (window != NULL, NULL); - - /* always returns image in ZPixmap format ... */ - image = gdk_image_get (window, x, y, width, height); - - fatness = with_alpha ? 4 : 3; - rowstride = width * fatness; - - buff = art_alloc (rowstride * height); - pixels = buff; - -#if 0 - printf ("bpp = %d\n", image->bpp); - printf ("depth = %d\n", image->depth); - printf ("byte order = %d\n", image->byte_order); - printf ("bytes/line = %d\n", image->bpl); -#endif - - bpl = image->bpl; - - rgbconvert (image, pixels, rowstride, with_alpha); - gdk_image_destroy (image); - - if (with_alpha) - art_pixbuf = art_pixbuf_new_rgba (buff, width, height, rowstride); - else - art_pixbuf = art_pixbuf_new_rgb (buff, width, height, rowstride); - - return gdk_pixbuf_new_from_art_pixbuf (art_pixbuf); -} - - /* Exported functions */ @@ -992,6 +938,8 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf *dest, GdkWindowType window_type; gint src_width, src_height; ArtPixBuf *apb; + GdkImage *image; + int rowstride, bpp, alpha; /* General sanity checks */ @@ -1052,22 +1000,37 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf *dest, g_return_val_if_fail (screen_srcy + height <= screen_height, NULL); } - /* Create the pixbuf if needed */ + /* Get Image in ZPixmap format (packed bits). */ + image = gdk_image_get (src, src_x, src_y, width, height); + g_return_val_if_fail( image != NULL, NULL); + /* Create the pixbuf if needed */ if (!dest) { dest = gdk_pixbuf_new (ART_PIX_RGB, FALSE, 8, width, height); - if (!dest) + if (!dest) { + gdk_image_destroy(image); return NULL; + } apb = dest->art_pixbuf; } /* Get the colormap if needed */ - if (window_type != GDK_WINDOW_PIXMAP) cmap = gdk_window_get_colormap (src); - /* FIXME: fill in the body here */ + alpha = gdk_pixbuf_get_has_alpha(dest); + rowstride = gdk_pixbuf_get_rowstride(dest); + bpp = alpha?4:3; + + /* we offset into the image data based on the position we are retrieving from */ + rgbconvert(image, gdk_pixbuf_get_pixels(dest) + + (dest_y * rowstride) + (dest_x * bpp), + rowstride, + alpha, + cmap); + + gdk_image_destroy(image); return dest; } |