home *** CD-ROM | disk | FTP | other *** search
/ PC Shareware 1999 March / PCShareware-3-99.iso / IMPLE / DJGPP.RAR / DJGPP2 / XLIB-SR0.ZIP / SRC / XLIBEMU / COPYPLAN.C < prev    next >
C/C++ Source or Header  |  1994-02-10  |  2KB  |  84 lines

  1. /* $Id: copyplan.c 1.3 1994/02/10 22:37:45 ulrich Exp $ */
  2. /*
  3.  * copyplane.c
  4.  *
  5.  * X library function XCopyPlane.
  6.  * Only Bitmap to Screen Pixmap is supported.
  7.  */
  8.  
  9. #include "Xlibemu.h"
  10.  
  11. int XCopyPlane(
  12.     Display*        display,
  13.     Drawable        src,
  14.     Drawable        dest,
  15.     GC            gc,
  16.     int            src_x,
  17.     int            src_y,
  18.     unsigned int    width,
  19.     unsigned int    height,
  20.     int            dest_x,
  21.     int            dest_y,
  22.     unsigned long    plane)
  23. {
  24.   FlushGC(display, gc);
  25.  
  26.   if (src->type == 0) {    /* Bitmap */
  27.     int x, y, pad;
  28.     Pixmap bitmap = (Pixmap) src, pixmap;
  29.     unsigned char *data, bits, mask;
  30.  
  31.     if ((plane & 1) == 0
  32.     || src_x >= bitmap->width
  33.     || src_y >= bitmap->height)
  34.       return 0;
  35.  
  36.     data = (unsigned char *) bitmap->data;
  37.     pad = (bitmap->width + 7) >> 3;
  38.     if (src_x + width > bitmap->width)
  39.       width = bitmap->width - src_x;
  40.     
  41.     if (src_y + height > bitmap->height)
  42.       height = bitmap->height - src_y;
  43.     
  44.     if (dest->type == 3) {
  45.       GrContext save;
  46.       GrSaveContext (&save);
  47.       GrSetContext (((Pixmap) dest)->context);
  48.       data += src_y * pad;
  49.       for (y = 0; y < height; y++) {
  50.     mask = 1 << (src_x % 8);
  51.     for (x = 0; x < width; x++) {
  52.       bits = data [(src_x + x) / 8];
  53.       GrPlot (dest_x + x, dest_y + y,
  54.           (mask & bits) ? gc->values.foreground : gc->values.background);
  55.       if (mask & 0x80)
  56.         mask = 1;
  57.       else
  58.         mask <<= 1;
  59.     }
  60.     data += pad;
  61.       }
  62.       GrSetContext (&save);
  63.       GrDestroyContext (&save);
  64.     }
  65.     if (dest->type == 2) {
  66.       pixmap = XCreatePixmap (display, dest, bitmap->width, bitmap->height,
  67.                 DefaultDepth(display, DefaultScreen (display)));
  68.       _WDrawContext ((Drawable) pixmap, gc);
  69.       for (y = 0; y < bitmap->height; y++) {
  70.     for (x = 0; x < bitmap->width; x++) {
  71.       bits = data [x / 8];
  72.       mask = 1 << (x % 8);
  73.       GrPlot (x, y, (mask & bits) ? gc->values.foreground : gc->values.background);
  74.     }
  75.     data += pad;
  76.       }
  77.       XCopyArea (display, pixmap, dest, gc, src_x, src_y, width, height, dest_x, dest_y);
  78.       XFreePixmap (display, pixmap);
  79.     }
  80.     return 1;
  81.   }
  82.   return 0;
  83. }
  84.