#include "rays/ruby/font.h" #include "defs.h" RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Font) #define THIS to(self) #define CHECK RUCY_CHECK_OBJECT(Rays::Font, self) static VALUE alloc(VALUE klass) { return new_type(klass); } static VALUE initialize(VALUE self) { RUCY_CHECK_OBJ(Rays::Font, self); check_arg_count(__FILE__, __LINE__, "Font#initialize", argc, 0, 1, 2); *THIS = to(argc, argv); return self; } static VALUE name(VALUE self) { CHECK; return value(THIS->name().c_str()); } static VALUE size(VALUE self) { CHECK; return value(THIS->size()); } static VALUE width(VALUE self, VALUE str) { CHECK; return value(THIS->get_width(str.c_str())); } static VALUE height(VALUE self) { CHECK; return value(THIS->get_height()); } static VALUE ascent(VALUE self) { CHECK; coord ascent = 0; THIS->get_height(&ascent); return value(ascent); } static VALUE descent(VALUE self) { CHECK; coord descent = 0; THIS->get_height(NULL, &descent); return value(descent); } static VALUE leading(VALUE self) { CHECK; coord leading = 0; THIS->get_height(NULL, NULL, &leading); return value(leading); } static Class cFont; void Init_font () { Module mRays = rb_define_module("Rays"); cFont = rb_define_class_under(mRays, "Font", rb_cObject); rb_define_alloc_func(cFont, alloc); rb_define_private_method(cFont, "initialize", RUBY_METHOD_FUNC(initialize), -1); rb_define_method(cFont, "name", RUBY_METHOD_FUNC(name), 0); rb_define_method(cFont, "size", RUBY_METHOD_FUNC(size), 0); rb_define_method(cFont, "width", RUBY_METHOD_FUNC(width), 1); rb_define_method(cFont, "height", RUBY_METHOD_FUNC(height), 0); rb_define_method(cFont, "ascent", RUBY_METHOD_FUNC(ascent), 0); rb_define_method(cFont, "descent", RUBY_METHOD_FUNC(descent), 0); rb_define_method(cFont, "leading", RUBY_METHOD_FUNC(leading), 0); } namespace Rucy { template <> Rays::Font value_to (int argc, const Value* argv, bool convert) { if (argc == 1 && argv->is_array()) { argc = argv->size(); argv = argv->as_array(); } assert(argc == 0 || (argc > 0 && argv)); if (convert) { if (argc == 0) return Rays::default_font(); coord size = argc >= 2 ? to(argv[1]) : 0; if (argv->is_nil()) return Rays::Font(NULL, size); else if (argv->is_s() || argv->is_sym()) return Rays::Font(argv[0].c_str(), size); } if (argc != 1) argument_error(__FILE__, __LINE__); return value_to(*argv, convert); } }// Rucy namespace Rays { Class font_class () { return cFont; } }// Rays