@@ -7,15 +7,17 @@ TESTS = test | |||||
endif | endif | ||||
cucul_la_CPPFLAGS = -I$(top_srcdir)/cucul -I$(RUBY_ARCHDIR) | cucul_la_CPPFLAGS = -I$(top_srcdir)/cucul -I$(RUBY_ARCHDIR) | ||||
cucul_la_SOURCES = cucul.c cucul-canvas.c cucul-font.c | |||||
cucul_la_SOURCES = cucul.c cucul-canvas.c cucul-dither.c cucul-font.c | |||||
cucul_la_LDFLAGS = -module -avoid-version -shared -L$(RUBY_LIBDIR) -l$(RUBY_SO_NAME) | cucul_la_LDFLAGS = -module -avoid-version -shared -L$(RUBY_LIBDIR) -l$(RUBY_SO_NAME) | ||||
cucul_la_LIBADD = ../cucul/libcucul.la | cucul_la_LIBADD = ../cucul/libcucul.la | ||||
EXTRA_DIST = cucul-canvas.h \ | EXTRA_DIST = cucul-canvas.h \ | ||||
cucul-canvas.h \ | |||||
cucul-dither.h \ | |||||
cucul-font.h \ | |||||
common.h \ | common.h \ | ||||
test.rb \ | test.rb \ | ||||
t/tc_canvas.rb \ | t/tc_canvas.rb \ | ||||
t/tc_dither.rb \ | |||||
t/tc_font.rb \ | t/tc_font.rb \ | ||||
t/tc_frame.rb \ | t/tc_frame.rb \ | ||||
README | README | ||||
@@ -7,7 +7,8 @@ There is no real documentation but "methods" on any object should help you :) | |||||
The objects available for now are : | The objects available for now are : | ||||
- Cucul::Canvas (functions that have a cucul_canvas_t* as first argument) | - Cucul::Canvas (functions that have a cucul_canvas_t* as first argument) | ||||
* dither_bitmap is missing as Cucul::Dither is not yet implemented | |||||
- Cucul::Dither (functions that have a cucul_dither_t* as first argument) | |||||
- Cucul::Font (functions that have a cucul_font_t* as first argument) | - 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 constructor can currently only accept the name of a builtin font | ||||
@@ -26,7 +27,7 @@ irb(main):001:0> Cucul.constants | |||||
=> ["BROWN", "BOLD", "GREEN", "LIGHTMAGENTA", "LIGHTBLUE", "BLINK", | => ["BROWN", "BOLD", "GREEN", "LIGHTMAGENTA", "LIGHTBLUE", "BLINK", | ||||
"MAGENTA", "DEFAULT", "TRANSPARENT", "BLUE", "LIGHTRED", "DARKGRAY", | "MAGENTA", "DEFAULT", "TRANSPARENT", "BLUE", "LIGHTRED", "DARKGRAY", | ||||
"UNDERLINE", "RED", "WHITE", "BLACK", "LIGHTCYAN", "LIGHTGRAY", | "UNDERLINE", "RED", "WHITE", "BLACK", "LIGHTCYAN", "LIGHTGRAY", | ||||
"ITALICS", "CYAN", "YELLOW", "LIGHTGREEN", "Canvas", "Font"] | |||||
"ITALICS", "CYAN", "YELLOW", "LIGHTGREEN", "Canvas", "Dither", "Font"] | |||||
\endcode | \endcode | ||||
\code | \code | ||||
@@ -53,13 +54,24 @@ Cucul::Canvas.ancestors[1].instance_methods | |||||
"stretch_left", "stretch_right", "width", "width="] | "stretch_left", "stretch_right", "width", "width="] | ||||
\endcode | \endcode | ||||
\code | |||||
irb(main):004:0> Cucul::Font.methods.sort - | irb(main):004:0> Cucul::Font.methods.sort - | ||||
Cucul::Font.ancestors[1].methods | Cucul::Font.ancestors[1].methods | ||||
=> ["list"] | => ["list"] | ||||
\endcode | |||||
\code | |||||
irb(main):005:0> Cucul::Font.instance_methods.sort - | irb(main):005:0> Cucul::Font.instance_methods.sort - | ||||
Cucul::Font.ancestors[1].instance_methods | Cucul::Font.ancestors[1].instance_methods | ||||
=> ["blocks", "height", "width"] | => ["blocks", "height", "width"] | ||||
\endcode | |||||
\code | |||||
irb(main):006:0> Cucul::Dither.instance_methods.sort - | |||||
Cucul::Dither.ancestors[1].instance_methods => ["brightness=", | |||||
"contrast=", "gamma=", "palette=", "set_brightness", "set_contrast", | |||||
"set_gamma", "set_palette"] | |||||
\endcode | |||||
And here are sample uses : | And here are sample uses : | ||||
@@ -0,0 +1,180 @@ | |||||
/* | |||||
* libcucul Ruby bindings | |||||
* Copyright (c) 2007 Pascal Terjan <pterjan@linuxfr.org> | |||||
* | |||||
* This library is free software. It comes without any warranty, to | |||||
* the extent permitted by applicable law. You can redistribute it | |||||
* and/or modify it under the terms of the Do What The Fuck You Want | |||||
* To Public License, Version 2, as published by Sam Hocevar. See | |||||
* http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
*/ | |||||
#include <ruby.h> | |||||
#include <cucul.h> | |||||
#include <errno.h> | |||||
#include "common.h" | |||||
VALUE cFont; | |||||
void dither_free(void *dither) | |||||
{ | |||||
cucul_free_dither((cucul_dither_t *)dither); | |||||
} | |||||
static VALUE dither_alloc(VALUE klass) | |||||
{ | |||||
VALUE obj; | |||||
obj = Data_Wrap_Struct(klass, 0, dither_free, NULL); | |||||
return obj; | |||||
} | |||||
static VALUE dither_initialize(VALUE self, VALUE bpp, VALUE w, VALUE h, VALUE pitch, VALUE rmask, VALUE gmask, VALUE bmask, VALUE amask) | |||||
{ | |||||
cucul_dither_t *dither; | |||||
dither = cucul_create_dither(NUM2UINT(bpp), NUM2UINT(w), NUM2UINT(h), NUM2UINT(pitch), NUM2ULONG(rmask), NUM2ULONG(gmask), NUM2ULONG(bmask), NUM2ULONG(amask)); | |||||
if(dither == NULL) | |||||
{ | |||||
rb_raise(rb_eRuntimeError, strerror(errno)); | |||||
} | |||||
_SELF = dither; | |||||
return self; | |||||
} | |||||
static VALUE set_dither_palette(VALUE self, VALUE palette) | |||||
{ | |||||
int i; | |||||
unsigned int *red, *blue, *green, *alpha; | |||||
VALUE v, r, g, b, a; | |||||
int error = 0; | |||||
if(RARRAY(palette)->len != 256) | |||||
{ | |||||
rb_raise(rb_eArgError, "Palette must contain 256 elements"); | |||||
} | |||||
red = ALLOC_N(unsigned int, 256); | |||||
if(!red) | |||||
rb_raise(rb_eNoMemError,"Out of memory"); | |||||
green = ALLOC_N(unsigned int, 256); | |||||
if(!green) | |||||
{ | |||||
free(red); | |||||
rb_raise(rb_eNoMemError,"Out of memory"); | |||||
} | |||||
blue = ALLOC_N(unsigned int, 256); | |||||
if(!blue) | |||||
{ | |||||
free(red); | |||||
free(green); | |||||
rb_raise(rb_eNoMemError,"Out of memory"); | |||||
} | |||||
alpha = ALLOC_N(unsigned int, 256); | |||||
if(!alpha) | |||||
{ | |||||
free(red); | |||||
free(green); | |||||
free(blue); | |||||
rb_raise(rb_eNoMemError,"Out of memory"); | |||||
} | |||||
for(i=0; i<256; i++) | |||||
{ | |||||
v = rb_ary_entry(palette, i); | |||||
if((TYPE(v) == T_ARRAY) && (RARRAY(v)->len == 4)) | |||||
{ | |||||
r = rb_ary_entry(v,0); | |||||
g = rb_ary_entry(v,1); | |||||
b = rb_ary_entry(v,2); | |||||
a = rb_ary_entry(v,3); | |||||
if(rb_obj_is_kind_of(r, rb_cInteger) && | |||||
rb_obj_is_kind_of(g, rb_cInteger) && | |||||
rb_obj_is_kind_of(b, rb_cInteger) && | |||||
rb_obj_is_kind_of(a, rb_cInteger)) | |||||
{ | |||||
red[i] = NUM2INT(r); | |||||
green[i] = NUM2INT(g); | |||||
blue[i] = NUM2INT(b); | |||||
alpha[i] = NUM2INT(a); | |||||
} else | |||||
error = 1; | |||||
} | |||||
else | |||||
error = 1; | |||||
} | |||||
if(error) | |||||
{ | |||||
free(red); | |||||
free(green); | |||||
free(blue); | |||||
free(alpha); | |||||
rb_raise(rb_eArgError, "Invalid palette"); | |||||
} | |||||
if(cucul_set_dither_palette(_SELF, red, green, blue, alpha)<0) | |||||
{ | |||||
free(red); | |||||
free(green); | |||||
free(blue); | |||||
free(alpha); | |||||
rb_raise(rb_eRuntimeError, strerror(errno)); | |||||
} | |||||
free(red); | |||||
free(green); | |||||
free(blue); | |||||
free(alpha); | |||||
return palette; | |||||
} | |||||
static VALUE set_dither_palette2(VALUE self, VALUE palette) | |||||
{ | |||||
set_dither_palette(self, palette); | |||||
return self; | |||||
} | |||||
#define set_float(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)); \ | |||||
\ | |||||
return x; \ | |||||
} \ | |||||
\ | |||||
static VALUE set_##x##2 (VALUE self, VALUE x) \ | |||||
{ \ | |||||
set_##x(self, x); \ | |||||
return self; \ | |||||
} | |||||
set_float(brightness) | |||||
set_float(gamma) | |||||
set_float(contrast) | |||||
/* | |||||
int cucul_set_dither_invert (cucul_dither_t *, int) | |||||
Invert colors of dither. | |||||
*/ | |||||
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); | |||||
} | |||||
@@ -0,0 +1,9 @@ | |||||
#ifndef __CUCUL_DITHER_H__ | |||||
#define __CUCUL_DITHER_H__ | |||||
#include <ruby.h> | |||||
extern VALUE cDither; | |||||
extern void Init_cucul_dither(VALUE); | |||||
#endif |
@@ -13,6 +13,7 @@ | |||||
#include <cucul.h> | #include <cucul.h> | ||||
#include "cucul-canvas.h" | #include "cucul-canvas.h" | ||||
#include "cucul-dither.h" | |||||
#include "cucul-font.h" | #include "cucul-font.h" | ||||
void Init_cucul() | void Init_cucul() | ||||
@@ -44,5 +45,6 @@ void Init_cucul() | |||||
rb_define_const(mCucul, "BLINK", INT2FIX(CUCUL_BLINK)); | rb_define_const(mCucul, "BLINK", INT2FIX(CUCUL_BLINK)); | ||||
Init_cucul_canvas(mCucul); | Init_cucul_canvas(mCucul); | ||||
Init_cucul_dither(mCucul); | |||||
Init_cucul_font(mCucul); | Init_cucul_font(mCucul); | ||||
} | } |
@@ -0,0 +1,51 @@ | |||||
require 'test/unit' | |||||
require 'cucul' | |||||
class TC_Canvas < Test::Unit::TestCase | |||||
def test_create | |||||
assert_nothing_raised { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
} | |||||
end | |||||
def test_fail_create | |||||
assert_raise(RuntimeError) { | |||||
d = Cucul::Dither.new(-1, 32, 32, 32, 0, 0, 0, 0) | |||||
} | |||||
end | |||||
def test_set_palette | |||||
assert_nothing_raised { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.palette=[[0xfff, 0xfff, 0xfff, 0xfff]]*256 | |||||
} | |||||
end | |||||
def test_fail_set_palette | |||||
assert_raise(ArgumentError) { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.palette=[] | |||||
} | |||||
end | |||||
def test_fail_set_palette2 | |||||
assert_raise(RuntimeError) { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.palette=[[0xffff, 0, 0, 0]]*256 | |||||
} | |||||
end | |||||
def test_set_brightness | |||||
assert_nothing_raised { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.brightness=0.5 | |||||
} | |||||
end | |||||
def test_set_gamma | |||||
assert_nothing_raised { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.gamma=0.5 | |||||
} | |||||
end | |||||
def test_set_contrast | |||||
assert_nothing_raised { | |||||
d = Cucul::Dither.new(8, 32, 32, 32, 0, 0, 0, 0) | |||||
d.contrast=0.5 | |||||
} | |||||
end | |||||
end |