78 lines
2.2 KiB
C++
78 lines
2.2 KiB
C++
#include "bindings/definitions.h"
|
|
#include "window/window.h"
|
|
|
|
namespace {
|
|
void Image_free(mrb_state *mrb, void *ptr) {
|
|
UNUSED(mrb);
|
|
uint64_t id = ((Wrapper *)ptr)->id;
|
|
image_pool.release(id);
|
|
delete (Wrapper *)ptr;
|
|
}
|
|
|
|
const struct mrb_data_type Image_type = {"Image", Image_free};
|
|
|
|
mrb_value Image_init(mrb_state *mrb, mrb_value self) {
|
|
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
|
if (old)
|
|
mrb_free(mrb, old);
|
|
mrb_data_init(self, nullptr, &Image_type);
|
|
Wrapper *s = new Wrapper();
|
|
|
|
char *path;
|
|
mrb_value kwargs;
|
|
mrb_get_args(mrb, "z|H", &path, &kwargs);
|
|
|
|
bool pixel_art = false;
|
|
if (!mrb_nil_p(kwargs))
|
|
HASH_BOOL(kwargs, pixel_art, pixel_art);
|
|
|
|
s->id = window.load_image(path, pixel_art);
|
|
|
|
mrb_data_init(self, s, &Image_type);
|
|
return self;
|
|
}
|
|
|
|
mrb_value image_equal(mrb_state *mrb, mrb_value self) {
|
|
mrb_value other;
|
|
mrb_get_args(mrb, "o", &other);
|
|
|
|
if (!mrb_obj_is_kind_of(mrb, other, definitions::bindings.Image.cls))
|
|
return mrb_false_value();
|
|
|
|
Wrapper *wrapper = (Wrapper *)DATA_PTR(self);
|
|
uint64_t id_self = wrapper->id;
|
|
Wrapper *other_wrapper = (Wrapper *)DATA_PTR(other);
|
|
uint64_t id_other = other_wrapper->id;
|
|
|
|
return mrb_bool_value(id_self == id_other);
|
|
}
|
|
|
|
mrb_value image_hash(mrb_state *, mrb_value self) {
|
|
Wrapper *wrapper = (Wrapper *)DATA_PTR(self);
|
|
return mrb_fixnum_value(wrapper->id);
|
|
}
|
|
|
|
mrb_value image_width(mrb_state *mrb, mrb_value self) {
|
|
Wrapper *wrapper = (Wrapper *)DATA_PTR(self);
|
|
uint64_t id = wrapper->id;
|
|
return mrb_float_value(mrb, window.get_image_size(id).x);
|
|
}
|
|
|
|
mrb_value image_height(mrb_state *mrb, mrb_value self) {
|
|
Wrapper *wrapper = (Wrapper *)DATA_PTR(self);
|
|
uint64_t id = wrapper->id;
|
|
return mrb_float_value(mrb, window.get_image_size(id).y);
|
|
}
|
|
} // namespace
|
|
|
|
namespace definitions {
|
|
void register_image() {
|
|
DEF_CLASS(Image, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
|
|
ADD_METHOD(Image, "==", image_equal, MRB_ARGS_REQ(1));
|
|
ADD_METHOD(Image, "eql?", image_equal, MRB_ARGS_REQ(1));
|
|
ADD_METHOD(Image, "hash", image_hash, MRB_ARGS_NONE());
|
|
ADD_METHOD(Image, "width", image_width, MRB_ARGS_NONE());
|
|
ADD_METHOD(Image, "height", image_height, MRB_ARGS_NONE());
|
|
bindings.Image = {Image_class, &Image_type};
|
|
}
|
|
} // namespace definitions
|