diff options
author | Remi Collet <remi@php.net> | 2013-04-23 13:43:57 +0200 |
---|---|---|
committer | Remi Collet <remi@php.net> | 2013-04-23 13:43:57 +0200 |
commit | eb50789910410179565e8f2114d80011e34c0ad7 (patch) | |
tree | 7ffa4ac03fce9447019c3f8e8e568f7a9391e563 | |
parent | 734e165d4e427feca9a736b62832a2ff287a22c9 (diff) | |
download | php-git-eb50789910410179565e8f2114d80011e34c0ad7.tar.gz |
(re)allow WBMP detection with system libgd
provide getbmi and skipheader not exported functions in gd_compat.
-rw-r--r-- | ext/gd/gd.c | 5 | ||||
-rw-r--r-- | ext/gd/libgd/gd_compat.c | 36 | ||||
-rw-r--r-- | ext/gd/libgd/gd_compat.h | 3 |
3 files changed, 40 insertions, 4 deletions
diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 6cafb51f20..203ae24216 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -2403,14 +2403,12 @@ static int _php_image_type (char data[8]) } else if (!memcmp(data, php_sig_gif, 3)) { return PHP_GDIMG_TYPE_GIF; } -/* Temporary disabled, as gdGetC, getmbi and skipheader not exported in system libgd */ -#if HAVE_GD_BUNDLED #ifdef HAVE_GD_WBMP else { gdIOCtx *io_ctx; io_ctx = gdNewDynamicCtxEx(8, data, 0); if (io_ctx) { - if (getmbi((int(*)(void *)) gdGetC, io_ctx) == 0 && skipheader((int(*)(void *)) gdGetC, io_ctx) == 0 ) { + if (getmbi((int(*)(void *)) io_ctx->getC, io_ctx) == 0 && skipheader((int(*)(void *)) io_ctx->getC, io_ctx) == 0 ) { #if HAVE_LIBGD204 io_ctx->gd_free(io_ctx); #else @@ -2427,7 +2425,6 @@ static int _php_image_type (char data[8]) } } #endif -#endif return -1; #endif } diff --git a/ext/gd/libgd/gd_compat.c b/ext/gd/libgd/gd_compat.c index b56329029e..f3627a1404 100644 --- a/ext/gd/libgd/gd_compat.c +++ b/ext/gd/libgd/gd_compat.c @@ -33,6 +33,7 @@ const char * gdPngGetVersionString() } #endif +/* Not exported by libgd, copied from gdhelpers.h */ int overflow2(int a, int b) { if(a <= 0 || b <= 0) { @@ -44,3 +45,38 @@ int overflow2(int a, int b) return 0; } +/* Not exported by libgd, copied from wbmp.c */ +int +getmbi (int (*getin) (void *in), void *in) +{ + int i, mbi = 0; + + do + { + i = getin (in); + if (i < 0) + return (-1); + mbi = (mbi << 7) | (i & 0x7f); + } + while (i & 0x80); + + return (mbi); +} + +/* Not exported by libgd, copied from wbmp.c */ +int +skipheader (int (*getin) (void *in), void *in) +{ + int i; + + do + { + i = getin (in); + if (i < 0) + return (-1); + } + while (i & 0x80); + + return (0); +} + diff --git a/ext/gd/libgd/gd_compat.h b/ext/gd/libgd/gd_compat.h index 779e709a63..e8fedf80c5 100644 --- a/ext/gd/libgd/gd_compat.h +++ b/ext/gd/libgd/gd_compat.h @@ -11,6 +11,9 @@ const char * gdPngGetVersionString(); const char * gdJpegGetVersionString(); int gdJpegGetVersionInt(); int overflow2(int a, int b); +int getmbi (int (*getin) (void *in), void *in); +int skipheader (int (*getin) (void *in), void *in); + /* filters section * |