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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <gio.h>
# GPCELL -- Put a cell array. Display a two dimensional array of pixels in the
# given window, scaling as necessary to fit the window. For maximum efficiency
# no clipping is performed. Only linear coordinate transformations are
# permitted. The cell array is defined by (x1,y1) and (x2,y2), the NDC coords
# of the corners of the display area. The graphics kernel is expected to
# map cell array pixels into device pixels by mapping the coordinates of a
# device pixel into the cell array and assigning the value of the nearest
# cell array pixel to the device pixel. In other words, the cell array is
# sampled or block replicated as necessary to fit the device window. The kernel
# is not expected to perform area integration or filtering (interpolation)
# to map cell array pixels into device pixels. In the limiting case M may
# contain a single pixel which will be replicated to fill the specified window,
# e.g., nx=ny=1, (x1,y1)=(0,0), and (x2,y2)=(1,1).
#
# +--+--+--+--Q (x2,y2)
# 4 | | | | |
# +--+--+--+--+
# 3 | | | | | Sample Cell Array
# Y +--+--+--+--+ nx = ny = 4
# 2 | | | | |
# +--+--+--+--+
# 1 | | | | |
# (x1,y1) P--+--+--+--+
#
# 1 2 3 4 X
#
# A sample 4 by 4 cell array is shown above. The coordinates of the device
# window into which the cell array is to be mapped refer to the corners P and
# Q of the first and last pixels in the cell array.
procedure gpcell (gp, m, nx, ny, x1, y1, x2, y2)
pointer gp # device descriptor
short m[nx,ny] # pixels
int nx, ny # size of pixel array
real x1, y1 # lower left corner of output window
real x2, y2 # upper right corner of output window
real dy
int ly1, ly2, i
int sx1, sx2, sy1, sy2
include "gpl.com"
begin
# Flush any buffered polyline output. Make sure the wcs transformation
# in the cache is up to date.
if (op > 1)
call gpl_flush()
else if (gp != gp_out || GP_WCS(gp) != wcs)
call gpl_cache (gp)
# Transform cell window to GKI coordinates. The coordinate
# transformation must be linear.
sx1 = (x1 - wxorigin) * xscale + mxorigin
sx2 = (x2 - wxorigin) * xscale + mxorigin
sy1 = (y1 - wyorigin) * yscale + myorigin
sy2 = (y2 - wyorigin) * yscale + myorigin
dy = real (sy2 - sy1) / ny # height of a line in GKI coords
# Write out the cell array, one line at a time. Take care that the
# GKI integer value of ly1 of one line is the same as the ly2 value
# of the previous line, or there will be a blank line in the output
# image.
do i = 1, ny {
ly1 = (i-1) * dy + sy1
ly2 = (i ) * dy + sy1
call gki_putcellarray (GP_FD(gp), m[1,i], nx,1, sx1,ly1, sx2,ly2)
}
end
|