@@ -51,6 +51,7 @@ PHPAPI const char php_sig_jp2[12] = {(char)0x00, (char)0x00, (char)0x00, (char)0
51
51
(char )0x6a , (char )0x50 , (char )0x20 , (char )0x20 ,
52
52
(char )0x0d , (char )0x0a , (char )0x87 , (char )0x0a };
53
53
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 };
54
55
55
56
/* REMEMBER TO ADD MIME-TYPE TO FUNCTION php_image_type_to_mime_type */
56
57
/* PCX must check first 64bytes and byte 0=0x0a and byte2 < 0x06 */
@@ -87,6 +88,7 @@ PHP_MINIT_FUNCTION(imagetypes)
87
88
REGISTER_LONG_CONSTANT ("IMAGETYPE_WBMP" , IMAGE_FILETYPE_WBMP , CONST_CS | CONST_PERSISTENT );
88
89
REGISTER_LONG_CONSTANT ("IMAGETYPE_JPEG2000" ,IMAGE_FILETYPE_JPC , CONST_CS | CONST_PERSISTENT ); /* keep alias */
89
90
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 );
90
92
return SUCCESS ;
91
93
}
92
94
/* }}} */
@@ -1076,6 +1078,42 @@ static struct gfxinfo *php_handle_xbm(php_stream * stream TSRMLS_DC)
1076
1078
}
1077
1079
/* }}} */
1078
1080
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
+
1079
1117
/* {{{ php_image_type_to_mime_type
1080
1118
* Convert internal image_type to mime type */
1081
1119
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)
1107
1145
return "image/jp2" ;
1108
1146
case IMAGE_FILETYPE_XBM :
1109
1147
return "image/xbm" ;
1148
+ case IMAGE_FILETYPE_ICO :
1149
+ return "image/vnd.microsoft.icon" ;
1110
1150
default :
1111
1151
case IMAGE_FILETYPE_UNKNOWN :
1112
1152
return "application/octet-stream" ; /* suppose binary format */
@@ -1171,6 +1211,8 @@ PHP_FUNCTION(image_type_to_extension)
1171
1211
RETURN_STRING (".jb2" + !inc_dot , 1 );
1172
1212
case IMAGE_FILETYPE_XBM :
1173
1213
RETURN_STRING (".xbm" + !inc_dot , 1 );
1214
+ case IMAGE_FILETYPE_ICO :
1215
+ RETURN_STRING (".ico" + !inc_dot , 1 );
1174
1216
}
1175
1217
1176
1218
RETURN_FALSE ;
@@ -1224,12 +1266,12 @@ PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
1224
1266
/* BYTES READ: 4 */
1225
1267
if (!memcmp (filetype , php_sig_tif_ii , 4 )) {
1226
1268
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 )) {
1229
1270
return IMAGE_FILETYPE_TIFF_MM ;
1230
- }
1231
- if (!memcmp (filetype , php_sig_iff , 4 )) {
1271
+ } else if (!memcmp (filetype , php_sig_iff , 4 )) {
1232
1272
return IMAGE_FILETYPE_IFF ;
1273
+ } else if (!memcmp (filetype , php_sig_ico , 3 )) {
1274
+ return IMAGE_FILETYPE_ICO ;
1233
1275
}
1234
1276
1235
1277
if (php_stream_read (stream , filetype + 4 , 8 ) != 8 ) {
@@ -1347,6 +1389,9 @@ PHP_FUNCTION(getimagesize)
1347
1389
case IMAGE_FILETYPE_XBM :
1348
1390
result = php_handle_xbm (stream TSRMLS_CC );
1349
1391
break ;
1392
+ case IMAGE_FILETYPE_ICO :
1393
+ result = php_handle_ico (stream TSRMLS_CC );
1394
+ break ;
1350
1395
default :
1351
1396
case IMAGE_FILETYPE_UNKNOWN :
1352
1397
break ;
0 commit comments