]> granicus.if.org Git - php/commitdiff
- Added support for compressed SWF (Flash MX) files to getimagesize().
authorDerick Rethans <derick@php.net>
Thu, 23 May 2002 21:48:27 +0000 (21:48 +0000)
committerDerick Rethans <derick@php.net>
Thu, 23 May 2002 21:48:27 +0000 (21:48 +0000)
  (Fixes feature request #17272).
@- Added support to getimagesize() for compressed Flash MX files. (Derick)

ext/standard/image.c
ext/standard/php_image.h

index f6f466fd4c7f1d37c96b0cd30e390dc516dbd948..2b226bd9b266d7436b8b965735a98767a2528901 100644 (file)
 #endif
 #include "php_image.h"
 
+#if HAVE_ZLIB
+#include "zlib.h"
+#endif
+
 /* file type markers */
 PHPAPI const char php_sig_gif[3] = {'G', 'I', 'F'};
 PHPAPI const char php_sig_psd[4] = {'8', 'B', 'P', 'S'};
 PHPAPI const char php_sig_bmp[2] = {'B', 'M'};
 PHPAPI const char php_sig_swf[3] = {'F', 'W', 'S'};
+PHPAPI const char php_sig_swc[3] = {'C', 'W', 'S'};
 PHPAPI const char php_sig_jpg[3] = {(char) 0xff, (char) 0xd8, (char) 0xff};
 PHPAPI const char php_sig_png[8] = {(char) 0x89, (char) 0x50, (char) 0x4e, (char) 0x47,
 (char) 0x0d, (char) 0x0a, (char) 0x1a, (char) 0x0a};
@@ -157,6 +162,37 @@ static unsigned long int php_swf_get_bits (unsigned char* buffer, unsigned int p
 }
 /* }}} */
 
+#if HAVE_ZLIB
+/* {{{ php_handle_swc
+ */
+static struct gfxinfo *php_handle_swc (php_stream * stream TSRMLS_DC)
+{
+       struct gfxinfo *result = NULL;
+
+       long bits;
+       unsigned char a[64];
+       unsigned long len = 64;
+       char *b;
+
+       b = ecalloc (1, len + 1);
+
+       result = (struct gfxinfo *) ecalloc (1, sizeof (struct gfxinfo));
+       php_stream_seek(stream, 5, SEEK_CUR);
+
+       php_stream_read(stream, a, sizeof(a)); /* fread(a, sizeof(a), 1, fp); */
+       uncompress (b, &len, a, sizeof(a));
+       
+       bits = php_swf_get_bits (b, 0, 5);
+       result->width = (php_swf_get_bits (b, 5 + bits, bits) -
+               php_swf_get_bits (b, 5, bits)) / 20;
+       result->height = (php_swf_get_bits (b, 5 + (3 * bits), bits) -
+               php_swf_get_bits (b, 5 + (2 * bits), bits)) / 20;
+       efree (b);
+       return result;
+}
+/* }}} */
+#endif
+
 /* {{{ php_handle_swf
  */
 static struct gfxinfo *php_handle_swf (php_stream * stream TSRMLS_DC)
@@ -658,6 +694,10 @@ PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
                }
        } else if (!memcmp(filetype, php_sig_swf, 3)) {
                return IMAGE_FILETYPE_SWF;
+#if HAVE_ZLIB
+       } else if (!memcmp(filetype, php_sig_swc, 3)) {
+               return IMAGE_FILETYPE_SWC;
+#endif
        } else if (!memcmp(filetype, php_sig_psd, 3)) {
                return IMAGE_FILETYPE_PSD;
        } else if (!memcmp(filetype, php_sig_bmp, 2)) {
@@ -739,6 +779,11 @@ PHP_FUNCTION(getimagesize)
         case IMAGE_FILETYPE_SWF:
                        result = php_handle_swf(stream TSRMLS_CC);
                break;
+#if HAVE_ZLIB
+        case IMAGE_FILETYPE_SWC:
+                       result = php_handle_swc(stream TSRMLS_CC);
+               break;
+#endif
         case IMAGE_FILETYPE_PSD:
                        result = php_handle_psd(stream TSRMLS_CC);
                break;
index 94b2384924f54eaaffade0039967e5302a2bb743..a33c60759fcc9a633640ccfca6f778e21ea2d33c 100644 (file)
@@ -41,7 +41,8 @@ typedef enum
   IMAGE_FILETYPE_JPC,
   IMAGE_FILETYPE_JP2,
   IMAGE_FILETYPE_JPX,
-  IMAGE_FILETYPE_JB2
+  IMAGE_FILETYPE_JB2,
+  IMAGE_FILETYPE_SWC
 } image_filetype;
 /* }}} */