PageRenderTime 57ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/ext/gd/gd.c

http://github.com/infusion/PHP
C | 5051 lines | 3747 code | 762 blank | 542 comment | 583 complexity | d6bbacde544a6a10fdc6711b59623ed9 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-2.1, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 5 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2011 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Rasmus Lerdorf <rasmus@php.net> |
  16. | Stig Bakken <ssb@php.net> |
  17. | Jim Winstead <jimw@php.net> |
  18. +----------------------------------------------------------------------+
  19. */
  20. /* $Id: gd.c 306939 2011-01-01 02:19:59Z felipe $ */
  21. /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center,
  22. Cold Spring Harbor Labs. */
  23. /* Note that there is no code from the gd package in this file */
  24. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif
  27. #include "php.h"
  28. #include "php_ini.h"
  29. #include "ext/standard/head.h"
  30. #include <math.h>
  31. #include "SAPI.h"
  32. #include "php_gd.h"
  33. #include "ext/standard/info.h"
  34. #include "php_open_temporary_file.h"
  35. #if HAVE_SYS_WAIT_H
  36. # include <sys/wait.h>
  37. #endif
  38. #if HAVE_UNISTD_H
  39. # include <unistd.h>
  40. #endif
  41. #ifdef PHP_WIN32
  42. # include <io.h>
  43. # include <fcntl.h>
  44. # include <windows.h>
  45. # include <Winuser.h>
  46. # include <Wingdi.h>
  47. #endif
  48. #if HAVE_LIBGD
  49. #if !HAVE_GD_BUNDLED
  50. # include "libgd/gd_compat.h"
  51. #endif
  52. static int le_gd, le_gd_font;
  53. #if HAVE_LIBT1
  54. #include <t1lib.h>
  55. static int le_ps_font, le_ps_enc;
  56. static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC);
  57. static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC);
  58. #endif
  59. #include <gd.h>
  60. #include <gdfontt.h> /* 1 Tiny font */
  61. #include <gdfonts.h> /* 2 Small font */
  62. #include <gdfontmb.h> /* 3 Medium bold font */
  63. #include <gdfontl.h> /* 4 Large font */
  64. #include <gdfontg.h> /* 5 Giant font */
  65. #ifdef HAVE_GD_WBMP
  66. #include "libgd/wbmp.h"
  67. #endif
  68. #ifdef ENABLE_GD_TTF
  69. # ifdef HAVE_LIBFREETYPE
  70. # include <ft2build.h>
  71. # include FT_FREETYPE_H
  72. # endif
  73. #endif
  74. #ifndef M_PI
  75. #define M_PI 3.14159265358979323846
  76. #endif
  77. #ifdef ENABLE_GD_TTF
  78. static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int, int);
  79. #endif
  80. #if HAVE_LIBGD15
  81. /* it's >= 1.5, i.e. has IOCtx */
  82. #define USE_GD_IOCTX 1
  83. #else
  84. #undef USE_GD_IOCTX
  85. #endif
  86. #ifdef USE_GD_IOCTX
  87. #include "gd_ctx.c"
  88. #else
  89. #define gdImageCreateFromGdCtx NULL
  90. #define gdImageCreateFromGd2Ctx NULL
  91. #define gdImageCreateFromGd2partCtx NULL
  92. #define gdImageCreateFromGifCtx NULL
  93. #define gdImageCreateFromJpegCtx NULL
  94. #define gdImageCreateFromPngCtx NULL
  95. #define gdImageCreateFromWBMPCtx NULL
  96. typedef FILE gdIOCtx;
  97. #define CTX_PUTC(c, fp) fputc(c, fp)
  98. #endif
  99. #ifndef HAVE_GDIMAGECOLORRESOLVE
  100. extern int gdImageColorResolve(gdImagePtr, int, int, int);
  101. #endif
  102. #if HAVE_COLORCLOSESTHWB
  103. int gdImageColorClosestHWB(gdImagePtr im, int r, int g, int b);
  104. #endif
  105. #ifndef HAVE_GD_DYNAMIC_CTX_EX
  106. #define gdNewDynamicCtxEx(len, data, val) gdNewDynamicCtx(len, data)
  107. #endif
  108. /* Section Filters Declarations */
  109. /* IMPORTANT NOTE FOR NEW FILTER
  110. * Do not forget to update:
  111. * IMAGE_FILTER_MAX: define the last filter index
  112. * IMAGE_FILTER_MAX_ARGS: define the biggest amout of arguments
  113. * image_filter array in PHP_FUNCTION(imagefilter)
  114. * */
  115. #define IMAGE_FILTER_NEGATE 0
  116. #define IMAGE_FILTER_GRAYSCALE 1
  117. #define IMAGE_FILTER_BRIGHTNESS 2
  118. #define IMAGE_FILTER_CONTRAST 3
  119. #define IMAGE_FILTER_COLORIZE 4
  120. #define IMAGE_FILTER_EDGEDETECT 5
  121. #define IMAGE_FILTER_EMBOSS 6
  122. #define IMAGE_FILTER_GAUSSIAN_BLUR 7
  123. #define IMAGE_FILTER_SELECTIVE_BLUR 8
  124. #define IMAGE_FILTER_MEAN_REMOVAL 9
  125. #define IMAGE_FILTER_SMOOTH 10
  126. #define IMAGE_FILTER_PIXELATE 11
  127. #define IMAGE_FILTER_MAX 11
  128. #define IMAGE_FILTER_MAX_ARGS 6
  129. static void php_image_filter_negate(INTERNAL_FUNCTION_PARAMETERS);
  130. static void php_image_filter_grayscale(INTERNAL_FUNCTION_PARAMETERS);
  131. static void php_image_filter_brightness(INTERNAL_FUNCTION_PARAMETERS);
  132. static void php_image_filter_contrast(INTERNAL_FUNCTION_PARAMETERS);
  133. static void php_image_filter_colorize(INTERNAL_FUNCTION_PARAMETERS);
  134. static void php_image_filter_edgedetect(INTERNAL_FUNCTION_PARAMETERS);
  135. static void php_image_filter_emboss(INTERNAL_FUNCTION_PARAMETERS);
  136. static void php_image_filter_gaussian_blur(INTERNAL_FUNCTION_PARAMETERS);
  137. static void php_image_filter_selective_blur(INTERNAL_FUNCTION_PARAMETERS);
  138. static void php_image_filter_mean_removal(INTERNAL_FUNCTION_PARAMETERS);
  139. static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS);
  140. static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS);
  141. /* End Section filters declarations */
  142. static gdImagePtr _php_image_create_from_string (zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC);
  143. static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)());
  144. static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)());
  145. static int _php_image_type(char data[8]);
  146. static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type);
  147. static void _php_image_bw_convert(gdImagePtr im_org, gdIOCtx *out, int threshold);
  148. /* {{{ arginfo */
  149. ZEND_BEGIN_ARG_INFO(arginfo_gd_info, 0)
  150. ZEND_END_ARG_INFO()
  151. ZEND_BEGIN_ARG_INFO(arginfo_imageloadfont, 0)
  152. ZEND_ARG_INFO(0, filename)
  153. ZEND_END_ARG_INFO()
  154. ZEND_BEGIN_ARG_INFO(arginfo_imagesetstyle, 0)
  155. ZEND_ARG_INFO(0, im)
  156. ZEND_ARG_INFO(0, styles) /* ARRAY_INFO(0, styles, 0) */
  157. ZEND_END_ARG_INFO()
  158. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatetruecolor, 0)
  159. ZEND_ARG_INFO(0, x_size)
  160. ZEND_ARG_INFO(0, y_size)
  161. ZEND_END_ARG_INFO()
  162. ZEND_BEGIN_ARG_INFO(arginfo_imageistruecolor, 0)
  163. ZEND_ARG_INFO(0, im)
  164. ZEND_END_ARG_INFO()
  165. ZEND_BEGIN_ARG_INFO(arginfo_imagetruecolortopalette, 0)
  166. ZEND_ARG_INFO(0, im)
  167. ZEND_ARG_INFO(0, ditherFlag)
  168. ZEND_ARG_INFO(0, colorsWanted)
  169. ZEND_END_ARG_INFO()
  170. ZEND_BEGIN_ARG_INFO(arginfo_imagecolormatch, 0)
  171. ZEND_ARG_INFO(0, im1)
  172. ZEND_ARG_INFO(0, im2)
  173. ZEND_END_ARG_INFO()
  174. ZEND_BEGIN_ARG_INFO(arginfo_imagesetthickness, 0)
  175. ZEND_ARG_INFO(0, im)
  176. ZEND_ARG_INFO(0, thickness)
  177. ZEND_END_ARG_INFO()
  178. ZEND_BEGIN_ARG_INFO(arginfo_imagefilledellipse, 0)
  179. ZEND_ARG_INFO(0, im)
  180. ZEND_ARG_INFO(0, cx)
  181. ZEND_ARG_INFO(0, cy)
  182. ZEND_ARG_INFO(0, w)
  183. ZEND_ARG_INFO(0, h)
  184. ZEND_ARG_INFO(0, color)
  185. ZEND_END_ARG_INFO()
  186. ZEND_BEGIN_ARG_INFO(arginfo_imagefilledarc, 0)
  187. ZEND_ARG_INFO(0, im)
  188. ZEND_ARG_INFO(0, cx)
  189. ZEND_ARG_INFO(0, cy)
  190. ZEND_ARG_INFO(0, w)
  191. ZEND_ARG_INFO(0, h)
  192. ZEND_ARG_INFO(0, s)
  193. ZEND_ARG_INFO(0, e)
  194. ZEND_ARG_INFO(0, col)
  195. ZEND_ARG_INFO(0, style)
  196. ZEND_END_ARG_INFO()
  197. ZEND_BEGIN_ARG_INFO(arginfo_imagealphablending, 0)
  198. ZEND_ARG_INFO(0, im)
  199. ZEND_ARG_INFO(0, blend)
  200. ZEND_END_ARG_INFO()
  201. ZEND_BEGIN_ARG_INFO(arginfo_imagesavealpha, 0)
  202. ZEND_ARG_INFO(0, im)
  203. ZEND_ARG_INFO(0, save)
  204. ZEND_END_ARG_INFO()
  205. #if HAVE_GD_BUNDLED
  206. ZEND_BEGIN_ARG_INFO(arginfo_imagelayereffect, 0)
  207. ZEND_ARG_INFO(0, im)
  208. ZEND_ARG_INFO(0, effect)
  209. ZEND_END_ARG_INFO()
  210. #endif
  211. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorallocatealpha, 0)
  212. ZEND_ARG_INFO(0, im)
  213. ZEND_ARG_INFO(0, red)
  214. ZEND_ARG_INFO(0, green)
  215. ZEND_ARG_INFO(0, blue)
  216. ZEND_ARG_INFO(0, alpha)
  217. ZEND_END_ARG_INFO()
  218. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorresolvealpha, 0)
  219. ZEND_ARG_INFO(0, im)
  220. ZEND_ARG_INFO(0, red)
  221. ZEND_ARG_INFO(0, green)
  222. ZEND_ARG_INFO(0, blue)
  223. ZEND_ARG_INFO(0, alpha)
  224. ZEND_END_ARG_INFO()
  225. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosestalpha, 0)
  226. ZEND_ARG_INFO(0, im)
  227. ZEND_ARG_INFO(0, red)
  228. ZEND_ARG_INFO(0, green)
  229. ZEND_ARG_INFO(0, blue)
  230. ZEND_ARG_INFO(0, alpha)
  231. ZEND_END_ARG_INFO()
  232. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorexactalpha, 0)
  233. ZEND_ARG_INFO(0, im)
  234. ZEND_ARG_INFO(0, red)
  235. ZEND_ARG_INFO(0, green)
  236. ZEND_ARG_INFO(0, blue)
  237. ZEND_ARG_INFO(0, alpha)
  238. ZEND_END_ARG_INFO()
  239. ZEND_BEGIN_ARG_INFO(arginfo_imagecopyresampled, 0)
  240. ZEND_ARG_INFO(0, dst_im)
  241. ZEND_ARG_INFO(0, src_im)
  242. ZEND_ARG_INFO(0, dst_x)
  243. ZEND_ARG_INFO(0, dst_y)
  244. ZEND_ARG_INFO(0, src_x)
  245. ZEND_ARG_INFO(0, src_y)
  246. ZEND_ARG_INFO(0, dst_w)
  247. ZEND_ARG_INFO(0, dst_h)
  248. ZEND_ARG_INFO(0, src_w)
  249. ZEND_ARG_INFO(0, src_h)
  250. ZEND_END_ARG_INFO()
  251. #ifdef PHP_WIN32
  252. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegrabwindow, 0, 0, 1)
  253. ZEND_ARG_INFO(0, handle)
  254. ZEND_ARG_INFO(0, client_area)
  255. ZEND_END_ARG_INFO()
  256. ZEND_BEGIN_ARG_INFO(arginfo_imagegrabscreen, 0)
  257. ZEND_END_ARG_INFO()
  258. #endif
  259. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagerotate, 0, 0, 3)
  260. ZEND_ARG_INFO(0, im)
  261. ZEND_ARG_INFO(0, angle)
  262. ZEND_ARG_INFO(0, bgdcolor)
  263. ZEND_ARG_INFO(0, ignoretransparent)
  264. ZEND_END_ARG_INFO()
  265. #if HAVE_GD_IMAGESETTILE
  266. ZEND_BEGIN_ARG_INFO(arginfo_imagesettile, 0)
  267. ZEND_ARG_INFO(0, im)
  268. ZEND_ARG_INFO(0, tile)
  269. ZEND_END_ARG_INFO()
  270. #endif
  271. #if HAVE_GD_IMAGESETBRUSH
  272. ZEND_BEGIN_ARG_INFO(arginfo_imagesetbrush, 0)
  273. ZEND_ARG_INFO(0, im)
  274. ZEND_ARG_INFO(0, brush)
  275. ZEND_END_ARG_INFO()
  276. #endif
  277. ZEND_BEGIN_ARG_INFO(arginfo_imagecreate, 0)
  278. ZEND_ARG_INFO(0, x_size)
  279. ZEND_ARG_INFO(0, y_size)
  280. ZEND_END_ARG_INFO()
  281. ZEND_BEGIN_ARG_INFO(arginfo_imagetypes, 0)
  282. ZEND_END_ARG_INFO()
  283. #if HAVE_LIBGD15
  284. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromstring, 0)
  285. ZEND_ARG_INFO(0, image)
  286. ZEND_END_ARG_INFO()
  287. #endif
  288. #ifdef HAVE_GD_GIF_READ
  289. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgif, 0)
  290. ZEND_ARG_INFO(0, filename)
  291. ZEND_END_ARG_INFO()
  292. #endif
  293. #ifdef HAVE_GD_JPG
  294. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromjpeg, 0)
  295. ZEND_ARG_INFO(0, filename)
  296. ZEND_END_ARG_INFO()
  297. #endif
  298. #ifdef HAVE_GD_PNG
  299. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefrompng, 0)
  300. ZEND_ARG_INFO(0, filename)
  301. ZEND_END_ARG_INFO()
  302. #endif
  303. #ifdef HAVE_GD_XBM
  304. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromxbm, 0)
  305. ZEND_ARG_INFO(0, filename)
  306. ZEND_END_ARG_INFO()
  307. #endif
  308. #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
  309. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromxpm, 0)
  310. ZEND_ARG_INFO(0, filename)
  311. ZEND_END_ARG_INFO()
  312. #endif
  313. #ifdef HAVE_GD_WBMP
  314. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromwbmp, 0)
  315. ZEND_ARG_INFO(0, filename)
  316. ZEND_END_ARG_INFO()
  317. #endif
  318. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd, 0)
  319. ZEND_ARG_INFO(0, filename)
  320. ZEND_END_ARG_INFO()
  321. #ifdef HAVE_GD_GD2
  322. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd2, 0)
  323. ZEND_ARG_INFO(0, filename)
  324. ZEND_END_ARG_INFO()
  325. ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd2part, 0)
  326. ZEND_ARG_INFO(0, filename)
  327. ZEND_ARG_INFO(0, srcX)
  328. ZEND_ARG_INFO(0, srcY)
  329. ZEND_ARG_INFO(0, width)
  330. ZEND_ARG_INFO(0, height)
  331. ZEND_END_ARG_INFO()
  332. #endif
  333. #if HAVE_GD_BUNDLED
  334. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagexbm, 0, 0, 2)
  335. ZEND_ARG_INFO(0, im)
  336. ZEND_ARG_INFO(0, filename)
  337. ZEND_ARG_INFO(0, foreground)
  338. ZEND_END_ARG_INFO()
  339. #endif
  340. #ifdef HAVE_GD_GIF_CREATE
  341. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegif, 0, 0, 1)
  342. ZEND_ARG_INFO(0, im)
  343. ZEND_ARG_INFO(0, filename)
  344. ZEND_END_ARG_INFO()
  345. #endif
  346. #ifdef HAVE_GD_PNG
  347. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepng, 0, 0, 1)
  348. ZEND_ARG_INFO(0, im)
  349. ZEND_ARG_INFO(0, filename)
  350. ZEND_END_ARG_INFO()
  351. #endif
  352. #ifdef HAVE_GD_JPG
  353. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagejpeg, 0, 0, 1)
  354. ZEND_ARG_INFO(0, im)
  355. ZEND_ARG_INFO(0, filename)
  356. ZEND_ARG_INFO(0, quality)
  357. ZEND_END_ARG_INFO()
  358. #endif
  359. #ifdef HAVE_GD_WBMP
  360. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagewbmp, 0, 0, 1)
  361. ZEND_ARG_INFO(0, im)
  362. ZEND_ARG_INFO(0, filename)
  363. ZEND_ARG_INFO(0, foreground)
  364. ZEND_END_ARG_INFO()
  365. #endif
  366. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegd, 0, 0, 1)
  367. ZEND_ARG_INFO(0, im)
  368. ZEND_ARG_INFO(0, filename)
  369. ZEND_END_ARG_INFO()
  370. #ifdef HAVE_GD_GD2
  371. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegd2, 0, 0, 1)
  372. ZEND_ARG_INFO(0, im)
  373. ZEND_ARG_INFO(0, filename)
  374. ZEND_ARG_INFO(0, chunk_size)
  375. ZEND_ARG_INFO(0, type)
  376. ZEND_END_ARG_INFO()
  377. #endif
  378. ZEND_BEGIN_ARG_INFO(arginfo_imagedestroy, 0)
  379. ZEND_ARG_INFO(0, im)
  380. ZEND_END_ARG_INFO()
  381. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorallocate, 0)
  382. ZEND_ARG_INFO(0, im)
  383. ZEND_ARG_INFO(0, red)
  384. ZEND_ARG_INFO(0, green)
  385. ZEND_ARG_INFO(0, blue)
  386. ZEND_END_ARG_INFO()
  387. #if HAVE_LIBGD15
  388. ZEND_BEGIN_ARG_INFO(arginfo_imagepalettecopy, 0)
  389. ZEND_ARG_INFO(0, dst)
  390. ZEND_ARG_INFO(0, src)
  391. ZEND_END_ARG_INFO()
  392. #endif
  393. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorat, 0)
  394. ZEND_ARG_INFO(0, im)
  395. ZEND_ARG_INFO(0, x)
  396. ZEND_ARG_INFO(0, y)
  397. ZEND_END_ARG_INFO()
  398. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosest, 0)
  399. ZEND_ARG_INFO(0, im)
  400. ZEND_ARG_INFO(0, red)
  401. ZEND_ARG_INFO(0, green)
  402. ZEND_ARG_INFO(0, blue)
  403. ZEND_END_ARG_INFO()
  404. #if HAVE_COLORCLOSESTHWB
  405. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosesthwb, 0)
  406. ZEND_ARG_INFO(0, im)
  407. ZEND_ARG_INFO(0, red)
  408. ZEND_ARG_INFO(0, green)
  409. ZEND_ARG_INFO(0, blue)
  410. ZEND_END_ARG_INFO()
  411. #endif
  412. ZEND_BEGIN_ARG_INFO(arginfo_imagecolordeallocate, 0)
  413. ZEND_ARG_INFO(0, im)
  414. ZEND_ARG_INFO(0, index)
  415. ZEND_END_ARG_INFO()
  416. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorresolve, 0)
  417. ZEND_ARG_INFO(0, im)
  418. ZEND_ARG_INFO(0, red)
  419. ZEND_ARG_INFO(0, green)
  420. ZEND_ARG_INFO(0, blue)
  421. ZEND_END_ARG_INFO()
  422. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorexact, 0)
  423. ZEND_ARG_INFO(0, im)
  424. ZEND_ARG_INFO(0, red)
  425. ZEND_ARG_INFO(0, green)
  426. ZEND_ARG_INFO(0, blue)
  427. ZEND_END_ARG_INFO()
  428. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorset, 0)
  429. ZEND_ARG_INFO(0, im)
  430. ZEND_ARG_INFO(0, color)
  431. ZEND_ARG_INFO(0, red)
  432. ZEND_ARG_INFO(0, green)
  433. ZEND_ARG_INFO(0, blue)
  434. ZEND_END_ARG_INFO()
  435. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorsforindex, 0)
  436. ZEND_ARG_INFO(0, im)
  437. ZEND_ARG_INFO(0, index)
  438. ZEND_END_ARG_INFO()
  439. ZEND_BEGIN_ARG_INFO(arginfo_imagegammacorrect, 0)
  440. ZEND_ARG_INFO(0, im)
  441. ZEND_ARG_INFO(0, inputgamma)
  442. ZEND_ARG_INFO(0, outputgamma)
  443. ZEND_END_ARG_INFO()
  444. ZEND_BEGIN_ARG_INFO(arginfo_imagesetpixel, 0)
  445. ZEND_ARG_INFO(0, im)
  446. ZEND_ARG_INFO(0, x)
  447. ZEND_ARG_INFO(0, y)
  448. ZEND_ARG_INFO(0, col)
  449. ZEND_END_ARG_INFO()
  450. ZEND_BEGIN_ARG_INFO(arginfo_imageline, 0)
  451. ZEND_ARG_INFO(0, im)
  452. ZEND_ARG_INFO(0, x1)
  453. ZEND_ARG_INFO(0, y1)
  454. ZEND_ARG_INFO(0, x2)
  455. ZEND_ARG_INFO(0, y2)
  456. ZEND_ARG_INFO(0, col)
  457. ZEND_END_ARG_INFO()
  458. ZEND_BEGIN_ARG_INFO(arginfo_imagedashedline, 0)
  459. ZEND_ARG_INFO(0, im)
  460. ZEND_ARG_INFO(0, x1)
  461. ZEND_ARG_INFO(0, y1)
  462. ZEND_ARG_INFO(0, x2)
  463. ZEND_ARG_INFO(0, y2)
  464. ZEND_ARG_INFO(0, col)
  465. ZEND_END_ARG_INFO()
  466. ZEND_BEGIN_ARG_INFO(arginfo_imagerectangle, 0)
  467. ZEND_ARG_INFO(0, im)
  468. ZEND_ARG_INFO(0, x1)
  469. ZEND_ARG_INFO(0, y1)
  470. ZEND_ARG_INFO(0, x2)
  471. ZEND_ARG_INFO(0, y2)
  472. ZEND_ARG_INFO(0, col)
  473. ZEND_END_ARG_INFO()
  474. ZEND_BEGIN_ARG_INFO(arginfo_imagefilledrectangle, 0)
  475. ZEND_ARG_INFO(0, im)
  476. ZEND_ARG_INFO(0, x1)
  477. ZEND_ARG_INFO(0, y1)
  478. ZEND_ARG_INFO(0, x2)
  479. ZEND_ARG_INFO(0, y2)
  480. ZEND_ARG_INFO(0, col)
  481. ZEND_END_ARG_INFO()
  482. ZEND_BEGIN_ARG_INFO(arginfo_imagearc, 0)
  483. ZEND_ARG_INFO(0, im)
  484. ZEND_ARG_INFO(0, cx)
  485. ZEND_ARG_INFO(0, cy)
  486. ZEND_ARG_INFO(0, w)
  487. ZEND_ARG_INFO(0, h)
  488. ZEND_ARG_INFO(0, s)
  489. ZEND_ARG_INFO(0, e)
  490. ZEND_ARG_INFO(0, col)
  491. ZEND_END_ARG_INFO()
  492. ZEND_BEGIN_ARG_INFO(arginfo_imageellipse, 0)
  493. ZEND_ARG_INFO(0, im)
  494. ZEND_ARG_INFO(0, cx)
  495. ZEND_ARG_INFO(0, cy)
  496. ZEND_ARG_INFO(0, w)
  497. ZEND_ARG_INFO(0, h)
  498. ZEND_ARG_INFO(0, color)
  499. ZEND_END_ARG_INFO()
  500. ZEND_BEGIN_ARG_INFO(arginfo_imagefilltoborder, 0)
  501. ZEND_ARG_INFO(0, im)
  502. ZEND_ARG_INFO(0, x)
  503. ZEND_ARG_INFO(0, y)
  504. ZEND_ARG_INFO(0, border)
  505. ZEND_ARG_INFO(0, col)
  506. ZEND_END_ARG_INFO()
  507. ZEND_BEGIN_ARG_INFO(arginfo_imagefill, 0)
  508. ZEND_ARG_INFO(0, im)
  509. ZEND_ARG_INFO(0, x)
  510. ZEND_ARG_INFO(0, y)
  511. ZEND_ARG_INFO(0, col)
  512. ZEND_END_ARG_INFO()
  513. ZEND_BEGIN_ARG_INFO(arginfo_imagecolorstotal, 0)
  514. ZEND_ARG_INFO(0, im)
  515. ZEND_END_ARG_INFO()
  516. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolortransparent, 0, 0, 1)
  517. ZEND_ARG_INFO(0, im)
  518. ZEND_ARG_INFO(0, col)
  519. ZEND_END_ARG_INFO()
  520. ZEND_BEGIN_ARG_INFO_EX(arginfo_imageinterlace, 0, 0, 1)
  521. ZEND_ARG_INFO(0, im)
  522. ZEND_ARG_INFO(0, interlace)
  523. ZEND_END_ARG_INFO()
  524. ZEND_BEGIN_ARG_INFO(arginfo_imagepolygon, 0)
  525. ZEND_ARG_INFO(0, im)
  526. ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
  527. ZEND_ARG_INFO(0, num_pos)
  528. ZEND_ARG_INFO(0, col)
  529. ZEND_END_ARG_INFO()
  530. ZEND_BEGIN_ARG_INFO(arginfo_imagefilledpolygon, 0)
  531. ZEND_ARG_INFO(0, im)
  532. ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
  533. ZEND_ARG_INFO(0, num_pos)
  534. ZEND_ARG_INFO(0, col)
  535. ZEND_END_ARG_INFO()
  536. ZEND_BEGIN_ARG_INFO(arginfo_imagefontwidth, 0)
  537. ZEND_ARG_INFO(0, font)
  538. ZEND_END_ARG_INFO()
  539. ZEND_BEGIN_ARG_INFO(arginfo_imagefontheight, 0)
  540. ZEND_ARG_INFO(0, font)
  541. ZEND_END_ARG_INFO()
  542. ZEND_BEGIN_ARG_INFO(arginfo_imagechar, 0)
  543. ZEND_ARG_INFO(0, im)
  544. ZEND_ARG_INFO(0, font)
  545. ZEND_ARG_INFO(0, x)
  546. ZEND_ARG_INFO(0, y)
  547. ZEND_ARG_INFO(0, c)
  548. ZEND_ARG_INFO(0, col)
  549. ZEND_END_ARG_INFO()
  550. ZEND_BEGIN_ARG_INFO(arginfo_imagecharup, 0)
  551. ZEND_ARG_INFO(0, im)
  552. ZEND_ARG_INFO(0, font)
  553. ZEND_ARG_INFO(0, x)
  554. ZEND_ARG_INFO(0, y)
  555. ZEND_ARG_INFO(0, c)
  556. ZEND_ARG_INFO(0, col)
  557. ZEND_END_ARG_INFO()
  558. ZEND_BEGIN_ARG_INFO(arginfo_imagestring, 0)
  559. ZEND_ARG_INFO(0, im)
  560. ZEND_ARG_INFO(0, font)
  561. ZEND_ARG_INFO(0, x)
  562. ZEND_ARG_INFO(0, y)
  563. ZEND_ARG_INFO(0, str)
  564. ZEND_ARG_INFO(0, col)
  565. ZEND_END_ARG_INFO()
  566. ZEND_BEGIN_ARG_INFO(arginfo_imagestringup, 0)
  567. ZEND_ARG_INFO(0, im)
  568. ZEND_ARG_INFO(0, font)
  569. ZEND_ARG_INFO(0, x)
  570. ZEND_ARG_INFO(0, y)
  571. ZEND_ARG_INFO(0, str)
  572. ZEND_ARG_INFO(0, col)
  573. ZEND_END_ARG_INFO()
  574. ZEND_BEGIN_ARG_INFO(arginfo_imagecopy, 0)
  575. ZEND_ARG_INFO(0, dst_im)
  576. ZEND_ARG_INFO(0, src_im)
  577. ZEND_ARG_INFO(0, dst_x)
  578. ZEND_ARG_INFO(0, dst_y)
  579. ZEND_ARG_INFO(0, src_x)
  580. ZEND_ARG_INFO(0, src_y)
  581. ZEND_ARG_INFO(0, src_w)
  582. ZEND_ARG_INFO(0, src_h)
  583. ZEND_END_ARG_INFO()
  584. #if HAVE_LIBGD15
  585. ZEND_BEGIN_ARG_INFO(arginfo_imagecopymerge, 0)
  586. ZEND_ARG_INFO(0, src_im)
  587. ZEND_ARG_INFO(0, dst_im)
  588. ZEND_ARG_INFO(0, dst_x)
  589. ZEND_ARG_INFO(0, dst_y)
  590. ZEND_ARG_INFO(0, src_x)
  591. ZEND_ARG_INFO(0, src_y)
  592. ZEND_ARG_INFO(0, src_w)
  593. ZEND_ARG_INFO(0, src_h)
  594. ZEND_ARG_INFO(0, pct)
  595. ZEND_END_ARG_INFO()
  596. ZEND_BEGIN_ARG_INFO(arginfo_imagecopymergegray, 0)
  597. ZEND_ARG_INFO(0, src_im)
  598. ZEND_ARG_INFO(0, dst_im)
  599. ZEND_ARG_INFO(0, dst_x)
  600. ZEND_ARG_INFO(0, dst_y)
  601. ZEND_ARG_INFO(0, src_x)
  602. ZEND_ARG_INFO(0, src_y)
  603. ZEND_ARG_INFO(0, src_w)
  604. ZEND_ARG_INFO(0, src_h)
  605. ZEND_ARG_INFO(0, pct)
  606. ZEND_END_ARG_INFO()
  607. #endif
  608. ZEND_BEGIN_ARG_INFO(arginfo_imagecopyresized, 0)
  609. ZEND_ARG_INFO(0, dst_im)
  610. ZEND_ARG_INFO(0, src_im)
  611. ZEND_ARG_INFO(0, dst_x)
  612. ZEND_ARG_INFO(0, dst_y)
  613. ZEND_ARG_INFO(0, src_x)
  614. ZEND_ARG_INFO(0, src_y)
  615. ZEND_ARG_INFO(0, dst_w)
  616. ZEND_ARG_INFO(0, dst_h)
  617. ZEND_ARG_INFO(0, src_w)
  618. ZEND_ARG_INFO(0, src_h)
  619. ZEND_END_ARG_INFO()
  620. ZEND_BEGIN_ARG_INFO(arginfo_imagesx, 0)
  621. ZEND_ARG_INFO(0, im)
  622. ZEND_END_ARG_INFO()
  623. ZEND_BEGIN_ARG_INFO(arginfo_imagesy, 0)
  624. ZEND_ARG_INFO(0, im)
  625. ZEND_END_ARG_INFO()
  626. #ifdef ENABLE_GD_TTF
  627. #if HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
  628. ZEND_BEGIN_ARG_INFO_EX(arginfo_imageftbbox, 0, 0, 4)
  629. ZEND_ARG_INFO(0, size)
  630. ZEND_ARG_INFO(0, angle)
  631. ZEND_ARG_INFO(0, font_file)
  632. ZEND_ARG_INFO(0, text)
  633. ZEND_ARG_INFO(0, extrainfo) /* ARRAY_INFO(0, extrainfo, 0) */
  634. ZEND_END_ARG_INFO()
  635. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagefttext, 0, 0, 8)
  636. ZEND_ARG_INFO(0, im)
  637. ZEND_ARG_INFO(0, size)
  638. ZEND_ARG_INFO(0, angle)
  639. ZEND_ARG_INFO(0, x)
  640. ZEND_ARG_INFO(0, y)
  641. ZEND_ARG_INFO(0, col)
  642. ZEND_ARG_INFO(0, font_file)
  643. ZEND_ARG_INFO(0, text)
  644. ZEND_ARG_INFO(0, extrainfo) /* ARRAY_INFO(0, extrainfo, 0) */
  645. ZEND_END_ARG_INFO()
  646. #endif
  647. ZEND_BEGIN_ARG_INFO(arginfo_imagettfbbox, 0)
  648. ZEND_ARG_INFO(0, size)
  649. ZEND_ARG_INFO(0, angle)
  650. ZEND_ARG_INFO(0, font_file)
  651. ZEND_ARG_INFO(0, text)
  652. ZEND_END_ARG_INFO()
  653. ZEND_BEGIN_ARG_INFO(arginfo_imagettftext, 0)
  654. ZEND_ARG_INFO(0, im)
  655. ZEND_ARG_INFO(0, size)
  656. ZEND_ARG_INFO(0, angle)
  657. ZEND_ARG_INFO(0, x)
  658. ZEND_ARG_INFO(0, y)
  659. ZEND_ARG_INFO(0, col)
  660. ZEND_ARG_INFO(0, font_file)
  661. ZEND_ARG_INFO(0, text)
  662. ZEND_END_ARG_INFO()
  663. #endif
  664. #ifdef HAVE_LIBT1
  665. ZEND_BEGIN_ARG_INFO(arginfo_imagepsloadfont, 0)
  666. ZEND_ARG_INFO(0, pathname)
  667. ZEND_END_ARG_INFO()
  668. /*
  669. ZEND_BEGIN_ARG_INFO(arginfo_imagepscopyfont, 0)
  670. ZEND_ARG_INFO(0, font_index)
  671. ZEND_END_ARG_INFO()
  672. */
  673. ZEND_BEGIN_ARG_INFO(arginfo_imagepsfreefont, 0)
  674. ZEND_ARG_INFO(0, font_index)
  675. ZEND_END_ARG_INFO()
  676. ZEND_BEGIN_ARG_INFO(arginfo_imagepsencodefont, 0)
  677. ZEND_ARG_INFO(0, font_index)
  678. ZEND_ARG_INFO(0, filename)
  679. ZEND_END_ARG_INFO()
  680. ZEND_BEGIN_ARG_INFO(arginfo_imagepsextendfont, 0)
  681. ZEND_ARG_INFO(0, font_index)
  682. ZEND_ARG_INFO(0, extend)
  683. ZEND_END_ARG_INFO()
  684. ZEND_BEGIN_ARG_INFO(arginfo_imagepsslantfont, 0)
  685. ZEND_ARG_INFO(0, font_index)
  686. ZEND_ARG_INFO(0, slant)
  687. ZEND_END_ARG_INFO()
  688. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepstext, 0, 0, 8)
  689. ZEND_ARG_INFO(0, im)
  690. ZEND_ARG_INFO(0, text)
  691. ZEND_ARG_INFO(0, font)
  692. ZEND_ARG_INFO(0, size)
  693. ZEND_ARG_INFO(0, foreground)
  694. ZEND_ARG_INFO(0, background)
  695. ZEND_ARG_INFO(0, xcoord)
  696. ZEND_ARG_INFO(0, ycoord)
  697. ZEND_ARG_INFO(0, space)
  698. ZEND_ARG_INFO(0, tightness)
  699. ZEND_ARG_INFO(0, angle)
  700. ZEND_ARG_INFO(0, antialias)
  701. ZEND_END_ARG_INFO()
  702. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepsbbox, 0, 0, 3)
  703. ZEND_ARG_INFO(0, text)
  704. ZEND_ARG_INFO(0, font)
  705. ZEND_ARG_INFO(0, size)
  706. ZEND_ARG_INFO(0, space)
  707. ZEND_ARG_INFO(0, tightness)
  708. ZEND_ARG_INFO(0, angle)
  709. ZEND_END_ARG_INFO()
  710. #endif
  711. #ifdef HAVE_GD_WBMP
  712. ZEND_BEGIN_ARG_INFO_EX(arginfo_image2wbmp, 0, 0, 1)
  713. ZEND_ARG_INFO(0, im)
  714. ZEND_ARG_INFO(0, filename)
  715. ZEND_ARG_INFO(0, threshold)
  716. ZEND_END_ARG_INFO()
  717. #endif
  718. #if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
  719. ZEND_BEGIN_ARG_INFO(arginfo_jpeg2wbmp, 0)
  720. ZEND_ARG_INFO(0, f_org)
  721. ZEND_ARG_INFO(0, f_dest)
  722. ZEND_ARG_INFO(0, d_height)
  723. ZEND_ARG_INFO(0, d_width)
  724. ZEND_ARG_INFO(0, d_threshold)
  725. ZEND_END_ARG_INFO()
  726. #endif
  727. #if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
  728. ZEND_BEGIN_ARG_INFO(arginfo_png2wbmp, 0)
  729. ZEND_ARG_INFO(0, f_org)
  730. ZEND_ARG_INFO(0, f_dest)
  731. ZEND_ARG_INFO(0, d_height)
  732. ZEND_ARG_INFO(0, d_width)
  733. ZEND_ARG_INFO(0, d_threshold)
  734. ZEND_END_ARG_INFO()
  735. #endif
  736. ZEND_BEGIN_ARG_INFO_EX(arginfo_imagefilter, 0, 0, 2)
  737. ZEND_ARG_INFO(0, im)
  738. ZEND_ARG_INFO(0, filtertype)
  739. ZEND_ARG_INFO(0, arg1)
  740. ZEND_ARG_INFO(0, arg2)
  741. ZEND_ARG_INFO(0, arg3)
  742. ZEND_ARG_INFO(0, arg4)
  743. ZEND_END_ARG_INFO()
  744. ZEND_BEGIN_ARG_INFO(arginfo_imageconvolution, 0)
  745. ZEND_ARG_INFO(0, im)
  746. ZEND_ARG_INFO(0, matrix3x3) /* ARRAY_INFO(0, matrix3x3, 0) */
  747. ZEND_ARG_INFO(0, div)
  748. ZEND_ARG_INFO(0, offset)
  749. ZEND_END_ARG_INFO()
  750. #ifdef HAVE_GD_BUNDLED
  751. ZEND_BEGIN_ARG_INFO(arginfo_imageantialias, 0)
  752. ZEND_ARG_INFO(0, im)
  753. ZEND_ARG_INFO(0, on)
  754. ZEND_END_ARG_INFO()
  755. #endif
  756. /* }}} */
  757. /* {{{ gd_functions[]
  758. */
  759. const zend_function_entry gd_functions[] = {
  760. PHP_FE(gd_info, arginfo_gd_info)
  761. PHP_FE(imagearc, arginfo_imagearc)
  762. PHP_FE(imageellipse, arginfo_imageellipse)
  763. PHP_FE(imagechar, arginfo_imagechar)
  764. PHP_FE(imagecharup, arginfo_imagecharup)
  765. PHP_FE(imagecolorat, arginfo_imagecolorat)
  766. PHP_FE(imagecolorallocate, arginfo_imagecolorallocate)
  767. #if HAVE_LIBGD15
  768. PHP_FE(imagepalettecopy, arginfo_imagepalettecopy)
  769. PHP_FE(imagecreatefromstring, arginfo_imagecreatefromstring)
  770. #endif
  771. PHP_FE(imagecolorclosest, arginfo_imagecolorclosest)
  772. #if HAVE_COLORCLOSESTHWB
  773. PHP_FE(imagecolorclosesthwb, arginfo_imagecolorclosesthwb)
  774. #endif
  775. PHP_FE(imagecolordeallocate, arginfo_imagecolordeallocate)
  776. PHP_FE(imagecolorresolve, arginfo_imagecolorresolve)
  777. PHP_FE(imagecolorexact, arginfo_imagecolorexact)
  778. PHP_FE(imagecolorset, arginfo_imagecolorset)
  779. PHP_FE(imagecolortransparent, arginfo_imagecolortransparent)
  780. PHP_FE(imagecolorstotal, arginfo_imagecolorstotal)
  781. PHP_FE(imagecolorsforindex, arginfo_imagecolorsforindex)
  782. PHP_FE(imagecopy, arginfo_imagecopy)
  783. #if HAVE_LIBGD15
  784. PHP_FE(imagecopymerge, arginfo_imagecopymerge)
  785. PHP_FE(imagecopymergegray, arginfo_imagecopymergegray)
  786. #endif
  787. PHP_FE(imagecopyresized, arginfo_imagecopyresized)
  788. PHP_FE(imagecreate, arginfo_imagecreate)
  789. PHP_FE(imagecreatetruecolor, arginfo_imagecreatetruecolor)
  790. PHP_FE(imageistruecolor, arginfo_imageistruecolor)
  791. PHP_FE(imagetruecolortopalette, arginfo_imagetruecolortopalette)
  792. PHP_FE(imagesetthickness, arginfo_imagesetthickness)
  793. PHP_FE(imagefilledarc, arginfo_imagefilledarc)
  794. PHP_FE(imagefilledellipse, arginfo_imagefilledellipse)
  795. PHP_FE(imagealphablending, arginfo_imagealphablending)
  796. PHP_FE(imagesavealpha, arginfo_imagesavealpha)
  797. PHP_FE(imagecolorallocatealpha, arginfo_imagecolorallocatealpha)
  798. PHP_FE(imagecolorresolvealpha, arginfo_imagecolorresolvealpha)
  799. PHP_FE(imagecolorclosestalpha, arginfo_imagecolorclosestalpha)
  800. PHP_FE(imagecolorexactalpha, arginfo_imagecolorexactalpha)
  801. PHP_FE(imagecopyresampled, arginfo_imagecopyresampled)
  802. #ifdef PHP_WIN32
  803. PHP_FE(imagegrabwindow, arginfo_imagegrabwindow)
  804. PHP_FE(imagegrabscreen, arginfo_imagegrabscreen)
  805. #endif
  806. PHP_FE(imagerotate, arginfo_imagerotate)
  807. #ifdef HAVE_GD_BUNDLED
  808. PHP_FE(imageantialias, arginfo_imageantialias)
  809. #endif
  810. #if HAVE_GD_IMAGESETTILE
  811. PHP_FE(imagesettile, arginfo_imagesettile)
  812. #endif
  813. #if HAVE_GD_IMAGESETBRUSH
  814. PHP_FE(imagesetbrush, arginfo_imagesetbrush)
  815. #endif
  816. PHP_FE(imagesetstyle, arginfo_imagesetstyle)
  817. #ifdef HAVE_GD_PNG
  818. PHP_FE(imagecreatefrompng, arginfo_imagecreatefrompng)
  819. #endif
  820. #ifdef HAVE_GD_GIF_READ
  821. PHP_FE(imagecreatefromgif, arginfo_imagecreatefromgif)
  822. #endif
  823. #ifdef HAVE_GD_JPG
  824. PHP_FE(imagecreatefromjpeg, arginfo_imagecreatefromjpeg)
  825. #endif
  826. #ifdef HAVE_GD_WBMP
  827. PHP_FE(imagecreatefromwbmp, arginfo_imagecreatefromwbmp)
  828. #endif
  829. #ifdef HAVE_GD_XBM
  830. PHP_FE(imagecreatefromxbm, arginfo_imagecreatefromxbm)
  831. #endif
  832. #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
  833. PHP_FE(imagecreatefromxpm, arginfo_imagecreatefromxpm)
  834. #endif
  835. PHP_FE(imagecreatefromgd, arginfo_imagecreatefromgd)
  836. #ifdef HAVE_GD_GD2
  837. PHP_FE(imagecreatefromgd2, arginfo_imagecreatefromgd2)
  838. PHP_FE(imagecreatefromgd2part, arginfo_imagecreatefromgd2part)
  839. #endif
  840. #ifdef HAVE_GD_PNG
  841. PHP_FE(imagepng, arginfo_imagepng)
  842. #endif
  843. #ifdef HAVE_GD_GIF_CREATE
  844. PHP_FE(imagegif, arginfo_imagegif)
  845. #endif
  846. #ifdef HAVE_GD_JPG
  847. PHP_FE(imagejpeg, arginfo_imagejpeg)
  848. #endif
  849. #ifdef HAVE_GD_WBMP
  850. PHP_FE(imagewbmp, arginfo_imagewbmp)
  851. #endif
  852. PHP_FE(imagegd, arginfo_imagegd)
  853. #ifdef HAVE_GD_GD2
  854. PHP_FE(imagegd2, arginfo_imagegd2)
  855. #endif
  856. PHP_FE(imagedestroy, arginfo_imagedestroy)
  857. PHP_FE(imagegammacorrect, arginfo_imagegammacorrect)
  858. PHP_FE(imagefill, arginfo_imagefill)
  859. PHP_FE(imagefilledpolygon, arginfo_imagefilledpolygon)
  860. PHP_FE(imagefilledrectangle, arginfo_imagefilledrectangle)
  861. PHP_FE(imagefilltoborder, arginfo_imagefilltoborder)
  862. PHP_FE(imagefontwidth, arginfo_imagefontwidth)
  863. PHP_FE(imagefontheight, arginfo_imagefontheight)
  864. PHP_FE(imageinterlace, arginfo_imageinterlace)
  865. PHP_FE(imageline, arginfo_imageline)
  866. PHP_FE(imageloadfont, arginfo_imageloadfont)
  867. PHP_FE(imagepolygon, arginfo_imagepolygon)
  868. PHP_FE(imagerectangle, arginfo_imagerectangle)
  869. PHP_FE(imagesetpixel, arginfo_imagesetpixel)
  870. PHP_FE(imagestring, arginfo_imagestring)
  871. PHP_FE(imagestringup, arginfo_imagestringup)
  872. PHP_FE(imagesx, arginfo_imagesx)
  873. PHP_FE(imagesy, arginfo_imagesy)
  874. PHP_FE(imagedashedline, arginfo_imagedashedline)
  875. #ifdef ENABLE_GD_TTF
  876. PHP_FE(imagettfbbox, arginfo_imagettfbbox)
  877. PHP_FE(imagettftext, arginfo_imagettftext)
  878. #if HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
  879. PHP_FE(imageftbbox, arginfo_imageftbbox)
  880. PHP_FE(imagefttext, arginfo_imagefttext)
  881. #endif
  882. #endif
  883. #ifdef HAVE_LIBT1
  884. PHP_FE(imagepsloadfont, arginfo_imagepsloadfont)
  885. /*
  886. PHP_FE(imagepscopyfont, arginfo_imagepscopyfont)
  887. */
  888. PHP_FE(imagepsfreefont, arginfo_imagepsfreefont)
  889. PHP_FE(imagepsencodefont, arginfo_imagepsencodefont)
  890. PHP_FE(imagepsextendfont, arginfo_imagepsextendfont)
  891. PHP_FE(imagepsslantfont, arginfo_imagepsslantfont)
  892. PHP_FE(imagepstext, arginfo_imagepstext)
  893. PHP_FE(imagepsbbox, arginfo_imagepsbbox)
  894. #endif
  895. PHP_FE(imagetypes, arginfo_imagetypes)
  896. #if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
  897. PHP_FE(jpeg2wbmp, arginfo_jpeg2wbmp)
  898. #endif
  899. #if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
  900. PHP_FE(png2wbmp, arginfo_png2wbmp)
  901. #endif
  902. #ifdef HAVE_GD_WBMP
  903. PHP_FE(image2wbmp, arginfo_image2wbmp)
  904. #endif
  905. #if HAVE_GD_BUNDLED
  906. PHP_FE(imagelayereffect, arginfo_imagelayereffect)
  907. PHP_FE(imagexbm, arginfo_imagexbm)
  908. #endif
  909. PHP_FE(imagecolormatch, arginfo_imagecolormatch)
  910. /* gd filters */
  911. PHP_FE(imagefilter, arginfo_imagefilter)
  912. PHP_FE(imageconvolution, arginfo_imageconvolution)
  913. {NULL, NULL, NULL}
  914. };
  915. /* }}} */
  916. zend_module_entry gd_module_entry = {
  917. STANDARD_MODULE_HEADER,
  918. "gd",
  919. gd_functions,
  920. PHP_MINIT(gd),
  921. #if HAVE_LIBT1 || HAVE_GD_FONTMUTEX
  922. PHP_MSHUTDOWN(gd),
  923. #else
  924. NULL,
  925. #endif
  926. NULL,
  927. #if HAVE_GD_STRINGFT && (HAVE_LIBFREETYPE && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE))
  928. PHP_RSHUTDOWN(gd),
  929. #else
  930. NULL,
  931. #endif
  932. PHP_MINFO(gd),
  933. NO_VERSION_YET,
  934. STANDARD_MODULE_PROPERTIES
  935. };
  936. #ifdef COMPILE_DL_GD
  937. ZEND_GET_MODULE(gd)
  938. #endif
  939. /* {{{ PHP_INI_BEGIN */
  940. PHP_INI_BEGIN()
  941. PHP_INI_ENTRY("gd.jpeg_ignore_warning", "0", PHP_INI_ALL, NULL)
  942. PHP_INI_END()
  943. /* }}} */
  944. /* {{{ php_free_gd_image
  945. */
  946. static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  947. {
  948. gdImageDestroy((gdImagePtr) rsrc->ptr);
  949. }
  950. /* }}} */
  951. /* {{{ php_free_gd_font
  952. */
  953. static void php_free_gd_font(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  954. {
  955. gdFontPtr fp = (gdFontPtr) rsrc->ptr;
  956. if (fp->data) {
  957. efree(fp->data);
  958. }
  959. efree(fp);
  960. }
  961. /* }}} */
  962. /* {{{ PHP_MSHUTDOWN_FUNCTION
  963. */
  964. #if HAVE_LIBT1 || HAVE_GD_FONTMUTEX
  965. PHP_MSHUTDOWN_FUNCTION(gd)
  966. {
  967. #if HAVE_LIBT1
  968. T1_CloseLib();
  969. #endif
  970. #if HAVE_GD_FONTMUTEX && HAVE_LIBFREETYPE
  971. gdFontCacheMutexShutdown();
  972. #endif
  973. UNREGISTER_INI_ENTRIES();
  974. return SUCCESS;
  975. }
  976. #endif
  977. /* }}} */
  978. /* {{{ PHP_MINIT_FUNCTION
  979. */
  980. PHP_MINIT_FUNCTION(gd)
  981. {
  982. le_gd = zend_register_list_destructors_ex(php_free_gd_image, NULL, "gd", module_number);
  983. le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);
  984. #if HAVE_GD_FONTMUTEX && HAVE_LIBFREETYPE
  985. gdFontCacheMutexSetup();
  986. #endif
  987. #if HAVE_LIBT1
  988. T1_SetBitmapPad(8);
  989. T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE);
  990. T1_SetLogLevel(T1LOG_DEBUG);
  991. le_ps_font = zend_register_list_destructors_ex(php_free_ps_font, NULL, "gd PS font", module_number);
  992. le_ps_enc = zend_register_list_destructors_ex(php_free_ps_enc, NULL, "gd PS encoding", module_number);
  993. #endif
  994. REGISTER_INI_ENTRIES();
  995. REGISTER_LONG_CONSTANT("IMG_GIF", 1, CONST_CS | CONST_PERSISTENT);
  996. REGISTER_LONG_CONSTANT("IMG_JPG", 2, CONST_CS | CONST_PERSISTENT);
  997. REGISTER_LONG_CONSTANT("IMG_JPEG", 2, CONST_CS | CONST_PERSISTENT);
  998. REGISTER_LONG_CONSTANT("IMG_PNG", 4, CONST_CS | CONST_PERSISTENT);
  999. REGISTER_LONG_CONSTANT("IMG_WBMP", 8, CONST_CS | CONST_PERSISTENT);
  1000. REGISTER_LONG_CONSTANT("IMG_XPM", 16, CONST_CS | CONST_PERSISTENT);
  1001. #ifdef gdTiled
  1002. /* special colours for gd */
  1003. REGISTER_LONG_CONSTANT("IMG_COLOR_TILED", gdTiled, CONST_CS | CONST_PERSISTENT);
  1004. REGISTER_LONG_CONSTANT("IMG_COLOR_STYLED", gdStyled, CONST_CS | CONST_PERSISTENT);
  1005. REGISTER_LONG_CONSTANT("IMG_COLOR_BRUSHED", gdBrushed, CONST_CS | CONST_PERSISTENT);
  1006. REGISTER_LONG_CONSTANT("IMG_COLOR_STYLEDBRUSHED", gdStyledBrushed, CONST_CS | CONST_PERSISTENT);
  1007. REGISTER_LONG_CONSTANT("IMG_COLOR_TRANSPARENT", gdTransparent, CONST_CS | CONST_PERSISTENT);
  1008. #endif
  1009. /* for imagefilledarc */
  1010. REGISTER_LONG_CONSTANT("IMG_ARC_ROUNDED", gdArc, CONST_CS | CONST_PERSISTENT);
  1011. REGISTER_LONG_CONSTANT("IMG_ARC_PIE", gdPie, CONST_CS | CONST_PERSISTENT);
  1012. REGISTER_LONG_CONSTANT("IMG_ARC_CHORD", gdChord, CONST_CS | CONST_PERSISTENT);
  1013. REGISTER_LONG_CONSTANT("IMG_ARC_NOFILL", gdNoFill, CONST_CS | CONST_PERSISTENT);
  1014. REGISTER_LONG_CONSTANT("IMG_ARC_EDGED", gdEdged, CONST_CS | CONST_PERSISTENT);
  1015. /* GD2 image format types */
  1016. #ifdef GD2_FMT_RAW
  1017. REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_CS | CONST_PERSISTENT);
  1018. #endif
  1019. #ifdef GD2_FMT_COMPRESSED
  1020. REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_CS | CONST_PERSISTENT);
  1021. #endif
  1022. #if HAVE_GD_BUNDLED
  1023. REGISTER_LONG_CONSTANT("IMG_EFFECT_REPLACE", gdEffectReplace, CONST_CS | CONST_PERSISTENT);
  1024. REGISTER_LONG_CONSTANT("IMG_EFFECT_ALPHABLEND", gdEffectAlphaBlend, CONST_CS | CONST_PERSISTENT);
  1025. REGISTER_LONG_CONSTANT("IMG_EFFECT_NORMAL", gdEffectNormal, CONST_CS | CONST_PERSISTENT);
  1026. REGISTER_LONG_CONSTANT("IMG_EFFECT_OVERLAY", gdEffectOverlay, CONST_CS | CONST_PERSISTENT);
  1027. REGISTER_LONG_CONSTANT("GD_BUNDLED", 1, CONST_CS | CONST_PERSISTENT);
  1028. #else
  1029. REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
  1030. #endif
  1031. /* Section Filters */
  1032. REGISTER_LONG_CONSTANT("IMG_FILTER_NEGATE", IMAGE_FILTER_NEGATE, CONST_CS | CONST_PERSISTENT);
  1033. REGISTER_LONG_CONSTANT("IMG_FILTER_GRAYSCALE", IMAGE_FILTER_GRAYSCALE, CONST_CS | CONST_PERSISTENT);
  1034. REGISTER_LONG_CONSTANT("IMG_FILTER_BRIGHTNESS", IMAGE_FILTER_BRIGHTNESS, CONST_CS | CONST_PERSISTENT);
  1035. REGISTER_LONG_CONSTANT("IMG_FILTER_CONTRAST", IMAGE_FILTER_CONTRAST, CONST_CS | CONST_PERSISTENT);
  1036. REGISTER_LONG_CONSTANT("IMG_FILTER_COLORIZE", IMAGE_FILTER_COLORIZE, CONST_CS | CONST_PERSISTENT);
  1037. REGISTER_LONG_CONSTANT("IMG_FILTER_EDGEDETECT", IMAGE_FILTER_EDGEDETECT, CONST_CS | CONST_PERSISTENT);
  1038. REGISTER_LONG_CONSTANT("IMG_FILTER_GAUSSIAN_BLUR", IMAGE_FILTER_GAUSSIAN_BLUR, CONST_CS | CONST_PERSISTENT);
  1039. REGISTER_LONG_CONSTANT("IMG_FILTER_SELECTIVE_BLUR", IMAGE_FILTER_SELECTIVE_BLUR, CONST_CS | CONST_PERSISTENT);
  1040. REGISTER_LONG_CONSTANT("IMG_FILTER_EMBOSS", IMAGE_FILTER_EMBOSS, CONST_CS | CONST_PERSISTENT);
  1041. REGISTER_LONG_CONSTANT("IMG_FILTER_MEAN_REMOVAL", IMAGE_FILTER_MEAN_REMOVAL, CONST_CS | CONST_PERSISTENT);
  1042. REGISTER_LONG_CONSTANT("IMG_FILTER_SMOOTH", IMAGE_FILTER_SMOOTH, CONST_CS | CONST_PERSISTENT);
  1043. REGISTER_LONG_CONSTANT("IMG_FILTER_PIXELATE", IMAGE_FILTER_PIXELATE, CONST_CS | CONST_PERSISTENT);
  1044. /* End Section Filters */
  1045. #ifdef GD_VERSION_STRING
  1046. REGISTER_STRING_CONSTANT("GD_VERSION", GD_VERSION_STRING, CONST_CS | CONST_PERSISTENT);
  1047. #endif
  1048. #if defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION)
  1049. REGISTER_LONG_CONSTANT("GD_MAJOR_VERSION", GD_MAJOR_VERSION, CONST_CS | CONST_PERSISTENT);
  1050. REGISTER_LONG_CONSTANT("GD_MINOR_VERSION", GD_MINOR_VERSION, CONST_CS | CONST_PERSISTENT);
  1051. REGISTER_LONG_CONSTANT("GD_RELEASE_VERSION", GD_RELEASE_VERSION, CONST_CS | CONST_PERSISTENT);
  1052. REGISTER_STRING_CONSTANT("GD_EXTRA_VERSION", GD_EXTRA_VERSION, CONST_CS | CONST_PERSISTENT);
  1053. #endif
  1054. #ifdef HAVE_GD_PNG
  1055. /*
  1056. * cannot include #include "png.h"
  1057. * /usr/include/pngconf.h:310:2: error: #error png.h already includes setjmp.h with some additional fixup.
  1058. * as error, use the values for now...
  1059. */
  1060. REGISTER_LONG_CONSTANT("PNG_NO_FILTER", 0x00, CONST_CS | CONST_PERSISTENT);
  1061. REGISTER_LONG_CONSTANT("PNG_FILTER_NONE", 0x08, CONST_CS | CONST_PERSISTENT);
  1062. REGISTER_LONG_CONSTANT("PNG_FILTER_SUB", 0x10, CONST_CS | CONST_PERSISTENT);
  1063. REGISTER_LONG_CONSTANT("PNG_FILTER_UP", 0x20, CONST_CS | CONST_PERSISTENT);
  1064. REGISTER_LONG_CONSTANT("PNG_FILTER_AVG", 0x40, CONST_CS | CONST_PERSISTENT);
  1065. REGISTER_LONG_CONSTANT("PNG_FILTER_PAETH", 0x80, CONST_CS | CONST_PERSISTENT);
  1066. REGISTER_LONG_CONSTANT("PNG_ALL_FILTERS", 0x08 | 0x10 | 0x20 | 0x40 | 0x80, CONST_CS | CONST_PERSISTENT);
  1067. #endif
  1068. return SUCCESS;
  1069. }
  1070. /* }}} */
  1071. /* {{{ PHP_RSHUTDOWN_FUNCTION
  1072. */
  1073. #if HAVE_GD_STRINGFT && (HAVE_LIBFREETYPE && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE))
  1074. PHP_RSHUTDOWN_FUNCTION(gd)
  1075. {
  1076. #if HAVE_GD_FONTCACHESHUTDOWN
  1077. gdFontCacheShutdown();
  1078. #else
  1079. gdFreeFontCache();
  1080. #endif
  1081. return SUCCESS;
  1082. }
  1083. #endif
  1084. /* }}} */
  1085. #if HAVE_GD_BUNDLED
  1086. #define PHP_GD_VERSION_STRING "bundled (2.0.34 compatible)"
  1087. #else
  1088. #define PHP_GD_VERSION_STRING "2.0"
  1089. #endif
  1090. /* {{{ PHP_MINFO_FUNCTION
  1091. */
  1092. PHP_MINFO_FUNCTION(gd)
  1093. {
  1094. php_info_print_table_start();
  1095. php_info_print_table_row(2, "GD Support", "enabled");
  1096. /* need to use a PHPAPI function here because it is external module in windows */
  1097. php_info_print_table_row(2, "GD Version", PHP_GD_VERSION_STRING);
  1098. #ifdef ENABLE_GD_TTF
  1099. php_info_print_table_row(2, "FreeType Support", "enabled");
  1100. #if HAVE_LIBFREETYPE
  1101. php_info_print_table_row(2, "FreeType Linkage", "with freetype");
  1102. {
  1103. char tmp[256];
  1104. #ifdef FREETYPE_PATCH
  1105. snprintf(tmp, sizeof(tmp), "%d.%d.%d", FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH);
  1106. #elif defined(FREETYPE_MAJOR)
  1107. snprintf(tmp, sizeof(tmp), "%d.%d", FREETYPE_MAJOR, FREETYPE_MINOR);
  1108. #else
  1109. snprintf(tmp, sizeof(tmp), "1.x");
  1110. #endif
  1111. php_info_print_table_row(2, "FreeType Version", tmp);
  1112. }
  1113. #else
  1114. php_info_print_table_row(2, "FreeType Linkage", "with unknown library");
  1115. #endif
  1116. #endif
  1117. #ifdef HAVE_LIBT1
  1118. php_info_print_table_row(2, "T1Lib Support", "enabled");
  1119. #endif
  1120. /* this next part is stupid ... if I knew better, I'd put them all on one row (cmv) */
  1121. #ifdef HAVE_GD_GIF_READ
  1122. php_info_print_table_row(2, "GIF Read Support", "enabled");
  1123. #endif
  1124. #ifdef HAVE_GD_GIF_CREATE
  1125. php_info_print_table_row(2, "GIF Create Support", "enabled");
  1126. #endif
  1127. #ifdef HAVE_GD_JPG
  1128. {
  1129. char tmp[12];
  1130. snprintf(tmp, sizeof(tmp), "%s", gdJpegGetVersionString());
  1131. php_info_print_table_row(2, "JPEG Support", "enabled");
  1132. php_info_print_table_row(2, "libJPEG Version", tmp);
  1133. }
  1134. #endif
  1135. #ifdef HAVE_GD_PNG
  1136. php_info_print_table_row(2, "PNG Support", "enabled");
  1137. php_info_print_table_row(2, "libPNG Version", gdPngGetVersionString());
  1138. #endif
  1139. #ifdef HAVE_GD_WBMP
  1140. php_info_print_table_row(2, "WBMP Support", "enabled");
  1141. #endif
  1142. #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
  1143. php_info_print_table_row(2, "XPM Support", "enabled");
  1144. #endif
  1145. #ifdef HAVE_GD_XBM
  1146. php_info_print_table_row(2, "XBM Support", "enabled");
  1147. #endif
  1148. #if defined(USE_GD_JISX0208) && defined(HAVE_GD_BUNDLED)
  1149. php_info_print_table_row(2, "JIS-mapped Japanese Font Support", "enabled");
  1150. #endif
  1151. php_info_print_table_end();
  1152. DISPLAY_INI_ENTRIES();
  1153. }
  1154. /* }}} */
  1155. /* {{{ proto array gd_info()
  1156. */
  1157. PHP_FUNCTION(gd_info)
  1158. {
  1159. if (zend_parse_parameters_none() == FAILURE) {
  1160. RETURN_FALSE;
  1161. }
  1162. array_init(return_value);
  1163. add_assoc_string(return_value, "GD Version", PHP_GD_VERSION_STRING, 1);
  1164. #ifdef ENABLE_GD_TTF
  1165. add_assoc_bool(return_value, "FreeType Support", 1);
  1166. #if HAVE_LIBFREETYPE
  1167. add_assoc_string(return_value, "FreeType Linkage", "with freetype", 1);
  1168. #else
  1169. add_assoc_string(return_value, "FreeType Linkage", "with unknown library", 1);
  1170. #endif
  1171. #else
  1172. add_assoc_bool(return_value, "FreeType Support", 0);
  1173. #endif
  1174. #ifdef HAVE_LIBT1
  1175. add_assoc_bool(return_value, "T1Lib Support", 1);
  1176. #else
  1177. add_assoc_bool(return_value, "T1Lib Support", 0);
  1178. #endif
  1179. #ifdef HAVE_GD_GIF_READ
  1180. add_assoc_bool(return_value, "GIF Read Support", 1);
  1181. #else
  1182. add_assoc_bool(return_value, "GIF Read Support", 0);
  1183. #endif
  1184. #ifdef HAVE_GD_GIF_CREATE
  1185. add_assoc_bool(return_value, "GIF Create Support", 1);
  1186. #else
  1187. add_assoc_bool(return_value, "GIF Create Support", 0);
  1188. #endif
  1189. #ifdef HAVE_GD_JPG
  1190. add_assoc_bool(return_value, "JPEG Support", 1);
  1191. #else
  1192. add_assoc_bool(return_value, "JPEG Support", 0);
  1193. #endif
  1194. #ifdef HAVE_GD_PNG
  1195. add_assoc_bool(return_value, "PNG Support", 1);
  1196. #else
  1197. add_assoc_bool(return_value, "PNG Support", 0);
  1198. #endif
  1199. #ifdef HAVE_GD_WBMP
  1200. add_assoc_bool(return_value, "WBMP Support", 1);
  1201. #else
  1202. add_assoc_bool(return_value, "WBMP Support", 0);
  1203. #endif
  1204. #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
  1205. add_assoc_bool(return_value, "XPM Support", 1);
  1206. #else
  1207. add_assoc_bool(return_value, "XPM Support", 0);
  1208. #endif
  1209. #ifdef HAVE_GD_XBM
  1210. add_assoc_bool(return_value, "XBM Support", 1);
  1211. #else
  1212. add_assoc_bool(return_value, "XBM Support", 0);
  1213. #endif
  1214. #if defined(USE_GD_JISX0208) && defined(HAVE_GD_BUNDLED)
  1215. add_assoc_bool(return_value, "JIS-mapped Japanese Font Support", 1);
  1216. #else
  1217. add_assoc_bool(return_value, "JIS-mapped Japanese Font Support", 0);
  1218. #endif
  1219. }
  1220. /* }}} */
  1221. /* Need this for cpdf. See also comment in file.c php3i_get_le_fp() */
  1222. PHP_GD_API int phpi_get_le_gd(void)
  1223. {
  1224. return le_gd;
  1225. }
  1226. /* }}} */
  1227. #ifndef HAVE_GDIMAGECOLORRESOLVE
  1228. /* {{{ gdImageColorResolve
  1229. */
  1230. /********************************************************************/
  1231. /* gdImageColorResolve is a replacement for the old fragment: */
  1232. /* */
  1233. /* if ((color=gdImageColorExact(im,R,G,B)) < 0) */
  1234. /* if ((color=gdImageColorAllocate(im,R,G,B)) < 0) */
  1235. /* color=gdImageColorClosest(im,R,G,B); */
  1236. /* */
  1237. /* in a single function */
  1238. int gdImageColorResolve(gdImagePtr im, int r, int g, int b)
  1239. {
  1240. int c;
  1241. int ct = -1;
  1242. int op = -1;
  1243. long rd, gd, bd, dist;
  1244. long mindist = 3*255*255; /* init to max poss dist */
  1245. for (c = 0; c < im->colorsTotal; c++) {
  1246. if (im->open[c]) {
  1247. op = c; /* Save open slot */
  1248. continue; /* Color not in use */
  1249. }
  1250. rd = (long) (im->red [c] - r);
  1251. gd = (long) (im->green[c] - g);
  1252. bd = (long) (im->blue [c] - b);
  1253. dist = rd * rd + gd * gd + bd * bd;
  1254. if (dist < mindist) {
  1255. if (dist == 0) {
  1256. return c; /* Return exact match color */
  1257. }
  1258. mindist = dist;
  1259. ct = c;
  1260. }
  1261. }
  1262. /* no exact match. We now know closest, but first try to allocate exact */
  1263. if (op == -1) {
  1264. op = im->colorsTotal;
  1265. if (op == gdMaxColors) { /* No room for more colors */
  1266. return ct; /* Return closest available color */
  1267. }
  1268. im->colorsTotal++;
  1269. }
  1270. im->red [op] = r;
  1271. im->green[op] = g;
  1272. im->blue [op] = b;
  1273. im->open [op] = 0;
  1274. return op; /* Return newly allocated color */
  1275. }
  1276. /* }}} */
  1277. #endif
  1278. #define FLIPWORD(a) (((a & 0xff000000) >> 24) | ((a & 0x00ff0000) >> 8) | ((a & 0x0000ff00) << 8) | ((a & 0x000000ff) << 24))
  1279. /* {{{ proto int imageloadfont(string filename)
  1280. Load a new font */
  1281. PHP_FUNCTION(imageloadfont)
  1282. {
  1283. char *file;
  1284. int file_name, hdr_size = sizeof(gdFont) - sizeof(char *);
  1285. int ind, body_size, n = 0, b, i, body_size_check;
  1286. gdFontPtr font;
  1287. php_stream *stream;
  1288. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_name) == FAILURE) {
  1289. return;
  1290. }
  1291. stream = php_stream_open_wrapper(file, "rb", ENFORCE_SAFE_MODE | IGNORE_PATH | IGNORE_URL_WIN | REPORT_ERRORS, NULL);
  1292. if (stream == NULL) {
  1293. RETURN_FALSE;
  1294. }
  1295. /* Only supports a architecture-dependent binary dump format
  1296. * at the moment.
  1297. * The file format is like this on machines with 32-byte integers:
  1298. *
  1299. * byte 0-3: (int) number of characters in the font
  1300. * byte 4-7: (int) value of first character in the font (often 32, space)
  1301. * byte 8-11: (int) pixel width of each character
  1302. * byte 12-15: (int) pixel height of each character
  1303. * bytes 16-: (char) array with character data, one byte per pixel
  1304. * in each character, for a total of
  1305. * (nchars*width*height) bytes.
  1306. */
  1307. font = (gdFontPtr) emalloc(sizeof(gdFont));
  1308. b = 0;
  1309. while (b < hdr_size && (n = php_stream_read(stream, (char*)&font[b], hdr_size - b))) {
  1310. b += n;
  1311. }
  1312. if (!n) {
  1313. efree(font);
  1314. if (php_stream_eof(stream)) {
  1315. php_error_docref(NULL TSRMLS_CC, E_WARNING, "End of file while reading header");
  1316. } else {
  1317. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading header");
  1318. }
  1319. php_stream_close(stream);
  1320. RETURN_FALSE;
  1321. }
  1322. i = php_stream_tell(stream);
  1323. php_stream_seek(stream, 0, SEEK_END);
  1324. body_size_check = php_stream_tell(stream) - hdr_size;
  1325. php_stream_seek(stream, i, SEEK_SET);
  1326. body_size = font->w * font->h * font->nchars;
  1327. if (body_size != body_size_check) {
  1328. font->w = FLIPWORD(font->w);
  1329. font->h = FLIPWORD(font->h);
  1330. font->nchars = FLIPWORD(font->nchars);
  1331. body_size = font->w * font->h * font->nchars;
  1332. }
  1333. if (overflow2(font->nchars, font->h)) {
  1334. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
  1335. efree(font);
  1336. php_stream_close(stream);
  1337. RETURN_FALSE;
  1338. }
  1339. if (overflow2(font->nchars * font->h, font->w )) {
  1340. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
  1341. efree(font);
  1342. php_stream_close(stream);
  1343. RETURN_FALSE;
  1344. }
  1345. if (body_size != body_size_check) {
  1346. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font");
  1347. efree(font);
  1348. php_stream_close(stream);
  1349. RETURN_FALSE;
  1350. }
  1351. font->data = emalloc(body_size);
  1352. b = 0;
  1353. while (b < body_size && (n = php_stream_read(stream, &font->data[b], body_size - b))) {
  1354. b += n;
  1355. }
  1356. if (!n) {
  1357. efree(font->data);
  1358. efree(font);
  1359. if (php_stream_eof(stream)) {
  1360. php_error_docref(NULL TSRMLS_CC, E_WARNING, "End of file while reading body");
  1361. } else {
  1362. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading body");
  1363. }
  1364. php_stream_close(stream);
  1365. RETURN_FALSE;
  1366. }
  1367. php_stream_close(stream);
  1368. /* Adding 5 to the font index so we will never have font indices
  1369. * that overlap with the old fonts (with indices 1-5). The first
  1370. * list index given out is always 1.
  1371. */
  1372. ind = 5 + zend_list_insert(font, le_gd_font);
  1373. RETURN_LONG(ind);
  1374. }
  1375. /* }}} */
  1376. /* {{{ proto bool imagesetstyle(resource im, array styles)
  1377. Set the line drawing styles for use with imageline and IMG_COLOR_STYLED. */
  1378. PHP_FUNCTION(imagesetstyle)
  1379. {
  1380. zval *IM, *styles;
  1381. gdImagePtr im;
  1382. int * stylearr;
  1383. int index;
  1384. HashPosition pos;
  1385. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &IM, &styles) == FAILURE) {
  1386. return;
  1387. }
  1388. ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
  1389. /* copy the style values in the stylearr */
  1390. stylearr = safe_emalloc(sizeof(int), zend_hash_num_elements(HASH_OF(styles)), 0);
  1391. zend_hash_internal_pointer_reset_ex(HASH_OF(styles), &pos);
  1392. for (index = 0;; zend_hash_move_forward_ex(HASH_OF(styles), &pos)) {
  1393. zval ** item;
  1394. if (zend_hash_get_current_data_ex(HASH_OF(styles), (void **) &item, &pos) == FAILURE) {
  1395. break;
  1396. }
  1397. convert_to_long_ex(item);
  1398. stylearr[index++] = Z_LVAL_PP(item);
  1399. }
  1400. gdImageSetStyle(im, stylearr, index);
  1401. efree(stylearr);
  1402. RETURN_TRUE;
  1403. }
  1404. /* }}} */
  1405. /* {{{ proto resource imagecreatetruecolor(int x_size, int y_size)
  1406. Create a new true color image */
  1407. PHP_FUNCTION(imagecreatetruecolor)
  1408. {
  1409. long x_size, y_size;
  1410. gdImagePtr im;
  1411. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &x_size, &y_size) == FAILURE) {
  1412. return;
  1413. }
  1414. if (x_size <= 0 || y_size <= 0 || x_size >= INT_MAX || y_size >= INT_MAX) {
  1415. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions");
  1416. RETURN_FALSE;
  1417. }
  1418. im = gdImageCreateTrueColor(x_size, y_size);
  1419. if (!im) {
  1420. RETURN_FALSE;
  1421. }
  1422. ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
  1423. }
  1424. /* }}} */
  1425. /* {{{ proto bool imageistruecolor(resource im)
  1426. return true if the image uses truecolor */
  1427. PHP_FUNCTION(imageistruecolor)
  1428. {
  1429. zval *IM;
  1430. gdImagePtr im;
  1431. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
  1432. return;
  1433. }
  1434. ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
  1435. RETURN_BOOL(im->trueColor);
  1436. }
  1437. /* }}} */
  1438. /* {{{ proto void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)
  1439. Convert a true colour image to a palette based image with a number of colours, optionally using dithering. */
  1440. PHP_FUNCTION(imagetruecolortopalette)
  1441. {
  1442. zval *IM;
  1443. zend_bool dither;
  1444. long ncolors;
  1445. gdImagePtr im;
  1446. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rbl", &IM, &dither, &ncolors) == FAILURE) {
  1447. return;
  1448. }
  1449. ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
  1450. if (ncolors <= 0) {
  1451. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of colors has to be greater than zero");
  1452. RETURN_FALSE;
  1453. }
  1454. gdImageTrueColorToPalette(im, dither, ncolors);
  1455. RETURN_TRUE;
  1456. }
  1457. /* }}} */
  1458. /* {{{ proto bool imagecolormatch(resource im1, resource im2)
  1459. Makes the colors of the palette version of an image more closely match the true color version */
  1460. PHP_FUNCTION(imagecolormatch)
  1461. {
  1462. zval *IM1, *IM2;
  1463. gdImagePtr im1, im2;
  1464. int result;
  1465. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &IM1, &IM2) == FAILURE) {
  1466. return;
  1467. }
  1468. ZEND_FETCH_RESOURCE(im1, gdImagePtr, &IM1, -1, "Image", le_gd);
  1469. ZEND_FETCH_RESOURCE(im2, gdImagePtr, &IM2, -1, "Image", le_gd);
  1470. result = gdImageColorMatch(im1, im2);
  1471. switch (result) {
  1472. case -1:
  1473. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image1 must be TrueColor" );
  1474. RETURN_FALSE;
  1475. break;
  1476. case -2:
  1477. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image2 must be Palette" );
  1478. RETURN_FALSE;
  1479. break;
  1480. case -3:
  1481. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image1 and Image2 must be the same size" );
  1482. RETURN_FALSE;
  1483. break;
  1484. case -4:
  1485. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image2 must have at least one color" );
  1486. RETURN_FALSE;
  1487. break;
  1488. }
  1489. RETURN_TRUE;
  1490. }
  1491. /* }}} */
  1492. /* {{{ proto bool imagesetthickness(resource im, int thickness)
  1493. Set line thickness for drawing lines, ellipses, rectangles, polygons etc. */
  1494. PHP_FUNCTION(imagesetthickness)
  1495. {
  1496. zval *IM;
  1497. long thick;
  1498. gdImagePtr im;
  1499. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &IM, &thick) == FAILURE) {
  1500. return;
  1501. }
  1502. ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
  1503. gdImageSetThickness(im, thick);
  1504. RETURN_TRUE;
  1505. }
  1506. /* }}} */
  1507. /* {{{ proto bool imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)
  1508. Draw an ellipse */
  1509. PHP_FUNCTION(imagefilledellipse)
  1510. {
  1511. zval *IM;
  1512. long cx, cy, w, h, color;
  1513. gdImagePtr im;
  1514. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &cx, &cy, &w, &h, &color) == FAILURE) {
  1515. return;
  1516. }
  1517. ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
  1518. gdImageFilledEllipse(im, cx, cy, w, h, color);
  1519. RETURN_TRUE;
  1520. }
  1521. /* }}} */
  1522. /* {{{ proto bool imagefilledarc(resource im, int cx, int cy, int w, int h, int s, int e, int col, int style)
  1523. Draw a filled partial ellipse …

Large files files are truncated, but you can click here to view the full file