summaryrefslogtreecommitdiff
path: root/src/Xaw3dP.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xaw3dP.c')
-rw-r--r--src/Xaw3dP.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/Xaw3dP.c b/src/Xaw3dP.c
new file mode 100644
index 0000000..b3b26f7
--- /dev/null
+++ b/src/Xaw3dP.c
@@ -0,0 +1,212 @@
+/*
+ * Xaw3dP.c
+ *
+ * Global functions that don't really belong anywhere else.
+ */
+
+/*********************************************************************
+Copyright (C) 1992 Kaleb Keithley
+Copyright (C) 2000, 2003 David J. Hawkey Jr.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of the copyright holders
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*********************************************************************/
+
+#include "Xaw3dP.h"
+#ifdef XAW_MULTIPLANE_PIXMAPS
+#include <stdio.h>
+#include <X11/xpm.h>
+#endif
+
+#ifdef XAW_GRAY_BLKWHT_STIPPLES
+/* ARGSUSED */
+unsigned long
+grayPixel(p, dpy, scn)
+unsigned long p; /* unused */
+Display *dpy;
+Screen *scn;
+{
+ static XColor Gray =
+ {
+ 0, /* pixel */
+ 0, 0, 0, /* red, green, blue */
+ 0, /* flags */
+ 0 /* pad */
+ };
+
+ if (!Gray.pixel)
+ {
+ XColor exact;
+
+ (void)XAllocNamedColor(dpy, DefaultColormapOfScreen(scn),
+ "gray", &Gray, &exact); /* Blindflug */
+ }
+
+ return Gray.pixel;
+}
+#endif
+
+#ifdef XAW_MULTIPLANE_PIXMAPS
+#define IS_EVEN(x) (((x) % 2) == 0)
+#define IS_ODD(x) (((x) % 2) == 1)
+
+/* ARGSUSED */
+Pixmap
+stipplePixmap(w, pm, cm, bg, d)
+Widget w;
+Pixmap pm;
+Colormap cm;
+Pixel bg;
+unsigned int d;
+{
+ static Pixmap pixmap;
+ Display *dpy;
+ XpmImage image;
+ XpmAttributes attr;
+ XpmColor *src_table, *dst_table;
+ int i, j, index = -1;
+
+ if (pm == None)
+ return (None);
+ if (XtIsRealized(w) == False)
+ return (None);
+
+ dpy = XtDisplayOfObject(w);
+
+ attr.colormap = cm;
+ attr.closeness = 32768; /* might help on 8-bpp displays? */
+ attr.valuemask = XpmColormap | XpmCloseness;
+
+ if (XpmCreateXpmImageFromPixmap(dpy, pm, None,
+ &image, &attr) != XpmSuccess)
+ return (None);
+ if (image.height == 0 || image.width == 0)
+ {
+ XpmFreeXpmImage(&image);
+ return (None);
+ }
+
+ if (d > 1)
+ {
+ XColor x_color;
+ XpmColor *dst_color;
+ char dst_rgb[14];
+
+ /*
+ * Multi-plane (XPM) pixmap. Don't bother scanning the color table
+ * for the background color, it might not be there. Copy the color
+ * table, add an entry for the background color, and set the index
+ * to that.
+ */
+
+ x_color.pixel = bg;
+ XQueryColor(dpy, cm, &x_color);
+ sprintf(dst_rgb, "#%04X%04X%04X",
+ x_color.red, x_color.green, x_color.blue);
+
+ dst_table = (XpmColor *) XtCalloc(sizeof(XpmColor),
+ image.ncolors + 1);
+ memcpy(dst_table, image.colorTable, image.ncolors * sizeof(XpmColor));
+
+ dst_color = &dst_table[image.ncolors];
+ switch (w->core.depth)
+ {
+ case 1:
+ dst_color->m_color = dst_rgb;
+ break;
+ case 4:
+ dst_color->g4_color = dst_rgb;
+ break;
+ case 6:
+ dst_color->g_color = dst_rgb;
+ break;
+ case 8:
+ default:
+ dst_color->c_color = dst_rgb;
+ break;
+ }
+ dst_color->string = "\x01"; /* ! */
+
+ src_table = image.colorTable;
+ image.colorTable = dst_table;
+
+ index = image.ncolors++;
+ }
+ else
+ {
+ XpmColor *src_color;
+ char *src_rgb;
+
+ /*
+ * Single-plane (XBM) pixmap. Set the index to the white color.
+ */
+
+ for (i = 0, src_color = image.colorTable; i < image.ncolors;
+ i++, src_color++)
+ {
+ switch (w->core.depth)
+ {
+ case 1:
+ src_rgb = src_color->m_color;
+ break;
+ case 4:
+ src_rgb = src_color->g4_color;
+ break;
+ case 6:
+ src_rgb = src_color->g_color;
+ break;
+ case 8:
+ default:
+ src_rgb = src_color->c_color;
+ break;
+ }
+ if (strcmp(src_rgb, "#000000000000") == 0)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ if (index == -1)
+ {
+ XpmFreeXpmImage(&image);
+ return (None);
+ }
+ }
+
+ for (i = 0; i < image.height; i++)
+ for (j = 0; j < image.width; j++)
+ if ((IS_ODD(i) && IS_EVEN(j)) || (IS_EVEN(i) && IS_ODD(j)))
+ image.data[(i * image.width) + j] = index;
+
+ attr.depth = d;
+ attr.valuemask |= XpmDepth;
+
+ i = XpmCreatePixmapFromXpmImage(dpy, pm, &image, &pixmap, NULL, &attr);
+
+ if (d > 1)
+ {
+ XtFree((void *)image.colorTable); /* dst_table */
+ image.colorTable = src_table;
+ image.ncolors--;
+ }
+ XpmFreeXpmImage(&image);
+
+ return ((i == XpmSuccess) ? pixmap : None);
+}
+#endif