Changeset 1948


Ignore:
Timestamp:
Nov 13, 2007, 2:20:14 PM (13 years ago)
Author:
Pascal Terjan
Message:

Improve Ruby API for draw_{,thin_}polyline and fix a leak on error

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/ruby/cucul/cucul-canvas.c

    r1944 r1948  
    245245}
    246246
    247 static VALUE draw_polyline(VALUE self, VALUE x, VALUE y, VALUE ch)
     247static VALUE draw_polyline(VALUE self, VALUE points, VALUE ch)
    248248{
    249249    int i, n;
    250250    int *ax, *ay;
    251    
    252     n = RARRAY(x)->len;
    253 
    254     /* Ensure x and y have the same number of elements */
    255     if(n != RARRAY(y)->len)
    256         rb_raise(rb_eArgError, "Arguments do not have the same number of elements");
     251    int error = 0;
     252    VALUE v, x, y;
     253
     254    n = RARRAY(points)->len;
    257255
    258256    ax = (int*)malloc(n*sizeof(int));
     
    269267    for(i=0; i<n; i++)
    270268    {
    271         ax[i] = NUM2INT(rb_ary_entry(x, i));
    272         ay[i] = NUM2INT(rb_ary_entry(y, i));
     269        v = rb_ary_entry(points, i);
     270        if((TYPE(v) == T_ARRAY) && (RARRAY(v)->len == 2))
     271        {
     272            x = rb_ary_entry(v,0);
     273            y = rb_ary_entry(v,1);
     274            if(rb_obj_is_kind_of(x, rb_cInteger) &&
     275               rb_obj_is_kind_of(y, rb_cInteger))
     276            {
     277                ax[i] = NUM2INT(x);
     278                ay[i] = NUM2INT(y);
     279            } else
     280                error = 1;
     281        }
     282        else
     283            error = 1;
     284    }
     285
     286    if(error)
     287    {
     288        free(ax);
     289        free(ay);
     290        rb_raise(rb_eArgError, "Invalid list of points");
    273291    }
    274292
     
    289307}
    290308
    291 
    292 static VALUE draw_thin_polyline(VALUE self, VALUE x, VALUE y)
     309static VALUE draw_thin_polyline(VALUE self, VALUE points)
    293310{
    294311    int i, n;
    295312    int *ax, *ay;
    296    
    297     n = RARRAY(x)->len;
    298 
    299     /* Ensure x and y have the same number of elements */
    300     if(n != RARRAY(y)->len)
    301         rb_raise(rb_eArgError, "Arguments do not have the same number of elements");
     313    int error = 0;
     314    VALUE v, x, y;
     315
     316    n = RARRAY(points)->len;
    302317
    303318    ax = (int*)malloc(n*sizeof(int));
     
    314329    for(i=0; i<n; i++)
    315330    {
    316         ax[i] = NUM2INT(rb_ary_entry(x, i));
    317         ay[i] = NUM2INT(rb_ary_entry(y, i));
     331        v = rb_ary_entry(points, i);
     332        if((TYPE(v) == T_ARRAY) && (RARRAY(v)->len == 2))
     333        {
     334            x = rb_ary_entry(v,0);
     335            y = rb_ary_entry(v,1);
     336            if(rb_obj_is_kind_of(x, rb_cInteger) &&
     337               rb_obj_is_kind_of(y, rb_cInteger))
     338            {
     339                ax[i] = NUM2INT(x);
     340                ay[i] = NUM2INT(y);
     341            } else
     342                error = 1;
     343        }
     344        else
     345            error = 1;
     346    }
     347
     348    if(error)
     349    {
     350        free(ax);
     351        free(ay);
     352        rb_raise(rb_eArgError, "Invalid list of points");
    318353    }
    319354
     
    575610
    576611    rb_define_method(cCanvas, "draw_line", draw_line, 5);
    577     rb_define_method(cCanvas, "draw_polyline", draw_polyline, 3);
     612    rb_define_method(cCanvas, "draw_polyline", draw_polyline, 2);
    578613    rb_define_method(cCanvas, "draw_thin_line", draw_thin_line, 4);
    579     rb_define_method(cCanvas, "draw_thin_polyline", draw_thin_polyline, 2);
     614    rb_define_method(cCanvas, "draw_thin_polyline", draw_thin_polyline, 1);
    580615    rb_define_method(cCanvas, "draw_circle", draw_circle, 4);
    581616    rb_define_method(cCanvas, "draw_ellipse", draw_ellipse, 5);
Note: See TracChangeset for help on using the changeset viewer.