/* call-seq: * update() * update(rect) * update(x,y,w,h) * * Updates (refreshes) all or part of the Rubygame window, revealing to the * user any changes that have been made since the last update. If you're using * a double-buffered display (see Display.set_mode), you should use * Screen#flip instead. * * This method takes these arguments: * rect:: a Rubygame::Rect representing the area of the screen to update. * Can also be an length-4 Array, or given as 4 separate arguments. * If omitted or nil, the entire screen is updated. */ VALUE rbgm_screen_update(int argc, VALUE *argv, VALUE self) { int x,y,w,h; SDL_Surface *screen; Data_Get_Struct(self,SDL_Surface,screen); switch(argc) { case 0: x = y = w = h = 0; break; case 1: if(argv[0]==Qnil) /* nil */ x = y = w = h = 0; else /* Array/Rect */ { x = NUM2INT(rb_ary_entry(argv[0],0)); y = NUM2INT(rb_ary_entry(argv[0],1)); w = NUM2INT(rb_ary_entry(argv[0],2)); h = NUM2INT(rb_ary_entry(argv[0],3)); } break; case 4: x = NUM2INT(argv[0]); y = NUM2INT(argv[1]); w = NUM2INT(argv[2]); h = NUM2INT(argv[3]); break; default: rb_raise(rb_eArgError,"wrong number of args to update (%d for 0)",argc); break; } SDL_UpdateRect(screen,x,y,w,h); return self; }