#include "openaxiom-c-macros.h"
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/cursorfont.h>
#define XDitherWidth 3
#define XDitherMax 10
char XDitherBits[] = {
0x00, 0x00, 0x00,
0x00, 0x02, 0x00,
0x00, 0x03, 0x00,
0x00, 0x03, 0x02,
0x00, 0x07, 0x02,
0x04, 0x07, 0x02,
0x04, 0x07, 0x03,
0x05, 0x07, 0x03,
0x05, 0x07, 0x07,
0x07, 0x07, 0x07 };
#include "XDither.h"
Pixmap XDither[XDitherMax];
unsigned int DITHERINIT = 0;
int
dither_char_bitmap(void)
{
int bits_line;
int total_chars;
for (bits_line = 8, total_chars = 1; bits_line < XDitherWidth; total_chars++)
bits_line += 8;
total_chars = total_chars * XDitherWidth;
return total_chars;
}
int
XInitDither(Display *display, int screen, GC gc, unsigned long fg,
unsigned long bg)
{
char *bits;
int count;
int chars_bitmap = dither_char_bitmap();
int bit;
XGCValues xgcv;
DITHERINIT = 1;
bits = (char *) malloc(chars_bitmap * sizeof(char));
for (count = 0; count < XDitherMax; count++) {
for (bit = 0; bit < chars_bitmap; bit++)
bits[bit] = XDitherBits[count * chars_bitmap + bit];
XDither[count] = XCreatePixmapFromBitmapData(display,
RootWindow(display, screen),
bits,
XDitherWidth, XDitherWidth,
BlackPixel(display, screen),
WhitePixel(display, screen),
1);
}
xgcv.background = bg;
xgcv.foreground = fg;
xgcv.fill_style = FillOpaqueStippled;
xgcv.stipple = XDither[4];
XChangeGC(display, gc,
GCForeground | GCBackground | GCFillStyle | GCStipple, &xgcv);
return (XDitherMax);
}
int
XChangeDither(Display *display, GC gc, int dither)
{
if (!DITHERINIT) {
fprintf(stderr, "XChange Error: Init Not Called\n");
exit(-1);
}
if (dither >= XDitherMax || dither < 0) {
fprintf(stderr, "Dither %d, out of range\n",dither);
return (-1);
}
XSetStipple(display, gc, XDither[dither]);
return (1);
}
void
XDitherRectangle(Display *display, Drawable drawable, GC gc, int x,
int y, unsigned int width, unsigned int height)
{
if (!DITHERINIT) {
fprintf(stderr, "XDither Error: Tried to fill before INIT called\n");
exit(-1);
}
XFillRectangle(display, drawable, gc, x, y, width, height);
}
void
XDitherRectangles(Display *display, Drawable drawable, GC gc,
XRectangle *rectangles, int nrectangles)
{
if (!DITHERINIT) {
fprintf(stderr, "XDither Error: Tried to fill before INIT called\n");
exit(-1);
}
XFillRectangles(display, drawable, gc,
rectangles, nrectangles);
}
void
XDitherPolygon(Display * display, Drawable drawable, GC gc,
XPoint *points, int npoints, int shape, int mode)
{
if (!DITHERINIT) {
fprintf(stderr, "XDither Error: Tried to fill before INIT called\n");
exit(-1);
}
XFillPolygon(display, drawable, gc,
points, npoints, shape, mode);
}
void
XDitherArc(Display *display, Drawable drawable, GC gc, int x,int y,
unsigned int width, unsigned int height, int angle1, int angle2)
{
if (!DITHERINIT) {
fprintf(stderr, "XDither Error: Tried to fill before INIT called\n");
exit(-1);
}
XFillArc(display, drawable, gc, x, y, width,
height, angle1, angle2);
}
void
XDitherArcs(Display *display,Drawable drawable, GC gc, XArc *arcs,int narcs)
{
if (!DITHERINIT) {
fprintf(stderr, "XDither Error: Tried to fill before INIT called\n");
exit(-1);
}
XFillArcs(display, drawable, gc, arcs, narcs);
}