/* * 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; Data_Get_Struct(self, SDL_Surface, surf); if(argc < 1) { rb_raise(rb_eArgError,"wrong number of arguments (%d for 1 or 2)",argc); } r = NUM2UINT(rb_ary_entry(argv[0],0)); g = NUM2UINT(rb_ary_entry(argv[0],1)); b = NUM2UINT(rb_ary_entry(argv[0],2)); /* if the array is larger than [R,G,B], it should be [R,G,B,A] */ if(RARRAY(argv[0])->len > 3) { a = NUM2UINT(rb_ary_entry(argv[0],3)); color = SDL_MapRGBA(surf->format, r,g,b,a); } else { color = SDL_MapRGB(surf->format, r,g,b); } switch(argc) { case 1: /* fill whole thing */ SDL_FillRect(surf,NULL,color); break; case 2: /* fill a given rect */ rect = make_rect(\ NUM2INT(rb_ary_entry(argv[1],0)),\ NUM2INT(rb_ary_entry(argv[1],1)),\ NUM2INT(rb_ary_entry(argv[1],2)),\ NUM2INT(rb_ary_entry(argv[1],3))\ ); SDL_FillRect(surf,rect,color); free(rect); break; default: rb_raise( rb_eArgError,"Wrong number of arguments to fill (%d for 1 or 2)",NUM2INT(argc)); break; } return self; }