#include "bindings/definitions.h" #include "window/window.h" namespace { void Font_free(mrb_state *mrb, void *ptr) { UNUSED(mrb); uint64_t id = ((Wrapper *)ptr)->id; font_pool.release(id); delete (Wrapper *)ptr; } const struct mrb_data_type Font_type = {"Font", Font_free}; mrb_value Font_init(mrb_state *mrb, mrb_value self) { Wrapper *old = (Wrapper *)DATA_PTR(self); if (old) mrb_free(mrb, old); mrb_data_init(self, nullptr, &Font_type); Wrapper *s = new Wrapper(); char *path; mrb_int size; mrb_value kwargs; mrb_get_args(mrb, "zi|H", &path, &size, &kwargs); bool pixel_art = false; bool bold = false; bool italic = false; bool underline = false; if (!mrb_nil_p(kwargs)) { HASH_BOOL(kwargs, pixel_art, pixel_art); HASH_BOOL(kwargs, bold, bold); HASH_BOOL(kwargs, italic, italic); HASH_BOOL(kwargs, underline, underline); } s->id = window.load_font(path, size, bold, italic, underline, pixel_art); mrb_data_init(self, s, &Font_type); return self; } mrb_value font_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.Font.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 font_hash(mrb_state *, mrb_value self) { Wrapper *wrapper = (Wrapper *)DATA_PTR(self); return mrb_fixnum_value(wrapper->id); } } // namespace namespace definitions { void register_font() { DEF_CLASS(Font, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1)); ADD_METHOD(Font, "==", font_equal, MRB_ARGS_REQ(1)); ADD_METHOD(Font, "eql?", font_equal, MRB_ARGS_REQ(1)); ADD_METHOD(Font, "hash", font_hash, MRB_ARGS_NONE()); bindings.Font = {Font_class, &Font_type}; } } // namespace definitions