/* 
 *  call-seq:
 *     zoom(zoom, smooth=false)  ->  Surface
 *
 *  Return a zoomed version of the Surface.
 *
 *  This method takes these arguments:
 *  zoom::    a Numeric factor to scale by in both x and y directions,
 *            or an Array with separate x and y scale factors.
 *  smooth::  whether to anti-alias the new surface.
 *            By the way, if true, the new surface will be 32bit RGBA.
 */
VALUE rbgm_transform_zoom(int argc, VALUE *argv, VALUE self)
{
  SDL_Surface *src, *dst;
  double zoomx, zoomy;
  int smooth = 0;

  VALUE vzoom, vsmooth;

  rb_scan_args(argc, argv, "11", &vzoom, &vsmooth);

  Data_Get_Struct(self,SDL_Surface,src);

  smooth = RTEST(vsmooth) ? 1 : 0;

  switch( TYPE(vzoom) )
  {
    case T_ARRAY:{
      zoomx = NUM2DBL(rb_ary_entry(vzoom,0));
      zoomy = NUM2DBL(rb_ary_entry(vzoom,1));
      break;
    }
    case T_FLOAT:
    case T_FIXNUM: {
      zoomx = NUM2DBL(argv[0]);
      zoomy = zoomx;
      break;
    }
    default: {
      rb_raise(rb_eArgError,
               "wrong zoom factor type (expected Array or Numeric)");
      break;
    }

  }
  dst = zoomSurface(src,zoomx,zoomy,smooth);
  if(dst == NULL)
    rb_raise(eSDLError,"Could not rotozoom surface: %s",SDL_GetError());
  return Data_Wrap_Struct(cSurface,0,SDL_FreeSurface,dst);
}