fix low-bitdepth spng save

There was a missing shift, thanks jeffska

See https://github.com/libvips/libvips/issues/2985
This commit is contained in:
John Cupitt 2022-08-14 10:26:24 +01:00
parent 29e80ca43f
commit ca2796aa7f
2 changed files with 3 additions and 1 deletions

View File

@ -4,6 +4,7 @@
- fix libpng fallback when spng is disabled in meson - fix libpng fallback when spng is disabled in meson
- add "unlimited" to jpegload - add "unlimited" to jpegload
- better 0 detection in unpremultiply - better 0 detection in unpremultiply
- fix low bitdepth spng save [jeffska]
21/11/21 started 8.13 21/11/21 started 8.13
- configure fails for requested but unmet dependencies [remicollet] - configure fails for requested but unmet dependencies [remicollet]

View File

@ -270,6 +270,7 @@ vips_foreign_save_spng_pack( VipsForeignSaveSpng *spng,
VipsPel *q, VipsPel *p, size_t n ) VipsPel *q, VipsPel *p, size_t n )
{ {
int pixel_mask = 8 / spng->bitdepth - 1; int pixel_mask = 8 / spng->bitdepth - 1;
int shift = 8 - spng->bitdepth;
VipsPel bits; VipsPel bits;
size_t x; size_t x;
@ -277,7 +278,7 @@ vips_foreign_save_spng_pack( VipsForeignSaveSpng *spng,
bits = 0; bits = 0;
for( x = 0; x < n; x++ ) { for( x = 0; x < n; x++ ) {
bits <<= spng->bitdepth; bits <<= spng->bitdepth;
bits |= p[x]; bits |= p[x] >> shift;
if( (x & pixel_mask) == pixel_mask ) if( (x & pixel_mask) == pixel_mask )
*q++ = bits; *q++ = bits;