/* * 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; VALUE vsize, vzoom; rb_scan_args(argc,argv,"2", &vsize, &vzoom); vsize = convert_to_array(vsize); w = NUM2INT(rb_ary_entry(vsize,0)); h = NUM2INT(rb_ary_entry(vsize,1)); 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(vzoom); zoomy = zoomx; break; } default: { rb_raise(rb_eArgError, "wrong zoom factor type (expected Array or Numeric)"); break; } } zoomSurfaceSize(w, h, zoomx, zoomy, &dstw, &dsth); return rb_ary_new3(2,INT2NUM(dstw),INT2NUM(dsth)); }