Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1997-2002 artofcode LLC.  All rights reserved.                     
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: gdevmacpictop.h,v 1.6 2003/01/06 23:37:58 giles Exp $ */
18
 
19
/* Helpers for working with Classic MacOS Quickdraw pictures */
20
/* (obsoleted by the DISPLAY device) */
21
 
22
#ifndef gdevmacpictop_INCLUDED
23
#  define gdevmacpictop_INCLUDED
24
 
25
#include <QDOffscreen.h>
26
 
27
 
28
/************************/
29
/* PICT data structures */
30
/************************/
31
 
32
/* write raw data to PICT file */
33
#define PICTWriteByte(ptr, data)	*((unsigned char*)  (ptr))++ = data;
34
#define PICTWriteInt(ptr, data)		*((short*) (ptr))++ = data;
35
#define PICTWriteLong(ptr, data)	*((long*)  (ptr))++ = data;
36
 
37
#define PICTWriteFillByte(ptr)		PICTWriteByte(ptr, 0);
38
 
39
/* write a PICT opcode */
40
#define PICTWriteOpcode(ptr, op)	PICTWriteInt(ptr, op);
41
 
42
 
43
/*****************************/
44
/* QuickDraw data structures */
45
/*****************************/
46
 
47
/* write a Point structure */
48
#define PICTWritePoint(ptr, h, v)															\
49
		{																					\
50
			PICTWriteInt(ptr, v);	/* vertical coordinate */								\
51
			PICTWriteInt(ptr, h);	/* horizontal coordinate */								\
52
		}
53
 
54
/* write a Rect structure */
55
#define PICTWriteRect(ptr, x, y, w, h)														\
56
		{																					\
57
			PICTWritePoint(ptr, x, y);		/* upper-left corner  */						\
58
			PICTWritePoint(ptr, x+w, y+h);	/* lower-right corner */						\
59
		}
60
 
61
/* write a rectangular Region structure */
62
#define PICTWriteRegionRectangular(ptr, x, y, w, h)											\
63
		{																					\
64
			PICTWriteInt(ptr, 10);			/* rgnSize */									\
65
			PICTWriteRect(ptr, x, y, w, h);	/* rgnBBox */									\
66
		}
67
 
68
/* write a non-rectangular Region structure */
69
#define PICTWriteRegion(ptr, x, y, b, h, size, dataptr)										\
70
		{																					\
71
			PICTWriteInt(ptr, 10+size);		/* rgnSize */									\
72
			PICTWriteRect(ptr, x, y, w, h);	/* rgnBBox */									\
73
			memcpy(ptr, dataptr, size);		/* additional data */							\
74
			((char*)(ptr)) += size;															\
75
		}
76
 
77
/* write a pattern */
78
#define PICTWritePattern(ptr, byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8)		\
79
		{																					\
80
			PICTWriteByte(ptr, byte1);		/* pattern */									\
81
			PICTWriteByte(ptr, byte2);		/* pattern */									\
82
			PICTWriteByte(ptr, byte3);		/* pattern */									\
83
			PICTWriteByte(ptr, byte4);		/* pattern */									\
84
			PICTWriteByte(ptr, byte5);		/* pattern */									\
85
			PICTWriteByte(ptr, byte6);		/* pattern */									\
86
			PICTWriteByte(ptr, byte7);		/* pattern */									\
87
			PICTWriteByte(ptr, byte8);		/* pattern */									\
88
		}
89
 
90
/* write a RGBColor structure */
91
#define PICTWriteRGBColor(ptr, r, g, b)														\
92
		{																					\
93
			PICTWriteInt(ptr, r);			/* red   */										\
94
			PICTWriteInt(ptr, g);			/* green */										\
95
			PICTWriteInt(ptr, b);			/* blue  */										\
96
		}
97
 
98
/* write a ColorSpec structure */
99
#define PICTWriteColorSpec(ptr, value, r, g, b)														\
100
		{																					\
101
			PICTWriteInt(ptr, value);			/* value */									\
102
			PICTWriteRGBColor(ptr, r, g, b);	/* color */									\
103
		}
