1608 lines
52 KiB

  1. /*
  2. * php-caca Php binding for Libcaca
  3. * Copyright (c) 2008 Vion Nicolas <nico@picapo.net>
  4. *
  5. *
  6. * This library is free software. It comes without any warranty, to
  7. * the extent permitted by applicable law. You can redistribute it
  8. * and/or modify it under the terms of the Do What The Fuck You Want
  9. * To Public License, Version 2, as published by Sam Hocevar. See
  10. * http://sam.zoy.org/wtfpl/COPYING for more details.
  11. */
  12. #ifdef HAVE_CONFIG_H
  13. #include "config.h"
  14. #endif
  15. #include "php.h"
  16. #include "php_caca.h"
  17. #include <gd.h>
  18. static function_entry caca_functions[] = {
  19. PHP_FE(caca_create_event, NULL)
  20. PHP_FE(caca_create_canvas, NULL)
  21. PHP_FE(caca_set_canvas_size, NULL)
  22. PHP_FE(caca_get_canvas_width, NULL)
  23. PHP_FE(caca_get_canvas_height, NULL)
  24. PHP_FE(caca_get_canvas_chars, NULL)
  25. PHP_FE(caca_get_canvas_attrs, NULL)
  26. PHP_FE(caca_rand, NULL)
  27. PHP_FE(caca_get_version, NULL)
  28. PHP_FE(caca_gotoxy, NULL)
  29. PHP_FE(caca_get_cursor_x, NULL)
  30. PHP_FE(caca_get_cursor_y, NULL)
  31. PHP_FE(caca_put_char, NULL)
  32. PHP_FE(caca_get_char, NULL)
  33. PHP_FE(caca_put_str, NULL)
  34. PHP_FE(caca_clear_canvas, NULL)
  35. PHP_FE(caca_set_canvas_handle, NULL)
  36. PHP_FE(caca_get_canvas_handle_x, NULL)
  37. PHP_FE(caca_get_canvas_handle_y, NULL)
  38. PHP_FE(caca_blit, NULL)
  39. PHP_FE(caca_set_canvas_boundaries, NULL)
  40. PHP_FE(caca_invert, NULL)
  41. PHP_FE(caca_flip, NULL)
  42. PHP_FE(caca_flop, NULL)
  43. PHP_FE(caca_rotate_180, NULL)
  44. PHP_FE(caca_rotate_left, NULL)
  45. PHP_FE(caca_rotate_right, NULL)
  46. PHP_FE(caca_stretch_left, NULL)
  47. PHP_FE(caca_stretch_right, NULL)
  48. PHP_FE(caca_get_attr, NULL)
  49. PHP_FE(caca_set_attr, NULL)
  50. PHP_FE(caca_put_attr, NULL)
  51. PHP_FE(caca_set_color_ansi, NULL)
  52. PHP_FE(caca_set_color_argb, NULL)
  53. PHP_FE(caca_attr_to_ansi, NULL)
  54. PHP_FE(caca_attr_to_ansi_fg, NULL)
  55. PHP_FE(caca_attr_to_ansi_bg, NULL)
  56. PHP_FE(caca_attr_to_rgb12_fg, NULL)
  57. PHP_FE(caca_attr_to_rgb12_bg, NULL)
  58. PHP_FE(caca_attr_to_argb64, NULL)
  59. PHP_FE(caca_utf8_to_utf32, NULL)
  60. PHP_FE(caca_utf32_to_utf8, NULL)
  61. PHP_FE(caca_utf32_to_cp437, NULL)
  62. PHP_FE(caca_cp437_to_utf32, NULL)
  63. PHP_FE(caca_utf32_to_ascii, NULL)
  64. PHP_FE(caca_utf32_is_fullwidth, NULL)
  65. PHP_FE(caca_draw_line, NULL)
  66. PHP_FE(caca_draw_polyline, NULL)
  67. PHP_FE(caca_draw_thin_line, NULL)
  68. PHP_FE(caca_draw_thin_polyline, NULL)
  69. PHP_FE(caca_draw_circle, NULL)
  70. PHP_FE(caca_draw_ellipse, NULL)
  71. PHP_FE(caca_draw_thin_ellipse, NULL)
  72. PHP_FE(caca_fill_ellipse, NULL)
  73. PHP_FE(caca_draw_box, NULL)
  74. PHP_FE(caca_draw_thin_box, NULL)
  75. PHP_FE(caca_draw_cp437_box, NULL)
  76. PHP_FE(caca_fill_box, NULL)
  77. PHP_FE(caca_draw_triangle, NULL)
  78. PHP_FE(caca_draw_thin_triangle, NULL)
  79. PHP_FE(caca_fill_triangle, NULL)
  80. PHP_FE(caca_get_frame_count, NULL)
  81. PHP_FE(caca_set_frame, NULL)
  82. PHP_FE(caca_set_frame_name, NULL)
  83. PHP_FE(caca_create_frame, NULL)
  84. PHP_FE(caca_free_frame, NULL)
  85. PHP_FE(caca_create_dither, NULL)
  86. PHP_FE(caca_create_dither_gd, NULL)
  87. PHP_FE(caca_set_dither_palette, NULL)
  88. PHP_FE(caca_set_dither_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_gd, NULL)
  107. PHP_FE(caca_load_font, NULL)
  108. PHP_FE(caca_get_font_list, NULL)
  109. PHP_FE(caca_get_font_width, NULL)
  110. PHP_FE(caca_get_font_height, NULL)
  111. PHP_FE(caca_get_font_bloc, NULL)
  112. PHP_FE(caca_render_canvas, NULL)
  113. PHP_FE(caca_canvas_set_figfont, NULL)
  114. PHP_FE(caca_put_figchar, NULL)
  115. PHP_FE(caca_flush_figlet, NULL)
  116. PHP_FE(caca_file_open, NULL)
  117. PHP_FE(caca_file_close, NULL)
  118. PHP_FE(caca_file_tell, NULL)
  119. PHP_FE(caca_file_read, NULL)
  120. PHP_FE(caca_file_write, NULL)
  121. PHP_FE(caca_file_gets, NULL)
  122. PHP_FE(caca_file_eof, NULL)
  123. PHP_FE(caca_import_string, NULL)
  124. PHP_FE(caca_import_file, NULL)
  125. PHP_FE(caca_get_import_list, NULL)
  126. PHP_FE(caca_export_string, NULL)
  127. PHP_FE(caca_get_export_list, NULL)
  128. PHP_FE(caca_create_display, NULL)
  129. PHP_FE(caca_create_display_with_driver, NULL)
  130. PHP_FE(caca_get_display_driver_list, NULL)
  131. PHP_FE(caca_get_display_driver, NULL)
  132. PHP_FE(caca_set_display_driver, NULL)
  133. PHP_FE(caca_get_canvas, NULL)
  134. PHP_FE(caca_refresh_display, NULL)
  135. PHP_FE(caca_set_display_time, NULL)
  136. PHP_FE(caca_get_display_time, NULL)
  137. PHP_FE(caca_get_display_width, NULL)
  138. PHP_FE(caca_get_display_height, NULL)
  139. PHP_FE(caca_set_display_title, NULL)
  140. PHP_FE(caca_set_mouse, NULL)
  141. PHP_FE(caca_set_cursor, NULL)
  142. PHP_FE(caca_get_event, NULL)
  143. PHP_FE(caca_get_mouse_x, NULL)
  144. PHP_FE(caca_get_mouse_y, NULL)
  145. PHP_FE(caca_get_event_type, NULL)
  146. PHP_FE(caca_get_event_key_ch, NULL)
  147. PHP_FE(caca_get_event_mouse_button, NULL)
  148. PHP_FE(caca_get_event_mouse_x, NULL)
  149. PHP_FE(caca_get_event_mouse_y, NULL)
  150. PHP_FE(caca_get_event_resize_width, NULL)
  151. PHP_FE(caca_get_event_resize_height, NULL)
  152. {NULL, NULL, NULL}
  153. };
  154. zend_module_entry caca_module_entry = {
  155. #if ZEND_MODULE_API_NO >= 20010901
  156. STANDARD_MODULE_HEADER,
  157. #endif
  158. PHP_CACA_EXTNAME,
  159. caca_functions,
  160. PHP_MINIT(caca),
  161. NULL,
  162. NULL,
  163. NULL,
  164. PHP_MINFO(caca),
  165. #if ZEND_MODULE_API_NO >= 20010901
  166. PHP_CACA_VERSION,
  167. #endif
  168. STANDARD_MODULE_PROPERTIES
  169. };
  170. #ifdef COMPILE_DL_CACA
  171. ZEND_GET_MODULE(caca)
  172. #endif
  173. PHP_MINFO_FUNCTION(caca) {
  174. php_info_print_table_start();
  175. php_info_print_table_row(2, "Caca library version", caca_get_version());
  176. php_info_print_table_end();
  177. }
  178. //-------- Caca's ressources destructors -----------//
  179. static void php_caca_canvas_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  180. caca_free_canvas(rsrc->ptr);
  181. }
  182. static void php_caca_dither_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  183. caca_free_dither(rsrc->ptr);
  184. }
  185. static void php_caca_font_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  186. caca_free_font(rsrc->ptr);
  187. }
  188. static void php_caca_file_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
  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. if (!img->trueColor)
  333. return NULL;
  334. int line_size = img->sx * sizeof(int);
  335. void *result = malloc(img->sy * line_size);
  336. int j;
  337. for (j = 0; j < img->sy; j++)
  338. memcpy(result + (j * line_size), (const void *) img->tpixels[j], line_size);
  339. return result;
  340. }
  341. //------- PHP Binding's specific functions ----------//
  342. PHP_FUNCTION(caca_create_event) {
  343. caca_event_t *event;
  344. event = emalloc(sizeof(caca_event_t));
  345. ZEND_REGISTER_RESOURCE(return_value, event, le_caca_event);
  346. }
  347. //------- Caca's functions ----------------//
  348. PHP_FUNCTION(caca_create_canvas) {
  349. long width, height = 0;
  350. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE) {
  351. RETURN_FALSE;
  352. }
  353. caca_canvas_t *canvas = caca_create_canvas(width, height);
  354. if (!canvas) {
  355. RETURN_FALSE;
  356. }
  357. ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
  358. }
  359. PHP_FUNCTION(caca_set_canvas_size) {
  360. zval *_zval;
  361. long width, height = 0;
  362. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &width, &height) == FAILURE) {
  363. RETURN_FALSE;
  364. }
  365. caca_canvas_t *canvas;
  366. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  367. RETURN_SUCCESS(caca_set_canvas_size(canvas, width, height));
  368. }
  369. PHP_FUNCTION(caca_get_canvas_width) {
  370. caca_canvas_t *canvas;
  371. FETCH_CANVAS(canvas);
  372. RETURN_LONG(caca_get_canvas_width(canvas));
  373. }
  374. PHP_FUNCTION(caca_get_canvas_height) {
  375. caca_canvas_t *canvas;
  376. FETCH_CANVAS(canvas);
  377. RETURN_LONG(caca_get_canvas_height(canvas));
  378. }
  379. PHP_FUNCTION(caca_get_canvas_chars) {
  380. caca_canvas_t *canvas;
  381. FETCH_CANVAS(canvas);
  382. RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1); //TODO: check that return \0 terminated string
  383. }
  384. PHP_FUNCTION(caca_get_canvas_attrs) {
  385. caca_canvas_t *canvas;
  386. FETCH_CANVAS(canvas);
  387. RETURN_STRING((char *) caca_get_canvas_attrs(canvas), 1); //TODO: check that return \0 terminated string
  388. }
  389. PHP_FUNCTION(caca_rand) {
  390. long min, max = 0;
  391. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &min, &max) == FAILURE) {
  392. RETURN_FALSE;
  393. }
  394. RETURN_LONG(caca_rand(min, max));
  395. }
  396. PHP_FUNCTION(caca_get_version) {
  397. RETURN_STRING((char *) caca_get_version(), 1);
  398. }
  399. PHP_FUNCTION(caca_gotoxy) {
  400. zval *_zval;
  401. long x, y = 0;
  402. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  403. RETURN_FALSE;
  404. }
  405. caca_canvas_t *canvas;
  406. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  407. RETURN_SUCCESS(caca_gotoxy(canvas, x, y));
  408. }
  409. PHP_FUNCTION(caca_get_cursor_x) {
  410. caca_canvas_t *canvas;
  411. FETCH_CANVAS(canvas);
  412. RETURN_LONG(caca_get_cursor_x(canvas));
  413. }
  414. PHP_FUNCTION(caca_get_cursor_y) {
  415. caca_canvas_t *canvas;
  416. FETCH_CANVAS(canvas);
  417. RETURN_LONG(caca_get_cursor_y(canvas));
  418. }
  419. PHP_FUNCTION(caca_put_char) {
  420. zval *_zval;
  421. char *str;
  422. long str_len, x, y = 0;
  423. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlls", &_zval, &x, &y, &str, &str_len) == FAILURE) {
  424. RETURN_FALSE;
  425. }
  426. caca_canvas_t *canvas;
  427. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  428. if (str_len != 1) {
  429. RETURN_FALSE;
  430. }
  431. RETURN_SUCCESS(caca_put_char(canvas, x, y, str[0]));
  432. }
  433. PHP_FUNCTION(caca_get_char) {
  434. zval *_zval;
  435. long x, y = 0;
  436. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  437. RETURN_FALSE;
  438. }
  439. caca_canvas_t *canvas;
  440. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  441. RETURN_CHAR(caca_get_char(canvas, x, y));
  442. }
  443. PHP_FUNCTION(caca_put_str) {
  444. zval *_zval;
  445. char *str;
  446. long x, y, str_len = 0;
  447. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlls", &_zval, &x, &y, &str, &str_len) == 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_SUCCESS(caca_put_str(canvas, x, y, str));
  453. }
  454. PHP_FUNCTION(caca_clear_canvas) {
  455. caca_canvas_t *canvas;
  456. FETCH_CANVAS(canvas);
  457. RETURN_LONG(caca_clear_canvas(canvas));
  458. }
  459. PHP_FUNCTION(caca_set_canvas_handle) {
  460. zval *_zval;
  461. long x, y = 0;
  462. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  463. RETURN_FALSE;
  464. }
  465. caca_canvas_t *canvas;
  466. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  467. RETURN_SUCCESS(caca_set_canvas_handle(canvas, x, y));
  468. }
  469. PHP_FUNCTION(caca_get_canvas_handle_x) {
  470. caca_canvas_t *canvas;
  471. FETCH_CANVAS(canvas);
  472. RETURN_LONG(caca_get_canvas_handle_x(canvas));
  473. }
  474. PHP_FUNCTION(caca_get_canvas_handle_y) {
  475. caca_canvas_t *canvas;
  476. FETCH_CANVAS(canvas);
  477. RETURN_LONG(caca_get_canvas_handle_y(canvas));
  478. }
  479. PHP_FUNCTION(caca_blit) {
  480. zval *_zval1, *_zval2, *_zval3 = NULL;
  481. long x, y = 0;
  482. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllr|r", &_zval1, &x, &y, &_zval2, &_zval3) == FAILURE) {
  483. RETURN_FALSE;
  484. }
  485. caca_canvas_t *dst, *src, *mask = NULL;
  486. ZEND_FETCH_RESOURCE(dst, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  487. ZEND_FETCH_RESOURCE(src, caca_canvas_t*, &_zval2, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  488. if (_zval3) {
  489. ZEND_FETCH_RESOURCE(mask, caca_canvas_t*, &_zval3, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  490. }
  491. RETURN_SUCCESS(caca_blit(dst, x, y, src, NULL));
  492. }
  493. PHP_FUNCTION(caca_set_canvas_boundaries) {
  494. zval *_zval;
  495. long x, y, width, height = 0;
  496. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &x, &y, &width, &height) == FAILURE) {
  497. RETURN_FALSE;
  498. }
  499. caca_canvas_t *canvas;
  500. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  501. RETURN_SUCCESS(caca_set_canvas_boundaries(canvas, x, y, width, height));
  502. }
  503. PHP_FUNCTION(caca_invert) {
  504. caca_canvas_t *canvas;
  505. FETCH_CANVAS(canvas);
  506. RETURN_SUCCESS(caca_invert(canvas));
  507. }
  508. PHP_FUNCTION(caca_flip) {
  509. caca_canvas_t *canvas;
  510. FETCH_CANVAS(canvas);
  511. RETURN_SUCCESS(caca_flip(canvas));
  512. }
  513. PHP_FUNCTION(caca_flop) {
  514. caca_canvas_t *canvas;
  515. FETCH_CANVAS(canvas);
  516. RETURN_SUCCESS(caca_flop(canvas));
  517. }
  518. PHP_FUNCTION(caca_rotate_180) {
  519. caca_canvas_t *canvas;
  520. FETCH_CANVAS(canvas);
  521. RETURN_SUCCESS(caca_rotate_180(canvas));
  522. }
  523. PHP_FUNCTION(caca_rotate_left) {
  524. caca_canvas_t *canvas;
  525. FETCH_CANVAS(canvas);
  526. RETURN_SUCCESS(caca_rotate_left(canvas));
  527. }
  528. PHP_FUNCTION(caca_rotate_right) {
  529. caca_canvas_t *canvas;
  530. FETCH_CANVAS(canvas);
  531. RETURN_SUCCESS(caca_rotate_right(canvas));
  532. }
  533. PHP_FUNCTION(caca_stretch_left) {
  534. caca_canvas_t *canvas;
  535. FETCH_CANVAS(canvas);
  536. RETURN_SUCCESS(caca_stretch_left(canvas));
  537. }
  538. PHP_FUNCTION(caca_stretch_right) {
  539. caca_canvas_t *canvas;
  540. FETCH_CANVAS(canvas);
  541. RETURN_SUCCESS(caca_stretch_right(canvas));
  542. }
  543. PHP_FUNCTION(caca_get_attr) {
  544. zval *_zval;
  545. long x, y = 0;
  546. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &x, &y) == FAILURE) {
  547. RETURN_FALSE;
  548. }
  549. caca_canvas_t *canvas;
  550. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  551. RETURN_LONG(caca_get_attr(canvas, x, y));
  552. }
  553. PHP_FUNCTION(caca_set_attr) {
  554. zval *_zval;
  555. long attr = 0;
  556. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &attr) == FAILURE) {
  557. RETURN_FALSE;
  558. }
  559. caca_canvas_t *canvas;
  560. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  561. RETURN_SUCCESS(caca_set_attr(canvas, attr));
  562. }
  563. PHP_FUNCTION(caca_put_attr) {
  564. zval *_zval;
  565. long x, y, attr = 0;
  566. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &_zval, &x, &y, &attr) == FAILURE) {
  567. RETURN_FALSE;
  568. }
  569. caca_canvas_t *canvas;
  570. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  571. RETURN_SUCCESS(caca_put_attr(canvas, x, y, attr));
  572. }
  573. PHP_FUNCTION(caca_set_color_ansi) {
  574. zval *_zval;
  575. long foreground, background = 0;
  576. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
  577. RETURN_FALSE;
  578. }
  579. caca_canvas_t *canvas;
  580. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  581. RETURN_SUCCESS(caca_set_color_ansi(canvas, foreground, background));
  582. }
  583. PHP_FUNCTION(caca_set_color_argb) {
  584. zval *_zval;
  585. long foreground, background = 0;
  586. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &_zval, &foreground, &background) == FAILURE) {
  587. RETURN_FALSE;
  588. }
  589. caca_canvas_t *canvas;
  590. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  591. RETURN_SUCCESS(caca_set_color_argb(canvas, foreground, background));
  592. }
  593. PHP_FUNCTION(caca_attr_to_ansi) {
  594. long l;
  595. FETCH_LONG(l);
  596. RETURN_LONG(caca_attr_to_ansi(l));
  597. }
  598. PHP_FUNCTION(caca_attr_to_ansi_fg) {
  599. long l;
  600. FETCH_LONG(l);
  601. RETURN_LONG(caca_attr_to_ansi_fg(l));
  602. }
  603. PHP_FUNCTION(caca_attr_to_ansi_bg) {
  604. long l;
  605. FETCH_LONG(l);
  606. RETURN_LONG(caca_attr_to_ansi_bg(l));
  607. }
  608. PHP_FUNCTION(caca_attr_to_rgb12_fg) {
  609. long l;
  610. FETCH_LONG(l);
  611. RETURN_LONG(caca_attr_to_rgb12_fg(l));
  612. }
  613. PHP_FUNCTION(caca_attr_to_rgb12_bg) {
  614. long l;
  615. FETCH_LONG(l);
  616. RETURN_LONG(caca_attr_to_rgb12_bg(l));
  617. }
  618. PHP_FUNCTION(caca_attr_to_argb64) {
  619. }
  620. PHP_FUNCTION(caca_utf8_to_utf32) {
  621. }
  622. PHP_FUNCTION(caca_utf32_to_utf8) {
  623. }
  624. PHP_FUNCTION(caca_utf32_to_cp437) {
  625. }
  626. PHP_FUNCTION(caca_cp437_to_utf32) {
  627. }
  628. PHP_FUNCTION(caca_utf32_to_ascii) {
  629. }
  630. PHP_FUNCTION(caca_utf32_is_fullwidth) {
  631. }
  632. PHP_FUNCTION(caca_draw_line) {
  633. zval *_zval;
  634. char *str;
  635. long str_len, xa, ya, xb, yb = 0;
  636. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
  637. RETURN_FALSE;
  638. }
  639. caca_canvas_t *canvas;
  640. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  641. if (str_len != 1) {
  642. RETURN_FALSE;
  643. }
  644. RETURN_SUCCESS(caca_draw_line(canvas, xa, ya, xb, yb, str[0]));
  645. }
  646. PHP_FUNCTION(caca_draw_polyline) {
  647. }
  648. PHP_FUNCTION(caca_draw_thin_line) {
  649. zval *_zval;
  650. long xa, ya, xb, yb = 0;
  651. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  652. RETURN_FALSE;
  653. }
  654. caca_canvas_t *canvas;
  655. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  656. RETURN_SUCCESS(caca_draw_thin_line(canvas, xa, ya, xb, yb));
  657. }
  658. PHP_FUNCTION(caca_draw_thin_polyline) {
  659. }
  660. PHP_FUNCTION(caca_draw_circle) {
  661. zval *_zval;
  662. char *str;
  663. long str_len, x, y, r = 0;
  664. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllls", &_zval, &x, &y, &r, &str, &str_len) == FAILURE) {
  665. RETURN_FALSE;
  666. }
  667. caca_canvas_t *canvas;
  668. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  669. if (str_len != 1) {
  670. RETURN_FALSE;
  671. }
  672. RETURN_SUCCESS(caca_draw_circle(canvas, x, y, r, str[0]));
  673. }
  674. PHP_FUNCTION(caca_draw_ellipse) {
  675. zval *_zval;
  676. char *str;
  677. long str_len, xa, ya, xb, yb = 0;
  678. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
  679. RETURN_FALSE;
  680. }
  681. caca_canvas_t *canvas;
  682. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  683. if (str_len != 1) {
  684. RETURN_FALSE;
  685. }
  686. RETURN_SUCCESS(caca_draw_ellipse(canvas, xa, ya, xb, yb, str[0]));
  687. }
  688. PHP_FUNCTION(caca_draw_thin_ellipse) {
  689. zval *_zval;
  690. long xa, ya, xb, yb = 0;
  691. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  692. RETURN_FALSE;
  693. }
  694. caca_canvas_t *canvas;
  695. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  696. RETURN_SUCCESS(caca_draw_thin_ellipse(canvas, xa, ya, xb, yb));
  697. }
  698. PHP_FUNCTION(caca_fill_ellipse) {
  699. zval *_zval;
  700. char *str;
  701. long str_len, xa, ya, xb, yb = 0;
  702. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
  703. RETURN_FALSE;
  704. }
  705. caca_canvas_t *canvas;
  706. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  707. if (str_len != 1) {
  708. RETURN_FALSE;
  709. }
  710. RETURN_SUCCESS(caca_fill_ellipse(canvas, xa, ya, xb, yb, str[0]));
  711. }
  712. PHP_FUNCTION(caca_draw_box) {
  713. zval *_zval;
  714. char *str;
  715. long str_len, xa, ya, xb, yb = 0;
  716. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
  717. RETURN_FALSE;
  718. }
  719. caca_canvas_t *canvas;
  720. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  721. if (str_len != 1) {
  722. RETURN_FALSE;
  723. }
  724. RETURN_SUCCESS(caca_draw_box(canvas, xa, ya, xb, yb, str[0]));
  725. }
  726. PHP_FUNCTION(caca_draw_thin_box) {
  727. zval *_zval;
  728. long xa, ya, xb, yb = 0;
  729. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  730. RETURN_FALSE;
  731. }
  732. caca_canvas_t *canvas;
  733. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  734. RETURN_SUCCESS(caca_draw_thin_box(canvas, xa, ya, xb, yb));
  735. }
  736. PHP_FUNCTION(caca_draw_cp437_box) {
  737. zval *_zval;
  738. long xa, ya, xb, yb = 0;
  739. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &_zval, &xa, &ya, &xb, &yb) == FAILURE) {
  740. RETURN_FALSE;
  741. }
  742. caca_canvas_t *canvas;
  743. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  744. RETURN_SUCCESS(caca_draw_cp437_box(canvas, xa, ya, xb, yb));
  745. }
  746. PHP_FUNCTION(caca_fill_box) {
  747. zval *_zval;
  748. char *str;
  749. long str_len, xa, ya, xb, yb = 0;
  750. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllls", &_zval, &xa, &ya, &xb, &yb, &str, &str_len) == FAILURE) {
  751. RETURN_FALSE;
  752. }
  753. caca_canvas_t *canvas;
  754. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  755. if (str_len != 1) {
  756. RETURN_FALSE;
  757. }
  758. RETURN_SUCCESS(caca_fill_box(canvas, xa, ya, xb, yb, str[0]));
  759. }
  760. PHP_FUNCTION(caca_draw_triangle) {
  761. zval *_zval;
  762. char *str;
  763. long str_len, xa, ya, xb, yb, xc, yc = 0;
  764. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) {
  765. RETURN_FALSE;
  766. }
  767. caca_canvas_t *canvas;
  768. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  769. if (str_len != 1) {
  770. RETURN_FALSE;
  771. }
  772. RETURN_SUCCESS(caca_draw_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]));
  773. }
  774. PHP_FUNCTION(caca_draw_thin_triangle) {
  775. zval *_zval;
  776. long xa, ya, xb, yb, xc, yc = 0;
  777. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc) == FAILURE) {
  778. RETURN_FALSE;
  779. }
  780. caca_canvas_t *canvas;
  781. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  782. RETURN_SUCCESS(caca_draw_thin_triangle(canvas, xa, ya, xb, yb, xc, yc));
  783. }
  784. PHP_FUNCTION(caca_fill_triangle) {
  785. zval *_zval;
  786. char *str;
  787. long str_len, xa, ya, xb, yb, xc, yc = 0;
  788. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) {
  789. RETURN_FALSE;
  790. }
  791. caca_canvas_t *canvas;
  792. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  793. if (str_len != 1) {
  794. RETURN_FALSE;
  795. }
  796. RETURN_SUCCESS(caca_fill_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]));
  797. }
  798. PHP_FUNCTION(caca_get_frame_count) {
  799. zval *_zval;
  800. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  801. RETURN_FALSE;
  802. }
  803. caca_canvas_t *canvas;
  804. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  805. RETURN_LONG(caca_get_canvas_count(canvas));
  806. }
  807. PHP_FUNCTION(caca_set_frame) {
  808. zval *_zval;
  809. long id;
  810. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == FAILURE) {
  811. RETURN_FALSE;
  812. }
  813. caca_canvas_t *canvas;
  814. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  815. RETURN_SUCCESS(caca_set_frame(canvas, id));
  816. }
  817. PHP_FUNCTION(caca_set_frame_name) {
  818. zval *_zval;
  819. char *str;
  820. long str_len;
  821. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == 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_set_frame_name(canvas, str));
  827. }
  828. PHP_FUNCTION(caca_create_frame) {
  829. zval *_zval;
  830. long id;
  831. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == 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_create_frame(canvas, id));
  837. }
  838. PHP_FUNCTION(caca_free_frame) {
  839. zval *_zval;
  840. long id;
  841. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &id) == 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_free_frame(canvas, id));
  847. }
  848. PHP_FUNCTION(caca_create_dither) {
  849. long bpp, w, h, pitch, rmask, gmask, bmask, amask = 0;
  850. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "llllllll", &bpp, &w, &h, &pitch, &rmask, &gmask, &bmask, &amask) == FAILURE) {
  851. RETURN_FALSE;
  852. }
  853. caca_dither_t *dither = caca_create_dither(bpp, w, h, pitch, rmask, gmask, bmask, amask);
  854. ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
  855. }
  856. PHP_FUNCTION(caca_create_dither_gd) {
  857. zval *_zval;
  858. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  859. RETURN_FALSE;
  860. }
  861. gdImage *img = fetch_external_resource(_zval, "gd");
  862. if (!img | !img->trueColor) {
  863. RETURN_FALSE;
  864. }
  865. caca_dither_t *dither = caca_create_dither(sizeof(int) * 8, img->sx, img->sy, img->sx * sizeof(int), 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000);
  866. ZEND_REGISTER_RESOURCE(return_value, dither, le_caca_dither);
  867. }
  868. PHP_FUNCTION(caca_set_dither_palette) {
  869. }
  870. PHP_FUNCTION(caca_set_dither_brightness) {
  871. zval *_zval;
  872. double value;
  873. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  874. RETURN_FALSE;
  875. }
  876. caca_dither_t *dither;
  877. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  878. RETURN_SUCCESS(caca_set_dither_brightness(dither, value));
  879. }
  880. PHP_FUNCTION(caca_get_dither_brightness) {
  881. zval *_zval;
  882. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  883. RETURN_FALSE;
  884. }
  885. caca_dither_t *dither;
  886. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  887. RETURN_DOUBLE(caca_get_dither_brightness(dither));
  888. }
  889. PHP_FUNCTION(caca_set_dither_gamma) {
  890. zval *_zval;
  891. double value;
  892. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  893. RETURN_FALSE;
  894. }
  895. caca_dither_t *dither;
  896. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  897. RETURN_SUCCESS(caca_set_dither_gamma(dither, value));
  898. }
  899. PHP_FUNCTION(caca_get_dither_gamma) {
  900. zval *_zval;
  901. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  902. RETURN_FALSE;
  903. }
  904. caca_dither_t *dither;
  905. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  906. RETURN_DOUBLE(caca_get_dither_gamma(dither));
  907. }
  908. PHP_FUNCTION(caca_set_dither_contrast) {
  909. zval *_zval;
  910. double value;
  911. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &_zval, &value) == FAILURE) {
  912. RETURN_FALSE;
  913. }
  914. caca_dither_t *dither;
  915. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  916. RETURN_SUCCESS(caca_set_dither_contrast(dither, value));
  917. }
  918. PHP_FUNCTION(caca_get_dither_contrast) {
  919. zval *_zval;
  920. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  921. RETURN_FALSE;
  922. }
  923. caca_dither_t *dither;
  924. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  925. RETURN_DOUBLE(caca_get_dither_contrast(dither));
  926. }
  927. PHP_FUNCTION(caca_set_dither_antialias) {
  928. zval *_zval;
  929. int str_len;
  930. char *str;
  931. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  932. RETURN_FALSE;
  933. }
  934. caca_dither_t *dither;
  935. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  936. RETURN_SUCCESS(caca_set_dither_antialias(dither, str));
  937. }
  938. PHP_FUNCTION(caca_get_dither_antialias_list) {
  939. }
  940. PHP_FUNCTION(caca_get_dither_antialias) {
  941. zval *_zval;
  942. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  943. RETURN_FALSE;
  944. }
  945. caca_dither_t *dither;
  946. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  947. RETURN_STRING((char *) caca_get_dither_antialias(dither), 1);
  948. }
  949. PHP_FUNCTION(caca_set_dither_color) {
  950. zval *_zval;
  951. int str_len;
  952. char *str;
  953. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  954. RETURN_FALSE;
  955. }
  956. caca_dither_t *dither;
  957. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  958. RETURN_SUCCESS(caca_set_dither_color(dither, str));
  959. }
  960. PHP_FUNCTION(caca_get_dither_color_list) {
  961. zval *_zval;
  962. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  963. RETURN_FALSE;
  964. }
  965. caca_dither_t *dither;
  966. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  967. char const * const *list = caca_get_dither_antialias_list(dither);
  968. int i;
  969. array_init(return_value);
  970. for(i = 0; list[i]; i += 2)
  971. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  972. }
  973. PHP_FUNCTION(caca_get_dither_color) {
  974. zval *_zval;
  975. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  976. RETURN_FALSE;
  977. }
  978. caca_dither_t *dither;
  979. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  980. RETURN_STRING((char *) caca_get_dither_color(dither), 1);
  981. }
  982. PHP_FUNCTION(caca_set_dither_charset) {
  983. zval *_zval;
  984. int str_len;
  985. char *str;
  986. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  987. RETURN_FALSE;
  988. }
  989. caca_dither_t *dither;
  990. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  991. RETURN_SUCCESS(caca_set_dither_charset(dither, str));
  992. }
  993. PHP_FUNCTION(caca_get_dither_charset_list) {
  994. zval *_zval;
  995. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  996. RETURN_FALSE;
  997. }
  998. caca_dither_t *dither;
  999. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1000. char const * const *list = caca_get_dither_charset_list(dither);
  1001. int i;
  1002. array_init(return_value);
  1003. for(i = 0; list[i]; i += 2)
  1004. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1005. }
  1006. PHP_FUNCTION(caca_get_dither_charset) {
  1007. zval *_zval;
  1008. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1009. RETURN_FALSE;
  1010. }
  1011. caca_dither_t *dither;
  1012. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1013. RETURN_STRING((char *) caca_get_dither_charset(dither), 1);
  1014. }
  1015. PHP_FUNCTION(caca_set_dither_algorithm) {
  1016. zval *_zval;
  1017. int str_len;
  1018. char *str;
  1019. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1020. RETURN_FALSE;
  1021. }
  1022. caca_dither_t *dither;
  1023. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1024. RETURN_SUCCESS(caca_set_dither_algorithm(dither, str));
  1025. }
  1026. PHP_FUNCTION(caca_get_dither_algorithm_list) {
  1027. zval *_zval;
  1028. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1029. RETURN_FALSE;
  1030. }
  1031. caca_dither_t *dither;
  1032. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1033. char const * const *list = caca_get_dither_algorithm_list(dither);
  1034. int i;
  1035. array_init(return_value);
  1036. for(i = 0; list[i]; i += 2)
  1037. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1038. }
  1039. PHP_FUNCTION(caca_get_dither_algorithm) {
  1040. zval *_zval;
  1041. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1042. RETURN_FALSE;
  1043. }
  1044. caca_dither_t *dither;
  1045. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1046. RETURN_STRING((char *) caca_get_dither_algorithm(dither), 1);
  1047. }
  1048. PHP_FUNCTION(caca_dither_bitmap_gd) {
  1049. zval *_zval1, *_zval2, *_zval3;
  1050. long x, y, w, h = 0;
  1051. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllrr", &_zval1, &x, &y, &w, &h, &_zval2, &_zval3) == FAILURE) {
  1052. RETURN_FALSE;
  1053. }
  1054. caca_canvas_t *canvas;
  1055. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval1, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1056. caca_dither_t *dither;
  1057. ZEND_FETCH_RESOURCE(dither, caca_dither_t*, &_zval2, -1, PHP_CACA_DITHER_RES_NAME, le_caca_dither);
  1058. gdImage *img = fetch_external_resource(_zval3, "gd");
  1059. if (!img) {
  1060. RETURN_FALSE;
  1061. }
  1062. void *pixels = gd_get_pixels(img);
  1063. if (!pixels) {
  1064. RETURN_FALSE;
  1065. }
  1066. caca_dither_bitmap(canvas, x, y, w, h, dither, pixels);
  1067. free(pixels);
  1068. RETURN_TRUE;
  1069. }
  1070. PHP_FUNCTION(caca_load_font) {
  1071. }
  1072. PHP_FUNCTION(caca_get_font_list) {
  1073. char const * const *list = caca_get_font_list();
  1074. int i;
  1075. array_init(return_value);
  1076. for(i = 0; list[i]; i += 1)
  1077. add_next_index_string(return_value, (char*) list[i], 1);
  1078. }
  1079. PHP_FUNCTION(caca_get_font_width) {
  1080. zval *_zval;
  1081. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1082. RETURN_FALSE;
  1083. }
  1084. caca_font_t *font;
  1085. ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
  1086. RETURN_LONG(caca_get_font_width(font));
  1087. }
  1088. PHP_FUNCTION(caca_get_font_height) {
  1089. zval *_zval;
  1090. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1091. RETURN_FALSE;
  1092. }
  1093. caca_font_t *font;
  1094. ZEND_FETCH_RESOURCE(font, caca_font_t*, &_zval, -1, PHP_CACA_FONT_RES_NAME, le_caca_font);
  1095. RETURN_LONG(caca_get_font_height(font));
  1096. }
  1097. PHP_FUNCTION(caca_get_font_bloc) {
  1098. }
  1099. PHP_FUNCTION(caca_render_canvas) {
  1100. }
  1101. PHP_FUNCTION(caca_canvas_set_figfont) {
  1102. zval *_zval;
  1103. char *font;
  1104. long font_len;
  1105. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &font, &font_len) == FAILURE) {
  1106. RETURN_FALSE;
  1107. }
  1108. caca_canvas_t *canvas;
  1109. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1110. RETURN_SUCCESS(caca_canvas_set_figfont(canvas, font));
  1111. }
  1112. PHP_FUNCTION(caca_put_figchar) {
  1113. }
  1114. PHP_FUNCTION(caca_flush_figlet) {
  1115. zval *_zval;
  1116. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1117. RETURN_FALSE;
  1118. }
  1119. caca_canvas_t *canvas;
  1120. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1121. RETURN_SUCCESS(caca_flush_figlet(canvas));
  1122. }
  1123. PHP_FUNCTION(caca_file_open) {
  1124. char *path, *mode;
  1125. long path_len, mode_len;
  1126. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &path, &path_len, &mode, &mode_len) == FAILURE) {
  1127. RETURN_FALSE;
  1128. }
  1129. caca_file_t *file = caca_file_open(path, mode);
  1130. ZEND_REGISTER_RESOURCE(return_value, file, le_caca_file);
  1131. }
  1132. PHP_FUNCTION(caca_file_close) {
  1133. zval *_zval;
  1134. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1135. RETURN_FALSE;
  1136. }
  1137. caca_file_t *file;
  1138. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1139. //TODO: check that file was not already closed
  1140. RETURN_SUCCESS(caca_file_close(file));
  1141. }
  1142. PHP_FUNCTION(caca_file_tell) {
  1143. zval *_zval;
  1144. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1145. RETURN_FALSE;
  1146. }
  1147. caca_file_t *file;
  1148. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1149. RETURN_LONG(caca_file_tell(file));
  1150. }
  1151. PHP_FUNCTION(caca_file_read) {
  1152. zval *_zval;
  1153. long len;
  1154. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &len) == FAILURE) {
  1155. RETURN_FALSE;
  1156. }
  1157. caca_file_t *file;
  1158. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1159. char *buffer = emalloc(len);
  1160. caca_file_read(file, buffer, len);
  1161. return_value->type = IS_STRING;
  1162. return_value->value.str.len = len;
  1163. return_value->value.str.val = buffer;
  1164. }
  1165. PHP_FUNCTION(caca_file_write) {
  1166. zval *_zval;
  1167. char *buf;
  1168. long buf_len = 0;
  1169. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &buf, &buf_len) == FAILURE) {
  1170. RETURN_FALSE;
  1171. }
  1172. caca_file_t *file;
  1173. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1174. RETURN_LONG(caca_file_write(file, buf, buf_len));
  1175. }
  1176. PHP_FUNCTION(caca_file_gets) {
  1177. }
  1178. PHP_FUNCTION(caca_file_eof) {
  1179. zval *_zval;
  1180. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1181. RETURN_FALSE;
  1182. }
  1183. caca_file_t *file;
  1184. ZEND_FETCH_RESOURCE(file, caca_file_t*, &_zval, -1, PHP_CACA_FILE_RES_NAME, le_caca_file);
  1185. RETURN_BOOL(caca_file_eof(file) != 0);
  1186. }
  1187. PHP_FUNCTION(caca_import_string) {
  1188. zval *_zval;
  1189. char *src, *format;
  1190. long src_len, format_len = 0;
  1191. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &src, &src_len, &format, &format_len) == FAILURE) {
  1192. RETURN_FALSE;
  1193. }
  1194. caca_canvas_t *canvas;
  1195. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1196. RETURN_LONG(caca_import_memory(canvas, src, src_len, format));
  1197. }
  1198. PHP_FUNCTION(caca_import_file) {
  1199. zval *_zval;
  1200. char *filename, *format;
  1201. long filename_len, format_len = 0;
  1202. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &_zval, &filename, &filename_len, &format, &format_len) == FAILURE) {
  1203. RETURN_FALSE;
  1204. }
  1205. caca_canvas_t *canvas;
  1206. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1207. RETURN_LONG(caca_import_file(canvas, filename, format));
  1208. }
  1209. PHP_FUNCTION(caca_get_import_list) {
  1210. char const * const *list = caca_get_import_list();
  1211. int i;
  1212. array_init(return_value);
  1213. for(i = 0; list[i]; i += 2)
  1214. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1215. }
  1216. PHP_FUNCTION(caca_export_string) {
  1217. zval *_zval;
  1218. char *type;
  1219. long type_len;
  1220. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &type, &type_len) == FAILURE) {
  1221. RETURN_FALSE;
  1222. }
  1223. caca_canvas_t *canvas;
  1224. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1225. void *buffer;
  1226. size_t len;
  1227. buffer = caca_export_memory(canvas, type, &len);
  1228. if (!buffer) {
  1229. RETURN_FALSE;
  1230. }
  1231. return_value->type = IS_STRING;
  1232. return_value->value.str.len = len;
  1233. return_value->value.str.val = emalloc(len);
  1234. memcpy(return_value->value.str.val, buffer, len);
  1235. free(buffer);
  1236. }
  1237. PHP_FUNCTION(caca_get_export_list) {
  1238. char const * const *list = caca_get_export_list();
  1239. int i;
  1240. array_init(return_value);
  1241. for(i = 0; list[i]; i += 2)
  1242. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1243. }
  1244. PHP_FUNCTION(caca_create_display) {
  1245. caca_canvas_t *canvas;
  1246. FETCH_CANVAS(canvas);
  1247. caca_display_t *display = caca_create_display(canvas);
  1248. ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
  1249. }
  1250. PHP_FUNCTION(caca_create_display_with_driver) {
  1251. zval *_zval;
  1252. char *str;
  1253. long str_len = 0;
  1254. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1255. RETURN_FALSE;
  1256. }
  1257. caca_canvas_t *canvas;
  1258. ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas);
  1259. caca_display_t *display = caca_create_display_with_driver(canvas, str);
  1260. if (!display) {
  1261. RETURN_FALSE;
  1262. }
  1263. ZEND_REGISTER_RESOURCE(return_value, display, le_caca_display);
  1264. }
  1265. PHP_FUNCTION(caca_get_display_driver_list) {
  1266. char const * const *list = caca_get_display_driver_list();
  1267. int i;
  1268. array_init(return_value);
  1269. for(i = 0; list[i]; i += 2)
  1270. add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1);
  1271. }
  1272. PHP_FUNCTION(caca_get_display_driver) {
  1273. zval *_zval;
  1274. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1275. RETURN_FALSE;
  1276. }
  1277. caca_display_t *display;
  1278. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1279. RETURN_STRING((char *) caca_get_display_driver(display), 1);
  1280. }
  1281. PHP_FUNCTION(caca_set_display_driver) {
  1282. zval *_zval;
  1283. char *str;
  1284. long str_len;
  1285. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1286. RETURN_FALSE;
  1287. }
  1288. caca_display_t *display;
  1289. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1290. RETURN_SUCESS(caca_set_display_driver(display, str));
  1291. }
  1292. PHP_FUNCTION(caca_get_canvas) {
  1293. zval *_zval;
  1294. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) {
  1295. RETURN_FALSE;
  1296. }
  1297. caca_display_t *display;
  1298. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1299. caca_canvas_t *canvas = caca_get_canvas(display);
  1300. ZEND_REGISTER_RESOURCE(return_value, canvas, le_caca_canvas);
  1301. }
  1302. PHP_FUNCTION(caca_refresh_display) {
  1303. caca_display_t *display;
  1304. FETCH_DISPLAY(display);
  1305. RETURN_SUCCESS(caca_refresh_display(display));
  1306. }
  1307. PHP_FUNCTION(caca_set_display_time) {
  1308. zval *_zval;
  1309. long value = 0;
  1310. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1311. RETURN_FALSE;
  1312. }
  1313. caca_display_t *display;
  1314. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1315. RETURN_SUCCESS(caca_set_display_time(display, value));
  1316. }
  1317. PHP_FUNCTION(caca_get_display_time) {
  1318. caca_display_t *display;
  1319. FETCH_DISPLAY(display);
  1320. RETURN_LONG(caca_get_display_time(display));
  1321. }
  1322. PHP_FUNCTION(caca_get_display_width) {
  1323. caca_display_t *display;
  1324. FETCH_DISPLAY(display);
  1325. RETURN_LONG(caca_get_display_width(display));
  1326. }
  1327. PHP_FUNCTION(caca_get_display_height) {
  1328. caca_display_t *display;
  1329. FETCH_DISPLAY(display);
  1330. RETURN_LONG(caca_get_display_height(display));
  1331. }
  1332. PHP_FUNCTION(caca_set_display_title) {
  1333. zval *_zval;
  1334. char *str;
  1335. long str_len = 0;
  1336. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &_zval, &str, &str_len) == FAILURE) {
  1337. RETURN_FALSE;
  1338. }
  1339. caca_display_t *display;
  1340. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1341. RETURN_SUCCESS(caca_set_display(display, str));
  1342. }
  1343. PHP_FUNCTION(caca_set_mouse) {
  1344. zval *_zval;
  1345. long value = 0;
  1346. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1347. RETURN_FALSE;
  1348. }
  1349. caca_display_t *display;
  1350. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1351. RETURN_SUCCESS(caca_set_mouse(display, value));
  1352. }
  1353. PHP_FUNCTION(caca_set_cursor) {
  1354. zval *_zval;
  1355. long value = 0;
  1356. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &_zval, &value) == FAILURE) {
  1357. RETURN_FALSE;
  1358. }
  1359. caca_display_t *display;
  1360. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1361. RETURN_SUCCESS(caca_set_cursor(display, value));
  1362. }
  1363. PHP_FUNCTION(caca_get_event) {
  1364. zval *_zval1, *_zval2 = NULL;
  1365. long g, aa = 0;
  1366. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|rl", &_zval1, &g, &_zval2, &aa) == FAILURE) {
  1367. RETURN_FALSE;
  1368. }
  1369. caca_display_t *display;
  1370. ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval1, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display);
  1371. caca_event_t *event = NULL;
  1372. if (_zval2) {
  1373. ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval2, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event);
  1374. }
  1375. RETURN_LONG(caca_get_event(display, g, event, aa));
  1376. }
  1377. PHP_FUNCTION(caca_get_mouse_x) {
  1378. caca_display_t *display;
  1379. FETCH_DISPLAY(display);
  1380. RETURN_LONG(caca_get_mouse_x(display));
  1381. }
  1382. PHP_FUNCTION(caca_get_mouse_y) {
  1383. caca_display_t *display;
  1384. FETCH_DISPLAY(display);
  1385. RETURN_LONG(caca_get_mouse_y(display));
  1386. }
  1387. PHP_FUNCTION(caca_get_event_type) {
  1388. caca_event_t *event;
  1389. FETCH_EVENT(event);
  1390. RETURN_LONG(caca_get_event_type(event));
  1391. }
  1392. PHP_FUNCTION(caca_get_event_key_ch) {
  1393. caca_event_t *event;
  1394. FETCH_EVENT(event);
  1395. RETURN_LONG(caca_get_event_key_ch(event));
  1396. }
  1397. PHP_FUNCTION(caca_get_event_mouse_button) {
  1398. caca_event_t *event;
  1399. FETCH_EVENT(event);
  1400. RETURN_LONG(caca_get_event_mouse_button(event));
  1401. }
  1402. PHP_FUNCTION(caca_get_event_mouse_x) {
  1403. caca_event_t *event;
  1404. FETCH_EVENT(event);
  1405. RETURN_LONG(caca_get_event_mouse_x(event));
  1406. }
  1407. PHP_FUNCTION(caca_get_event_mouse_y) {
  1408. caca_event_t *event;
  1409. FETCH_EVENT(event);
  1410. RETURN_LONG(caca_get_event_mouse_y(event));
  1411. }
  1412. PHP_FUNCTION(caca_get_event_resize_width) {
  1413. caca_event_t *event;
  1414. FETCH_EVENT(event);
  1415. RETURN_LONG(caca_get_event_resize_width(event));
  1416. }
  1417. PHP_FUNCTION(caca_get_event_resize_height) {
  1418. caca_event_t *event;
  1419. FETCH_EVENT(event);
  1420. RETURN_LONG(caca_get_event_resize_height(event));
  1421. }