/* 
 *  call-seq:
 *    convert( other=nil, flags=nil )  ->  Surface
 *
 *  Copies the Surface to a new Surface with the pixel format of another
 *  Surface, for fast blitting. May raise SDLError if a problem occurs.
 *
 *  This method takes these arguments:
 *  - other::  The Surface to match pixel format against. If +nil+, the
 *             display surface (i.e. Screen) is used, if available; if no
 *             display surface is available, raises SDLError.
 *  - flags::  An array of flags to pass when the new Surface is created.
 *             See Surface#new.
 *
 */
VALUE rbgm_surface_convert(int argc, VALUE *argv, VALUE self)
{
        SDL_Surface *surf, *othersurf, *newsurf;
  Uint32 flags = 0;
        VALUE vother, vflags;

        Data_Get_Struct(self, SDL_Surface, surf);

        rb_scan_args(argc, argv, "02", &vother, &vflags );

        if( !NIL_P(vother) )
  {
    Data_Get_Struct(vother, SDL_Surface, othersurf);
  }
  else
  {
    othersurf = SDL_GetVideoSurface();
    if( othersurf == NULL )
    {
      rb_raise(eSDLError, "Cannot convert Surface with no target given and no Screen made: %s", SDL_GetError());
    }
  }

        flags = collapse_flags(vflags); /* in rubygame_shared.c */

  if( init_video_system() == 0 )
  {
    newsurf = SDL_ConvertSurface( surf, othersurf->format, flags );
  }
  else
  {
    newsurf = NULL;
  }

  if( newsurf == NULL )
  {
    rb_raise(eSDLError,\
             "Could not convert the Surface: %s",\
             SDL_GetError());
  }

  return Data_Wrap_Struct( cSurface,0,SDL_FreeSurface,newsurf );  
}