104
 
105
/* write a ColorTable structure */
106
#define PICTWriteColorTable(ptr, seed, numEntries, cspecarr)								\
107
		{																					\
108
			int i;																			\
109
			PICTWriteLong(ptr, seed);			/* ctSeed  */								\
110
			PICTWriteInt(ptr, 0);				/* ctFlags */								\
111
			PICTWriteInt(ptr, numEntries-1);	/* ctSize  */								\
112
			for (i=0; i<numEntries; i++)		/* ctTable */								\
113
				PICTWriteColorSpec(ptr, cspecarr[i].value,									\
114
										cspecarr[i].rgb.red,								\
115
										cspecarr[i].rgb.green,								\
116
										cspecarr[i].rgb.blue);								\
117
		}
118
 
119
/* write a PixMap structure */
120
#define PICTWritePixMap(ptr, x, y, w, h, rowBytes,											\
121
						packType, packSize,													\
122
						hRes, vRes, pixelSize)												\
123
		{																					\
124
			PICTWriteInt(ptr, 0x8000+rowBytes);		/* rowBytes   */						\
125
			PICTWriteRect(ptr, x, y, w, h);			/* bounds     */						\
126
			PICTWriteInt(ptr, 0);					/* pmVersion  */						\
127
			PICTWriteInt(ptr, packType);			/* packType   */						\
128
			PICTWriteLong(ptr, (packType ? packSize : 0));		/* packSize   */			\
129
			PICTWriteLong(ptr, hRes);				/* hRes       */						\
130
			PICTWriteLong(ptr, vRes);				/* vRes       */						\
131
			if (pixelSize < 16)	{				/* indexed */								\
132
				PICTWriteInt(ptr, 0);				/* pixelType  */						\
133
				PICTWriteInt(ptr, pixelSize);		/* pixelSize  */						\
134
				PICTWriteInt(ptr, 1);				/* cmpCount   */						\
135
				PICTWriteInt(ptr, pixelSize);		/* cmpSize    */						\
136
			} else {							/* direct  */								\
137
				PICTWriteInt(ptr, RGBDirect);		/* pixelType  */						\
138
				PICTWriteInt(ptr, pixelSize);		/* pixelSize  */						\
139
				PICTWriteInt(ptr, 3);				/* cmpCount   */						\
140
				PICTWriteInt(ptr, (pixelSize==16 ? 5 : 8));		/* cmpSize    */			\
141
			}																				\
142
			PICTWriteLong(ptr, 0);					/* planeBytes */						\
143
			PICTWriteLong(ptr, 0);					/* pmTable    */						\
144
			PICTWriteLong(ptr, 0);					/* pmReserved */						\
145
		}
146
 
147
/* write PackBits data */
148
#define PICTWriteDataPackBits(ptr, base, rowBytes, lines)									\
149
		{																					\
150
			short	byteCount;																\
151
			if (raster < 8) {		/* data uncompressed */									\
152
				byteCount = rowBytes * lines;												\
153
				memcpy(ptr, base, byteCount);		/* bitmap data */						\
154
				(char*)(ptr) += byteCount;													\
155
			} else {				/* raster >= 8 use PackBits compression */				\
156
				Ptr		destBufBegin = (Ptr) malloc(raster + (raster+126)/127), destBuf,	\
157
						srcBuf = (Ptr) base;												\
158
				short	i, len;																\
159
																							\
160
				byteCount = 0;																\
161
				for (i=0; i<lines; i++) {													\
162
					destBuf = destBufBegin;													\
163
					PackBits(&srcBuf, &destBuf, rowBytes);									\
164
					len = destBuf - destBufBegin;											\
165
					if (rowBytes > 250) {													\
166
						PICTWriteInt(ptr, len);												\
167
						byteCount += 2;														\
168
					} else {																\
169
						PICTWriteByte(ptr, len);											\
170
						byteCount++;														\
171
					}																		\
172
																							\
173
					memcpy(ptr, destBufBegin, len);											\
174
					(char*)(ptr) += len;													\
175
					byteCount += len;														\
176
				}																			\
177
				free(destBufBegin);															\
178
			}																				\
179
																							\
180
			if (byteCount % 2)																\
181
				PICTWriteFillByte(ptr);														\
182
		}
