Browse Source

* Finish Cucul::Dither

tags/v0.99.beta14
Pascal Terjan pterjan 17 years ago
parent
commit
cf4cdf995d
4 changed files with 112 additions and 67 deletions
  1. +8
    -3
      ruby/README
  2. +42
    -0
      ruby/common.h
  3. +14
    -45
      ruby/cucul-canvas.c
  4. +48
    -19
      ruby/cucul-dither.c

+ 8
- 3
ruby/README View File

@@ -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



+ 42
- 0
ruby/common.h View File

@@ -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

+ 14
- 45
ruby/cucul-canvas.c View File

@@ -12,6 +12,7 @@
#include <ruby.h>
#include <cucul.h>
#include <errno.h>
#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);


+ 48
- 19
ruby/cucul-dither.c View File

@@ -14,7 +14,7 @@
#include <errno.h>
#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);
}


Loading…
Cancel
Save