You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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