Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

803 рядки
22 KiB

  1. /*
  2. * php-pipi Php binding for Libpipi
  3. * Copyright (c) 2008 Vion Nicolas <nico@picapo.net>
  4. *
  5. *
  6. * This library is free software. It comes without any warranty, to
  7. * the extent permitted by applicable law. You can redistribute it
  8. * and/or modify it under the terms of the Do What The Fuck You Want
  9. * To Public License, Version 2, as published by Sam Hocevar. See
  10. * http://sam.zoy.org/wtfpl/COPYING for more details.
  11. */
  12. #ifdef HAVE_CONFIG_H
  13. #include "config.h"
  14. #endif
  15. #include "php.h"
  16. #include "php_pipi.h"
  17. static function_entry pipi_functions[] = {
  18. PHP_FE(pipi_get_color_from_string, NULL)
  19. PHP_FE(pipi_get_version, NULL)
  20. PHP_FE(pipi_create_context, NULL)
  21. PHP_FE(pipi_get_command_list, NULL)
  22. PHP_FE(pipi_command, NULL)
  23. PHP_FE(pipi_load, NULL)
  24. PHP_FE(pipi_load_stock, NULL)
  25. PHP_FE(pipi_new, NULL)
  26. PHP_FE(pipi_copy, NULL)
  27. PHP_FE(pipi_save, NULL)
  28. PHP_FE(pipi_set_gamma, NULL)
  29. PHP_FE(pipi_getpixels, NULL)
  30. PHP_FE(pipi_get_image_width, NULL)
  31. PHP_FE(pipi_get_image_height, NULL)
  32. PHP_FE(pipi_get_image_pitch, NULL)
  33. PHP_FE(pipi_get_image_last_modified, NULL)
  34. PHP_FE(pipi_get_format_name, NULL)
  35. PHP_FE(pipi_measure_msd, NULL)
  36. PHP_FE(pipi_measure_rmsd, NULL)
  37. PHP_FE(pipi_resize, NULL)
  38. PHP_FE(pipi_render_random, NULL)
  39. PHP_FE(pipi_render_bayer, NULL)
  40. PHP_FE(pipi_render_halftone, NULL)
  41. PHP_FE(pipi_rgb, NULL)
  42. PHP_FE(pipi_red, NULL)
  43. PHP_FE(pipi_green, NULL)
  44. PHP_FE(pipi_blue, NULL)
  45. PHP_FE(pipi_mean, NULL)
  46. PHP_FE(pipi_min, NULL)
  47. PHP_FE(pipi_max, NULL)
  48. PHP_FE(pipi_add, NULL)
  49. PHP_FE(pipi_sub, NULL)
  50. PHP_FE(pipi_difference, NULL)
  51. PHP_FE(pipi_multiply, NULL)
  52. PHP_FE(pipi_divide, NULL)
  53. PHP_FE(pipi_screen, NULL)
  54. PHP_FE(pipi_overlay, NULL)
  55. PHP_FE(pipi_convolution, NULL)
  56. PHP_FE(pipi_gaussian_blur, NULL)
  57. PHP_FE(pipi_gaussian_blur_ext, NULL)
  58. PHP_FE(pipi_box_blur, NULL)
  59. PHP_FE(pipi_box_blur_ext, NULL)
  60. PHP_FE(pipi_brightness, NULL)
  61. PHP_FE(pipi_contrast, NULL)
  62. PHP_FE(pipi_autocontrast, NULL)
  63. PHP_FE(pipi_invert, NULL)
  64. PHP_FE(pipi_threshold, NULL)
  65. PHP_FE(pipi_hflip, NULL)
  66. PHP_FE(pipi_vflip, NULL)
  67. PHP_FE(pipi_rotate90, NULL)
  68. PHP_FE(pipi_rotate180, NULL)
  69. PHP_FE(pipi_rotate270, NULL)
  70. PHP_FE(pipi_median, NULL)
  71. PHP_FE(pipi_median_ext, NULL)
  72. PHP_FE(pipi_dilate, NULL)
  73. PHP_FE(pipi_erode, NULL)
  74. PHP_FE(pipi_order, NULL)
  75. PHP_FE(pipi_tile, NULL)
  76. PHP_FE(pipi_flood_fill, NULL)
  77. PHP_FE(pipi_draw_line, NULL)
  78. PHP_FE(pipi_draw_rectangle, NULL)
  79. PHP_FE(pipi_draw_polyline, NULL)
  80. PHP_FE(pipi_draw_bezier4, NULL)
  81. PHP_FE(pipi_reduce, NULL)
  82. PHP_FE(pipi_dither_ediff, NULL)
  83. PHP_FE(pipi_dither_ordered, NULL)
  84. PHP_FE(pipi_dither_ordered_ext, NULL)
  85. PHP_FE(pipi_dither_halftone, NULL)
  86. PHP_FE(pipi_dither_random, NULL)
  87. PHP_FE(pipi_dither_ostromoukhov, NULL)
  88. PHP_FE(pipi_dither_dbs, NULL)
  89. PHP_FE(pipi_dither_24to16, NULL)
  90. PHP_FE(pipi_new_histogram, NULL)
  91. PHP_FE(pipi_get_image_histogram, NULL)
  92. PHP_FE(pipi_render_histogram, NULL)
  93. {NULL, NULL, NULL}
  94. };
  95. zend_module_entry pipi_module_entry = {
  96. #if ZEND_MODULE_API_NO >= 20010901
  97. STANDARD_MODULE_HEADER,
  98. #endif
  99. PHP_PIPI_EXTNAME,
  100. pipi_functions,
  101. PHP_MINIT(pipi),
  102. NULL,
  103. NULL,
  104. NULL,
  105. PHP_MINFO(pipi),
  106. #if ZEND_MODULE_API_NO >= 20010901
  107. PHP_PIPI_VERSION,
  108. #endif
  109. STANDARD_MODULE_PROPERTIES
  110. };
  111. #ifdef COMPILE_DL_PIPI
  112. ZEND_GET_MODULE(pipi)
  113. #endif
  114. PHP_MINFO_FUNCTION(pipi) {
  115. php_info_print_table_start();
  116. php_info_print_table_row(2, "Pipi library version", pipi_get_version());
  117. php_info_print_table_end();
  118. }
  119. //--------PIPI'S RESSOURCES DESTRUCTORS---------//
  120. static void php_pipi_image_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  121. pipi_free(rsrc->ptr);
  122. }
  123. static void php_pipi_context_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  124. pipi_destroy_context(rsrc->ptr);
  125. }
  126. static void php_pipi_histogram_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  127. pipi_free_histogram(rsrc->ptr);
  128. }
  129. //--------INITIALIZATION---------//
  130. PHP_MINIT_FUNCTION(pipi) {
  131. le_pipi_image = zend_register_list_destructors_ex(php_pipi_image_dtor, NULL, PHP_PIPI_IMAGE_RES_NAME, module_number);
  132. le_pipi_context = zend_register_list_destructors_ex(php_pipi_context_dtor, NULL, PHP_PIPI_CONTEXT_RES_NAME, module_number);
  133. le_pipi_histogram = zend_register_list_destructors_ex(php_pipi_histogram_dtor, NULL, PHP_PIPI_HISTOGRAM_RES_NAME, module_number);
  134. REGISTER_LONG_CONSTANT("PIPI_SCAN_RASTER", PIPI_SCAN_RASTER, CONST_CS | CONST_PERSISTENT);
  135. REGISTER_LONG_CONSTANT("PIPI_SCAN_SERPENTINE", PIPI_SCAN_SERPENTINE, CONST_CS | CONST_PERSISTENT);
  136. REGISTER_LONG_CONSTANT("PIPI_PIXELS_UNINITIALISED", PIPI_PIXELS_UNINITIALISED, CONST_CS | CONST_PERSISTENT);
  137. REGISTER_LONG_CONSTANT("PIPI_PIXELS_RGBA_C", PIPI_PIXELS_RGBA_C, CONST_CS | CONST_PERSISTENT);
  138. REGISTER_LONG_CONSTANT("PIPI_PIXELS_BGR_C", PIPI_PIXELS_BGR_C, CONST_CS | CONST_PERSISTENT);
  139. REGISTER_LONG_CONSTANT("PIPI_PIXELS_RGBA_F", PIPI_PIXELS_RGBA_F, CONST_CS | CONST_PERSISTENT);
  140. REGISTER_LONG_CONSTANT("PIPI_PIXELS_Y_F", PIPI_PIXELS_Y_F, CONST_CS | CONST_PERSISTENT);
  141. REGISTER_LONG_CONSTANT("PIPI_PIXELS_MASK_C", PIPI_PIXELS_MASK_C, CONST_CS | CONST_PERSISTENT);
  142. REGISTER_LONG_CONSTANT("PIPI_PIXELS_MAX", PIPI_PIXELS_MAX, CONST_CS | CONST_PERSISTENT);
  143. REGISTER_LONG_CONSTANT("PIPI_COLOR_R", PIPI_COLOR_R, CONST_CS | CONST_PERSISTENT);
  144. REGISTER_LONG_CONSTANT("PIPI_COLOR_G", PIPI_COLOR_G, CONST_CS | CONST_PERSISTENT);
  145. REGISTER_LONG_CONSTANT("PIPI_COLOR_B", PIPI_COLOR_B, CONST_CS | CONST_PERSISTENT);
  146. REGISTER_LONG_CONSTANT("PIPI_COLOR_A", PIPI_COLOR_A, CONST_CS | CONST_PERSISTENT);
  147. REGISTER_LONG_CONSTANT("PIPI_COLOR_Y", PIPI_COLOR_Y, CONST_CS | CONST_PERSISTENT);
  148. return SUCCESS;
  149. }
  150. //----------SOME USEFULL MACROS---------------//
  151. #define FETCH_STR(str) \
  152. int __len; \
  153. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &__len) == FAILURE) { \
  154. RETURN_FALSE; \
  155. }
  156. #define FETCH_LONG(l) \
  157. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &l) == FAILURE) { \
  158. RETURN_FALSE; \
  159. }
  160. #define FETCH_IMG(img) \
  161. zval *_zval; \
  162. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
  163. RETURN_FALSE; \
  164. } \
  165. ZEND_FETCH_RESOURCE(img, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  166. #define FETCH_IMG_IMG(img1, img2) \
  167. zval *_zval1, *_zval2; \
  168. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &_zval1, &_zval2) == FAILURE) { \
  169. RETURN_FALSE; \
  170. } \
  171. ZEND_FETCH_RESOURCE(img1, pipi_image_t*, &_zval1, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image); \
  172. ZEND_FETCH_RESOURCE(img2, pipi_image_t*, &_zval2, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  173. //--------PIPI'S FUNCTIONS---------//
  174. PHP_FUNCTION(pipi_get_color_from_string) {
  175. }
  176. PHP_FUNCTION(pipi_get_version) {
  177. RETURN_STRING(estrdup(pipi_get_version()), 0);
  178. }
  179. PHP_FUNCTION(pipi_create_context) {
  180. pipi_context_t *context;
  181. context = pipi_create_context();
  182. ZEND_REGISTER_RESOURCE(return_value, context, le_pipi_context);
  183. }
  184. PHP_FUNCTION(pipi_get_command_list) {
  185. pipi_command_t const *list, *cmd;
  186. list = pipi_get_command_list();
  187. array_init(return_value);
  188. for (cmd = list; cmd->name; cmd++)
  189. add_assoc_long(return_value, (char*) cmd->name, cmd->argc);
  190. }
  191. PHP_FUNCTION(pipi_command) {
  192. zval *res;
  193. char *arg1, *arg2 = NULL;
  194. int arg1_len, arg2_len;
  195. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &res, &arg1, &arg1_len, &arg2, &arg2_len) == FAILURE) {
  196. RETURN_FALSE;
  197. }
  198. pipi_context_t *ctxt;
  199. ZEND_FETCH_RESOURCE(ctxt, pipi_context_t*, &res, -1, PHP_PIPI_CONTEXT_RES_NAME, le_pipi_context);
  200. if (arg2_len != 0) {
  201. RETURN_BOOL(pipi_command(ctxt, arg1, arg2) == 0);
  202. }
  203. RETURN_BOOL(pipi_command(ctxt, arg1) == 0);
  204. }
  205. PHP_FUNCTION(pipi_load) {
  206. char *str;
  207. FETCH_STR(str);
  208. pipi_image_t *img;
  209. img = pipi_load(str);
  210. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  211. }
  212. PHP_FUNCTION(pipi_load_stock) {
  213. char *str;
  214. FETCH_STR(str);
  215. pipi_image_t *img;
  216. img = pipi_load_stock(str);
  217. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  218. }
  219. PHP_FUNCTION(pipi_new) {
  220. long width, height = 0;
  221. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  222. RETURN_FALSE;
  223. }
  224. pipi_image_t *img;
  225. img = pipi_new(width, height);
  226. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  227. }
  228. PHP_FUNCTION(pipi_copy) {
  229. pipi_image_t *src, *result;
  230. FETCH_IMG(src);
  231. result = pipi_copy(src);
  232. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  233. }
  234. PHP_FUNCTION(pipi_save) {
  235. zval *res;
  236. char *str;
  237. int str_len;
  238. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &str, &str_len) == FAILURE) {
  239. RETURN_FALSE;
  240. }
  241. pipi_image_t *img;
  242. ZEND_FETCH_RESOURCE(img, pipi_image_t*, &res, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  243. RETURN_BOOL(pipi_save(img, str) == 0);
  244. }
  245. PHP_FUNCTION(pipi_set_gamma) {
  246. long value;
  247. FETCH_LONG(value);
  248. pipi_set_gamma(value);
  249. }
  250. PHP_FUNCTION(pipi_getpixels) {
  251. }
  252. PHP_FUNCTION(pipi_get_image_width) {
  253. pipi_image_t *img;
  254. FETCH_IMG(img);
  255. RETURN_LONG(pipi_get_image_width(img));
  256. }
  257. PHP_FUNCTION(pipi_get_image_height) {
  258. pipi_image_t *img;
  259. FETCH_IMG(img);
  260. RETURN_LONG(pipi_get_image_height(img));
  261. }
  262. PHP_FUNCTION(pipi_get_image_pitch) {
  263. pipi_image_t *img;
  264. FETCH_IMG(img);
  265. RETURN_LONG(pipi_get_image_pitch(img));
  266. }
  267. PHP_FUNCTION(pipi_get_image_last_modified) {
  268. pipi_image_t *img;
  269. FETCH_IMG(img);
  270. RETURN_LONG(pipi_get_image_last_midified(img));
  271. }
  272. PHP_FUNCTION(pipi_get_format_name) {
  273. long id;
  274. FETCH_LONG(id);
  275. RETURN_STRING(estrdup(pipi_get_format_name(id)), 0);
  276. }
  277. PHP_FUNCTION(pipi_measure_msd) {
  278. pipi_image_t *img1, *img2;
  279. FETCH_IMG_IMG(img1, img2);
  280. RETURN_LONG(pipi_measure_msd(img1, img2));
  281. }
  282. PHP_FUNCTION(pipi_measure_rmsd) {
  283. pipi_image_t *img1, *img2;
  284. FETCH_IMG_IMG(img1, img2);
  285. RETURN_LONG(pipi_measure_rmsd(img1, img2));
  286. }
  287. PHP_FUNCTION(pipi_resize) {
  288. zval *_zval;
  289. long width, height = 0;
  290. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &width, &height) == FAILURE) {
  291. RETURN_FALSE;
  292. }
  293. pipi_image_t *src, *result;
  294. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  295. result = pipi_resize(src, width, height);
  296. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  297. }
  298. PHP_FUNCTION(pipi_render_random) {
  299. long width, height = 0;
  300. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  301. RETURN_FALSE;
  302. }
  303. pipi_image_t *img;
  304. img = pipi_render_random(width, height);
  305. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  306. }
  307. PHP_FUNCTION(pipi_render_bayer) {
  308. long width, height = 0;
  309. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  310. RETURN_FALSE;
  311. }
  312. pipi_image_t *img;
  313. img = pipi_render_bayer(width, height);
  314. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  315. }
  316. PHP_FUNCTION(pipi_render_halftone) {
  317. long width, height = 0;
  318. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  319. RETURN_FALSE;
  320. }
  321. pipi_image_t *img;
  322. img = pipi_render_halftone(width, height);
  323. ZEND_REGISTER_RESOURCE(return_value, img, le_pipi_image);
  324. }
  325. PHP_FUNCTION(pipi_rgb) {
  326. zval *_zval1, *_zval2, *_zval3;
  327. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrr", &_zval1, &_zval2, &_zval3) == FAILURE) {
  328. RETURN_FALSE;
  329. }
  330. pipi_image_t *img_r, *img_g, *img_b, *result;
  331. ZEND_FETCH_RESOURCE(img_r, pipi_image_t*, &_zval1, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  332. ZEND_FETCH_RESOURCE(img_g, pipi_image_t*, &_zval2, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  333. ZEND_FETCH_RESOURCE(img_b, pipi_image_t*, &_zval3, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  334. result = pipi_rgb(img_r, img_g, img_b);
  335. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  336. }
  337. PHP_FUNCTION(pipi_red) {
  338. pipi_image_t *src, *result;
  339. FETCH_IMG(src);
  340. result = pipi_red(src);
  341. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  342. }
  343. PHP_FUNCTION(pipi_green) {
  344. pipi_image_t *src, *result;
  345. FETCH_IMG(src);
  346. result = pipi_green(src);
  347. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  348. }
  349. PHP_FUNCTION(pipi_blue) {
  350. pipi_image_t *src, *result;
  351. FETCH_IMG(src);
  352. result = pipi_blue(src);
  353. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  354. }
  355. PHP_FUNCTION(pipi_mean) {
  356. pipi_image_t *img1, *img2, *result;
  357. FETCH_IMG_IMG(img1, img2);
  358. result = pipi_mean(img1, img2);
  359. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  360. }
  361. PHP_FUNCTION(pipi_min) {
  362. pipi_image_t *img1, *img2, *result;
  363. FETCH_IMG_IMG(img1, img2);
  364. result = pipi_min(img1, img2);
  365. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  366. }
  367. PHP_FUNCTION(pipi_max) {
  368. pipi_image_t *img1, *img2, *result;
  369. FETCH_IMG_IMG(img1, img2);
  370. result = pipi_max(img1, img2);
  371. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  372. }
  373. PHP_FUNCTION(pipi_add) {
  374. pipi_image_t *img1, *img2, *result;
  375. FETCH_IMG_IMG(img1, img2);
  376. result = pipi_add(img1, img2);
  377. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  378. }
  379. PHP_FUNCTION(pipi_sub) {
  380. pipi_image_t *img1, *img2, *result;
  381. FETCH_IMG_IMG(img1, img2);
  382. result = pipi_sub(img1, img2);
  383. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  384. }
  385. PHP_FUNCTION(pipi_difference) {
  386. pipi_image_t *img1, *img2, *result;
  387. FETCH_IMG_IMG(img1, img2);
  388. result = pipi_difference(img1, img2);
  389. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  390. }
  391. PHP_FUNCTION(pipi_multiply) {
  392. pipi_image_t *img1, *img2, *result;
  393. FETCH_IMG_IMG(img1, img2);
  394. result = pipi_multiply(img1, img2);
  395. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  396. }
  397. PHP_FUNCTION(pipi_divide) {
  398. pipi_image_t *img1, *img2, *result;
  399. FETCH_IMG_IMG(img1, img2);
  400. result = pipi_divide(img1, img2);
  401. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  402. }
  403. PHP_FUNCTION(pipi_screen) {
  404. pipi_image_t *img1, *img2, *result;
  405. FETCH_IMG_IMG(img1, img2);
  406. result = pipi_screen(img1, img2);
  407. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  408. }
  409. PHP_FUNCTION(pipi_overlay) {
  410. pipi_image_t *img1, *img2, *result;
  411. FETCH_IMG_IMG(img1, img2);
  412. result = pipi_overlay(img1, img2);
  413. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  414. }
  415. PHP_FUNCTION(pipi_convolution) {
  416. }
  417. PHP_FUNCTION(pipi_gaussian_blur) {
  418. zval *_zval;
  419. double value = 0;
  420. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  421. RETURN_FALSE;
  422. }
  423. pipi_image_t *src, *result;
  424. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  425. result = pipi_gaussian_blur(src, value);
  426. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  427. }
  428. PHP_FUNCTION(pipi_gaussian_blur_ext) {
  429. zval *_zval;
  430. double v1, v2, v3, v4, v5 = 0;
  431. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rddddd", &_zval, &v1, &v2, &v3, &v4, &v5) == FAILURE) {
  432. RETURN_FALSE;
  433. }
  434. pipi_image_t *src, *result;
  435. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  436. result = pipi_gaussian_blur_ext(src, v1, v2, v3, v4, v5);
  437. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  438. }
  439. PHP_FUNCTION(pipi_box_blur) {
  440. zval *_zval;
  441. long value = 0;
  442. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  443. RETURN_FALSE;
  444. }
  445. pipi_image_t *src, *result;
  446. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  447. result = pipi_box_blur(src, value);
  448. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  449. }
  450. PHP_FUNCTION(pipi_box_blur_ext) {
  451. zval *_zval;
  452. long m, n = 0;
  453. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &m, &n) == FAILURE) {
  454. RETURN_FALSE;
  455. }
  456. pipi_image_t *src, *result;
  457. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  458. result = pipi_box_blur_ext(src, m, n);
  459. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  460. }
  461. PHP_FUNCTION(pipi_brightness) {
  462. zval *_zval;
  463. double value = 0;
  464. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  465. RETURN_FALSE;
  466. }
  467. pipi_image_t *src, *result;
  468. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  469. result = pipi_brightness(src, value);
  470. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  471. }
  472. PHP_FUNCTION(pipi_contrast) {
  473. zval *_zval;
  474. double value = 0;
  475. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  476. RETURN_FALSE;
  477. }
  478. pipi_image_t *src, *result;
  479. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  480. result = pipi_contrast(src, value);
  481. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  482. }
  483. PHP_FUNCTION(pipi_autocontrast) {
  484. pipi_image_t *src, *result;
  485. FETCH_IMG(src);
  486. result = pipi_autocontrast(src);
  487. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  488. }
  489. PHP_FUNCTION(pipi_invert) {
  490. pipi_image_t *src, *result;
  491. FETCH_IMG(src);
  492. result = pipi_invert(src);
  493. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  494. }
  495. PHP_FUNCTION(pipi_threshold) {
  496. zval *_zval;
  497. double value = 0;
  498. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  499. RETURN_FALSE;
  500. }
  501. pipi_image_t *src, *result;
  502. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  503. result = pipi_threshold(src, value);
  504. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  505. }
  506. PHP_FUNCTION(pipi_hflip) {
  507. pipi_image_t *src, *result;
  508. FETCH_IMG(src);
  509. result = pipi_hflip(src);
  510. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  511. }
  512. PHP_FUNCTION(pipi_vflip) {
  513. pipi_image_t *src, *result;
  514. FETCH_IMG(src);
  515. result = pipi_vflip(src);
  516. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  517. }
  518. PHP_FUNCTION(pipi_rotate90) {
  519. pipi_image_t *src, *result;
  520. FETCH_IMG(src);
  521. result = pipi_rotate90(src);
  522. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  523. }
  524. PHP_FUNCTION(pipi_rotate180) {
  525. pipi_image_t *src, *result;
  526. FETCH_IMG(src);
  527. result = pipi_rotate180(src);
  528. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  529. }
  530. PHP_FUNCTION(pipi_rotate270) {
  531. pipi_image_t *src, *result;
  532. FETCH_IMG(src);
  533. result = pipi_rotate270(src);
  534. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  535. }
  536. PHP_FUNCTION(pipi_median) {
  537. zval *_zval;
  538. long value = 0;
  539. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  540. RETURN_FALSE;
  541. }
  542. pipi_image_t *src, *result;
  543. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  544. result = pipi_median(src, value);
  545. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  546. }
  547. PHP_FUNCTION(pipi_median_ext) {
  548. zval *_zval;
  549. long rx, ry = 0;
  550. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &rx, &ry) == FAILURE) {
  551. RETURN_FALSE;
  552. }
  553. pipi_image_t *src, *result;
  554. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  555. result = pipi_median_ext(src, rx, ry);
  556. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  557. }
  558. PHP_FUNCTION(pipi_dilate) {
  559. pipi_image_t *src, *result;
  560. FETCH_IMG(src);
  561. result = pipi_dilate(src);
  562. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  563. }
  564. PHP_FUNCTION(pipi_erode) {
  565. pipi_image_t *src, *result;
  566. FETCH_IMG(src);
  567. result = pipi_erode(src);
  568. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  569. }
  570. PHP_FUNCTION(pipi_order) {
  571. pipi_image_t *src, *result;
  572. FETCH_IMG(src);
  573. result = pipi_order(src);
  574. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  575. }
  576. PHP_FUNCTION(pipi_tile) {
  577. zval *_zval;
  578. long width, height = 0;
  579. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &width, &height) == FAILURE) {
  580. RETURN_FALSE;
  581. }
  582. pipi_image_t *src, *result;
  583. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  584. result = pipi_tile(src, width, height);
  585. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  586. }
  587. PHP_FUNCTION(pipi_flood_fill) {
  588. }
  589. PHP_FUNCTION(pipi_draw_line) {
  590. }
  591. PHP_FUNCTION(pipi_draw_rectangle) {
  592. }
  593. PHP_FUNCTION(pipi_draw_polyline) {
  594. }
  595. PHP_FUNCTION(pipi_draw_bezier4) {
  596. }
  597. PHP_FUNCTION(pipi_reduce) {
  598. }
  599. PHP_FUNCTION(pipi_dither_ediff) {
  600. }
  601. PHP_FUNCTION(pipi_dither_ordered) {
  602. pipi_image_t *img1, *img2, *result;
  603. FETCH_IMG_IMG(img1, img2);
  604. result = pipi_dither_ordered(img1, img2);
  605. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  606. }
  607. PHP_FUNCTION(pipi_dither_ordered_ext) {
  608. zval *_zval1;
  609. zval *_zval2;
  610. double precision, angle = 0;
  611. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrdd", &_zval1, &_zval2, &precision, &angle) == FAILURE) {
  612. RETURN_FALSE;
  613. }
  614. pipi_image_t *img1, *img2, *result;
  615. ZEND_FETCH_RESOURCE(img1, pipi_image_t*, &_zval1, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  616. ZEND_FETCH_RESOURCE(img2, pipi_image_t*, &_zval2, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  617. result = pipi_dither_ordered_ext(img1, img2, precision, angle);
  618. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  619. }
  620. PHP_FUNCTION(pipi_dither_halftone) {
  621. zval *_zval;
  622. double r, angle = 0;
  623. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rdd", &_zval, &r, &angle) == FAILURE) {
  624. RETURN_FALSE;
  625. }
  626. pipi_image_t *src, *result;
  627. ZEND_FETCH_RESOURCE(src, pipi_image_t*, &_zval, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  628. result = pipi_dither_halftone(src, r, angle);
  629. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  630. }
  631. PHP_FUNCTION(pipi_dither_random) {
  632. pipi_image_t *src, *result;
  633. FETCH_IMG(src);
  634. result = pipi_dither_random(src);
  635. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  636. }
  637. PHP_FUNCTION(pipi_dither_ostromoukhov) {
  638. }
  639. PHP_FUNCTION(pipi_dither_dbs) {
  640. pipi_image_t *src, *result;
  641. FETCH_IMG(src);
  642. result = pipi_dither_dbs(src);
  643. ZEND_REGISTER_RESOURCE(return_value, result, le_pipi_image);
  644. }
  645. PHP_FUNCTION(pipi_dither_24to16) {
  646. pipi_image_t *img;
  647. FETCH_IMG(img);
  648. pipi_dither_24to16(img);
  649. }
  650. PHP_FUNCTION(pipi_new_histogram) {
  651. pipi_histogram_t *histogram;
  652. histogram = pipi_new_histogram();
  653. ZEND_REGISTER_RESOURCE(return_value, histogram, le_pipi_histogram);
  654. }
  655. PHP_FUNCTION(pipi_get_image_histogram) {
  656. zval *_zval_img, *_zval_hst;
  657. long flags = 0;
  658. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrl", &_zval_img, &_zval_hst, &flags) == FAILURE) {
  659. RETURN_FALSE;
  660. }
  661. pipi_image_t *image;
  662. pipi_histogram_t *histogram;
  663. ZEND_FETCH_RESOURCE(image, pipi_image_t*, &_zval_img, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  664. ZEND_FETCH_RESOURCE(histogram, pipi_histogram_t*, &_zval_hst, -1, PHP_PIPI_HISTOGRAM_RES_NAME, le_pipi_histogram);
  665. RETURN_BOOL(pipi_get_image_histogram(image, histogram, flags) == 0);
  666. }
  667. PHP_FUNCTION(pipi_render_histogram) {
  668. zval *_zval_img, *_zval_hst;
  669. long flags = 0;
  670. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrl", &_zval_img, &_zval_hst, &flags) == FAILURE) {
  671. RETURN_FALSE;
  672. }
  673. pipi_image_t *image;
  674. pipi_histogram_t *histogram;
  675. ZEND_FETCH_RESOURCE(image, pipi_image_t*, &_zval_img, -1, PHP_PIPI_IMAGE_RES_NAME, le_pipi_image);
  676. ZEND_FETCH_RESOURCE(histogram, pipi_histogram_t*, &_zval_hst, -1, PHP_PIPI_HISTOGRAM_RES_NAME, le_pipi_histogram);
  677. RETURN_BOOL(pipi_render_histogram(image, histogram, flags) == 0);
  678. }