mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-21 03:52:33 +00:00
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:
parent
464348be61
commit
78c71c9d9d
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue