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

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