mirror of https://github.com/GNOME/gimp.git
plug-ins: clean up the file-webp loading code
This commit is contained in:
parent
52b6eaa11a
commit
381d9e9b7a
|
@ -50,7 +50,7 @@ create_layer (gint32 image_ID,
|
|||
gint32 offsety)
|
||||
{
|
||||
gint32 layer_ID;
|
||||
GeglBuffer *geglbuffer;
|
||||
GeglBuffer *buffer;
|
||||
GeglRectangle extent;
|
||||
|
||||
layer_ID = gimp_layer_new (image_ID, name,
|
||||
|
@ -67,18 +67,16 @@ create_layer (gint32 image_ID,
|
|||
}
|
||||
|
||||
/* Retrieve the buffer for the layer */
|
||||
geglbuffer = gimp_drawable_get_buffer (layer_ID);
|
||||
buffer = gimp_drawable_get_buffer (layer_ID);
|
||||
|
||||
/* Copy the image data to the region */
|
||||
gegl_rectangle_set (&extent, 0, 0, width, height);
|
||||
gegl_buffer_set (geglbuffer, &extent, 0, NULL, layer_data,
|
||||
gegl_buffer_set (buffer, &extent, 0, NULL, layer_data,
|
||||
GEGL_AUTO_ROWSTRIDE);
|
||||
|
||||
/* Flush the drawable and detach */
|
||||
gegl_buffer_flush (geglbuffer);
|
||||
|
||||
if (geglbuffer)
|
||||
g_object_unref (geglbuffer);
|
||||
gegl_buffer_flush (buffer);
|
||||
g_object_unref (buffer);
|
||||
}
|
||||
|
||||
gint32
|
||||
|
@ -86,24 +84,18 @@ load_image (const gchar *filename,
|
|||
gboolean interactive,
|
||||
GError **error)
|
||||
{
|
||||
uint8_t *indata = NULL;
|
||||
uint8_t *outdata;
|
||||
gsize indatalen;
|
||||
gint width;
|
||||
gint height;
|
||||
gint32 image_ID;
|
||||
GFile *file;
|
||||
GimpMetadata *metadata;
|
||||
WebPMux *mux;
|
||||
WebPBitstreamFeatures features;
|
||||
WebPData wp_data;
|
||||
uint32_t flag;
|
||||
int animation = FALSE;
|
||||
int icc = FALSE;
|
||||
int exif = FALSE;
|
||||
int xmp = FALSE;
|
||||
int frames = 0;
|
||||
gchar *name;
|
||||
uint8_t *indata = NULL;
|
||||
gsize indatalen;
|
||||
gint width;
|
||||
gint height;
|
||||
gint32 image_ID;
|
||||
WebPMux *mux;
|
||||
WebPData wp_data;
|
||||
uint32_t flags;
|
||||
gboolean animation = FALSE;
|
||||
gboolean icc = FALSE;
|
||||
gboolean exif = FALSE;
|
||||
gboolean xmp = FALSE;
|
||||
|
||||
/* Attempt to read the file contents from disk */
|
||||
if (! g_file_get_contents (filename,
|
||||
|
@ -124,35 +116,25 @@ load_image (const gchar *filename,
|
|||
}
|
||||
|
||||
wp_data.bytes = indata;
|
||||
wp_data.size = indatalen;
|
||||
wp_data.size = indatalen;
|
||||
|
||||
mux = WebPMuxCreate (&wp_data, 1);
|
||||
if (! mux)
|
||||
return -1;
|
||||
|
||||
WebPMuxGetFeatures (mux, &flag);
|
||||
if (flag == 0)
|
||||
{
|
||||
animation = FALSE;
|
||||
icc = FALSE;
|
||||
exif = FALSE;
|
||||
xmp = FALSE;
|
||||
frames = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (flag & ANIMATION_FLAG)
|
||||
animation = TRUE;
|
||||
WebPMuxGetFeatures (mux, &flags);
|
||||
|
||||
if (flag & ICCP_FLAG)
|
||||
icc = TRUE;
|
||||
if (flags & ANIMATION_FLAG)
|
||||
animation = TRUE;
|
||||
|
||||
if (flag & EXIF_FLAG)
|
||||
exif = TRUE;
|
||||
if (flags & ICCP_FLAG)
|
||||
icc = TRUE;
|
||||
|
||||
if (flag & XMP_FLAG)
|
||||
xmp = TRUE;
|
||||
}
|
||||
if (flags & EXIF_FLAG)
|
||||
exif = TRUE;
|
||||
|
||||
if (flags & XMP_FLAG)
|
||||
xmp = TRUE;
|
||||
|
||||
/* TODO: decode the image in "chunks" or "tiles" */
|
||||
/* TODO: check if an alpha channel is present */
|
||||
|
@ -162,6 +144,8 @@ load_image (const gchar *filename,
|
|||
|
||||
if (! animation)
|
||||
{
|
||||
uint8_t *outdata;
|
||||
|
||||
/* Attempt to decode the data as a WebP image */
|
||||
outdata = WebPDecodeRGBA (indata, indatalen, &width, &height);
|
||||
|
||||
|
@ -182,19 +166,23 @@ load_image (const gchar *filename,
|
|||
{
|
||||
const WebPChunkId id = WEBP_CHUNK_ANMF;
|
||||
WebPMuxAnimParams params;
|
||||
gint loop;
|
||||
gint frames = 0;
|
||||
gint i;
|
||||
|
||||
WebPMuxGetAnimationParams (mux, ¶ms);
|
||||
WebPMuxNumChunks (mux, id, &frames);
|
||||
|
||||
/* Attempt to decode the data as a WebP animation image */
|
||||
for (loop = 0; loop < frames; loop++)
|
||||
for (i = 0; i < frames; i++)
|
||||
{
|
||||
WebPMuxFrameInfo thisframe;
|
||||
gint i = loop;
|
||||
|
||||
if (WebPMuxGetFrame (mux, i, &thisframe) == WEBP_MUX_OK)
|
||||
{
|
||||
WebPBitstreamFeatures features;
|
||||
uint8_t *outdata;
|
||||
gchar *name;
|
||||
|
||||
WebPGetFeatures (thisframe.bitstream.bytes,
|
||||
thisframe.bitstream.size, &features);
|
||||
|
||||
|
@ -205,7 +193,7 @@ load_image (const gchar *filename,
|
|||
if (! outdata)
|
||||
return -1;
|
||||
|
||||
name = g_strdup_printf (_("Frame %d"), loop + 1);
|
||||
name = g_strdup_printf (_("Frame %d"), i + 1);
|
||||
create_layer (image_ID, outdata, 0,
|
||||
name, width, height,
|
||||
thisframe.x_offset,
|
||||
|
@ -218,10 +206,10 @@ load_image (const gchar *filename,
|
|||
|
||||
WebPDataClear (&thisframe.bitstream);
|
||||
}
|
||||
|
||||
WebPDataClear (&wp_data);
|
||||
}
|
||||
|
||||
WebPDataClear (&wp_data);
|
||||
|
||||
if (icc)
|
||||
{
|
||||
WebPData icc_profile;
|
||||
|
@ -239,6 +227,9 @@ load_image (const gchar *filename,
|
|||
|
||||
if (exif || xmp)
|
||||
{
|
||||
GimpMetadata *metadata;
|
||||
GFile *file;
|
||||
|
||||
if (exif)
|
||||
{
|
||||
WebPData exif;
|
||||
|
|
Loading…
Reference in New Issue