Merge branch '8.13'
This commit is contained in:
commit
f0bb3e3442
@ -16,6 +16,8 @@ master
|
|||||||
|
|
||||||
11/10/22 started 8.13.3
|
11/10/22 started 8.13.3
|
||||||
- improve rules for 16-bit heifsave [johntrunc]
|
- improve rules for 16-bit heifsave [johntrunc]
|
||||||
|
- improve libspng pallette write [kleisauke]
|
||||||
|
- improve libspng pallette sort [DarthSim]
|
||||||
|
|
||||||
5/9/22 started 8.13.2
|
5/9/22 started 8.13.2
|
||||||
- in dzsave, add add missing include directive for errno/EEXIST [kleisauke]
|
- in dzsave, add add missing include directive for errno/EEXIST [kleisauke]
|
||||||
|
@ -362,8 +362,6 @@ vips_foreign_save_spng_write( VipsForeignSaveSpng *spng, VipsImage *in )
|
|||||||
int error;
|
int error;
|
||||||
struct spng_ihdr ihdr;
|
struct spng_ihdr ihdr;
|
||||||
struct spng_phys phys;
|
struct spng_phys phys;
|
||||||
struct spng_plte plte = { 0 };
|
|
||||||
struct spng_trns trns = { 0 };
|
|
||||||
int fmt;
|
int fmt;
|
||||||
enum spng_encode_flags encode_flags;
|
enum spng_encode_flags encode_flags;
|
||||||
|
|
||||||
@ -375,8 +373,76 @@ vips_foreign_save_spng_write( VipsForeignSaveSpng *spng, VipsImage *in )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ihdr.width = in->Xsize;
|
||||||
|
ihdr.height = in->Ysize;
|
||||||
|
ihdr.bit_depth = spng->bitdepth;
|
||||||
|
|
||||||
|
switch( in->Bands ) {
|
||||||
|
case 1:
|
||||||
|
ihdr.color_type = SPNG_COLOR_TYPE_GRAYSCALE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
ihdr.color_type = SPNG_COLOR_TYPE_GRAYSCALE_ALPHA;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
ihdr.color_type = SPNG_COLOR_TYPE_TRUECOLOR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
ihdr.color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
vips_error( class->nickname, "%s", _( "bad bands" ) );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_QUANTIZATION
|
||||||
|
/* Enable image quantisation to paletted 8bpp PNG if palette is set.
|
||||||
|
*/
|
||||||
|
if( spng->palette )
|
||||||
|
ihdr.color_type = SPNG_COLOR_TYPE_INDEXED;
|
||||||
|
#else
|
||||||
|
if( spng->palette )
|
||||||
|
g_warning( "%s",
|
||||||
|
_( "ignoring palette (no quantisation support)" ) );
|
||||||
|
#endif /*HAVE_QUANTIZATION*/
|
||||||
|
|
||||||
|
ihdr.compression_method = 0;
|
||||||
|
ihdr.filter_method = 0;
|
||||||
|
ihdr.interlace_method = spng->interlace ? 1 : 0;
|
||||||
|
if( (error = spng_set_ihdr( spng->ctx, &ihdr )) ) {
|
||||||
|
vips_error( class->nickname, "%s", spng_strerror( error ) );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
spng_set_option( spng->ctx,
|
||||||
|
SPNG_IMG_COMPRESSION_LEVEL, spng->compression );
|
||||||
|
spng_set_option( spng->ctx,
|
||||||
|
SPNG_TEXT_COMPRESSION_LEVEL, spng->compression );
|
||||||
|
spng_set_option( spng->ctx,
|
||||||
|
SPNG_FILTER_CHOICE, spng->filter );
|
||||||
|
|
||||||
|
/* Set resolution. spng uses pixels per meter.
|
||||||
|
*/
|
||||||
|
phys.unit_specifier = 1;
|
||||||
|
phys.ppu_x = VIPS_RINT( in->Xres * 1000.0 );
|
||||||
|
phys.ppu_y = VIPS_RINT( in->Xres * 1000.0 );
|
||||||
|
spng_set_phys( spng->ctx, &phys );
|
||||||
|
|
||||||
|
/* Metadata.
|
||||||
|
*/
|
||||||
|
if( !save->strip &&
|
||||||
|
vips_foreign_save_spng_metadata( spng, in ) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
#ifdef HAVE_QUANTIZATION
|
#ifdef HAVE_QUANTIZATION
|
||||||
if( spng->palette ) {
|
if( spng->palette ) {
|
||||||
|
struct spng_plte plte = { 0 };
|
||||||
|
struct spng_trns trns = { 0 };
|
||||||
|
|
||||||
VipsImage *im_index;
|
VipsImage *im_index;
|
||||||
VipsImage *im_palette;
|
VipsImage *im_palette;
|
||||||
int palette_count;
|
int palette_count;
|
||||||
@ -406,14 +472,9 @@ vips_foreign_save_spng_write( VipsForeignSaveSpng *spng, VipsImage *in )
|
|||||||
entry->blue = p[2];
|
entry->blue = p[2];
|
||||||
plte.n_entries += 1;
|
plte.n_entries += 1;
|
||||||
|
|
||||||
/* Quantizr and libimagequant sort the pallette
|
trns.type3_alpha[i] = p[3];
|
||||||
* by transparency, so trns.type3_alpha[] and
|
|
||||||
* plte.entries[] will use the same indexing.
|
|
||||||
*/
|
|
||||||
g_assert( i == 0 || p[3] >= p[-1] );
|
|
||||||
if( p[3] != 255 ) {
|
if( p[3] != 255 ) {
|
||||||
trns.type3_alpha[trns.n_type3_entries] = p[3];
|
trns.n_type3_entries = i+1;
|
||||||
trns.n_type3_entries += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,14 +487,14 @@ vips_foreign_save_spng_write( VipsForeignSaveSpng *spng, VipsImage *in )
|
|||||||
|
|
||||||
VIPS_UNREF( im_palette );
|
VIPS_UNREF( im_palette );
|
||||||
|
|
||||||
|
spng_set_plte( spng->ctx, &plte );
|
||||||
|
if( trns.n_type3_entries )
|
||||||
|
spng_set_trns( spng->ctx, &trns );
|
||||||
|
|
||||||
in = spng->memory = im_index;
|
in = spng->memory = im_index;
|
||||||
}
|
}
|
||||||
#endif /*HAVE_QUANTIZATION*/
|
#endif /*HAVE_QUANTIZATION*/
|
||||||
|
|
||||||
ihdr.width = in->Xsize;
|
|
||||||
ihdr.height = in->Ysize;
|
|
||||||
ihdr.bit_depth = spng->bitdepth;
|
|
||||||
|
|
||||||
/* Low-bitdepth write needs an extra buffer for packing pixels.
|
/* Low-bitdepth write needs an extra buffer for packing pixels.
|
||||||
*/
|
*/
|
||||||
if( spng->bitdepth < 8 ) {
|
if( spng->bitdepth < 8 ) {
|
||||||
@ -445,67 +506,6 @@ vips_foreign_save_spng_write( VipsForeignSaveSpng *spng, VipsImage *in )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( in->Bands ) {
|
|
||||||
case 1:
|
|
||||||
if( spng->palette )
|
|
||||||
ihdr.color_type = SPNG_COLOR_TYPE_INDEXED;
|
|
||||||
else
|
|
||||||
ihdr.color_type = SPNG_COLOR_TYPE_GRAYSCALE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
ihdr.color_type = SPNG_COLOR_TYPE_GRAYSCALE_ALPHA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
ihdr.color_type = SPNG_COLOR_TYPE_TRUECOLOR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
ihdr.color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
vips_error( class->nickname, "%s", _( "bad bands" ) );
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
ihdr.compression_method = 0;
|
|
||||||
ihdr.filter_method = 0;
|
|
||||||
ihdr.interlace_method = spng->interlace ? 1 : 0;
|
|
||||||
if( (error = spng_set_ihdr( spng->ctx, &ihdr )) ) {
|
|
||||||
vips_error( class->nickname, "%s", spng_strerror( error ) );
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
spng_set_option( spng->ctx,
|
|
||||||
SPNG_IMG_COMPRESSION_LEVEL, spng->compression );
|
|
||||||
spng_set_option( spng->ctx,
|
|
||||||
SPNG_TEXT_COMPRESSION_LEVEL, spng->compression );
|
|
||||||
spng_set_option( spng->ctx,
|
|
||||||
SPNG_FILTER_CHOICE, spng->filter );
|
|
||||||
|
|
||||||
/* Set resolution. png uses pixels per meter.
|
|
||||||
*/
|
|
||||||
phys.unit_specifier = 1;
|
|
||||||
phys.ppu_x = VIPS_RINT( in->Xres * 1000.0 );
|
|
||||||
phys.ppu_y = VIPS_RINT( in->Xres * 1000.0 );
|
|
||||||
spng_set_phys( spng->ctx, &phys );
|
|
||||||
|
|
||||||
/* Metadata.
|
|
||||||
*/
|
|
||||||
if( !save->strip &&
|
|
||||||
vips_foreign_save_spng_metadata( spng, in ) )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
#ifdef HAVE_QUANTIZATION
|
|
||||||
if( spng->palette ) {
|
|
||||||
spng_set_plte( spng->ctx, &plte );
|
|
||||||
if( trns.n_type3_entries )
|
|
||||||
spng_set_trns( spng->ctx, &trns );
|
|
||||||
}
|
|
||||||
#endif /*HAVE_QUANTIZATION*/
|
|
||||||
|
|
||||||
/* SPNG_FMT_PNG is a special value that matches the format in ihdr
|
/* SPNG_FMT_PNG is a special value that matches the format in ihdr
|
||||||
*/
|
*/
|
||||||
fmt = SPNG_FMT_PNG;
|
fmt = SPNG_FMT_PNG;
|
||||||
|
@ -1066,7 +1066,7 @@ write_vips( Write *write,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_QUANTIZATION
|
#ifdef HAVE_QUANTIZATION
|
||||||
/* Enable image quantisation to paletted 8bpp PNG if colours is set.
|
/* Enable image quantisation to paletted 8bpp PNG if palette is set.
|
||||||
*/
|
*/
|
||||||
if( palette )
|
if( palette )
|
||||||
color_type = PNG_COLOR_TYPE_PALETTE;
|
color_type = PNG_COLOR_TYPE_PALETTE;
|
||||||
|
Loading…
Reference in New Issue
Block a user