Mercurial > molko
annotate src/libmlk-core-js/core/js-drawable-stack.c @ 363:c74ab1bbedec
js: add drawable bindings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 24 Oct 2021 09:55:12 +0200 |
parents | |
children | 15bdac29ba4b |
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-stack.h -- core drawable_stack 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-stack.h" |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include "js-drawable.h" |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #define SIGNATURE DUK_HIDDEN_SYMBOL("Mlk.DrawableStack") |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 static inline struct drawable_stack * |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 self(duk_context *ctx) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 struct drawable_stack *sf = NULL; |
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 duk_push_this(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 duk_get_prop_string(ctx, -1, SIGNATURE); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 sf = duk_to_pointer(ctx, -1); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 duk_pop_2(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 if (!sf) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a DrawableStack object"); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 return sf; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 } |
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 static duk_ret_t |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 DrawableStack_constructor(duk_context *ctx) |
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 duk_push_this(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 duk_push_pointer(ctx, alloc_new0(sizeof (struct drawable_stack))); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 duk_put_prop_string(ctx, -2, SIGNATURE); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 duk_pop(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 return 0; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 } |
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 static duk_ret_t |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 DrawableStack_destructor(duk_context *ctx) |
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 struct drawable_stack *st; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 duk_get_prop_string(ctx, 0, SIGNATURE); |
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 ((st = duk_to_pointer(ctx, -1))) { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 drawable_stack_finish(st); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 free(st); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 } |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 duk_pop(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 duk_del_prop_string(ctx, 0, SIGNATURE); |
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 return 0; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 } |
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 static duk_ret_t |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 DrawableStack_add(duk_context *ctx) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 struct drawable_stack *st = self(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 struct drawable *dw = js_drawable_require(ctx, 0); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 if (drawable_stack_add(st, dw) < 0) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 drawable_finish(dw); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 return 0; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 } |
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 static duk_ret_t |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 DrawableStack_update(duk_context *ctx) |
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 struct drawable_stack *st = self(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 const unsigned int ticks = duk_require_uint(ctx, 0); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 duk_push_uint(ctx, drawable_stack_update(st, ticks)); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 return 1; |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 } |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 static duk_ret_t |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 DrawableStack_draw(duk_context *ctx) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 drawable_stack_draw(self(ctx)); |
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 return 0; |
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 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 static duk_function_list_entry methods[] = { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 { "add", DrawableStack_add, 1 }, |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 { "update", DrawableStack_update, 1 }, |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 { "draw", DrawableStack_draw, 0 }, |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 { NULL, NULL, 0 } |
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 |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 void |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 js_drawable_stack_bind(duk_context *ctx) |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 { |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 assert(ctx); |
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 duk_push_c_function(ctx, DrawableStack_constructor, 0); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 duk_push_object(ctx); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 duk_put_function_list(ctx, -1, methods); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 duk_push_c_function(ctx, DrawableStack_destructor, 1); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 duk_set_finalizer(ctx, -2); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 duk_put_prop_string(ctx, -2, "prototype"); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 duk_put_global_string(ctx, "DrawableStack"); |
c74ab1bbedec
js: add drawable bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 } |