diff --git a/ruby/caca-canvas.c b/ruby/caca-canvas.c index badfb5c..f46985f 100644 --- a/ruby/caca-canvas.c +++ b/ruby/caca-canvas.c @@ -451,6 +451,62 @@ static VALUE fill_triangle(VALUE self, VALUE x1, VALUE y1, VALUE x2, VALUE y2, V return self; } +static VALUE fill_triangle_textured(VALUE self, VALUE coords, VALUE texture, VALUE uv) +{ + caca_canvas_t *ctexture; + int i, l; + int ccoords[6]; + float cuv[6]; + VALUE v; + + l = RARRAY(coords)->len; + if(l != 6 && l != 3) + { + rb_raise(rb_eArgError, "invalid coords list"); + } + for(i=0; ilen != 2)) + rb_raise(rb_eArgError, "invalid coords list"); + ccoords[2*i] = NUM2INT(rb_ary_entry(v, 0)); + ccoords[2*i+1] = NUM2INT(rb_ary_entry(v, 1)); + } + } + + l = RARRAY(uv)->len; + if(l != 6 && l != 3) + { + rb_raise(rb_eArgError, "invalid uv list"); + } + for(i=0; ilen != 2)) + rb_raise(rb_eArgError, "invalid uv list"); + ccoords[2*i] = NUM2DBL(rb_ary_entry(v, 0)); + ccoords[2*i+1] = NUM2DBL(rb_ary_entry(v, 1)); + } + } + + if(CLASS_OF(texture) != cCanvas) + { + rb_raise(rb_eArgError, "texture is not a Caca::Canvas"); + } + Data_Get_Struct(texture, caca_canvas_t, ctexture); + + caca_fill_triangle_textured(_SELF, ccoords, ctexture, cuv); + 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) @@ -638,6 +694,7 @@ void Init_caca_canvas(VALUE mCaca) 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, "fill_triangle_textured", fill_triangle_textured, 4); rb_define_method(cCanvas, "dither_bitmap", dither_bitmap, 6); rb_define_method(cCanvas, "frame_count", get_frame_count, 0);