]> granicus.if.org Git - php/commitdiff
Add VP8L support to getimagesize() and friends
authorChristoph M. Becker <cmbecker69@gmx.de>
Sat, 8 Oct 2016 08:14:59 +0000 (10:14 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sat, 8 Oct 2016 08:22:04 +0000 (10:22 +0200)
This ammends commit 14d4ee93 to also add support for simple lossless
WebP, according to
<https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt>

ext/standard/image.c
ext/standard/tests/image/getimagesize.phpt
ext/standard/tests/image/image_type_to_mime_type.phpt
ext/standard/tests/image/test3llpix.webp [new file with mode: 0644]

index 10386c3da0b34be65eabf352e3622df51b859724..9de78d4a2b4d4ea0f673044334607d2f77bb8a10 100644 (file)
@@ -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;
 }
index e088322104d2a6edbe733acafb67fc538f5f50c1..98eb963f3df574d6517e9bf95dda93447da60e03 100644 (file)
@@ -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]=>
index 492c8434af9d9ce0547c5d6b1ef2b174b143d405..b22f6e030d3784e97fd6a5a135032d53d2dfb2ab 100644 (file)
@@ -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 (file)
index 0000000..2243a1b
Binary files /dev/null and b/ext/standard/tests/image/test3llpix.webp differ