@@ -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 };
5353PHPAPI 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 */
10811119PHPAPI 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 ;
0 commit comments