Skip to content

Commit c76e8e0

Browse files
author
Scott MacVicar
committed
Added icon file format support to getimagesize
1 parent 7c5c214 commit c76e8e0

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

ext/standard/image.c

+49-4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ PHPAPI const char php_sig_jp2[12] = {(char)0x00, (char)0x00, (char)0x00, (char)0
5151
(char)0x6a, (char)0x50, (char)0x20, (char)0x20,
5252
(char)0x0d, (char)0x0a, (char)0x87, (char)0x0a};
5353
PHPAPI const char php_sig_iff[4] = {'F','O','R','M'};
54+
PHPAPI const char php_sig_ico[3] = {(char)0x00, (char)0x00, (char)0x01};
5455

5556
/* REMEMBER TO ADD MIME-TYPE TO FUNCTION php_image_type_to_mime_type */
5657
/* PCX must check first 64bytes and byte 0=0x0a and byte2 < 0x06 */
@@ -87,6 +88,7 @@ PHP_MINIT_FUNCTION(imagetypes)
8788
REGISTER_LONG_CONSTANT("IMAGETYPE_WBMP", IMAGE_FILETYPE_WBMP, CONST_CS | CONST_PERSISTENT);
8889
REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG2000",IMAGE_FILETYPE_JPC, CONST_CS | CONST_PERSISTENT); /* keep alias */
8990
REGISTER_LONG_CONSTANT("IMAGETYPE_XBM", IMAGE_FILETYPE_XBM, CONST_CS | CONST_PERSISTENT);
91+
REGISTER_LONG_CONSTANT("IMAGETYPE_ICO", IMAGE_FILETYPE_ICO, CONST_CS | CONST_PERSISTENT);
9092
return SUCCESS;
9193
}
9294
/* }}} */
@@ -1076,6 +1078,42 @@ static struct gfxinfo *php_handle_xbm(php_stream * stream TSRMLS_DC)
10761078
}
10771079
/* }}} */
10781080

1081+
/* {{{ php_handle_ico
1082+
*/
1083+
static struct gfxinfo *php_handle_ico(php_stream * stream TSRMLS_DC)
1084+
{
1085+
struct gfxinfo *result = NULL;
1086+
unsigned char dim[16];
1087+
int num_icons = 0;
1088+
1089+
if (php_stream_read(stream, dim, 2) != 2)
1090+
return NULL;
1091+
1092+
num_icons = (((unsigned int)dim[1]) << 8) + ((unsigned int) dim[0]);
1093+
1094+
if (num_icons < 1 || num_icons > 255)
1095+
return NULL;
1096+
1097+
result = (struct gfxinfo *) ecalloc(1, sizeof(struct gfxinfo));
1098+
1099+
while (num_icons > 0)
1100+
{
1101+
if (php_stream_read(stream, dim, sizeof(dim)) != sizeof(dim))
1102+
break;
1103+
1104+
if ((((unsigned int)dim[7]) << 8) + ((unsigned int)dim[6]) >= result->bits)
1105+
{
1106+
result->width = (unsigned int)dim[0];
1107+
result->height = (unsigned int)dim[1];
1108+
result->bits = (((unsigned int)dim[7]) << 8) + ((unsigned int)dim[6]);
1109+
}
1110+
num_icons--;
1111+
}
1112+
1113+
return result;
1114+
}
1115+
/* }}} */
1116+
10791117
/* {{{ php_image_type_to_mime_type
10801118
* Convert internal image_type to mime type */
10811119
PHPAPI char * php_image_type_to_mime_type(int image_type)
@@ -1107,6 +1145,8 @@ PHPAPI char * php_image_type_to_mime_type(int image_type)
11071145
return "image/jp2";
11081146
case IMAGE_FILETYPE_XBM:
11091147
return "image/xbm";
1148+
case IMAGE_FILETYPE_ICO:
1149+
return "image/vnd.microsoft.icon";
11101150
default:
11111151
case IMAGE_FILETYPE_UNKNOWN:
11121152
return "application/octet-stream"; /* suppose binary format */
@@ -1171,6 +1211,8 @@ PHP_FUNCTION(image_type_to_extension)
11711211
RETURN_STRING(".jb2" + !inc_dot, 1);
11721212
case IMAGE_FILETYPE_XBM:
11731213
RETURN_STRING(".xbm" + !inc_dot, 1);
1214+
case IMAGE_FILETYPE_ICO:
1215+
RETURN_STRING(".ico" + !inc_dot, 1);
11741216
}
11751217

11761218
RETURN_FALSE;
@@ -1224,12 +1266,12 @@ PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
12241266
/* BYTES READ: 4 */
12251267
if (!memcmp(filetype, php_sig_tif_ii, 4)) {
12261268
return IMAGE_FILETYPE_TIFF_II;
1227-
} else
1228-
if (!memcmp(filetype, php_sig_tif_mm, 4)) {
1269+
} else if (!memcmp(filetype, php_sig_tif_mm, 4)) {
12291270
return IMAGE_FILETYPE_TIFF_MM;
1230-
}
1231-
if (!memcmp(filetype, php_sig_iff, 4)) {
1271+
} else if (!memcmp(filetype, php_sig_iff, 4)) {
12321272
return IMAGE_FILETYPE_IFF;
1273+
} else if (!memcmp(filetype, php_sig_ico, 3)) {
1274+
return IMAGE_FILETYPE_ICO;
12331275
}
12341276

12351277
if (php_stream_read(stream, filetype+4, 8) != 8) {
@@ -1347,6 +1389,9 @@ PHP_FUNCTION(getimagesize)
13471389
case IMAGE_FILETYPE_XBM:
13481390
result = php_handle_xbm(stream TSRMLS_CC);
13491391
break;
1392+
case IMAGE_FILETYPE_ICO:
1393+
result = php_handle_ico(stream TSRMLS_CC);
1394+
break;
13501395
default:
13511396
case IMAGE_FILETYPE_UNKNOWN:
13521397
break;

ext/standard/php_image.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ typedef enum
4949
IMAGE_FILETYPE_IFF,
5050
IMAGE_FILETYPE_WBMP,
5151
/* IMAGE_FILETYPE_JPEG2000 is a userland alias for IMAGE_FILETYPE_JPC */
52-
IMAGE_FILETYPE_XBM
52+
IMAGE_FILETYPE_XBM,
53+
IMAGE_FILETYPE_ICO
5354
/* WHEN EXTENDING: PLEASE ALSO REGISTER IN image.c:PHP_MINIT_FUNCTION(imagetypes) */
5455
} image_filetype;
5556
/* }}} */

0 commit comments

Comments
 (0)