home *** CD-ROM | disk | FTP | other *** search
- %!
- % Postscript pre-amble to parse scribepic output. This is a fairly
- % straightforward translation of Peter Rowley's (U Toronto) C code to
- % do the same thing.
- %
- % Originally converted to PostScript by J.W. Peterson
- % Arbitrary bitmap sizing added by J. Schimpf
- % Margin & format control added by J. Schimpf
- %
- % SEE SCRIBEPIC info sheet for the use of this file
- % YOU SHOULDN'T TRY TO EDIT THIS FILE - IT IS COPIED
- % FOR YOU.
- %
- %---------------------------------------------------------------------
- %
- % HEX FILE FORMAT
- %
- % <Invert> <XBYTES> <YSIZE> <Margin> <Height> <Move UP>
- % <Hex Data.......>
- %
- % Where Invert -> 1 For straight through data
- % 0 To invert data
- % Where YSIZE -> # Of Scan lines
- % XBYTES -> # Bytes/scan line
- % Margin -> Width of the scribe column (in inches)
- % Height -> Height of picture (in inches)
- % Move UP -> Distance picture is moved up (in inches)
- %
- % Hex data is of the form:
- %
- % <Count><Data> -> If <Count> < 0x80 then this is count
- % of # bytes to read here
- % -> If <Count> >= 0x80 This is count of # times
- % next byte is to be repeated
- %
- %--------------------------------------------------------------------------
- % Open file routine
- /infile (%stdin) (r) file def % This gets around broke "currentfile"?
-
- %--------------------------------------------------------------------------
- % Get a byte from file routine
- /getbyte
- { infile (x) readhexstring
- pop 0 get } def % Reads 1 byte of data
-
- %-------------------------------------------------------------------------
- % Useful routines & definitions
- /inch { 72 mul } def % Conversion inches => points
- /inc { 1 add } def % increment TOS
-
- %--------------------------------------------------------------------------
- % Read file and form 1 scan line
- /parseline
- {
- /in_pos 0 def % output array pos
- {
- in_pos xbytes lt % while in_pos < xbytes DO...
- {
- /cnt getbyte def % get run length
-
- cnt 127 gt
- { /cnt cnt 256 sub def } % if cnt > 128, cnt -= 256;
- if
-
- cnt 0 ge % if cnt >= 0...
- {
- cnt inc % for count+1 times...
- { scanline in_pos getbyte put % scanline[in_pos] = getbyte...
- /in_pos in_pos inc def % in_pos++
- } repeat
- }
- % ELSE
- {
- /data_byte getbyte def % fetch the run data
- cnt neg 1 add % -cnt + 1
- { scanline in_pos data_byte put % scanline[in_pos] = getbyte...
- /in_pos in_pos inc def % in_pos++
- } repeat
- }
- ifelse
- }
- { exit } % Exit loop if !(in_pos < xbytes)
- ifelse
-
- }
- loop
- scanline % leave the data on the stack
- } def
-
-
- %----------------------------------------------------------------------
- % MAIN ROUTINE
- %
- % Group all the operations to draw the picture into one procedure, to
- % minimize confusion between PostScript commands and hex data...
- %
- /drawpaint
- {
- gsave % Push graphics enviroment
-
- % Read if this is to be inverted or not put onto the stack, then decide
- % If we should invert the data
-
- infile token pop
- 1 eq
- {
- /invstat true def % Don't Invert the data
- }
- {
- /invstat false def % Invert the data
- }
- ifelse
-
- % Get the X & Y size from the file
-
- /xbytes infile token pop def % Bytes/scanline
- /ysize infile token pop def % # Scan lines
-
- % Get the margin, height & upward movement
-
- /margin infile token pop def % Default usually 6.5 in
- /height infile token pop def % Default usually 2 in
- /up infile token pop def % Default usually 0
-
- % Generate some constants we will need
-
- /scanline xbytes string def % Create output scan buffer
- /nysize ysize neg def % Used in matrix to define size
- /xbits xbytes 8 mul def % Calculate # pixels/scanline
- /width height xbits ysize div mul def % Width = height * (x / y)
-
- % Generate the transformation to place the "unit square" imagemask uses.
-
- margin width sub 2 div inch % center on page (with scribe margins)
- % with x xlate = (margin - width) / 2
- up inch % Y translate by UP translate
- translate % Center image on the page.
-
- width inch % Adjust X size to keep aspect ratio right
- height inch % convert Y height to inches
- scale
-
- %------------------------------------------------------------------
- %
- % Generate image in unit box
-
- % The next 5 things are placed on the stack for
- % the imagemask function
-
- xbits % # Pixels/Scanline
- ysize % # Scan lines
-
- invstat % Use invstat to choose pixel black/white
- [ xbits 0 0 nysize 0 ysize ] % Bit map description matrix
- { parseline } % Routine to read scan lines
- imagemask % Move bitmap to page
- grestore % Restore graphics enviroment
- } def
-
- % Put the hex data directly after the "drawpaint" command...
- drawpaint
-