home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tkisrc04.zip / tk / os2 / tkOS2Pixmap.c < prev    next >
C/C++ Source or Header  |  1998-08-07  |  7KB  |  238 lines

  1. /* 
  2.  * tkOS2Pixmap.c --
  3.  *
  4.  *    This file contains the Xlib emulation functions pertaining to
  5.  *    creating and destroying pixmaps.
  6.  *
  7.  * Copyright (c) 1996-1997 Illya Vaes
  8.  * Copyright (c) 1995 Sun Microsystems, Inc.
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  */
  13.  
  14.  
  15. #include "tkOS2Int.h"
  16.  
  17.  
  18. /*
  19.  *----------------------------------------------------------------------
  20.  *
  21.  * XCreatePixmap --
  22.  *
  23.  *    Creates an in memory drawing surface.
  24.  *
  25.  * Results:
  26.  *    Returns a handle to a new pixmap.
  27.  *
  28.  * Side effects:
  29.  *    Allocates a new OS/2 bitmap, hps, DC.
  30.  *
  31.  *----------------------------------------------------------------------
  32.  */
  33.  
  34. Pixmap
  35. XCreatePixmap(display, d, width, height, depth)
  36.     Display* display;
  37.     Drawable d;
  38.     unsigned int width;
  39.     unsigned int height;
  40.     unsigned int depth;
  41. {
  42.     TkOS2Drawable *newTodPtr, *todPtr;
  43.     BITMAPINFOHEADER2 bmpInfo;
  44.     LONG rc;
  45.     DEVOPENSTRUC dop = {0L, (PSZ)"DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
  46.     SIZEL sizl = {0,0}; /* use same page size as device */
  47.     sizl.cx = width; sizl.cy = height;
  48.     
  49.     display->request++;
  50.  
  51.     newTodPtr = (TkOS2Drawable*) ckalloc(sizeof(TkOS2Drawable));
  52.     if (newTodPtr == NULL) {
  53.     return (Pixmap)None;
  54.     }
  55.  
  56.     newTodPtr->type = TOD_BITMAP;
  57.     newTodPtr->bitmap.depth = depth;
  58.     todPtr = (TkOS2Drawable *)d;
  59.     if (todPtr->type != TOD_BITMAP) {
  60. #ifdef DEBUG
  61.         printf("XCreatePixmap %x, depth %d, parent %x, %dx%d\n", newTodPtr,
  62.                depth, todPtr->window.handle, sizl.cx, sizl.cy);
  63. #endif
  64.         newTodPtr->bitmap.parent = todPtr->window.handle;
  65.         if (todPtr->window.winPtr == NULL) {
  66.             newTodPtr->bitmap.colormap = DefaultColormap(display,
  67.                     DefaultScreen(display));
  68.         } else {
  69.             newTodPtr->bitmap.colormap = todPtr->window.winPtr->atts.colormap;
  70.         }
  71.     } else {
  72. #ifdef DEBUG
  73.         printf("XCreatePixmap %x, depth %d, parent (bitmap) %x, %dx%d\n",
  74.                newTodPtr, depth, todPtr->bitmap.parent, sizl.cx, sizl.cy);
  75. #endif
  76.         newTodPtr->bitmap.colormap = todPtr->bitmap.colormap;
  77.         newTodPtr->bitmap.parent = todPtr->bitmap.parent;
  78.     }
  79. #ifdef DEBUG
  80.     printf("XCreatePixmap: colormap %x, parent %x\n",
  81.            newTodPtr->bitmap.colormap, newTodPtr->bitmap.parent);
  82. #endif
  83.     bmpInfo.cbFix = 16L;
  84.     bmpInfo.cx = width;
  85.     bmpInfo.cy = height;
  86.     bmpInfo.cPlanes = 1;
  87.     bmpInfo.cBitCount = depth;
  88.     newTodPtr->bitmap.dc = DevOpenDC(hab, OD_MEMORY, (PSZ)"*", 5L,
  89.                                      (PDEVOPENDATA)&dop, NULLHANDLE);
  90.     if (newTodPtr->bitmap.dc == DEV_ERROR) {
  91. #ifdef DEBUG
  92.         printf("DevOpenDC failed in XCreatePixmap\n");
  93. #endif
  94.         ckfree((char *) newTodPtr);
  95.         return (Pixmap)None;
  96.     }
  97. #ifdef DEBUG
  98.     printf("DevOpenDC in XCreatePixmap returns %x\n", newTodPtr->bitmap.dc);
  99. #endif
  100.     newTodPtr->bitmap.hps = GpiCreatePS(hab, newTodPtr->bitmap.dc, &sizl,
  101.                                         PU_PELS | GPIT_MICRO | GPIA_ASSOC);
  102.     if (newTodPtr->bitmap.hps == GPI_ERROR) {
  103.         DevCloseDC(newTodPtr->bitmap.dc);
  104. #ifdef DEBUG
  105.         printf("GpiCreatePS failed in XCreatePixmap\n");
  106. #endif
  107.         ckfree((char *) newTodPtr);
  108.         return (Pixmap)None;
  109.     }
  110. #ifdef DEBUG
  111.     printf("GpiCreatePS in XCreatePixmap returns %x\n", newTodPtr->bitmap.hps);
  112. #endif
  113.     newTodPtr->bitmap.handle = GpiCreateBitmap(newTodPtr->bitmap.hps,
  114.                                                &bmpInfo, 0L, NULL, NULL);
  115.  
  116.     if (newTodPtr->bitmap.handle == NULLHANDLE) {
  117. #ifdef DEBUG
  118.         printf("GpiCreateBitmap ERROR %x in XCreatePixmap\n",
  119.                WinGetLastError(hab));
  120. #endif
  121.     ckfree((char *) newTodPtr);
  122.     return (Pixmap)None;
  123.     }
  124. #ifdef DEBUG
  125.     printf("GpiCreateBitmap in XCreatePixmap returns %x\n",
  126.            newTodPtr->bitmap.handle);
  127. #endif
  128.     sizl.cx = width;
  129.     sizl.cy = height;
  130.     rc = GpiSetBitmapDimension(newTodPtr->bitmap.handle, &sizl);
  131. #ifdef DEBUG
  132.     if (rc == FALSE) {
  133.         printf("    GpiSetBitmapDimension ERROR %x\n", WinGetLastError(hab));
  134.     } else {
  135.         printf("    GpiSetBitmapDimension: %dx%d\n", sizl.cx, sizl.cy);
  136.     }
  137.     rc = GpiQueryBitmapDimension(newTodPtr->bitmap.handle, &sizl);
  138.     if (rc == FALSE) {
  139.         printf("    GpiQueryBitmapDimension ERROR %x\n", WinGetLastError(hab));
  140.     } else {
  141.         printf("    GpiQueryBitmapDimension: %dx%d\n", sizl.cx, sizl.cy);
  142.     }
  143. #endif
  144.     rc = GpiSetBitmap(newTodPtr->bitmap.hps, newTodPtr->bitmap.handle);
  145.     if (rc == HBM_ERROR) {
  146. #ifdef DEBUG
  147.         printf("GpiSetBitmap returned HBM_ERROR %x\n", WinGetLastError(hab));
  148. #endif
  149.         GpiDestroyPS(newTodPtr->bitmap.hps);
  150.         DevCloseDC(newTodPtr->bitmap.dc);
  151.         ckfree((char *) newTodPtr);
  152.         return (Pixmap)None;
  153.     }
  154. #ifdef DEBUG
  155.     else printf("GpiSetBitmap %x into hps %x returns %x\n",
  156.                 newTodPtr->bitmap.handle, newTodPtr->bitmap.hps, rc);
  157. #endif
  158.  
  159.     return (Pixmap)newTodPtr;
  160. }
  161.  
  162. /*
  163.  *----------------------------------------------------------------------
  164.  *
  165.  * XFreePixmap --
  166.  *
  167.  *    Release the resources associated with a pixmap.
  168.  *
  169.  * Results:
  170.  *    None.
  171.  *
  172.  * Side effects:
  173.  *    Deletes the bitmap created by XCreatePixmap.
  174.  *
  175.  *----------------------------------------------------------------------
  176.  */
  177.  
  178. void
  179. XFreePixmap(display, pixmap)
  180.     Display* display;
  181.     Pixmap pixmap;
  182. {
  183.     TkOS2Drawable *todPtr = (TkOS2Drawable *) pixmap;
  184.     HBITMAP hbm;
  185.  
  186. #ifdef DEBUG
  187.     printf("XFreePixmap %x\n", todPtr);
  188. #endif
  189.  
  190.     display->request++;
  191.     if (todPtr != NULL) {
  192.         hbm = GpiSetBitmap(todPtr->bitmap.hps, NULLHANDLE);
  193. #ifdef DEBUG
  194.         printf("    GpiSetBitmap hps %x returned %x\n", todPtr->bitmap.hps,
  195.                hbm);
  196. #endif
  197.     GpiDeleteBitmap(todPtr->bitmap.handle);
  198.         GpiDestroyPS(todPtr->bitmap.hps);
  199.         DevCloseDC(todPtr->bitmap.dc);
  200.     ckfree((char *)todPtr);
  201.     }
  202. }
  203.  
  204. /*
  205.  *----------------------------------------------------------------------
  206.  *
  207.  * TkSetPixmapColormap --
  208.  *
  209.  *      The following function is a hack used by the photo widget to
  210.  *      explicitly set the colormap slot of a Pixmap.
  211.  *
  212.  * Results:
  213.  *      None.
  214.  *
  215.  * Side effects:
  216.  *      None.
  217.  *
  218.  *----------------------------------------------------------------------
  219.  */
  220.  
  221. void
  222. TkSetPixmapColormap(pixmap, colormap)
  223.     Pixmap pixmap;
  224.     Colormap colormap;
  225. {
  226.     TkOS2Drawable *todPtr = (TkOS2Drawable *)pixmap;
  227.  
  228. #ifdef DEBUG
  229.     printf("TkSetPixmapColormap, bitmap %x, colormap %x\n",
  230.            TkOS2GetHBITMAP(todPtr), colormap);
  231. #endif
  232.     todPtr->bitmap.colormap = colormap;
  233.     /*
  234.     rc = (HPAL) TkOS2SelectPalette(todPtr->bitmap.hps, todPtr->bitmap.parent,
  235.                                    colormap);
  236.     */
  237. }
  238.