183
 
184
/* write text */
185
#define PICTWriteText(ptr, textptr /* pascal string*/)										\
186
		{																					\
187
			memcpy(ptr, textptr, textptr[0]+1);				/* copy string */				\
188
			(char*)(ptr) += textptr[0]+1;													\
189
		}
190
 
191
 
192
 
193
/****************/
194
/* PICT Opcodes */
195
/****************/
196
 
197
 
198
#define PICT_NOP(ptr)																		\
199
		{																					\
200
			PICTWriteOpcode(ptr, 0x0000);						/* NOP opcode */			\
201
		}
202
 
203
#define PICT_Clip_Rectangular(ptr, x, y, w, h)												\
204
		{																					\
205
			PICTWriteOpcode(ptr, 0x0001);						/* Clip opcode */			\
206
			PICTWriteRegionRectangular(ptr, x, y, w, h);		/* clipRgn */				\
207
		}
208
 
209
#define PICT_Clip(ptr, x, y, w, h, size, dataptr)											\
210
		{																					\
211
			PICTWriteOpcode(ptr, 0x0001);						/* Clip opcode */			\
212
			PICTWriteRegion(ptr, x, y, w, h, size, dataptr);	/* clipRgn */				\
213
		}
214
 
215
#define PICT_BkPat(ptr, byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8)				\
216
		{																					\
217
			PICTWriteOpcode(ptr, 0x0002);						/* BkPat opcode */			\
218
			PICTWritePattern(ptr, byte1, byte2, byte3, byte4,	/* Pattern data */			\
219
								  byte5, byte6, byte7, byte8);								\
220
		}
221
 
222
#define PICT_TxFont(ptr, font)																\
223
		{																					\
224
			PICTWriteOpcode(ptr, 0x0003);						/* TxFont opcode */			\
225
			PICTWriteInt(ptr, font);							/* Font number   */			\
226
		}
227
 
228
#define PICT_TxFace(ptr, style)																\
229
		{																					\
230
			PICTWriteOpcode(ptr, 0x0004);						/* TxFace opcode */			\
231
			PICTWriteByte(ptr, style);							/* Font style    */			\
232
			PICTWriteFillByte(ptr);								/* Fill byte     */			\
233
		}
234
 
235
#define PICT_TxMode(ptr, mode)																\
236
		{																					\
237
			PICTWriteOpcode(ptr, 0x0005);						/* TxMode opcode */			\
238
			PICTWriteInt(ptr, mode);							/* Source mode   */			\
239
		}
240
 
241
#define PICT_PnSize(ptr, w, h)																\
242
		{																					\
243
			PICTWriteOpcode(ptr, 0x0006);						/* PnSize opcode */			\
244
			PICTWritePoint(w, h);								/* Pen size      */			\
245
		}
246
 
247
#define PICT_PnMode(ptr, mode)																\
248
		{																					\
249
			PICTWriteOpcode(ptr, 0x0007);						/* PnMode opcode */			\
250
			PICTWriteInt(ptr, mode);							/* Pen mode      */			\
251
		}
252
 
253
#define PICT_PnPat(ptr, byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8)				\
254
		{																					\
255
			PICTWriteOpcode(ptr, 0x0009);						/* PnPat opcode */			\
256
			PICTWritePattern(ptr, byte1, byte2, byte3, byte4,	/* Pattern data */			\
257
								  byte5, byte6, byte7, byte8);								\
258
		}
259
 
260
#define PICT_FillPat(ptr, byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8)			\
261
		{																					\
262
			PICTWriteOpcode(ptr, 0x000A);						/* FillPat opcode */		\
263
			PICTWritePattern(ptr, byte1, byte2, byte3, byte4,	/* Pattern data   */		\
264
								  byte5, byte6, byte7, byte8);								\
265
		}
