annotate src/libmlk-core-js/core/js-drawable.c @ 363:c74ab1bbedec

js: add drawable bindings
author David Demelier <markand@malikania.fr>
date Sun, 24 Oct 2021 09:55:12 +0200
parents
children 8ac282bd5935
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
363
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js-drawable.c -- core drawable binding
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <core/alloc.h>
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <core/drawable.h>
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "js-drawable.h"
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #define SIGNATURE DUK_HIDDEN_SYMBOL("Mlk.Drawable")
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 struct self {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 duk_context *ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 void *ptr;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 struct drawable dw;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 unsigned int refc;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 };
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 static inline struct self *
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 self(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 struct self *sf = NULL;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 duk_push_this(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 duk_get_prop_string(ctx, -1, SIGNATURE);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 sf = duk_to_pointer(ctx, -1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 duk_pop_2(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 if (!sf)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Drawable object");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 return sf;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 static inline int
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 callable(struct self *s, const char *prop, duk_context **ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 int callable;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 if (!s->ptr)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 return 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 duk_push_heapptr(s->ctx, s->ptr);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 duk_get_prop_string(s->ctx, -1, prop);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 duk_remove(s->ctx, -2);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 if (duk_is_callable(s->ctx, -1)) {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 *ctx = s->ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 callable = 1;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 } else {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 *ctx = NULL;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 callable = 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 duk_pop(s->ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 return callable;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 static int
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 update(struct drawable *dw, unsigned int ticks)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 duk_context *ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 int ret = 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 if (callable(dw->data, "update", &ctx)) {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 duk_push_uint(ctx, ticks);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 duk_call(ctx, 1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 ret = duk_to_int(ctx, -1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 return ret;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 static void
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 draw(struct drawable *dw)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 duk_context *ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 if (callable(dw->data, "draw", &ctx))
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 duk_call(ctx, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 static void
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 end(struct drawable *dw)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 duk_context *ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 if (callable(dw->data, "end", &ctx))
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 duk_call(ctx, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 static void
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 finish(struct drawable *dw)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 struct self *sf = dw->data;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (!--sf->refc)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 free(sf);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 Drawable_getX(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 duk_push_uint(ctx, self(ctx)->dw.x);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 return 1;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 Drawable_setX(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 self(ctx)->dw.x = duk_require_uint(ctx, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 return 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 Drawable_getY(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 duk_push_uint(ctx, self(ctx)->dw.y);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 return 1;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 Drawable_setY(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 self(ctx)->dw.y = duk_require_uint(ctx, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 return 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 Drawable_constructor(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 struct self *self;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 const int x = duk_require_int(ctx, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 const int y = duk_require_int(ctx, 1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 self = alloc_new0(sizeof (*self));
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 self->refc = 1;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 self->ctx = ctx;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 self->dw.x = x;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 self->dw.y = y;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 self->dw.data = self;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 self->dw.update = update;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 self->dw.finish = finish;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 self->dw.draw = draw;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 self->dw.end = end;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 duk_push_this(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 self->ptr = duk_get_heapptr(ctx, -1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 duk_push_pointer(ctx, self);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 duk_put_prop_string(ctx, -2, SIGNATURE);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 duk_push_string(ctx, "x");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 duk_push_c_function(ctx, Drawable_getX, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 duk_push_c_function(ctx, Drawable_setX, 1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 duk_def_prop(ctx, -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 duk_push_string(ctx, "y");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 duk_push_c_function(ctx, Drawable_getY, 0);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 duk_push_c_function(ctx, Drawable_setY, 1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 duk_def_prop(ctx, -4, DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 duk_pop(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 return 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 static duk_ret_t
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 Drawable_destructor(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 struct self *sf;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 duk_get_prop_string(ctx, 0, SIGNATURE);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 if ((sf = duk_to_pointer(ctx, -1))) {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 sf->ptr = NULL;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 drawable_finish(&sf->dw);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 duk_del_prop_string(ctx, 0, SIGNATURE);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 duk_pop(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 return 0;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
201
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 void
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 js_drawable_bind(duk_context *ctx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 assert(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 duk_push_c_function(ctx, Drawable_constructor, 2);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 duk_push_object(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 duk_push_c_function(ctx, Drawable_destructor, 1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 duk_set_finalizer(ctx, -2);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 duk_put_prop_string(ctx, -2, "prototype");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 duk_put_global_string(ctx, "Drawable");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 struct drawable *
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 js_drawable_require(duk_context *ctx, duk_idx_t idx)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 struct self *sf = NULL;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 if (duk_is_object(ctx, idx)) {
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 duk_get_prop_string(ctx, idx, SIGNATURE);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 sf = duk_to_pointer(ctx, -1);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 duk_pop(ctx);
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 }
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 if (!sf)
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Drawable object");
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
229
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 sf->refc++;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 return &sf->dw;
c74ab1bbedec js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 }