From 2bba9c42673d519695995ced02e69035c98b1a40 Mon Sep 17 00:00:00 2001 From: Nicolas Vion Date: Sun, 26 Oct 2008 13:38:47 +0000 Subject: [PATCH] * Add php binding for 4 new functions * Add "full" demo to "examples/demo.php" --- caca-php/examples/demo.php | 131 +++++++++++++++++++++++++++++++++---- caca-php/php_caca.c | 44 +++++++++++++ 2 files changed, 164 insertions(+), 11 deletions(-) diff --git a/caca-php/examples/demo.php b/caca-php/examples/demo.php index 6e8ebac..01fae6e 100644 --- a/caca-php/examples/demo.php +++ b/caca-php/examples/demo.php @@ -12,7 +12,6 @@ function main() { die("Error while attaching canvas to display\n"); } - display_menu($cv, $dp); caca_set_display_time($dp, 40000); @@ -20,7 +19,7 @@ function main() { caca_set_mouse($dp, 0); /* Main menu */ - display_menu($cv, $dp); + display_menu($cv, $dp, $bounds, $outline); caca_refresh_display($dp); @@ -47,18 +46,18 @@ function main() { case ord('o'): case ord('O'): $outline = ($outline + 1) % 3; - display_menu($cv, $dp); + display_menu($cv, $dp, $bounds, $outline); break; case ord('b'): case ord('B'): $bounds = ($bounds + 1) % 2; - display_menu($cv, $dp); + display_menu($cv, $dp, $bounds, $outline); break; case ord('d'): case ord('D'): $dithering = ($dithering + 1) % 5; caca_set_feature($cv, $dithering); - display_menu($cv, $dp); + display_menu($cv, $dp, $bounds, $outline); break; case ord('f'): case ord('F'): @@ -105,7 +104,7 @@ function main() { } if ($menu || ($mouse && !$demo)) { - display_menu($cv, $dp); + display_menu($cv, $dp, $bounds, $outline); if ($mouse && !$demo) { caca_set_color_ansi($cv, CACA_RED, CACA_BLACK); caca_put_str($cv, $xmouse, $ymouse,"."); @@ -116,18 +115,103 @@ function main() { } if ($demo) { - $demo($cv, $bounds, $outline, $dithering); + if (function_exists($demo)) + $demo($cv, $bounds, $outline, $dithering); caca_set_color_ansi($cv, CACA_LIGHTGRAY, CACA_BLACK); caca_draw_thin_box($cv, 1, 1, caca_get_canvas_width($cv) - 2, caca_get_canvas_height($cv) - 2); - $rate = (1000000 / caca_get_display_time($dp)).".".((10000000 / caca_get_display_time($dp)) % 10); + $rate = sprintf("%01.2f", 1000000 / caca_get_display_time($dp)); caca_put_str($cv, 4, 1, "[$rate fps]----"); caca_refresh_display($dp); } } } -function display_menu($cv, $dp) { +function demo_all($cv, $dp, $bounds, $outline) { + global $i; + + $i++; + + caca_set_color_ansi($cv, CACA_LIGHTGRAY, CACA_BLACK); + caca_clear_canvas($cv); + + /* Draw the sun */ + caca_set_color_ansi($cv, CACA_YELLOW, CACA_BLACK); + $xo = caca_get_canvas_width($cv) / 4; + $yo = caca_get_canvas_height($cv) / 4 + 5 * sin(0.03 * $i); + + for ($j = 0; $j < 16; $j++) { + $xa = $xo - (30 + sin(0.03 * $i) * 8) * sin(0.03 * $i + M_PI * $j / 8); + $ya = $yo + (15 + sin(0.03 * $i) * 4) * cos(0.03 * $i + M_PI * $j / 8); + caca_draw_thin_line($cv, $xo, $yo, $xa, $ya); + } + + $j = 15 + sin(0.03 * $i) * 8; + caca_set_color_ansi($cv, CACA_WHITE, CACA_BLACK); + caca_fill_ellipse($cv, $xo, $yo, $j, $j / 2, '#'); + caca_set_color_ansi($cv, CACA_YELLOW, CACA_BLACK); + caca_draw_ellipse($cv, $xo, $yo, $j, $j / 2, '#'); + + /* Draw the pyramid */ + $xo = caca_get_canvas_width($cv) * 5 / 8; + $yo = 2; + + $xa = caca_get_canvas_width($cv) / 8 + sin(0.03 * $i) * 5; + $ya = caca_get_canvas_height($cv) / 2 + cos(0.03 * $i) * 5; + + $xb = caca_get_canvas_width($cv) - 10 - cos(0.02 * $i) * 10; + $yb = caca_get_canvas_height($cv) * 3 / 4 - 5 + sin(0.02 * $i) * 5; + + $xc = caca_get_canvas_width($cv) / 4 - sin(0.02 * $i) * 5; + $yc = caca_get_canvas_height($cv) * 3 / 4 + cos(0.02 * $i) * 5; + + caca_set_color_ansi($cv, CACA_GREEN, CACA_BLACK); + caca_fill_triangle($cv, $xo, $yo, $xb, $yb, $xa, $ya, '%'); + caca_set_color_ansi($cv, CACA_YELLOW, CACA_BLACK); + caca_draw_thin_triangle($cv, $xo, $yo, $xb, $yb, $xa, $ya); + + caca_set_color_ansi($cv, CACA_RED, CACA_BLACK); + caca_fill_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc, '#'); + caca_set_color_ansi($cv, CACA_YELLOW, CACA_BLACK); + caca_draw_thin_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc); + + caca_set_color_ansi($cv, CACA_BLUE, CACA_BLACK); + caca_fill_triangle($cv, $xo, $yo, $xb, $yb, $xc, $yc, '%'); + caca_set_color_ansi($cv, CACA_YELLOW, CACA_BLACK); + caca_draw_thin_triangle($cv, $xo, $yo, $xb, $yb, $xc, $yc); + + /* Draw a background triangle */ + $xa = 2; + $ya = 2; + + $xb = caca_get_canvas_width($cv) - 3; + $yb = caca_get_canvas_height($cv) / 2; + + $xc = caca_get_canvas_width($cv) / 3; + $yc = caca_get_canvas_height($cv) - 3; + + caca_set_color_ansi($cv, CACA_CYAN, CACA_BLACK); + caca_draw_thin_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc); + + $xo = caca_get_canvas_width($cv) / 2 + cos(0.027 * $i) * caca_get_canvas_width($cv) / 3; + $yo = caca_get_canvas_height($cv) / 2 - sin(0.027 * $i) * caca_get_canvas_height($cv) / 2; + + caca_draw_thin_line($cv, $xa, $ya, $xo, $yo); + caca_draw_thin_line($cv, $xb, $yb, $xo, $yo); + caca_draw_thin_line($cv, $xc, $yc, $xo, $yo); + + /* Draw a trail behind the foreground sprite */ + for($j = $i - 60; $j < $i; $j++) { + $delta = caca_rand(-5, 6); + caca_set_color_ansi($cv, caca_rand(0, 16), caca_rand(0, 16)); + caca_put_char($cv, + caca_get_canvas_width($cv) / 2 + cos(0.02 * $j) * ($delta + caca_get_canvas_width($cv) / 4), + caca_get_canvas_height($cv) / 2 + sin(0.02 * $j) * ($delta + caca_get_canvas_height($cv) / 3), + '#'); + } +} + +function display_menu($cv, $dp, $bounds, $outline) { $xo = caca_get_canvas_width($cv) - 2; $yo = caca_get_canvas_height($cv) - 2; @@ -152,8 +236,8 @@ function display_menu($cv, $dp) { caca_put_str($cv, 4, 15, "'s': sprites"); caca_put_str($cv, 4, 16, "settings:"); - caca_put_str($cv, 4, 17, "'o': outline: ".((outline == 0) ? "none" : ((outline == 1) ? "solid" : "thin"))); - caca_put_str($cv, 4, 18, "'b': drawing boundaries: ".((bounds == 0) ? "screen" : "infinite")); + caca_put_str($cv, 4, 17, "'o': outline: ".(($outline == 0) ? "none" : (($outline == 1) ? "solid" : "thin"))); + caca_put_str($cv, 4, 18, "'b': drawing boundaries: ".(($bounds == 0) ? "screen" : "infinite")); caca_put_str($cv, 4, $yo - 2, "'q': quit"); caca_refresh_display($dp); @@ -240,6 +324,31 @@ function demo_ellipses($cv, $bounds, $outline, $dithering) { caca_draw_ellipse($cv, $x, $y, $a, $b, '#'); } +function demo_triangles($cv, $bounds, $outline, $dithering) { + $w = caca_get_canvas_width($cv); + $h = caca_get_canvas_height($cv); + + if ($bounds) { + $xa = caca_rand(- $w, 2 * $w); $ya = caca_rand(- $h, 2 * $h); + $xb = caca_rand(- $w, 2 * $w); $yb = caca_rand(- $h, 2 * $h); + $xc = caca_rand(- $w, 2 * $w); $yc = caca_rand(- $h, 2 * $h); + } + else { + $xa = caca_rand(0, $w); $ya = caca_rand(0, $h); + $xb = caca_rand(0, $w); $yb = caca_rand(0, $h); + $xc = caca_rand(0, $w); $yc = caca_rand(0, $h); + } + + caca_set_color_ansi($cv, caca_rand(0, 16), caca_rand(0, 16)); + caca_fill_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc, '#'); + + caca_set_color_ansi($cv, caca_rand(0, 16), CACA_BLACK); + if ($outline == 2) + caca_draw_thin_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc); + else if ($outline == 1) + caca_draw_triangle($cv, $xa, $ya, $xb, $yb, $xc, $yc, '#'); +} + main(); diff --git a/caca-php/php_caca.c b/caca-php/php_caca.c index 2bd319a..c221547 100644 --- a/caca-php/php_caca.c +++ b/caca-php/php_caca.c @@ -626,6 +626,18 @@ PHP_FUNCTION(caca_draw_thin_polyline) { } PHP_FUNCTION(caca_draw_circle) { + zval *_zval; + char *str; + long str_len, x, y, r = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllls", &_zval, &x, &y, &r, &str, &str_len) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + if (str_len != 1) { + RETURN_FALSE; + } + RETURN_BOOL(caca_draw_circle(canvas, x, y, r, str[0]) == 0); } PHP_FUNCTION(caca_draw_ellipse) { @@ -722,12 +734,44 @@ PHP_FUNCTION(caca_fill_box) { } PHP_FUNCTION(caca_draw_triangle) { + zval *_zval; + char *str; + long str_len, xa, ya, xb, yb, xc, yc = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + if (str_len != 1) { + RETURN_FALSE; + } + RETURN_BOOL(caca_draw_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]) == 0); } PHP_FUNCTION(caca_draw_thin_triangle) { + zval *_zval; + long xa, ya, xb, yb, xc, yc = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllll", &_zval, &xa, &ya, &xb, &yb, &xc, &yc) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + RETURN_BOOL(caca_draw_thin_triangle(canvas, xa, ya, xb, yb, xc, yc) == 0); } PHP_FUNCTION(caca_fill_triangle) { + zval *_zval; + char *str; + long str_len, xa, ya, xb, yb, xc, yc = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllls", &_zval, &xa, &ya, &xb, &yb, &xc, &yc, &str, &str_len) == FAILURE) { + RETURN_FALSE; + } + caca_canvas_t *canvas; + ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); + if (str_len != 1) { + RETURN_FALSE; + } + RETURN_BOOL(caca_fill_triangle(canvas, xa, ya, xb, yb, xc, yc, str[0]) == 0); } PHP_FUNCTION(caca_get_frame_count) {