/* * call-seq: * zoom_size(size, zoom) -> [width, height] * * Return the dimensions of the surface that would be returned if * #zoom were called with a surface of the given size and zoom factors. * * This method takes these arguments: * size:: an Array with the hypothetical surface width and height (pixels) * zoom:: the factor to scale by in both x and y directions, or an Array * with separate x and y scale factors. */ VALUE rbgm_transform_zoomsize(int argc, VALUE *argv, VALUE module) { int w,h, dstw,dsth; double zoomx, zoomy; if(argc < 3) rb_raise(rb_eArgError,"wrong number of arguments (%d for 3)",argc); w = NUM2INT(rb_ary_entry(argv[0],0)); h = NUM2INT(rb_ary_entry(argv[0],0)); if(TYPE(argv[1])==T_ARRAY) { zoomx = NUM2DBL(rb_ary_entry(argv[1],0)); zoomy = NUM2DBL(rb_ary_entry(argv[1],1)); } else if(FIXNUM_P(argv[1]) || TYPE(argv[1])==T_FLOAT) { zoomx = NUM2DBL(argv[1]); zoomy = zoomx; } else rb_raise(rb_eArgError,"wrong zoom factor type (expected Array or Numeric)"); zoomSurfaceSize(w, h, zoomx, zoomy, &dstw, &dsth); return rb_ary_new3(2,INT2NUM(dstw),INT2NUM(dsth)); }