266
 
267
#define PICT_OvSize(ptr, w, h)																\
268
		{																					\
269
			PICTWriteOpcode(ptr, 0x000B);						/* OvSize opcode */			\
270
			PICTWritePoint(w, h);								/* Oval size     */			\
271
		}
272
 
273
#define PICT_Origin(ptr, dh, dv)															\
274
		{																					\
275
			PICTWriteOpcode(ptr, 0x000C);						/* Origin opcode */			\
276
			PICTWriteInt(ptr, dh);								/* dh            */			\
277
			PICTWriteInt(ptr, dv);								/* dv            */			\
278
		}
279
 
280
#define PICT_TxSize(ptr, size)																\
281
		{																					\
282
			PICTWriteOpcode(ptr, 0x000D);						/* TxSize opcode */			\
283
			PICTWriteInt(ptr, size);							/* Text Size     */			\
284
		}
285
 
286
#define PICT_FgColor(ptr, color)															\
287
		{																					\
288
			PICTWriteOpcode(ptr, 0x000E);						/* FgColor opcode   */		\
289
			PICTWriteLong(ptr, color);							/* Foreground color */		\
290
		}
291
 
292
#define PICT_BkColor(ptr, color)															\
293
		{																					\
294
			PICTWriteOpcode(ptr, 0x000F);						/* BkColor opcode   */		\
295
			PICTWriteLong(ptr, color);							/* Background color */		\
296
		}
297
 
298
#define PICT_TxRatio(ptr, num, denom)														\
299
		{																					\
300
			PICTWriteOpcode(ptr, 0x0010);						/* TxRatio opcode      */	\
301
			PICTWritePoint(ptr, num);							/* Numerator (Point)   */	\
302
			PICTWritePoint(ptr, denom);							/* Denominator (Point) */	\
303
		}
304
 
305
#define PICT_VersionOp(ptr, version)														\
306
		{																					\
307
			PICTWriteOpcode(ptr, 0x0011);						/* VersionOp opcode */		\
308
			PICTWriteByte(ptr, version);						/* Version          */		\
309
			PICTWriteFillByte(ptr);								/* Fill byte        */		\
310
		}
311
 
312
#define PICT_RGBFgCol(ptr, r, g, b)															\
313
		{																					\
314
			PICTWriteOpcode(ptr, 0x001A);						/* RGBFgCol opcode  */		\
315
			PICTWriteRGBColor(ptr, r, g, b);					/* Foreground color */		\
316
		}
317
 
318
#define PICT_RGBBkCol(ptr, r, g, b)															\
319
		{																					\
320
			PICTWriteOpcode(ptr, 0x001B);						/* RGBBkCol opcode  */		\
321
			PICTWriteRGBColor(ptr, r, g, b);					/* Background color */		\
322
		}
323
 
324
#define PICT_HiliteMode(ptr)																\
325
		{																					\
326
			PICTWriteOpcode(ptr, 0x001C);						/* HiliteMode opcode */		\
327
		}
328
 
329
#define PICT_HiliteColor(ptr, r, g, b)														\
330
		{																					\
331
			PICTWriteOpcode(ptr, 0x001D);						/* HiliteColor opcode */	\
332
			PICTWriteRGBColor(ptr, r, g, b);					/* Highlight color    */	\
333
		}
334
 
335
#define PICT_DefHilite(ptr)																	\
336
		{																					\
337
			PICTWriteOpcode(ptr, 0x001E);						/* DefHilite opcode */		\
338
		}
339
 
340
#define PICT_OpColor(ptr, r, g, b)															\
341
		{																					\
342
			PICTWriteOpcode(ptr, 0x001F);						/* OpColor opcode */		\
343
			PICTWriteRGBColor(ptr, r, g, b);					/* Opcolor        */		\
344
		}
345
 
