summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-09-23 21:26:52 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-09-23 21:36:03 -0400
commitc8c11b689966b61d098197cd6ffec6e900402db9 (patch)
tree28ba28ab3114e1ffdd69f12012f2fce77a8228f1
parentaf2fca9bba5c127ca092c3a4bf7656015d6168ad (diff)
downloadgdk-pixbuf-c8c11b689966b61d098197cd6ffec6e900402db9.tar.gz
Drop the pcx loader
This is another rarely seen, ancient image format, and nobody is maintaining this loader inside gdk-pixbuf. https://bugzilla.gnome.org/show_bug.cgi?id=721372
-rw-r--r--configure.ac3
-rw-r--r--gdk-pixbuf/Makefile.am19
-rw-r--r--gdk-pixbuf/io-pcx.c758
3 files changed, 2 insertions, 778 deletions
diff --git a/configure.ac b/configure.ac
index b722e6423..a50a8f788 100644
--- a/configure.ac
+++ b/configure.ac
@@ -679,7 +679,7 @@ fi
# because some important apps like GIMP need to read and write
# arbitrary tEXt chunks which doesn't seem to be possible through GDI+
-all_loaders="ani,icns,pcx,tga,png,pnm,xbm,xpm,qtif"
+all_loaders="ani,icns,tga,png,pnm,xbm,xpm,qtif"
if test x$with_libjasper = xyes; then
all_loaders="$all_loaders,jasper"
fi
@@ -745,7 +745,6 @@ AM_CONDITIONAL(INCLUDE_TIFF, [test x"$INCLUDE_tiff" = xyes])
AM_CONDITIONAL(INCLUDE_XPM, [test x"$INCLUDE_xpm" = xyes])
AM_CONDITIONAL(INCLUDE_XBM, [test x"$INCLUDE_xbm" = xyes])
AM_CONDITIONAL(INCLUDE_TGA, [test x"$INCLUDE_tga" = xyes])
-AM_CONDITIONAL(INCLUDE_PCX, [test x"$INCLUDE_pcx" = xyes])
AM_CONDITIONAL(INCLUDE_ICNS, [test x"$INCLUDE_icns" = xyes])
AM_CONDITIONAL(INCLUDE_JASPER, [test x"$INCLUDE_jasper" = xyes])
AM_CONDITIONAL(INCLUDE_QTIF, [test x"$INCLUDE_qtif" = xyes])
diff --git a/gdk-pixbuf/Makefile.am b/gdk-pixbuf/Makefile.am
index 0e96b418a..011efafef 100644
--- a/gdk-pixbuf/Makefile.am
+++ b/gdk-pixbuf/Makefile.am
@@ -163,14 +163,6 @@ libpixbufloader_icns_la_LDFLAGS = -avoid-version -module $(no_undefined)
libpixbufloader_icns_la_LIBADD = $(module_libs)
#
-# The PCX loader
-#
-libstatic_pixbufloader_pcx_la_SOURCES = io-pcx.c
-libpixbufloader_pcx_la_SOURCES = io-pcx.c
-libpixbufloader_pcx_la_LDFLAGS = -avoid-version -module $(no_undefined)
-libpixbufloader_pcx_la_LIBADD = $(module_libs)
-
-#
# The JPEG2000 loader
#
libstatic_pixbufloader_jasper_la_SOURCES = io-jasper.c
@@ -407,12 +399,6 @@ else
TGA_LIB = libpixbufloader-tga.la
endif
-if INCLUDE_PCX
-STATIC_PCX_LIB = libstatic-pixbufloader-pcx.la
-else
-PCX_LIB = libpixbufloader-pcx.la
-endif
-
if INCLUDE_ICNS
STATIC_ICNS_LIB = libstatic-pixbufloader-icns.la
else
@@ -451,7 +437,6 @@ loader_LTLIBRARIES = \
$(XBM_LIB) \
$(TGA_LIB) \
$(ICNS_LIB) \
- $(PCX_LIB) \
$(JASPER_LIB) \
$(QTIF_LIB) \
$(GDIPLUS_LIBS)
@@ -473,7 +458,6 @@ noinst_LTLIBRARIES = \
$(STATIC_XBM_LIB) \
$(STATIC_TGA_LIB) \
$(STATIC_ICNS_LIB) \
- $(STATIC_PCX_LIB) \
$(STATIC_JASPER_LIB) \
$(STATIC_QTIF_LIB) \
$(STATIC_GDIPLUS_LIBS)
@@ -662,14 +646,13 @@ gdk_pixbuf_FILES = \
$(libgdk_pixbuf_2_0_la_SOURCES) \
$(libstatic_pixbufloader_ani_la_SOURCES) \
$(libstatic_pixbufloader_icns_la_SOURCES) \
- $(libstatic_pixbufloader_pcx_la_SOURCES) \
$(libstatic_pixbufloader_pixdata_la_SOURCES) \
$(libstatic_pixbufloader_pnm_la_SOURCES) \
$(libstatic_pixbufloader_png_la_SOURCES) \
$(libstatic_pixbufloader_qtif_la_SOURCES) \
$(libstatic_pixbufloader_tga_la_SOURCES) \
$(libstatic_pixbufloader_xpm_la_SOURCES) \
- $(libstatic_pixbufloader_xbm_la_SOURCES) \
+ $(libstatic_pixbufloader_xbm_la_SOURCES)
gdk_pixbuf_EXCLUDES = gdkpdummy
diff --git a/gdk-pixbuf/io-pcx.c b/gdk-pixbuf/io-pcx.c
deleted file mode 100644
index 679a09ef7..000000000
--- a/gdk-pixbuf/io-pcx.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/*
- * GdkPixbuf library - PCX image loader
- *
- * Copyright (C) 2003 Josh A. Beam
- *
- * Authors: Josh A. Beam <josh@joshbeam.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-#include <stdio.h>
-#include <string.h>
-#include "gdk-pixbuf-private.h"
-
-#undef PCX_DEBUG
-
-#define PCX_TASK_DONE 0
-#define PCX_TASK_LOAD_HEADER 1
-#define PCX_TASK_LOAD_DATA 2
-#define PCX_TASK_LOAD_PALETTE 3
-
-struct pcx_header {
- guint8 manufacturer;
- guint8 version;
- guint8 encoding;
- guint8 bitsperpixel;
- gint16 xmin;
- gint16 ymin;
- gint16 xmax;
- gint16 ymax;
- guint16 horizdpi;
- guint16 vertdpi;
- guint8 palette[48];
- guint8 reserved;
- guint8 colorplanes;
- guint16 bytesperline;
- guint16 palettetype;
- guint16 hscrsize;
- guint16 vscrsize;
- guint8 filler[54];
-};
-
-struct pcx_context {
- GdkPixbuf *pixbuf;
- gint rowstride;
-
- GdkPixbufModuleSizeFunc size_func;
- GdkPixbufModuleUpdatedFunc updated_func;
- GdkPixbufModulePreparedFunc prepared_func;
- gpointer user_data;
-
- guchar current_task;
-
- gboolean header_loaded;
- struct pcx_header *header;
- guint bpp;
- gint width, height;
- guint num_planes;
- guint bytesperline;
-
- guchar *buf;
- guint buf_size;
- guint buf_pos;
- guchar *data;
- guchar *line;
- guint current_line;
- guchar *p_data;
-};
-
-/*
- * set context's image information based on the header
- */
-static void
-fill_pcx_context(struct pcx_context *context)
-{
- struct pcx_header *header = context->header;
-
- context->bpp = header->bitsperpixel;
- context->width = header->xmax - header->xmin + 1;
- context->height = header->ymax - header->ymin + 1;
- context->num_planes = header->colorplanes;
- context->bytesperline = header->bytesperline;
-
- if(header->version == 5 && context->bpp == 8 && context->num_planes == 3)
- context->bpp = 24;
-}
-
-static void
-free_pcx_context(struct pcx_context *context, gboolean unref_pixbuf)
-{
- g_free(context->header);
- g_free(context->buf);
- if(unref_pixbuf && context->pixbuf)
- g_object_unref(context->pixbuf);
- g_free(context->line);
- g_free(context->p_data);
-
- g_free(context);
-}
-
-/*
- * read each plane of a single scanline. store_planes is
- * the number of planes that can be stored in the planes array.
- * data is the pointer to the block of memory to read
- * from, size is the length of that data, and line_bytes
- * is where the number of bytes read will be stored.
- */
-static gboolean
-read_scanline_data(guchar *data, guint size, guchar *planes[],
- guint store_planes, guint num_planes, guint bytesperline,
- guint *line_bytes)
-{
- guint i, j;
- guint p, count;
- guint d = 0;
- guint8 byte;
-
- for(p = 0; p < num_planes; p++) {
- for(i = 0; i < bytesperline;) { /* i incremented when line byte set */
- if(d >= size)
- return FALSE;
- byte = data[d++];
-
- if(byte >> 6 == 0x3) {
- count = byte & ~(0x3 << 6);
- if(count == 0)
- return FALSE;
- if(d >= size)
- return FALSE;
- byte = data[d++];
- } else {
- count = 1;
- }
-
- for(j = 0; j < count; j++) {
- if(p < store_planes)
- planes[p][i++] = byte;
- else
- i++;
-
- if(i >= bytesperline) {
- p++;
- if(p >= num_planes) {
- *line_bytes = d;
- return TRUE;
- }
- i = 0;
- }
- }
- }
- }
-
- *line_bytes = d; /* number of bytes read for scanline */
- return TRUE;
-}
-
-static gpointer
-gdk_pixbuf__pcx_begin_load(GdkPixbufModuleSizeFunc size_func,
- GdkPixbufModulePreparedFunc prepared_func,
- GdkPixbufModuleUpdatedFunc updated_func,
- gpointer user_data, GError **error)
-{
- struct pcx_context *context;
-
- context = g_new0(struct pcx_context, 1);
- if(!context)
- return NULL;
-
- context->header = g_try_malloc(sizeof(struct pcx_header));
- if(!context->header) {
- g_free(context);
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for header"));
- return NULL;
- }
-
- context->size_func = size_func;
- context->updated_func = updated_func;
- context->prepared_func = prepared_func;
- context->user_data = user_data;
-
- context->current_task = PCX_TASK_LOAD_HEADER;
-
- context->buf = g_try_malloc(sizeof(guchar) * 512);
- if(!context->buf) {
- g_free(context->header);
- g_free(context);
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for context buffer"));
- return NULL;
- }
- context->buf_size = 512;
-
- context->header_loaded = FALSE;
-
- return context;
-}
-
-static gboolean
-pcx_resize_context_buf(struct pcx_context *context, guint size)
-{
- guchar *new_buf;
-
- new_buf = g_try_realloc(context->buf, size);
- if(!new_buf)
- return FALSE;
-
- context->buf = new_buf;
- context->buf_size = size;
- return TRUE;
-}
-
-/*
- * remove a number of bytes (specified by size) from the
- * beginning of a context's buf
- */
-static gboolean
-pcx_chop_context_buf(struct pcx_context *context, guint size)
-{
- guint i, j;
-
- if (size > context->buf_pos)
- return FALSE;
- else if (size == 0)
- return TRUE;
-
- for (i = 0, j = size; j < context->buf_pos; i++, j++)
- context->buf[i] = context->buf[j];
-
- context->buf_pos -= size;
-
- return TRUE;
-}
-
-static guchar
-read_pixel_1(guchar *data, guint offset)
-{
- guchar retval;
- guint bit_offset;
-
- if(!(offset % 8)) {
- offset /= 8;
- retval = data[offset] >> 7;
- } else {
- bit_offset = offset % 8;
- offset -= bit_offset;
- offset /= 8;
- retval = (data[offset] >> (7 - bit_offset)) & 0x1;
- }
-
- return retval;
-}
-
-static guchar
-read_pixel_4(guchar *data, guint offset)
-{
- guchar retval;
-
- if(!(offset % 2)) {
- offset /= 2;
- retval = data[offset] >> 4;
- } else {
- offset--;
- offset /= 2;
- retval = data[offset] & 0xf;
- }
-
- return retval;
-}
-
-static gboolean
-pcx_increment_load_data_1(struct pcx_context *context)
-{
- guint i;
- guchar *planes[4];
- guint line_bytes;
- guint store_planes;
-
- if(context->num_planes == 4) {
- planes[0] = context->line;
- planes[1] = planes[0] + context->bytesperline;
- planes[2] = planes[1] + context->bytesperline;
- planes[3] = planes[2] + context->bytesperline;
- store_planes = 4;
- } else if(context->num_planes == 3) {
- planes[0] = context->line;
- planes[1] = planes[0] + context->bytesperline;
- planes[2] = planes[1] + context->bytesperline;
- store_planes = 3;
- } else if(context->num_planes == 2) {
- planes[0] = context->line;
- planes[1] = planes[0] + context->bytesperline;
- store_planes = 2;
- } else if(context->num_planes == 1) {
- planes[0] = context->line;
- store_planes = 1;
- } else {
- return FALSE;
- }
-
- while(read_scanline_data(context->buf, context->buf_pos, planes, store_planes, context->num_planes, context->bytesperline, &line_bytes)) {
- pcx_chop_context_buf(context, line_bytes);
-
- for(i = 0; i < context->width; i++) {
- guchar p;
-
- if(context->num_planes == 4) {
- p = read_pixel_1(planes[3], i);
- p <<= 1;
- p |= read_pixel_1(planes[2], i);
- p <<= 1;
- p |= read_pixel_1(planes[1], i);
- p <<= 1;
- p |= read_pixel_1(planes[0], i);
- } else if(context->num_planes == 3) {
- p = read_pixel_1(planes[2], i);
- p <<= 1;
- p |= read_pixel_1(planes[1], i);
- p <<= 1;
- p |= read_pixel_1(planes[0], i);
- } else if(context->num_planes == 2) {
- p = read_pixel_1(planes[1], i);
- p <<= 1;
- p |= read_pixel_1(planes[0], i);
- } else if(context->num_planes == 1) {
- p = read_pixel_1(planes[0], i);
- } else {
- return FALSE;
- }
- p &= 0xf;
- context->data[context->current_line * context->rowstride + i * 3 + 0] = context->header->palette[p * 3 + 0];
- context->data[context->current_line * context->rowstride + i * 3 + 1] = context->header->palette[p * 3 + 1];
- context->data[context->current_line * context->rowstride + i * 3 + 2] = context->header->palette[p * 3 + 2];
- }
-
- if(context->updated_func)
- context->updated_func(context->pixbuf, 0, context->current_line, context->width, 1, context->user_data);
-
- context->current_line++;
-
- if(context->current_line == context->height) {
- context->current_task = PCX_TASK_DONE;
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-pcx_increment_load_data_2(struct pcx_context *context)
-{
- guint i;
- guchar *planes[1];
- guint line_bytes;
- guint shift, h;
-
- planes[0] = context->line;
-
- while(read_scanline_data(context->buf, context->buf_pos, planes, 1, context->num_planes, context->bytesperline, &line_bytes)) {
- pcx_chop_context_buf(context, line_bytes);
-
- for(i = 0; i < context->width; i++) {
- shift = 6 - 2 * (i % 4);
- h = (planes[0][i / 4] >> shift) & 0x3;
- context->data[context->current_line * context->rowstride + i * 3 + 0] = context->header->palette[h * 3 + 0];
- context->data[context->current_line * context->rowstride + i * 3 + 1] = context->header->palette[h * 3 + 1];
- context->data[context->current_line * context->rowstride + i * 3 + 2] = context->header->palette[h * 3 + 2];
- }
-
- if(context->updated_func)
- context->updated_func(context->pixbuf, 0, context->current_line, context->width, 1, context->user_data);
-
- context->current_line++;
-
- if(context->current_line == context->height) {
- context->current_task = PCX_TASK_DONE;
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-pcx_increment_load_data_4(struct pcx_context *context)
-{
- guint i;
- guchar *planes[1];
- guint line_bytes;
-
- planes[0] = context->line;
-
- while(read_scanline_data(context->buf, context->buf_pos, planes, 1, context->num_planes, context->bytesperline, &line_bytes)) {
- pcx_chop_context_buf(context, line_bytes);
-
- for(i = 0; i < context->width; i++) {
- guchar p;
-
- p = read_pixel_4(planes[0], i) & 0xf;
- context->data[context->current_line * context->rowstride + i * 3 + 0] = context->header->palette[p * 3 + 0];
- context->data[context->current_line * context->rowstride + i * 3 + 1] = context->header->palette[p * 3 + 1];
- context->data[context->current_line * context->rowstride + i * 3 + 2] = context->header->palette[p * 3 + 2];
- }
-
- if(context->updated_func)
- context->updated_func(context->pixbuf, 0, context->current_line, context->width, 1, context->user_data);
-
- context->current_line++;
-
- if(context->current_line == context->height) {
- context->current_task = PCX_TASK_DONE;
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-/*
- * for loading 8-bit pcx images, we keep a buffer containing
- * each pixel's palette number; once we've loaded each scanline,
- * we wait for loading to stop and call pcx_load_palette_8,
- * which finds the palette at the end of the pcx data and sets the
- * RGB data.
- */
-static gboolean
-pcx_increment_load_data_8(struct pcx_context *context)
-{
- guint i;
- guchar *planes[1];
- guint line_bytes;
-
- planes[0] = context->line;
-
- while(read_scanline_data(context->buf, context->buf_pos, planes, 1, context->num_planes, context->bytesperline, &line_bytes)) {
- pcx_chop_context_buf(context, line_bytes);
-
- for(i = 0; i < context->width; i++)
- context->p_data[context->current_line * context->width + i + 0] = planes[0][i];
-
- context->current_line++;
-
- if(context->current_line == context->height) {
- context->current_task = PCX_TASK_LOAD_PALETTE;
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-/*
- * read the palette and set the RGB data
- */
-static gboolean
-pcx_load_palette_8(struct pcx_context *context)
-{
- guint i, j;
-
- if(context->current_line < context->height)
- return FALSE;
-
- if(context->buf_pos >= 769) {
- guchar *palette = context->buf + (context->buf_pos - 769);
-
- if(palette[0] == 12) {
- palette++;
- for(i = 0; i < context->height; i++) {
- for(j = 0; j < context->width; j++) {
- context->data[i * context->rowstride + j * 3 + 0] = palette[(context->p_data[i * context->width + j]) * 3 + 0];
- context->data[i * context->rowstride + j * 3 + 1] = palette[(context->p_data[i * context->width + j]) * 3 + 1];
- context->data[i * context->rowstride + j * 3 + 2] = palette[(context->p_data[i * context->width + j]) * 3 + 2];
- }
-
- if(context->updated_func)
- context->updated_func(context->pixbuf, 0, i, context->width, 1, context->user_data);
- }
-
-#ifdef PCX_DEBUG
- g_print("read palette\n");
-#endif
-
- context->current_task = PCX_TASK_DONE;
- return TRUE;
- } else {
-#ifdef PCX_DEBUG
- g_print("this ain't a palette\n");
-#endif
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-/*
- * in 24-bit images, each scanline has three color planes
- * for red, green, and blue, respectively.
- */
-static gboolean
-pcx_increment_load_data_24(struct pcx_context *context)
-{
- guint i;
- guchar *planes[3];
- guint line_bytes;
-
- planes[0] = context->line;
- planes[1] = planes[0] + context->bytesperline;
- planes[2] = planes[1] + context->bytesperline;
-
- while(read_scanline_data(context->buf, context->buf_pos, planes, 3, context->num_planes, context->bytesperline, &line_bytes)) {
- pcx_chop_context_buf(context, line_bytes);
-
- for(i = 0; i < context->width; i++) {
- context->data[context->current_line * context->rowstride + i * 3 + 0] = planes[0][i];
- context->data[context->current_line * context->rowstride + i * 3 + 1] = planes[1][i];
- context->data[context->current_line * context->rowstride + i * 3 + 2] = planes[2][i];
- }
-
- if(context->updated_func)
- context->updated_func(context->pixbuf, 0, context->current_line, context->width, 1, context->user_data);
-
- context->current_line++;
-
- if(context->current_line == context->height) {
- context->current_task = PCX_TASK_DONE;
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-static gboolean
-gdk_pixbuf__pcx_load_increment(gpointer data, const guchar *buf, guint size,
- GError **error)
-{
- struct pcx_context *context = (struct pcx_context *)data;
- struct pcx_header *header;
- guint i;
- gboolean retval = TRUE;
-
- /* if context's buf isn't large enough to hold its current data plus the passed buf, increase its size */
- if(context->buf_pos + size > context->buf_size) {
- if(!pcx_resize_context_buf(context, sizeof(guchar) * (context->buf_pos + size))) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for context buffer"));
- return FALSE;
- }
- }
-
- for(i = 0; i < size; i++)
- context->buf[context->buf_pos++] = buf[i];
-
- if(context->current_task == PCX_TASK_LOAD_HEADER) {
- if(!context->header_loaded && context->buf_pos > sizeof(struct pcx_header)) { /* set header */
- gint width, height;
-
- memcpy(context->header, context->buf, sizeof(struct pcx_header));
- pcx_chop_context_buf(context, sizeof(struct pcx_header));
- header = context->header;
-
- /* convert the multi-byte header variables that will be used */
- header->xmin = GINT16_FROM_LE(header->xmin);
- header->ymin = GINT16_FROM_LE(header->ymin);
- header->xmax = GINT16_FROM_LE(header->xmax);
- header->ymax = GINT16_FROM_LE(header->ymax);
- header->bytesperline = GUINT16_FROM_LE(header->bytesperline);
-
-#ifdef PCX_DEBUG
- g_print ("Manufacturer %d\n"
- "Version %d\n"
- "Encoding %d\n"
- "Bits/Pixel %d\n"
- "Planes %d\n"
- "Palette %d\n",
- header->manufacturer, header->version,
- header->encoding, header->bitsperpixel,
- header->colorplanes, header->palettetype);
-#endif
-
- context->header_loaded = TRUE;
- fill_pcx_context(context);
-
- width = context->width;
- height = context->height;
- if(width <= 0 || height <= 0) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE, _("Image has invalid width and/or height"));
- return FALSE;
- }
- if (context->size_func)
- {
- (*context->size_func) (&width, &height, context->user_data);
- if (width == 0 || height == 0)
- return TRUE;
- }
-
- switch(context->bpp) {
- default:
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_UNKNOWN_TYPE, _("Image has unsupported bpp"));
- return FALSE;
- break;
- case 1:
- if(context->num_planes < 1 || context->num_planes > 4) {
- g_set_error(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_UNKNOWN_TYPE, _("Image has unsupported number of %d-bit planes"), 1);
- return FALSE;
- }
- break;
- case 2:
- case 4:
- case 8:
- if(context->num_planes != 1) {
- g_set_error(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_UNKNOWN_TYPE, _("Image has unsupported number of %d-bit planes"), (gint)context->bpp);
- return FALSE;
- }
- break;
- case 24:
- break; /* context's bpp is set to 24 if there are three 8-bit planes */
- }
-
-#ifdef PCX_DEBUG
- g_print("io-pcx: header loaded\n");
- g_print("bpp: %u\n", context->bpp);
- g_print("dimensions: %ux%u\n", context->width, context->height);
-#endif
-
- context->pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, context->width, context->height);
- if(!context->pixbuf) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't create new pixbuf"));
- return FALSE;
- }
- context->data = gdk_pixbuf_get_pixels(context->pixbuf);
- context->rowstride = gdk_pixbuf_get_rowstride(context->pixbuf);
-
- context->line = g_try_malloc(sizeof(guchar) * context->bytesperline * context->num_planes);
- if(!context->line) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for line data"));
- return FALSE;
- }
-
- if(context->bpp == 8) {
- context->p_data = g_try_malloc(sizeof(guchar) * context->width * context->height);
- if(!context->p_data) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for PCX image"));
- return FALSE;
- }
- }
-
- if(context->prepared_func)
- context->prepared_func(context->pixbuf, NULL, context->user_data);
-
- context->current_task = PCX_TASK_LOAD_DATA;
- }
-
- retval = TRUE;
- }
-
- if(context->current_task == PCX_TASK_LOAD_DATA) {
- switch(context->bpp) {
- default:
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_UNKNOWN_TYPE, _("Image has unsupported bpp"));
- retval = FALSE;
- break;
- case 1:
- retval = pcx_increment_load_data_1(context);
- break;
- case 2:
- retval = pcx_increment_load_data_2(context);
- break;
- case 4:
- retval = pcx_increment_load_data_4(context);
- break;
- case 8:
- retval = pcx_increment_load_data_8(context);
- break;
- case 24:
- retval = pcx_increment_load_data_24(context);
- break;
- }
- }
-
- return retval;
-}
-
-static gboolean
-gdk_pixbuf__pcx_stop_load(gpointer data, GError **error)
-{
- struct pcx_context *context = (struct pcx_context *)data;
-
- if(context->current_line != context->height) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED, _("Didn't get all lines of PCX image"));
- free_pcx_context(context, FALSE);
- return FALSE;
- }
-
- if(context->current_task == PCX_TASK_LOAD_PALETTE) {
- if(!pcx_load_palette_8(context)) {
- g_set_error_literal(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED, _("No palette found at end of PCX data"));
- free_pcx_context(context, FALSE);
- return FALSE;
- }
- }
-
- free_pcx_context(context, FALSE);
-
- return TRUE;
-}
-
-#ifndef INCLUDE_pcx
-#define MODULE_ENTRY(function) G_MODULE_EXPORT void function
-#else
-#define MODULE_ENTRY(function) void _gdk_pixbuf__pcx_ ## function
-#endif
-
-MODULE_ENTRY (fill_vtable) (GdkPixbufModule *module)
-{
- module->begin_load = gdk_pixbuf__pcx_begin_load;
- module->stop_load = gdk_pixbuf__pcx_stop_load;
- module->load_increment = gdk_pixbuf__pcx_load_increment;
-}
-
-MODULE_ENTRY (fill_info) (GdkPixbufFormat *info)
-{
- static const GdkPixbufModulePattern signature[] = {
- { "\x0a \x01", NULL, 100 },
- { "\x0a\x02\x01", NULL, 100 },
- { "\x0a\x03\x01", NULL, 100 },
- { "\x0a\x04\x01", NULL, 100 },
- { "\x0a\x05\x01", NULL, 100 },
- { NULL, NULL, 0 }
- };
- static const gchar *mime_types[] = {
- "image/x-pcx",
- NULL,
- };
- static const gchar *extensions[] = {
- "pcx",
- NULL,
- };
-
- info->name = "pcx";
- info->signature = (GdkPixbufModulePattern *) signature;
- info->description = NC_("image format", "PCX");
- info->mime_types = (gchar **) mime_types;
- info->extensions = (gchar **) extensions;
- info->flags = GDK_PIXBUF_FORMAT_THREADSAFE;
- info->license = "LGPL";
-}