Mercurial > molko
annotate src/libmlk-core-js/core/js-sprite.c @ 361:39f5d932941a
misc: fix some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 22 Oct 2021 14:26:41 +0200 |
parents | 56830e59f776 |
children | 460c78706989 |
rev | line source |
---|---|
344 | 1 /* |
2 * js-sprite.c -- core sprite binding | |
3 * | |
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <assert.h> | |
20 | |
21 #include <core/alloc.h> | |
22 #include <core/sprite.h> | |
23 | |
24 #include "js-sprite.h" | |
25 #include "js-texture.h" | |
26 | |
27 #define SIGNATURE DUK_HIDDEN_SYMBOL("Mlk.Sprite") | |
345
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
28 #define PROTOTYPE DUK_HIDDEN_SYMBOL("Mlk.Sprite.Prototype") |
344 | 29 #define TEXREF DUK_HIDDEN_SYMBOL("Mlk.Sprite.texture") |
30 | |
31 static inline struct sprite * | |
32 self(duk_context *ctx) | |
33 { | |
34 struct sprite *sprite; | |
35 | |
36 duk_push_this(ctx); | |
37 duk_get_prop_string(ctx, -1, SIGNATURE); | |
38 sprite = duk_to_pointer(ctx, -1); | |
39 duk_pop_2(ctx); | |
40 | |
41 if (!sprite) | |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
42 return (void)duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Sprite object"), NULL; |
344 | 43 |
44 return sprite; | |
45 } | |
46 | |
47 static duk_ret_t | |
48 Sprite_constructor(duk_context *ctx) | |
49 { | |
50 struct sprite *sprite; | |
51 struct texture *tex = js_texture_require(ctx, 0); | |
52 const unsigned int cellw = duk_require_uint(ctx, 1); | |
53 const unsigned int cellh = duk_require_uint(ctx, 2); | |
54 | |
55 sprite = alloc_new0(sizeof (*sprite)); | |
56 sprite_init(sprite, tex, cellw, cellh); | |
57 | |
58 duk_push_this(ctx); | |
59 duk_push_pointer(ctx, sprite); | |
60 duk_put_prop_string(ctx, -2, SIGNATURE); | |
61 | |
62 /* Store a copy of texture to avoid destruction. */ | |
63 duk_dup(ctx, 0); | |
64 duk_put_prop_string(ctx, -2, TEXREF); | |
65 | |
66 duk_pop(ctx); | |
67 | |
68 return 0; | |
69 } | |
70 | |
71 static duk_ret_t | |
72 Sprite_destructor(duk_context *ctx) | |
73 { | |
74 duk_get_prop_string(ctx, 0, SIGNATURE); | |
75 free(duk_to_pointer(ctx, -1)); | |
76 duk_pop(ctx); | |
77 duk_del_prop_string(ctx, 0, SIGNATURE); | |
78 | |
79 /* Remove texture reference. */ | |
80 duk_del_prop_string(ctx, 0, TEXREF); | |
81 | |
82 return 0; | |
83 } | |
84 | |
85 static duk_ret_t | |
86 Sprite_draw(duk_context *ctx) | |
87 { | |
88 const struct sprite *sprite = self(ctx); | |
89 const unsigned int r = duk_require_uint(ctx, 0); | |
90 const unsigned int c = duk_require_uint(ctx, 1); | |
91 const int x = duk_require_int(ctx, 2); | |
92 const int y = duk_require_int(ctx, 3); | |
93 | |
94 if (r >= sprite->nrows) | |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
95 return duk_error(ctx, DUK_ERR_RANGE_ERROR, "row overflow: %u >= %u", r, sprite->nrows); |
344 | 96 if (c >= sprite->ncols) |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
97 return duk_error(ctx, DUK_ERR_RANGE_ERROR, "column overflow: %u >= %u", c, sprite->ncols); |
344 | 98 |
99 sprite_draw(sprite, r, c, x, y); | |
100 | |
101 return 0; | |
102 } | |
103 | |
104 static duk_ret_t | |
105 Sprite_scale(duk_context *ctx) | |
106 { | |
107 const struct sprite *sprite = self(ctx); | |
108 const unsigned int r = duk_require_uint(ctx, 0); | |
109 const unsigned int c = duk_require_uint(ctx, 1); | |
110 const int x = duk_require_int(ctx, 2); | |
111 const int y = duk_require_int(ctx, 3); | |
112 const unsigned int w = duk_require_uint(ctx, 4); | |
113 const unsigned int h = duk_require_uint(ctx, 5); | |
114 | |
115 if (r >= sprite->nrows) | |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
116 return duk_error(ctx, DUK_ERR_RANGE_ERROR, "row overflow: %u >= %u", r, sprite->nrows); |
344 | 117 if (c >= sprite->ncols) |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
118 return duk_error(ctx, DUK_ERR_RANGE_ERROR, "column overflow: %u >= %u", c, sprite->ncols); |
344 | 119 |
120 sprite_scale(sprite, r, c, x, y, w, h); | |
121 | |
122 return 0; | |
123 } | |
124 | |
125 static const duk_function_list_entry methods[] = { | |
126 { "draw", Sprite_draw, 4 }, | |
127 { "scale", Sprite_scale, 6 }, | |
128 { NULL, NULL, 0 } | |
129 }; | |
130 | |
131 void | |
132 js_sprite_bind(duk_context *ctx) | |
133 { | |
134 assert(ctx); | |
135 | |
136 duk_push_c_function(ctx, Sprite_constructor, 3); | |
137 duk_push_object(ctx); | |
138 duk_put_function_list(ctx, -1, methods); | |
139 duk_push_c_function(ctx, Sprite_destructor, 1); | |
140 duk_set_finalizer(ctx, -2); | |
345
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
141 duk_dup(ctx, -1); |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
142 duk_put_global_string(ctx, PROTOTYPE); |
344 | 143 duk_put_prop_string(ctx, -2, "prototype"); |
144 duk_put_global_string(ctx, "Sprite"); | |
145 } | |
345
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
146 |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
147 struct sprite * |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
148 js_sprite_require(duk_context *ctx, duk_idx_t idx) |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
149 { |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
150 struct sprite *sprite; |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
151 |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
152 duk_get_prop_string(ctx, idx, SIGNATURE); |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
153 sprite = duk_to_pointer(ctx, -1); |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
154 duk_pop(ctx); |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
155 |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
156 if (!sprite) |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
345
diff
changeset
|
157 return (void)duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Sprite object"), NULL; |
345
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
158 |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
159 return sprite; |
56830e59f776
js: add animation bindings
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
160 } |