346
#define PICT_Line(ptr, x0, y0, x1, y1)														\
347
		{																					\
348
			PICTWriteOpcode(ptr, 0x0020);						/* Line opcode */			\
349
			PICTWritePoint(ptr, x0, y0);						/* pnLoc       */			\
350
			PICTWritePoint(ptr, x1, y1);						/* newPt       */			\
351
		}
352
 
353
#define PICT_LineFrom(ptr, x, y)															\
354
		{																					\
355
			PICTWriteOpcode(ptr, 0x0021);						/* LineFrom opcode */		\
356
			PICTWritePoint(ptr, x, y);							/* newPt           */		\
357
		}
358
 
359
#define PICT_ShortLine(ptr, x, y, dh, dv)													\
360
		{																					\
361
			PICTWriteOpcode(ptr, 0x0022);						/* ShortLine opcode */		\
362
			PICTWritePoint(ptr, x, y);							/* pnLoc            */		\
363
			PICTWriteByte(ptr, dh);								/* dh               */		\
364
			PICTWriteByte(ptr, dv);								/* dv               */		\
365
		}
366
 
367
#define PICT_ShortLineFrom(ptr, dh, dv)														\
368
		{																					\
369
			PICTWriteOpcode(ptr, 0x0023);						/* ShortLineFrom opcode */	\
370
			PICTWriteByte(ptr, dh);								/* dh                   */	\
371
			PICTWriteByte(ptr, dv);								/* dv                   */	\
372
		}
373
 
374
#define PICT_LongText(ptr, x, y, textptr /* pascal string */)								\
375
		{																					\
376
			PICTWriteOpcode(ptr, 0x0028);						/* LongText opcode */		\
377
			PICTWritePoint(ptr, x, y);							/* Point           */		\
378
			PICTWriteText(ptr, textptr);						/* text            */		\
379
			if ((textptr[0]+1) % 2) PICTWriteFillByte(ptr);									\
380
		}
381
 
382
#define PICT_DHText(ptr, dh, textptr /* pascal string */)									\
383
		{																					\
384
			PICTWriteOpcode(ptr, 0x0029);						/* DHText opcode */			\
385
			PICTWriteByte(ptr, dh);								/* dh            */			\
386
			PICTWriteText(ptr, textptr);						/* text            */		\
387
			if (textptr[0] % 2) PICTWriteFillByte(ptr);										\
388
		}
389
 
390
#define PICT_DVText(ptr, dv, textptr /* pascal string */)									\
391
		{																					\
392
			PICTWriteOpcode(ptr, 0x002A);						/* DVText opcode */			\
393
			PICTWriteByte(ptr, dv);								/* dv            */			\
394
			PICTWriteText(ptr, textptr);						/* text            */		\
395
			if (textptr[0] % 2) PICTWriteFillByte(ptr);										\
396
		}
397
 
398
#define PICT_DHDVText(ptr, dh, dv, textptr /* pascal string */)								\
399
		{																					\
400
			PICTWriteOpcode(ptr, 0x002B);						/* DHDVText opcode */		\
401
			PICTWriteByte(ptr, dh);								/* dh              */		\
402
			PICTWriteByte(ptr, dv);								/* dv              */		\
403
			PICTWriteText(ptr, textptr);						/* text            */		\
404
			if ((textptr[0]+1) % 2) PICTWriteFillByte(ptr);									\
405
		}
406
 
407
#define PICT_fontName(ptr, id, nameptr /* pascal string */)									\
408
		{																					\
409
			PICTWriteOpcode(ptr, 0x002C);						/* fontName opcode */		\
410
			PICTWriteInt(ptr, nameptr[0]+1+2);					/* data length     */		\
411
			PICTWriteInt(ptr, id);								/* font id         */		\
412
			PICTWriteText(ptr, nameptr);						/* text            */		\
413
			if ((nameptr[0]+1) % 2) PICTWriteFillByte(ptr);									\
414
		}
415
 
416
#define PICT_frameRect(ptr, x, y, w, h)														\
417
		{																					\
418
			PICTWriteOpcode(ptr, 0x0030);						/* frameRect opcode */		\
419
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
420
		}
421
 
