Mercurial > molko
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 |
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 } |