add webp support to vips7

see https://github.com/jcupitt/libvips/issues/144
This commit is contained in:
John Cupitt 2014-07-17 09:09:39 +01:00
parent a0a6868d90
commit 0ced5cb24b
6 changed files with 194 additions and 0 deletions

View File

@ -5,6 +5,7 @@
- improve im_openout() compat macro
- more vips7 compatibility fixes, thanks steve
- more robust vips_system()
- add webp support to vips7
30/6/14 started 7.40.3
- fix interlaced thumbnails in vipsthumbnail, thanks lovell

View File

@ -70,11 +70,13 @@ libdeprecated_la_SOURCES = \
im_jpeg2vips.c \
im_magick2vips.c \
im_png2vips.c \
im_webp2vips.c \
im_ppm2vips.c \
im_tiff2vips.c \
im_vips2csv.c \
im_vips2jpeg.c \
im_vips2png.c \
im_vips2webp.c \
im_vips2ppm.c \
im_vips2tiff.c \
conver_dispatch.c \

View File

@ -458,6 +458,10 @@ im__format_init( void )
extern GType vips_format_png_get_type();
vips_format_png_get_type();
#endif /*HAVE_PNG*/
#ifdef HAVE_LIBWEBP
extern GType vips_format_webp_get_type();
vips_format_webp_get_type();
#endif /*HAVE_LIBWEBP*/
vips_format_csv_get_type();
vips_format_ppm_get_type();
vips_format_analyze_get_type();

View File

@ -0,0 +1,70 @@
/*
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 VIPS_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/internal.h>
#include <vips/debug.h>
int
im_vips2webp( IMAGE *in, const char *filename )
{
int compression;
int lossless;
char *p, *q;
char name[FILENAME_MAX];
char mode[FILENAME_MAX];
char buf[FILENAME_MAX];
im_filename_split( filename, name, mode );
strcpy( buf, mode );
p = &buf[0];
compression = 6;
lossless = 0;
if( (q = im_getnextoption( &p )) )
compression = atoi( q );
if( (q = im_getnextoption( &p )) )
lossless = atoi( q );
return( vips_webpsave( in, name,
"Q", compression, "lossless", lossless, NULL ) );
}

View File

@ -0,0 +1,114 @@
/*
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 <vips/vips.h>
#include <vips/internal.h>
#include "../foreign/webp.h"
static int
webp2vips( const char *name, IMAGE *out, gboolean header_only )
{
char filename[FILENAME_MAX];
char mode[FILENAME_MAX];
im_filename_split( name, filename, mode );
#ifdef HAVE_LIBWEBP
if( header_only ) {
if( vips__webp_read_file_header( filename, out ) )
return( -1 );
}
else {
if( vips__webp_read_file( filename, out ) )
return( -1 );
}
#else
vips_error( "im_webp2vips",
"%s", _( "no webp support in your libvips" ) );
return( -1 );
#endif /*HAVE_LIBWEBP*/
return( 0 );
}
int
im_webp2vips( const char *name, IMAGE *out )
{
return( webp2vips( name, out, FALSE ) );
}
#ifdef HAVE_LIBWEBP
static int
im_webp2vips_header( const char *name, IMAGE *out )
{
return( webp2vips( name, out, TRUE ) );
}
static const char *webp_suffs[] = { ".webp", NULL };
typedef VipsFormat VipsFormatWebp;
typedef VipsFormatClass VipsFormatWebpClass;
static void
vips_format_webp_class_init( VipsFormatWebpClass *class )
{
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsFormatClass *format_class = (VipsFormatClass *) class;
object_class->nickname = "webp";
object_class->description = _( "webp" );
format_class->is_a = vips__iswebp;
format_class->header = im_webp2vips_header;
format_class->load = im_webp2vips;
format_class->save = im_vips2webp;
format_class->suffs = webp_suffs;
}
static void
vips_format_webp_init( VipsFormatWebp *object )
{
}
G_DEFINE_TYPE( VipsFormatWebp, vips_format_webp, VIPS_TYPE_FORMAT );
#endif /*HAVE_LIBWEBP*/

View File

@ -153,6 +153,9 @@ int im_vips2png( VipsImage *in, const char *filename );
int im_vips2bufpng( VipsImage *in, VipsImage *out,
int compression, int interlace, char **obuf, size_t *olen );
int im_webp2vips( const char *filename, VipsImage *out );
int im_vips2webp( VipsImage *in, const char *filename );
int im_raw2vips( const char *filename, VipsImage *out,
int width, int height, int bpp, int offset );
int im_vips2raw( VipsImage *in, int fd );