422
#define PICT_paintRect(ptr, x, y, w, h)														\
423
		{																					\
424
			PICTWriteOpcode(ptr, 0x0031);						/* paintRect opcode */		\
425
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
426
		}
427
 
428
#define PICT_eraseRect(ptr, x, y, w, h)														\
429
		{																					\
430
			PICTWriteOpcode(ptr, 0x0032);						/* eraseRect opcode */		\
431
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
432
		}
433
 
434
#define PICT_invertRect(ptr, x, y, w, h)													\
435
		{																					\
436
			PICTWriteOpcode(ptr, 0x0033);						/* invertRect opcode */		\
437
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle         */		\
438
		}
439
 
440
#define PICT_fillRect(ptr, x, y, w, h)														\
441
		{																					\
442
			PICTWriteOpcode(ptr, 0x0034);						/* fillRect opcode */		\
443
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle       */		\
444
		}
445
 
446
#define PICT_frameSameRect(ptr)																\
447
		{																					\
448
			PICTWriteOpcode(ptr, 0x0038);						/* frameSameRect opcode */	\
449
		}
450
 
451
#define PICT_paintSameRect(ptr)																\
452
		{																					\
453
			PICTWriteOpcode(ptr, 0x0039);						/* paintSameRect opcode */	\
454
		}
455
 
456
#define PICT_eraseSameRect(ptr)																\
457
		{																					\
458
			PICTWriteOpcode(ptr, 0x003A);						/* eraseSameRect opcode */	\
459
		}
460
 
461
#define PICT_invertSameRect(ptr)															\
462
		{																					\
463
			PICTWriteOpcode(ptr, 0x003B);						/* invertSameRect opcode */	\
464
		}
465
 
466
#define PICT_fillSameRect(ptr)																\
467
		{																					\
468
			PICTWriteOpcode(ptr, 0x003C);						/* fillSameRect opcode */	\
469
		}
470
 
471
#define PICT_frameRRect(ptr, x, y, w, h)													\
472
		{																					\
473
			PICTWriteOpcode(ptr, 0x0040);						/* frameRRect opcode */		\
474
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle         */		\
475
		}
476
 
477
#define PICT_paintRRect(ptr, x, y, w, h)													\
478
		{																					\
479
			PICTWriteOpcode(ptr, 0x0041);						/* paintRRect opcode */		\
480
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle         */		\
481
		}
482
 
483
#define PICT_eraseRRect(ptr, x, y, w, h)													\
484
		{																					\
485
			PICTWriteOpcode(ptr, 0x0042);						/* eraseRRect opcode */		\
486
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle         */		\
487
		}
488
 
489
#define PICT_invertRRect(ptr, x, y, w, h)													\
490
		{																					\
491
			PICTWriteOpcode(ptr, 0x0043);						/* invertRRect opcode */	\
492
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle          */	\
493
		}
494
 
495
#define PICT_fillRRect(ptr, x, y, w, h)														\
496
		{																					\
497
			PICTWriteOpcode(ptr, 0x0044);						/* fillRRect opcode */		\
498
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
499
		}
500
 
501
#define PICT_frameSameRRect(ptr)															\
502
		{																					\
503
			PICTWriteOpcode(ptr, 0x0048);						/* frameSameRRect opcode */	\
504
		}
505
 
506
#define PICT_paintSameRRect(ptr)															\
507
		{																					\
508
			PICTWriteOpcode(ptr, 0x0049);						/* paintSameRRect opcode */	\
509
		}
510
 
511
#define PICT_eraseSameRRect(ptr)															\
512
		{																					\
513
			PICTWriteOpcode(ptr, 0x004A);						/* eraseSameRRect opcode */	\
514
		}
515
 
516
#define PICT_invertSameRRect(ptr)															\
517
		{																					\
518
			PICTWriteOpcode(ptr, 0x004B);						/* invertSameRRect opcode */\
519
		}
520
 
521
#define PICT_fillSameRRect(ptr)																\
522
		{																					\
523
			PICTWriteOpcode(ptr, 0x004C);						/* fillSameRRect opcode */	\
524
		}
