/* 
 *  call-seq:
 *     fill(color,rect=nil)
 *
 *  Fill all or part of a Surface with a color.
 *
 *  This method takes these arguments:
 *  color:: color to fill with, in the form +[r,g,b]+ or +[r,g,b,a]+ (for
 *          partially transparent fills).
 *  rect::  a Rubygame::Rect representing the area of the surface to fill
 *          with color. Omit to fill the entire surface.
 */
VALUE rbgm_surface_fill( int argc, VALUE *argv, VALUE self )
{
        SDL_Surface *surf;
        SDL_Rect *rect;
        Uint32 color;
        Uint8 r,g,b,a;
        VALUE vcolor, vrect;

        Data_Get_Struct(self, SDL_Surface, surf);

        rb_scan_args(argc, argv, "11", &vcolor, &vrect);

        vcolor = convert_color(vcolor);
        extract_rgba_u8_as_u8(vcolor, &r, &g, &b, &a);
        color = SDL_MapRGBA(surf->format, r,g,b,a);

        if( NIL_P(vrect) )
        {
                SDL_FillRect(surf,NULL,color);
        }
        else
        {
                vrect = convert_to_array(vrect);

                rect = make_rect(\
                                                                                 NUM2INT(rb_ary_entry(vrect,0)),\
                                                                                 NUM2INT(rb_ary_entry(vrect,1)),\
                                                                                 NUM2INT(rb_ary_entry(vrect,2)),\
                                                                                 NUM2INT(rb_ary_entry(vrect,3))\
                                                                                 );
                SDL_FillRect(surf,rect,color);
                free(rect);
        }

        return self;
}