From 0ced5cb24be8085396cd82886cac1e32eedfc648 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Thu, 17 Jul 2014 09:09:39 +0100 Subject: [PATCH] add webp support to vips7 see https://github.com/jcupitt/libvips/issues/144 --- ChangeLog | 1 + libvips/deprecated/Makefile.am | 2 + libvips/deprecated/format.c | 4 ++ libvips/deprecated/im_vips2webp.c | 70 ++++++++++++++++++ libvips/deprecated/im_webp2vips.c | 114 ++++++++++++++++++++++++++++++ libvips/include/vips/format.h | 3 + 6 files changed, 194 insertions(+) create mode 100644 libvips/deprecated/im_vips2webp.c create mode 100644 libvips/deprecated/im_webp2vips.c diff --git a/ChangeLog b/ChangeLog index 1172b87e..a169db41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/libvips/deprecated/Makefile.am b/libvips/deprecated/Makefile.am index b163bf87..1affa20d 100644 --- a/libvips/deprecated/Makefile.am +++ b/libvips/deprecated/Makefile.am @@ -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 \ diff --git a/libvips/deprecated/format.c b/libvips/deprecated/format.c index 111ff70e..b1c44a9f 100644 --- a/libvips/deprecated/format.c +++ b/libvips/deprecated/format.c @@ -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(); diff --git a/libvips/deprecated/im_vips2webp.c b/libvips/deprecated/im_vips2webp.c new file mode 100644 index 00000000..e2b13bcb --- /dev/null +++ b/libvips/deprecated/im_vips2webp.c @@ -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 +#endif /*HAVE_CONFIG_H*/ +#include + +#include +#include +#include + +#include +#include +#include + +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 ) ); +} + diff --git a/libvips/deprecated/im_webp2vips.c b/libvips/deprecated/im_webp2vips.c new file mode 100644 index 00000000..5bccd981 --- /dev/null +++ b/libvips/deprecated/im_webp2vips.c @@ -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 +#endif /*HAVE_CONFIG_H*/ +#include + +#include + +#include +#include + +#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*/ + diff --git a/libvips/include/vips/format.h b/libvips/include/vips/format.h index ffc1f7cb..8a87d038 100644 --- a/libvips/include/vips/format.h +++ b/libvips/include/vips/format.h @@ -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 );