|
|
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.