add autoconf stuff

todo:

- copypaste magick2vips into magick7load

- move to magick7 API

- test with magick6 and GM too, of course

see https://github.com/jcupitt/libvips/issues/480
This commit is contained in:
John Cupitt 2016-07-08 10:45:29 +01:00
parent 0f2d1a6b0b
commit 40f8a8af85
3 changed files with 324 additions and 21 deletions

View File

@ -428,25 +428,23 @@ if test x"$with_fftw" != "xno"; then
)
fi
# ImageMagick ... detect attribute iteration too
# Optionally look for GraphicsMagick instead ... use
# --with-magickpackage=GraphicsMagick
# ImageMagick
AC_ARG_WITH([magick],
AS_HELP_STRING([--without-magick], [build without libMagic (default: test)]))
AC_ARG_WITH([magickpackage],
AS_HELP_STRING([--with-magickpackage],
[magickpackage to use (default: MagickWand, ImageMagick; try GraphicsMagick to build against gm instead)]))
[magickpackage to use (default: MagickCore; try GraphicsMagick to build against gm instead)]))
# recent versions of ImageMagick have split parts of the library off to
# MagickWand, so by default we test for that first
# set the default magick package ... very old imagemagicks called it
# ImageMagick
if test x"$with_magickpackage" = "x"; then
PKG_CHECK_MODULES(MAGICK_WAND, MagickWand,
[with_magickpackage=MagickWand
PKG_CHECK_MODULES(MAGICK_WAND, MagickCore,
[with_magickpackage=MagickCore
],
[PKG_CHECK_MODULES(IMAGE_MAGICK, ImageMagick,
[with_magickpackage=ImageMagick
],
[AC_MSG_WARN([neither MagickWand nor ImageMagick found; disabling Magick support])
[AC_MSG_WARN([neither MagickCore nor ImageMagick found; disabling Magick support])
with_magick=no
]
)
@ -454,19 +452,31 @@ if test x"$with_magickpackage" = "x"; then
)
fi
# we have a separate loader for magick7 with fewer ifdef
# options; only test for features on the magick6 case
if test x"$with_magick" != x"no"; then
PKG_CHECK_MODULES(MAGICK, $with_magickpackage,
[AC_DEFINE(HAVE_MAGICK,1,[define if you have libMagick installed.])
with_magick=yes
PKG_CHECK_MODULES(MAGICK, $with_magickpackage >= 7.0,
[AC_DEFINE(HAVE_MAGICK7,1,[define if you have libMagick7 installed.])
with_magick="yes (magick7)"
magick7=yes
PACKAGES_USED="$PACKAGES_USED $with_magickpackage"
],
[AC_MSG_WARN([$with_magickpackage not found; disabling Magick support])
with_magick=no
]
[PKG_CHECK_MODULES(MAGICK, $with_magickpackage,
[AC_DEFINE(HAVE_MAGICK,1,[define if you have libMagick installed.])
with_magick="yes (magick6)"
magick6=yes
PACKAGES_USED="$PACKAGES_USED $with_magickpackage"
],
[AC_MSG_WARN([$with_magickpackage not found; disabling Magick support])
with_magick=no
]
)
]
)
fi
if test x"$with_magick" != x"no"; then
if test x"$magick6" = x"yes"; then
# we SetImageOption to disable some DICOM read processing, but that's only
# in more recent imagemagicks and not in graphicsmagick
save_LIBS="$LIBS"
@ -477,7 +487,7 @@ if test x"$with_magick" != x"no"; then
LIBS="$save_LIBS"
fi
if test x"$with_magick" != x"no"; then
if test x"$magick6" = x"yes"; then
# newer ImageMagicks use MagickCoreGenesis instead of InitializeMagick argh
save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS"
@ -487,7 +497,7 @@ if test x"$with_magick" != x"no"; then
LIBS="$save_LIBS"
fi
if test x"$with_magick" != "xno"; then
if test x"$magick6" = x"yes"; then
# newer ImageMagicks use ResetImagePropertyIterator instead of
# ResetImageAttributeIterator argh
save_LIBS="$LIBS"
@ -498,7 +508,7 @@ if test x"$with_magick" != "xno"; then
LIBS="$save_LIBS"
fi
if test x"$with_magick" != "xno"; then
if test x"$magick6" = x"yes"; then
# so ... do we have ResetImageAttributeIterator()? GM does not
save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS"
@ -508,7 +518,7 @@ if test x"$with_magick" != "xno"; then
LIBS="$save_LIBS"
fi
if test x"$with_magick" != "xno"; then
if test x"$magick6" = x"yes"; then
# more recent magicks have GetVirtualPixels rather than GetImagePixels
save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS"
@ -518,7 +528,7 @@ if test x"$with_magick" != "xno"; then
LIBS="$save_LIBS"
fi
if test x"$with_magick" != "xno"; then
if test x"$magick6" = x"yes"; then
# do we have number_scenes in image_info ... imagemagick uses this, gm
# still uses subrange
save_CFLAGS="$CFLAGS"

View File

@ -35,6 +35,7 @@ libforeign_la_SOURCES = \
magick.h \
magick2vips.c \
magickload.c \
magick7load.c \
pngload.c \
pngsave.c \
vipspng.h \

View File

@ -0,0 +1,292 @@
/* load with libMagick7
*
* 8/7/16
* - from magickload
*/
/*
This file is part of VIPS.
VIPS 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 program 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 program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
/*
#define DEBUG
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vips/vips.h>
#include <vips/buf.h>
#include <vips/internal.h>
#ifdef HAVE_MAGICK7
typedef struct _VipsForeignLoadMagick7 {
VipsForeignLoad parent_object;
gboolean all_frames; /* Load all frames */
char *density; /* Load at this resolution */
int page; /* Load this page (frame) */
} VipsForeignLoadMagick7;
typedef VipsForeignLoadClass VipsForeignLoadMagick7Class;
G_DEFINE_ABSTRACT_TYPE( VipsForeignLoadMagick7, vips_foreign_load_magick7,
VIPS_TYPE_FOREIGN_LOAD );
static VipsForeignFlags
vips_foreign_load_magick7_get_flags_filename( const char *filename )
{
return( VIPS_FOREIGN_PARTIAL );
}
static VipsForeignFlags
vips_foreign_load_magick7_get_flags( VipsForeignLoad *load )
{
return( VIPS_FOREIGN_PARTIAL );
}
static void
vips_foreign_load_magick7_class_init( VipsForeignLoadMagick7Class *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;
VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;
object_class->nickname = "magickload_base";
object_class->description = _( "load with ImageMagick7" );
/* We need to be well to the back of the queue since vips's
* dedicated loaders are usually preferable.
*/
foreign_class->priority = -100;
load_class->get_flags_filename =
vips_foreign_load_magick7_get_flags_filename;
load_class->get_flags = vips_foreign_load_magick7_get_flags;
VIPS_ARG_BOOL( class, "all_frames", 3,
_( "all_frames" ),
_( "Read all frames from an image" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignLoadMagick7, all_frames ),
FALSE );
VIPS_ARG_STRING( class, "density", 4,
_( "Density" ),
_( "Canvas resolution for rendering vector formats like SVG" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignLoadMagick7, density ),
NULL );
VIPS_ARG_INT( class, "page", 5,
_( "Page" ),
_( "Load this page from the file" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignLoadMagick7, page ),
0, 100000, 0 );
}
static void
vips_foreign_load_magick7_init( VipsForeignLoadMagick7 *magick7 )
{
}
typedef struct _VipsForeignLoadMagick7File {
VipsForeignLoadMagick7 parent_object;
char *filename;
} VipsForeignLoadMagick7File;
typedef VipsForeignLoadMagick7Class VipsForeignLoadMagick7FileClass;
G_DEFINE_TYPE( VipsForeignLoadMagick7File, vips_foreign_load_magick7_file,
vips_foreign_load_magick7_get_type() );
static gboolean
ismagick7( const char *filename )
{
VipsImage *t;
int result;
t = vips_image_new();
vips_error_freeze();
result = vips__magick7_read_header( filename, t, FALSE, NULL, 0 );
g_object_unref( t );
vips_error_thaw();
return( result == 0 );
}
/* Unfortunately, libMagick7 does not support header-only reads very well. See
*
* http://www.imagemagick7.org/discourse-server/viewtopic.php?f=1&t=20017
*
* Test especially with BMP, GIF, TGA. So we are forced to read the entire
* image in the @header() method.
*/
static int
vips_foreign_load_magick7_file_header( VipsForeignLoad *load )
{
VipsForeignLoadMagick7 *magick7 = (VipsForeignLoadMagick7 *) load;
VipsForeignLoadMagick7File *magick7_file =
(VipsForeignLoadMagick7File *) load;
if( vips__magick7_read( magick7_file->filename,
load->out, magick7->all_frames, magick7->density, magick7->page ) )
return( -1 );
VIPS_SETSTR( load->out->filename, magick7_file->filename );
return( 0 );
}
static void
vips_foreign_load_magick7_file_class_init(
VipsForeignLoadMagick7FileClass *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;
object_class->nickname = "magickload";
object_class->description = _( "load file with ImageMagick7" );
load_class->is_a = ismagick7;
load_class->header = vips_foreign_load_magick7_file_header;
load_class->load = NULL;
VIPS_ARG_STRING( class, "filename", 1,
_( "Filename" ),
_( "Filename to load from" ),
VIPS_ARGUMENT_REQUIRED_INPUT,
G_STRUCT_OFFSET( VipsForeignLoadMagick7File, filename ),
NULL );
}
static void
vips_foreign_load_magick7_file_init( VipsForeignLoadMagick7File *magick7_file )
{
}
typedef struct _VipsForeignLoadMagick7Buffer {
VipsForeignLoadMagick7 parent_object;
VipsArea *buf;
} VipsForeignLoadMagick7Buffer;
typedef VipsForeignLoadMagick7Class VipsForeignLoadMagick7BufferClass;
G_DEFINE_TYPE( VipsForeignLoadMagick7Buffer, vips_foreign_load_magick7_buffer,
vips_foreign_load_magick7_get_type() );
static gboolean
vips_foreign_load_magick7_buffer_is_a_buffer( const void *buf, size_t len )
{
VipsImage *t;
int result;
t = vips_image_new();
vips_error_freeze();
result = vips__magick7_read_buffer_header( buf, len, t, FALSE, NULL, 0 );
g_object_unref( t );
vips_error_thaw();
return( result == 0 );
}
/* Unfortunately, libMagick7 does not support header-only reads very well. See
*
* http://www.imagemagick7.org/discourse-server/viewtopic.php?f=1&t=20017
*
* Test especially with BMP, GIF, TGA. So we are forced to read the entire
* image in the @header() method.
*/
static int
vips_foreign_load_magick7_buffer_header( VipsForeignLoad *load )
{
VipsForeignLoadMagick7 *magick7 = (VipsForeignLoadMagick7 *) load;
VipsForeignLoadMagick7Buffer *magick7_buffer =
(VipsForeignLoadMagick7Buffer *) load;
if( vips__magick7_read_buffer(
magick7_buffer->buf->data, magick7_buffer->buf->length,
load->out, magick7->all_frames, magick7->density, magick7->page ) )
return( -1 );
return( 0 );
}
static void
vips_foreign_load_magick7_buffer_class_init(
VipsForeignLoadMagick7BufferClass *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;
object_class->nickname = "magickload_buffer";
object_class->description = _( "load buffer with ImageMagick7" );
load_class->is_a_buffer = vips_foreign_load_magick7_buffer_is_a_buffer;
load_class->header = vips_foreign_load_magick7_buffer_header;
load_class->load = NULL;
VIPS_ARG_BOXED( class, "buffer", 1,
_( "Buffer" ),
_( "Buffer to load from" ),
VIPS_ARGUMENT_REQUIRED_INPUT,
G_STRUCT_OFFSET( VipsForeignLoadMagick7Buffer, buf ),
VIPS_TYPE_BLOB );
}
static void
vips_foreign_load_magick7_buffer_init( VipsForeignLoadMagick7Buffer *buffer )
{
}
#endif /*HAVE_MAGICK7*/