home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk12 / linefrac / lfps.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-05  |  7.0 KB  |  329 lines

  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 <stdio.h>
  14. #include <stdlib.h>
  15. #include <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. }
  329.