Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

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