summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ChangeLog.pre-2-06
-rw-r--r--ChangeLog.pre-2-106
-rw-r--r--ChangeLog.pre-2-26
-rw-r--r--ChangeLog.pre-2-46
-rw-r--r--ChangeLog.pre-2-66
-rw-r--r--ChangeLog.pre-2-86
-rw-r--r--demos/Makefile.am8
-rw-r--r--demos/testpixbuf.c20
-rw-r--r--docs/reference/gdk-pixbuf/tmpl/creating.sgml12
-rw-r--r--docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml11
-rw-r--r--docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf.sgml3
-rw-r--r--docs/reference/gtk/tmpl/gtkitemfactory.sgml1
-rw-r--r--gdk-pixbuf/ChangeLog16
-rw-r--r--gdk-pixbuf/Makefile.am36
-rw-r--r--gdk-pixbuf/gdk-pixbuf-data.c251
-rw-r--r--gdk-pixbuf/gdk-pixbuf-private.h10
-rw-r--r--gdk-pixbuf/gdk-pixbuf.h18
-rw-r--r--gtk/gtkiconfactory.c10
-rw-r--r--gtk/gtkitemfactory.c8
-rw-r--r--gtk/gtkitemfactory.h8
-rw-r--r--gtk/stock-icons/Makefile.am4
-rw-r--r--tests/testgtk.c2
23 files changed, 318 insertions, 142 deletions
diff --git a/ChangeLog b/ChangeLog
index 2c8436614..03a1be9b1 100644
--- 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:
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>" },