aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/stxtools/sp_util/spmapt.x
blob: cef87fed7497e741cffeebf49b16011b359ee8b9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
include <gset.h>

# Default viewport edges.
define  EDGE1  0.1
define  EDGE2  0.9
define  EDGE3  0.12
define  EDGE4  0.85

#---------------------------------------------------------------------------
.help sp_map_viewport Sep92 source
.ih
NAME
sp_map_viewport -- set device viewport for contour plots.
.endhelp
#---------------------------------------------------------------------------

procedure sp_map_viewport (gp, ncols, nlines, ux1, ux2, uy1, uy2, pre, perim)

pointer gp                      # I:  pointer to graphics descriptor
real    ncols, nlines           # I:  size of image area, after block reduction
real    ux1, ux2, uy1, uy2      # I:  NDC coordinates of requested viewort
bool    pre                     # I:  Preserve aspect ratio.
bool    perim                   # I:  draw perimeter

real  xcen, ycen, x, y
real  aspect_ratio
real  x1, x2, y1, y2, ext, xdis, ydis
data    ext /0.0625/
real  ggetr()

begin
        # Determine the standard window sizes.
        if (!pre && !perim) {
            x1 = 0.0;  x2 = 1.0
            y1 = 0.0;  y2 = 1.0
        } else {
            x1 = EDGE1;  x2 = EDGE2
            y1 = EDGE3;  y2 = EDGE4
            
        }
        
        # If any values were specified, then replace them here.
        if( !IS_INDEFR( ux1 ) )
            x1 = ux1
        if( !IS_INDEFR( ux2 ) )
            x2 = ux2
        if( !IS_INDEFR( uy1 ) )
            y1 = uy1
        if( !IS_INDEFR( uy2 ) )
            y2 = uy2
        
        xdis = x2 - x1
        ydis = y2 - y1
        xcen = ( x2 + x1 ) / 2.
        ycen = ( y2 + y1 ) / 2.
        
        # So far, the viewport has been calculated so that equal numbers of
        # image pixels map to equal distances in NDC space, regardless of 
        # the aspect ratio of the device.  If preserving aspect ratio,
        # modify viewport to correctly display the contour aspect.
        if (pre) {
            aspect_ratio = ggetr (gp, "ar")
            if (aspect_ratio == 0.0) {
                x = ggetr (gp, "xr")
                y = ggetr (gp, "yr")
                if ( x != 0.0 && y != 0.0)
                    aspect_ratio = y / x
                else
                    aspect_ratio = 1.0
            }
            aspect_ratio = nlines / ncols / aspect_ratio
            x = ydis / aspect_ratio
            y = ydis
            if ( x > xdis) {
                y = aspect_ratio * xdis
                x = xdis
            }
            xdis = x
            ydis = y
        }

        # All set.
        ux1 = xcen - (xdis / 2.0)
        ux2 = xcen + (xdis / 2.0)
        uy1 = ycen - (ydis / 2.0)
        uy2 = ycen + (ydis / 2.0)
        
        call gsview (gp, ux1, ux2, uy1, uy2)
        call gswind (gp, 1.0, ncols, 1.0, nlines)
        
end
#---------------------------------------------------------------------------
# End of sp_map_viewport
#---------------------------------------------------------------------------