try revising spng FMT handling again

This commit is contained in:
John Cupitt 2020-06-09 02:38:38 +01:00
parent f113e64515
commit ac96bb80b5

View File

@ -318,21 +318,33 @@ vips_foreign_load_png_header( VipsForeignLoad *load )
switch( png->ihdr.color_type ) { switch( png->ihdr.color_type ) {
case SPNG_COLOR_TYPE_GRAYSCALE: case SPNG_COLOR_TYPE_GRAYSCALE:
case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA:
png->bands = 1; png->bands = 1;
png->interpretation = VIPS_INTERPRETATION_B_W; png->interpretation = VIPS_INTERPRETATION_B_W;
png->fmt = SPNG_FMT_PNG; png->fmt = SPNG_FMT_PNG;
break;
case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA: if( !spng_get_trns( png->ctx, &trns ) ) {
png->bands = 2; png->bands += 1;
png->interpretation = VIPS_INTERPRETATION_B_W;
png->fmt = SPNG_FMT_PNG; /* Expand 1/2/4 bit images to 8 bit.
*/
if( png->ihdr.bit_depth < 8 )
png->fmt = SPNG_FMT_GA8;
}
else {
if( png->ihdr.bit_depth < 8 )
png->fmt = SPNG_FMT_G8;
}
break; break;
case SPNG_COLOR_TYPE_TRUECOLOR: case SPNG_COLOR_TYPE_TRUECOLOR:
case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
png->bands = 3; png->bands = 3;
png->interpretation = VIPS_INTERPRETATION_sRGB; png->interpretation = VIPS_INTERPRETATION_sRGB;
png->fmt = SPNG_FMT_PNG; png->fmt = SPNG_FMT_PNG;
if( !spng_get_trns( png->ctx, &trns ) )
png->bands += 1;
break; break;
case SPNG_COLOR_TYPE_INDEXED: case SPNG_COLOR_TYPE_INDEXED:
@ -341,37 +353,19 @@ vips_foreign_load_png_header( VipsForeignLoad *load )
/* Expand indexed images to RGB8. /* Expand indexed images to RGB8.
*/ */
if( !spng_get_trns( png->ctx, &trns ) ) {
png->bands += 1;
png->fmt = SPNG_FMT_RGBA8;
}
else
png->fmt = SPNG_FMT_RGB8; png->fmt = SPNG_FMT_RGB8;
break; break;
case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
png->bands = 4;
png->interpretation = VIPS_INTERPRETATION_sRGB;
png->fmt = SPNG_FMT_PNG;
break;
default: default:
vips_error( class->nickname, "%s", _( "unknown color type" ) ); vips_error( class->nickname, "%s", _( "unknown color type" ) );
return( -1 ); return( -1 );
} }
if( !spng_get_trns( png->ctx, &trns ) ) {
if( png->ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR ) {
if( png->ihdr.bit_depth == 16 )
png->fmt = SPNG_FMT_RGBA16;
else
png->fmt = SPNG_FMT_RGBA8;
}
else if( png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED )
png->fmt = SPNG_FMT_RGBA8;
else if( png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE ) {
if( png->ihdr.bit_depth == 16 )
png->fmt = SPNG_FMT_GA16;
else
png->fmt = SPNG_FMT_GA8;
}
}
if( png->ihdr.bit_depth == 16 ) { if( png->ihdr.bit_depth == 16 ) {
png->format = VIPS_FORMAT_USHORT; png->format = VIPS_FORMAT_USHORT;
if( png->interpretation == VIPS_INTERPRETATION_B_W ) if( png->interpretation == VIPS_INTERPRETATION_B_W )