bill@MS.WASHINGTON.EDU (Bill Dunlap) (10/01/89)
X Window System Bug Report
xbugs@expo.lcs.mit.edu
VERSION:
R3beta (as well as R2).
CLIENT MACHINE and OPERATING SYSTEM:
IBM PC/RT running AOS 4.3 (Dec 88 release) with the hc release 2.1n
C compiler from Metaware (which comes with AOS).
DISPLAY:
IBM APA16
WINDOW MANAGER:
any or none.
AREA:
server
SYNOPSIS:
Server dies with floating point exception or goes into infinite
loop when it tries to clip a vertical dashed line.
DESCRIPTION:
[no detailed description]
REPEAT BY:
Compile the following program (up to END-OF-PROGRAM) with
-lX11 and run with no arguments. If you give it one integer argument,
that will be taken as an index into dash_lists[]. The argument 0 gives
a solid line -- that gives no problems. The problems seems to depend
on the exact placement and border width of the window.
START-OF-PROGRAM
#include <X11/Xlib.h>
#include <stdio.h>
static char *dash_lists[] = {
"\004", /* solid cannot be represented with dash list */
"\002\004", /* dotted */
"\004\003\002\003", /* dash-dotted */
"\010\003", /* longdashed */
"\002\002\004\002\002\002\002\002", /* dot-dash-dot-dot */
"\002\002\010\002", /* dot-longdash */
"\002\002\002\002\002\005", /* dot-dot-dot-longspace */
"\004\004", /* shortdashed */
} ;
#define NLTYS (sizeof(dash_lists)/sizeof(dash_lists[0]))
int ilty ;
main(argc, argv)
int argc ;
char *argv[] ;
{
Display *dpy ;
Screen *scr ;
Window plot_window ;
Window obscuring_window ;
XSetWindowAttributes xswa ;
XEvent xev ;
GC gc ;
int i ;
if (!(dpy= XOpenDisplay((char *)NULL))) {
perror("Cannot open display");
exit(-1);
}
(void)XSynchronize(dpy, 1) ; /* synchronize for debugging */
scr = DefaultScreenOfDisplay(dpy) ;
xswa.event_mask = ExposureMask ;
xswa.background_pixel = BlackPixelOfScreen(scr);
xswa.border_pixel = WhitePixelOfScreen(scr);
xswa.override_redirect = True ; /* elude window manager */
plot_window = XCreateWindow(dpy, RootWindowOfScreen(scr),
400, 400, /* position */
100, 128, /* size */
2, /* border width */
DefaultDepthOfScreen(scr), InputOutput,
DefaultVisualOfScreen(scr),
CWEventMask | CWBackPixel | CWBorderPixel | CWOverrideRedirect,
&xswa) ;
xswa.event_mask = 0L ;
obscuring_window = XCreateWindow(dpy, RootWindowOfScreen(scr),
375, 432, /* position */
150, 32, /* size */
2, /* border width */
DefaultDepthOfScreen(scr), InputOutput,
DefaultVisualOfScreen(scr),
CWEventMask | CWBackPixel | CWBorderPixel | CWOverrideRedirect,
&xswa) ;
gc = XCreateGC(dpy, plot_window, 0L, (XGCValues *)0) ;
XSetForeground(dpy, gc, WhitePixelOfScreen(scr));
ilty = argc>1 ? atoi(argv[1]) : 1 ;
ilty = ilty % NLTYS ;
if (ilty != 0) {
XSetDashes(dpy, gc, 0, dash_lists[ilty], strlen(dash_lists[ilty])) ;
XSetLineAttributes(dpy, gc,
(unsigned int)0, /* width */
LineOnOffDash, CapButt, JoinMiter) ;
} else {
XSetLineAttributes(dpy, gc,
(unsigned int)0, /* width */
LineSolid, CapButt, JoinMiter) ;
}
(void)fprintf(stderr, "ilty = %d, dash pattern is", ilty) ;
for(i=0 ; i<strlen(dash_lists[ilty]) ; i++)
(void)fprintf(stderr, " %d", (int)*(dash_lists[ilty]+i)) ;
(void)fprintf(stderr, "\n") ;
XMapWindow(dpy, plot_window) ;
XMapWindow(dpy, obscuring_window) ;
while (1) {
XNextEvent(dpy, &xev) ;
switch (xev.type) {
case Expose :
XDrawLine(dpy, plot_window, gc, 50, 128, 50, 0) ;
break ;
default :
break ;
}
}
}
END-OF-PROGRAM
SAMPLE FIX:
Here is a patch to X.V11R3/server/ddx/ibm/apa16/apa16Line.c that
fixes the problem. This same file is called apa16line.c in 11.2.
_dome_4% diff -c apa16Line.c.orig apa16Line.c
*** apa16Line.c.orig Tue Oct 25 03:55:52 1988
--- apa16Line.c Fri Sep 29 15:28:53 1989
***************
*** 624,630 ****
--- 624,637 ----
{
if (pdash->newLine)
{
+ #define BILL_FIX
+ #ifndef BILL_FIX /* hc 2.1n is confused by the next line */
pt1Orig = pt1 = *pptInit++;
+ #else
+ pt1 = *pptInit;
+ pt1Orig = pt1 ;
+ pptInit++;
+ #endif
pt2 = *pptInit;
adx = pt2.x - pt1.x;
ady = pt2.y - pt1.y;
Bill Dunlap
Dept of Statistics, GN-22
University of Washington
Seattle, WA 98195
bill@stat.washington.edu