libvips/libvips/deprecated/im_vips2tiff.c

247 lines
6.0 KiB
C

/* vips7 compat stub for im_vips2tiff.c
*
* 4/12/11
* - just a stub calling vips_tiffsave()
*/
/*
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
*/
/* Turn on IM_REGION_ADDR() range checks, don't delete intermediates.
#define DEBUG
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <glib/gi18n-lib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vips/vips.h>
#include <vips/vips7compat.h>
int
im_vips2tiff( IMAGE *in, const char *filename )
{
char *p, *q, *r;
char name[FILENAME_MAX];
char mode[FILENAME_MAX];
char buf[FILENAME_MAX];
VipsForeignTiffCompression compression =
VIPS_FOREIGN_TIFF_COMPRESSION_NONE;
int Q = 75;
VipsForeignTiffPredictor predictor = VIPS_FOREIGN_TIFF_PREDICTOR_NONE;
char *profile = NULL;
gboolean tile = FALSE;
int tile_width = 128;
int tile_height = 128;
gboolean pyramid = FALSE;
gboolean squash = FALSE;
VipsForeignTiffResunit resunit = VIPS_FOREIGN_TIFF_RESUNIT_CM;
double xres = in->Xres * 10.0;
double yres = in->Yres * 10.0;
gboolean bigtiff = FALSE;
im_filename_split( filename, name, mode );
strcpy( buf, mode );
p = &buf[0];
if( (q = im_getnextoption( &p )) ) {
if( im_isprefix( "none", q ) )
compression = VIPS_FOREIGN_TIFF_COMPRESSION_NONE;
else if( im_isprefix( "packbits", q ) )
compression = VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS;
else if( im_isprefix( "ccittfax4", q ) )
compression = VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4;
else if( im_isprefix( "lzw", q ) ) {
compression = VIPS_FOREIGN_TIFF_COMPRESSION_LZW;
if( (r = im_getsuboption( q )) ) {
int i;
if( sscanf( r, "%d", &i ) != 1 ) {
im_error( "im_vips2tiff",
"%s", _( "bad predictor "
"parameter" ) );
return( -1 );
}
predictor = i;
}
}
else if( im_isprefix( "deflate", q ) ) {
compression = VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE;
if( (r = im_getsuboption( q )) ) {
int i;
if( sscanf( r, "%d", &i ) != 1 ) {
im_error( "im_vips2tiff",
"%s", _( "bad predictor "
"parameter" ) );
return( -1 );
}
predictor = i;
}
}
else if( im_isprefix( "jpeg", q ) ) {
compression = VIPS_FOREIGN_TIFF_COMPRESSION_JPEG;
if( (r = im_getsuboption( q )) )
if( sscanf( r, "%d", &Q ) != 1 ) {
im_error( "im_vips2tiff",
"%s", _( "bad JPEG quality "
"parameter" ) );
return( -1 );
}
}
else {
im_error( "im_vips2tiff", _( "unknown compression mode "
"\"%s\"\nshould be one of \"none\", "
"\"packbits\", \"ccittfax4\", \"lzw\", "
"\"deflate\" or \"jpeg\"" ), q );
return( -1 );
}
}
if( (q = im_getnextoption( &p )) ) {
if( im_isprefix( "tile", q ) ) {
tile = TRUE;
if( (r = im_getsuboption( q )) ) {
if( sscanf( r, "%dx%d",
&tile_width, &tile_height ) != 2 ) {
im_error( "im_vips2tiff", "%s",
_( "bad tile sizes" ) );
return( -1 );
}
}
}
else if( im_isprefix( "strip", q ) )
tile = FALSE;
else {
im_error( "im_vips2tiff", _( "unknown layout mode "
"\"%s\"\nshould be one of \"tile\" or "
"\"strip\"" ), q );
return( -1 );
}
}
if( (q = im_getnextoption( &p )) ) {
if( im_isprefix( "pyramid", q ) )
pyramid = TRUE;
else if( im_isprefix( "flat", q ) )
pyramid = FALSE;
else {
im_error( "im_vips2tiff", _( "unknown multi-res mode "
"\"%s\"\nshould be one of \"flat\" or "
"\"pyramid\"" ), q );
return( -1 );
}
}
if( (q = im_getnextoption( &p )) ) {
if( im_isprefix( "onebit", q ) )
squash = TRUE;
else if( im_isprefix( "manybit", q ) )
squash = FALSE;
else {
im_error( "im_vips2tiff", _( "unknown format "
"\"%s\"\nshould be one of \"onebit\" or "
"\"manybit\"" ), q );
return( -1 );
}
}
if( (q = im_getnextoption( &p )) ) {
if( im_isprefix( "res_cm", q ) )
resunit = VIPS_FOREIGN_TIFF_RESUNIT_CM;
else if( im_isprefix( "res_inch", q ) )
resunit = VIPS_FOREIGN_TIFF_RESUNIT_INCH;
else {
im_error( "im_vips2tiff", _( "unknown resolution unit "
"\"%s\"\nshould be one of \"res_cm\" or "
"\"res_inch\"" ), q );
return( -1 );
}
if( (r = im_getsuboption( q )) ) {
if( sscanf( r, "%lfx%lf", &xres, &yres ) != 2 ) {
if( sscanf( r, "%lf", &xres ) != 1 ) {
im_error( "im_vips2tiff", "%s",
_( "bad resolution values" ) );
return( -1 );
}
yres = xres;
}
/* vips resolutions are always in pixels/mm. If the
* user specifies ",res_inch:72x72" then they are
* using pixels/inch instead and we must convert.
*/
if( resunit == VIPS_FOREIGN_TIFF_RESUNIT_INCH ) {
xres /= 2.54;
yres /= 2.54;
}
}
}
if( (q = im_getnextoption( &p )) && strcmp( q, "" ) != 0 )
profile = im_strdup( NULL, q );
if( (q = im_getnextoption( &p )) && strcmp( q, "8" ) == 0 )
bigtiff = TRUE;
if( (q = im_getnextoption( &p )) ) {
im_error( "im_vips2tiff",
_( "unknown extra options \"%s\"" ), q );
return( -1 );
}
if( vips_tiffsave( in, name,
"compression", compression,
"Q", Q,
"predictor", predictor,
"profile", profile,
"tile", tile,
"tile_width", tile_width,
"tile_height", tile_height,
"pyramid", pyramid,
"squash", squash,
"resunit", resunit,
"xres", xres,
"yres", yres,
"bigtiff", bigtiff,
NULL ) )
return( -1 );
return( 0 );
}