From: Christoph M. Becker Date: Sat, 8 Oct 2016 08:14:59 +0000 (+0200) Subject: Add VP8L support to getimagesize() and friends X-Git-Tag: php-7.1.0RC4~80 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=59cd8eb723cfdcd5a23267ec54f23c0da9466404;p=php Add VP8L support to getimagesize() and friends This ammends commit 14d4ee93 to also add support for simple lossless WebP, according to --- diff --git a/ext/standard/image.c b/ext/standard/image.c index 10386c3da0..9de78d4a2b 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1127,22 +1127,43 @@ static struct gfxinfo *php_handle_ico(php_stream * stream) static struct gfxinfo *php_handle_webp(php_stream * stream) { struct gfxinfo *result = NULL; - const char sig[4] = {'V', 'P', '8', ' '}; + const char sig[3] = {'V', 'P', '8'}; unsigned char buf[18]; + int lossless; if (php_stream_read(stream, (char *) buf, 18) != 18) return NULL; - if (memcmp(buf, sig, 4)) { /* simple lossy WebP only */ + /* simple WebP only */ + if (memcmp(buf, sig, 3)) { return NULL; } + switch (buf[3]) { + case ' ': + lossless = 0; + break; + case 'L': + lossless = 1; + break; + default: + return NULL; + } result = (struct gfxinfo *) ecalloc(1, sizeof(struct gfxinfo)); - - result->width = (buf[14]) + ((buf[15] & 0x3F) << 8); - result->height = (buf[16]) + ((buf[17] & 0x3F) << 8); + + if (lossless) { + result->width = buf[9] + ((buf[10] & 0x3F) << 8) + 1; + result->height = (buf[10] >> 6) + (buf[11] << 2) + ((buf[12] & 0xF) << 10) + 1; + } else { + result->width = (buf[14]) + ((buf[15] & 0x3F) << 8); + result->height = (buf[16]) + ((buf[17] & 0x3F) << 8); + } result->bits = 8; /* always 1 byte */ - result->channels = 3; /* always YUV */ + if (lossless) { + result->channels = 4; /* always ARGB */ + } else { + result->channels = 3; /* always YUV */ + } return result; } diff --git a/ext/standard/tests/image/getimagesize.phpt b/ext/standard/tests/image/getimagesize.phpt index e088322104..98eb963f3d 100644 --- a/ext/standard/tests/image/getimagesize.phpt +++ b/ext/standard/tests/image/getimagesize.phpt @@ -23,7 +23,7 @@ GetImageSize() var_dump($result); ?> --EXPECT-- -array(14) { +array(15) { ["test-1pix.bmp"]=> array(6) { [0]=> @@ -137,6 +137,23 @@ array(14) { ["mime"]=> string(9) "image/gif" } + ["test3llpix.webp"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(3) + [2]=> + int(18) + [3]=> + string(20) "width="1" height="3"" + ["bits"]=> + int(8) + ["channels"]=> + int(4) + ["mime"]=> + string(10) "image/webp" + } ["test3pix.webp"]=> array(7) { [0]=> diff --git a/ext/standard/tests/image/image_type_to_mime_type.phpt b/ext/standard/tests/image/image_type_to_mime_type.phpt index 492c8434af..b22f6e030d 100644 --- a/ext/standard/tests/image/image_type_to_mime_type.phpt +++ b/ext/standard/tests/image/image_type_to_mime_type.phpt @@ -25,7 +25,7 @@ image_type_to_mime_type() var_dump($result); ?> --EXPECT-- -array(14) { +array(15) { ["test-1pix.bmp"]=> string(14) "image/x-ms-bmp" ["test1bpix.bmp"]=> @@ -40,6 +40,8 @@ array(14) { string(10) "image/jpeg" ["test2pix.gif"]=> string(9) "image/gif" + ["test3llpix.webp"]=> + string(10) "image/webp" ["test3pix.webp"]=> string(10) "image/webp" ["test4pix.gif"]=> diff --git a/ext/standard/tests/image/test3llpix.webp b/ext/standard/tests/image/test3llpix.webp new file mode 100644 index 0000000000..2243a1b2bc Binary files /dev/null and b/ext/standard/tests/image/test3llpix.webp differ