Mercurial > molko
changeset 190:5dc57029b9f1
molko-js: allow objects/parameters in Molko.Painter API
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 07 Nov 2020 10:16:38 +0100 |
parents | a5436e15898d |
children | 633a25df450e |
files | examples/js/painter.js molko-js/src/js-painter.c |
diffstat | 2 files changed, 138 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/js/painter.js Sat Nov 07 10:16:38 2020 +0100 @@ -0,0 +1,50 @@ +/* + * painter.js -- simple example to use the painter + * + * Copyright (c) 2020 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +const w = new Molko.Window("Example - Painter", 1280, 720); +const p = new Molko.Painter(); + +for (var run = true; run;) { + for (var ev; ev = Molko.Event.poll(); ) { + switch (ev.type) { + case Molko.Event.QUIT: + run = false; + break; + default: + break; + } + } + + /* Change a color. */ + p.color = 0x3c5e8bff; + p.clear(); + + /* Draw using individual arguments. */ + p.color = 0x7a367bff; + p.drawLine(10, 10, 50, 10); + p.drawRectangle(10, 20, 20, 20); + p.drawCircle(20, 65, 10); + + /* Draw using objects. */ + p.color = 0x884b2bff; + p.drawLine({x1: 10, y1: 100, x2: 50, y2: 100}); + p.drawRectangle({x: 10, y: 120, w: 20, h: 20}); + p.drawCircle({x: 20, y: 165, r: 10}); + + p.present(); +}
--- a/molko-js/src/js-painter.c Fri Nov 06 15:15:01 2020 +0100 +++ b/molko-js/src/js-painter.c Sat Nov 07 10:16:38 2020 +0100 @@ -69,12 +69,28 @@ static duk_ret_t js_painter_drawLine(duk_context *ctx) { - painter_draw_line( - duk_require_int(ctx, 0), - duk_require_int(ctx, 1), - duk_require_int(ctx, 2), - duk_require_int(ctx, 3) - ); + int x1, y1, x2, y2; + + if (duk_get_top(ctx) == 4) { + x1 = duk_require_int(ctx, 0); + y1 = duk_require_int(ctx, 1); + x2 = duk_require_int(ctx, 2); + y2 = duk_require_int(ctx, 3); + } else if (duk_get_top(ctx) == 1) { + duk_require_object(ctx, 0); + duk_get_prop_string(ctx, 0, "x1"); + x1 = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "y1"); + y1 = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "x2"); + x2 = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "y2"); + y2 = duk_require_int(ctx, -1); + duk_pop_n(ctx, 4); + } else + return duk_error(ctx, DUK_ERR_ERROR, "Object or 4 numbers expected"); + + painter_draw_line(x1, y2, x2, y2); return 0; } @@ -82,10 +98,22 @@ static duk_ret_t js_painter_drawPoint(duk_context *ctx) { - painter_draw_point( - duk_require_int(ctx, 0), - duk_require_int(ctx, 1) - ); + int x, y; + + if (duk_get_top(ctx) == 2) { + x = duk_require_int(ctx, 0); + y = duk_require_int(ctx, 1); + } else if (duk_get_top(ctx) == 1) { + duk_require_object(ctx, 0); + duk_get_prop_string(ctx, 0, "x"); + x = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "y"); + y = duk_require_int(ctx, -1); + duk_pop_n(ctx, 2); + } else + return duk_error(ctx, DUK_ERR_ERROR, "Object or 2 numbers expected"); + + painter_draw_point(x, y); return 0; } @@ -93,12 +121,29 @@ static duk_ret_t js_painter_drawRectangle(duk_context *ctx) { - painter_draw_rectangle( - duk_require_int(ctx, 0), - duk_require_int(ctx, 1), - duk_require_int(ctx, 2), - duk_require_int(ctx, 3) - ); + int x, y; + unsigned int w, h; + + if (duk_get_top(ctx) == 4) { + x = duk_require_int(ctx, 0); + y = duk_require_int(ctx, 1); + w = duk_require_uint(ctx, 2); + h = duk_require_uint(ctx, 3); + } else if (duk_get_top(ctx) == 1) { + duk_require_object(ctx, 0); + duk_get_prop_string(ctx, 0, "x"); + x = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "y"); + y = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "w"); + w = duk_require_uint(ctx, -1); + duk_get_prop_string(ctx, 0, "h"); + h = duk_require_uint(ctx, -1); + duk_pop_n(ctx, 4); + } else + return duk_error(ctx, DUK_ERR_ERROR, "Object or 4 numbers expected"); + + painter_draw_rectangle(x, y, w, h); return 0; } @@ -106,11 +151,26 @@ static duk_ret_t js_painter_drawCircle(duk_context *ctx) { - painter_draw_circle( - duk_require_int(ctx, 0), - duk_require_int(ctx, 1), - duk_require_number(ctx, 2) - ); + int x, y; + double r; + + if (duk_get_top(ctx) == 3) { + x = duk_require_int(ctx, 0); + y = duk_require_int(ctx, 1); + r = duk_require_number(ctx, 2); + } else if (duk_get_top(ctx) == 1) { + duk_require_object(ctx, 0); + duk_get_prop_string(ctx, 0, "x"); + x = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "y"); + y = duk_require_int(ctx, -1); + duk_get_prop_string(ctx, 0, "r"); + r = duk_require_number(ctx, -1); + duk_pop_n(ctx, 3); + } else + return duk_error(ctx, DUK_ERR_ERROR, "Object or 3 numbers expected"); + + painter_draw_circle(x, y, r); return 0; } @@ -126,13 +186,13 @@ } static const duk_function_list_entry methods[] = { - { "clear", js_painter_clear, 0 }, - { "drawLine", js_painter_drawLine, 4 }, - { "drawPoint", js_painter_drawPoint, 2 }, - { "drawRectangle", js_painter_drawRectangle, 4 }, - { "drawCircle", js_painter_drawCircle, 3 }, - { "present", js_painter_present, 0 }, - { NULL, NULL, 0 } + { "clear", js_painter_clear, 0 }, + { "drawLine", js_painter_drawLine, DUK_VARARGS }, + { "drawPoint", js_painter_drawPoint, DUK_VARARGS }, + { "drawRectangle", js_painter_drawRectangle, DUK_VARARGS }, + { "drawCircle", js_painter_drawCircle, DUK_VARARGS }, + { "present", js_painter_present, 0 }, + { NULL, NULL, 0 } }; void