#include "rays/ruby/camera.h" #include "rays/ruby/image.h" #include "defs.h" RUCY_DEFINE_VALUE_FROM_TO(RAYS_EXPORT, Rays::Camera) #define THIS to(self) #define CHECK RUCY_CHECK_OBJECT(Rays::Camera, self) static VALUE alloc(VALUE klass) { return new_type(klass); } static VALUE setup(VALUE self, VALUE device_name, VALUE min_width, VALUE min_height, VALUE resize, VALUE crop) { RUCY_CHECK_OBJ(Rays::Camera, self); *THIS = Rays::Camera( device_name ? device_name.c_str() : NULL, to(min_width), to(min_height), to(resize), to(crop)); return self; } static VALUE start(VALUE self) { CHECK; return value(THIS->start()); } static VALUE stop(VALUE self) { CHECK; THIS->stop(); } static VALUE is_active(VALUE self) { CHECK; return value(THIS->is_active()); } static VALUE set_min_width(VALUE self, VALUE width) { CHECK; THIS->set_min_width(to(width)); return value(THIS->min_width()); } static VALUE min_width(VALUE self) { CHECK; return value(THIS->min_width()); } static VALUE set_min_height(VALUE self, VALUE height) { CHECK; THIS->set_min_height(to(height)); return value(THIS->min_height()); } static VALUE min_height(VALUE self) { CHECK; return value(THIS->min_height()); } static VALUE set_resize(VALUE self, VALUE resize) { CHECK; THIS->set_resize(to(resize)); return value(THIS->is_resize()); } static VALUE is_resize(VALUE self) { CHECK; return value(THIS->is_resize()); } static VALUE set_crop(VALUE self, VALUE crop) { CHECK; THIS->set_crop(to(crop)); return value(THIS->is_crop()); } static VALUE is_crop(VALUE self) { CHECK; return value(THIS->is_crop()); } static VALUE image(VALUE self) { CHECK; const Rays::Image* img = THIS->image(); return img ? value(*img) : nil(); } static VALUE device_names(VALUE self) { auto names = Rays::get_camera_device_names(); std::vector v; for (const auto& name : names) v.emplace_back(name.c_str()); return array(&v[0], v.size()); } static Class cCamera; void Init_rays_camera () { Module mRays = rb_define_module("Rays"); cCamera = rb_define_class_under(mRays, "Camera", rb_cObject); rb_define_alloc_func(cCamera, alloc); rb_define_private_method(cCamera, "setup", RUBY_METHOD_FUNC(setup), 5); rb_define_method(cCamera, "start", RUBY_METHOD_FUNC(start), 0); rb_define_method(cCamera, "stop", RUBY_METHOD_FUNC(stop), 0); cCamera.define_method("active?", is_active); rb_define_method(cCamera, "min_width=", RUBY_METHOD_FUNC(set_min_width), 1); rb_define_method(cCamera, "min_width", RUBY_METHOD_FUNC(min_width), 0); rb_define_method(cCamera, "min_height=", RUBY_METHOD_FUNC(set_min_height), 1); rb_define_method(cCamera, "min_height", RUBY_METHOD_FUNC(min_height), 0); rb_define_method(cCamera, "resize=", RUBY_METHOD_FUNC(set_resize), 1); cCamera.define_method("resize?", is_resize); rb_define_method(cCamera, "crop=", RUBY_METHOD_FUNC(set_crop), 1); cCamera.define_method("crop?", is_crop); rb_define_method(cCamera, "image", RUBY_METHOD_FUNC(image), 0); rb_define_module_function(cCamera, "device_names", RUBY_METHOD_FUNC(device_names), 0); } namespace Rays { Class camera_class () { return cCamera; } }// Rays