diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 6 | ||||
-rw-r--r-- | demos/Makefile.am | 8 | ||||
-rw-r--r-- | demos/testpixbuf.c | 20 | ||||
-rw-r--r-- | docs/reference/gdk-pixbuf/tmpl/creating.sgml | 12 | ||||
-rw-r--r-- | docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml | 11 | ||||
-rw-r--r-- | docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml | 3 | ||||
-rw-r--r-- | docs/reference/gtk/tmpl/gtkitemfactory.sgml | 1 | ||||
-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 | ||||
-rw-r--r-- | gtk/gtkiconfactory.c | 10 | ||||
-rw-r--r-- | gtk/gtkitemfactory.c | 8 | ||||
-rw-r--r-- | gtk/gtkitemfactory.h | 8 | ||||
-rw-r--r-- | gtk/stock-icons/Makefile.am | 4 | ||||
-rw-r--r-- | tests/testgtk.c | 2 |
23 files changed, 318 insertions, 142 deletions
@@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 2c8436614..03a1be9b1 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -5,12 +5,6 @@ Tue Jun 26 11:06:34 2001 Owen Taylor <otaylor@redhat.com> with font lists in descriptions. (#56184, reported by Jonas Borgström) -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. - 2001-06-25 Havoc Pennington <hp@redhat.com> * gtk/gtktreeviewcolumn.h, gtk/gtktreeviewcolumn.c: diff --git a/demos/Makefile.am b/demos/Makefile.am index 5bcf5023c..25eba7265 100644 --- a/demos/Makefile.am +++ b/demos/Makefile.am @@ -32,12 +32,10 @@ noinst_PROGRAMS = \ BUILT_SOURCES=test-inline-pixbufs.h -test-inline-pixbufs.h: $(top_builddir)/gdk-pixbuf/gdk-pixbuf-csource apple-red.png gnome-foot.png +test-inline-pixbufs.h: $(top_builddir)/gdk-pixbuf/make-inline-pixbuf apple-red.png gnome-foot.png (topdir=`cd $(top_builddir) && pwd` ; curdir=`pwd` ; \ - cd $(srcdir) && \ - GDK_PIXBUF_MODULEDIR=$$topdir/gdk-pixbuf/.libs \ - $$topdir/gdk-pixbuf/gdk-pixbuf-csource --build-list \ - apple_red apple-red.png gnome_foot gnome-foot.png >$$curdir/test-inline-pixbufs.h) + cd $(srcdir) && \ + GDK_PIXBUF_MODULEDIR=$$topdir/gdk-pixbuf/.libs $$topdir/gdk-pixbuf/make-inline-pixbuf $$curdir/test-inline-pixbufs.h apple_red apple-red.png gnome_foot gnome-foot.png) testpixbuf_DEPENDENCIES = $(DEPS) testpixbuf_drawable_DEPENDENCIES = $(DEPS) diff --git a/demos/testpixbuf.c b/demos/testpixbuf.c index a2ecbe1f0..0af6d368e 100644 --- a/demos/testpixbuf.c +++ b/demos/testpixbuf.c @@ -543,8 +543,7 @@ main (int argc, char **argv) i = 1; if (argc == 1) { const gchar*** xpmp; - GError *error = NULL; - + pixbuf = gdk_pixbuf_new_from_data (default_image, GDK_COLORSPACE_RGB, FALSE, 8, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_WIDTH * 3, NULL, NULL); @@ -558,18 +557,11 @@ main (int argc, char **argv) } /* Test loading from inline data. */ - pixbuf = gdk_pixbuf_new_from_stream (-1, apple_red, FALSE, &error); - if (!pixbuf) - { - fprintf (stderr, "failed to construct \"red apple\" pixbuf: %s\n", - error->message); - g_error_free (error); - } - else - new_testrgb_window (pixbuf, "Red apple from inlined RLE data"); - - pixbuf = gdk_pixbuf_new_from_stream (sizeof (gnome_foot), gnome_foot, TRUE, NULL); - new_testrgb_window (pixbuf, "GNOME Foot from inlined RLE data"); + pixbuf = gdk_pixbuf_new_from_inline (apple_red, FALSE, -1, NULL); + new_testrgb_window (pixbuf, "Red apple from inline data"); + + pixbuf = gdk_pixbuf_new_from_inline (gnome_foot, TRUE, sizeof (gnome_foot), NULL); + new_testrgb_window (pixbuf, "Foot from inline data"); found_valid = TRUE; } else { diff --git a/docs/reference/gdk-pixbuf/tmpl/creating.sgml b/docs/reference/gdk-pixbuf/tmpl/creating.sgml index 1d017da68..0bbce5405 100644 --- a/docs/reference/gdk-pixbuf/tmpl/creating.sgml +++ b/docs/reference/gdk-pixbuf/tmpl/creating.sgml @@ -82,6 +82,18 @@ Creating a pixbuf from image data that is already in memory. @Returns: +<!-- ##### FUNCTION gdk_pixbuf_new_from_inline ##### --> +<para> + +</para> + +@inline_pixbuf: +@copy_pixels: +@length: +@error: +@Returns: + + <!-- ##### FUNCTION gdk_pixbuf_new_subpixbuf ##### --> <para> diff --git a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml index 099d29a51..910ccef35 100644 --- a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml +++ b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml @@ -552,14 +552,3 @@ End: </para> -<!-- ##### FUNCTION gdk_pixbuf_new_from_inline ##### --> -<para> - -</para> - -@inline_pixbuf: -@copy_pixels: -@length: -@error: -@Returns: - diff --git a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml index ecc32bc20..403941efa 100644 --- a/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml +++ b/docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml @@ -20,9 +20,6 @@ Information that describes an image. </para> -@GDK_PIXBUF_ERROR_HEADER_CORRUPT: -@GDK_PIXBUF_ERROR_PIXEL_CORRUPT: -@GDK_PIXBUF_ERROR_UNKNOWN_FORMAT: @GDK_PIXBUF_ERROR_CORRUPT_IMAGE: @GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY: @GDK_PIXBUF_ERROR_BAD_OPTION_VALUE: diff --git a/docs/reference/gtk/tmpl/gtkitemfactory.sgml b/docs/reference/gtk/tmpl/gtkitemfactory.sgml index abda89259..18c4cc601 100644 --- a/docs/reference/gtk/tmpl/gtkitemfactory.sgml +++ b/docs/reference/gtk/tmpl/gtkitemfactory.sgml @@ -77,6 +77,7 @@ GtkItemFactory @callback_action: @item_type: @extra_data: +@extra_data2: <!-- ##### STRUCT GtkItemFactoryItem ##### --> <para> diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 992773220..a024030d2 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,19 +1,3 @@ -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 374ea905a..cfe631666 100644 --- a/gdk-pixbuf/Makefile.am +++ b/gdk-pixbuf/Makefile.am @@ -164,15 +164,12 @@ TESTS = test-gdk-pixbuf test-loaders noinst_PROGRAMS = $(TESTS) DEPS = libgdk_pixbuf-1.3.la -INCLUDES = @STRIP_BEGIN@ \ - -I$(top_srcdir) -I$(top_builddir) \ +INCLUDES = -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@ \ -@STRIP_END@ - + @GDK_PIXBUF_DEP_CFLAGS@ AM_CPPFLAGS = "-DPIXBUF_LIBDIR=\"$(loaderdir)\"" "-DBUILT_MODULES_DIR=\"$(srcdir)/.libs\"" LDADDS = libgdk_pixbuf-1.3.la @@ -182,13 +179,12 @@ test_loaders_LDADD = $(LDADDS) test_loaders_SOURCES = test-loaders.c test-images.h -#noinst_PROGRAMS=make-inline-pixbuf -#make_inline_pixbuf_SOURCES=make-inline-pixbuf.c -#make_inline_pixbuf_LDADD = $(LDADDS) +bin_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) # @@ -199,7 +195,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 = @STRIP_BEGIN@ \ +libgdk_pixbuf_1_3_la_SOURCES = \ gdk-pixbuf-i18n.h \ gdk-pixbuf.c \ gdk-pixbuf-animation.c \ @@ -207,26 +203,20 @@ libgdk_pixbuf_1_3_la_SOURCES = @STRIP_BEGIN@ \ gdk-pixbuf-io.c \ gdk-pixbuf-loader.c \ gdk-pixbuf-scale.c \ - gdk-pixbuf-util.c \ - gdk-pixdata.c \ -@STRIP_END@ - + gdk-pixbuf-util.c $(libgdk_pixbuf_1_3_la_OBJECTS): gdk-pixbuf-marshal.h gdk-pixbuf-marshal.c -libgdk_pixbuf_1_3_la_LDFLAGS = @STRIP_BEGIN@ \ +libgdk_pixbuf_1_3_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ - @LIBTOOL_EXPORT_OPTIONS@ \ -@STRIP_END@ - + @LIBTOOL_EXPORT_OPTIONS@ 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-pixdata.h + gdk-pixbuf-features.h noinst_HEADERS = \ gdk-pixbuf-io.h \ diff --git a/gdk-pixbuf/gdk-pixbuf-data.c b/gdk-pixbuf/gdk-pixbuf-data.c index 15f5aa8b8..95903b527 100644 --- a/gdk-pixbuf/gdk-pixbuf-data.c +++ b/gdk-pixbuf/gdk-pixbuf-data.c @@ -78,3 +78,254 @@ 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 4393cbe33..0bdae8715 100644 --- a/gdk-pixbuf/gdk-pixbuf-private.h +++ b/gdk-pixbuf/gdk-pixbuf-private.h @@ -130,6 +130,16 @@ 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 2a32c2fa2..32ab3a8f4 100644 --- a/gdk-pixbuf/gdk-pixbuf.h +++ b/gdk-pixbuf/gdk-pixbuf.h @@ -75,12 +75,6 @@ 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 */ @@ -148,11 +142,13 @@ GdkPixbuf *gdk_pixbuf_new_from_data (const guchar *data, gpointer destroy_fn_data); GdkPixbuf *gdk_pixbuf_new_from_xpm_data (const char **data); -GdkPixbuf* gdk_pixbuf_new_from_stream (gint stream_length, - const guint8 *stream, - gboolean copy_pixels, - GError **error); - + +/* Read an inline pixbuf */ +GdkPixbuf *gdk_pixbuf_new_from_inline (const guchar *inline_pixbuf, + gboolean copy_pixels, + int length, + GError **error); + /* Mutations */ void gdk_pixbuf_fill (GdkPixbuf *pixbuf, guint32 pixel); diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c index 64c57b33b..ae80f3180 100644 --- a/gtk/gtkiconfactory.c +++ b/gtk/gtkiconfactory.c @@ -335,7 +335,7 @@ sized_icon_set_from_inline (const guchar *inline_data, set = gtk_icon_set_new (); - source.pixbuf = gdk_pixbuf_new_from_stream (-1, inline_data, FALSE, NULL); + source.pixbuf = gdk_pixbuf_new_from_inline (inline_data, FALSE, -1, NULL); g_assert (source.pixbuf); @@ -361,7 +361,7 @@ sized_with_fallback_icon_set_from_inline (const guchar *fallback_data, set = gtk_icon_set_new (); - source.pixbuf = gdk_pixbuf_new_from_stream (-1, inline_data, FALSE, NULL); + source.pixbuf = gdk_pixbuf_new_from_inline (inline_data, FALSE, -1, NULL); g_assert (source.pixbuf); @@ -371,7 +371,7 @@ sized_with_fallback_icon_set_from_inline (const guchar *fallback_data, source.any_size = TRUE; - source.pixbuf = gdk_pixbuf_new_from_stream (-1, fallback_data, FALSE, NULL); + source.pixbuf = gdk_pixbuf_new_from_inline (fallback_data, FALSE, -1, NULL); g_assert (source.pixbuf); @@ -393,7 +393,7 @@ unsized_icon_set_from_inline (const guchar *inline_data) set = gtk_icon_set_new (); - source.pixbuf = gdk_pixbuf_new_from_stream (-1, inline_data, FALSE, NULL); + source.pixbuf = gdk_pixbuf_new_from_inline (inline_data, FALSE, -1, NULL); g_assert (source.pixbuf); @@ -1090,7 +1090,7 @@ render_fallback_image (GtkStyle *style, static GtkIconSource fallback_source = { NULL, NULL, 0, 0, 0, TRUE, TRUE, TRUE }; if (fallback_source.pixbuf == NULL) - fallback_source.pixbuf = gdk_pixbuf_new_from_stream (-1, MISSING_IMAGE_INLINE, FALSE, NULL); + fallback_source.pixbuf = gdk_pixbuf_new_from_inline (MISSING_IMAGE_INLINE, FALSE, -1, NULL); return gtk_style_render_icon (style, &fallback_source, diff --git a/gtk/gtkitemfactory.c b/gtk/gtkitemfactory.c index b47970e76..ff3b8cdd4 100644 --- a/gtk/gtkitemfactory.c +++ b/gtk/gtkitemfactory.c @@ -228,8 +228,8 @@ gtk_item_factory_class_init (GtkItemFactoryClass *class) quark_type_toggle_item = g_quark_from_static_string ("<ToggleItem>"); quark_type_image_item = g_quark_from_static_string ("<ImageItem>"); quark_type_stock_item = g_quark_from_static_string ("<StockItem>"); - quark_type_separator_item = g_quark_from_static_string ("<Separator>"); quark_type_tearoff_item = g_quark_from_static_string ("<Tearoff>"); + quark_type_separator_item = g_quark_from_static_string ("<Separator>"); quark_type_branch = g_quark_from_static_string ("<Branch>"); quark_type_last_branch = g_quark_from_static_string ("<LastBranch>"); } @@ -1228,14 +1228,14 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory, gtk_radio_menu_item_set_group (GTK_RADIO_MENU_ITEM (widget), radio_group); if (GTK_IS_CHECK_MENU_ITEM (widget)) gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), TRUE); - if (type_id == quark_type_image_item) + if (GTK_IS_IMAGE_MENU_ITEM (widget)) { GdkPixbuf *pixbuf = NULL; image = NULL; - pixbuf = gdk_pixbuf_new_from_stream (-1, - entry->extra_data, + pixbuf = gdk_pixbuf_new_from_inline (entry->extra_data, FALSE, + entry->extra_data2, NULL); if (pixbuf) diff --git a/gtk/gtkitemfactory.h b/gtk/gtkitemfactory.h index 5132f9d1d..536d4ea7b 100644 --- a/gtk/gtkitemfactory.h +++ b/gtk/gtkitemfactory.h @@ -99,24 +99,22 @@ struct _GtkItemFactoryEntry * "" -> "<Item>" * "<Title>" -> create a title item * "<Item>" -> create a simple item - * "<ImageItem>" -> create an item holding an image - * "<StockItem>" -> create an item holding a stock image * "<CheckItem>" -> create a check item * "<ToggleItem>" -> create a toggle item * "<RadioItem>" -> create a radio item * <path> -> path of a radio item to link against * "<Separator>" -> create a separator - * "<Tearoff>" -> create a tearoff separator * "<Branch>" -> create an item to hold sub items * "<LastBranch>" -> create a right justified item to hold sub items */ gchar *item_type; /* Extra data for some item types: - * ImageItem -> pointer to inlined pixbuf stream + * ImageItem -> pointer to inline pixbuf + inline pixbuf length * StockItem -> name of stock item */ - gconstpointer extra_data; + gpointer extra_data; + guint extra_data2; }; struct _GtkItemFactoryItem diff --git a/gtk/stock-icons/Makefile.am b/gtk/stock-icons/Makefile.am index 3ea1084ce..22f1234cc 100644 --- a/gtk/stock-icons/Makefile.am +++ b/gtk/stock-icons/Makefile.am @@ -154,8 +154,8 @@ CLEANFILES += $(noinst_DATA) pixbuf_dir = $(top_builddir)/gdk-pixbuf -gtkstockpixbufs.h: $(pixbuf_dir)/gdk-pixbuf-csource $(IMAGES) +gtkstockpixbufs.h: $(pixbuf_dir)/make-inline-pixbuf $(IMAGES) GDK_PIXBUF_MODULEDIR=$(pixbuf_dir)/.libs \ - $(pixbuf_dir)/gdk-pixbuf-csource --raw --build-list $(VARIABLES) >$(srcdir)/gtkstockpixbufs.h + $(pixbuf_dir)/make-inline-pixbuf $(srcdir)/gtkstockpixbufs.h $(VARIABLES) EXTRA_DIST = $(IMAGES) diff --git a/tests/testgtk.c b/tests/testgtk.c index 91678f469..00aacddaf 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -3101,7 +3101,7 @@ static GtkItemFactoryEntry menu_items[] = { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" }, { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" }, { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" }, - { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple }, + { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", (gchar**) apple, sizeof(apple) }, /* For testing deletion of menus */ { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" }, |