forked from AuroraMiddleware/gtk
new file from Arjan van de Ven <arjan@fenrus.demon.nl> to begin the ras
1999-11-05 Jonathan Blandford <jrb@redhat.com> * src/io-ras.c (image_load): new file from Arjan van de Ven <arjan@fenrus.demon.nl> to begin the ras loader.
This commit is contained in:
parent
155f3e05e2
commit
b71e53b222
@ -13,6 +13,8 @@ endif
|
|||||||
|
|
||||||
GIF_LIB = libpixbuf-gif.la
|
GIF_LIB = libpixbuf-gif.la
|
||||||
|
|
||||||
|
RAS_LIB = libpixbuf-ras.la
|
||||||
|
|
||||||
if HAVE_TIFF
|
if HAVE_TIFF
|
||||||
TIFF_LIB = libpixbuf-tiff.la
|
TIFF_LIB = libpixbuf-tiff.la
|
||||||
endif
|
endif
|
||||||
@ -23,6 +25,7 @@ libexec_LTLIBRARIES = \
|
|||||||
$(PNG_LIB) \
|
$(PNG_LIB) \
|
||||||
$(JPEG_LIB) \
|
$(JPEG_LIB) \
|
||||||
$(GIF_LIB) \
|
$(GIF_LIB) \
|
||||||
|
$(RAS_LIB) \
|
||||||
$(XPM_LIB) \
|
$(XPM_LIB) \
|
||||||
$(TIFF_LIB)
|
$(TIFF_LIB)
|
||||||
|
|
||||||
@ -87,6 +90,13 @@ libpixbuf_gif_la_SOURCES = io-gif.c
|
|||||||
libpixbuf_gif_la_LDFLAGS = -avoid-version -module
|
libpixbuf_gif_la_LDFLAGS = -avoid-version -module
|
||||||
libpixbuf_gif_la_LIBADD =
|
libpixbuf_gif_la_LIBADD =
|
||||||
|
|
||||||
|
#
|
||||||
|
# The RAS loader
|
||||||
|
#
|
||||||
|
libpixbuf_ras_la_SOURCES = io-ras.c
|
||||||
|
libpixbuf_ras_la_LDFLAGS = -avoid-version -module
|
||||||
|
libpixbuf_ras_la_LIBADD =
|
||||||
|
|
||||||
#
|
#
|
||||||
# The TIFF loader
|
# The TIFF loader
|
||||||
#
|
#
|
||||||
|
165
gdk-pixbuf/io-ras.c
Normal file
165
gdk-pixbuf/io-ras.c
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
|
||||||
|
/* GdkPixbuf library - JPEG image loader
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 The Free Software Foundation
|
||||||
|
*
|
||||||
|
* Authors: Arjan van de Ven <arjan@fenrus.demon.nl>
|
||||||
|
* Federico Mena-Quintero <federico@gimp.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include "gdk-pixbuf.h"
|
||||||
|
#include "gdk-pixbuf-io.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Header structure for sunras files.
|
||||||
|
All values are in big-endian order on disk
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct rasterfile
|
||||||
|
{
|
||||||
|
guint magic;
|
||||||
|
guint width;
|
||||||
|
guint height;
|
||||||
|
guint depth;
|
||||||
|
guint length;
|
||||||
|
guint type;
|
||||||
|
guint maptype;
|
||||||
|
guint maplength;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
This does a byte-order swap. Does glib have something like
|
||||||
|
be32_to_cpu() ??
|
||||||
|
*/
|
||||||
|
unsigned int ByteOrder(unsigned int i)
|
||||||
|
{
|
||||||
|
unsigned int i2;
|
||||||
|
i2 = ((i&255)<<24) | (((i>>8)&255)<<16) | (((i>>16)&255)<<8)|((i>>24)&255);
|
||||||
|
return i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destroy notification function for the libart pixbuf */
|
||||||
|
static void
|
||||||
|
free_buffer (gpointer user_data, gpointer data)
|
||||||
|
{
|
||||||
|
free (data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shared library entry point */
|
||||||
|
GdkPixbuf *
|
||||||
|
image_load (FILE *f)
|
||||||
|
{
|
||||||
|
gboolean failed = FALSE;
|
||||||
|
gint i, ctype, bpp;
|
||||||
|
guchar *pixels;
|
||||||
|
|
||||||
|
struct rasterfile Header;
|
||||||
|
|
||||||
|
i=fread(&Header,1,sizeof(Header),f);
|
||||||
|
g_assert(i==32);
|
||||||
|
Header.width = ByteOrder(Header.width);
|
||||||
|
Header.height = ByteOrder(Header.height);
|
||||||
|
Header.depth = ByteOrder(Header.depth);
|
||||||
|
|
||||||
|
|
||||||
|
if (Header.depth == 32)
|
||||||
|
bpp = 4;
|
||||||
|
else
|
||||||
|
bpp = 3;
|
||||||
|
|
||||||
|
pixels = (guchar*)malloc (Header.width * Header.height * bpp);
|
||||||
|
if (!pixels) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
fread(pixels,Header.width*bpp,Header.height,f);
|
||||||
|
|
||||||
|
if (bpp==4)
|
||||||
|
return gdk_pixbuf_new_from_data (pixels, ART_PIX_RGB, TRUE,
|
||||||
|
Header.width, Header.height,
|
||||||
|
Header.width * bpp,
|
||||||
|
free_buffer, NULL);
|
||||||
|
else
|
||||||
|
return gdk_pixbuf_new_from_data (pixels, ART_PIX_RGB, FALSE,
|
||||||
|
Header.width, Header.height, Header.width * bpp,
|
||||||
|
free_buffer, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These avoid the setjmp()/longjmp() crap in libpng */
|
||||||
|
|
||||||
|
typedef struct _LoadContext LoadContext;
|
||||||
|
|
||||||
|
struct _LoadContext {
|
||||||
|
|
||||||
|
ModulePreparedNotifyFunc notify_func;
|
||||||
|
gpointer notify_user_data;
|
||||||
|
|
||||||
|
GdkPixbuf* pixbuf;
|
||||||
|
|
||||||
|
guint fatal_error_occurred : 1;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
gpointer
|
||||||
|
image_begin_load (ModulePreparedNotifyFunc prepare_func,
|
||||||
|
ModuleUpdatedNotifyFunc update_func,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
LoadContext* lc;
|
||||||
|
|
||||||
|
lc = g_new0(LoadContext, 1);
|
||||||
|
|
||||||
|
lc->fatal_error_occurred = FALSE;
|
||||||
|
|
||||||
|
lc->notify_func = prepare_func;
|
||||||
|
lc->notify_user_data = user_data;
|
||||||
|
|
||||||
|
return lc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
image_stop_load (gpointer context)
|
||||||
|
{
|
||||||
|
LoadContext* lc = context;
|
||||||
|
|
||||||
|
g_return_if_fail(lc != NULL);
|
||||||
|
|
||||||
|
gdk_pixbuf_unref(lc->pixbuf);
|
||||||
|
|
||||||
|
g_free(lc);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
image_load_increment(gpointer context, guchar *buf, guint size)
|
||||||
|
{
|
||||||
|
LoadContext* lc = context;
|
||||||
|
|
||||||
|
g_return_val_if_fail(lc != NULL, FALSE);
|
||||||
|
|
||||||
|
|
||||||
|
if (lc->fatal_error_occurred)
|
||||||
|
return FALSE;
|
||||||
|
else
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user