Xref: utzoo comp.graphics:16934 comp.unix.aix:4277 Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!umriscc!curts From: curts@usenet.umr.edu (Curt Schroeder) Newsgroups: comp.graphics,comp.unix.aix Subject: Re: graPHIGS PostScript output ? Summary: use .rle output Keywords: Phigs PostScript ouput Message-ID: <2533@umriscc.isc.umr.edu> Date: 29 Mar 91 20:30:08 GMT References: <1131@nih-csl.nih.gov> Sender: news@umriscc.isc.umr.edu Reply-To: curts@ee.umr.edu (Curt Schroeder) Followup-To: comp.graphics Distribution: comp.graphics,comp.unix.aix Organization: University of Missouri - Rolla Lines: 286 In article ivan@nepjt.ncsu.edu (Ivan Maldonado) writes: >The only way we're now able to get PostScript output >from our rs6000/graPHIGS displays has been through >an "X window screen dump", by piping commands as: >xwd | xpr -device ps -out somefile.ps >However, the actual hardcopy ends up "very ugly" (i.e., >very coarse definition plus the x-window border around >it). Anyone familiar with this that can recommend an >alternate route ? I would like to share my solution to this problem (although I use DEC Phigs on a DEC 3100). I have a function that I pass the X display pointer and the X window ID to and it creates a Utah format .rle file (using the color map info). The .rle file can then be manipulated using all the Utah tools (including the production of B&W or color Postscript). The hard part is to determine the display pointer and window ID. I found an "escape" buried in the back of the DEC Phigs manual that gives me the display pointer when called. Hopefully, you can find something similar in graPhigs, or some back door approach to get the info if you can't get it any other way. The nice part is that you can then do a screen dump under program control. The code for doing this in DEC Phigs is included below. Curt ================== cut here ============================ /****************************************************************************** * * Header to make use of Xwindows easier. * * File: xwindows.h * * Author: Curt Schroeder * * Date: 1/15/90 * ******************************************************************************/ #include #include #define PIXELS 256 #define MAX_INTENS 65535L extern Display *primary_display; extern Colormap color_map; extern Colormap alt_map; extern unsigned long pixels[PIXELS]; extern int pixel_flags; extern Window main_window; extern Pixmap main_pixmap; extern GC primary_gc; /* initialized as black-on-white */ ================== cut here ============================ /****************************************************************************** * * Routines to make use of Xwindows easier. * * File: xwindows.c * * Author: Curt Schroeder * * Date: 3/13/91 * ******************************************************************************/ #include "xwindows.h" #include /* global declarations */ Display *primary_display; Visual *vis; int depth; Colormap color_map; Colormap alt_map; Window main_window, root_window; Pixmap main_pixmap; GC primary_gc; XEvent main_event; KeySym main_key; XSizeHints main_hint; int primary_screen; unsigned long black_pixel, white_pixel; unsigned long pixels[PIXELS]; int pixel_flags = {DoRed|DoGreen|DoBlue}; /* function declarations */ init_windows () { struct esc_data_struct { int num_ints; int num_floats; int num_strings; int *ints; float *floats; int *string_sizes; char **strings; } out_esc_data, in_esc_data; Pint esc_id = PHIGS$K_ESC_INQ_WINDOW_IDS; Pint ws_id = WSID; Pint out_size; Pint int_buffer[2]; Pint in_size; char main_title[15]; int class; Status rc; XColor default_pixels[PIXELS]; int i; Window parent; Window *children; unsigned int nchildren; Status result; /* init data records for DEC Phigs escape call */ in_esc_data.num_ints = 1; in_esc_data.num_floats = 0; in_esc_data.num_strings = 0; in_esc_data.ints = &ws_id; in_esc_data.floats = NULL; in_esc_data.string_sizes = NULL; in_esc_data.strings = NULL; in_size = sizeof(struct esc_data_struct); out_esc_data.num_ints = 2; out_esc_data.num_floats = 0; out_esc_data.num_strings = 0; out_esc_data.ints = int_buffer; out_esc_data.floats = NULL; out_esc_data.string_sizes = NULL; out_esc_data.strings = NULL; out_size = sizeof(struct esc_data_struct); pescape(esc_id,&in_esc_data,in_size,&out_esc_data,&out_size); /* initialization */ primary_display = (Display *)int_buffer[0]; primary_screen = DefaultScreen(primary_display); color_map = DefaultColormap(primary_display,primary_screen); /* display visiual info */ depth = DefaultDepth(primary_display,primary_screen); vis = DefaultVisual(primary_display,primary_screen); class = vis->class; if (depth == 1) { printf("one-plane monochrome\n"); } else if (class == PseudoColor ) { printf("multi-plane color\n"); } else if (class == GrayScale) { printf("multi-plane monochrome\n"); } else if (class == DirectColor) { printf("direct color\n"); } else if (class == TrueColor) { printf("direct color, unchangeable color map\n"); } /* define main_window */ main_window = (Window)int_buffer[1]; } /****************************************************************************** * * Function to store an X image to disk in the Utah Raster Toolkit RLE format. * * Author: Curt Schroeder * * Date: 3/13/91 * ******************************************************************************/ store_rle (display, drawable, file_name) Display *display; Window drawable; char* file_name; { XColor table[PIXELS]; int i, j, x, y; Window root; unsigned int width, height, border_width, depth; XImage *image; FILE *image_file; long pixel; XWindowAttributes window_attr; rle_hdr the_hdr; rle_pixel **scan_line; rle_map cmap[768]; /* init variables */ image_file = rle_open_f_noexit("DEC PHIGS",file_name,"wb"); if (image_file != NULL) { printf("image file %s opened\n",file_name); /* get the color map */ XGetWindowAttributes(primary_display,main_window,&window_attr); for (i = 0; i < PIXELS; i++) table[i].pixel = i; XQueryColors(display,window_attr.colormap,table,PIXELS); /* make certain no RGB values are out of range and store in cmap */ for (i = 0; i < PIXELS; i++) { if (table[i].red > MAX_INTENS) table[i].red = 0; cmap[i] = table[i].red; if (table[i].green > MAX_INTENS) table[i].green = 0; cmap[256 + i] = table[i].green; if (table[i].blue > MAX_INTENS) table[i].blue = 0; cmap[512 + i] = table[i].blue; } /* get the image and store it and it's color map */ if (XGetGeometry(display,drawable,&root,&x,&y,&width,&height, &border_width,&depth)) { printf("image at (%d,%d) %d x %d will be fetched\n",x,y,width,height); image = XGetImage(display,drawable,x,y,width,height,-1,ZPixmap); /* init the RLE header */ the_hdr.ncolors = 1; the_hdr.bg_color = NULL; the_hdr.alpha = 0; the_hdr.background = 0; the_hdr.xmin = 0; the_hdr.xmax = width - 1; the_hdr.ymin = 0; the_hdr.ymax = height - 1; the_hdr.ncmap = 3; the_hdr.cmaplen = 8; the_hdr.cmap = cmap; the_hdr.comments = NULL; the_hdr.rle_file = image_file; RLE_SET_BIT(the_hdr,RLE_RED); RLE_SET_BIT(the_hdr,RLE_GREEN); RLE_SET_BIT(the_hdr,RLE_BLUE); RLE_CLR_BIT(the_hdr,RLE_ALPHA); /* write out the image */ rle_put_setup(&the_hdr); rle_row_alloc(&the_hdr,&scan_line); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { pixel = XGetPixel(image,j,(height - 1 - i)); scan_line[0][j] = (rle_pixel)pixel; } /* load each pixel in the current row into RLE row structure */ rle_putrow(scan_line,width,&the_hdr); } /* close the image file */ rle_puteof(&the_hdr); fclose(image_file); printf("image storage completed...\n\n"); /* destroy the image structure */ XDestroyImage(image); } } return(0); } ================== cut here ============================ Curt Schroeder | U of Missouri - Rolla | curts@ee.umr.edu | ---------------------------------------| curts@cs.umr.edu | "Oops? What do you mean, oops? I | s076895@umrvma.bitnet | distinctly heard an oops!" - Opus | -- Apple II Forever -- |