diff --git a/ruby/README b/ruby/README index aa60afd..cef80f6 100644 --- a/ruby/README +++ b/ruby/README @@ -4,7 +4,7 @@ This a Ruby binding for libcucul, libcaca will be added later. There is no real documentation but "methods" on any object should help you :) -The objects available for now are : +The objects available are : - Cucul::Canvas (functions that have a cucul_canvas_t* as first argument) @@ -13,6 +13,8 @@ The objects available for now are : - Cucul::Font (functions that have a cucul_font_t* as first argument) * The constructor can currently only accept the name of a builtin font +The character set conversion functions are not available yet in the binding. + I tried to follow Ruby spirit meaning that : - most of the methods return self - the methods set_foo with only an argument are also available as foo= @@ -68,8 +70,11 @@ Cucul::Font.ancestors[1].instance_methods \code irb(main):006:0> Cucul::Dither.instance_methods.sort - -Cucul::Dither.ancestors[1].instance_methods => ["brightness=", -"contrast=", "gamma=", "palette=", "set_brightness", "set_contrast", +Cucul::Dither.ancestors[1].instance_methods +=> ["algorithm=", "algorithm_list", "antialias=", "antialias_list", +"brightness=", "charset=", "charset_list", "color=", "color_list", +"contrast=", "gamma=", "palette=", "set_algorithm", "set_antialias", +"set_brightness", "set_charset", "set_color", "set_contrast", "set_gamma", "set_palette"] \endcode diff --git a/ruby/common.h b/ruby/common.h index e9668d0..2345389 100644 --- a/ruby/common.h +++ b/ruby/common.h @@ -3,4 +3,46 @@ #define _SELF (DATA_PTR(self)) +#define get_singleton_double_list(x) \ +static VALUE x##_list(void) \ +{ \ + VALUE ary, ary2; \ + char const* const* list; \ + \ + list = cucul_get_##x##_list(); \ + ary = rb_ary_new(); \ + while (*list != NULL) \ + { \ + ary2 = rb_ary_new(); \ + rb_ary_push(ary2, rb_str_new2(*list)); \ + list++; \ + rb_ary_push(ary2, rb_str_new2(*list)); \ + list++; \ + rb_ary_push(ary, ary2); \ + } \ + \ + return ary; \ +} + +#define get_double_list(x) \ +static VALUE x##_list(VALUE self) \ +{ \ + VALUE ary, ary2; \ + char const* const* list; \ + \ + list = cucul_get_##x##_list(_SELF); \ + ary = rb_ary_new(); \ + while (*list != NULL) \ + { \ + ary2 = rb_ary_new(); \ + rb_ary_push(ary2, rb_str_new2(*list)); \ + list++; \ + rb_ary_push(ary2, rb_str_new2(*list)); \ + list++; \ + rb_ary_push(ary, ary2); \ + } \ + \ + return ary; \ +} + #endif diff --git a/ruby/cucul-canvas.c b/ruby/cucul-canvas.c index e54c2f4..fd40969 100644 --- a/ruby/cucul-canvas.c +++ b/ruby/cucul-canvas.c @@ -12,6 +12,7 @@ #include #include #include +#include "cucul-dither.h" #include "cucul-font.h" #include "common.h" @@ -438,6 +439,16 @@ static VALUE fill_triangle(VALUE self, VALUE x1, VALUE y1, VALUE x2, VALUE y2, V return self; } +static VALUE dither_bitmap(VALUE self, VALUE x, VALUE y, VALUE w, VALUE h, VALUE d, VALUE pixels) +{ + if(CLASS_OF(d) != cDither) + rb_raise(rb_eArgError, "d is not a Cucul::Dither"); + Check_Type(pixels, T_STRING); + + cucul_dither_bitmap(_SELF, NUM2INT(x), NUM2INT(y), NUM2INT(w), NUM2INT(h), DATA_PTR(d), StringValuePtr(pixels)); + return self; +} + /****/ get_int(frame_count) @@ -549,51 +560,8 @@ static VALUE export_memory(VALUE self, VALUE format) return ret; } -static VALUE export_list(void) -{ - VALUE ary, ary2; - - char const* const* list; - - list = cucul_get_export_list(); - - ary = rb_ary_new(); - - while (*list != NULL) - { - ary2 = rb_ary_new(); - rb_ary_push(ary2, rb_str_new2(*list)); - list++; - rb_ary_push(ary2, rb_str_new2(*list)); - list++; - rb_ary_push(ary, ary2); - } - - return ary; -} - -static VALUE import_list(void) -{ - VALUE ary, ary2; - - char const* const* list; - - list = cucul_get_import_list(); - - ary = rb_ary_new(); - - while (*list != NULL) - { - ary2 = rb_ary_new(); - rb_ary_push(ary2, rb_str_new2(*list)); - list++; - rb_ary_push(ary2, rb_str_new2(*list)); - list++; - rb_ary_push(ary, ary2); - } - - return ary; -} +get_singleton_double_list(export) +get_singleton_double_list(import) /****/ @@ -658,6 +626,7 @@ void Init_cucul_canvas(VALUE mCucul) rb_define_method(cCanvas, "draw_triangle", draw_triangle, 7); rb_define_method(cCanvas, "draw_thin_triangle", draw_thin_triangle, 6); rb_define_method(cCanvas, "fill_triangle", fill_triangle, 7); + rb_define_method(cCanvas, "dither_bitmap", dither_bitmap, 6); rb_define_method(cCanvas, "frame_count", get_frame_count, 0); rb_define_method(cCanvas, "frame=", set_frame, 1); diff --git a/ruby/cucul-dither.c b/ruby/cucul-dither.c index bba27dc..bcd4304 100644 --- a/ruby/cucul-dither.c +++ b/ruby/cucul-dither.c @@ -14,7 +14,7 @@ #include #include "common.h" -VALUE cFont; +VALUE cDither; void dither_free(void *dither) { @@ -139,7 +139,7 @@ static VALUE set_dither_palette2(VALUE self, VALUE palette) } #define set_float(x) \ -static VALUE set_##x (VALUE self, VALUE x) \ +static VALUE set_##x(VALUE self, VALUE x) \ { \ if(cucul_set_dither_##x(_SELF, (float)NUM2DBL(x))<0)\ rb_raise(rb_eRuntimeError, strerror(errno)); \ @@ -147,7 +147,7 @@ static VALUE set_##x (VALUE self, VALUE x) \ return x; \ } \ \ -static VALUE set_##x##2 (VALUE self, VALUE x) \ +static VALUE set_##x##2(VALUE self, VALUE x) \ { \ set_##x(self, x); \ return self; \ @@ -157,24 +157,53 @@ set_float(brightness) set_float(gamma) set_float(contrast) -/* - int cucul_set_dither_invert (cucul_dither_t *, int) - Invert colors of dither. -*/ +#define get_set_str_from_list(x) \ +get_double_list(dither_##x) \ +static VALUE set_dither_##x(VALUE self, VALUE x) \ +{ \ + if(cucul_set_dither_##x(_SELF, StringValuePtr(x))<0) \ + { \ + rb_raise(rb_eRuntimeError, strerror(errno)); \ + } \ + return x; \ +} \ + \ +static VALUE set_dither_##x##2(VALUE self, VALUE x) \ +{ \ + set_dither_##x(self, x); \ + return self; \ +} + +get_set_str_from_list(antialias) +get_set_str_from_list(color) +get_set_str_from_list(charset) +get_set_str_from_list(algorithm) void Init_cucul_dither(VALUE mCucul) { - cFont = rb_define_class_under(mCucul, "Dither", rb_cObject); - rb_define_alloc_func(cFont, dither_alloc); - - rb_define_method(cFont, "initialize", dither_initialize, 8); - rb_define_method(cFont, "palette=", set_dither_palette, 1); - rb_define_method(cFont, "set_palette", set_dither_palette2, 1); - rb_define_method(cFont, "brightness=", set_brightness, 1); - rb_define_method(cFont, "set_brightness", set_brightness2, 1); - rb_define_method(cFont, "gamma=", set_gamma, 1); - rb_define_method(cFont, "set_gamma", set_gamma2, 1); - rb_define_method(cFont, "contrast=", set_contrast, 1); - rb_define_method(cFont, "set_contrast", set_contrast2, 1); + cDither = rb_define_class_under(mCucul, "Dither", rb_cObject); + rb_define_alloc_func(cDither, dither_alloc); + + rb_define_method(cDither, "initialize", dither_initialize, 8); + rb_define_method(cDither, "palette=", set_dither_palette, 1); + rb_define_method(cDither, "set_palette", set_dither_palette2, 1); + rb_define_method(cDither, "brightness=", set_brightness, 1); + rb_define_method(cDither, "set_brightness", set_brightness2, 1); + rb_define_method(cDither, "gamma=", set_gamma, 1); + rb_define_method(cDither, "set_gamma", set_gamma2, 1); + rb_define_method(cDither, "contrast=", set_contrast, 1); + rb_define_method(cDither, "set_contrast", set_contrast2, 1); + rb_define_method(cDither, "antialias_list", dither_antialias_list, 0); + rb_define_method(cDither, "antialias=", set_dither_antialias, 1); + rb_define_method(cDither, "set_antialias", set_dither_antialias2, 1); + rb_define_method(cDither, "color_list", dither_color_list, 0); + rb_define_method(cDither, "color=", set_dither_color, 1); + rb_define_method(cDither, "set_color", set_dither_color2, 1); + rb_define_method(cDither, "charset_list", dither_charset_list, 0); + rb_define_method(cDither, "charset=", set_dither_charset, 1); + rb_define_method(cDither, "set_charset", set_dither_charset2, 1); + rb_define_method(cDither, "algorithm_list", dither_algorithm_list, 0); + rb_define_method(cDither, "algorithm=", set_dither_algorithm, 1); + rb_define_method(cDither, "set_algorithm", set_dither_algorithm2, 1); }