--- embedaddon/php/ext/standard/image.c 2012/02/21 23:48:02 1.1 +++ embedaddon/php/ext/standard/image.c 2014/06/15 20:03:57 1.1.1.5 @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2012 The PHP Group | + | Copyright (c) 1997-2014 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: image.c,v 1.1 2012/02/21 23:48:02 misho Exp $ */ +/* $Id: image.c,v 1.1.1.5 2014/06/15 20:03:57 misho Exp $ */ #include "php.h" #include @@ -30,8 +30,13 @@ #include #endif #include "php_image.h" +#ifdef PHP_WIN32 +#include "win32/php_stdint.h" +#endif +#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) #include "zlib.h" +#endif /* file type markers */ PHPAPI const char php_sig_gif[3] = {'G', 'I', 'F'}; @@ -79,7 +84,9 @@ PHP_MINIT_FUNCTION(imagetypes) REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_CS | CONST_PERSISTENT); +#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_CS | CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_WBMP", IMAGE_FILETYPE_WBMP, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG2000",IMAGE_FILETYPE_JPC, CONST_CS | CONST_PERSISTENT); /* keep alias */ @@ -108,7 +115,7 @@ static struct gfxinfo *php_handle_gif (php_stream * st result->width = (unsigned int)dim[0] | (((unsigned int)dim[1])<<8); result->height = (unsigned int)dim[2] | (((unsigned int)dim[3])<<8); result->bits = dim[4]&0x80 ? ((((unsigned int)dim[4])&0x07) + 1) : 0; - result->channels = 3; /* allways */ + result->channels = 3; /* always */ return result; } @@ -155,10 +162,11 @@ static struct gfxinfo *php_handle_bmp (php_stream * st result->width = (((unsigned int)dim[ 5]) << 8) + ((unsigned int) dim[ 4]); result->height = (((unsigned int)dim[ 7]) << 8) + ((unsigned int) dim[ 6]); result->bits = ((unsigned int)dim[11]); - } else if (size > 12 && (size <= 64 || size == 108)) { + } else if (size > 12 && (size <= 64 || size == 108 || size == 124)) { result = (struct gfxinfo *) ecalloc (1, sizeof(struct gfxinfo)); result->width = (((unsigned int)dim[ 7]) << 24) + (((unsigned int)dim[ 6]) << 16) + (((unsigned int)dim[ 5]) << 8) + ((unsigned int) dim[ 4]); result->height = (((unsigned int)dim[11]) << 24) + (((unsigned int)dim[10]) << 16) + (((unsigned int)dim[ 9]) << 8) + ((unsigned int) dim[ 8]); + result->height = abs((int32_t)result->height); result->bits = (((unsigned int)dim[15]) << 8) + ((unsigned int)dim[14]); } else { return NULL; @@ -184,6 +192,7 @@ static unsigned long int php_swf_get_bits (unsigned ch } /* }}} */ +#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) /* {{{ php_handle_swc */ static struct gfxinfo *php_handle_swc(php_stream * stream TSRMLS_DC) @@ -254,6 +263,7 @@ static struct gfxinfo *php_handle_swc(php_stream * str return result; } /* }}} */ +#endif /* {{{ php_handle_swf */ @@ -600,7 +610,7 @@ static struct gfxinfo *php_handle_jpc(php_stream * str /* JPEG 2000 components can be vastly different from one another. Each component can be sampled at a different resolution, use - a different colour space, have a seperate colour depth, and + a different colour space, have a separate colour depth, and be compressed totally differently! This makes giving a single "bit depth" answer somewhat problematic. For this implementation we'll use the highest depth encountered. */ @@ -1283,27 +1293,12 @@ PHPAPI int php_getimagetype(php_stream * stream, char } /* }}} */ -/* {{{ proto array getimagesize(string imagefile [, array info]) - Get the size of an image as 4-element array */ -PHP_FUNCTION(getimagesize) +static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ { - zval **info = NULL; - char *arg1, *temp; - int arg1_len, itype = 0, argc = ZEND_NUM_ARGS(); + char *temp; + int itype = 0; struct gfxinfo *result = NULL; - php_stream * stream = NULL; - if (zend_parse_parameters(argc TSRMLS_CC, "s|Z", &arg1, &arg1_len, &info) == FAILURE) { - return; - } - - if (argc == 2) { - zval_dtor(*info); - array_init(*info); - } - - stream = php_stream_open_wrapper(arg1, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL); - if (!stream) { RETURN_FALSE; } @@ -1327,7 +1322,11 @@ PHP_FUNCTION(getimagesize) result = php_handle_swf(stream TSRMLS_CC); break; case IMAGE_FILETYPE_SWC: +#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) result = php_handle_swc(stream TSRMLS_CC); +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled"); +#endif break; case IMAGE_FILETYPE_PSD: result = php_handle_psd(stream TSRMLS_CC); @@ -1364,8 +1363,6 @@ PHP_FUNCTION(getimagesize) break; } - php_stream_close(stream); - if (result) { array_init(return_value); add_index_long(return_value, 0, result->width); @@ -1387,6 +1384,56 @@ PHP_FUNCTION(getimagesize) } } /* }}} */ + +#define FROM_DATA 0 +#define FROM_PATH 1 + +static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { /* {{{ */ + zval **info = NULL; + php_stream *stream = NULL; + char *input; + int input_len; + const int argc = ZEND_NUM_ARGS(); + + if (zend_parse_parameters(argc TSRMLS_CC, "s|Z", &input, &input_len, &info) == FAILURE) { + return; + } + + if (argc == 2) { + zval_dtor(*info); + array_init(*info); + } + + + if (mode == FROM_PATH) { + stream = php_stream_open_wrapper(input, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH, NULL); + } else { + stream = php_stream_memory_open(TEMP_STREAM_READONLY, input, input_len); + } + + if (!stream) { + RETURN_FALSE; + } + + php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU); + php_stream_close(stream); +} +/* }}} */ + +/* {{{ proto array getimagesize(string imagefile [, array info]) + Get the size of an image as 4-element array */ +PHP_FUNCTION(getimagesize) +{ + php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH); +} +/* }}} */ + +/* {{{ proto array getimagesizefromstring(string data [, array info]) + Get the size of an image as 4-element array */ +PHP_FUNCTION(getimagesizefromstring) +{ + php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_DATA); +} /* * Local variables: