Add detection for libjasper, used by the gdk-pixbuf JPEG2000 loader
2007-11-25 Bastien Nocera <hadess@hadess.net> * configure.in: Add detection for libjasper, used by the gdk-pixbuf JPEG2000 loader 2007-11-25 Bastien Nocera <hadess@hadess.net> * Makefile.am: * io-jasper.c: Add the libjasper JPEG2000 loader (Closes: #469901) svn path=/trunk/; revision=19042
This commit is contained in:
		
				
					committed by
					
						
						Bastien Nocera
					
				
			
			
				
	
			
			
			
						parent
						
							4896e24bb1
						
					
				
				
					commit
					f4606f266b
				
			@ -1,3 +1,8 @@
 | 
				
			|||||||
 | 
					2007-11-25  Bastien Nocera  <hadess@hadess.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						* configure.in: Add detection for libjasper, used by the
 | 
				
			||||||
 | 
						gdk-pixbuf JPEG2000 loader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2007-11-25  Matthias Clasen  <mclasen@redhat.com>
 | 
					2007-11-25  Matthias Clasen  <mclasen@redhat.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	* configure.in: Require gtk-doc 1.8
 | 
						* configure.in: Require gtk-doc 1.8
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								configure.in
									
									
									
									
									
								
							@ -757,6 +757,9 @@ AC_ARG_WITH(libjpeg,
 | 
				
			|||||||
AC_ARG_WITH(libtiff,
 | 
					AC_ARG_WITH(libtiff,
 | 
				
			||||||
            [AC_HELP_STRING([--without-libtiff],
 | 
					            [AC_HELP_STRING([--without-libtiff],
 | 
				
			||||||
                            [disable TIFF loader for gdk-pixbuf])])
 | 
					                            [disable TIFF loader for gdk-pixbuf])])
 | 
				
			||||||
 | 
					AC_ARG_WITH(libjasper,
 | 
				
			||||||
 | 
					            [AC_HELP_STRING([--without-libjasper],
 | 
				
			||||||
 | 
					                            [disable JPEG2000 loader for gdk-pixbuf])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl Test for libtiff
 | 
					dnl Test for libtiff
 | 
				
			||||||
  if test x$with_libtiff != xno && test -z "$LIBTIFF"; then
 | 
					  if test x$with_libtiff != xno && test -z "$LIBTIFF"; then
 | 
				
			||||||
@ -858,9 +861,21 @@ dnl Test for libpng
 | 
				
			|||||||
*** from CVS.])
 | 
					*** from CVS.])
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dnl Test for libjasper
 | 
				
			||||||
 | 
					  if test x$with_libjasper != xno && test -z "$LIBJASPER"; then
 | 
				
			||||||
 | 
					    AC_CHECK_LIB(jasper, jas_init, LIBJASPER=-ljasper, [])
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if test x$with_libjasper != xno && test -z "$LIBJASPER"; then
 | 
				
			||||||
 | 
					     AC_MSG_ERROR([
 | 
				
			||||||
 | 
					*** Checks for JPEG2000 loader failed. You can build without it by passing 
 | 
				
			||||||
 | 
					*** --without-libjasper to configure])
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_SUBST(LIBTIFF)
 | 
					AC_SUBST(LIBTIFF)
 | 
				
			||||||
AC_SUBST(LIBJPEG)
 | 
					AC_SUBST(LIBJPEG)
 | 
				
			||||||
