#include #include #include #include #include #include #include #define WinWidth 600 #define WinHeight 400 #define PointSize 2 #define NPoints 50 XtAppContext app_con; Widget app_sh, draw; Boolean Running = False; String fallback_resources[] = { "*FontList: *-helvetica-bold-r-*-140-75-*", "*background: grey90", "*.main.commandWindowLocation: XmCOMMAND_BELOW_WORKSPACE", "*.field.background: black", "*.field.foreground: white", "*.command.marginWidth: 0", "*.command.marginHeight: 0", "*.command.spacing: 0", "*.nvalue.titleString: N", "*.nvalue.minimum: 1", "*.nvalue.maximum: 500", "*.ivalue.titleString: initial value", "*.ivalue.maximum: 1000", "*.ivalue.decimalPoints: 3", "*.mvalue.titleString: minimum alpha", "*.mvalue.minimum: 1000", "*.mvalue.maximum: 3990", "*.mvalue.decimalPoints: 3", "*.White.background: white","*.Yellow.background: yellow", "*.Cyan.background: cyan","*.Magenta.background: magenta", "*.Green.background: green","*.Red.background: red", NULL }; Display *dpy = NULL; GC gc; Window win; Pixmap pmap; Pixel fg, bg; int N = 300; double A0 = 0.2; double AlphaMin = 2.5; void setup_draw_info() { dpy = XtDisplay(app_sh); gc = DefaultGC(dpy,0); win = XtWindow(draw); pmap = XCreatePixmap(dpy,win,WinWidth,WinHeight,DefaultDepth(dpy,0)); XtVaGetValues(draw,XmNforeground,&fg,XmNbackground,&bg,NULL); XSetForeground(dpy,gc,bg); XFillRectangle(dpy,pmap,gc,0,0,WinWidth,WinHeight); XSetForeground(dpy,gc,fg); } void draw_one(n) int n; { int x, y, xx, i; double alpha, a; for (x = 0; x < WinWidth; x ++) { alpha = x * (4.-AlphaMin) / WinWidth + AlphaMin; for (a = A0, i = 0; i < N-1; i ++) a = (1. - a) * a * alpha; for (i = 0; i < n; i ++) { a = (1. - a) * a * alpha; y = WinHeight-1 - (int)(a * WinHeight) - PointSize/2; xx = x - PointSize/2; XFillRectangle(dpy,win,gc,xx,y,PointSize,PointSize); XFillRectangle(dpy,pmap,gc,xx,y,PointSize,PointSize); } } } void RedisplayCB(w,cl,cd) Widget w; XtPointer cl,cd; { XmDrawingAreaCallbackStruct *d = (XmDrawingAreaCallbackStruct *)cd; XExposeEvent *e = &(d->event->xexpose); XCopyArea(dpy,pmap,win,gc,e->x,e->y,e->width,e->height,e->x,e->y); } void QuitCB(w,cl,cd) Widget w; XtPointer cl,cd; { exit(0);} void ClearCB(w,cl,cd) Widget w; XtPointer cl,cd; { XClearWindow(dpy,win); XSetForeground(dpy,gc,bg); XFillRectangle(dpy,pmap,gc,0,0,WinWidth,WinHeight); XSetForeground(dpy,gc,fg); } void RedrawCB(w,cl,cd) Widget w; XtPointer cl,cd; { draw_one(1); } void DrawManyCB(w,cl,cd) Widget w; XtPointer cl,cd; { draw_one(NPoints); } void ColorCB(w,cl,cd) Widget w; XtPointer cl,cd; { XtVaGetValues(w,XmNbackground,&fg,NULL); XSetForeground(dpy,gc,fg); } void ValueCB(w,cl,cd) Widget w; XtPointer cl,cd; { XmScaleCallbackStruct *cs = (XmScaleCallbackStruct *)cd; *((double *)cl) = cs->value * 0.001; draw_one(1); } void NValueCB(w,cl,cd) Widget w; XtPointer cl,cd; { XmScaleCallbackStruct *cs = (XmScaleCallbackStruct *)cd; N = cs->value; draw_one(1); } main(argc,argv) int argc; char *argv[]; { Widget main_win, menu_bar, menu, button, command, scale; Arg args[8]; int n; char **p; static char *cols[] = {"White","Yellow","Cyan","Magenta", "Green","Red",NULL}; app_sh = XtAppInitialize(&app_con,"Branch",NULL,0, &argc,argv,fallback_resources,NULL,0); XtSetArg(args[0],XmNshowSeparator,True); XtManageChild(main_win=XmCreateMainWindow(app_sh,"main",args,1)); XtManageChild(menu_bar=XmCreateMenuBar(main_win,"bar",NULL,0)); XtManageChild(button=XmCreateCascadeButton(menu_bar,"Quit",NULL,0)); XtAddCallback(button,XmNactivateCallback,QuitCB,NULL); XtManageChild(button=XmCreateCascadeButton(menu_bar,"Clear",NULL,0)); XtAddCallback(button,XmNactivateCallback,ClearCB,NULL); XtManageChild(button=XmCreateCascadeButton(menu_bar,"Draw",NULL,0)); XtAddCallback(button,XmNactivateCallback,RedrawCB,NULL); XtManageChild(button=XmCreateCascadeButton(menu_bar,"Draw many",NULL,0)); XtAddCallback(button,XmNactivateCallback,DrawManyCB,NULL); menu = XmCreatePulldownMenu(menu_bar,"ColorMenu",NULL,0); for (p = cols; *p; p ++) { XtManageChild(button=XmCreatePushButton(menu,*p,NULL,0)); XtAddCallback(button,XmNactivateCallback,ColorCB,NULL); } XtSetArg(args[0],XmNsubMenuId,menu); XtManageChild(XmCreateCascadeButton(menu_bar,"Color",args,1)); XtSetArg(args[0],XmNorientation,XmVERTICAL); XtManageChild(command=XmCreateRowColumn(main_win,"command",args,1)); XtSetArg(args[0],XmNorientation,XmHORIZONTAL); XtSetArg(args[1],XmNshowValue,True); XtSetArg(args[2],XmNvalue,N); XtManageChild(scale=XmCreateScale(command,"nvalue",args,3)); XtAddCallback(scale,XmNvalueChangedCallback,NValueCB,NULL); XtSetArg(args[2],XmNvalue,(int)(A0*1000)); XtManageChild(scale=XmCreateScale(command,"ivalue",args,3)); XtAddCallback(scale,XmNvalueChangedCallback, ValueCB,(XtPointer)(&A0)); XtSetArg(args[2],XmNvalue,(int)(AlphaMin*1000)); XtManageChild(scale=XmCreateScale(command,"mvalue",args,3)); XtAddCallback(scale,XmNvalueChangedCallback, ValueCB,(XtPointer)(&AlphaMin)); XtSetArg(args[0],XmNwidth,WinWidth); XtSetArg(args[1],XmNheight,WinHeight); XtManageChild(draw=XmCreateDrawingArea(main_win,"field",args,2)); XtVaSetValues(main_win,XmNcommandWindow,command, XmNworkWindow,draw,NULL); XtRealizeWidget(app_sh); setup_draw_info(draw); XtAddCallback(draw,XmNexposeCallback,RedisplayCB,NULL); XtAppMainLoop(app_con); }