/* call-seq: * update_rects(rects) * * Updates (as Screen#update does) several areas of the screen. * * This method takes these arguments: * rects:: an Array containing any number of Rect objects, each * rect representing a portion of the screen to update. */ VALUE rbgm_screen_updaterects(VALUE self, VALUE array_rects) { int i, num_rects; VALUE each_rect; SDL_Surface *screen; SDL_Rect *rects; /* unwrap the Screen instance from self (VALUE) */ Data_Get_Struct(self,SDL_Surface,screen); /* prepare an (uninitialized) array of Rects */ array_rects = convert_to_array(array_rects); num_rects = RARRAY_LEN(array_rects); rects = ALLOCA_N(SDL_Rect, num_rects); /* initialize the array of Rects from array_rects */ for( i=0; i < num_rects; i++ ) { each_rect = convert_to_array(rb_ary_entry(array_rects,i)); Sint16 x,y,left,top,right,bottom; Uint16 w,h; x = NUM2INT(rb_ary_entry(each_rect,0)); y = NUM2INT(rb_ary_entry(each_rect,1)); w = NUM2INT(rb_ary_entry(each_rect,2)); h = NUM2INT(rb_ary_entry(each_rect,3)); left = min( max( 0, x ), screen->w ); top = min( max( 0, y ), screen->h ); right = min( max( left, x + w), screen->w ); bottom = min( max( top, y + h), screen->h ); rects[i].x = left; rects[i].y = top; rects[i].w = right - left; rects[i].h = bottom - top; } /* call the SDL method to update from all these rects */ SDL_UpdateRects( screen, num_rects, rects ); return self; }