|
|
1.1 root 1: /************************************************************************
2: *
3: * lfps.c -- Subroutines for PS/DC/BM management for LineFractal.
4: *
5: * Created by Microsoft Corporation, 1989
6: *
7: ************************************************************************/
8:
9: #define INCL_WIN
10: #define INCL_GPI
11: #include <os2.h>
12:
13: #include <mt\stdio.h>
14: #include <mt\stdlib.h>
15: #include <mt\math.h>
16:
17: #define INCL_GLOBALS
18: #define INCL_THREADS
19: #include "linefrac.h"
20:
21: #define INCL_LFPS
22: #define INCL_LFDRAW
23: #include "lffuncs.h"
24:
25:
26:
27:
28: /************************************************************************
29: *
30: * Global Variables
31: *
32: ************************************************************************/
33:
34: extern GLOBALDATA global;
35:
36:
37:
38:
39: /************************************************************************
40: *
41: * Data structures for opening the PostScript DC.
42: *
43: ************************************************************************/
44:
45: typedef struct _randomdata
46: {
47: long data[12];
48: } PSRANDOMDATA;
49:
50: typedef struct _psdevopendata
51: {
52: char *device;
53: char *name;
54: PSRANDOMDATA *data;
55: char *type;
56: } PSDEVOPENDATA;
57:
58: PSRANDOMDATA psrnddata =
59: {
60: 48, 0, 0x65656565, 0, 0, 0, 0, 0, 0, 0, 0, 1
61: };
62:
63: PSDEVOPENDATA dvdata =
64: {
65: "ps.txt",
66: "PSCRIPT",
67: &psrnddata,
68: "IBM_Q_STD"
69: };
70:
71:
72:
73:
74: /************************************************************************
75: *
76: * LfOpenDC
77: *
78: * Open a device context for the thread. Read the DC type from the
79: * thread structure.
80: *
81: ************************************************************************/
82:
83: BOOL fhdcInUse = FALSE; /* TRUE --> a direct dc thread is active */
84: HDC hdcPrivate = NULL; /* non NULL --> it's the window DC */
85:
86: BOOL
87: LfOpenDC(pthr)
88: PTHR pthr;
89: {
90: switch (pthr->dcType)
91: {
92: case IDM_DCDIRECT:
93: /* only one direct dc allowed */
94: if (fhdcInUse)
95: pthr->hdc = NULL;
96: else
97: {
98: if (!hdcPrivate)
99: hdcPrivate = WinOpenWindowDC(global.hwnd);
100: pthr->hdc = hdcPrivate;
101: fhdcInUse = TRUE;
102: }
103: break;
104:
105: case IDM_DCMEMORY:
106: pthr->hdc = DevOpenDC(global.hab, OD_MEMORY, "*", 0L, NULL, NULL);
107: break;
108:
109: case IDM_DCPOSTSCRIPT:
110: pthr->hdc = DevOpenDC(global.hab, OD_DIRECT, "*", 4L, (PDEVOPENDATA)&dvdata, NULL);
111: break;
112:
113: case IDM_DCPROPRINTER:
114:
115: default:
116: pthr->hdc = NULL;
117: }
118:
119: return (pthr->hdc ? TRUE : FALSE);
120: }
121:
122:
123:
124:
125: /************************************************************************
126: *
127: * LfCloseDC
128: *
129: * Close the device context for the thread.
130: *
131: ************************************************************************/
132:
133: VOID
134: LfCloseDC(pthr)
135: PTHR pthr;
136: {
137: if (pthr->dcType == IDM_DCDIRECT)
138: fhdcInUse = FALSE;
139: else
140: {
141: if (pthr->hbm)
142: LfDeleteBitmap(pthr);
143: if (pthr->hdc)
144: DevCloseDC(pthr->hdc);
145: }
146: pthr->hdc = NULL;
147: }
148:
149:
150:
151:
152: /************************************************************************
153: *
154: * LfCreateBitmap
155: *
156: * Create a bitmap of the format specified in the thread structure.
157: * If the bitmap is to be automatically sized, then read the window
158: * size, otherwise use the values in the thread structure.
159: *
160: ************************************************************************/
161:
162: BOOL
163: LfCreateBitmap(pthr)
164: PTHR pthr;
165: {
166: BITMAPINFOHEADER bminfo;
167:
168: bminfo.cbFix = sizeof bminfo;
169:
170: bminfo.cx = (USHORT) (pthr->rcl.xRight - pthr->rcl.xLeft);
171: bminfo.cy = (USHORT) (pthr->rcl.yTop - pthr->rcl.yBottom);
172: bminfo.cPlanes = pthr->cPlanes;
173: bminfo.cBitCount = pthr->cBitCount;
174:
175: pthr->hbm = GpiCreateBitmap(pthr->hps, &bminfo, 0L, 0L, 0L);
176:
177: return (pthr->hbm ? TRUE : FALSE);
178: }
179:
180:
181:
182:
183: /************************************************************************
184: *
185: * LfDeleteBitmap
186: *
187: * Delete the thread's bitmap and set the bitmap handle to null.
188: *
189: ************************************************************************/
190:
191: VOID
192: LfDeleteBitmap(pthr)
193: PTHR pthr;
194: {
195: GpiDeleteBitmap(pthr->hbm);
196: pthr->hbm = NULL;
197: }
198:
199:
200:
201:
202: /************************************************************************
203: *
204: * LfCreatePS
205: *
206: * Create a presentation space for the thread. If the DC type is
207: * a memory bitmap, then create a bitmap, select it into the PS, and
208: * initialize it to the desired background color. Compute the scale
209: * factors and offsets to use when drawing.
210: *
211: ************************************************************************/
212:
213: BOOL
214: LfCreatePS(pthr)
215: PTHR pthr;
216: {
217: SIZEL size;
218: BOOL fOK = FALSE;
219:
220: if (LfOpenDC(pthr))
221: {
222: size.cx = 0L;
223: size.cy = 0L;
224: pthr->hps = GpiCreatePS(global.hab, pthr->hdc, &size,
225: PU_PELS|GPIT_MICRO|GPIA_ASSOC);
226: if (pthr->hps)
227: {
228: if (pthr->dcType == IDM_DCDIRECT)
229: {
230: pthr->rcl = global.rcl;
231: GpiSetAttrs(pthr->hps, PRIM_LINE, LFA_LINEALL, 0L, &pthr->lb);
232: GpiSetAttrs(pthr->hps, PRIM_MARKER, LFA_MARKALL, 0L, &pthr->mb);
233: GpiSetAttrs(pthr->hps, PRIM_AREA, LFA_AREAALL, 0L, &pthr->ab);
234: GpiSetAttrs(pthr->hps, PRIM_IMAGE, LFA_IMAGEALL, 0L, &pthr->ib);
235:
236: }
237: else if (pthr->dcType == IDM_DCMEMORY)
238: {
239: pthr->rcl.xLeft = 0L;
240: pthr->rcl.yBottom = 0L;
241: pthr->rcl.xRight = global.bm.cx;
242: pthr->rcl.yTop = global.bm.cy;
243: pthr->cPlanes = global.bm.cPlanes;
244: pthr->cBitCount = global.bm.cBitCount;
245: if (LfCreateBitmap(pthr))
246: if (GpiSetBitmap(pthr->hps, pthr->hbm) != HBM_ERROR)
247: {
248: GpiSetAttrs(pthr->hps, PRIM_LINE, LFA_LINEALL, 0L, &pthr->lb);
249: GpiSetAttrs(pthr->hps, PRIM_MARKER, LFA_MARKALL, 0L, &pthr->mb);
250: GpiSetAttrs(pthr->hps, PRIM_AREA, LFA_AREAALL, 0L, &pthr->ab);
251: GpiSetAttrs(pthr->hps, PRIM_IMAGE, LFA_IMAGEALL, 0L, &pthr->ib);
252:
253: LfClearRect(pthr, &pthr->rcl);
254: if (pthr->fCollectBounds)
255: GpiSetDrawControl(pthr->hps, DCTL_BOUNDARY, DCTL_ON);
256: fOK = TRUE;
257: }
258:
259: if (!fOK)
260: {
261: LfDeletePS(pthr);
262: return FALSE;
263: }
264: }
265: else
266: {
267: pthr->rcl = global.rcl;
268: }
269:
270: pthr->flMiscAttrs |= LFA_XSCALE | LFA_YSCALE | LFA_XOFF | LFA_YOFF;
271:
272: return TRUE;
273: }
274: }
275: return FALSE;
276: }
277:
278:
279:
280:
281: /************************************************************************
282: *
283: * LfDeletePS
284: *
285: * Delete the thread's presentation space. If the DC type is
286: * a memory bitmap, then unset the bitmap and delete it.
287: *
288: ************************************************************************/
289:
290: VOID
291: LfDeletePS(pthr)
292: PTHR pthr;
293: {
294: if (pthr->hbm)
295: {
296: GpiSetBitmap(pthr->hps, NULL);
297: LfDeleteBitmap(pthr);
298: }
299: GpiDestroyPS(pthr->hps);
300: LfCloseDC(pthr);
301: }
302:
303:
304:
305:
306: /************************************************************************
307: *
308: * LfResizePS
309: *
310: * Destroy the current PS and create a new one the size of the
311: * current client rectangle.
312: *
313: ************************************************************************/
314:
315: BOOL
316: LfResizePS(pthr)
317: PTHR pthr;
318: {
319: if (pthr->hps)
320: {
321: pthr->fInterrupted = TRUE;
322: while (pthr->fBusy)
323: ;
324: LfDeletePS(pthr);
325: }
326:
327: return LfCreatePS(pthr);
328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.