-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrect.c
65 lines (57 loc) · 1.64 KB
/
rect.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "ext_rgss.h"
#include "graphics.h"
#include "sprite.h"
VALUE cRect;
static VALUE (*Rect_set_)(int, VALUE*, VALUE);
VALUE Rect_set(int argc, VALUE *argv, VALUE self) {
VALUE refs = rb_ivar_get(self, rb_intern("@refs"));
RgssRect *rect = RGSS_RECT(self);
Rect_set_(argc, argv, self);
if(argc == 1) {
RgssRect *src = RGSS_RECT(argv[0]);
rect->x = src->x;
rect->y = src->y;
rect->w = src->w;
rect->h = src->h;
} else {
VALUE x, y, w, h;
rb_scan_args(argc, argv, "4", &x, &y, &w, &h);
rect->x = FIX2LONG(x);
rect->y = FIX2LONG(y);
rect->w = FIX2LONG(w);
rect->h = FIX2LONG(h);
}
if(RTEST(refs)) {
switch(TYPE(refs)) {
case T_DATA:
if(RTYPEDDATA_TYPE(refs) == &Sprite_data_type) {
Sprite *sprite = EXT_SPRITE(refs);
Sprite__update_rect(sprite);
}
}
}
return self;
}
void Rect__add_ref(VALUE self, VALUE ref) {
VALUE refs = rb_ivar_get(self, rb_intern("@refs"));
if(RTEST(refs)) {
rb_raise(rb_eNotImpError, "TODO: Rect__add_ref is under construction");
} else {
rb_ivar_set(self, rb_intern("@refs"), ref);
}
}
void Rect__remove_ref(VALUE self, VALUE ref) {
VALUE refs = rb_ivar_get(self, rb_intern("@refs"));
if(refs == ref) {
rb_ivar_set(self, rb_intern("@refs"), Qnil);
} else {
rb_p(refs);
rb_p(ref);
rb_raise(rb_eNotImpError, "TODO: Rect__remove_ref is under construction");
}
}
void Init_ExtRect() {
cRect = rb_const_get(rb_cObject, rb_intern("Rect"));
Rect_set_ = get_instance_method(cRect, "set");
rb_define_method(cRect, "set", Rect_set, -1);
}