diff options
Diffstat (limited to 'vendor/x11iraf/cdl/examples/mosaic.c')
-rw-r--r-- | vendor/x11iraf/cdl/examples/mosaic.c | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/vendor/x11iraf/cdl/examples/mosaic.c b/vendor/x11iraf/cdl/examples/mosaic.c new file mode 100644 index 00000000..e31ee264 --- /dev/null +++ b/vendor/x11iraf/cdl/examples/mosaic.c @@ -0,0 +1,219 @@ +#include <stdio.h> +#include <unistd.h> +#include "cdl.h" + +/* MOSAIC -- Example task to demostrate a possible mosaic display + * application. Image names may optionally be drawn on each tile of + * the mosaic by specifying the -label and -color flags. The -pad flag + * can be used to put a space between images, -sample is used to sub- + * sample an image before display. Assumes all images are the same size. + * + * Examples: + * To display four images with a gap in a 1600x1600 frame buffer + * % mosaic -nx 2 -ny 2 -fbconfig 4 -pad 20 foo[1234].imh + * To display a set of images, subsampling each by 4 pixels + * % mosaic -nx 2 -ny 2 -pad -10 -sample 4 foo[1234].imh + * + * Usage: + * mosaic [-fbconfig N] [-frame N] [-color N] [-label] [-nozscale] + * [-raw -xdim N -ydim N -bitpix N [-hskip N] ] + * [-nx N] [-ny N] [-pad N] [-sample N]image1 image2 ..... + */ + +#define ABS(x) (x > 0 ? x : -x) + + +main (argc, argv) +int argc; +char **argv; +{ + CDLPtr cdl; + char *fname = NULL, title[128]; + int i, j, k, status=0, label=0, frame=1, fb=FB_AUTO, zscale=1; + int sample=1, pad=0, col=204, imx=0, imy=0, nimages, nim; + int ii, xinit, rowx, rowy, nnx, nny, fb_w, fb_h, nf, mx, my; + int raw = 0, bitpix=0, hskip=0; + int nx = 1, ny = 1; + float z1, z2; + unsigned char *pix = NULL; + + + /* Process the command line options. */ + if (argc > 1) { + for (i=1; i < argc; i++) { + if (strncmp (argv[i], "-fbconfig",3) == 0) + fb = atoi (argv[++i]); + else if (strncmp (argv[i], "-frame",3) == 0) + frame = atoi (argv[++i]); + else if (strncmp (argv[i], "-color",3) == 0) + col = atoi (argv[++i]); + else if (strncmp (argv[i], "-label",4) == 0) + label = 1; + else if (strncmp (argv[i], "-nozscale",4) == 0) + zscale = 0; + else if (strncmp (argv[i], "-nx",3) == 0) + nx = atoi (argv[++i]); + else if (strncmp (argv[i], "-ny",3) == 0) + ny = atoi (argv[++i]); + else if (strncmp (argv[i], "-pad",4) == 0) + pad = atoi (argv[++i]); + else if (strncmp (argv[i], "-raw",4) == 0) + raw++; + else if (strncmp (argv[i], "-xdim",4) == 0) + imx = atoi (argv[++i]); + else if (strncmp (argv[i], "-ydim",4) == 0) + imy = atoi (argv[++i]); + else if (strncmp (argv[i], "-bitpix",4) == 0) + bitpix = atoi (argv[++i]); + else if (strncmp (argv[i], "-hskip",4) == 0) + hskip = atoi (argv[++i]); + else if (strncmp (argv[i], "-sample",4) == 0) { + sample = atoi (argv[++i]); + if (sample % 2) { + fprintf (stderr, "ERROR: Sample size must be even\n"); + exit (-1); + } + } else + break; + } + } else { + printf("Usage:\n\tmosaic "); + printf("[-fbconfig N] [-frame N] [-color N] [-label] [-nozscale]"); + printf("\n\t[-raw -xdim N -ydim N -bitpix N [-hskip N] ]"); + printf("\n\t[-nx N] [-ny N] [-pad N] [-sample N] image1 ....\n"); + exit (1); + } + nimages = argc - i; + + + /* Open the package and a connection to the server. */ + if (!(cdl = cdl_open ((char *)getenv("IMTDEV"))) ) + exit (-1); + + /* Clear the frame to begin. */ + (void) cdl_clearFrame (cdl); + + /* Loop over each of the images in the list. */ + nim = 0; + rowx = rowy = 0; + nnx = nny = 0; + for (k=0; k < ny && nim < nimages; k++) { + rowy += nny + pad; + for (rowx = xinit, j=0; j < nx && nim < nimages; j++) { + + /* Get the image name for display. */ + fname = argv[i++]; + + /* Figure out what kind of image it is and get the pixels. */ + if (!raw && cdl_isIRAF (fname)) + status = cdl_readIRAF (fname, 1, &pix, &imx, &imy, &bitpix, + title); + else if (!raw && cdl_isFITS (fname)) + status = cdl_readFITS (fname, &pix, &imx, &imy, &bitpix, + title); + else { + if (raw) { + /* It's a raw data array, be sure we have everyting + * we need in order to read it. + */ + if (imx == 0 || imy == 0 || bitpix == 0) { + fprintf(stderr, "ERROR: Use of '-raw' requires "); + fprintf(stderr, "'-xdim', '-ydim' and '-bitpix'\n"); + status = 1; + } else { + FILE *fd; + + /* Open the image file if we can. */ + if (fd = fopen (fname, "r")) { + + /* Seek to the offset specified. */ + lseek (fileno(fd), (off_t) hskip, SEEK_SET); + + /* Allocate the pixel pointer and read data. */ + pix = (pix ? pix : (uchar *) malloc ( + imx*imy*(ABS(bitpix) / 8)) ); + fread (pix, ABS(bitpix)/8, imx*imy, fd); + fclose (fd); + } else + status = 1; + } + } else { + /* Didn't set the raw flag, and we don't know what + * it is....punt. + */ + if (access (fname, F_OK) == 0) + fprintf (stderr, "'%s': unknown image format.\n", + fname); + else + fprintf (stderr, "'%s': image doesn't exist.\n", fname); + status = 1; + } + } + if (status) goto err_; + + /* Compute subsampled image size. */ + if (sample > 1) + nnx = imx / sample, nny = imy / sample; + else + nnx = imx, nny = imy; + + /* Unless we asked for a specific FB size find one large enough + * to handle the mosaic. We don't check to be sure what's + * returned is really large enough. + */ + if (nim == 0 && fb == FB_AUTO) { + cdl_selectFB (cdl, nx*nnx+(pad*(nx-1)), ny*nny+(pad*(ny-1)), + &fb, &fb_w, &fb_h, &nf, 1); + } else { + cdl_setFBConfig (cdl, fb); + cdl_lookupFBSize (cdl, fb, &fb_w, &fb_h, &nf); + } + + /* Define a WCS for the frame. */ + cdl_setWCS (cdl, "image mosaic", "", 1., 0., 0., -1., 0., + (float) ny*imy+(pad*(ny+1)), 1., 255., 1); + + /* The first time through figure out the placement so the + * entire mosaic is centered in the frame. + */ + if (nim == 0) { + mx = (nx * nnx) + pad * (nx-1); + my = (ny * nny) + pad * (ny-1); + rowy = (fb_h - my) / 2; + xinit = rowx = (fb_w - mx) / 2; + } + + /* Compute the zscaled imaged pixels. */ + if (zscale) { + cdl_computeZscale (cdl, pix, imx ,imy, bitpix, &z1, &z2); + printf ("%s: z1=%g z2=%g\n", fname, z1, z2); + cdl_zscaleImage (cdl, &pix, imx ,imy, bitpix, z1, z2); + } + + /* Subsample the image if requested. */ + if (sample > 1) { + int l, m, n; + + for (l=0, n=0; l < imy; l+=sample) + for (m=0; m < imx; m+=sample) + pix[n++] = pix[(l*imx)+m]; + } + + /* Write the image to the frame buffer. */ + if (cdl_writeSubRaster (cdl, rowx, rowy, nnx, nny, pix)) + goto err_; + + /* Draw the image name as a label. */ + if (label) + cdl_markText (cdl, rowx+10, rowy+10, fname, 1., 0., col); + + nim++; + rowx += nnx + pad; + } + } + + /* Close the package and clean up. */ +err_: cdl_close (cdl); + free ( (char *) pix); + exit (status); +} |