diff options
author | Tim Janik <timj@gtk.org> | 2001-06-26 08:34:26 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 2001-06-26 08:34:26 +0000 |
commit | 0b7418572ee7a8d900a315e67fcb12a56e21459b (patch) | |
tree | 0bdc0446657458a9df2a26a12f1a037a0396a476 /gdk-pixbuf | |
parent | bf0d61a59b9e1b889ba98b36b05a90e76f64eced (diff) | |
download | gtk+-0b7418572ee7a8d900a315e67fcb12a56e21459b.tar.gz |
hm, second attempt. it's fight CVS time again.
Tue Jun 26 09:48:02 2001 Tim Janik <timj@gtk.org>
* Makefile.am (noinst_PROGRAMS): get rid of make-inline-pixbuf
* gdk-pixbuf-data.[hc]: provide gdk_pixbuf_new_from_stream()
instead from gdk_pixbuf_new_from_inline().
* gdk-pixdata.[hc]: auxillary GdkPixdata structure, public
installed API for applications that need to serialize/deserialize
on their own (gimp, BEAST).
* gdk-pixbuf/gdk-pixbuf-csource.c: provide publically installed
program that can dump images in CSource format and Pixbuf
stream format. supports RLE encoding, MACRO formatting etc...
invoke with --help.
Tue Jun 26 10:04:30 2001 Tim Janik <timj@gtk.org>
* gtk/gtkiconfactory.c:
* gtk/gtkitemfactory.c: use gdk_pixbuf_new_from_stream(). fixed up
item factory so inlined pixbufs actually work.
Diffstat (limited to 'gdk-pixbuf')
-rw-r--r-- | gdk-pixbuf/ChangeLog | 16 | ||||
-rw-r--r-- | gdk-pixbuf/Makefile.am | 36 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf-data.c | 251 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf-private.h | 10 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf.h | 18 |
5 files changed, 50 insertions, 281 deletions
diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index a024030d23..992773220d 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,19 @@ +Tue Jun 26 09:48:02 2001 Tim Janik <timj@gtk.org> + + * Makefile.am (noinst_PROGRAMS): get rid of make-inline-pixbuf + + * gdk-pixbuf-data.[hc]: provide gdk_pixbuf_new_from_stream() + instead from gdk_pixbuf_new_from_inline(). + + * gdk-pixdata.[hc]: auxillary GdkPixdata structure, public + installed API for applications that need to serialize/deserialize + on their own (gimp, BEAST). + + * gdk-pixbuf/gdk-pixbuf-csource.c: provide publically installed + program that can dump images in CSource format and Pixbuf + stream format. supports RLE encoding, MACRO formatting etc... + invoke with --help. + Mon Jun 25 00:28:11 2001 Owen Taylor <otaylor@redhat.com> * Makefile.am: Actually update timestamps, so rules don't diff --git a/gdk-pixbuf/Makefile.am b/gdk-pixbuf/Makefile.am index cfe6316664..374ea905a3 100644 --- a/gdk-pixbuf/Makefile.am +++ b/gdk-pixbuf/Makefile.am @@ -164,12 +164,15 @@ TESTS = test-gdk-pixbuf test-loaders noinst_PROGRAMS = $(TESTS) DEPS = libgdk_pixbuf-1.3.la -INCLUDES = -I$(top_srcdir) -I$(top_builddir) \ +INCLUDES = @STRIP_BEGIN@ \ + -I$(top_srcdir) -I$(top_builddir) \ -I$(top_srcdir)/gdk-pixbuf \ -I$(top_builddir)/gdk-pixbuf \ @INCLUDED_LOADER_DEFINE@ \ @GTK_DEBUG_FLAGS@ \ - @GDK_PIXBUF_DEP_CFLAGS@ + @GDK_PIXBUF_DEP_CFLAGS@ \ +@STRIP_END@ + AM_CPPFLAGS = "-DPIXBUF_LIBDIR=\"$(loaderdir)\"" "-DBUILT_MODULES_DIR=\"$(srcdir)/.libs\"" LDADDS = libgdk_pixbuf-1.3.la @@ -179,12 +182,13 @@ test_loaders_LDADD = $(LDADDS) test_loaders_SOURCES = test-loaders.c test-images.h -bin_PROGRAMS=make-inline-pixbuf - -make_inline_pixbuf_SOURCES=make-inline-pixbuf.c - -make_inline_pixbuf_LDADD = $(LDADDS) +#noinst_PROGRAMS=make-inline-pixbuf +#make_inline_pixbuf_SOURCES=make-inline-pixbuf.c +#make_inline_pixbuf_LDADD = $(LDADDS) +bin_PROGRAMS = gdk-pixbuf-csource +gdk_pixbuf_csource_SOURCES = gdk-pixbuf-csource.c +gdk_pixbuf_csource_LDADD = $(LDADDS) # @@ -195,7 +199,7 @@ BUILT_SOURCES=gdk-pixbuf-marshal.h gdk-pixbuf-marshal.c libgdk_pixbufincludedir = $(includedir)/gtk-2.0/gdk-pixbuf -libgdk_pixbuf_1_3_la_SOURCES = \ +libgdk_pixbuf_1_3_la_SOURCES = @STRIP_BEGIN@ \ gdk-pixbuf-i18n.h \ gdk-pixbuf.c \ gdk-pixbuf-animation.c \ @@ -203,20 +207,26 @@ libgdk_pixbuf_1_3_la_SOURCES = \ gdk-pixbuf-io.c \ gdk-pixbuf-loader.c \ gdk-pixbuf-scale.c \ - gdk-pixbuf-util.c + gdk-pixbuf-util.c \ + gdk-pixdata.c \ +@STRIP_END@ + $(libgdk_pixbuf_1_3_la_OBJECTS): gdk-pixbuf-marshal.h gdk-pixbuf-marshal.c -libgdk_pixbuf_1_3_la_LDFLAGS = \ +libgdk_pixbuf_1_3_la_LDFLAGS = @STRIP_BEGIN@ \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ - @LIBTOOL_EXPORT_OPTIONS@ + @LIBTOOL_EXPORT_OPTIONS@ \ +@STRIP_END@ + libgdk_pixbuf_1_3_la_LIBADD = pixops/libpixops.la $(builtin_objs) $(GDK_PIXBUF_DEP_LIBS) libgdk_pixbuf_1_3_la_DEPENDENCIES = $(builtin_objs) -libgdk_pixbufinclude_HEADERS = \ +libgdk_pixbufinclude_HEADERS = \ gdk-pixbuf.h \ gdk-pixbuf-loader.h \ - gdk-pixbuf-features.h + gdk-pixbuf-features.h \ + gdk-pixdata.h noinst_HEADERS = \ gdk-pixbuf-io.h \ diff --git a/gdk-pixbuf/gdk-pixbuf-data.c b/gdk-pixbuf/gdk-pixbuf-data.c index 95903b527f..15f5aa8b82 100644 --- a/gdk-pixbuf/gdk-pixbuf-data.c +++ b/gdk-pixbuf/gdk-pixbuf-data.c @@ -78,254 +78,3 @@ gdk_pixbuf_new_from_data (const guchar *data, GdkColorspace colorspace, gboolean return pixbuf; } - -static guint32 -read_int (const guchar **p) -{ - guint32 num; - - /* Note most significant bytes are first in the byte stream */ - num = - (*p)[3] | - ((*p)[2] << 8) | - ((*p)[1] << 16) | - ((*p)[0] << 24); - - *p += 4; - - return num; -} - -static gboolean -read_bool (const guchar **p) -{ - gboolean val = **p != 0; - - ++(*p); - - return val; -} - -static GdkPixbuf* -read_raw_inline (const guchar *data, - gboolean copy_pixels, - int length, - GError **error) -{ - GdkPixbuf *pixbuf; - const guchar *p = data; - guint32 rowstride, width, height, colorspace, - n_channels, bits_per_sample; - gboolean has_alpha; - - if (length >= 0 && length < 12) { - /* Not enough buffer to hold the width/height/rowstride */ - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image data is partially missing")); - - return NULL; - } - - rowstride = read_int (&p); - width = read_int (&p); - height = read_int (&p); - - if (rowstride < width) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image has an incorrect pixel rowstride, perhaps the data was corrupted somehow.")); - return NULL; /* bad data from untrusted source. */ - } - - /* rowstride >= width, so we can trust width */ - - length -= 12; - - /* There's some better way like G_MAXINT/height > rowstride - * but I'm not sure it works, so stick to this for now. - */ - if (((double)height) * ((double)rowstride) > (double)G_MAXINT) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image size is impossibly large, perhaps the data was corrupted somehow")); - - return NULL; /* overflow */ - } - - if (length >= 0 && - length < (height * rowstride + 13)) { - /* Not enough buffer to hold the remaining header - * information plus the data. - */ - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image data is partially missing, probably it was corrupted somehow.")); - - return NULL; - } - - /* Read the remaining 13 bytes of header information */ - - has_alpha = read_bool (&p) != FALSE; - colorspace = read_int (&p); - n_channels = read_int (&p); - bits_per_sample = read_int (&p); - - if (colorspace != GDK_COLORSPACE_RGB) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image has an unknown colorspace code (%d), perhaps the image data was corrupted"), - colorspace); - return NULL; - } - - if (bits_per_sample != 8) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image has an improper number of bits per sample (%d), perhaps the image data was corrupted"), - bits_per_sample); - return NULL; - } - - if (has_alpha && n_channels != 4) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image has an improper number of channels (%d), perhaps the image data was corrupted"), - n_channels); - return NULL; - } - - if (!has_alpha && n_channels != 3) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image has an improper number of channels (%d), perhaps the image data was corrupted"), - n_channels); - return NULL; - } - - if (copy_pixels) { - guchar *pixels; - gint dest_rowstride; - gint row; - - pixbuf = gdk_pixbuf_new (colorspace, - has_alpha, bits_per_sample, - width, height); - - if (pixbuf == NULL) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, - _("Not enough memory to store a %d by %d image; try exiting some applications to free memory."), - width, height); - return NULL; - } - - pixels = gdk_pixbuf_get_pixels (pixbuf); - dest_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - - for (row = 0; row < height; row++) { - memcpy (pixels, p, rowstride); - pixels += dest_rowstride; - p += rowstride; - } - } else { - pixbuf = gdk_pixbuf_new_from_data (p, - colorspace, - has_alpha, - bits_per_sample, - width, height, - rowstride, - NULL, NULL); - } - - return pixbuf; -} - -/** - * gdk_pixbuf_new_from_inline: - * @inline_pixbuf: An inlined GdkPixbuf - * @copy_pixels: whether to copy the pixels out of the inline data, or to use them in-place - * @length: length of the inline data - * @error: return location for error - * - * Create a #GdkPixbuf from a custom format invented to store pixbuf - * data in C program code. This library comes with a program called - * "make-inline-pixbuf" that can write out a variable definition - * containing an inlined pixbuf. This is useful if you want to ship a - * program with images, but don't want to depend on any external - * files. - * - * The inline data format contains the pixels in #GdkPixbuf's native - * format. Since the inline pixbuf is read-only static data, you - * don't need to copy it unless you intend to write to it. - * - * If you create a pixbuf from const inline data compiled into your - * program, it's probably safe to ignore errors, since things will - * always succeed. For non-const inline data, you could get out of - * memory. For untrusted inline data located at runtime, you could - * have corrupt inline data in addition. - * - * Return value: A newly-created #GdkPixbuf structure with a reference count of - * 1, or NULL If error is set. - **/ -GdkPixbuf* -gdk_pixbuf_new_from_inline (const guchar *inline_pixbuf, - gboolean copy_pixels, - int length, - GError **error) -{ - const guchar *p; - GdkPixbuf *pixbuf; - GdkPixbufInlineFormat format; - - if (length >= 0 && length < 8) { - /* not enough bytes to contain even the magic number - * and format code. - */ - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image contained no data.")); - return NULL; - } - - p = inline_pixbuf; - - if (read_int (&p) != GDK_PIXBUF_INLINE_MAGIC_NUMBER) { - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("Image isn't in the correct format (inline GdkPixbuf format)")); - return NULL; - } - - format = read_int (&p); - - switch (format) - { - case GDK_PIXBUF_INLINE_RAW: - pixbuf = read_raw_inline (p, copy_pixels, length - 8, error); - break; - - default: - g_set_error (error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_UNKNOWN_TYPE, - _("This version of the software is unable to read images with type code %d"), - format); - return NULL; - } - - return pixbuf; -} - diff --git a/gdk-pixbuf/gdk-pixbuf-private.h b/gdk-pixbuf/gdk-pixbuf-private.h index 0bdae8715d..4393cbe336 100644 --- a/gdk-pixbuf/gdk-pixbuf-private.h +++ b/gdk-pixbuf/gdk-pixbuf-private.h @@ -130,16 +130,6 @@ struct _GdkPixbufAnimationIterClass { -#define GDK_PIXBUF_INLINE_MAGIC_NUMBER 0x47646B50 /* 'GdkP' */ - -typedef enum -{ - GDK_PIXBUF_INLINE_RAW = 0, - GDK_PIXBUF_INLINE_RLE = 1 -} GdkPixbufInlineFormat; - - - GdkPixbufAnimation* gdk_pixbuf_non_anim_new (GdkPixbuf *pixbuf); #endif diff --git a/gdk-pixbuf/gdk-pixbuf.h b/gdk-pixbuf/gdk-pixbuf.h index 32ab3a8f46..2a32c2fa2b 100644 --- a/gdk-pixbuf/gdk-pixbuf.h +++ b/gdk-pixbuf/gdk-pixbuf.h @@ -75,6 +75,12 @@ typedef void (* GdkPixbufDestroyNotify) (guchar *pixels, gpointer data); #define GDK_PIXBUF_ERROR gdk_pixbuf_error_quark () typedef enum { + /* stream header corrupt */ + GDK_PIXBUF_ERROR_HEADER_CORRUPT, + /* stream pixel data corrupt */ + GDK_PIXBUF_ERROR_PIXEL_CORRUPT, + /* stream header corrupt */ + GDK_PIXBUF_ERROR_UNKNOWN_FORMAT, /* image data hosed */ GDK_PIXBUF_ERROR_CORRUPT_IMAGE, /* no mem to load image */ @@ -142,13 +148,11 @@ GdkPixbuf *gdk_pixbuf_new_from_data (const guchar *data, gpointer destroy_fn_data); GdkPixbuf *gdk_pixbuf_new_from_xpm_data (const char **data); - -/* Read an inline pixbuf */ -GdkPixbuf *gdk_pixbuf_new_from_inline (const guchar *inline_pixbuf, - gboolean copy_pixels, - int length, - GError **error); - +GdkPixbuf* gdk_pixbuf_new_from_stream (gint stream_length, + const guint8 *stream, + gboolean copy_pixels, + GError **error); + /* Mutations */ void gdk_pixbuf_fill (GdkPixbuf *pixbuf, guint32 pixel); |