/*
 *  call-seq:
 *    rotozoom_size( size, angle, zoom )  ->  [width, height] or nil
 *
 *  Return the dimensions of the surface that would be returned if
 *  #rotozoom() were called on a Surface of the given size, with
 *  the same angle and zoom factors.
 *
 *  If Rubygame was compiled with SDL_gfx-2.0.13 or greater, +zoom+ can be
 *  an Array of 2 Numerics for separate X and Y scaling. Also, it can be
 *  negative to indicate flipping horizontally or vertically.
 *
 *  Will return +nil+ if you attempt to use separate X and Y zoom factors
 *  or negative zoom factors with an unsupported version of SDL_gfx.
 *
 *  This method takes these arguments:
 *  size::  an Array with the hypothetical Surface width and height (pixels)
 *  angle:: degrees to rotate counter-clockwise (negative for clockwise).
 *  zoom::  scaling factor(s). A single positive Numeric, unless you have
 *          SDL_gfx-2.0.13 or greater (see above).
 */
VALUE rbgm_transform_rzsize(int argc, VALUE *argv, VALUE module)
{
  int w,h, dstw,dsth;
  double angle, zoomx, zoomy;

  VALUE vsize, vangle, vzoom;

  rb_scan_args(argc,argv,"3", &vsize, &vangle, &vzoom);

  vsize = convert_to_array(vsize);
  w = NUM2INT(rb_ary_entry(argv[0],0));
  h = NUM2INT(rb_ary_entry(argv[0],0));
  angle = NUM2DBL(vangle);

  switch( TYPE(vzoom) )
  {
    case T_ARRAY: {
      /* Separate X/Y rotozoom scaling was not supported prior to 2.0.13. */
      /* Check if we have at least version 2.0.13 of SDL_gfxPrimitives */
#ifdef HAVE_ROTOZOOMXY
      /* Do the real function. */
      zoomx = NUM2DBL(rb_ary_entry(vzoom,0));
      zoomy = NUM2DBL(rb_ary_entry(vzoom,1));
      rotozoomSurfaceSizeXY(w, h, angle, zoomx, zoomy, &dstw, &dsth);
#else 
      /* Return nil, because it's not supported. */
      return Qnil;
#endif
      break;
    }

    case T_FLOAT:
    case T_FIXNUM: {
      zoomx = NUM2DBL(argv[1]);
#ifndef HAVE_ROTOZOOMXY
      if(zoomx < 0)                /* negative zoom (for flipping) */
      {
        /* Return nil, because it's not supported. */
        return Qnil;
      }
#endif
      rotozoomSurfaceSize(w, h, angle, zoomx, &dstw, &dsth);
      break;
    }

    default: {
      rb_raise(rb_eArgError,
               "wrong zoom factor type (expected Array or Numeric)");
      break;
    }

  }

  /*   if(dstw == NULL || dsth == NULL)
       rb_raise(eSDLError,"Could not rotozoom surface: %s",SDL_GetError());*/
  return rb_ary_new3(2,INT2NUM(dstw),INT2NUM(dsth));

}