/*  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 */
  num_rects = RARRAY(array_rects)->len;
  rects = alloca(sizeof (SDL_Rect*) * num_rects);

  /* initialize the array of Rects from array_rects */
  for( i=0; i < num_rects; i++ )
        {
          each_rect = rb_ary_entry(array_rects,i);
          rects[i]->x = NUM2INT(rb_ary_entry(each_rect,0));
          rects[i]->y = NUM2INT(rb_ary_entry(each_rect,1));
          rects[i]->w = NUM2INT(rb_ary_entry(each_rect,2));
          rects[i]->h = NUM2INT(rb_ary_entry(each_rect,3));
        }

  /* call the SDL method to update from all these rects */
  SDL_UpdateRects( screen, num_rects, *rects );

  return self;
}