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