allow to pass NULL for "num_colors".

2008-09-17  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpimage.c (gimp_image_get_colormap): allow to pass
	NULL for "num_colors".

	* plug-ins/print/print-draw-page.c: added missing conversion
	routines for indexed images. Fixes bug #552609.


svn path=/trunk/; revision=26973
This commit is contained in:
Sven Neumann 2008-09-17 14:45:56 +00:00 committed by Sven Neumann
parent 464348be61
commit 78c71c9d9d
3 changed files with 115 additions and 48 deletions

View file

@ -1,3 +1,11 @@
2008-09-17 Sven Neumann <sven@gimp.org>
* libgimp/gimpimage.c (gimp_image_get_colormap): allow to pass
NULL for "num_colors".
* plug-ins/print/print-draw-page.c: added missing conversion
routines for indexed images. Fixes bug #552609.
2008-09-17 Michael Natterer <mitch@gimp.org>
* app/widgets/gimpdockable.c: cosmetic paranoia.

View file

@ -63,7 +63,7 @@ gimp_image_set_cmap (gint32 image_ID,
/**
* gimp_image_get_colormap:
* @image_ID: The image.
* @num_colors: Number of colors in the colormap array.
* @num_colors: Returns the number of colors in the colormap array.
*
* Returns the image's colormap
*
@ -82,7 +82,8 @@ gimp_image_get_colormap (gint32 image_ID,
cmap = _gimp_image_get_colormap (image_ID, &num_bytes);
*num_colors = num_bytes / 3;
if (num_colors)
*num_colors = num_bytes / 3;
return cmap;
}

View file

@ -29,34 +29,6 @@
static cairo_surface_t * print_cairo_surface_from_drawable (gint32 drawable_ID);
static inline void
convert_from_gray (const guchar *src,
guchar *dest,
gint pixels)
{
while (pixels--)
{
GIMP_CAIRO_RGB24_SET_PIXEL (dest, src[0], src[0], src[0]);
src += 1;
dest += 4;
}
}
static inline void
convert_from_graya (const guchar *src,
guchar *dest,
gint pixels)
{
while (pixels--)
{
GIMP_CAIRO_ARGB32_SET_PIXEL (dest, src[0], src[0], src[0], src[1]);
src += 2;
dest += 4;
}
}
static inline void
convert_from_rgb (const guchar *src,
guchar *dest,
@ -64,7 +36,8 @@ convert_from_rgb (const guchar *src,
{
while (pixels--)
{
GIMP_CAIRO_RGB24_SET_PIXEL (dest, src[0], src[1], src[2]);
GIMP_CAIRO_RGB24_SET_PIXEL (dest,
src[0], src[1], src[2]);
src += 3;
dest += 4;
@ -78,13 +51,80 @@ convert_from_rgba (const guchar *src,
{
while (pixels--)
{
GIMP_CAIRO_ARGB32_SET_PIXEL (dest, src[0], src[1], src[2], src[3]);
GIMP_CAIRO_ARGB32_SET_PIXEL (dest,
src[0], src[1], src[2], src[3]);
src += 4;
dest += 4;
}
}
static inline void
convert_from_gray (const guchar *src,
guchar *dest,
gint pixels)
{
while (pixels--)
{
GIMP_CAIRO_RGB24_SET_PIXEL (dest,
src[0], src[0], src[0]);
src += 1;
dest += 4;
}
}
static inline void
convert_from_graya (const guchar *src,
guchar *dest,
gint pixels)
{
while (pixels--)
{
GIMP_CAIRO_ARGB32_SET_PIXEL (dest,
src[0], src[0], src[0], src[1]);
src += 2;
dest += 4;
}
}
static inline void
convert_from_indexed (const guchar *src,
guchar *dest,
gint pixels,
const guchar *cmap)
{
while (pixels--)
{
const gint i = 3 * src[0];
GIMP_CAIRO_RGB24_SET_PIXEL (dest,
cmap[i], cmap[i + 1], cmap[i + 2]);
src += 1;
dest += 4;
}
}
static inline void
convert_from_indexeda (const guchar *src,
guchar *dest,
gint pixels,
const guchar *cmap)
{
while (pixels--)
{
const gint i = 3 * src[0];
GIMP_CAIRO_ARGB32_SET_PIXEL (dest,
cmap[i], cmap[i + 1], cmap[i + 2], src[1]);
src += 2;
dest += 4;
}
}
gboolean
print_draw_page (GtkPrintContext *context,
PrintData *data)
@ -125,17 +165,25 @@ print_draw_page (GtkPrintContext *context,
static cairo_surface_t *
print_cairo_surface_from_drawable (gint32 drawable_ID)
{
GimpDrawable *drawable = gimp_drawable_get (drawable_ID);
GimpDrawable *drawable = gimp_drawable_get (drawable_ID);
GimpPixelRgn region;
GimpImageType image_type = gimp_drawable_type (drawable_ID);
cairo_surface_t *surface;
const gint width = drawable->width;
const gint height = drawable->height;
const gint width = drawable->width;
const gint height = drawable->height;
guchar *cmap = NULL;
guchar *pixels;
gint stride;
guint count = 0;
guint done = 0;
guint count = 0;
guint done = 0;
gpointer pr;
if (gimp_drawable_is_indexed (drawable_ID))
{
cmap = gimp_image_get_colormap (gimp_drawable_get_image (drawable_ID),
NULL);
}
surface = cairo_image_surface_create (gimp_drawable_has_alpha (drawable_ID) ?
CAIRO_FORMAT_ARGB32 :
CAIRO_FORMAT_RGB24,
@ -156,23 +204,31 @@ print_cairo_surface_from_drawable (gint32 drawable_ID)
for (y = 0; y < region.h; y++)
{
switch (region.bpp)
switch (image_type)
{
case 1:
convert_from_gray (src, dest, region.w);
break;
case 2:
convert_from_graya (src, dest, region.w);
break;
case 3:
case GIMP_RGB_IMAGE:
convert_from_rgb (src, dest, region.w);
break;
case 4:
case GIMP_RGBA_IMAGE:
convert_from_rgba (src, dest, region.w);
break;
case GIMP_GRAY_IMAGE:
convert_from_gray (src, dest, region.w);
break;
case GIMP_GRAYA_IMAGE:
convert_from_graya (src, dest, region.w);
break;
case GIMP_INDEXED_IMAGE:
convert_from_indexed (src, dest, region.w, cmap);
break;
case GIMP_INDEXEDA_IMAGE:
convert_from_indexeda (src, dest, region.w, cmap);
break;
}
src += region.rowstride;
@ -185,6 +241,8 @@ print_cairo_surface_from_drawable (gint32 drawable_ID)
gimp_progress_update ((gdouble) done / (width * height));
}
g_free (cmap);
gimp_drawable_detach (drawable);
return surface;