Path: utzoo!utgpu!water!watmath!clyde!att!osu-cis!tut.cis.ohio-state.edu!mailrus!cornell!uw-beaver!mit-eddie!mit-amt!hkbirke
From: hkbirke@mit-amt (Hal Birkeland)
Newsgroups: comp.windows.x
Subject: Re: missing entry point in X libs?
Message-ID: <3067@mit-amt>
Date: 23 Sep 88 02:10:45 GMT
References: <21240@cornell.UUCP>
Reply-To: hkbirke@media-lab.media.mit.edu (Hal Birkeland)
Distribution: comp
Organization: MIT Media Lab, Cambridge MA
Lines: 86

In article <21240@cornell.UUCP> murthy@cs.cornell.edu (Chet Murthy) writes:
>There's an undefined reference for a function
>XCreatePixmapFromBitmapData in libXaw
>which I can't seem to find the code for.
>(i.e. the reference is _in_ libXaw, and
>there is no file which seems to contain such
>a function.  Does anybody know what's wrong?
>
>	--chet--
>	murthy@svax.cs.cornell.edu

yep. you are exactly right... this function is NOT implemented -- so
much for QC from X Consortium. It belongs in libX.a (the C library).

It is VERY easy to write, however. Basically you combine another
XCreate..  call that is extrmely similar function
(XCreateBitmapFromData) with about three lines of generated code.

Here it is... care of Daniel I. Applebaum, who actually wrote it. This has
been tested on IBM RTPCs, and MVII with Parallax. Not guaranteed to work
on anything though...

-- hal
hkbirke@media-lab.media.mit.edu
...!mit-amt!hkbirke

Now, if only:
	-- X11R3 exists, since someone optimized the "mi" code.
	-- HP Gator support will appear, since the PD server doesnt support it.



-----cut here ---
#include

/*
 * XCreateBitmapFromData: Routine to make a pixmap of depth 1 from user supplied data.
 *             D is any drawable on the same screen that the pixmap will be used in.
 *             Data is a pointer to the bit data, and 
 *             width & height give the size in bits of the pixmap.
 *
 * The following format is assumed for data:
 *
 *    format=XYPixmap
 *    bit_order=LSBFirst
 *    byte_order=LSBFirst
 *    padding=8
 *    bitmap_unit=8
 *    xoffset=0
 *    no extra bytes per line
 */  
Pixmap XCreatePixmapFromBitmapData(display, d, data, width, height, fg, bg, depth)
     Display *display;
     Drawable d;
     char *data;
     unsigned int width, height;
     unsigned long fg, bg;
     unsigned int depth;
{
    XImage ximage;
    GC gc;
    XGCValues gcv;
    Pixmap pix;

    pix = XCreatePixmap(display, d, width, height, depth);
    if (!pix)
      return(0);
    gcv.foreground = fg;
    gcv.background = bg;
    gc = XCreateGC(display, pix, GCForeground|GCBackground, &gcv);
    ximage.height = height;
    ximage.width = width;
    ximage.depth = 1;
    ximage.xoffset = 0;
    ximage.format = XYBitmap;
    ximage.data = data;
    ximage.byte_order = LSBFirst;
    ximage.bitmap_unit = 8;
    ximage.bitmap_bit_order = LSBFirst;
    ximage.bitmap_pad = 8;
    ximage.bytes_per_line = (width+7)/8;

    XPutImage(display, pix, gc, &ximage, 0, 0, 0, 0, width, height);
    XFreeGC(display, gc);
    return(pix);
}