This is read98721.c in view mode; [Download] [Up]
/*
* read98721 - read an RLE image from a display device
*
* Author: Filippo Tampieri
* Program of Computer Graphics
* Cornell University
* Date: Tue June 9 1987
*
* [-m] - store maps
* [-O] - store overlay (doesn't seem to do anything)
* [-d display] - display device ("/dev/...")
* [-x driver] - driver name ("hp98721")
* [-p xstart ystart] - lower left pixel start
* [-s xsize ysize] - size of image to store
* [-b rbak gbak bbak] - background color
* [-o fname] - output filename
* [comments ...]
*
*/
#include "starbase.c.h"
#include <stdio.h>
#include <rle.h>
#define TRUE 1
#define FALSE 0
#define MAX(i,j) ((i) > (j) ? (i) : (j))
#define NCHANS 3
#define NCMAPS 3
#define CMAPLEN 8
#define COLMAPLEN 256
#define MAX_X_SIZE 1280
/* if cmap_flag is TRUE the color maps are saved */
int cmap_flag = FALSE;
int display_flag = FALSE;
int driver_flag = FALSE;
/* default display device and device driver */
char *display_name = "/dev/hp98721";
char *driver_name = "hp98721";
int pos_flag = FALSE;
/* (xstart,ystart) are the coordinates of the lower left corner of the block to be saved */
#define D_XSTART 0
#define D_YSTART 0
int xstart = D_XSTART;
int ystart = D_YSTART;
int size_flag = FALSE;
/* xsize and ysize are the size of the block to be saved */
#define D_XSIZE 512
#define D_YSIZE 480
int xsize = D_XSIZE;
int ysize = D_YSIZE;
int overlay_flag = FALSE;
/* if backgnd_flag is TRUE the background color given in backgnd[] is not explicitly saved */
int backgnd_flag = FALSE;
int backgnd[NCHANS];
int fname_flag = FALSE;
/* if fname is NULL the image is written to the standard output */
char *fname = NULL;
int ncomments = 0;
char **comments = NULL;
/* starbase file descriptor for device from which the picture is read */
int picture_fd;
main(argc, argv)
int argc;
char *argv[];
{
int i,y;
int dev_xmax,dev_ymax;
rle_map cmap[COLMAPLEN * NCMAPS];
unsigned char scanline[NCHANS][MAX_X_SIZE],*rows[NCHANS]; /* Scanline storage & RLE row pointers */
if (scanargs(argc, argv,
"% m%- O%- d%-display!s x%-driver!s p%-xstart!dystart!d s%-xsize!dysize!d \
b%-rbak!dgbak!dbbak!d o%-fname!s comments%*s",
&cmap_flag,
&overlay_flag,
&display_flag,&display_name,
&driver_flag,&driver_name,
&pos_flag,&xstart,&ystart,
&size_flag,&xsize,&ysize,
&backgnd_flag,&(backgnd[0]),&(backgnd[1]),&(backgnd[2]),
&fname_flag,&fname,
&ncomments,&comments) == 0)
exit(1);
if(overlay_flag && backgnd_flag) {
fprintf(stderr,"read98721: incompatible options -O and -b\n");
exit(1);
}
/* initialize the display device */
setup_graphics_device(&dev_xmax,&dev_ymax);
clip(dev_xmax,dev_ymax,&xstart,&ystart,&xsize,&ysize);
if((xsize <= 0)||(ysize <= 0)) {
fprintf(stderr,"read98721: null image size\n");
exit(1);
}
/* open output file */
rle_dflt_hdr.rle_file = rle_open_f("read98721", fname, "w");
/* initialize image header */
rle_dflt_hdr.ncolors = NCHANS;
rle_dflt_hdr.bg_color = backgnd_flag ? backgnd : (int *)0;
rle_dflt_hdr.alpha = FALSE;
rle_dflt_hdr.background = backgnd_flag ? 2 : (overlay_flag ? 1 : 0);
rle_dflt_hdr.xmin = xstart;
rle_dflt_hdr.xmax = xstart + xsize -1;
rle_dflt_hdr.ymin = ystart;
rle_dflt_hdr.ymax = ystart + ysize -1;
if(cmap_flag) {
read_color_maps(picture_fd,cmap);
rle_dflt_hdr.ncmap = NCMAPS;
rle_dflt_hdr.cmaplen = CMAPLEN;
rle_dflt_hdr.cmap = cmap;
} else {
rle_dflt_hdr.ncmap = 0;
rle_dflt_hdr.cmaplen = 0;
rle_dflt_hdr.cmap = (rle_map *)0;
}
rle_dflt_hdr.bits[0] = 0x07;
for(i=0; i<ncomments; i++)
rle_putcom(comments[i],&rle_dflt_hdr);
rle_addhist( argv, (rle_hdr *)NULL, &rle_dflt_hdr );
rle_put_setup(&rle_dflt_hdr);
/* set up rows to point to our copy of the scanline */
for (i= 0; i<NCHANS; i++)
rows[i] = scanline[i];
/* save image */
for(y=rle_dflt_hdr.ymin; y<=rle_dflt_hdr.ymax; y++) {
read_scanline(y,rows);
rle_putrow(rows,xsize,&rle_dflt_hdr);
}
rle_puteof(&rle_dflt_hdr);
exit(0);
}
/* initialize the device to 24 bit/pixel */
setup_graphics_device(dev_xmax,dev_ymax)
int *dev_xmax,*dev_ymax;
{
float p_lim[2][3],res[3],p1[3],p2[3];
int map_size;
picture_fd = gopen(display_name,OUTDEV,driver_name,0);
if(picture_fd < 0) {
fprintf(stderr,"read98721: can't open device.\n");
exit(1);
}
shade_mode(picture_fd,CMAP_FULL,FALSE);
/* find out info about this device. */
inquire_sizes(picture_fd,p_lim,res,p1,p2,&map_size);
/* set the screen limits in pixels so we can use starbase in a device
* independent way.
*
* it is assumed that the p_lim values returned by inquire_sizes are the
* lower left screen coordinates in (float) pixels and the upper right
* screen coordinates in (float) pixels. It is also assumed that the
* range of values in x and y coordinates are given from 0 to some
* positive maximum value.
*/
*dev_xmax = MAX(p_lim[0][0],p_lim[1][0]) + 1.0;
*dev_ymax = MAX(p_lim[0][1],p_lim[1][1]) + 1.0;
/* set to use the whole display surface. */
mapping_mode(picture_fd,DISTORT);
/* set to address the pixels in a device independent way. */
vdc_extent(picture_fd,0.0,0.0,0.0,(float)(*dev_xmax)-1.0,
(float)(*dev_ymax)-1.0,0.0);
clip_rectangle(picture_fd,0.0,(float)(*dev_xmax)-1.0,
0.0,(float)(*dev_ymax)-1.0);
}
/* clip specified region size against maximum device window size */
clip(dev_xmax,dev_ymax,xstart,ystart,xsize,ysize)
int dev_xmax,dev_ymax,*xstart,*ystart,*xsize,*ysize;
{
if(*xstart < 0) {
*xsize += *xstart;
*xstart = 0;
}
if(*ystart < 0) {
*ysize += *ystart;
*ystart = 0;
}
if(*xstart + *xsize > dev_xmax)
*xsize = dev_xmax - *xstart;
if(*ystart + *ysize > dev_ymax)
*ysize = dev_ymax - *ystart;
}
/* read scanline y from the screen */
read_scanline(y,rows)
int y;
unsigned char *rows[];
{
int i,j;
for(i=0,j=NCHANS-1; i<NCHANS; i++,j--) {
bank_switch(picture_fd,j,0);
block_read(picture_fd,(float)(rle_dflt_hdr.xmin),(float)y,
rle_dflt_hdr.xmax - rle_dflt_hdr.xmin + 1,1,rows[i],FALSE);
}
}
/* read the color maps */
read_color_maps(pic_fd,cmap)
int pic_fd;
rle_map *cmap;
{
int i,cmaplen;
rle_map *rmap,*gmap,*bmap;
float colmap[COLMAPLEN][NCMAPS];
inquire_color_table(pic_fd,0,COLMAPLEN,colmap);
rmap = cmap;
gmap = cmap + COLMAPLEN;
bmap = cmap + COLMAPLEN * 2;
for(i=0; i<COLMAPLEN; i++) {
rmap[i] = colmap[i][2];
gmap[i] = colmap[i][1];
bmap[i] = colmap[i][0];
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.