[comp.windows.x] need help with XGetImage screen dump via SUN rasterfile

chapman@lll-lcc.UUCP (Carol Chapman) (09/01/89)

     I am *still* having trouble doing what is essentially a screen
dump to a Tektronix (non-postscript) color printer.  I get the window
corresponding to an Athena vpaned widget and then create a pixmap of
that window.  I store the image data for that pixmap into a SUN
rasterfile.  (Header and colormap information are also in the
rasterfile, before the image data.)  Then I use system("cat rasterfile
| lpr -v -Ptcpr").  My program compiles and runs without complaint,
but the printer aborts the job.  I used another program called
xviewsun to try and look at my rasterfile.  There appears to be a
problem with the image data in the rasterfile.  Below is the short routine
that puts the image data into the rasterfile.  Does anyone see
anything wrong with this?  Do I need to call XCreateImage?  I didn't
think so, but threw it in just in case!  Do I need to associate a GC
with the pixmap (here called a_drawable)?

Thanks in advance,
carol chapman

/*****************************************************************************/

static unsigned char write_raster_image(fd, width, height, a_drawable, 
					raster_cmap)
     int fd;
     unsigned width, height;
     Drawable a_drawable;
     unsigned char *raster_cmap;
  
{
  unsigned bytes_returned = 0;    /* number of bytes written by write()      */
  unsigned num_bytes = 0;         /* total size in bytes of outer_vpaned     */
  unsigned char success = FALSE;  /* TRUE if raster file image is written
				     correctly                               */
  XImage *screen_image;           /* an image of outer_vpaned                */

  num_bytes = width * height;  /* determine total size of window in bytes */
  /* save the contents of the pixmap that is to be printed into an image */
  screen_image = XCreateImage(disp, vis, depth, ZPixmap, 0,
			      raster_cmap, width, height,
			      BitmapPad(disp), 0);
  screen_image = XGetImage(disp, a_drawable, 0, 0, width, height,
			   AllPlanes, ZPixmap);
  /* write the image data into the raster file after the colormap info */
  bytes_returned = write(fd, screen_image->data, num_bytes);
  if (bytes_returned != num_bytes) 
     xprintf(wp, "Problem writing raster file to printer.\n");
  else
     success = TRUE;  /* the raster file image was written correctly */
  XDestroyImage(screen_image);  /* the image is no longer needed - remove it */
  return(success);
}  /* of write_raster_image */


/*****************************************************************************/


-- 
-------------------------------------------------------------------------------
Livermore Lab            (chapman@lll-crg.llnl.gov or chapman@lll-lcc.llnl.gov)
P.O. Box 808, L-153      Tel. (415) 423-7876
Livermore, CA  94550     "Never own anything that you have to FEED or PAINT." 

rws@EXPO.LCS.MIT.EDU (Bob Scheifler) (09/01/89)

You're taking raw X image data and stuffing it into a file, apparently
hoping (in vain) that it somehow matches Sun's rasterfile(5) format.
Well, apparently it doesn't.  You haven't provided any real clue as to
what the problem is (e.g. you don't say anything about whether xviewsun
gives an error message or just displays a skewed image, or complete
garbage); how do you seriously expect anyone to help you?  On a random
guess that you've done everything else right, please note that in the
very first paragraph of rasterfile(5) is says that scanlines must be
padded to 16 bits.  There's no guarantee that your X image conforms to
this (in fact it's almost certain that it doesn't).