aboutsummaryrefslogtreecommitdiff
path: root/pkg/plot/crtpict/xyscale.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/plot/crtpict/xyscale.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/plot/crtpict/xyscale.x')
-rw-r--r--pkg/plot/crtpict/xyscale.x90
1 files changed, 90 insertions, 0 deletions
diff --git a/pkg/plot/crtpict/xyscale.x b/pkg/plot/crtpict/xyscale.x
new file mode 100644
index 00000000..094b78ee
--- /dev/null
+++ b/pkg/plot/crtpict/xyscale.x
@@ -0,0 +1,90 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+include <imhdr.h>
+include <error.h>
+include "wdes.h"
+include "crtpict.h"
+
+# CRT_XY_SCALE -- Calculate the spatial transformation parameters and store
+# them in the "wdes" window descriptor. These are used to map the image
+# to the graphics device.
+
+procedure crt_xy_scale (gp, cl, im, wdes)
+
+pointer gp
+pointer cl
+pointer im
+pointer wdes
+
+int w1, w0, ndev_rows, ndev_cols
+real xcenter, ycenter, xsize, ysize, pxsize, pysize, xscale, yscale
+real ystart, yend
+int ggeti()
+errchk ggeti
+
+begin
+ ndev_rows = ggeti (gp, "yr")
+ ndev_cols = ggeti (gp, "xr")
+
+ # Determine the maximum display window available for mapping the
+ # image. This is a function of the user specified "fractions";
+ # the outer 6% of the user specified image area is used for annotation.
+
+ xcenter = (CRT_XE + CRT_XS) / 2.0
+ xsize = CRT_XE - CRT_XS
+ ystart = CRT_YS + (CRT_YE - CRT_YS) * GRAPHICS_FRACTION(cl)
+ yend = ystart + (CRT_YE - CRT_YS) * IMAGE_FRACTION(cl)
+ ycenter = (yend + ystart) / 2.0
+ ysize = yend - ystart
+
+ # Set device window limits in normalized device coordinates.
+ # World coord system 0 is used for the device window.
+
+ w0 = W_WC(wdes,0)
+ W_XS(w0) = xcenter - (xsize / 2.0)
+ W_XE(w0) = xcenter + (xsize / 2.0)
+ W_YS(w0) = ycenter - (ysize / 2.0)
+ W_YE(w0) = ycenter + (ysize / 2.0)
+
+ # Determine X and Y scaling ratios required to map the image into the
+ # normalized display window.
+
+ if (FILL(cl) == YES) {
+ # Compute scale in units of NDC viewport coords per image pixel.
+ xscale = xsize / max (1, (IM_LEN(im,1) - 1))
+ yscale = ysize / max (1, (IM_LEN(im,2) - 1))
+
+ # Image scaled by same factor in x and y with FILL = YES.
+ if (xscale < yscale)
+ yscale = xscale
+ else
+ xscale = yscale
+
+ } else {
+ # From the user specified magnification factors, compute the scale
+ # in units of NDC coords per "effective" display pixels.
+
+ xscale = 1.0 / ((ndev_cols - 1) / XMAG(cl))
+ yscale = 1.0 / ((ndev_rows - 1) / YMAG(cl))
+ }
+
+ # Determine the image pixels that map to the available device
+ # viewport. The starting and ending pixels calculated from
+ # xscale and yscale may be in the image interior or reference
+ # beyond the bounds of the image. These endpoints are tuned
+ # further in procedure transform_image.
+
+ w1 = W_WC(wdes,1)
+ pxsize = xsize / xscale
+ pysize = ysize / yscale
+
+ W_XS(w1) = (IM_LEN(im,1) - 1) / 2.0 + 1 - (pxsize / 2.0)
+ W_XE(w1) = W_XS(w1) + pxsize
+ W_YS(w1) = (IM_LEN(im,2) - 1) / 2.0 + 1 - (pysize / 2.0)
+ W_YE(w1) = W_YS(w1) + pysize
+
+ # All spatial transformations are linear.
+ W_XT(w1) = W_LINEAR
+ W_YT(w1) = W_LINEAR
+end