rwc@mitre.org (Ronald Conti) (02/21/91)
Sometime ago I posted that I was having some difficulties with
overlays. They still exist! :)
WHen the colors seem correct, I know that I'm not drawing in
to overlay plane. When the colors are wrong, it seems that I am.
(Commenting and uncommenting out the "XSetPlaneMask" commands).
WHAT AM I DOING WRONG!?!?!?!?!?!?!?!?!?!?!?!?!
here is the source code, if it is any help...
thank in advance,
ron conti (rwc@uci0.mitre.org)
---------------------------cut here--------------------------------------------
/**********************************************************************
file : overlay.c
purpose : Test for overlays in X11.
description:
This implements the overlay example of Vol.1 of the O'Reilly books
on X (pp. 192-194). The main is a modified form of basicwin in
the same book.
************************************************************************/
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <stdio.h>
#define SMALL 1
#define OK 0
#define MAX_COLORS 4
#define MAX_PLANES 1
#define CANNOT_OVERLAY 0
#define CAN_OVERLAY 1
unsigned long foreground, background_pixel;
unsigned long overlay_pixel_1, overlay_pixel_2;
int overlay_plane;
Display *display;
int state;
int screen;
Window win;
int plane_masks[MAX_PLANES];
Colormap cmap;
GC gc;
void main(argc, argv)
int argc;
char **argv;
{
extern Window win;
unsigned int width, height, x = 0, y = 0;
unsigned int border_width = 4; /* four pixels */
unsigned int display_width, display_height;
char *window_name = "overlay";
XSizeHints size_hints;
int count;
XEvent report;
extern GC gc;
XFontStruct *font_info;
char *display_name = NULL;
int window_size = 0; /* OK, or too SMALL to display contents */
/* connect to X server */
if ( (display=XOpenDisplay(display_name)) == NULL )
{
(void) fprintf( stderr, " cannot connect to X server %s\n",
XDisplayName(display_name));
exit( -1 );
}
/* get screen size from display structure macro */
screen = DefaultScreen(display);
display_width = DisplayWidth(display, screen);
display_height = DisplayHeight(display, screen);
/* size window with enough room for text */
width = display_width/3, height = display_height/4;
/* create opaque window */
win = XCreateSimpleWindow(display, RootWindow(display,screen),
x, y, width, height, border_width,
BlackPixel(display, screen),
WhitePixel(display,screen));
/* Set resize hints */
size_hints.flags = PPosition | PSize | PMinSize;
size_hints.x = x;
size_hints.y = y;
size_hints.width = width;
size_hints.height = height;
size_hints.min_width = 300;
size_hints.min_height = 200;
/* Select event types wanted */
XSelectInput(display, win, ExposureMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask | PointerMotionHintMask |
MotionNotify | StructureNotifyMask);
/* create region for exposure event processing */
if (get_colors() == CAN_OVERLAY) printf("can overlay !\n");
getGC(win, &gc);
XMapWindow(display, win);
/* get events, use first to display text and graphics */
while (1) {
XNextEvent(display, &report);
switch (report.type) {
case Expose:
place_graphics(win, gc, width, height);
break;
case ConfigureNotify:
width = report.xconfigure.width;
height = report.xconfigure.height;
break;
case MotionNotify:
break;
case ButtonPress:
x = report.xbutton.x;
y = report.xbutton.y;
break;
case KeyPress:
break;
default:
break;
} /* end switch */
} /* end while */
}
getGC(win, gc)
Window win;
GC *gc;
{
unsigned long valuemask = 0; /* ignore XGCvalues and use defaults */
XGCValues values;
unsigned int line_width = 6;
int line_style = LineSolid;
int cap_style = CapRound;
int join_style = JoinRound;
/* Create default Graphics Context */
*gc = XCreateGC(display, win, valuemask, &values);
/* specify black foreground since default may be white on white */
XSetForeground(display, *gc, foreground);
/* set line attributes */
XSetLineAttributes(display, *gc, line_width, line_style,
cap_style, join_style);
}
void place_graphics(win, gc, window_width, window_height)
Window win;
GC gc;
unsigned int window_width, window_height;
{
int x, y;
int width, height;
char *some_color = "Red";
XColor *pix_def, *pix_exact;
height = window_height/2;
width = 3 * window_width/4;
x = window_width/2 - width/2; /* center */
y = window_height/2 - height/2;
/* XSetFunction(display, gc, GXxor);*/
XSetForeground(display, gc, foreground);
XSetBackground(display, gc, background_pixel);
XDrawLine(display, win, gc, 0, 0, 300, 200);
/* XSetPlaneMask(display, gc, overlay_plane);*/
XSetForeground(display, gc, overlay_pixel_1);
XSetBackground(display, gc, overlay_pixel_2);
XDrawRectangle(display, win, gc, x, y, width, height);
XDrawArc(display, win, gc, x, y, width, height, 0, 23040);
XSetForeground(display, gc, foreground);
XSetBackground(display, gc, background_pixel);
XDrawLine(display, win, gc, 300, 0, 300, 200);
}
int
get_colors()
{
int depth;
static char *name[] = {"Red", "Yellow", "Green", "Green"};
XColor exact_defs[MAX_COLORS];
extern Colormap cmap;
int ncolors = 4;
extern int plane_masks[MAX_PLANES];
int colors[MAX_COLORS];
int i;
Visual *visual;
depth = DisplayPlanes(display, screen);
visual = DefaultVisual(display, screen);
cmap = DefaultColormap(display, screen);
/* cmap = XCreateColormap(display, win, visual, AllocNone);*/
if (depth == 1) { /* one-plane monochrome */
/* use BlackPixel and WhitePixel only */
background_pixel = WhitePixel(display, screen);
foreground = BlackPixel(display, screen);
printf("unsing black and white\n");
return (CANNOT_OVERLAY);
}
else {
/* allocate color cells */
if (XAllocColorCells (display, cmap, False, plane_masks, 1,
colors, 4) == 0) {
/* Can't get enough read/write cells to overlay.
* Trying at least to get three colors. */
if (XAllocColorCells (display, cmap, False, plane_masks,
0, colors, 3) == 0) {
/* Can't even get that. Give up and use black and white */
background_pixel = WhitePixel(display, screen);
foreground = BlackPixel(display, screen);
printf("unsing black and white\n");
}
ncolors = 3;
printf("got only three colors\n");
}
ncolors = 4;
/* Allocated colors succesfully. Now setting their colors:
3, and 4 are set to the same RGB value */
for (i = 0; i < ncolors; i++)
{
if (!XParseColor (display, cmap, name[i], &exact_defs[i]))
{
fprintf(stderr, "overlay: color name %s not in database \n",
name[i]);
exit(0);
}
exact_defs[i].flags = DoRed | DoGreen | DoBlue;
}
printf("got RGB values\n");
/* Set pixel value in struct to allocated ones */
exact_defs[0].pixel = colors[0];
exact_defs[1].pixel = colors[1];
exact_defs[2].pixel = colors[0] | plane_masks[0];
exact_defs[3].pixel = colors[1] | plane_masks[0];
printf("set RGB values\n");
/* this sets the color of the read/write cell */
XStoreColors (display, cmap, exact_defs, ncolors);
printf ("stored colors\n");
background_pixel = exact_defs[0].pixel;
foreground = exact_defs[1].pixel;
if (ncolors == 4) {
overlay_pixel_1 = exact_defs[2].pixel;
overlay_pixel_2 = exact_defs[3].pixel;
overlay_plane = plane_masks[0];
XFlush(display);
return(CAN_OVERLAY);
}
else {
overlay_pixel_1 = colors[2];
return(CANNOT_OVERLAY);
}
}
}