AC_SUBST(LIBPNG)
 | 
					AC_SUBST(LIBPNG)
 | 
				
			||||||
 | 
					AC_SUBST(LIBJASPER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AM_CONDITIONAL(BUILD_DYNAMIC_MODULES, $dynworks)
 | 
					AM_CONDITIONAL(BUILD_DYNAMIC_MODULES, $dynworks)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -886,7 +901,7 @@ else
 | 
				
			|||||||
   fi
 | 
					   fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all_loaders="png,bmp,wbmp,gif,ico,ani,jpeg,pnm,ras,tiff,xpm,xbm,tga,pcx,icns"
 | 
					all_loaders="png,bmp,wbmp,gif,ico,ani,jpeg,pnm,ras,tiff,xpm,xbm,tga,pcx,icns,jasper"
 | 
				
			||||||
included_loaders=""
 | 
					included_loaders=""
 | 
				
			||||||
# If no loaders specified, include all
 | 
					# If no loaders specified, include all
 | 
				
			||||||
if test "x$with_included_loaders" = xyes ; then
 | 
					if test "x$with_included_loaders" = xyes ; then
 | 
				
			||||||
@ -931,6 +946,7 @@ AM_CONDITIONAL(INCLUDE_XBM, [test x"$INCLUDE_xbm" = xyes])
 | 
				
			|||||||
AM_CONDITIONAL(INCLUDE_TGA, [test x"$INCLUDE_tga" = xyes])
 | 
					AM_CONDITIONAL(INCLUDE_TGA, [test x"$INCLUDE_tga" = xyes])
 | 
				
			||||||
AM_CONDITIONAL(INCLUDE_PCX, [test x"$INCLUDE_pcx" = xyes])
 | 
					AM_CONDITIONAL(INCLUDE_PCX, [test x"$INCLUDE_pcx" = xyes])
 | 
				
			||||||
AM_CONDITIONAL(INCLUDE_ICNS, [test x"$INCLUDE_icns" = xyes])
 | 
					AM_CONDITIONAL(INCLUDE_ICNS, [test x"$INCLUDE_icns" = xyes])
 | 
				
			||||||
 | 
					AM_CONDITIONAL(INCLUDE_JASPER, [test x"$INCLUDE_jasper" = xyes])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_HEADER_SYS_WAIT
 | 
					AC_HEADER_SYS_WAIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -939,6 +955,7 @@ AC_TYPE_SIGNAL
 | 
				
			|||||||
AM_CONDITIONAL(HAVE_TIFF, test "x$LIBTIFF" != x)
 | 
					AM_CONDITIONAL(HAVE_TIFF, test "x$LIBTIFF" != x)
 | 
				
			||||||
AM_CONDITIONAL(HAVE_PNG, test "x$LIBPNG" != x)
 | 
					AM_CONDITIONAL(HAVE_PNG, test "x$LIBPNG" != x)
 | 
				
			||||||
AM_CONDITIONAL(HAVE_JPEG, test "x$LIBJPEG" != x)
 | 
					AM_CONDITIONAL(HAVE_JPEG, test "x$LIBJPEG" != x)
 | 
				
			||||||
 | 
					AM_CONDITIONAL(HAVE_JASPER, test "x$LIBJASPER" != x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if $dynworks ; then
 | 
					if $dynworks ; then
 | 
				
			||||||
  STATIC_LIB_DEPS=
 | 
					  STATIC_LIB_DEPS=
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,9 @@
 | 
				
			|||||||
 | 
					2007-11-25  Bastien Nocera  <hadess@hadess.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						* Makefile.am:
 | 
				
			||||||
 | 
						* io-jasper.c: Add the libjasper JPEG2000 loader
 | 
				
			||||||
 | 
						(Closes: #469901)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2007-11-20  Matthias Clasen  <mclasen@redhat.com>
 | 
					2007-11-20  Matthias Clasen  <mclasen@redhat.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	* gdk-pixbuf-animation.c: Use G_DEFINE_TYPE (#469341, 
 | 
						* gdk-pixbuf-animation.c: Use G_DEFINE_TYPE (#469341, 
 | 
				
			||||||
 | 
				
			|||||||
@ -181,6 +181,14 @@ libpixbufloader_pcx_la_SOURCES = io-pcx.c
 | 
				
			|||||||
libpixbufloader_pcx_la_LDFLAGS = -avoid-version -module $(no_undefined)
 | 
					libpixbufloader_pcx_la_LDFLAGS = -avoid-version -module $(no_undefined)
 | 
				
			||||||
libpixbufloader_pcx_la_LIBADD = $(module_libs)
 | 
					libpixbufloader_pcx_la_LIBADD = $(module_libs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The JPEG2000 loader
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					libstatic_pixbufloader_jasper_la_SOURCES = io-jasper.c
 | 
				
			||||||
 | 
					libpixbufloader_jasper_la_SOURCES = io-jasper.c
 | 
				
			||||||
 | 
					libpixbufloader_jasper_la_LDFLAGS = -avoid-version -module $(no_undefined)
 | 
				
			||||||
 | 
					libpixbufloader_jasper_la_LIBADD = $(LIBJASPER) $(module_libs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if HAVE_PNG
 | 
					if HAVE_PNG
 | 
				
			||||||
if INCLUDE_PNG
 | 
					if INCLUDE_PNG
 | 
				
			||||||
STATIC_PNG_LIB = libstatic-pixbufloader-png.la
 | 
					STATIC_PNG_LIB = libstatic-pixbufloader-png.la
 | 
				
			||||||
@ -277,6 +285,14 @@ else
 | 
				
			|||||||
ICNS_LIB = libpixbufloader-icns.la
 | 
					ICNS_LIB = libpixbufloader-icns.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if HAVE_JASPER
 | 
				
			||||||
 | 
					if INCLUDE_JASPER
 | 
				
			||||||
 | 
					STATIC_JASPER_LIB = libstatic-pixbufloader-jasper.la
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					JASPER_LIB = libpixbufloader-jasper.la
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if BUILD_DYNAMIC_MODULES
 | 
					if BUILD_DYNAMIC_MODULES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
loader_LTLIBRARIES = 	\
 | 
					loader_LTLIBRARIES = 	\
 | 
				
			||||||
@ -294,7 +310,8 @@ loader_LTLIBRARIES = 	\
 | 
				
			|||||||
	$(XBM_LIB)	\
 | 
						$(XBM_LIB)	\
 | 
				
			||||||
	$(TGA_LIB)	\
 | 
						$(TGA_LIB)	\
 | 
				
			||||||
	$(ICNS_LIB)	\
 | 
						$(ICNS_LIB)	\
 | 
				
			||||||
	$(PCX_LIB)
 | 
						$(PCX_LIB)	\
 | 
				
			||||||
 | 
						$(JASPER_LIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
@ -314,7 +331,8 @@ noinst_LTLIBRARIES =		\
 | 
				
			|||||||
	$(STATIC_XBM_LIB)	\
 | 
						$(STATIC_XBM_LIB)	\
 | 
				
			||||||
	$(STATIC_TGA_LIB)	\
 | 
						$(STATIC_TGA_LIB)	\
 | 
				
			||||||
	$(STATIC_ICNS_LIB)	\
 | 
						$(STATIC_ICNS_LIB)	\
 | 
				
			||||||
	$(STATIC_PCX_LIB)
 | 
						$(STATIC_PCX_LIB)	\
 | 
				
			||||||
 | 
						$(STATIC_JASPER_LIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
builtin_objs = @INCLUDED_LOADER_OBJ@
 | 
					builtin_objs = @INCLUDED_LOADER_OBJ@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										305
									
								
								gdk-pixbuf/io-jasper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								gdk-pixbuf/io-jasper.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,305 @@
 | 
				
			|||||||
 | 
					/* JPEG 2000 loader
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2007 Bastien Nocera <hadess@hadess.net>
 | 
				
			||||||
 | 
					 * Inspired by work by Ben Karel <web+moz@eschew.org>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This library is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					 * modify it under the terms of the GNU Lesser 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
 | 
				
			||||||
 | 
					 * Lesser General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU Lesser 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 <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gdk-pixbuf-private.h"
 | 
				
			||||||
 | 
					#include "gdk-pixbuf-io.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <jasper/jasper.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_MODULE_EXPORT void fill_vtable (GdkPixbufModule * module);
 | 
				
			||||||
 | 
					G_MODULE_EXPORT void fill_info (GdkPixbufFormat * info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct jasper_context {
 | 
				
			||||||
 | 
						GdkPixbuf *pixbuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GdkPixbufModuleSizeFunc size_func;
 | 
				
			||||||
 | 
						GdkPixbufModuleUpdatedFunc updated_func;
 | 
				
			||||||
 | 
						GdkPixbufModulePreparedFunc prepared_func;
 | 
				
			||||||
 | 
						gpointer user_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jas_stream_t *stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int width, height;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					free_jasper_context (struct jasper_context *context)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!context)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (context->stream) {
 | 
				
			||||||
 | 
							jas_stream_close (context->stream);
 | 
				
			||||||
 | 
							context->stream = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						g_free (context);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gpointer
 | 
				
			||||||
 | 
					jasper_image_begin_load (GdkPixbufModuleSizeFunc size_func,
 | 
				
			||||||
 | 
								 GdkPixbufModulePreparedFunc prepared_func,
 | 
				
			||||||
 | 
								 GdkPixbufModuleUpdatedFunc updated_func,
 | 
				
			||||||
 | 
								 gpointer user_data, GError **error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct jasper_context *context;
 | 
				
			||||||
 | 
						jas_stream_t *stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jas_init ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						stream = jas_stream_memopen (NULL, -1);
 | 
				
			||||||
 | 
						if (!stream) {
 | 
				
			||||||
 | 
							g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for stream"));
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						context = g_new0 (struct jasper_context, 1);
 | 
				
			||||||
 | 
						if (!context)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						context->size_func = size_func;
 | 
				
			||||||
 | 
						context->updated_func = updated_func;
 | 
				
			||||||
 | 
						context->prepared_func = prepared_func;
 | 
				
			||||||
 | 
						context->user_data = user_data;
 | 
				
			||||||
 | 
						context->width = context->height = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						context->stream = stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return context;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					jasper_image_try_load (struct jasper_context *context, GError **error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						jas_image_t *raw_image, *image;
 | 
				
			||||||
 | 
						int num_components, colourspace_family;
 | 
				
			||||||
 | 
						int i, rowstride, shift;
 | 
				
			||||||
 | 
						guchar *pixels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						raw_image = jas_image_decode (context->stream, -1, 0);
 | 
				
			||||||
 | 
						if (!raw_image) {
 | 
				
			||||||
 | 
							g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE, _("Couldn't decode image"));
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (context->width == -1 && context->height == -1) {
 | 
				
			||||||
 | 
							int width, height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							context->width = width = jas_image_cmptwidth (raw_image, 0);
 | 
				
			||||||
 | 
							context->height = height = jas_image_cmptheight (raw_image, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (context->size_func) {
 | 
				
			||||||
 | 
								(*context->size_func) (&width, &height, context->user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (width == 0 || height == 0) {
 | 
				
			||||||
 | 
									jas_image_destroy(raw_image);
 | 
				
			||||||
 | 
									g_set_error (error,
 | 
				
			||||||
 | 
										     GDK_PIXBUF_ERROR,
 | 
				
			||||||
 | 
										     GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
 | 
				
			||||||
 | 
										     _("Transformed JPEG2000 has zero width or height"));
 | 
				
			||||||
 | 
									return FALSE;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We only know how to handle grayscale and RGB images */
 | 
				
			||||||
 | 
						num_components = jas_image_numcmpts (raw_image);
 | 
				
			||||||
 | 
						colourspace_family = jas_clrspc_fam (jas_image_clrspc (raw_image));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((num_components != 3 && num_components != 4 && num_components != 1) ||
 | 
				
			||||||
 | 
						    (colourspace_family != JAS_CLRSPC_FAM_RGB  && colourspace_family != JAS_CLRSPC_FAM_GRAY)) {
 | 
				
			||||||
 | 
						    	jas_image_destroy (raw_image);
 | 
				
			||||||
 | 
							g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_UNKNOWN_TYPE, _("Image type currently not supported"));
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Apply the colour profile to the image, creating a new one */
 | 
				
			||||||
 | 
						if (jas_image_clrspc (raw_image) != JAS_CLRSPC_SRGB) {
 | 
				
			||||||
 | 
							jas_cmprof_t *profile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							profile = jas_cmprof_createfromclrspc (JAS_CLRSPC_SRGB);
 | 
				
			||||||
 | 
							if (!profile) {
 | 
				
			||||||
 | 
								jas_image_destroy (raw_image);
 | 
				
			||||||
 | 
								g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for color profile"));
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							image = jas_image_chclrspc (raw_image, profile, JAS_CMXFORM_INTENT_PER);
 | 
				
			||||||
 | 
							if (!image) {
 | 
				
			||||||
 | 
								jas_image_destroy (raw_image);
 | 
				
			||||||
 | 
								g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for color profile"));
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							image = raw_image;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!context->pixbuf) {
 | 
				
			||||||
 | 
							int bits_per_sample;
 | 
				
			||||||
 | 
							guchar *data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Unfortunately, gdk-pixbuf doesn't support 16 bpp images
 | 
				
			||||||
 | 
							 * bits_per_sample = jas_image_cmptprec (image, 0);
 | 
				
			||||||
 | 
							if (bits_per_sample < 8)
 | 
				
			||||||
 | 
								bits_per_sample = 8;
 | 
				
			||||||
 | 
							else if (bits_per_sample > 8)
 | 
				
			||||||
 | 
								bits_per_sample = 16;
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
 | 
							bits_per_sample = 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data = g_try_malloc0 (context->width * context->height * bits_per_sample / 8);
 | 
				
			||||||
 | 
							if (data == NULL) {
 | 
				
			||||||
 | 
								g_set_error (error,
 | 
				
			||||||
 | 
									     GDK_PIXBUF_ERROR,
 | 
				
			||||||
 | 
									     GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY,
 | 
				
			||||||
 | 
									     _("Insufficient memory to open JPEG 2000 file"));
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							context->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
 | 
				
			||||||
 | 
											  FALSE, bits_per_sample,
 | 
				
			||||||
 | 
											  context->width, context->height);
 | 
				
			||||||
 | 
							if (context->prepared_func)
 | 
				
			||||||
 | 
								context->prepared_func (context->pixbuf, NULL, context->user_data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We calculate how much we should shift the pixel
 | 
				
			||||||
 | 
						 * data by to make it fit into our pixbuf */
 | 
				
			||||||
 | 
						shift = MAX (jas_image_cmptprec (image, 0) - gdk_pixbuf_get_bits_per_sample (context->pixbuf), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Loop over the 3 colourspaces */
 | 
				
			||||||
 | 
						rowstride = gdk_pixbuf_get_rowstride (context->pixbuf);
 | 
				
			||||||
 | 
						pixels = gdk_pixbuf_get_pixels (context->pixbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < num_components; i++) {
 | 
				
			||||||
 | 
							jas_matrix_t *matrix;
 | 
				
			||||||
 | 
							int j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							matrix = jas_matrix_create (context->height, context->width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* in libjasper, R is 0, G is 1, etc. we're lucky :)
 | 
				
			||||||
 | 
							 * but we need to handle the "opacity" channel ourselves */
 | 
				
			||||||
 | 
							if (i != 4) {
 | 
				
			||||||
 | 
								jas_image_readcmpt (image, i, 0, 0, context->width, context->height, matrix);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								jas_image_readcmpt (image, JAS_IMAGE_CT_OPACITY, 0, 0, context->width, context->height, matrix);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (j = 0; j < context->height; j++) {
 | 
				
			||||||
 | 
								int k;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (k = 0; k < context->width; k++) {
 | 
				
			||||||
 | 
									if (num_components == 3 || num_components == 4) {
 | 
				
			||||||
 | 
										pixels[j * rowstride + k * 3 + i] = jas_matrix_get (matrix, j, k) >> shift;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										pixels[j * rowstride + k * 3] =
 | 
				
			||||||
 | 
											pixels[j * rowstride + k * 3 + 1] =
 | 
				
			||||||
 | 
											pixels[j * rowstride + k * 3 + 2] = jas_matrix_get (matrix, j, k) >> shift;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								/* Update once per line for the last component, otherwise
 | 
				
			||||||
 | 
								 * we might contain garbage */
 | 
				
			||||||
 | 
								if (context->updated_func && (i == num_components - 1) && k != 0) {
 | 
				
			||||||
 | 
									context->updated_func (context->pixbuf, 0, j, k, 1, context->user_data);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							jas_matrix_destroy (matrix);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (image != raw_image)
 | 
				
			||||||
 | 
							jas_image_destroy (image);
 | 
				
			||||||
 | 
						jas_image_destroy (raw_image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					jasper_image_stop_load (gpointer data, GError **error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct jasper_context *context = (struct jasper_context *) data;
 | 
				
			||||||
 | 
						gboolean ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jas_stream_rewind (context->stream);
 | 
				
			||||||
 | 
						ret = jasper_image_try_load (context, error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free_jasper_context (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					jasper_image_load_increment (gpointer data, const guchar *buf, guint size, GError **error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct jasper_context *context = (struct jasper_context *) data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (jas_stream_write (context->stream, buf, size) < 0) {
 | 
				
			||||||
 | 
							g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory to buffer image data"));
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					fill_vtable (GdkPixbufModule * module)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						module->begin_load = jasper_image_begin_load;
 | 
				
			||||||
 | 
						module->stop_load = jasper_image_stop_load;
 | 
				
			||||||
 | 
						module->load_increment = jasper_image_load_increment;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					fill_info (GdkPixbufFormat * info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static GdkPixbufModulePattern signature[] = {
 | 
				
			||||||
 | 
							{ "    jP", "!!!!  ", 100 },		/* file begins with 'jP' at offset 4 */
 | 
				
			||||||
 | 
							{ "\xff\x4f\xff\x51\x00", NULL, 100 },	/* file starts with FF 4F FF 51 00 */
 | 
				
			||||||
 | 
							{ NULL, NULL, 0 }
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						static gchar *mime_types[] = {
 | 
				
			||||||
 | 
							"image/jp2",
 | 
				
			||||||
 | 
							"image/jpeg2000",
 | 
				
			||||||
 | 
							"image/jpx",
 | 
				
			||||||
 | 
							NULL
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						static gchar *extensions[] = {
 | 
				
			||||||
 | 
							"jp2",
 | 
				
			||||||
 | 
							"jpc",
 | 
				
			||||||
 | 
							"jpx",
 | 
				
			||||||
 | 
							"j2k",
 | 
				
			||||||
 | 
							"jpf",
 | 
				
			||||||
 | 
							NULL
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						info->name = "jpeg2000";
 | 
				
			||||||
 | 
						info->signature = signature;
 | 
				
			||||||
 | 
						info->description = N_("The JPEG 2000 image format");
 | 
				
			||||||
 | 
						info->mime_types = mime_types;
 | 
				
			||||||
 | 
						info->extensions = extensions;
 | 
				
			||||||
 | 
						info->flags = GDK_PIXBUF_FORMAT_THREADSAFE;
 | 
				
			||||||
 | 
						info->license = "LGPL";
 | 
				
			||||||
 | 
						info->disabled = FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user