aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/cdl/examples/animate.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/cdl/examples/animate.c')
-rw-r--r--vendor/x11iraf/cdl/examples/animate.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/vendor/x11iraf/cdl/examples/animate.c b/vendor/x11iraf/cdl/examples/animate.c
new file mode 100644
index 00000000..66f487d9
--- /dev/null
+++ b/vendor/x11iraf/cdl/examples/animate.c
@@ -0,0 +1,153 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "cdl.h"
+
+/* ANIMATE -- Example task to demonstrate rapid display of rasters such as
+ * would be done in an animation sequence, or in an acquisition system
+ * which needs to display guider images repeatedly (the actual inspiration
+ * for this demo.
+ *
+ * Examples:
+ * Display a scrolling test pattern:
+ * % animate
+ *
+ * Usage:
+ * animate [-nx N] [-ny N] [-fbconfig N]
+ *
+ * Note that your choice of frame buffer is important since if it's
+ * larger than the image size you're spending a lot of overhead in writing
+ * blank pixels around the actual image. When writing a true subraster of
+ * the image/frame buffer, the routine first reads back the pixels in the
+ * affected rows, edits the pixels in the subraster columns and then writes
+ * back the entire row. If the subraster width is the same size as the
+ * frame buffer width it does a straight write which will speed up the dis-
+ * play since you avoid the readback overhead. It may be worth defining a
+ * custom frame buffer the size of your image to speed things up.
+ */
+
+#define DIAGONAL 0 /* test pattern flags */
+#define VERTICAL 1
+#define HORIZONTAL 2
+
+#define max(a,b) (a > b ? a : b) /* Utility macros */
+#define min(a,b) (a < b ? a : b)
+
+
+CDLPtr cdl;
+uchar *pix = NULL;
+
+main (argc, argv)
+int argc;
+char *argv[];
+{
+ register int i, frame=1;
+ int nx=256, ny=256, fbconfig=0;
+ int status=0, fb_w, fb_h, nf, lx, ly;
+ uchar *line;
+
+ /* Handle command line args. */
+ if (argc > 1) {
+ for (i=1; i < argc; i++) {
+ if (strcmp (argv[i], "-nx") == 0)
+ nx = atoi (argv[++i]);
+ else if (strcmp (argv[i], "-ny") == 0)
+ ny = atoi (argv[++i]);
+ else if (strcmp (argv[i], "-fbconfig") == 0)
+ fbconfig = atoi (argv[++i]);
+ }
+ }
+
+ /* Open the package and a connection to the server. */
+ if (!(cdl = cdl_open ((char *)getenv("IMTDEV"))) )
+ exit (-1);
+
+ /* Make a test pattern. */
+ pix = (uchar *) malloc (nx * ny);
+ makeTestPattern (pix, nx, ny, DIAGONAL);
+
+ /* Now select a frame buffer large enough for the image. The
+ * fbconfig number is passed in the WCS packet, but the display
+ * calls below will compute the correct WCS for the image and
+ * transmit that prior to display, all we're doing here is
+ * setting up the FB to be used.
+ */
+ if (fbconfig == 0)
+ cdl_selectFB (cdl, nx, ny, &fbconfig, &fb_w, &fb_h, &nf, 1);
+ else
+ cdl_lookupFBSize (cdl, fbconfig, &fb_w, &fb_h, &nf);
+
+
+ /* For the WCS we assume a simple linear transform where the image is
+ * Y-flipped, the (x,y) translation is computed so it is correct
+ * for an frame buffer >= than the image size. The Z-transform is
+ * fixed since we're using a test pattern with known values.
+ */
+ cdl_setWCS (cdl, "test pattern", "", 1., 0., 0., -1.,
+ (float) (nx / 2) - (fb_w / 2) + 1, /* X translation */
+ (float) (fb_h / 2) + (ny / 2), /* Y translation */
+ 0.0, 200.0, CDL_LINEAR); /* Z transform */
+
+
+ /* Select and clear the initial frame prior to display. */
+ cdl_setFrame (cdl, frame);
+ cdl_clearFrame (cdl);
+
+ /* Now display the pixels. We'll compute the image placement
+ * ourselves and write the image as a raw subraster of the frame
+ * buffer in the center of the display.
+ */
+ lx = (fb_w / 2) - (nx / 2);
+ ly = fb_h - ((fb_h / 2) + (ny / 2));
+ status = cdl_writeSubRaster (cdl, lx, ly, nx, ny, pix);
+
+ /* Now animate the image. */
+ line = (uchar *) malloc (nx);
+ while (1) {
+ /* Shift the image down one line, roll the botton line to the
+ * top and redisplay the subraster/
+ */
+ memcpy (pix, line, nx);
+ memmove (pix+nx, pix, (ny-1)*nx);
+ memcpy (line, pix+((ny-1)*nx), nx);
+
+ status = cdl_writeSubRaster (cdl, lx, ly, nx, ny, pix);
+ }
+
+
+ cdl_close (cdl); /* close the package */
+ free ((unsigned char *) pix); /* free the raster */
+ exit (status);
+}
+
+
+/* Make a test pattern. */
+
+makeTestPattern (raster, nx, ny, pattern)
+uchar *raster;
+int nx, ny, pattern;
+{
+ register uchar pix;
+ register int i, j;
+ register float scale;
+
+ for (i = 0; i < nx; i++) {
+ for (j = 0; j < ny; j++) {
+ switch (pattern) {
+ case DIAGONAL: /* Diagonal ramp */
+ scale = 200. / (float)(ny) / 2.;
+ pix = (uchar) max(2, (min(200,(scale*i + scale*j))));
+ break;
+ case VERTICAL: /* Vertical ramp */
+ scale = 200. / (float)(ny);
+ pix = (uchar) max(2, (min(200,(scale * i))));
+ break;
+ case HORIZONTAL: /* Horizontal ramp */
+ scale = 200. / (float)(nx);
+ pix = (uchar) max(2, (min(200,(scale * j))));
+ break;
+ }
+ raster[i * nx + j] = pix;
+ }
+ }
+}