xref: /plan9/sys/src/cmd/postscript/postbgi/postbgi.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /*
2*7dd7cddfSDavid du Colombier  *
3*7dd7cddfSDavid du Colombier  * BGI opcodes.
4*7dd7cddfSDavid du Colombier  *
5*7dd7cddfSDavid du Colombier  */
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier #define BRCHAR		033		/* rotated character mode */
8*7dd7cddfSDavid du Colombier #define BCHAR		034		/* graphical character mode */
9*7dd7cddfSDavid du Colombier #define BGRAPH		035		/* graphical master mode */
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier #define BSUB		042		/* subroutine definition */
12*7dd7cddfSDavid du Colombier #define BRET		043		/* end of subroutine */
13*7dd7cddfSDavid du Colombier #define BCALL		044		/* subroutine call */
14*7dd7cddfSDavid du Colombier 
15*7dd7cddfSDavid du Colombier #define BEND		045		/* end page */
16*7dd7cddfSDavid du Colombier #define BERASE		046		/* erase - obsolete */
17*7dd7cddfSDavid du Colombier #define BREP		047		/* repeat */
18*7dd7cddfSDavid du Colombier #define BENDR		050		/* end repeat */
19*7dd7cddfSDavid du Colombier 
20*7dd7cddfSDavid du Colombier #define BSETX		051		/* set horizontal position */
21*7dd7cddfSDavid du Colombier #define BSETY		052		/* set vertical position */
22*7dd7cddfSDavid du Colombier #define BSETXY		053		/* set horizontal and vertical positions */
23*7dd7cddfSDavid du Colombier #define BINTEN		054		/* intensify - mark current pixel */
24*7dd7cddfSDavid du Colombier 
25*7dd7cddfSDavid du Colombier #define BVISX		055		/* manhattan vector - change x first */
26*7dd7cddfSDavid du Colombier #define BINVISX		056		/* same as BVISX but nothing drawn */
27*7dd7cddfSDavid du Colombier #define BVISY		057		/* manhattan vector - change y first */
28*7dd7cddfSDavid du Colombier #define BINVISY		060		/* same as BVISY but nothing drawn */
29*7dd7cddfSDavid du Colombier 
30*7dd7cddfSDavid du Colombier #define BVEC		061		/* arbitrary long vector */
31*7dd7cddfSDavid du Colombier #define BSVEC		062		/* arbitrary short vector */
32*7dd7cddfSDavid du Colombier #define BRECT		063		/* outline rectangle */
33*7dd7cddfSDavid du Colombier #define BPOINT1		064		/* point plot - mode 1 */
34*7dd7cddfSDavid du Colombier #define BPOINT		065		/* point plot - mode 2 */
35*7dd7cddfSDavid du Colombier #define BLINE		066		/* line plot */
36*7dd7cddfSDavid du Colombier 
37*7dd7cddfSDavid du Colombier #define BCSZ		067		/* set character size */
38*7dd7cddfSDavid du Colombier #define BLTY		070		/* select line type */
39*7dd7cddfSDavid du Colombier #define BARC		071		/* draw circular arc */
40*7dd7cddfSDavid du Colombier #define BFARC		072		/* filled circular arc */
41*7dd7cddfSDavid du Colombier #define BFRECT		073		/* filled rectangle */
42*7dd7cddfSDavid du Colombier #define BRASRECT	074		/* raster rectangle */
43*7dd7cddfSDavid du Colombier #define BCOL		075		/* select color */
44*7dd7cddfSDavid du Colombier #define BFTRAPH		076		/* filled trapezoid */
45*7dd7cddfSDavid du Colombier #define BPAT		077		/* pattern are for filling - no info */
46*7dd7cddfSDavid du Colombier 
47*7dd7cddfSDavid du Colombier #define BNOISE		0		/* from bad file format */
48*7dd7cddfSDavid du Colombier 
49*7dd7cddfSDavid du Colombier /*
50*7dd7cddfSDavid du Colombier  *
51*7dd7cddfSDavid du Colombier  * Character size is controlled by the spacing of dots in a 5x7 dot matrix, which
52*7dd7cddfSDavid du Colombier  * by default is set to BGISIZE.
53*7dd7cddfSDavid du Colombier  *
54*7dd7cddfSDavid du Colombier  */
55*7dd7cddfSDavid du Colombier 
56*7dd7cddfSDavid du Colombier #define BGISIZE		2		/* default character grid spacing */
57*7dd7cddfSDavid du Colombier 
58*7dd7cddfSDavid du Colombier /*
59*7dd7cddfSDavid du Colombier  *
60*7dd7cddfSDavid du Colombier  * Definitions used to decode the bytes read from a BGI file.
61*7dd7cddfSDavid du Colombier  *
62*7dd7cddfSDavid du Colombier  */
63*7dd7cddfSDavid du Colombier 
64*7dd7cddfSDavid du Colombier #define CHMASK		0177		/* characters only use 7 bits */
65*7dd7cddfSDavid du Colombier #define DMASK		077		/* data values use lower 6 bits */
66*7dd7cddfSDavid du Colombier #define MSB		0100		/* used to check for data or opcode */
67*7dd7cddfSDavid du Colombier #define SGNB		040		/* sign bit for integers */
68*7dd7cddfSDavid du Colombier #define MSBMAG		037		/* mag of most sig byte in a BGI int */
69*7dd7cddfSDavid du Colombier 
70*7dd7cddfSDavid du Colombier /*
71*7dd7cddfSDavid du Colombier  *
72*7dd7cddfSDavid du Colombier  * Descriptions of BGI vectors and what's done when they're drawn.
73*7dd7cddfSDavid du Colombier  *
74*7dd7cddfSDavid du Colombier  */
75*7dd7cddfSDavid du Colombier 
76*7dd7cddfSDavid du Colombier #define X_COORD		0		/* change x next in manhattan vector */
77*7dd7cddfSDavid du Colombier #define Y_COORD		1		/* same but y change comes next */
78*7dd7cddfSDavid du Colombier #define LONGVECTOR	2		/* arbitrary long vector */
79*7dd7cddfSDavid du Colombier #define SHORTVECTOR	3		/* components given in 6 bits */
80*7dd7cddfSDavid du Colombier 
81*7dd7cddfSDavid du Colombier #define VISIBLE		0		/* really draw the vector */
82*7dd7cddfSDavid du Colombier #define INVISIBLE	1		/* just move the current position */
83*7dd7cddfSDavid du Colombier 
84*7dd7cddfSDavid du Colombier /*
85*7dd7cddfSDavid du Colombier  *
86*7dd7cddfSDavid du Colombier  * What's done with a closed path.
87*7dd7cddfSDavid du Colombier  *
88*7dd7cddfSDavid du Colombier  */
89*7dd7cddfSDavid du Colombier 
90*7dd7cddfSDavid du Colombier #define OUTLINE		0		/* outline the defined path */
91*7dd7cddfSDavid du Colombier #define FILL		1		/* fill it in */
92*7dd7cddfSDavid du Colombier 
93*7dd7cddfSDavid du Colombier /*
94*7dd7cddfSDavid du Colombier  *
95*7dd7cddfSDavid du Colombier  * BGI line style definitions. They're used as an index into the STYLES array,
96*7dd7cddfSDavid du Colombier  * which really belongs in the prologue.
97*7dd7cddfSDavid du Colombier  *
98*7dd7cddfSDavid du Colombier  */
99*7dd7cddfSDavid du Colombier 
100*7dd7cddfSDavid du Colombier #define SOLID		0
101*7dd7cddfSDavid du Colombier #define DOTTED		1
102*7dd7cddfSDavid du Colombier #define SHORTDASH	2
103*7dd7cddfSDavid du Colombier #define DASH		3
104*7dd7cddfSDavid du Colombier #define LONGDASH	4
105*7dd7cddfSDavid du Colombier #define DOTDASH		5
106*7dd7cddfSDavid du Colombier #define THREEDOT	6
107*7dd7cddfSDavid du Colombier 
108*7dd7cddfSDavid du Colombier #define STYLES								\
109*7dd7cddfSDavid du Colombier 									\
110*7dd7cddfSDavid du Colombier 	{								\
111*7dd7cddfSDavid du Colombier 	    "[]",							\
112*7dd7cddfSDavid du Colombier 	    "[.5 2]",							\
113*7dd7cddfSDavid du Colombier 	    "[2 4]",							\
114*7dd7cddfSDavid du Colombier 	    "[4 4]",							\
115*7dd7cddfSDavid du Colombier 	    "[8 4]",							\
116*7dd7cddfSDavid du Colombier 	    "[.5 2 4 2]",						\
117*7dd7cddfSDavid du Colombier 	    "[.5 2 .5 2 .5 2 4 2]"					\
118*7dd7cddfSDavid du Colombier 	}
119*7dd7cddfSDavid du Colombier 
120*7dd7cddfSDavid du Colombier /*
121*7dd7cddfSDavid du Colombier  *
122*7dd7cddfSDavid du Colombier  * Three constants used to choose which component (RED, GREEN, or BLUE) we're
123*7dd7cddfSDavid du Colombier  * interested in. BGI colors are specified as a single data byte and pulling a
124*7dd7cddfSDavid du Colombier  * particular  component out of the BGI color byte is handled by procedure
125*7dd7cddfSDavid du Colombier  * get_color().
126*7dd7cddfSDavid du Colombier  *
127*7dd7cddfSDavid du Colombier  */
128*7dd7cddfSDavid du Colombier 
129*7dd7cddfSDavid du Colombier #define RED		0
130*7dd7cddfSDavid du Colombier #define GREEN		1
131*7dd7cddfSDavid du Colombier #define BLUE		2
132*7dd7cddfSDavid du Colombier 
133*7dd7cddfSDavid du Colombier /*
134*7dd7cddfSDavid du Colombier  *
135*7dd7cddfSDavid du Colombier  * An array of type Disp is used to save the horizontal and vertical displacements
136*7dd7cddfSDavid du Colombier  * that result after a subroutine has been called. Needed so we can properly adjust
137*7dd7cddfSDavid du Colombier  * our horizontal and vertical positions after a subroutine call. Entries are made
138*7dd7cddfSDavid du Colombier  * immediately after a subroutine is defined and used after the call. Subroutine
139*7dd7cddfSDavid du Colombier  * names are integers that range from 0 to 63 (assigned in the BG file) and the
140*7dd7cddfSDavid du Colombier  * name is used as an index into the Disp array when we save or retrieve the
141*7dd7cddfSDavid du Colombier  * displacement.
142*7dd7cddfSDavid du Colombier  *
143*7dd7cddfSDavid du Colombier  */
144*7dd7cddfSDavid du Colombier 
145*7dd7cddfSDavid du Colombier typedef struct {
146*7dd7cddfSDavid du Colombier 	int	dx;			/* horizontal and */
147*7dd7cddfSDavid du Colombier 	int	dy;			/* vertical displacements */
148*7dd7cddfSDavid du Colombier } Disp;
149*7dd7cddfSDavid du Colombier 
150*7dd7cddfSDavid du Colombier /*
151*7dd7cddfSDavid du Colombier  *
152*7dd7cddfSDavid du Colombier  * An array of type Fontmap helps convert font names requested by users into
153*7dd7cddfSDavid du Colombier  * legitimate PostScript names. The array is initialized using FONTMAP, which must
154*7dd7cddfSDavid du Colombier  * end with and entry that has NULL defined as its name field.
155*7dd7cddfSDavid du Colombier  *
156*7dd7cddfSDavid du Colombier  */
157*7dd7cddfSDavid du Colombier 
158*7dd7cddfSDavid du Colombier typedef struct {
159*7dd7cddfSDavid du Colombier 	char	*name;			/* user's font name */
160*7dd7cddfSDavid du Colombier 	char	*val;			/* corresponding PostScript name */
161*7dd7cddfSDavid du Colombier } Fontmap;
162*7dd7cddfSDavid du Colombier 
163*7dd7cddfSDavid du Colombier #define FONTMAP								\
164*7dd7cddfSDavid du Colombier 									\
165*7dd7cddfSDavid du Colombier 	{								\
166*7dd7cddfSDavid du Colombier 	    "R", "Courier",						\
167*7dd7cddfSDavid du Colombier 	    "I", "Courier-Oblique",					\
168*7dd7cddfSDavid du Colombier 	    "B", "Courier-Bold",					\
169*7dd7cddfSDavid du Colombier 	    "CO", "Courier",						\
170*7dd7cddfSDavid du Colombier 	    "CI", "Courier-Oblique",					\
171*7dd7cddfSDavid du Colombier 	    "CB", "Courier-Bold",					\
172*7dd7cddfSDavid du Colombier 	    "CW", "Courier",						\
173*7dd7cddfSDavid du Colombier 	    "PO", "Courier",						\
174*7dd7cddfSDavid du Colombier 	    "courier", "Courier",					\
175*7dd7cddfSDavid du Colombier 	    "cour", "Courier",						\
176*7dd7cddfSDavid du Colombier 	    "co", "Courier",						\
177*7dd7cddfSDavid du Colombier 	    NULL, NULL							\
178*7dd7cddfSDavid du Colombier 	}
179*7dd7cddfSDavid du Colombier 
180*7dd7cddfSDavid du Colombier /*
181*7dd7cddfSDavid du Colombier  *
182*7dd7cddfSDavid du Colombier  * Two macros that are useful in processing BGI files:
183*7dd7cddfSDavid du Colombier  *
184*7dd7cddfSDavid du Colombier  *       MAG(A, B)    - Takes bytes A and B which have been read from a BGI file
185*7dd7cddfSDavid du Colombier  *                      and returns the magnitude of the integer represented by
186*7dd7cddfSDavid du Colombier  *                      the two bytes.
187*7dd7cddfSDavid du Colombier  *
188*7dd7cddfSDavid du Colombier  *       LINESPACE(A) - Takes BGI size A and returns the number of address units
189*7dd7cddfSDavid du Colombier  *                      that can be used for a reasonable interline spacing.
190*7dd7cddfSDavid du Colombier  *
191*7dd7cddfSDavid du Colombier  */
192*7dd7cddfSDavid du Colombier 
193*7dd7cddfSDavid du Colombier #define MAG(A, B)	(((A & MSBMAG) << 6) | (B & DMASK))
194*7dd7cddfSDavid du Colombier #define LINESPACE(A)	(8 * A)
195*7dd7cddfSDavid du Colombier 
196*7dd7cddfSDavid du Colombier /*
197*7dd7cddfSDavid du Colombier  *
198*7dd7cddfSDavid du Colombier  * Some of the non-integer valued functions in postdmd.c.
199*7dd7cddfSDavid du Colombier  *
200*7dd7cddfSDavid du Colombier  */
201*7dd7cddfSDavid du Colombier 
202*7dd7cddfSDavid du Colombier char	*get_font();
203*7dd7cddfSDavid du Colombier 
204