525
 
526
#define PICT_frameOval(ptr, x, y, w, h)														\
527
		{																					\
528
			PICTWriteOpcode(ptr, 0x0050);						/* frameOval opcode */		\
529
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
530
		}
531
 
532
#define PICT_paintOval(ptr, x, y, w, h)														\
533
		{																					\
534
			PICTWriteOpcode(ptr, 0x0051);						/* paintOval opcode */		\
535
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
536
		}
537
 
538
#define PICT_eraseOval(ptr, x, y, w, h)														\
539
		{																					\
540
			PICTWriteOpcode(ptr, 0x0052);						/* eraseOval opcode */		\
541
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
542
		}
543
 
544
#define PICT_invertOval(ptr, x, y, w, h)													\
545
		{																					\
546
			PICTWriteOpcode(ptr, 0x0053);						/* invertOval opcode */		\
547
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle         */		\
548
		}
549
 
550
#define PICT_fillOval(ptr, x, y, w, h)														\
551
		{																					\
552
			PICTWriteOpcode(ptr, 0x0054);						/* fillOval opcode */		\
553
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle       */		\
554
		}
555
 
556
#define PICT_frameSameOval(ptr)																\
557
		{																					\
558
			PICTWriteOpcode(ptr, 0x0058);						/* frameSameOval opcode */	\
559
		}
560
 
561
#define PICT_paintSameOval(ptr)																\
562
		{																					\
563
			PICTWriteOpcode(ptr, 0x0059);						/* paintSameOval opcode */	\
564
		}
565
 
566
#define PICT_eraseSameOval(ptr)																\
567
		{																					\
568
			PICTWriteOpcode(ptr, 0x005A);						/* eraseSameOval opcode */	\
569
		}
570
 
571
#define PICT_invertSameOval(ptr)															\
572
		{																					\
573
			PICTWriteOpcode(ptr, 0x005B);						/* invertSameOval opcode */	\
574
		}
575
 
576
#define PICT_fillSameOval(ptr)																\
577
		{																					\
578
			PICTWriteOpcode(ptr, 0x005C);						/* fillSameOval opcode */	\
579
		}
580
 
581
#define PICT_frameArc(ptr, x, y, w, h, startAngle, arcAngle)								\
582
		{																					\
583
			PICTWriteOpcode(ptr, 0x0060);						/* frameArc opcode */		\
584
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle       */		\
585
			PICTWriteInt(ptr, startAngle);						/* startAngle      */		\
586
			PICTWriteInt(ptr, arcAngle);						/* arcAngle        */		\
587
		}
588
 
589
#define PICT_paintArc(ptr, x, y, w, h, startAngle, arcAngle)								\
590
		{																					\
591
			PICTWriteOpcode(ptr, 0x0061);						/* paintArc opcode */		\
592
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle       */		\
593
			PICTWriteInt(ptr, startAngle);						/* startAngle      */		\
594
			PICTWriteInt(ptr, arcAngle);						/* arcAngle        */		\
595
		}
596
 
597
#define PICT_eraseArc(ptr, x, y, w, h, startAngle, arcAngle)								\
598
		{																					\
599
			PICTWriteOpcode(ptr, 0x0062);						/* eraseArc opcode */		\
600
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle       */		\
601
			PICTWriteInt(ptr, startAngle);						/* startAngle      */		\
602
			PICTWriteInt(ptr, arcAngle);						/* arcAngle        */		\
603
		}
604
 
605
#define PICT_invertArc(ptr, x, y, w, h, startAngle, arcAngle)								\
606
		{																					\
607
			PICTWriteOpcode(ptr, 0x0063);						/* invertArc opcode */		\
608
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle        */		\
609
			PICTWriteInt(ptr, startAngle);						/* startAngle       */		\
610
			PICTWriteInt(ptr, arcAngle);						/* arcAngle         */		\
611
		}
612
 
