Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!rsalz From: rsalz@uunet.UU.NET (Rich Salz) Newsgroups: comp.sources.unix Subject: v12i052: A PostScript interpreter, Part03/18 Message-ID: <2751@uunet.UU.NET> Date: Tue, 3-Nov-87 02:09:31 EST Article-I.D.: uunet.2751 Posted: Tue Nov 3 02:09:31 1987 Date-Received: Fri, 6-Nov-87 03:49:49 EST Organization: UUNET Communications Services, Arlington, VA Lines: 3571 Approved: rs@uunet.UU.NET Submitted-by: Crispin Goswell Posting-number: Volume 12, Issue 52 Archive-name: postscript/part03 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'doc/postscript.1' <<'END_OF_FILE' X.na X.TH POSTSCRIPT 1 Rutherford X.SH NAME Xpostscript \- PostScript interpreter X.SH SYNOPSIS X.B XPS [ -isc - ] files . . . X.br Xpostscript [ -isc - ] files . . . X.br Xviewer X.SH DESCRIPTION X.I PS Xis an interpreter for the PostScript language. XThe language is intended for driving laser printers, but this Ximplementation is for previewing graphics on a suitable device or Xfor more general programming. X.PP XThe implementation conforms to the PostScript Language Manual as Xclosely as possible. X.PP X.I Postscript Xis a version of the interpreter which will talk through a pair of pipes to Xa viewer program, possibly running on a different machine. X.PP X.I Postscript looks for the environment variable POSTSCRIPTDEVICE, which may contain Xthe name of Xa two-way device or a command with a vertical bar at the front. XThis is ``|viewer'' by default, and may be something like ``|rsh workstation viewer''. X.I Postscript Xmay be run on a compute server with no display, and X.I viewer Xon a workstation. X.PP XTo create a window of A4 size, the A4 command may be used. XIf this is specified on the command line (e.g. ``PS -c A4''), postscript will not bother to Xread its standard input unless told to do so with ``-''. X.SH INVOCATION XWhen X.I postscript Xstarts up it performs the following actions: X.PP XIt reads a number of definitions from a standard library file. XThis file is X.I psrc Xin the directory given as the environment variable X.I POSTSCRIPTLIB X(defaults to X.IR /usr/lib/postscript ). XThis contains definitions which are part of the PostScript language Xand can be defined in PostScript. XIn particular, it reads a procedure called X.B executive Xwhich is the top level interpreter used when X.I postscript Xis running interactively. X.PP XNext it reads a file called X.I .postscript Xfrom the users HOME directory. XThis may contain any useful startup routines that are always wanted. X.PP XNext any arguments are processed off the command line. XThese can be a mixture of options and files, and are executed in order. XThe options are as follows: X.IP -c XCauses the next argument to be treated as an executable postscript string. X.IP -i XCauses postscript to behave as if its standard input is a terminal, Xeven if it isn't. XThis involves executing the X.B executive Xdefinition from the library. XIf this is absent and the standard input is not a terminal and there are Xno files or X-c options on the command line, the standard input will be treated as an Xordinary file. X.IP -s XCauses the standard input to be read, even if there are files or commands Xon the command line. X.IP - XSame as -s. X.SH CACHING X.PP XThis implementation does caching of fonts to disk. XOnce a font has been selected and used, X.B savecurrentfont Xmay be used (without any arguments) to save the current font into the Xdisk cache. XIt saves only those glyphs which have been cached so far, and will fail Xif the X.I cache Xdirectory does not contain sub-directories matching the relevant Xfiles in the X.I font Xdirectory. X.PP XLoading from the disk cache is automatic - the system is tolerant about Xabsent cached fonts, and simply reads the whole font specification instead. XThe intention is that the system should be lazy, so that it doesn't do work Xunnecessarily. X.SH FONT MAPPING X.PP XMost installations will have a number of fonts which they may wish to use. XMost X.Ps Xfiles will contain font names such as ``Times-Roman'' which are Xinconvenient to change. X.Ps Xthus contains a dictionary in which name pairs can be placed. XThis dictionary called X.B FontMap Xis searched when a font is chosen and the font name is replaced by the value Xassociated with its dictionary entry if one is present; Xotherwise the name is not changed. XThe reason for this is that a previewer gives only an approximation, so it is sometimes useful Xto use differing fonts, even if the widths are slightly wrong. X.PP XAlso, during startup, a file called X.B font-map Xin the X.Ps Xlibrary gets X.B run. XThis is assumed to contain default mappings, and may typically be empty. X.SH NEW OPERATORS X.PP XA number of non-standard operators have been added to this version of Xthe interpreter. X.PP X.B savecurrentfont Xhas been described already. X.PP X.B setstrokemethod Xand X.B currentstrokemethod Xallow thin strokes to be done with line drawing rather than the area fill used for Xother lines. XThe option is an integer. X.B 0 Xturns off this feature, X.B 1 Xturns it on and is the default. X.PP X.B A4 Xand X.B A5 Xgenerate new windows of the suggested sizes. XThe old window is deleted unless it is being held in a gsave context. X.SH ASSUMPTIONS XThere are a number of Assumptions that have been made in the Xabsence of more specific documentation. X.IP XThat Integer and Real values are only equivalent mathematically, Xand are normally Xdistinct except where specified in the manual. XThe manual requires equivalence in the following places: X.RS X.IP XThe arguments of the arithmetic and mathematical operators. X.IP XThe arguments of the relational operators (including X.B eq Xand X.BR ne ). X.RE X.IP XIn particular integers and reals are distinguished as dictionary keys. X.IP XThat X.B cvrs Xis not expected to convert reals to any base. X.IP XThat the output from X.B == Xand X.B pstack Xcan look however we want them to. X.IP XThat %stdout and %stderr should not ever be closed - the manual is specific Xabout %stdin, but not the other two. X.IP XThat X.B stop Xcan exit a X.B run Xcontext. X.IP XThat X.B flushfile Xshould close an input stream. X.B Read Xwill close its file if it reads nothing, Xbut the manual doesn't say whether other operators should. XIt is assumed so. X.IP XThat access restrictions on files are implemented using the Xaccess restrictions on objects. X.SH FILES X\&~/.postscript \- profile command source X.br X$POSTSCRIPTLIB/psrc \- library of postscript material. X$POSTSCRIPTLIB/font-map \- library of postscript material. X.PP XThe X.I POSTSCRIPTLIB Xdirectory may contain: X.IP psrc XThe POSTSCRIPT initialisation library. X.IP font Xa directory containing font headers, which are executable POSTSCRIPT describing how to load Xfonts. X.IP fonts Xa directory containing font information. X.IP font-map Xa file containing default font name mappings. X.IP cache Xa directory containing a corresponding set of cached fonts. X.SH SEE ALSO X.I The PostScript Language Manual, X.I Adobe Systems Incorporated, 1984. X.SH AUTHOR XCrispin Goswell. XTony Williams provided important guidance. X.SH BUGS XNo ``virtual memory'' \- dummy operators which do a gsave and grestore and provided. X.PP XNo access protection, the operators are there, but they don't protect anything. END_OF_FILE if test 6501 -ne `wc -c <'doc/postscript.1'`; then echo shar: \"'doc/postscript.1'\" unpacked with wrong size! fi # end of 'doc/postscript.1' fi if test -f 'postscript/demos/mooreform.ps' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'postscript/demos/mooreform.ps'\" else echo shar: Extracting \"'postscript/demos/mooreform.ps'\" \(6182 characters\) sed "s/^X//" >'postscript/demos/mooreform.ps' <<'END_OF_FILE' X%! X% moore business forms -- synthetic "image" and complex clipping X X/tms /Times-Roman findfont def X/tmb /Times-Bold findfont def X/sws /Helvetica findfont def X/t22 tmb 22 scalefont def X/s24 sws 24 scalefont def X/s10 sws 10 scalefont def X/s12 sws 12 scalefont def X/s6 sws 6 scalefont def X X/lightorange {.9 setgray}def X/medorange {.5 setgray}def X/darkbrown {0 setgray}def X/white {1 setgray}def X/inch {72 mul}def X X%do rounded borders X/borders X {medorange X 12 194 moveto 0 194 0 750 8 arcto X 0 750 450 750 8 arcto X 450 750 450 606 8 arcto X 450 606 862 606 4 arcto X 862 606 862 194 8 arcto X 862 194 428 194 8 arcto X 428 194 428 88 4 arcto X 428 88 716 88 4 arcto X 716 88 716 0 8 arcto X 716 0 0 0 8 arcto X 0 0 0 72 8 arcto X 0 72 lineto X 0 194 12 194 8 arcto X 12 194 lineto X 4 setlinewidth stroke X 716 44 moveto X 716 88 862 88 8 arcto X 862 88 862 0 8 arcto X 862 0 716 0 8 arcto X 716 0 716 43 8 arcto X closepath X 4 setlinewidth stroke X X %Start the inner border X darkbrown X /dx 6 def /dy 6 def X 12 194 dy add moveto 0 dx add 194 dy add 0 dx add 750 dy sub 4 arcto X 0 dx add 750 dy sub 450 dx sub 750 dy sub 4 arcto X 450 dx sub 750 dy sub 450 dx sub 606 dy sub 4 arcto X 450 dx sub 606 dy sub 862 dx sub 606 dy sub 8 arcto X 862 dx sub 606 dy sub 862 dx sub 194 dy add 4 arcto X 862 dx sub 194 dy add 428 dx sub 194 dy add 4 arcto X 428 dx sub 194 dy add 428 dx sub 88 dy sub 8 arcto X 428 dx sub 88 dy sub 716 dx sub 88 dy sub 8 arcto X 716 dx sub 88 dy sub 716 dx sub 0 dy add 4 arcto X 716 dx sub 0 dy add 0 dx add 0 dy add 4 arcto X 0 dx add 0 dy add 0 dx add 72 4 arcto X 0 dx add 72 lineto X 0 dx add 194 dy sub 12 194 dy sub 4 arcto X 12 194 dy sub lineto X 4 setlinewidth stroke X }def X X/bx % make a box X {/ury exch def /urx exch def /lly exch def /llx exch def X llx lly moveto llx ury lineto urx ury lineto urx lly lineto closepath X }def X X/labelbox X {/pts exch def X /tary exch def X /lcnt tary length def X /ury exch def /urx exch def /lly exch def /llx exch def X darkbrown X llx lly moveto llx ury lineto urx ury lineto urx lly lineto closepath X fill X white X /st ury ury lly sub lcnt pts mul sub 2 div sub pts .75 mul sub def X tary X {dup stringwidth pop 2 div urx llx add 2 div exch sub st moveto show X /st st pts sub def X }forall X }def X X%given cx y array of strings, then center text. X/ctext X {/pts exch def X /tary exch def X /lcnt tary length def X /ty exch def /ctx exch def X darkbrown X tary X {dup stringwidth pop 2 div ctx exch sub ty moveto show X /ty ty pts sub def X }forall X }def X X%Build the procedures necessary to implement the fountain. X/fountainstring 256 string def X0 1 255 X {fountainstring exch dup X 255 div 180 mul cos neg 2 div .5 add 128 mul 127 add cvi X put X } for X X/rfountainstring 256 string def X0 1 255 X {rfountainstring exch dup X 255 div 180 mul cos neg 2 div .5 add 128 mul 128 exch sub 127 add cvi put X }for X X/fount %take string llx lly urx ury X {/fnt exch def X /ury exch def /urx exch def X /lly exch def /llx exch def X gsave llx lly translate X urx llx sub ury lly sub scale X 1 256 8 [1 0 0 -256 0 256] {fnt} image X grestore X }def X X/fountain X {fountainstring fount}def X X/rfountain X {rfountainstring fount}def X X%This is the logo for the moore business form example. X/slogo X {18 18 scale X slogo1 slogo2 X 1 18 div dup scale X }def X X/slogo2 X {0 .3 moveto X 2 1 3 2.3 3 5 curveto X 3 10.5 lineto X 5.1 10.5 lineto X 5.1 5 lineto X 5.1 2.5 2 .3 0 .3 curveto closepath X 2 0 moveto X 5 .5 6 1 7 3 curveto X 8 5 9 6 11 6 curveto X 11 1 7 0 4 0 curveto closepath X }def X X/slogo1 X {0 .3 moveto X 0 10.5 lineto X 2.3 10.5 lineto X 2.3 5 lineto X 2.3 2.3 1 1 0 .3 curveto closepath X 0 .2 moveto X 3 .2 5.5 2.5 5.6 5 curveto X 5.7 7.5 7 10.5 11 10.5 curveto X 11 7 lineto X 9 7 8 6 7 4 curveto X 6 2 5 0 0 0 curveto closepath X }def X X X% now do it X X8.5 inch 1 inch translate 90 rotate X36 40 translate X.7 .7 scale X Xborders X Xs6 setfont Xlightorange X10 630 442 742 bx fill X10 600 66 624 bx fill X67 600 124 624 bx fill X124 600 168 624 [(Date)]6 labelbox Xlightorange X168 600 232 624 bx fill X232 600 340 624 [(Customer's Order No.)]6 labelbox Xlightorange X341 600 442 624 bx fill X%new set Xdarkbrown X10 568 102 592 [(PART)(NUMBER)] 6 labelbox X103 568 441 592 [(DESCRIPTION)] 6 labelbox X442 568 513 580 [(ORDERED)] 6 labelbox X514 568 585 580 [(SHIPPED)] 6 labelbox X586 568 657 580 [(BALANCE DUE)] 6 labelbox X442 581 657 592 [(QUANTITY)] 6 labelbox X658 568 729 592 [(UNIT)(PRICE)] 6 labelbox X730 568 772 592 [(%)(DISCOUNT)] 6 labelbox X773 568 852 592 [(AMOUNT)] 6 labelbox X%new set (main body) Xgsave X103 208 441 568 bx X514 208 585 568 bx X658 208 729 568 bx X773 208 852 568 bx Xclip X103 208 852 568 rfountain Xgrestore Xgsave X10 208 102 568 bx X2.5 inch 4 inch translate slogo -2.5 inch -4 inch translate X442 208 513 568 bx X586 208 657 568 bx X730 208 772 568 bx Xclip X10 208 772 568 fountain Xgrestore Xgsave X10 14 translate Xlightorange 0 0 100 143 bx fill 0 143 100 167 [(SUB TOTAL)] 6 labelbox X102 0 translate Xlightorange 0 0 100 143 bx fill 0 143 100 167 [(TAX)] 6 labelbox X102 0 translate Xlightorange 0 0 100 143 bx fill 0 143 100 167 [(FREIGHT)] 6 labelbox X102 0 translate Xlightorange 0 0 100 143 bx fill 0 143 100 167 [(TOTAL)] 6 labelbox Xgrestore Xgsave X10 14 translate X5{0 24 moveto 403 24 lineto 1 setlinewidth stroke 0 24 translate}repeat Xgrestore Xgsave X44 672 translate X5.4 5.4 scale Xdarkbrown slogo1 fill Xmedorange slogo2 fill Xgrestore Xdarkbrown Xt22 setfont X124 698 moveto X(J. Sinclair Electronics Inc.)show Xs10 setfont X124 680 moveto X(2972 CONEY ISLAND DRIVE SO.)show X124 670 moveto X(SAN RAPHAEL, CALIFORNIA 98568)show X124 650 moveto X(Telephone (609) 992-4293)show X445 65 moveto X(Received in good condition by:)show X445 20 moveto Xs24 setfont X(X)show 3.25 72 mul 0 rlineto 1 setlinewidth stroke Xlightorange X722 16 856 50 bx fill Xs12 setfont X722 50 856 72 [(TOTAL DUE)] 12 labelbox X789 140 [(PAY THIS)(AMOUNT)] 12 ctext Xlightorange X742 124 moveto 836 124 lineto 789 100 lineto closepath fill X8.6 inch 10.25 inch X[(This business form) X(was composed and set) X(by PostScript(TM)) X(from a master provided by) X(Moore Business Forms.)] X12 ctext X Xshowpage X END_OF_FILE if test 6182 -ne `wc -c <'postscript/demos/mooreform.ps'`; then echo shar: \"'postscript/demos/mooreform.ps'\" unpacked with wrong size! fi # end of 'postscript/demos/mooreform.ps' fi if test -f 'postscript/fonts/Sans/greek.r' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'postscript/fonts/Sans/greek.r'\" else echo shar: Extracting \"'postscript/fonts/Sans/greek.r'\" \(5539 characters\) sed "s/^X//" >'postscript/fonts/Sans/greek.r' <<'END_OF_FILE' XCharStrings X/627 X Xput XMetrics X/627 X[-3 X21] Xput XCharStrings X/628 X Xput XMetrics X/628 X[3 X19] Xput XCharStrings X/629 X Xput XMetrics X/629 X[-1 X19] Xput XCharStrings X/630 X Xput XMetrics X/630 X[3 X18] Xput XCharStrings X/631 X Xput XMetrics X/631 X[-3 X16] Xput XCharStrings X/632 X Xput XMetrics X/632 X[4 X15] Xput XCharStrings X/633 X Xput XMetrics X/633 X[-1 X20] Xput XCharStrings X/634 X Xput XMetrics X/634 X[1 X21] Xput XCharStrings X/635 X Xput XMetrics X/635 X[-1 X11] Xput XCharStrings X/636 X Xput XMetrics X/636 X[-2 X18] Xput XCharStrings X/637 X Xput XMetrics X/637 X[4 X16] Xput XCharStrings X/638 X Xput XMetrics X/638 X[-1 X21] Xput XCharStrings X/639 X Xput XMetrics X/639 X[-3 X18] Xput XCharStrings X/640 X Xput XMetrics X/640 X[4 X16] Xput XCharStrings X/641 X Xput XMetrics X/641 X[-3 X17] Xput XCharStrings X/642 X Xput XMetrics X/642 X[-2 X22] Xput XCharStrings X/643 X Xput XMetrics X/643 X[0 X18] Xput XCharStrings X/644 X Xput XMetrics X/644 X[-3 X20] Xput XCharStrings X/645 X Xput XMetrics X/645 X[-2 X20] Xput XCharStrings X/646 X Xput XMetrics X/646 X[-1 X20] Xput XCharStrings X/647 X Xput XMetrics X/647 X[-3 X22] Xput XCharStrings X/648 X Xput XMetrics X/648 X[-1 X18] Xput XCharStrings X/649 X Xput XMetrics X/649 X[0 X23] Xput XCharStrings X/650 X Xput XMetrics X/650 X[-3 X23] Xput XCharStrings X/527 X Xput XMetrics X/527 X[3 X18] Xput XCharStrings X/528 X Xput XMetrics X/528 X[1 X21] Xput XCharStrings X/529 X Xput XMetrics X/529 X[2 X17] Xput XCharStrings X/530 X Xput XMetrics X/530 X[3 X18] Xput XCharStrings X/531 X Xput XMetrics X/531 X[2 X19] Xput XCharStrings X/532 X Xput XMetrics X/532 X[2 X20] Xput XCharStrings X/533 X Xput XMetrics X/533 X[1 X22] Xput XCharStrings X/534 X Xput XMetrics X/534 X[1 X22] Xput XCharStrings X/535 X Xput XMetrics X/535 X[8 X8] Xput XCharStrings X/536 X Xput XMetrics X/536 X[1 X21] Xput XCharStrings X/537 X Xput XMetrics X/537 X[3 X18] Xput XCharStrings X/538 X Xput XMetrics X/538 X[0 X24] Xput XCharStrings X/539 X Xput XMetrics X/539 X[1 X22] Xput XCharStrings X/540 X Xput XMetrics X/540 X[3 X18] Xput XCharStrings X/541 X Xput XMetrics X/541 X[1 X22] Xput XCharStrings X/542 X Xput XMetrics X/542 X[1 X22] Xput XCharStrings X/543 X Xput XMetrics X/543 X[1 X21] Xput XCharStrings X/544 X Xput XMetrics X/544 X[3 X18] Xput XCharStrings X/545 X Xput XMetrics X/545 X[4 X16] Xput XCharStrings X/546 X Xput XMetrics X/546 X[3 X18] Xput XCharStrings X/547 X Xput XMetrics X/547 X[2 X20] Xput XCharStrings X/548 X Xput XMetrics X/548 X[2 X20] Xput XCharStrings X/549 X Xput XMetrics X/549 X[1 X22] Xput XCharStrings X/550 X Xput XMetrics X/550 X[2 X20] Xput END_OF_FILE if test 5539 -ne `wc -c <'postscript/fonts/Sans/greek.r'`; then echo shar: \"'postscript/fonts/Sans/greek.r'\" unpacked with wrong size! fi # end of 'postscript/fonts/Sans/greek.r' fi if test -f 'postscript/fonts/sans/roman.r' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'postscript/fonts/sans/roman.r'\" else echo shar: Extracting \"'postscript/fonts/sans/roman.r'\" \(5642 characters\) sed "s/^X//" >'postscript/fonts/sans/roman.r' <<'END_OF_FILE' XCharStrings X/1 X Xput XMetrics X/1 X[0 X10] Xput XCharStrings X/2 X Xput XMetrics X/2 X[0 X10] Xput XCharStrings X/3 X Xput XMetrics X/3 X[0 X11] Xput XCharStrings X/4 X Xput XMetrics X/4 X[0 X10] Xput XCharStrings X/5 X Xput XMetrics X/5 X[0 X10] Xput XCharStrings X/6 X Xput XMetrics X/6 X[0 X9] Xput XCharStrings X/7 X Xput XMetrics X/7 X[0 X11] Xput XCharStrings X/8 X Xput XMetrics X/8 X[0 X10] Xput XCharStrings X/9 X Xput XMetrics X/9 X[3 X4] Xput XCharStrings X/10 X Xput XMetrics X/10 X[1 X7] Xput XCharStrings X/11 X Xput XMetrics X/11 X[0 X10] Xput XCharStrings X/12 X Xput XMetrics X/12 X[0 X9] Xput XCharStrings X/13 X Xput XMetrics X/13 X[-1 X12] Xput XCharStrings X/14 X Xput XMetrics X/14 X[0 X10] Xput XCharStrings X/15 X Xput XMetrics X/15 X[0 X11] Xput XCharStrings X/16 X Xput XMetrics X/16 X[0 X10] Xput XCharStrings X/17 X Xput XMetrics X/17 X[0 X11] Xput XCharStrings X/18 X Xput XMetrics X/18 X[0 X10] Xput XCharStrings X/19 X Xput XMetrics X/19 X[0 X10] Xput XCharStrings X/20 X Xput XMetrics X/20 X[0 X10] Xput XCharStrings X/21 X Xput XMetrics X/21 X[0 X11] Xput XCharStrings X/22 X Xput XMetrics X/22 X[0 X10] Xput XCharStrings X/23 X Xput XMetrics X/23 X[-1 X12] Xput XCharStrings X/24 X Xput XMetrics X/24 X[0 X10] Xput XCharStrings X/25 X Xput XMetrics X/25 X[0 X10] Xput XCharStrings X/26 X Xput XMetrics X/26 X[0 X10] Xput XCharStrings X/space X<8000 X1063E X4200 X00107 X3C44 X> Xput XMetrics X/space X[64 X0] Xput XCharStrings X/zero X Xput XMetrics X/zero X[0 X10] Xput XCharStrings X/one X Xput XMetrics X/one X[0 X10] Xput XCharStrings X/two X Xput XMetrics X/two X[0 X10] Xput XCharStrings X/three X Xput XMetrics X/three X[0 X10] Xput XCharStrings X/four X Xput XMetrics X/four X[0 X10] Xput XCharStrings X/five X Xput XMetrics X/five X[0 X10] Xput XCharStrings X/six X Xput XMetrics X/six X[0 X10] Xput XCharStrings X/seven X Xput XMetrics X/seven X[0 X10] Xput XCharStrings X/eight X Xput XMetrics X/eight X[0 X10] Xput XCharStrings X/nine X Xput XMetrics X/nine X[0 X10] Xput XCharStrings X/period X Xput XMetrics X/period X[-2 X5] Xput XCharStrings X/comma X Xput XMetrics X/comma X[-2 X5] Xput XCharStrings X/colon X Xput XMetrics X/colon X[0 X5] Xput XCharStrings X/semicolon X Xput XMetrics X/semicolon X[0 X5] Xput XCharStrings X/exclam X Xput XMetrics X/exclam X[3 X5] Xput XCharStrings X/question X Xput XMetrics X/question X[1 X9] Xput XCharStrings X/quotesingle X Xput XMetrics X/quotesingle X[3 X4] Xput XCharStrings X/quotedbl X Xput XMetrics X/quotedbl X[1 X8] Xput XCharStrings X/ring X Xput XMetrics X/ring X[1 X8] Xput XCharStrings X/dollar X Xput XMetrics X/dollar X[1 X10] Xput XCharStrings X/slash X Xput XMetrics X/slash X[1 X10] Xput XCharStrings X/parenleft X Xput XMetrics X/parenleft X[3 X7] Xput XCharStrings X/parenright X Xput XMetrics X/parenright X[2 X7] Xput XCharStrings X/bar X Xput XMetrics X/bar X[4 X4] Xput XCharStrings X/minus X Xput XMetrics X/minus X[-2 X12] Xput XCharStrings X/plus X Xput XMetrics X/plus X[-2 X12] Xput XCharStrings X/equal X Xput XMetrics X/equal X[-2 X12] Xput XCharStrings X/multiply X Xput XMetrics X/multiply X[-2 X10] Xput XCharStrings X/asterisk X Xput XMetrics X/asterisk X[-2 X10] Xput XCharStrings X/dotmath X Xput XMetrics X/dotmath X[-1 X5] Xput XCharStrings X/quoteleft X Xput XMetrics X/quoteleft X[3 X5] Xput XCharStrings X/quoteright X Xput XMetrics X/quoteright X[3 X5] Xput XCharStrings X/arrowright X Xput XMetrics X/arrowright X[-2 X12] Xput XCharStrings X/numbersign X Xput XMetrics X/numbersign X[1 X11] Xput XCharStrings X/currency X Xput XMetrics X/234 X[-1 X12] Xput XCharStrings X/235 X Xput XMetrics X/currency X[-2 X12] Xput END_OF_FILE if test 5642 -ne `wc -c <'postscript/fonts/sans/roman.r'`; then echo shar: \"'postscript/fonts/sans/roman.r'\" unpacked with wrong size! fi # end of 'postscript/fonts/sans/roman.r' fi if test -f 'postscript/widths/Adobe/Times-Roman' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'postscript/widths/Adobe/Times-Roman'\" else echo shar: Extracting \"'postscript/widths/Adobe/Times-Roman'\" \(5333 characters\) sed "s/^X//" >'postscript/widths/Adobe/Times-Roman' <<'END_OF_FILE' X(fonts/Times/roman) lib run Xuserdict /factor 22 put XFontDirectory /Times-Roman-Adobe get begin XMetrics /space 250 factor idiv put XMetrics /exclam 333 factor idiv put XMetrics /quotedbl 408 factor idiv put XMetrics /numbersign 500 factor idiv put XMetrics /dollar 500 factor idiv put XMetrics /percent 833 factor idiv put XMetrics /ampersand 778 factor idiv put XMetrics /quoteright 333 factor idiv put XMetrics /parenleft 333 factor idiv put XMetrics /parenright 333 factor idiv put XMetrics /asterisk 500 factor idiv put XMetrics /plus 564 factor idiv put XMetrics /comma 250 factor idiv put XMetrics /hyphen 333 factor idiv put XMetrics /period 250 factor idiv put XMetrics /slash 278 factor idiv put XMetrics /zero 500 factor idiv put XMetrics /one 500 factor idiv put XMetrics /two 500 factor idiv put XMetrics /three 500 factor idiv put XMetrics /four 500 factor idiv put XMetrics /five 500 factor idiv put XMetrics /six 500 factor idiv put XMetrics /seven 500 factor idiv put XMetrics /eight 500 factor idiv put XMetrics /nine 500 factor idiv put XMetrics /colon 278 factor idiv put XMetrics /semicolon 278 factor idiv put XMetrics /less 564 factor idiv put XMetrics /equal 564 factor idiv put XMetrics /greater 564 factor idiv put XMetrics /question 444 factor idiv put XMetrics /at 921 factor idiv put XMetrics /A 722 factor idiv put XMetrics /B 667 factor idiv put XMetrics /C 667 factor idiv put XMetrics /D 722 factor idiv put XMetrics /E 611 factor idiv put XMetrics /F 556 factor idiv put XMetrics /G 722 factor idiv put XMetrics /H 722 factor idiv put XMetrics /I 333 factor idiv put XMetrics /J 389 factor idiv put XMetrics /K 722 factor idiv put XMetrics /L 611 factor idiv put XMetrics /M 889 factor idiv put XMetrics /N 722 factor idiv put XMetrics /O 722 factor idiv put XMetrics /P 556 factor idiv put XMetrics /Q 722 factor idiv put XMetrics /R 667 factor idiv put XMetrics /S 556 factor idiv put XMetrics /T 611 factor idiv put XMetrics /U 722 factor idiv put XMetrics /V 722 factor idiv put XMetrics /W 944 factor idiv put XMetrics /X 722 factor idiv put XMetrics /Y 722 factor idiv put XMetrics /Z 611 factor idiv put XMetrics /bracketleft 333 factor idiv put XMetrics /backslash 278 factor idiv put XMetrics /bracketright 333 factor idiv put XMetrics /asciicircum 469 factor idiv put XMetrics /underscore 500 factor idiv put XMetrics /quoteleft 333 factor idiv put XMetrics /a 444 factor idiv put XMetrics /b 500 factor idiv put XMetrics /c 444 factor idiv put XMetrics /d 500 factor idiv put XMetrics /e 444 factor idiv put XMetrics /f 333 factor idiv put XMetrics /g 500 factor idiv put XMetrics /h 500 factor idiv put XMetrics /i 278 factor idiv put XMetrics /j 278 factor idiv put XMetrics /k 500 factor idiv put XMetrics /l 278 factor idiv put XMetrics /m 778 factor idiv put XMetrics /n 500 factor idiv put XMetrics /o 500 factor idiv put XMetrics /p 500 factor idiv put XMetrics /q 500 factor idiv put XMetrics /r 333 factor idiv put XMetrics /s 389 factor idiv put XMetrics /t 278 factor idiv put XMetrics /u 500 factor idiv put XMetrics /v 500 factor idiv put XMetrics /w 722 factor idiv put XMetrics /x 500 factor idiv put XMetrics /y 500 factor idiv put XMetrics /z 444 factor idiv put XMetrics /braceleft 480 factor idiv put XMetrics /bar 200 factor idiv put XMetrics /braceright 480 factor idiv put XMetrics /asciitilde 541 factor idiv put XMetrics /exclamdown 333 factor idiv put XMetrics /cent 500 factor idiv put XMetrics /sterling 500 factor idiv put XMetrics /fraction 167 factor idiv put XMetrics /yen 500 factor idiv put XMetrics /florin 500 factor idiv put XMetrics /section 500 factor idiv put XMetrics /currency 500 factor idiv put XMetrics /quotesingle 180 factor idiv put XMetrics /quotedblleft 444 factor idiv put XMetrics /guillemotleft 500 factor idiv put XMetrics /guilsinglleft 333 factor idiv put XMetrics /guilsinglright 333 factor idiv put XMetrics /fi 556 factor idiv put XMetrics /fl 556 factor idiv put XMetrics /endash 500 factor idiv put XMetrics /dagger 500 factor idiv put XMetrics /daggerdbl 500 factor idiv put XMetrics /periodcentered 250 factor idiv put XMetrics /paragraph 453 factor idiv put XMetrics /bullet 350 factor idiv put XMetrics /quotesinglbase 333 factor idiv put XMetrics /quotedblbase 444 factor idiv put XMetrics /quotedblright 444 factor idiv put XMetrics /guillemotright 500 factor idiv put XMetrics /ellipsis 1000 factor idiv put XMetrics /perthousand 1000 factor idiv put XMetrics /questiondown 444 factor idiv put XMetrics /grave 333 factor idiv put XMetrics /acute 333 factor idiv put XMetrics /circumflex 333 factor idiv put XMetrics /tilde 333 factor idiv put XMetrics /macron 333 factor idiv put XMetrics /breve 333 factor idiv put XMetrics /dotaccent 333 factor idiv put XMetrics /dieresis 333 factor idiv put XMetrics /ring 333 factor idiv put XMetrics /cedilla 333 factor idiv put XMetrics /hungarumlaut 333 factor idiv put XMetrics /ogonek 333 factor idiv put XMetrics /caron 333 factor idiv put XMetrics /emdash 1000 factor idiv put XMetrics /AE 889 factor idiv put XMetrics /ordfeminine 276 factor idiv put XMetrics /Lslash 611 factor idiv put XMetrics /Oslash 722 factor idiv put XMetrics /OE 889 factor idiv put XMetrics /ordmasculine 310 factor idiv put XMetrics /ae 667 factor idiv put XMetrics /dotlessi 278 factor idiv put XMetrics /lslash 278 factor idiv put XMetrics /oslash 500 factor idiv put XMetrics /oe 722 factor idiv put XMetrics /germandbls 500 factor idiv put Xend END_OF_FILE if test 5333 -ne `wc -c <'postscript/widths/Adobe/Times-Roman'`; then echo shar: \"'postscript/widths/Adobe/Times-Roman'\" unpacked with wrong size! fi # end of 'postscript/widths/Adobe/Times-Roman' fi if test -f 'source/math.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/math.c'\" else echo shar: Extracting \"'source/math.c'\" \(5148 characters\) sed "s/^X//" >'source/math.c' <<'END_OF_FILE' X/* X * Copyright (C) Rutherford Appleton Laboratory 1987 X * X * This source may be copied, distributed, altered or used, but not sold for profit X * or incorporated into a product except under licence from the author. X * It is not in the public domain. X * This notice should remain in the source unaltered, and any changes to the source X * made by persons other than the author should be marked as such. X * X * Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd X */ X#include X X#include "main.h" X X#define PI 3.14159265358979 X Xstatic int PRand (), PSrand (), PRrand (), Idiv (); X Xstatic catchmath (); Xextern int errno; Xjmp_buf env; X XInitMath () X { X InstallOp ("abs", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("add", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("div", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("mod", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("mul", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("neg", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("sub", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("sqrt", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("exp", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("ceiling", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("floor", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("round", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("truncate", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("atan", PolyPair, 2, 1, 0, 0, Poly, Poly); X InstallOp ("cos", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("sin", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("ln", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("log", PolyFirst, 1, 1, 0, 0, Poly); X InstallOp ("rand", PRand, 0, 1, 0, 0); X InstallOp ("srand", PSrand, 1, 0, 0, 0, Integer); X InstallOp ("rrand", PRrand, 0, 1, 0, 0); X InstallOp ("idiv", Idiv, 2, 1, 0, 0, Float, Float); X X/* PanicIf (setjmp (env), "Unexpected floating point error"); X VOID signal (SIGFPE, catchmath); X*/ } X Xstatic catchmath () X { X VOID signal (SIGFPE, catchmath); X longjmp (env, TRUE); X } X Xfloat Deg (r) float r; X { X float res = 360 * r / (2 * PI); X return res < 0 ? res + 360 : res; X } X Xfloat Rad (d) float d; X { X return 2 * PI * d / 360; X } X Xfloat BodyFloat (ob) Object ob; X { X if (TypeOf (ob) == Integer) X return (float) BodyInteger (ob); X else if (TypeOf (ob) == Real) X return BodyReal (ob); X else X Panic ("BodyFloat passed arg of bad type"); X return 0.0; X } X XObject ParseNumber (s, length) char *s; int length; X { X int c, sign, ival; X float fval; X X /*if (setjmp (env)) X return Absent;*/ X if (length == 0) X return Nil; X sign = ParseSign (&s, &length); X if (*s == '.') X { X c = *s++; X --length; X ival = 0; X } X else X { X ival = ParseInteger (&s, &length, 10); X if (length < 0) X return Nil; X else if (length == 0) X return MakeInteger (ival * sign); X X c = *s++; --length; X } X if (c == '.') X { X int olength = length, dval; X X fval = ival; X dval = ParseInteger (&s, &length, 10); X fval += dval * pow (10.0, (float)(length - olength)); X if (length < 0) X return Nil; X else if (length == 0) X return MakeReal (sign * fval); X } X else if (c == '#') X { X int base = ival; X X if (base < 2 || base > 36) X return Nil; X ival = ParseInteger (&s, &length, base); X if (length >= 0) X return MakeInteger (ival * sign); X return Nil; X } X else X { X --s; X ++length; X fval = ival; X } X X fval *= sign; X c = *s++; --length; X if (c == 'e' || c == 'E') X { X Object res; X int sign = ParseSign (&s, &length), power = ParseInteger (&s, &length, 10); X X if (length < 0) X return Nil; X res = MakeReal (fval * pow (10.0, (double) power * sign)); X return res; X } X else X return Nil; X } X Xstatic int ParseSign (s, length) char **s; int *length; X { X int c; X X if (*length == 0) X return 1; X c = *(*s)++; X --*length; X if (c == '+') X return 1; X else if (c == '-') X return -1; X ++*length; X --*s; X return 1; X } X Xstatic int ParseInteger (p, length, base) char **p; int *length, base; X { X int present = FALSE, ival = 0, digit; X if (*length == 0) X { X *length = -1; X return 0; X } X for (;;) X { X int c = *(*p)++; X X if (c >= '0' && c <= '9') X digit = c - '0'; X else if (c >= 'a' && c <= 'z') X digit = c - 'a' + 10; X else if (c >= 'A' && c <= 'Z') X digit = c - 'A' + 10; X else X break; X if (digit < base) X /*ival = StrictAdd (StrictMul (ival, base), digit);*/ X ival = ival * base + digit; X else X break; X ++present; X if (--*length == 0) X return ival; X } X --*p; X if (!present) X *length = -1; X return ival; X } X Xstatic int seed = 1; X Xstatic int random () X { X return seed = ((seed * 1103515245 + 12345) & 0x7fffffff); X } X Xstatic int PRand () /* --- integer */ X { X VOID random (); X return Push (OpStack, MakeInteger (seed)); X } X Xstatic int PSrand (see) Object see; X { X srand ((unsigned) (seed = BodyInteger (see))); X return TRUE; X } X Xstatic int PRrand () X { X return Push (OpStack, MakeInteger (seed)); X } X Xstatic int Idiv (a, b) Object a, b; X { X if (BodyReal (b) == 0) X return Error (PUnResult); X return Push (OpStack, MakeInteger ((int) BodyReal (a) / (int) BodyReal (b))); X } END_OF_FILE if test 5148 -ne `wc -c <'source/math.c'`; then echo shar: \"'source/math.c'\" unpacked with wrong size! fi # end of 'source/math.c' fi if test -f 'source/paint.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/paint.c'\" else echo shar: Extracting \"'source/paint.c'\" \(5867 characters\) sed "s/^X//" >'source/paint.c' <<'END_OF_FILE' X/* X * Copyright (C) Rutherford Appleton Laboratory 1987 X * X * This source may be copied, distributed, altered or used, but not sold for profit X * or incorporated into a product except under licence from the author. X * It is not in the public domain. X * This notice should remain in the source unaltered, and any changes to the source X * made by persons other than the author should be marked as such. X * X * Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd X */ X#include "main.h" X#include "graphics.h" X#include "canon.h" X Xstatic NeedAux (h) struct hardware *h; X { X DevicePoint extent; X X if (h->aux) X return; X extent = HardwareExtent (h); X h->aux = NewBitmapHardware (extent.dx, extent.dy); X } X Xstatic void RasterThreeAdd (from, aux, to, fromPoint, toPoint, extent, rop) /* depends on aux */ X struct hardware *from, *aux, *to; X DevicePoint fromPoint, toPoint, extent; X int rop; X { X BitBlt (from, aux, fromPoint, toPoint, extent, ROP_AND); X BitBlt (aux, to, toPoint, toPoint, extent, rop); X } X Xstatic void RasterFour (from, mask, aux, to, fromPoint, toPoint, extent, rop) X struct hardware *from, *mask, *aux, *to; X DevicePoint fromPoint, toPoint, extent; X int rop; X { X if (mask == NULL) X BitBlt (from, to, fromPoint, toPoint, extent, rop); X else if (from == NULL) X BitBlt (mask, to, toPoint, toPoint, extent, rop); X else X { X BitBlt (from, aux, fromPoint, toPoint, extent, ROP_SOURCE); X RasterThreeAdd (mask, aux, to, toPoint, toPoint, extent, rop); X } X } X Xvoid Paint (from, to, fromPoint, toPoint, extent, colour) X struct hardware *from, *to; X DevicePoint fromPoint, toPoint, extent; X Colour colour; X { X int col; X X if (to == NULL) X return; X X UpdateControl (to, FALSE); X X col = IsWindowHardware (to) ? HardColour (colour) : 0; X X if (to->clip ) X NeedAux (to); X if (col == 0) X if (to->clip == NULL && from != NULL) X BitBlt (from, to, fromPoint, toPoint, extent, ROP_OR); X else X RasterFour (from, to->clip, to->aux, to, fromPoint, toPoint, extent, ROP_OR); X else if (col == TransferSize () - 1) X RasterFour (from, to->clip, to->aux, to, fromPoint, toPoint, extent, ROP_NOTAND); X else X { X struct hardware *gray = GraySync (col); X NeedAux (to); X if (from) X { X BitBlt (from, to->aux, fromPoint, toPoint, extent, ROP_SOURCE); X if (to->clip) X BitBlt (to->clip, to->aux, toPoint, toPoint, extent, ROP_AND); X BitBlt (to->aux, to, toPoint, toPoint, extent, ROP_NOTAND); X RasterTile (gray, to->aux, toPoint, extent, ROP_AND); X BitBlt (to->aux, to, toPoint, toPoint, extent, ROP_OR); X } X else X { X if (to->clip) X { X BitBlt (to->clip, to->aux, toPoint, toPoint, extent, ROP_SOURCE); X BitBlt (to->aux, to, toPoint, toPoint, extent, ROP_NOTAND); X RasterTile (gray, to->aux, toPoint, extent, ROP_AND); X BitBlt (to->aux, to, toPoint, toPoint, extent, ROP_OR); X } X else X RasterTile (gray, to, toPoint, extent, ROP_SOURCE); X X } X } X UpdateControl (to, TRUE); X } X Xvoid PaintLine (h, fromPoint, toPoint, colour) X struct hardware *h; X DevicePoint fromPoint, toPoint; X Colour colour; X { X int col; X X if (h == NULL) X return; X X col = IsWindowHardware (h) ? HardColour (colour) : 0; X X UpdateControl (h, FALSE); X X if (h->clip == NULL && (col == 0 || col == TransferSize () - 1)) X BitBltLine (h, fromPoint, toPoint, (col == 0 ? ROP_TRUE : ROP_FALSE)); X else X { X int mx = Min (fromPoint.dx, toPoint.dx), my = Min (fromPoint.dy, toPoint.dy), X Mx = Max (fromPoint.dx, toPoint.dx), My = Max (fromPoint.dy, toPoint.dy); X DevicePoint orig, ex; X X orig = NewDevicePoint (mx, my); X ex = NewDevicePoint (Mx - mx + 1, My - my + 1); X X NeedAux (h); X BitBlt ((struct hardware *) NULL, h->aux, orig, orig, ex, ROP_FALSE); X X BitBltLine (h->aux, fromPoint, toPoint, ROP_TRUE); X X BitBlt (h->clip, h->aux, orig, orig, ex, ROP_AND); X BitBlt (h->aux, h, orig, orig, ex, ROP_NOTAND); X X if (col != 0 && col != TransferSize () - 1) X { X struct hardware *gray = GraySync (col); X RasterTile (gray, h->aux, orig, ex, ROP_AND); X } X BitBlt (h->aux, h, orig, orig, ex, ROP_OR); X } X UpdateControl (h, TRUE); X } X Xvoid PaintTrapezoid (to, lefttop, leftbottom, righttop, rightbottom, top, bottom, colour) X struct hardware *to; X DevicePoint lefttop, leftbottom, righttop, rightbottom; X int top, bottom; X Colour colour; X { X int col; X X if (to == NULL) X return; X X col = IsWindowHardware (to) ? HardColour (colour) : 0; X X UpdateControl (to, FALSE); X X if (to->clip) X NeedAux (to); X if (col == 0) X BitBltTrapezoid (to, lefttop, leftbottom, righttop, rightbottom, top, bottom, ROP_TRUE); X else if (col == TransferSize () - 1) X BitBltTrapezoid (to, lefttop, leftbottom, righttop, rightbottom, top, bottom, ROP_FALSE); X else X { X DevicePoint origin, extent; X struct hardware *gray; X X int left = lefttop.dx < leftbottom.dx ? lefttop.dx : leftbottom.dx, X right = righttop.dx > rightbottom.dx ? righttop.dx : rightbottom.dx; X X if (righttop.dx < left) X left = righttop.dx; X if (rightbottom.dx < left) X left = rightbottom.dx; X if (lefttop.dx > right) X right = lefttop.dx; X if (leftbottom.dx > right) X right = leftbottom.dx; X origin = NewDevicePoint (left, top); X extent = NewDevicePoint (right - left, bottom - top); X X gray = GraySync (col); X NeedAux (to); X BitBlt ((struct hardware *) NULL, to->aux, origin, origin, extent, ROP_FALSE); X BitBltTrapezoid (to->aux, lefttop, leftbottom, righttop, rightbottom, top, bottom, ROP_TRUE); X if (to->clip) X BitBlt (to->clip, to->aux, origin, origin, extent, ROP_AND); X BitBlt (to->aux, to, origin, origin, extent, ROP_NOTAND); X RasterTile (gray, to->aux, origin, extent, ROP_AND); X BitBlt (to->aux, to, origin, origin, extent, ROP_OR); X } X UpdateControl (to, TRUE); X } END_OF_FILE if test 5867 -ne `wc -c <'source/paint.c'`; then echo shar: \"'source/paint.c'\" unpacked with wrong size! fi # end of 'source/paint.c' fi if test -f 'source/pixrect.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/pixrect.c'\" else echo shar: Extracting \"'source/pixrect.c'\" \(5728 characters\) sed "s/^X//" >'source/pixrect.c' <<'END_OF_FILE' X/* X * Copyright (C) Rutherford Appleton Laboratory 1987, All Rights Reserved. X * X * This source may be copied, distributed, altered or used, but not sold for profit X * or incorporated into a product except under licence from the author. X * It is not in the public domain. X * This notice should remain in the source unaltered, and any changes to the source X * made by persons other than the author should be marked as such. X * X * Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd X */ X X#include "main.h" X#include "graphics.h" X#include "canon.h" X#include X Xint rop_map [] = X { X PIX_SRC & PIX_NOT (PIX_SRC), X PIX_SRC & PIX_DST, X PIX_SRC & PIX_NOT (PIX_DST), X PIX_SRC, X PIX_NOT (PIX_SRC) & PIX_DST, X PIX_DST, X PIX_SRC ^ PIX_DST, X PIX_SRC | PIX_DST, X PIX_NOT (PIX_SRC | PIX_DST), X PIX_NOT (PIX_SRC ^ PIX_DST), X PIX_NOT (PIX_DST), X PIX_SRC | PIX_NOT (PIX_DST), X PIX_NOT (PIX_SRC), X PIX_NOT (PIX_SRC) | PIX_DST, X PIX_NOT (PIX_SRC & PIX_DST), X PIX_SRC | PIX_NOT (PIX_SRC) X }; X Xstatic struct hardware *NewHardware (); X Xstatic struct pixrect *screen; X Xchar *malloc (); X Xstruct hardware *InitHardware () X { X screen = pr_open ("/dev/fb"); X PanicIf (screen == NULL, "could not open display"); X X InitTransfer (82); /* XXX */ X X return NULL; X } X Xstruct hardware *NewWindowHardware (width, height) int width, height; X { X DevicePoint real_extent; X struct pixrect *w; X X real_extent = NewDevicePoint (width, height); X X if ((w = pr_region (screen, 0, 0, width, height)) == NULL) X return NULL; X return NewHardware (w, real_extent, ISWIN); X } X Xstruct hardware *NewBitmapHardware (width, height) int width, height; X { X DevicePoint real_extent; X struct pixrect *bm; X X real_extent = NewDevicePoint (width, height); X X if ((bm = mem_create (width, height, 1)) == NULL) X { X fprintf (stderr, "mem_create (%d, %d, 1)\n", width, height); X Panic ("failed to create bitmap"); X } X X return NewHardware (bm, real_extent, 0); X } X X#define DeviceBitmap(h) ((struct pixrect *) ((h)->hard.addr)) X Xstatic void DestroyHard (dev) struct hardware *dev; X { X struct pixrect *bm = DeviceBitmap (dev); X X if (bm) X pr_destroy (bm); X } X Xvoid DestroyHardware (dev) struct hardware *dev; X { X if (dev == NULL) X return; X DestroyHard (dev); X if (dev->aux) X DestroyHardware (dev->aux); X Free ((char *) dev); X } X Xstatic struct hardware *NewHardware (bm, extent, flags) struct pixrect *bm; DevicePoint extent; int flags; X { X struct hardware *d = (struct hardware *) Malloc (sizeof (struct hardware)); X X d->flags = flags; X d->hard.addr = (char *) bm; X d->aux = d->clip = NULL; X d->extent = extent; X X return d; X } X Xstruct hardware *HardwareFromString (s, width, height) unsigned char *s; int width, height; X { X int words = (width + 15) / 16; X struct pixrect *pr = mem_create (width, height, 1); X short *d = mpr_d (pr)->md_image; X int odd = ((width + 7) / 8) & 1; X int i, j; X X for (i = 0; i < height; i++) X { X for (j = 0; j < words - odd; j++) X { X short word = *s++; X X *d++ = (word << 8) | *s++; X } X if (odd) X *d++ = *s++ << 8; X } X return NewHardware (pr, NewDevicePoint (width, height), 0); X } X Xchar *StringFromHardware (h) struct hardware *h; X { X int words = (h->extent.dx + 15) / 16; X char *string = malloc ((h->extent.dx + 7) / 8 * h->extent.dy), *s = string; X int i, j, odd = ((h->extent.dx + 7) / 8) & 1; X short *d = mpr_d (DeviceBitmap (h))->md_image; X X for (i = 0; i < h->extent.dy; i++) X { X for (j = 0; j < words - odd; j++) X { X short word = *d++; X X *s++ = (word >> 8) & 0xFF; X *s++ = word & 0xFF; X } X if (odd) X *s++ = (*d++ >> 8) & 0xFF; X } X return string; X } X Xvoid UpdateControl (h, flag) struct hardware *h; int flag; X { X } X Xvoid RasterTile (from, to, toPoint, extent, rop) X struct hardware *from, *to; X DevicePoint toPoint, extent; X int rop; X { X struct pixrect *fr; X X if (to == NULL || extent.dx == 0 || extent.dy == 0) X return; X if (from) X fr = DeviceBitmap (from); X else X fr = NULL; X X pr_replrop (DeviceBitmap (to), toPoint.dx, toPoint.dy, extent.dx, extent.dy, rop_map [rop], fr, toPoint.dx, toPoint.dy); X } X Xvoid BitBlt (from, to, fromPoint, toPoint, extent, rop) X struct hardware *from, *to; X DevicePoint fromPoint, toPoint, extent; X int rop; X { X struct pixrect *fr; X X if (to == NULL || extent.dx == 0 || extent.dy == 0) X return; X X if (from) X fr = DeviceBitmap (from); X else X { X fr = NULL; X rop = single_rop [rop]; X } X X pr_rop (DeviceBitmap (to), toPoint.dx, toPoint.dy, extent.dx, extent.dy, rop_map [rop], fr, fromPoint.dx, fromPoint.dy); X } X Xvoid BitBltLine (h, fromPoint, toPoint, rop) X struct hardware *h; X DevicePoint fromPoint, toPoint; X int rop; X { X if (h == NULL) X return; X X switch (single_rop [rop]) X { X case ROP_FALSE: rop = PIX_NOT (PIX_SET); break; X case ROP_TRUE: rop = PIX_SET; break; X case ROP_NOTDEST: rop = PIX_NOT (PIX_SRC); break; X case ROP_DEST: return; break; X X default: X fprintf (stderr, "illegal rasterop\n"); X exit (1); X } X X pr_vector (DeviceBitmap (h), fromPoint.dx, fromPoint.dy, toPoint.dx, toPoint.dy, rop, ~0); X } X Xvoid BitBltBlob (to, top, height, left, right, rop) struct hardware *to; int top, height, *left, *right, rop; X { X int i, op, offset = top; X struct pixrect *bm; X height += top; X switch (rop) X { X case ROP_FALSE: op = PIX_NOT (PIX_SET); break; X case ROP_DEST: return; X case ROP_NOTDEST: op = PIX_NOT (PIX_SRC); break; X case ROP_TRUE: op = PIX_SET; break; X } X bm = DeviceBitmap (to); X rop = rop_map [rop]; X UpdateControl (to, FALSE); X for (i = top; i < height; i++) X pr_rop (bm, left[i - offset], i, right[i - offset] - left[i - offset], 1, op, bm, 0, 0); X UpdateControl (to, TRUE); X } END_OF_FILE if test 5728 -ne `wc -c <'source/pixrect.c'`; then echo shar: \"'source/pixrect.c'\" unpacked with wrong size! fi # end of 'source/pixrect.c' fi echo shar: End of archive 3 \(of 18\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0