diff --git a/ChangeLog b/ChangeLog index 87a1b28f..42e9b4af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,9 @@ - add _source load support for pdfium - add "seed" param to perlin, worley and gaussnoise +18/12/20 started 8.10.5 +- fix potential /0 in animated webp load [lovell] + 14/12/20 started 8.10.4 - fix spng detection diff --git a/libvips/foreign/webp2vips.c b/libvips/foreign/webp2vips.c index e0e91e99..38a59807 100644 --- a/libvips/foreign/webp2vips.c +++ b/libvips/foreign/webp2vips.c @@ -260,9 +260,9 @@ blend_pixel( guint32 A, guint32 B ) guint8 aB = getA( B ); - guint8 fac = (aB * (256 - aA) + 128) >> 8; + guint8 fac = (aB * (255 - aA) + 127) >> 8; guint8 aR = aA + fac; - int scale = (1 << 24) / aR; + int scale = aR == 0 ? 0 : (1 << 24) / aR; guint8 rR = BLEND( getR( A ), aA, getR( B ), fac, scale ); guint8 gR = BLEND( getG( A ), aA, getG( B ), fac, scale ); diff --git a/test/test-suite/helpers/helpers.py b/test/test-suite/helpers/helpers.py index 8d1c309d..585a7f0c 100644 --- a/test/test-suite/helpers/helpers.py +++ b/test/test-suite/helpers/helpers.py @@ -22,6 +22,7 @@ ANALYZE_FILE = os.path.join(IMAGES, "t00740_tr1_segm.hdr") GIF_FILE = os.path.join(IMAGES, "cramps.gif") WEBP_FILE = os.path.join(IMAGES, "1.webp") WEBP_LOOKS_LIKE_SVG_FILE = os.path.join(IMAGES, "looks-like-svg.webp") +WEBP_ANIMATED_FILE = os.path.join(IMAGES, "big-height.webp") EXR_FILE = os.path.join(IMAGES, "sample.exr") FITS_FILE = os.path.join(IMAGES, "WFPC2u5780205r_c0fx.fits") OPENSLIDE_FILE = os.path.join(IMAGES, "CMU-1-Small-Region.svs") diff --git a/test/test-suite/images/big-height.webp b/test/test-suite/images/big-height.webp new file mode 100644 index 00000000..752a1696 Binary files /dev/null and b/test/test-suite/images/big-height.webp differ diff --git a/test/test-suite/test_foreign.py b/test/test-suite/test_foreign.py index a0cb4966..b146c9bd 100644 --- a/test/test-suite/test_foreign.py +++ b/test/test-suite/test_foreign.py @@ -17,8 +17,8 @@ from helpers import \ GIF_ANIM_DISPOSE_PREVIOUS_FILE, \ GIF_ANIM_DISPOSE_PREVIOUS_EXPECTED_PNG_FILE, \ temp_filename, assert_almost_equal_objects, have, skip_if_no, \ - TIF1_FILE, TIF2_FILE, TIF4_FILE, WEBP_LOOKS_LIKE_SVG_FILE - + TIF1_FILE, TIF2_FILE, TIF4_FILE, WEBP_LOOKS_LIKE_SVG_FILE, \ + WEBP_ANIMATED_FILE class TestForeign: tempdir = None @@ -694,6 +694,12 @@ class TestForeign: x = pyvips.Image.new_from_file(WEBP_LOOKS_LIKE_SVG_FILE) assert x.get("vips-loader") == "webpload" + # Animated WebP roundtrip + x = pyvips.Image.new_from_file(WEBP_ANIMATED_FILE, n=-1) + assert x.width == 13 + assert x.height == 16393 + buf = x.webpsave_buffer() + @skip_if_no("analyzeload") def test_analyzeload(self): def analyze_valid(im):