]> Pileus Git - ~andy/gtk/commitdiff
Revert inline-pixbuf changes until Tim comes back to fix missing files
authorOwen Taylor <otaylor@src.gnome.org>
Tue, 26 Jun 2001 16:19:01 +0000 (16:19 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 26 Jun 2001 16:19:01 +0000 (16:19 +0000)
23 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
demos/Makefile.am
demos/testpixbuf.c
docs/reference/gdk-pixbuf/tmpl/creating.sgml
docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml
docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml
docs/reference/gtk/tmpl/gtkitemfactory.sgml
gdk-pixbuf/ChangeLog
gdk-pixbuf/Makefile.am
gdk-pixbuf/gdk-pixbuf-data.c
gdk-pixbuf/gdk-pixbuf-private.h
gdk-pixbuf/gdk-pixbuf.h
gtk/gtkiconfactory.c
gtk/gtkitemfactory.c
gtk/gtkitemfactory.h
gtk/stock-icons/Makefile.am
tests/testgtk.c

index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 2c8436614494490073ff24a62ea274fed96dcac0..03a1be9b1fb590bfd665345c532e851e30d068e8 100644 (file)
@@ -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:
index 5bcf5023cbb1d7ddd9bf04305db1351b40fad37c..25eba726532215e09b6486b7c7b68d7b1c8c2b9e 100644 (file)
@@ -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)
index a2ecbe1f089615058ca68afe3c83321e850b4ce1..0af6d368e93b40a764ccc5a70c9097feda094fc0 100644 (file)
@@ -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 {
index 1d017da68a77dd68f5cc58da808d65d3e0fc0fcf..0bbce5405a9051c6990701b10780d93c0ba5b556 100644 (file)
@@ -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>
 
index 099d29a515380532b5c628839e78ccd214e34760..910ccef35f1009950206d3a785cdd4d39ff765bd 100644 (file)
@@ -552,14 +552,3 @@ End:
   </para>
 
 
-<!-- ##### FUNCTION gdk_pixbuf_new_from_inline ##### -->
-<para>
-
-</para>
-
-@inline_pixbuf: 
-@copy_pixels: 
-@length: 
-@error: 
-@Returns: 
-
index ecc32bc201033748a02c124294f473d7ecff59f8..403941efa9fe2ebfcc5540aaf115b81f9c8c0bdc 100644 (file)
@@ -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: 
index abda892595f0435f91ce83eab19df0af73752262..18c4cc601d58ff130291db6a9105bf1ebd301200 100644 (file)
@@ -77,6 +77,7 @@ GtkItemFactory
 @callback_action: 
 @item_type: 
 @extra_data: 
+@extra_data2: 
 
 <!-- ##### STRUCT GtkItemFactoryItem ##### -->
 <para>
index 992773220d11c038e1a080dc90fce8b740e139f1..a024030d23e7aa6d7b2ca9f22401e8be543093bf 100644 (file)
@@ -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
index 374ea905a3bfe73d98ba2d7d429b6a1b376e4471..cfe6316664ffc116bde65d3b50ce3523e8b4c4ff 100644 (file)
@@ -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         \
index 15f5aa8b82e3ad0da61e928bddf89d3b83d1ac8c..95903b527fb53e841ad7d1ce19c2f26c6b52675f 100644 (file)
@@ -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;
+}
+
index 4393cbe336f977e6e85b38201f14ae2ff0612688..0bdae8715de330279c7ae494a69b996b4bd2c57a 100644 (file)
@@ -130,6 +130,16 @@ struct _GdkPixbufAnimationIterClass {
       
 \f
 
+#define GDK_PIXBUF_INLINE_MAGIC_NUMBER 0x47646B50 /* 'GdkP' */
+
+typedef enum
+{
+  GDK_PIXBUF_INLINE_RAW = 0,
+  GDK_PIXBUF_INLINE_RLE = 1
+} GdkPixbufInlineFormat;
+
+\f
+
 GdkPixbufAnimation* gdk_pixbuf_non_anim_new (GdkPixbuf *pixbuf);
 
 #endif
index 2a32c2fa2b6c0bab0cd0f17290964103c79e7812..32ab3a8f469e5e8dc74724337fc66a73cec8d925 100644 (file)
@@ -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);
index 64c57b33b52c54bf409f3b18cb8d6415b06108f3..ae80f3180ba5c0d61b2610d5775b8b82731a9c1b 100644 (file)
@@ -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,
index b47970e76039dc0d9a9529f3e7d91696c56c8925..ff3b8cdd4fb0d3742575222536ef7e16cadbb616 100644 (file)
@@ -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)
index 5132f9d1dba4bcdf9211cb149a7f1ea6111b8cf2..536d4ea7bebdb052a14a5307f2ebfcffcda0f2e6 100644 (file)
@@ -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
index 3ea1084ce62c17df97bf319505a93c45ab2e96cc..22f1234cc94c0ff59884499a851adb30ded8b73b 100644 (file)
@@ -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)
index 91678f469a067d33a9bf9a7e54bf00a9d29b7464..00aacddafe4b435f8cbabacf673284653a7ea0b5 100644 (file)
@@ -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>" },