選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

1786 行
57 KiB

  1. /*
  2. * php-caca Php binding for Libcaca
  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_caca.h"
  17. #include <gd.h>
  18. static function_entry caca_functions[] = {
  19. PHP_FE(caca_create_event, NULL)
  20. PHP_FE(caca_create_canvas, NULL)
  21. PHP_FE(caca_set_canvas_size, NULL)
  22. PHP_FE(caca_get_canvas_width, NULL)
  23. PHP_FE(caca_get_canvas_height, NULL)
  24. PHP_FE(caca_get_canvas_chars, NULL)
  25. PHP_FE(caca_get_canvas_attrs, NULL)
  26. PHP_FE(caca_rand, NULL)
  27. PHP_FE(caca_get_version, NULL)
  28. PHP_FE(caca_gotoxy, NULL)
  29. PHP_FE(caca_get_cursor_x, NULL)
  30. PHP_FE(caca_get_cursor_y, NULL)
  31. PHP_FE(caca_put_char, NULL)
  32. PHP_FE(caca_get_char, NULL)
  33. PHP_FE(caca_put_str, NULL)
  34. PHP_FE(caca_clear_canvas, NULL)
  35. PHP_FE(caca_set_canvas_handle, NULL)
  36. PHP_FE(caca_get_canvas_handle_x, NULL)
  37. PHP_FE(caca_get_canvas_handle_y, NULL)
  38. PHP_FE(caca_blit, NULL)
  39. PHP_FE(caca_set_canvas_boundaries, NULL)
  40. PHP_FE(caca_invert, NULL)
  41. PHP_FE(caca_flip, NULL)
  42. PHP_FE(caca_flop, NULL)
  43. PHP_FE(caca_rotate_180, NULL)
  44. PHP_FE(caca_rotate_left, NULL)
  45. PHP_FE(caca_rotate_right, NULL)
  46. PHP_FE(caca_stretch_left, NULL)
  47. PHP_FE(caca_stretch_right, NULL)
  48. PHP_FE(caca_get_attr, NULL)
  49. PHP_FE(caca_set_attr, NULL)
  50. PHP_FE(caca_put_attr, NULL)
  51. PHP_FE(caca_set_color_ansi, NULL)
  52. PHP_FE(caca_set_color_argb, NULL)
  53. PHP_FE(caca_attr_to_ansi, NULL)
  54. PHP_FE(caca_attr_to_ansi_fg, NULL)
  55. PHP_FE(caca_attr_to_ansi_bg, NULL)
  56. PHP_FE(caca_attr_to_rgb12_fg, NULL)
  57. PHP_FE(caca_attr_to_rgb12_bg, NULL)
  58. PHP_FE(caca_attr_to_argb64, NULL)
  59. PHP_FE(caca_utf8_to_utf32, NULL)
  60. PHP_FE(caca_utf32_to_utf8, NULL)
  61. PHP_FE(caca_utf32_to_cp437, NULL)
  62. PHP_FE(caca_cp437_to_utf32, NULL)
  63. PHP_FE(caca_utf32_to_ascii, NULL)
  64. PHP_FE(caca_utf32_is_fullwidth, NULL)
  65. PHP_FE(caca_draw_line, NULL)
  66. PHP_FE(caca_draw_polyline, NULL)
  67. PHP_FE(caca_draw_thin_line, NULL)
  68. PHP_FE(caca_draw_thin_polyline, NULL)
  69. PHP_FE(caca_draw_circle, NULL)
  70. PHP_FE(caca_draw_ellipse, NULL)
  71. PHP_FE(caca_draw_thin_ellipse, NULL)
  72. PHP_FE(caca_fill_ellipse, NULL)
  73. PHP_FE(caca_draw_box, NULL)
  74. PHP_FE(caca_draw_thin_box, NULL)
  75. PHP_FE(caca_draw_cp437_box, NULL)
  76. PHP_FE(caca_fill_box, NULL)
  77. PHP_FE(caca_draw_triangle, NULL)
  78. PHP_FE(caca_draw_thin_triangle, NULL)
  79. PHP_FE(caca_fill_triangle, NULL)
  80. PHP_FE(caca_get_frame_count, NULL)
  81. PHP_FE(caca_set_frame, NULL)
  82. PHP_FE(caca_set_frame_name, NULL)
  83. PHP_FE(caca_create_frame, NULL)
  84. PHP_FE(caca_free_frame, NULL)
  85. PHP_FE(caca_create_dither, NULL)
  86. PHP_FE(caca_create_dither_gd, NULL)
  87. PHP_FE(caca_set_dither_palette, NULL)
  88. PHP_FE(caca_set_dither_palette_gd, NULL)
  89. PHP_FE(caca_set_dither_brightness, NULL)
  90. PHP_FE(caca_get_dither_brightness, NULL)
  91. PHP_FE(caca_set_dither_gamma, NULL)
  92. PHP_FE(caca_get_dither_gamma, NULL)
  93. PHP_FE(caca_set_dither_contrast, NULL)
  94. PHP_FE(caca_get_dither_contrast, NULL)
  95. PHP_FE(caca_set_dither_antialias, NULL)
  96. PHP_FE(caca_get_dither_antialias_list, NULL)
  97. PHP_FE(caca_get_dither_antialias, NULL)
  98. PHP_FE(caca_set_dither_color, NULL)
  99. PHP_FE(caca_get_dither_color_list, NULL)
  100. PHP_FE(caca_get_dither_color, NULL)
  101. PHP_FE(caca_set_dither_charset, NULL)
  102. PHP_FE(caca_get_dither_charset_list, NULL)
  103. PHP_FE(caca_get_dither_charset, NULL)
  104. PHP_FE(caca_set_dither_algorithm, NULL)
  105. PHP_FE(caca_get_dither_algorithm_list, NULL)
  106. PHP_FE(caca_get_dither_algorithm, NULL)
  107. PHP_FE(caca_dither_bitmap_gd, NULL)
  108. PHP_FE(caca_load_font, NULL)
  109. PHP_FE(caca_get_font_list, NULL)
  110. PHP_FE(caca_get_font_width, NULL)
  111. PHP_FE(caca_get_font_height, NULL)
  112. PHP_FE(caca_get_font_blocks, NULL)
  113. PHP_FE(caca_render_canvas, NULL)
  114. PHP_FE(caca_canvas_set_figfont, NULL)
  115. PHP_FE(caca_put_figchar, NULL)
  116. PHP_FE(caca_flush_figlet, NULL)
  117. PHP_FE(caca_file_open, NULL)
  118. PHP_FE(caca_file_close, NULL)
  119. PHP_FE(caca_file_tell, NULL)
  120. PHP_FE(caca_file_read, NULL)
  121. PHP_FE(caca_file_write, NULL)
  122. PHP_FE(caca_file_gets, NULL)
  123. PHP_FE(caca_file_eof, NULL)
  124. PHP_FE(caca_import_string, NULL)
  125. PHP_FE(caca_import_file, NULL)
  126. PHP_FE(caca_get_import_list, NULL)
  127. PHP_FE(caca_export_string, NULL)
  128. PHP_FE(caca_get_export_list, NULL)
  129. PHP_FE(caca_create_display, NULL)
  130. PHP_FE(caca_create_display_with_driver, NULL)
  131. PHP_FE(caca_get_display_driver_list, NULL)
  132. PHP_FE(caca_get_display_driver, NULL)
  133. PHP_FE(caca_set_display_driver, NULL)
  134. PHP_FE(caca_get_canvas, NULL)
  135. PHP_FE(caca_refresh_display, NULL)
  136. PHP_FE(caca_set_display_time, NULL)
  137. PHP_FE(caca_get_display_time, NULL)
  138. PHP_FE(caca_get_display_width, NULL)
  139. PHP_FE(caca_get_display_height, NULL)
  140. PHP_FE(caca_set_display_title, NULL)
  141. PHP_FE(caca_set_mouse, NULL)
  142. PHP_FE(caca_set_cursor, NULL)
  143. PHP_FE(caca_get_event, NULL)
  144. PHP_FE(caca_get_mouse_x, NULL)
  145. PHP_FE(caca_get_mouse_y, NULL)
  146. PHP_FE(caca_get_event_type, NULL)
  147. PHP_FE(caca_get_event_key_ch, NULL)
  148. PHP_FE(caca_get_event_mouse_button, NULL)
  149. PHP_FE(caca_get_event_mouse_x, NULL)
  150. PHP_FE(caca_get_event_mouse_y, NULL)
  151. PHP_FE(caca_get_event_resize_width, NULL)
  152. PHP_FE(caca_get_event_resize_height, NULL)
  153. {NULL, NULL, NULL}
  154. };
  155. zend_module_entry caca_module_entry = {
  156. #if ZEND_MODULE_API_NO >= 20010901
  157. STANDARD_MODULE_HEADER,
  158. #endif
  159. PHP_CACA_EXTNAME,
  160. caca_functions,
  161. PHP_MINIT(caca),
  162. NULL,
  163. NULL,
  164. NULL,
  165. PHP_MINFO(caca),
  166. #if ZEND_MODULE_API_NO >= 20010901
  167. PHP_CACA_VERSION,
  168. #endif
  169. STANDARD_MODULE_PROPERTIES
  170. };
  171. #ifdef COMPILE_DL_CACA
  172. ZEND_GET_MODULE(caca)
  173. #endif
  174. PHP_MINFO_FUNCTION(caca) {
  175. php_info_print_table_start();
  176. php_info_print_table_row(2, "Caca library version", caca_get_version());
  177. php_info_print_table_end();
  178. }
  179. //-------- Caca's ressources destructors -----------//
  180. static void php_caca_canvas_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  181. caca_free_canvas(rsrc->ptr);
  182. }
  183. static void php_caca_dither_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  184. caca_free_dither(rsrc->ptr);
  185. }
  186. static void php_caca_font_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  187. caca_free_font(rsrc->ptr);
  188. }
  189. static void php_caca_file_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  190. }
  191. static void php_caca_display_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  192. caca_free_display(rsrc->ptr);
  193. }
  194. static void php_caca_event_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  195. efree((caca_event_t *) rsrc->ptr);
  196. }
  197. //-------- Initialization ---------//
  198. PHP_MINIT_FUNCTION(caca) {
  199. le_caca_canvas = zend_register_list_destructors_ex(php_caca_canvas_dtor, NULL, PHP_CACA_CANVAS_RES_NAME, module_number);
  200. le_caca_dither = zend_register_list_destructors_ex(php_caca_dither_dtor, NULL, PHP_CACA_DITHER_RES_NAME, module_number);
  201. le_caca_font = zend_register_list_destructors_ex(php_caca_font_dtor, NULL, PHP_CACA_FONT_RES_NAME, module_number);
  202. le_caca_file = zend_register_list_destructors_ex(php_caca_file_dtor, NULL, PHP_CACA_FILE_RES_NAME, module_number);
  203. le_caca_display = zend_register_list_destructors_ex(php_caca_display_dtor, NULL, PHP_CACA_DISPLAY_RES_NAME, module_number);
  204. le_caca_event = zend_register_list_destructors_ex(php_caca_event_dtor, NULL, PHP_CACA_EVENT_RES_NAME, module_number);
  205. REGISTER_LONG_CONSTANT("CACA_BLACK", CACA_BLACK, CONST_CS | CONST_PERSISTENT);
  206. REGISTER_LONG_CONSTANT("CACA_BLUE", CACA_BLUE, CONST_CS | CONST_PERSISTENT);
  207. REGISTER_LONG_CONSTANT("CACA_GREEN", CACA_GREEN, CONST_CS | CONST_PERSISTENT);
  208. REGISTER_LONG_CONSTANT("CACA_CYAN", CACA_CYAN, CONST_CS | CONST_PERSISTENT);
  209. REGISTER_LONG_CONSTANT("CACA_RED", CACA_RED, CONST_CS | CONST_PERSISTENT);
  210. REGISTER_LONG_CONSTANT("CACA_MAGENTA", CACA_MAGENTA, CONST_CS | CONST_PERSISTENT);
  211. REGISTER_LONG_CONSTANT("CACA_BROWN", CACA_BROWN, CONST_CS | CONST_PERSISTENT);
  212. REGISTER_LONG_CONSTANT("CACA_LIGHTGRAY", CACA_LIGHTGRAY, CONST_CS | CONST_PERSISTENT);
  213. REGISTER_LONG_CONSTANT("CACA_DARKGRAY", CACA_DARKGRAY, CONST_CS | CONST_PERSISTENT);
  214. REGISTER_LONG_CONSTANT("CACA_LIGHTBLUE", CACA_LIGHTBLUE, CONST_CS | CONST_PERSISTENT);
  215. REGISTER_LONG_CONSTANT("CACA_LIGHTGREEN", CACA_LIGHTGREEN, CONST_CS | CONST_PERSISTENT);
  216. REGISTER_LONG_CONSTANT("CACA_LIGHTCYAN", CACA_LIGHTCYAN, CONST_CS | CONST_PERSISTENT);
  217. REGISTER_LONG_CONSTANT("CACA_LIGHTRED", CACA_LIGHTRED, CONST_CS | CONST_PERSISTENT);
  218. REGISTER_LONG_CONSTANT("CACA_LIGHTMAGENTA", CACA_LIGHTMAGENTA, CONST_CS | CONST_PERSISTENT);
  219. REGISTER_LONG_CONSTANT("CACA_YELLOW", CACA_YELLOW, CONST_CS | CONST_PERSISTENT);
  220. REGISTER_LONG_CONSTANT("CACA_WHITE", CACA_WHITE, CONST_CS | CONST_PERSISTENT);
  221. REGISTER_LONG_CONSTANT("CACA_DEFAULT", CACA_DEFAULT, CONST_CS | CONST_PERSISTENT);
  222. REGISTER_LONG_CONSTANT("CACA_TRANSPARENT", CACA_TRANSPARENT, CONST_CS | CONST_PERSISTENT);
  223. REGISTER_LONG_CONSTANT("CACA_BOLD", CACA_BOLD, CONST_CS | CONST_PERSISTENT);
  224. REGISTER_LONG_CONSTANT("CACA_ITALICS", CACA_ITALICS, CONST_CS | CONST_PERSISTENT);
  225. REGISTER_LONG_CONSTANT("CACA_UNDERLINE", CACA_UNDERLINE, CONST_CS | CONST_PERSISTENT);
  226. REGISTER_LONG_CONSTANT("CACA_BLINK", CACA_BLINK, CONST_CS | CONST_PERSISTENT);
  227. REGISTER_LONG_CONSTANT("CACA_EVENT_NONE", CACA_EVENT_NONE, CONST_CS | CONST_PERSISTENT);
  228. REGISTER_LONG_CONSTANT("CACA_EVENT_KEY_PRESS", CACA_EVENT_KEY_PRESS, CONST_CS | CONST_PERSISTENT);
  229. REGISTER_LONG_CONSTANT("CACA_EVENT_KEY_RELEASE", CACA_EVENT_KEY_RELEASE, CONST_CS | CONST_PERSISTENT);
  230. REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_PRESS", CACA_EVENT_MOUSE_PRESS, CONST_CS | CONST_PERSISTENT);
  231. REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_RELEASE", CACA_EVENT_MOUSE_RELEASE, CONST_CS | CONST_PERSISTENT);
  232. REGISTER_LONG_CONSTANT("CACA_EVENT_MOUSE_MOTION", CACA_EVENT_MOUSE_MOTION, CONST_CS | CONST_PERSISTENT);
  233. REGISTER_LONG_CONSTANT("CACA_EVENT_RESIZE", CACA_EVENT_RESIZE, CONST_CS | CONST_PERSISTENT);
  234. REGISTER_LONG_CONSTANT("CACA_EVENT_QUIT", CACA_EVENT_QUIT, CONST_CS | CONST_PERSISTENT);
  235. REGISTER_LONG_CONSTANT("CACA_EVENT_ANY", CACA_EVENT_ANY, CONST_CS | CONST_PERSISTENT);
  236. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_A", CACA_KEY_CTRL_A, CONST_CS | CONST_PERSISTENT);
  237. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_B", CACA_KEY_CTRL_B, CONST_CS | CONST_PERSISTENT);
  238. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_C", CACA_KEY_CTRL_C, CONST_CS | CONST_PERSISTENT);
  239. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_D", CACA_KEY_CTRL_D, CONST_CS | CONST_PERSISTENT);
  240. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_E", CACA_KEY_CTRL_E, CONST_CS | CONST_PERSISTENT);
  241. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_F", CACA_KEY_CTRL_F, CONST_CS | CONST_PERSISTENT);
  242. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_G", CACA_KEY_CTRL_G, CONST_CS | CONST_PERSISTENT);
  243. REGISTER_LONG_CONSTANT("CACA_KEY_BACKSPACE", CACA_KEY_BACKSPACE, CONST_CS | CONST_PERSISTENT);
  244. REGISTER_LONG_CONSTANT("CACA_KEY_TAB", CACA_KEY_TAB, CONST_CS | CONST_PERSISTENT);
  245. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_J", CACA_KEY_CTRL_J, CONST_CS | CONST_PERSISTENT);
  246. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_K", CACA_KEY_CTRL_K, CONST_CS | CONST_PERSISTENT);
  247. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_L", CACA_KEY_CTRL_L, CONST_CS | CONST_PERSISTENT);
  248. REGISTER_LONG_CONSTANT("CACA_KEY_RETURN", CACA_KEY_RETURN, CONST_CS | CONST_PERSISTENT);
  249. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_N", CACA_KEY_CTRL_N, CONST_CS | CONST_PERSISTENT);
  250. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_O", CACA_KEY_CTRL_O, CONST_CS | CONST_PERSISTENT);
  251. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_P", CACA_KEY_CTRL_P, CONST_CS | CONST_PERSISTENT);
  252. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Q", CACA_KEY_CTRL_Q, CONST_CS | CONST_PERSISTENT);
  253. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_R", CACA_KEY_CTRL_R, CONST_CS | CONST_PERSISTENT);
  254. REGISTER_LONG_CONSTANT("CACA_KEY_PAUSE", CACA_KEY_PAUSE, CONST_CS | CONST_PERSISTENT);
  255. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_T", CACA_KEY_CTRL_T, CONST_CS | CONST_PERSISTENT);
  256. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_U", CACA_KEY_CTRL_U, CONST_CS | CONST_PERSISTENT);
  257. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_V", CACA_KEY_CTRL_V, CONST_CS | CONST_PERSISTENT);
  258. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_W", CACA_KEY_CTRL_W, CONST_CS | CONST_PERSISTENT);
  259. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_X", CACA_KEY_CTRL_X, CONST_CS | CONST_PERSISTENT);
  260. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Y", CACA_KEY_CTRL_Y, CONST_CS | CONST_PERSISTENT);
  261. REGISTER_LONG_CONSTANT("CACA_KEY_CTRL_Z", CACA_KEY_CTRL_Z, CONST_CS | CONST_PERSISTENT);
  262. REGISTER_LONG_CONSTANT("CACA_KEY_ESCAPE", CACA_KEY_ESCAPE, CONST_CS | CONST_PERSISTENT);
  263. REGISTER_LONG_CONSTANT("CACA_KEY_DELETE", CACA_KEY_DELETE, CONST_CS | CONST_PERSISTENT);
  264. REGISTER_LONG_CONSTANT("CACA_KEY_UP", CACA_KEY_UP, CONST_CS | CONST_PERSISTENT);
  265. REGISTER_LONG_CONSTANT("CACA_KEY_DOWN", CACA_KEY_DOWN, CONST_CS | CONST_PERSISTENT);
  266. REGISTER_LONG_CONSTANT("CACA_KEY_LEFT", CACA_KEY_LEFT, CONST_CS | CONST_PERSISTENT);
  267. REGISTER_LONG_CONSTANT("CACA_KEY_RIGHT", CACA_KEY_RIGHT, CONST_CS | CONST_PERSISTENT);
  268. REGISTER_LONG_CONSTANT("CACA_KEY_INSERT", CACA_KEY_INSERT, CONST_CS | CONST_PERSISTENT);
  269. REGISTER_LONG_CONSTANT("CACA_KEY_HOME", CACA_KEY_HOME, CONST_CS | CONST_PERSISTENT);
  270. REGISTER_LONG_CONSTANT("CACA_KEY_END", CACA_KEY_END, CONST_CS | CONST_PERSISTENT);
  271. REGISTER_LONG_CONSTANT("CACA_KEY_PAGEUP", CACA_KEY_PAGEUP, CONST_CS | CONST_PERSISTENT);
  272. REGISTER_LONG_CONSTANT("CACA_KEY_PAGEDOWN", CACA_KEY_PAGEDOWN, CONST_CS | CONST_PERSISTENT);
  273. REGISTER_LONG_CONSTANT("CACA_KEY_F1", CACA_KEY_F1, CONST_CS | CONST_PERSISTENT);
  274. REGISTER_LONG_CONSTANT("CACA_KEY_F2", CACA_KEY_F2, CONST_CS | CONST_PERSISTENT);
  275. REGISTER_LONG_CONSTANT("CACA_KEY_F3", CACA_KEY_F3, CONST_CS | CONST_PERSISTENT);
  276. REGISTER_LONG_CONSTANT("CACA_KEY_F4", CACA_KEY_F4, CONST_CS | CONST_PERSISTENT);
  277. REGISTER_LONG_CONSTANT("CACA_KEY_F5", CACA_KEY_F5, CONST_CS | CONST_PERSISTENT);
  278. REGISTER_LONG_CONSTANT("CACA_KEY_F6", CACA_KEY_F6, CONST_CS | CONST_PERSISTENT);
  279. REGISTER_LONG_CONSTANT("CACA_KEY_F7", CACA_KEY_F7, CONST_CS | CONST_PERSISTENT);
  280. REGISTER_LONG_CONSTANT("CACA_KEY_F8", CACA_KEY_F8, CONST_CS | CONST_PERSISTENT);
  281. REGISTER_LONG_CONSTANT("CACA_KEY_F9", CACA_KEY_F9, CONST_CS | CONST_PERSISTENT);
  282. REGISTER_LONG_CONSTANT("CACA_KEY_F10", CACA_KEY_F10, CONST_CS | CONST_PERSISTENT);
  283. REGISTER_LONG_CONSTANT("CACA_KEY_F11", CACA_KEY_F11, CONST_CS | CONST_PERSISTENT);
  284. REGISTER_LONG_CONSTANT("CACA_KEY_F12", CACA_KEY_F12, CONST_CS | CONST_PERSISTENT);
  285. REGISTER_LONG_CONSTANT("CACA_KEY_F13", CACA_KEY_F13, CONST_CS | CONST_PERSISTENT);
  286. REGISTER_LONG_CONSTANT("CACA_KEY_F14", CACA_KEY_F14, CONST_CS | CONST_PERSISTENT);
  287. REGISTER_LONG_CONSTANT("CACA_KEY_F15", CACA_KEY_F15, CONST_CS | CONST_PERSISTENT);
  288. return SUCCESS;
  289. }
  290. //---------- Some usefull macros ---------------//
  291. #define FETCH_CANVAS(canvas) \
  292. zval *_zval; \
  293. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
  294. RETURN_FALSE; \
  295. } \
  296. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  297. #define FETCH_DISPLAY(display) \
  298. zval *_zval; \
  299. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
  300. RETURN_FALSE; \
  301. } \
  302. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  303. #define FETCH_EVENT(event) \
  304. zval *_zval; \
  305. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \
  306. RETURN_FALSE; \
  307. } \
  308. ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event);
  309. #define FETCH_LONG(l) \
  310. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &l) == FAILURE) { \
  311. RETURN_FALSE; \
  312. }
  313. #define RETURN_CHAR(c) \
  314. char *str = emalloc(2); \
  315. str[0] = c; \
  316. str[1] = '\0'; \
  317. RETURN_STRING(str, 0);
  318. #define RETURN_SUCCESS(i) \
  319. RETURN_BOOL((i) == 0);
  320. //---------- Some usefull functions --------------------//
  321. //Fetch external php resources such as gd resouces
  322. void *fetch_external_resource(zval *_zval, char const *type_name) {
  323. int resource_id = _zval->value.lval;
  324. int resource_type;
  325. void *result = zend_list_find(resource_id, &resource_type);
  326. if (!result)
  327. return NULL;
  328. char *resource_type_name = zend_rsrc_list_get_rsrc_type(resource_id);
  329. return (strcmp(resource_type_name, type_name) == 0) ? result : NULL;
  330. }
  331. //Fetch buffer of pixels from gdImage
  332. void *gd_get_pixels(gdImage *img) {
  333. if (img->trueColor) {
  334. int line_size = img->sx * sizeof(int);
  335. void *result = malloc(img->sy * line_size);
  336. int j;
  337. for (j = 0; j < img->sy; j++)
  338. memcpy(result + (j * line_size), (const void *) img->tpixels[j], line_size);
  339. return result;
  340. }
  341. else {
  342. int line_size = img->sx * sizeof(char);
  343. void *result = malloc(img->sy * line_size);
  344. int j;
  345. for (j = 0; j < img->sy; j++)
  346. memcpy(result + (j * line_size), (const void *) img->pixels[j], line_size);
  347. return result;
  348. }
  349. }
  350. //------- PHP Binding's specific functions ----------//
  351. //TODO: register new resources in caca_get_event and remove caca_create_event
  352. PHP_FUNCTION(caca_create_event) {
  353. caca_event_t *event;
  354. event = emalloc(sizeof(caca_event_t));
  355. if (!event) {
  356. RETURN_FALSE;
  357. }
  358. ZEND_REGISTER_RESOURCE(return_value, event, le_caca_event);
  359. }
  360. //------- Caca's functions ----------------//
  361. PHP_FUNCTION(caca_create_canvas) {
  362. long width, height = 0;
  363. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  364. RETURN_FALSE;
  365. }
  366. caca_canvas_t *canvas = caca_create_canvas(width, height);
  367. if (!canvas) {
  368. RETURN_FALSE;
  369. }
  370. ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
  371. }
  372. PHP_FUNCTION(caca_set_canvas_size) {
  373. zval *_zval;
  374. long width, height = 0;
  375. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &width, &height) == FAILURE) {
  376. RETURN_FALSE;
  377. }
  378. caca_canvas_t *canvas;
  379. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  380. RETURN_SUCCESS(caca_set_canvas_size(canvas, width, height));
  381. }
  382. PHP_FUNCTION(caca_get_canvas_width) {
  383. caca_canvas_t *canvas;
  384. FETCH_CANVAS(canvas);
  385. RETURN_LONG(caca_get_canvas_width(canvas));
  386. }
  387. PHP_FUNCTION(caca_get_canvas_height) {
  388. caca_canvas_t *canvas;
  389. FETCH_CANVAS(canvas);
  390. RETURN_LONG(caca_get_canvas_height(canvas));
  391. }
  392. PHP_FUNCTION(caca_get_canvas_chars) {
  393. caca_canvas_t *canvas;
  394. FETCH_CANVAS(canvas);
  395. RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1);
  396. }
  397. PHP_FUNCTION(caca_get_canvas_attrs) {
  398. caca_canvas_t *canvas;
  399. FETCH_CANVAS(canvas);
  400. RETURN_STRING((char *) caca_get_canvas_attrs(canvas), 1);
  401. }
  402. PHP_FUNCTION(caca_rand) {
  403. long min, max = 0;
  404. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &min, &max) == FAILURE) {
  405. RETURN_FALSE;
  406. }
  407. RETURN_LONG(caca_rand(min, max));
  408. }
  409. PHP_FUNCTION(caca_get_version) {
  410. RETURN_STRING((char *) caca_get_version(), 1);
  411. }
  412. PHP_FUNCTION(caca_gotoxy) {
  413. zval *_zval;
  414. long x, y = 0;
  415. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  416. RETURN_FALSE;
  417. }
  418. caca_canvas_t *canvas;
  419. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  420. RETURN_SUCCESS(caca_gotoxy(canvas, x, y));
  421. }
  422. PHP_FUNCTION(caca_get_cursor_x) {
  423. caca_canvas_t *canvas;
  424. FETCH_CANVAS(canvas);
  425. RETURN_LONG(caca_get_cursor_x(canvas));
  426. }
  427. PHP_FUNCTION(caca_get_cursor_y) {
  428. caca_canvas_t *canvas;
  429. FETCH_CANVAS(canvas);
  430. RETURN_LONG(caca_get_cursor_y(canvas));
  431. }
  432. PHP_FUNCTION(caca_put_char) {
  433. zval *_zval;
  434. long x, y, c;
  435. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &_zval, &x, &y, &c) == FAILURE) {
  436. RETURN_FALSE;
  437. }
  438. caca_canvas_t *canvas;
  439. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  440. RETURN_SUCCESS(caca_put_char(canvas, x, y, c));
  441. }
  442. PHP_FUNCTION(caca_get_char) {
  443. zval *_zval;
  444. long x, y = 0;
  445. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  446. RETURN_FALSE;
  447. }
  448. caca_canvas_t *canvas;
  449. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  450. RETURN_CHAR(caca_get_char(canvas, x, y));
  451. }
  452. PHP_FUNCTION(caca_put_str) {
  453. zval *_zval;
  454. char *str;
  455. long x, y, str_len = 0;
  456. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlls", &_zval, &x, &y, &str, &str_len) == FAILURE) {
  457. RETURN_FALSE;
  458. }
  459. caca_canvas_t *canvas;
  460. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  461. RETURN_SUCCESS(caca_put_str(canvas, x, y, str));
  462. }
  463. PHP_FUNCTION(caca_clear_canvas) {
  464. caca_canvas_t *canvas;
  465. FETCH_CANVAS(canvas);
  466. RETURN_LONG(caca_clear_canvas(canvas));
  467. }
  468. PHP_FUNCTION(caca_set_canvas_handle) {
  469. zval *_zval;
  470. long x, y = 0;
  471. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  472. RETURN_FALSE;
  473. }
  474. caca_canvas_t *canvas;
  475. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  476. RETURN_SUCCESS(caca_set_canvas_handle(canvas, x, y));
  477. }
  478. PHP_FUNCTION(caca_get_canvas_handle_x) {
  479. caca_canvas_t *canvas;
  480. FETCH_CANVAS(canvas);
  481. RETURN_LONG(caca_get_canvas_handle_x(canvas));
  482. }
  483. PHP_FUNCTION(caca_get_canvas_handle_y) {
  484. caca_canvas_t *canvas;
  485. FETCH_CANVAS(canvas);
  486. RETURN_LONG(caca_get_canvas_handle_y(canvas));
  487. }
  488. PHP_FUNCTION(caca_blit) {
  489. zval *_zval1, *_zval2, *_zval3 = NULL;
  490. long x, y = 0;
  491. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllr|r", &_zval1, &x, &y, &_zval2, &_zval3) == FAILURE) {
  492. RETURN_FALSE;
  493. }
  494. caca_canvas_t *dst, *src, *mask = NULL;
  495. ZEND_FETCH_RESOURCE(dst, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  496. ZEND_FETCH_RESOURCE(src, caca_canvas_t*, &_zval2, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  497. if (_zval3) {
  498. ZEND_FETCH_RESOURCE(mask, caca_canvas_t*, &_zval3, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  499. }
  500. RETURN_SUCCESS(caca_blit(dst, x, y, src, NULL));
  501. }
  502. PHP_FUNCTION(caca_set_canvas_boundaries) {
  503. zval *_zval;
  504. long x, y, width, height = 0;
  505. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &x, &y, &width, &height) == FAILURE) {
  506. RETURN_FALSE;
  507. }
  508. caca_canvas_t *canvas;
  509. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  510. RETURN_SUCCESS(caca_set_canvas_boundaries(canvas, x, y, width, height));
  511. }
  512. PHP_FUNCTION(caca_invert) {
  513. caca_canvas_t *canvas;
  514. FETCH_CANVAS(canvas);
  515. RETURN_SUCCESS(caca_invert(canvas));
  516. }
  517. PHP_FUNCTION(caca_flip) {
  518. caca_canvas_t *canvas;
  519. FETCH_CANVAS(canvas);
  520. RETURN_SUCCESS(caca_flip(canvas));
  521. }
  522. PHP_FUNCTION(caca_flop) {
  523. caca_canvas_t *canvas;
  524. FETCH_CANVAS(canvas);
  525. RETURN_SUCCESS(caca_flop(canvas));
  526. }
  527. PHP_FUNCTION(caca_rotate_180) {
  528. caca_canvas_t *canvas;
  529. FETCH_CANVAS(canvas);
  530. RETURN_SUCCESS(caca_rotate_180(canvas));
  531. }
  532. PHP_FUNCTION(caca_rotate_left) {
  533. caca_canvas_t *canvas;
  534. FETCH_CANVAS(canvas);
  535. RETURN_SUCCESS(caca_rotate_left(canvas));
  536. }
  537. PHP_FUNCTION(caca_rotate_right) {
  538. caca_canvas_t *canvas;
  539. FETCH_CANVAS(canvas);
  540. RETURN_SUCCESS(caca_rotate_right(canvas));
  541. }
  542. PHP_FUNCTION(caca_stretch_left) {
  543. caca_canvas_t *canvas;
  544. FETCH_CANVAS(canvas);
  545. RETURN_SUCCESS(caca_stretch_left(canvas));
  546. }
  547. PHP_FUNCTION(caca_stretch_right) {
  548. caca_canvas_t *canvas;
  549. FETCH_CANVAS(canvas);
  550. RETURN_SUCCESS(caca_stretch_right(canvas));
  551. }
  552. PHP_FUNCTION(caca_get_attr) {
  553. zval *_zval;
  554. long x, y = 0;
  555. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  556. RETURN_FALSE;
  557. }
  558. caca_canvas_t *canvas;
  559. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  560. RETURN_LONG(caca_get_attr(canvas, x, y));
  561. }
  562. PHP_FUNCTION(caca_set_attr) {
  563. zval *_zval;
  564. long attr = 0;
  565. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &attr) == FAILURE) {
  566. RETURN_FALSE;
  567. }
  568. caca_canvas_t *canvas;
  569. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  570. RETURN_SUCCESS(caca_set_attr(canvas, attr));
  571. }
  572. PHP_FUNCTION(caca_put_attr) {
  573. zval *_zval;
  574. long x, y, attr = 0;
  575. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &_zval, &x, &y, &attr) == FAILURE) {
  576. RETURN_FALSE;
  577. }
  578. caca_canvas_t *canvas;
  579. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  580. RETURN_SUCCESS(caca_put_attr(canvas, x, y, attr));
  581. }
  582. PHP_FUNCTION(caca_set_color_ansi) {
  583. zval *_zval;
  584. long foreground, background = 0;
  585. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
  586. RETURN_FALSE;
  587. }
  588. caca_canvas_t *canvas;
  589. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  590. RETURN_SUCCESS(caca_set_color_ansi(canvas, foreground, background));
  591. }
  592. PHP_FUNCTION(caca_set_color_argb) {
  593. zval *_zval;
  594. long foreground, background = 0;
  595. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
  596. RETURN_FALSE;
  597. }
  598. caca_canvas_t *canvas;
  599. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  600. RETURN_SUCCESS(caca_set_color_argb(canvas, foreground, background));
  601. }
  602. PHP_FUNCTION(caca_attr_to_ansi) {
  603. long l;
  604. FETCH_LONG(l);
  605. RETURN_LONG(caca_attr_to_ansi(l));
  606. }
  607. PHP_FUNCTION(caca_attr_to_ansi_fg) {
  608. long l;
  609. FETCH_LONG(l);
  610. RETURN_LONG(caca_attr_to_ansi_fg(l));
  611. }
  612. PHP_FUNCTION(caca_attr_to_ansi_bg) {
  613. long l;
  614. FETCH_LONG(l);
  615. RETURN_LONG(caca_attr_to_ansi_bg(l));
  616. }
  617. PHP_FUNCTION(caca_attr_to_rgb12_fg) {
  618. long l;
  619. FETCH_LONG(l);
  620. RETURN_LONG(caca_attr_to_rgb12_fg(l));
  621. }
  622. PHP_FUNCTION(caca_attr_to_rgb12_bg) {
  623. long l;
  624. FETCH_LONG(l);
  625. RETURN_LONG(caca_attr_to_rgb12_bg(l));
  626. }
  627. PHP_FUNCTION(caca_attr_to_argb64) {
  628. }
  629. PHP_FUNCTION(caca_utf8_to_utf32) {
  630. }
  631. PHP_FUNCTION(caca_utf32_to_utf8) {
  632. }
  633. PHP_FUNCTION(caca_utf32_to_cp437) {
  634. long l;
  635. FETCH_LONG(l);
  636. RETURN_LONG(caca_utf32_to_cp437(l));
  637. }
  638. PHP_FUNCTION(caca_cp437_to_utf32) {
  639. long l;
  640. FETCH_LONG(l);
  641. RETURN_LONG(caca_cp437_to_utf32(l));
  642. }
  643. PHP_FUNCTION(caca_utf32_to_ascii) {
  644. long l;
  645. FETCH_LONG(l);
  646. RETURN_CHAR(caca_utf32_to_ascii(l));
  647. }
  648. PHP_FUNCTION(caca_utf32_is_fullwidth) {
  649. }
  650. PHP_FUNCTION(caca_draw_line) {
  651. zval *_zval;
  652. long xa, ya, xb, yb, c;
  653. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &_zval, &xa, &ya, &xb, &yb, &c) == FAILURE) {
  654. RETURN_FALSE;
  655. }
  656. caca_canvas_t *canvas;
  657. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  658. RETURN_SUCCESS(caca_draw_line(canvas, xa, ya, xb, yb, c));
  659. }
  660. PHP_FUNCTION(caca_draw_polyline) {
  661. zval *zval_res, *zval_arr;
  662. long c;
  663. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ral", &zval_res, &zval_arr, &c) == FAILURE) {
  664. RETURN_FALSE;
  665. }
  666. caca_canvas_t *canvas;
  667. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &zval_res, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  668. HashTable *arr_hash = Z_ARRVAL_P(zval_arr);
  669. int lenmax = zend_hash_num_elements(arr_hash);
  670. int *tbl_x, *tbl_y;
  671. int tbl_count = 0;
  672. tbl_x = malloc(sizeof(int) * lenmax);
  673. tbl_y = malloc(sizeof(int) * lenmax);
  674. HashPosition pos;
  675. zval **pt, **x, **y;
  676. for (
  677. zend_hash_internal_pointer_reset_ex(arr_hash, &pos);
  678. zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS;
  679. zend_hash_move_forward_ex(arr_hash, &pos)
  680. ) {
  681. if (
  682. Z_TYPE_P(*pt) == IS_ARRAY
  683. && (zend_hash_index_find(Z_ARRVAL_P(*pt), 0, (void**) &x) != FAILURE)
  684. && (zend_hash_index_find(Z_ARRVAL_P(*pt), 1, (void**) &y) != FAILURE)
  685. ) {
  686. convert_to_long_ex(x);
  687. convert_to_long_ex(y);
  688. tbl_x[tbl_count] = Z_LVAL_PP(x);
  689. tbl_y[tbl_count] = Z_LVAL_PP(y);
  690. tbl_count++;
  691. }
  692. }
  693. int res = caca_draw_polyline(canvas, tbl_x, tbl_y, tbl_count - 1, c);
  694. free(tbl_x);
  695. free(tbl_y);
  696. RETURN_SUCCESS(res);
  697. }
  698. PHP_FUNCTION(caca_draw_thin_line) {
  699. zval *_zval;
  700. long xa, ya, xb, yb = 0;
  701. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  702. RETURN_FALSE;
  703. }
  704. caca_canvas_t *canvas;
  705. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  706. RETURN_SUCCESS(caca_draw_thin_line(canvas, xa, ya, xb, yb));
  707. }
  708. PHP_FUNCTION(caca_draw_thin_polyline) {
  709. zval *zval_res, *zval_arr;
  710. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &zval_res, &zval_arr) == FAILURE) {
  711. RETURN_FALSE;
  712. }
  713. caca_canvas_t *canvas;
  714. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &zval_res, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  715. HashTable *arr_hash = Z_ARRVAL_P(zval_arr);
  716. int lenmax = zend_hash_num_elements(arr_hash);
  717. int *tbl_x, *tbl_y;
  718. int tbl_count = 0;
  719. tbl_x = malloc(sizeof(int) * lenmax);
  720. tbl_y = malloc(sizeof(int) * lenmax);
  721. HashPosition pos;
  722. zval **pt, **x, **y;
  723. for (
  724. zend_hash_internal_pointer_reset_ex(arr_hash, &pos);
  725. zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS;
  726. zend_hash_move_forward_ex(arr_hash, &pos)
  727. ) {
  728. if (
  729. Z_TYPE_P(*pt) == IS_ARRAY
  730. && (zend_hash_index_find(Z_ARRVAL_P(*pt), 0, (void**) &x) != FAILURE)
  731. && (zend_hash_index_find(Z_ARRVAL_P(*pt), 1, (void**) &y) != FAILURE)
  732. ) {
  733. convert_to_long_ex(x);
  734. convert_to_long_ex(y);
  735. tbl_x[tbl_count] = Z_LVAL_PP(x);
  736. tbl_y[tbl_count] = Z_LVAL_PP(y);
  737. tbl_count++;
  738. }
  739. }
  740. int res = caca_draw_thin_polyline(canvas, tbl_x, tbl_y, tbl_count - 1);
  741. free(tbl_x);
  742. free(tbl_y);
  743. RETURN_SUCCESS(res);
  744. }
  745. PHP_FUNCTION(caca_draw_circle) {
  746. zval *_zval;
  747. long x, y, r, c;
  748. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &x, &y, &r, &c) == FAILURE) {
  749. RETURN_FALSE;
  750. }
  751. caca_canvas_t *canvas;
  752. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  753. RETURN_SUCCESS(caca_draw_circle(canvas, x, y, r, c));
  754. }
  755. PHP_FUNCTION(caca_draw_ellipse) {
  756. zval *_zval;
  757. long xa, ya, xb, yb, c = 0;
  758. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &_zval, &xa, &ya, &xb, &yb, &c) == FAILURE) {
  759. RETURN_FALSE;
  760. }
  761. caca_canvas_t *canvas;
  762. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  763. RETURN_SUCCESS(caca_draw_ellipse(canvas, xa, ya, xb, yb, c));
  764. }
  765. PHP_FUNCTION(caca_draw_thin_ellipse) {
  766. zval *_zval;
  767. long xa, ya, xb, yb = 0;
  768. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  769. RETURN_FALSE;
  770. }
  771. caca_canvas_t *canvas;
  772. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  773. RETURN_SUCCESS(caca_draw_thin_ellipse(canvas, xa, ya, xb, yb));
  774. }
  775. PHP_FUNCTION(caca_fill_ellipse) {
  776. zval *_zval;
  777. long xa, ya, xb, yb, c;
  778. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &_zval, &xa, &ya, &xb, &yb, &c) == FAILURE) {
  779. RETURN_FALSE;
  780. }
  781. caca_canvas_t *canvas;
  782. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  783. RETURN_SUCCESS(caca_fill_ellipse(canvas, xa, ya, xb, yb, c));
  784. }
  785. PHP_FUNCTION(caca_draw_box) {
  786. zval *_zval;
  787. long xa, ya, xb, yb, c;
  788. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &_zval, &xa, &ya, &xb, &yb, &c) == FAILURE) {
  789. RETURN_FALSE;
  790. }
  791. caca_canvas_t *canvas;
  792. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  793. RETURN_SUCCESS(caca_draw_box(canvas, xa, ya, xb, yb, c));
  794. }
  795. PHP_FUNCTION(caca_draw_thin_box) {
  796. zval *_zval;
  797. long xa, ya, xb, yb = 0;
  798. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  799. RETURN_FALSE;
  800. }
  801. caca_canvas_t *canvas;
  802. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  803. RETURN_SUCCESS(caca_draw_thin_box(canvas, xa, ya, xb, yb));
  804. }
  805. PHP_FUNCTION(caca_draw_cp437_box) {
  806. zval *_zval;
  807. long xa, ya, xb, yb;
  808. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  809. RETURN_FALSE;
  810. }
  811. caca_canvas_t *canvas;
  812. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  813. RETURN_SUCCESS(caca_draw_cp437_box(canvas, xa, ya, xb, yb));
  814. }
  815. PHP_FUNCTION(caca_fill_box) {
  816. zval *_zval;
  817. long xa, ya, xb, yb, c;
  818. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &_zval, &xa, &ya, &xb, &yb, &c) == FAILURE) {
  819. RETURN_FALSE;
  820. }
  821. caca_canvas_t *canvas;
  822. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  823. RETURN_SUCCESS(caca_fill_box(canvas, xa, ya, xb, yb, c));
  824. }
  825. PHP_FUNCTION(caca_draw_triangle) {
  826. zval *_zval;
  827. long xa, ya, xb, yb, xc, yc, c;
  828. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &c) == FAILURE) {
  829. RETURN_FALSE;
  830. }
  831. caca_canvas_t *canvas;
  832. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  833. RETURN_SUCCESS(caca_draw_triangle(canvas, xa, ya, xb, yb, xc, yc, c));
  834. }
  835. PHP_FUNCTION(caca_draw_thin_triangle) {
  836. zval *_zval;
  837. long xa, ya, xb, yb, xc, yc = 0;
  838. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc) == FAILURE) {
  839. RETURN_FALSE;
  840. }
  841. caca_canvas_t *canvas;
  842. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  843. RETURN_SUCCESS(caca_draw_thin_triangle(canvas, xa, ya, xb, yb, xc, yc));
  844. }
  845. PHP_FUNCTION(caca_fill_triangle) {
  846. zval *_zval;
  847. long xa, ya, xb, yb, xc, yc, c = 0;
  848. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &c) == FAILURE) {
  849. RETURN_FALSE;
  850. }
  851. caca_canvas_t *canvas;
  852. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  853. RETURN_SUCCESS(caca_fill_triangle(canvas, xa, ya, xb, yb, xc, yc, c));
  854. }
  855. PHP_FUNCTION(caca_get_frame_count) {
  856. zval *_zval;
  857. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  858. RETURN_FALSE;
  859. }
  860. caca_canvas_t *canvas;
  861. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  862. RETURN_LONG(caca_get_canvas_count(canvas));
  863. }
  864. PHP_FUNCTION(caca_set_frame) {
  865. zval *_zval;
  866. long id;
  867. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
  868. RETURN_FALSE;
  869. }
  870. caca_canvas_t *canvas;
  871. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  872. RETURN_SUCCESS(caca_set_frame(canvas, id));
  873. }
  874. PHP_FUNCTION(caca_set_frame_name) {
  875. zval *_zval;
  876. char *str;
  877. long str_len;
  878. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  879. RETURN_FALSE;
  880. }
  881. caca_canvas_t *canvas;
  882. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  883. RETURN_SUCCESS(caca_set_frame_name(canvas, str));
  884. }
  885. PHP_FUNCTION(caca_create_frame) {
  886. zval *_zval;
  887. long id;
  888. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
  889. RETURN_FALSE;
  890. }
  891. caca_canvas_t *canvas;
  892. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  893. RETURN_SUCCESS(caca_create_frame(canvas, id));
  894. }
  895. PHP_FUNCTION(caca_free_frame) {
  896. zval *_zval;
  897. long id;
  898. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
  899. RETURN_FALSE;
  900. }
  901. caca_canvas_t *canvas;
  902. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  903. RETURN_SUCCESS(caca_free_frame(canvas, id));
  904. }
  905. PHP_FUNCTION(caca_create_dither) {
  906. long bpp, w, h, pitch, rmask, gmask, bmask, amask = 0;
  907. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "llllllll", &bpp, &w, &h, &pitch, &rmask, &gmask, &bmask, &amask) == FAILURE) {
  908. RETURN_FALSE;
  909. }
  910. caca_dither_t *dither = caca_create_dither(bpp, w, h, pitch, rmask, gmask, bmask, amask);
  911. ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
  912. }
  913. PHP_FUNCTION(caca_create_dither_gd) {
  914. zval *_zval;
  915. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  916. RETURN_FALSE;
  917. }
  918. gdImage *img = fetch_external_resource(_zval, "gd");
  919. if (!img) {
  920. RETURN_FALSE;
  921. }
  922. caca_dither_t *dither;
  923. if (img->trueColor)
  924. dither = caca_create_dither(sizeof(int) * 8, img->sx, img->sy, img->sx * sizeof(int), 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000);
  925. else
  926. dither = caca_create_dither(sizeof(char) * 8, img->sx, img->sy, img->sx * sizeof(char), 0, 0, 0, 0);
  927. ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
  928. }
  929. PHP_FUNCTION(caca_set_dither_palette) {
  930. zval *zval_res, *arr;
  931. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &zval_res, &arr) == FAILURE) {
  932. RETURN_FALSE;
  933. }
  934. caca_dither_t *dither;
  935. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &zval_res, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_dither);
  936. uint32_t tbl[4][256];
  937. zval **color, **value;
  938. int i, j;
  939. for (i = 0; i < 256; i++) {
  940. if (zend_hash_index_find(Z_ARRVAL_P(arr), i, (void**) &color) == FAILURE | Z_TYPE_P(*color) != IS_ARRAY) {
  941. RETURN_FALSE;
  942. }
  943. for (j = 0; j < 4; j++) {
  944. if (zend_hash_index_find(Z_ARRVAL_P(*color), j, (void**) &value) == FAILURE) {
  945. RETURN_FALSE;
  946. }
  947. convert_to_long_ex(value);
  948. tbl[j][i] = Z_LVAL_PP(value);
  949. }
  950. }
  951. RETURN_SUCCESS(caca_set_dither_palette(dither, tbl[0], tbl[1], tbl[2], tbl[3]));
  952. }
  953. PHP_FUNCTION(caca_set_dither_palette_gd) {
  954. zval *_zval1, *_zval2;
  955. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &_zval1, &_zval2) == FAILURE) {
  956. RETURN_FALSE;
  957. }
  958. caca_dither_t *dither;
  959. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_dither);
  960. gdImage *img = fetch_external_resource(_zval2, "gd");
  961. if (!img | img->trueColor | gdMaxColors != 256) {
  962. RETURN_FALSE;
  963. }
  964. uint32_t r[256], g[256], b[256], a[256];
  965. int i;
  966. for (i = 0; i < 256; i++) {
  967. r[i] = img->red[i] << 4;
  968. g[i] = img->green[i] << 4;
  969. b[i] = img->blue[i] << 4;
  970. a[i] = img->alpha[i] << 4;
  971. }
  972. RETURN_SUCCESS(caca_set_dither_palette(dither, &r[0], &g[0], &b[0], &a[0]));
  973. }
  974. PHP_FUNCTION(caca_set_dither_brightness) {
  975. zval *_zval;
  976. double value;
  977. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  978. RETURN_FALSE;
  979. }
  980. caca_dither_t *dither;
  981. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  982. RETURN_SUCCESS(caca_set_dither_brightness(dither, value));
  983. }
  984. PHP_FUNCTION(caca_get_dither_brightness) {
  985. zval *_zval;
  986. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  987. RETURN_FALSE;
  988. }
  989. caca_dither_t *dither;
  990. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  991. RETURN_DOUBLE(caca_get_dither_brightness(dither));
  992. }
  993. PHP_FUNCTION(caca_set_dither_gamma) {
  994. zval *_zval;
  995. double value;
  996. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  997. RETURN_FALSE;
  998. }
  999. caca_dither_t *dither;
  1000. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1001. RETURN_SUCCESS(caca_set_dither_gamma(dither, value));
  1002. }
  1003. PHP_FUNCTION(caca_get_dither_gamma) {
  1004. zval *_zval;
  1005. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1006. RETURN_FALSE;
  1007. }
  1008. caca_dither_t *dither;
  1009. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1010. RETURN_DOUBLE(caca_get_dither_gamma(dither));
  1011. }
  1012. PHP_FUNCTION(caca_set_dither_contrast) {
  1013. zval *_zval;
  1014. double value;
  1015. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  1016. RETURN_FALSE;
  1017. }
  1018. caca_dither_t *dither;
  1019. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1020. RETURN_SUCCESS(caca_set_dither_contrast(dither, value));
  1021. }
  1022. PHP_FUNCTION(caca_get_dither_contrast) {
  1023. zval *_zval;
  1024. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1025. RETURN_FALSE;
  1026. }
  1027. caca_dither_t *dither;
  1028. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1029. RETURN_DOUBLE(caca_get_dither_contrast(dither));
  1030. }
  1031. PHP_FUNCTION(caca_set_dither_antialias) {
  1032. zval *_zval;
  1033. int str_len;
  1034. char *str;
  1035. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1036. RETURN_FALSE;
  1037. }
  1038. caca_dither_t *dither;
  1039. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1040. RETURN_SUCCESS(caca_set_dither_antialias(dither, str));
  1041. }
  1042. PHP_FUNCTION(caca_get_dither_antialias_list) {
  1043. }
  1044. PHP_FUNCTION(caca_get_dither_antialias) {
  1045. zval *_zval;
  1046. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1047. RETURN_FALSE;
  1048. }
  1049. caca_dither_t *dither;
  1050. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1051. RETURN_STRING((char *) caca_get_dither_antialias(dither), 1);
  1052. }
  1053. PHP_FUNCTION(caca_set_dither_color) {
  1054. zval *_zval;
  1055. int str_len;
  1056. char *str;
  1057. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1058. RETURN_FALSE;
  1059. }
  1060. caca_dither_t *dither;
  1061. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1062. RETURN_SUCCESS(caca_set_dither_color(dither, str));
  1063. }
  1064. PHP_FUNCTION(caca_get_dither_color_list) {
  1065. zval *_zval;
  1066. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1067. RETURN_FALSE;
  1068. }
  1069. caca_dither_t *dither;
  1070. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1071. char const * const *list = caca_get_dither_antialias_list(dither);
  1072. int i;
  1073. array_init(return_value);
  1074. for(i = 0; list[i]; i += 2)
  1075. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1076. }
  1077. PHP_FUNCTION(caca_get_dither_color) {
  1078. zval *_zval;
  1079. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1080. RETURN_FALSE;
  1081. }
  1082. caca_dither_t *dither;
  1083. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1084. RETURN_STRING((char *) caca_get_dither_color(dither), 1);
  1085. }
  1086. PHP_FUNCTION(caca_set_dither_charset) {
  1087. zval *_zval;
  1088. int str_len;
  1089. char *str;
  1090. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1091. RETURN_FALSE;
  1092. }
  1093. caca_dither_t *dither;
  1094. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1095. RETURN_SUCCESS(caca_set_dither_charset(dither, str));
  1096. }
  1097. PHP_FUNCTION(caca_get_dither_charset_list) {
  1098. zval *_zval;
  1099. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1100. RETURN_FALSE;
  1101. }
  1102. caca_dither_t *dither;
  1103. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1104. char const * const *list = caca_get_dither_charset_list(dither);
  1105. int i;
  1106. array_init(return_value);
  1107. for(i = 0; list[i]; i += 2)
  1108. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1109. }
  1110. PHP_FUNCTION(caca_get_dither_charset) {
  1111. zval *_zval;
  1112. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1113. RETURN_FALSE;
  1114. }
  1115. caca_dither_t *dither;
  1116. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1117. RETURN_STRING((char *) caca_get_dither_charset(dither), 1);
  1118. }
  1119. PHP_FUNCTION(caca_set_dither_algorithm) {
  1120. zval *_zval;
  1121. int str_len;
  1122. char *str;
  1123. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1124. RETURN_FALSE;
  1125. }
  1126. caca_dither_t *dither;
  1127. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1128. RETURN_SUCCESS(caca_set_dither_algorithm(dither, str));
  1129. }
  1130. PHP_FUNCTION(caca_get_dither_algorithm_list) {
  1131. zval *_zval;
  1132. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1133. RETURN_FALSE;
  1134. }
  1135. caca_dither_t *dither;
  1136. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1137. char const * const *list = caca_get_dither_algorithm_list(dither);
  1138. int i;
  1139. array_init(return_value);
  1140. for(i = 0; list[i]; i += 2)
  1141. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1142. }
  1143. PHP_FUNCTION(caca_get_dither_algorithm) {
  1144. zval *_zval;
  1145. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1146. RETURN_FALSE;
  1147. }
  1148. caca_dither_t *dither;
  1149. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1150. RETURN_STRING((char *) caca_get_dither_algorithm(dither), 1);
  1151. }
  1152. PHP_FUNCTION(caca_dither_bitmap_gd) {
  1153. zval *_zval1, *_zval2, *_zval3;
  1154. long x, y, w, h = 0;
  1155. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllrr", &_zval1, &x, &y, &w, &h, &_zval2, &_zval3) == FAILURE) {
  1156. RETURN_FALSE;
  1157. }
  1158. caca_canvas_t *canvas;
  1159. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1160. caca_dither_t *dither;
  1161. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval2, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1162. gdImage *img = fetch_external_resource(_zval3, "gd");
  1163. if (!img) {
  1164. RETURN_FALSE;
  1165. }
  1166. void *pixels = gd_get_pixels(img);
  1167. if (!pixels) {
  1168. RETURN_FALSE;
  1169. }
  1170. caca_dither_bitmap(canvas, x, y, w, h, dither, pixels);
  1171. free(pixels);
  1172. RETURN_TRUE;
  1173. }
  1174. PHP_FUNCTION(caca_load_font) {
  1175. char *str;
  1176. long str_len;
  1177. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
  1178. RETURN_FALSE;
  1179. }
  1180. caca_font_t *font = caca_load_font(str, str_len);
  1181. ZEND_REGISTER_RESOURCE(return_value, font, le_caca_font);
  1182. }
  1183. PHP_FUNCTION(caca_get_font_list) {
  1184. char const * const *list = caca_get_font_list();
  1185. int i;
  1186. array_init(return_value);
  1187. for(i = 0; list[i]; i += 1)
  1188. add_next_index_string(return_value, (char*) list[i], 1);
  1189. }
  1190. PHP_FUNCTION(caca_get_font_width) {
  1191. zval *_zval;
  1192. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1193. RETURN_FALSE;
  1194. }
  1195. caca_font_t *font;
  1196. ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
  1197. RETURN_LONG(caca_get_font_width(font));
  1198. }
  1199. PHP_FUNCTION(caca_get_font_height) {
  1200. zval *_zval;
  1201. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1202. RETURN_FALSE;
  1203. }
  1204. caca_font_t *font;
  1205. ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
  1206. RETURN_LONG(caca_get_font_height(font));
  1207. }
  1208. PHP_FUNCTION(caca_get_font_blocks) {
  1209. zval *_zval;
  1210. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1211. RETURN_FALSE;
  1212. }
  1213. caca_font_t *font;
  1214. ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
  1215. uint32_t const *list = caca_get_font_blocks(font);
  1216. int i;
  1217. array_init(return_value);
  1218. for(i = 0; list[i]; i += 1)
  1219. add_next_index_long(return_value, list[i]);
  1220. }
  1221. PHP_FUNCTION(caca_render_canvas) {
  1222. }
  1223. PHP_FUNCTION(caca_canvas_set_figfont) {
  1224. zval *_zval;
  1225. char *font;
  1226. long font_len;
  1227. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &font, &font_len) == FAILURE) {
  1228. RETURN_FALSE;
  1229. }
  1230. caca_canvas_t *canvas;
  1231. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1232. RETURN_SUCCESS(caca_canvas_set_figfont(canvas, font));
  1233. }
  1234. PHP_FUNCTION(caca_put_figchar) {
  1235. zval *_zval;
  1236. long c;
  1237. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &c) == FAILURE) {
  1238. RETURN_FALSE;
  1239. }
  1240. caca_canvas_t *canvas;
  1241. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1242. RETURN_SUCCESS(caca_put_figchar(canvas, c));
  1243. }
  1244. PHP_FUNCTION(caca_flush_figlet) {
  1245. zval *_zval;
  1246. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1247. RETURN_FALSE;
  1248. }
  1249. caca_canvas_t *canvas;
  1250. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1251. RETURN_SUCCESS(caca_flush_figlet(canvas));
  1252. }
  1253. PHP_FUNCTION(caca_file_open) {
  1254. char *path, *mode;
  1255. long path_len, mode_len;
  1256. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &path, &path_len, &mode, &mode_len) == FAILURE) {
  1257. RETURN_FALSE;
  1258. }
  1259. caca_file_t *file = caca_file_open(path, mode);
  1260. ZEND_REGISTER_RESOURCE(return_value, file, le_caca_file);
  1261. }
  1262. PHP_FUNCTION(caca_file_close) {
  1263. zval *_zval;
  1264. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1265. RETURN_FALSE;
  1266. }
  1267. caca_file_t *file;
  1268. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1269. //TODO: check that file was not already closed
  1270. RETURN_SUCCESS(caca_file_close(file));
  1271. }
  1272. PHP_FUNCTION(caca_file_tell) {
  1273. zval *_zval;
  1274. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1275. RETURN_FALSE;
  1276. }
  1277. caca_file_t *file;
  1278. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1279. RETURN_LONG(caca_file_tell(file));
  1280. }
  1281. PHP_FUNCTION(caca_file_read) {
  1282. zval *_zval;
  1283. long len;
  1284. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &len) == FAILURE) {
  1285. RETURN_FALSE;
  1286. }
  1287. caca_file_t *file;
  1288. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1289. if (len < 1) {
  1290. RETURN_FALSE;
  1291. }
  1292. char *buffer = emalloc(len);
  1293. if (!buffer) {
  1294. RETURN_FALSE;
  1295. }
  1296. caca_file_read(file, buffer, len);
  1297. return_value->type = IS_STRING;
  1298. return_value->value.str.len = len;
  1299. return_value->value.str.val = buffer;
  1300. }
  1301. PHP_FUNCTION(caca_file_write) {
  1302. zval *_zval;
  1303. char *buf;
  1304. long buf_len = 0;
  1305. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &buf, &buf_len) == FAILURE) {
  1306. RETURN_FALSE;
  1307. }
  1308. caca_file_t *file;
  1309. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1310. RETURN_LONG(caca_file_write(file, buf, buf_len));
  1311. }
  1312. PHP_FUNCTION(caca_file_gets) {
  1313. zval *_zval;
  1314. long len = 0;
  1315. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &len) == FAILURE) {
  1316. RETURN_FALSE;
  1317. }
  1318. caca_file_t *file;
  1319. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1320. if (len < 1) {
  1321. RETURN_FALSE;
  1322. }
  1323. char *buffer = emalloc(len);
  1324. if (!buffer) {
  1325. RETURN_FALSE;
  1326. }
  1327. char *result = caca_file_gets(file, buffer, len);
  1328. if (!result) {
  1329. RETURN_FALSE;
  1330. }
  1331. return_value->type = IS_STRING;
  1332. return_value->value.str.len = len;
  1333. return_value->value.str.val = result;
  1334. }
  1335. PHP_FUNCTION(caca_file_eof) {
  1336. zval *_zval;
  1337. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1338. RETURN_FALSE;
  1339. }
  1340. caca_file_t *file;
  1341. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1342. RETURN_BOOL(caca_file_eof(file) != 0);
  1343. }
  1344. PHP_FUNCTION(caca_import_string) {
  1345. zval *_zval;
  1346. char *src, *format;
  1347. long src_len, format_len = 0;
  1348. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &src, &src_len, &format, &format_len) == FAILURE) {
  1349. RETURN_FALSE;
  1350. }
  1351. caca_canvas_t *canvas;
  1352. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1353. RETURN_LONG(caca_import_memory(canvas, src, src_len, format));
  1354. }
  1355. PHP_FUNCTION(caca_import_file) {
  1356. zval *_zval;
  1357. char *filename, *format;
  1358. long filename_len, format_len = 0;
  1359. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &filename, &filename_len, &format, &format_len) == FAILURE) {
  1360. RETURN_FALSE;
  1361. }
  1362. caca_canvas_t *canvas;
  1363. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1364. RETURN_LONG(caca_import_file(canvas, filename, format));
  1365. }
  1366. PHP_FUNCTION(caca_get_import_list) {
  1367. char const * const *list = caca_get_import_list();
  1368. int i;
  1369. array_init(return_value);
  1370. for(i = 0; list[i]; i += 2)
  1371. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1372. }
  1373. PHP_FUNCTION(caca_export_string) {
  1374. zval *_zval;
  1375. char *type;
  1376. long type_len;
  1377. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &type, &type_len) == FAILURE) {
  1378. RETURN_FALSE;
  1379. }
  1380. caca_canvas_t *canvas;
  1381. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1382. void *buffer, *copy;
  1383. size_t len;
  1384. buffer = caca_export_memory(canvas, type, &len);
  1385. copy = emalloc(len);
  1386. if (!buffer | !copy) {
  1387. RETURN_FALSE;
  1388. }
  1389. memcpy(copy, buffer, len);
  1390. free(buffer);
  1391. return_value->type = IS_STRING;
  1392. return_value->value.str.len = len;
  1393. return_value->value.str.val = copy;
  1394. }
  1395. PHP_FUNCTION(caca_get_export_list) {
  1396. char const * const *list = caca_get_export_list();
  1397. int i;
  1398. array_init(return_value);
  1399. for(i = 0; list[i]; i += 2)
  1400. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1401. }
  1402. PHP_FUNCTION(caca_create_display) {
  1403. caca_canvas_t *canvas;
  1404. FETCH_CANVAS(canvas);
  1405. caca_display_t *display = caca_create_display(canvas);
  1406. ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
  1407. }
  1408. PHP_FUNCTION(caca_create_display_with_driver) {
  1409. zval *_zval;
  1410. char *str;
  1411. long str_len = 0;
  1412. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1413. RETURN_FALSE;
  1414. }
  1415. caca_canvas_t *canvas;
  1416. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1417. caca_display_t *display = caca_create_display_with_driver(canvas, str);
  1418. if (!display) {
  1419. RETURN_FALSE;
  1420. }
  1421. ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
  1422. }
  1423. PHP_FUNCTION(caca_get_display_driver_list) {
  1424. char const * const *list = caca_get_display_driver_list();
  1425. int i;
  1426. array_init(return_value);
  1427. for(i = 0; list[i]; i += 2)
  1428. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1429. }
  1430. PHP_FUNCTION(caca_get_display_driver) {
  1431. zval *_zval;
  1432. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1433. RETURN_FALSE;
  1434. }
  1435. caca_display_t *display;
  1436. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1437. RETURN_STRING((char *) caca_get_display_driver(display), 1);
  1438. }
  1439. PHP_FUNCTION(caca_set_display_driver) {
  1440. zval *_zval;
  1441. char *str;
  1442. long str_len;
  1443. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1444. RETURN_FALSE;
  1445. }
  1446. caca_display_t *display;
  1447. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1448. RETURN_SUCESS(caca_set_display_driver(display, str));
  1449. }
  1450. PHP_FUNCTION(caca_get_canvas) {
  1451. zval *_zval;
  1452. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1453. RETURN_FALSE;
  1454. }
  1455. caca_display_t *display;
  1456. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1457. caca_canvas_t *canvas = caca_get_canvas(display);
  1458. ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
  1459. }
  1460. PHP_FUNCTION(caca_refresh_display) {
  1461. caca_display_t *display;
  1462. FETCH_DISPLAY(display);
  1463. RETURN_SUCCESS(caca_refresh_display(display));
  1464. }
  1465. PHP_FUNCTION(caca_set_display_time) {
  1466. zval *_zval;
  1467. long value = 0;
  1468. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1469. RETURN_FALSE;
  1470. }
  1471. caca_display_t *display;
  1472. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1473. RETURN_SUCCESS(caca_set_display_time(display, value));
  1474. }
  1475. PHP_FUNCTION(caca_get_display_time) {
  1476. caca_display_t *display;
  1477. FETCH_DISPLAY(display);
  1478. RETURN_LONG(caca_get_display_time(display));
  1479. }
  1480. PHP_FUNCTION(caca_get_display_width) {
  1481. caca_display_t *display;
  1482. FETCH_DISPLAY(display);
  1483. RETURN_LONG(caca_get_display_width(display));
  1484. }
  1485. PHP_FUNCTION(caca_get_display_height) {
  1486. caca_display_t *display;
  1487. FETCH_DISPLAY(display);
  1488. RETURN_LONG(caca_get_display_height(display));
  1489. }
  1490. PHP_FUNCTION(caca_set_display_title) {
  1491. zval *_zval;
  1492. char *str;
  1493. long str_len = 0;
  1494. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1495. RETURN_FALSE;
  1496. }
  1497. caca_display_t *display;
  1498. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1499. RETURN_SUCCESS(caca_set_display(display, str));
  1500. }
  1501. PHP_FUNCTION(caca_set_mouse) {
  1502. zval *_zval;
  1503. long value = 0;
  1504. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1505. RETURN_FALSE;
  1506. }
  1507. caca_display_t *display;
  1508. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1509. RETURN_SUCCESS(caca_set_mouse(display, value));
  1510. }
  1511. PHP_FUNCTION(caca_set_cursor) {
  1512. zval *_zval;
  1513. long value = 0;
  1514. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1515. RETURN_FALSE;
  1516. }
  1517. caca_display_t *display;
  1518. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1519. RETURN_SUCCESS(caca_set_cursor(display, value));
  1520. }
  1521. PHP_FUNCTION(caca_get_event) {
  1522. zval *_zval1, *_zval2 = NULL;
  1523. long g, aa = 0;
  1524. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|rl", &_zval1, &g, &_zval2, &aa) == FAILURE) {
  1525. RETURN_FALSE;
  1526. }
  1527. caca_display_t *display;
  1528. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval1, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1529. caca_event_t *event = NULL;
  1530. if (_zval2) {
  1531. ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval2, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event);
  1532. }
  1533. RETURN_LONG(caca_get_event(display, g, event, aa));
  1534. }
  1535. PHP_FUNCTION(caca_get_mouse_x) {
  1536. caca_display_t *display;
  1537. FETCH_DISPLAY(display);
  1538. RETURN_LONG(caca_get_mouse_x(display));
  1539. }
  1540. PHP_FUNCTION(caca_get_mouse_y) {
  1541. caca_display_t *display;
  1542. FETCH_DISPLAY(display);
  1543. RETURN_LONG(caca_get_mouse_y(display));
  1544. }
  1545. PHP_FUNCTION(caca_get_event_type) {
  1546. caca_event_t *event;
  1547. FETCH_EVENT(event);
  1548. RETURN_LONG(caca_get_event_type(event));
  1549. }
  1550. PHP_FUNCTION(caca_get_event_key_ch) {
  1551. caca_event_t *event;
  1552. FETCH_EVENT(event);
  1553. RETURN_LONG(caca_get_event_key_ch(event));
  1554. }
  1555. PHP_FUNCTION(caca_get_event_mouse_button) {
  1556. caca_event_t *event;
  1557. FETCH_EVENT(event);
  1558. RETURN_LONG(caca_get_event_mouse_button(event));
  1559. }
  1560. PHP_FUNCTION(caca_get_event_mouse_x) {
  1561. caca_event_t *event;
  1562. FETCH_EVENT(event);
  1563. RETURN_LONG(caca_get_event_mouse_x(event));
  1564. }
  1565. PHP_FUNCTION(caca_get_event_mouse_y) {
  1566. caca_event_t *event;
  1567. FETCH_EVENT(event);
  1568. RETURN_LONG(caca_get_event_mouse_y(event));
  1569. }
  1570. PHP_FUNCTION(caca_get_event_resize_width) {
  1571. caca_event_t *event;
  1572. FETCH_EVENT(event);
  1573. RETURN_LONG(caca_get_event_resize_width(event));
  1574. }
  1575. PHP_FUNCTION(caca_get_event_resize_height) {
  1576. caca_event_t *event;
  1577. FETCH_EVENT(event);
  1578. RETURN_LONG(caca_get_event_resize_height(event));
  1579. }