plug-ins: port file-mng to GEGL

This commit is contained in:
Michael Natterer 2012-11-29 01:30:34 +01:00
parent 9c371064b7
commit 20477b6c08
3 changed files with 57 additions and 58 deletions

View File

@ -1230,6 +1230,7 @@ file_mng_LDADD = \
$(libgimpcolor) \ $(libgimpcolor) \
$(libgimpbase) \ $(libgimpbase) \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(GEGL_LIBS) \
$(MNG_LIBS) \ $(MNG_LIBS) \
$(RT_LIBS) \ $(RT_LIBS) \
$(INTLLIBS) \ $(INTLLIBS) \

View File

@ -210,7 +210,7 @@ static gboolean respin_cmap (png_structp png_ptr,
png_infop png_info_ptr, png_infop png_info_ptr,
guchar *remap, guchar *remap,
gint32 image_id, gint32 image_id,
GimpDrawable *drawable, GeglBuffer *buffer,
int *bit_depth); int *bit_depth);
static gboolean mng_save_image (const gchar *filename, static gboolean mng_save_image (const gchar *filename,
@ -451,10 +451,10 @@ get_bit_depth_for_palette (int num_palette)
static gboolean static gboolean
respin_cmap (png_structp pp, respin_cmap (png_structp pp,
png_infop info, png_infop info,
guchar *remap, guchar *remap,
gint32 image_id, gint32 image_id,
GimpDrawable *drawable, GeglBuffer *buffer,
int *bit_depth) int *bit_depth)
{ {
static guchar trans[] = { 0 }; static guchar trans[] = { 0 };
guchar *before; guchar *before;
@ -463,7 +463,6 @@ respin_cmap (png_structp pp,
gint colors; gint colors;
gint transparent; gint transparent;
gint cols, rows; gint cols, rows;
GimpPixelRgn pixel_rgn;
before = gimp_image_get_colormap (image_id, &colors); before = gimp_image_get_colormap (image_id, &colors);
@ -474,17 +473,15 @@ respin_cmap (png_structp pp,
colors = 1; colors = 1;
} }
cols = drawable->width; cols = gegl_buffer_get_width (buffer);
rows = drawable->height; rows = gegl_buffer_get_height (buffer);
numpixels = cols * rows; numpixels = cols * rows;
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
drawable->width, drawable->height, FALSE, FALSE);
pixels = (guchar *) g_malloc (numpixels * 2); pixels = (guchar *) g_malloc (numpixels * 2);
gimp_pixel_rgn_get_rect (&pixel_rgn, pixels, 0, 0, gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, cols, rows), 1.0,
drawable->width, drawable->height); NULL, pixels,
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
if (ia_has_transparent_pixels (pixels, numpixels)) if (ia_has_transparent_pixels (pixels, numpixels))
{ {
@ -817,13 +814,13 @@ mng_save_image (const gchar *filename,
for (i = (num_layers - 1); i >= 0; i--) for (i = (num_layers - 1); i >= 0; i--)
{ {
GimpImageType layer_drawable_type; GimpImageType layer_drawable_type;
GimpDrawable *layer_drawable; GeglBuffer *layer_buffer;
gint layer_offset_x, layer_offset_y; gint layer_offset_x, layer_offset_y;
gint layer_rows, layer_cols; gint layer_rows, layer_cols;
gchar *layer_name; gchar *layer_name;
gint layer_chunks_type; gint layer_chunks_type;
const Babl *layer_format;
volatile gint layer_bpp; volatile gint layer_bpp;
GimpPixelRgn layer_pixel_rgn;
guint8 layer_mng_colortype; guint8 layer_mng_colortype;
guint8 layer_mng_compression_type; guint8 layer_mng_compression_type;
@ -849,9 +846,9 @@ mng_save_image (const gchar *filename,
layer_chunks_type = parse_chunks_type_from_layer_name (layer_name); layer_chunks_type = parse_chunks_type_from_layer_name (layer_name);
layer_drawable_type = gimp_drawable_type (layers[i]); layer_drawable_type = gimp_drawable_type (layers[i]);
layer_drawable = gimp_drawable_get (layers[i]); layer_buffer = gimp_drawable_get_buffer (layers[i]);
layer_rows = layer_drawable->height; layer_rows = gegl_buffer_get_width (layer_buffer);
layer_cols = layer_drawable->width; layer_cols = gegl_buffer_get_height (layer_buffer);
gimp_drawable_offsets (layers[i], &layer_offset_x, &layer_offset_y); gimp_drawable_offsets (layers[i], &layer_offset_x, &layer_offset_y);
layer_has_unique_palette = TRUE; layer_has_unique_palette = TRUE;
@ -862,27 +859,27 @@ mng_save_image (const gchar *filename,
switch (layer_drawable_type) switch (layer_drawable_type)
{ {
case GIMP_RGB_IMAGE: case GIMP_RGB_IMAGE:
layer_bpp = 3; layer_format = babl_format ("R'G'B' u8");
layer_mng_colortype = MNG_COLORTYPE_RGB; layer_mng_colortype = MNG_COLORTYPE_RGB;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
layer_bpp = 4; layer_format = babl_format ("R'G'B'A u8");
layer_mng_colortype = MNG_COLORTYPE_RGBA; layer_mng_colortype = MNG_COLORTYPE_RGBA;
break; break;
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
layer_bpp = 1; layer_format = babl_format ("Y' u8");
layer_mng_colortype = MNG_COLORTYPE_GRAY; layer_mng_colortype = MNG_COLORTYPE_GRAY;
break; break;
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
layer_bpp = 2; layer_format = babl_format ("Y'A u8");
layer_mng_colortype = MNG_COLORTYPE_GRAYA; layer_mng_colortype = MNG_COLORTYPE_GRAYA;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
layer_bpp = 1; layer_format = gegl_buffer_get_format (layer_buffer);
layer_mng_colortype = MNG_COLORTYPE_INDEXED; layer_mng_colortype = MNG_COLORTYPE_INDEXED;
break; break;
case GIMP_INDEXEDA_IMAGE: case GIMP_INDEXEDA_IMAGE:
layer_bpp = 2; layer_format = gegl_buffer_get_format (layer_buffer);
layer_mng_colortype = MNG_COLORTYPE_INDEXED | MNG_COLORTYPE_GRAYA; layer_mng_colortype = MNG_COLORTYPE_INDEXED | MNG_COLORTYPE_GRAYA;
break; break;
default: default:
@ -890,6 +887,8 @@ mng_save_image (const gchar *filename,
goto err3; goto err3;
} }
layer_bpp = babl_format_get_bytes_per_pixel (layer_format);
/* Delta PNG chunks are not yet supported */ /* Delta PNG chunks are not yet supported */
/* if (i == (num_layers - 1)) */ /* if (i == (num_layers - 1)) */
@ -989,7 +988,7 @@ mng_save_image (const gchar *filename,
} }
pp = png_create_write_struct (PNG_LIBPNG_VER_STRING, pp = png_create_write_struct (PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL); NULL, NULL, NULL);
if (NULL == pp) if (NULL == pp)
{ {
g_warning ("Unable to png_create_write_struct() in mng_save_image()"); g_warning ("Unable to png_create_write_struct() in mng_save_image()");
@ -1047,7 +1046,7 @@ mng_save_image (const gchar *filename,
color_type = PNG_COLOR_TYPE_PALETTE; color_type = PNG_COLOR_TYPE_PALETTE;
layer_has_unique_palette = layer_has_unique_palette =
respin_cmap (pp, info, layer_remap, respin_cmap (pp, info, layer_remap,
image_id, layer_drawable, image_id, layer_buffer,
&bit_depth); &bit_depth);
break; break;
default: default:
@ -1061,11 +1060,11 @@ mng_save_image (const gchar *filename,
/* Note: png_set_IHDR() must be called before any other /* Note: png_set_IHDR() must be called before any other
png_set_*() functions. */ png_set_*() functions. */
png_set_IHDR (pp, info, layer_cols, layer_rows, png_set_IHDR (pp, info, layer_cols, layer_rows,
bit_depth, bit_depth,
color_type, color_type,
mng_data.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE, mng_data.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_COMPRESSION_TYPE_BASE,
PNG_FILTER_TYPE_BASE); PNG_FILTER_TYPE_BASE);
if (mngg.has_trns) if (mngg.has_trns)
{ {
@ -1097,9 +1096,6 @@ mng_save_image (const gchar *filename,
for (j = 0; j < tile_height; j++) for (j = 0; j < tile_height; j++)
layer_pixels[j] = layer_pixel + (layer_cols * layer_bpp * j); layer_pixels[j] = layer_pixel + (layer_cols * layer_bpp * j);
gimp_pixel_rgn_init (&layer_pixel_rgn, layer_drawable, 0, 0,
layer_cols, layer_rows, FALSE, FALSE);
for (pass = 0; pass < num_passes; pass++) for (pass = 0; pass < num_passes; pass++)
{ {
for (begin = 0, end = tile_height; for (begin = 0, end = tile_height;
@ -1110,8 +1106,11 @@ mng_save_image (const gchar *filename,
end = layer_rows; end = layer_rows;
num = end - begin; num = end - begin;
gimp_pixel_rgn_get_rect (&layer_pixel_rgn, layer_pixel, 0,
begin, layer_cols, num); gegl_buffer_get (layer_buffer,
GEGL_RECTANGLE (0, begin, layer_cols, num), 1.0,
layer_format, layer_pixel,
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
if (png_get_valid (pp, info, PNG_INFO_tRNS)) if (png_get_valid (pp, info, PNG_INFO_tRNS))
{ {
@ -1124,9 +1123,8 @@ mng_save_image (const gchar *filename,
layer_remap[fixed[k * 2]] : 0; layer_remap[fixed[k * 2]] : 0;
} }
} }
else else if (png_get_valid (pp, info, PNG_INFO_PLTE)
if (png_get_valid (pp, info, PNG_INFO_PLTE) && (layer_bpp == 2))
&& (layer_bpp == 2))
{ {
for (j = 0; j < num; j++) for (j = 0; j < num; j++)
{ {
@ -1141,6 +1139,8 @@ mng_save_image (const gchar *filename,
} }
} }
g_object_unref (layer_buffer);
png_write_end (pp, info); png_write_end (pp, info);
png_destroy_write_struct (&pp, &info); png_destroy_write_struct (&pp, &info);
@ -1572,6 +1572,16 @@ mng_save_dialog (gint32 image_id)
/* GIMP calls these methods. */ /* GIMP calls these methods. */
const GimpPlugInInfo PLUG_IN_INFO =
{
NULL,
NULL,
query,
run
};
MAIN ()
static void static void
query (void) query (void)
{ {
@ -1625,9 +1635,11 @@ run (const gchar *name,
static GimpParam values[2]; static GimpParam values[2];
INIT_I18N (); INIT_I18N ();
gegl_init (NULL, NULL);
*nreturn_vals = 1; *nreturn_vals = 1;
*return_vals = values; *return_vals = values;
values[0].type = GIMP_PDB_STATUS; values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = GIMP_PDB_SUCCESS; values[0].data.d_status = GIMP_PDB_SUCCESS;
@ -1646,11 +1658,11 @@ run (const gchar *name,
gimp_ui_init (PLUG_IN_BINARY, FALSE); gimp_ui_init (PLUG_IN_BINARY, FALSE);
export = gimp_export_image (&image_id, &drawable_id, NULL, export = gimp_export_image (&image_id, &drawable_id, NULL,
(GIMP_EXPORT_CAN_HANDLE_RGB | GIMP_EXPORT_CAN_HANDLE_RGB |
GIMP_EXPORT_CAN_HANDLE_GRAY | GIMP_EXPORT_CAN_HANDLE_GRAY |
GIMP_EXPORT_CAN_HANDLE_INDEXED | GIMP_EXPORT_CAN_HANDLE_INDEXED |
GIMP_EXPORT_CAN_HANDLE_ALPHA | GIMP_EXPORT_CAN_HANDLE_ALPHA |
GIMP_EXPORT_CAN_HANDLE_LAYERS)); GIMP_EXPORT_CAN_HANDLE_LAYERS);
} }
if (export == GIMP_EXPORT_CANCEL) if (export == GIMP_EXPORT_CANCEL)
@ -1767,17 +1779,3 @@ run (const gchar *name,
values[0].data.d_status = GIMP_PDB_CALLING_ERROR; values[0].data.d_status = GIMP_PDB_CALLING_ERROR;
} }
} }
/* Only query and run are implemented by this plug-in. */
const GimpPlugInInfo PLUG_IN_INFO =
{
NULL,
NULL,
query,
run
};
MAIN ()

View File

@ -58,7 +58,7 @@
'file-header' => { ui => 1, gegl => 1 }, 'file-header' => { ui => 1, gegl => 1 },
'file-html-table' => { ui => 1, gegl => 1 }, 'file-html-table' => { ui => 1, gegl => 1 },
'file-jp2-load' => { optional => 1, gegl => 1, libs => 'JP2_LIBS' }, 'file-jp2-load' => { optional => 1, gegl => 1, libs => 'JP2_LIBS' },
'file-mng' => { ui => 1, optional => 1, libs => 'MNG_LIBS', cflags => 'MNG_CFLAGS' }, 'file-mng' => { ui => 1, gegl => 1, optional => 1, libs => 'MNG_LIBS', cflags => 'MNG_CFLAGS' },
'file-pat' => { ui => 1, gegl => 1 }, 'file-pat' => { ui => 1, gegl => 1 },
'file-pcx' => { ui => 1, gegl => 1 }, 'file-pcx' => { ui => 1, gegl => 1 },
'file-pix' => { ui => 1, gegl => 1 }, 'file-pix' => { ui => 1, gegl => 1 },