613
#define PICT_fillArc(ptr, x, y, w, h, startAngle, arcAngle)									\
614
		{																					\
615
			PICTWriteOpcode(ptr, 0x0064);						/* fillArc opcode */		\
616
			PICTWriteRect(ptr, x, y, w, h);						/* Rectangle      */		\
617
			PICTWriteInt(ptr, startAngle);						/* startAngle     */		\
618
			PICTWriteInt(ptr, arcAngle);						/* arcAngle       */		\
619
		}
620
 
621
/* use only with rowBytes < 8 !! */
622
#define PICT_BitsRect_BitMap(ptr, x0, y0, w0, h0, x1, y1, w1, h1, rowBytes, mode, dataPtr)	\
623
		{																					\
624
			PICTWriteOpcode(ptr, 0x0090);						/* BitsRect opcode */		\
625
			PICTWriteInt(ptr, rowBytes);						/* rowBytes        */		\
626
			PICTWriteRect(ptr, x1, y1, w1, h1);					/* bounds x1????   */		\
627
			PICTWriteRect(ptr, x0, y0, w0, h0);					/* srcRect         */		\
628
			PICTWriteRect(ptr, x1, y1, w1, h1);					/* dstRect         */		\
629
			PICTWriteInt(ptr, mode);							/* mode            */		\
630
			memcpy(ptr, dataPtr, h0*rowBytes);					/* BitMap data     */		\
631
		}
632
 
633
#define PICT_PackBitsRect_BitMap(ptr, x0, y0, w0, h0, x1, y1, w1, h1, rowBytes, mode,		\
634
								 dataPtr, size)												\
635
		{																					\
636
			PICTWriteOpcode(ptr, 0x0098);						/* PackBitsRect opcode */	\
637
			PICTWriteInt(ptr, rowBytes);						/* rowBytes        */		\
638
			PICTWriteRect(ptr, x1, y1, w1, h1);					/* bounds x1????   */		\
639
			PICTWriteRect(ptr, x0, y0, w0, h0);					/* srcRect         */		\
640
			PICTWriteRect(ptr, x1, y1, w1, h1);					/* dstRect         */		\
641
			PICTWriteInt(ptr, mode);							/* mode            */		\
642
			memcpy(ptr, dataPtr, size);							/* BitMap data     */		\
643
		}
644
 
645
#define PICT_OpEndPic(ptr)																	\
646
		{																					\
647
			PICTWriteOpcode(ptr, 0x00FF);						/* OpEndPic opcode */		\
648
		}
649
 
650
/* same as PICT_OpEndPic, but doesn't move pointer */
651
#define PICT_OpEndPicGoOn(ptr)																\
652
		{																					\
653
			*(ptr) = 0x00FF;									/* OpEndPic opcode */		\
654
		}
655
 
656
 
657
 
658
 
659
 
660
 
661
 
662
 
663
/******************************/
664
/* ghostscript to PICT macros */
665
/******************************/
666
 
667
/* set forground color to black and background color to white */
668
#define GSSetStdCol(ptr)																	\
669
		{																					\
670
			PICT_RGBFgCol(ptr, 0x0000, 0x0000, 0x0000);		/* black */						\
671
			PICT_RGBBkCol(ptr, 0xFFFF, 0xFFFF, 0xFFFF);		/* white */						\
672
		}
673
 
674
#define GSSetFgCol(dev, ptr, col)															\
675
		{																					\
676
			gx_color_value	rgb[3];																	\
677
			(*dev_proc(dev, map_color_rgb))(dev, col, rgb);									\
678
			PICT_RGBFgCol(ptr, rgb[0], rgb[1], rgb[2]);										\
679
		}
680
 
681
#define GSSetBkCol(dev, ptr, col)															\
682
		{																					\
683
			gx_color_value	rgb[3];																	\
684
			(*dev_proc(dev, map_color_rgb))(dev, col, rgb);									\
685
			PICT_RGBBkCol(ptr, rgb[0], rgb[1], rgb[2]);										\
686
		}
687
 
688
#endif /* gdevmacpictop_INCLUDED */