/* linetest.c -- To compile: gcc -o linetest -Wall linetest.c -L/usr/X11R6/lib -lX11 Useage: linetest [-w width] This draws solid lines in the given width then erases them with tiled lines. If the tiled lines do not match the solid lines you will get artifacts. The default width is zero which will result in hardware accelerated lines being used for the solid lines. Widths larger than zero will use XAA's wide line code when a "one rect" situation exists, that is, when the destination drawable consists of a single rectangle - unclipped or clipped in a simple way. If your driver accelerates trapezoids, XAA will use these for the wide lines. So if you get artifacts on zero width lines, your lines are wrong. Artifacts on wide lines means your trapezoids are wrong. Some artifacts will only appear when clipping. Remember that trapezoids are only used when the window is clipped to "one rect," while for zero width lines hardware lines are used no matter how complex the clipping. Artifacts only in particular octants usually indicate a simple biasing problem. For zero-width lines these can usually be fixed by changing the server's zero-width line bias. ps. click the mouse button in the window to quit. */ #include #include #include #include #include static Display* TheDisplay; static GC fgContext; static GC bgContext; static Visual* TheVisual; static Window TheWindow; static int TheScreenNumber; void DoSeg() { XEvent event; int x1 = 50,y1 = 50,x2 = 449,y2 = 449; XDrawLine(TheDisplay,TheWindow,fgContext,x1,y1,x2,y2); while(1) { XNextEvent(TheDisplay,&event); if(event.type == ButtonPress) break; else if(event.type == MotionNotify) { XDrawLine(TheDisplay,TheWindow,bgContext,x1,y1,x2,y2); x1 = event.xmotion.x; y1 = event.xmotion.y; x2 = 500 - x1; y2 = 500 - y1; } XDrawLine(TheDisplay,TheWindow,fgContext,x1,y1,x2,y2); } } #define GCMASK \ (GCForeground | GCLineWidth) int main(int argc, char* argv[]) { int i, width = 0; XGCValues values; unsigned long black, white; for(i = 1; i < argc; i++) { if(!strcmp(argv[i], "-w")) width = atoi(argv[++i]); } TheDisplay = XOpenDisplay("\0"); TheScreenNumber = DefaultScreen(TheDisplay); TheVisual = DefaultVisual(TheDisplay,TheScreenNumber); white = XWhitePixel(TheDisplay,TheScreenNumber); black = XBlackPixel(TheDisplay,TheScreenNumber); TheWindow = XCreateSimpleWindow(TheDisplay, DefaultRootWindow(TheDisplay), 0, 0, 500, 500, 0, 0, black); XMapWindow(TheDisplay,TheWindow); XSelectInput(TheDisplay,TheWindow,PointerMotionMask|ButtonPressMask); XClearWindow(TheDisplay,TheWindow); values.line_width = width; values.foreground = white; fgContext = XCreateGC(TheDisplay,TheWindow,GCMASK,&values); values.foreground = black; values.fill_style = FillTiled; bgContext = XCreateGC(TheDisplay,TheWindow,GCMASK | GCFillStyle,&values); DoSeg(); XCloseDisplay(TheDisplay); return 1; }