📄 xpix.shar
字号:
XX/*ARGSUSED*/Xvoid TimeOutCallback(data)X caddr_t data;X{X /* If there's another grid available draw it */XX if (GetNextGrid(grid))X DrawGrid(grid);X X /* Always restore the call back */XX timer = XtAddTimeOut(interval, TimeOutCallback, NULL);XX} XX/*ARGSUSED*/Xvoid StartStop(widget, data, event)X Widget widget;X caddr_t data;X XEvent *event;X{X /* Toggle propagation of display */XX if (working) {X XtRemoveTimeOut(timer);X working = False;X XtSetArg(arg[0], XtNlabel, "Start"); /* Reset button label */X XtSetValues(start_button,arg,1);X XFlush(display);X }X else {X XtSetArg(arg[0], XtNlabel, "Stop"); /* Reset button label */X XtSetValues(start_button,arg,1);X timer = XtAddTimeOut(interval, TimeOutCallback, NULL);X working = True;X XFlush(display);X }X} XXvoid HSVtoRGB(h, s, v, r, g, b)X double h, s, v, *r, *g, *b;X/*X hue (0-360), s&v (0-1), r&g&b (0-1)X*/X{X int ih;X double rh, x, y, z;XX /* Zero saturation means gray */XX if (s < 0.0001) {X *r = v; *g = v; *b = v;X return;X }XX /* Put hue in [0,6) */XX if (h > 359.999)X h = 0.0;X elseX h = h/60.0;XX ih = h; rh = h - ih; /* Integer and fractional parts */XX x = v*(1.0 - s);X y = v*(1.0-s*rh);X z = v*(1.0-s*(1.0-rh));XX switch (ih) {X case 0:X *r = v; *g = z; *b = x; break;X case 1:X *r = y; *g = v; *b = x; break;X case 2:X *r = x; *g = v; *b = z; break;X case 3:X *r = x; *g = y; *b = v; break;X case 4:X *r = z; *g = x; *b = v; break;X case 5:X *r = v; *g = x; *b = y; break;X default:X Error("HLStoRGB: invalid hue", ih);X }X}XXvoid Setcmap()X/*X Make the color map ... scheme base on linear interpolation of hsv.X*/X{X int i;X XColor color;X Colormap colormap;X double scale = 1.0 / ((double) (MAX_COL-1));X double hue, saturation, value, red, green, blue;XX colormap = DefaultColormap(display, screen);XX for (i=0; i<MAX_COL; i++) {XX saturation = scale * i;X hue = 360.0 * saturation;X value = 1.0;XX HSVtoRGB(hue, saturation, value, &red, &green, &blue);XX color.red = (short) (red * 65535.0);X color.green = (short) (green * 65535.0);X color.blue = (short) (blue * 65535.0);XX if (XAllocColor(display, colormap, &color) == 0)X Error("couldn't assign color",i);XX cmap[i] = color.pixel;X/*X (void) printf("Colour %d red=%x, green=%x, blue=%x, pixel=%x\n",X i, color.red, color.green, color.blue, color.pixel);X*/X }XX /* Unused */X /* Get rgb color from ascii name */X /* if (XParseColor(display, colormap, colors[i], &color) == 0)X Error("Setcmap: error parsing color number ",i); */XX}XXint main(argc, argv)X unsigned int argc;X char **argv;X{X int n;X Dimension frame_size;XX /* First input is the MAXIMUM grid size ... can't do anythingX without this */XX if (fread(&max_grid_size, sizeof(int), 1, stdin) != 1)X Error("Failed to get max_grid_size", -1);XX max_grid_size = ntohl(max_grid_size); /* Convert to machine format */XX frame_size = MAX(max_grid_size, 256);XX /* Create top level shell widget */X X top_level_widget = XtInitialize("toplevel", "TopLevel",X NULL, 0, &argc, argv);XX /* Create form widget to hold everything else */XX n = 0;X box_widget = XtCreateManagedWidget("box", formWidgetClass, X top_level_widget, arg, n);XX /* Create the label to hold the title */XX (void) strcpy(title, "2-D Grid Display");X n = 0;X XtSetArg(arg[n], XtNx, 10); n++;X XtSetArg(arg[n], XtNy, 10); n++;X XtSetArg(arg[n], XtNwidth, frame_size); n++;X XtSetArg(arg[n], XtNlabel, title); n++;X XtSetArg(arg[n], XtNborderWidth, (Dimension) 0); n++;X title_widget = XtCreateManagedWidget("title", labelWidgetClass,X box_widget, arg, n);XX /* Create the label to hold the grid data */XX (void) strcpy(grid_data, " ");X n = 0;X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, title_widget); n++;X XtSetArg(arg[n], XtNjustify, XtJustifyLeft); n++;X XtSetArg(arg[n], XtNwidth, frame_size); n++;X XtSetArg(arg[n], XtNlabel, " "); n++;X grid_data_widget = XtCreateManagedWidget("grid data", labelWidgetClass,X box_widget, arg, n);XX /* Create the file menu button and the menu ... also a bitX further down make and add the check mark */XX n = 0;X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, grid_data_widget); n++;X XtSetArg(arg[n], XtNlabel, "File"); n++;X XtSetArg(arg[n], XtNmenuName, "file menu"); n++;X XtSetArg(arg[n], XtNshapeStyle, XmuShapeOval); n++;X file_menu_button = XtCreateManagedWidget("file", menuButtonWidgetClass,X box_widget, arg, n);X file_menu = XtCreatePopupShell("file menu", simpleMenuWidgetClass,X file_menu_button, NULL, 0);XX for (n=0; n<n_file_menu_entries; n++) {X String item = file_menu_entries[n];X file_menu_widgets[n] = XtCreateManagedWidget(item, smeBSBObjectClass, X file_menu, NULL, 0);X XtAddCallback(file_menu_widgets[n], XtNcallback,X FileMenuCallback, (caddr_t) n);X }XX /* Create the Start/Stop command button */XX n = 0;X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, grid_data_widget); n++;X XtSetArg(arg[n], XtNhorizDistance, 10); n++;X XtSetArg(arg[n], XtNfromHoriz, file_menu_button); n++;X XtSetArg(arg[n], XtNlabel, "Start"); n++;X XtSetArg(arg[n], XtNshapeStyle, XmuShapeOval); n++;X start_button = XtCreateManagedWidget("start/stop", commandWidgetClass,X box_widget, arg, n);X XtAddCallback(start_button, XtNcallback, StartStop, NULL);XX /* Create the scroll bar for the interval */XX n = 0;X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, grid_data_widget); n++;X XtSetArg(arg[n], XtNhorizDistance, 10); n++;X XtSetArg(arg[n], XtNfromHoriz, start_button); n++;X XtSetArg(arg[n], XtNorientation, XtorientHorizontal); n++;X XtSetArg(arg[n], XtNlength, 100); n++;X XtSetArg(arg[n], XtNthickness, 15); n++;X scroll_widget = XtCreateManagedWidget("scroll", scrollbarWidgetClass,X box_widget, arg, n);X XtAddCallback(scroll_widget, XtNscrollProc, ScrollProc, NULL);X XtAddCallback(scroll_widget, XtNjumpProc, JumpProc, NULL);XX /* Create the label widget which displays the interval valueX associated with the scrollbar. */XX n = 0;X (void) sprintf(interval_string, "%4d ms", interval);X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, grid_data_widget); n++;X XtSetArg(arg[n], XtNhorizDistance, 10); n++;X XtSetArg(arg[n], XtNfromHoriz, scroll_widget); n++;X XtSetArg(arg[n], XtNjustify, XtJustifyRight); n++;X XtSetArg(arg[n], XtNlabel, interval_string); n++;X XtSetArg(arg[n], XtNborderWidth, (Dimension) 0); n++;X interval_widget = XtCreateManagedWidget("interval", labelWidgetClass,X box_widget, arg, n);X X /* Now add the actual canvas ... PICT_SIZE square pixels*/XX n=0;X XtSetArg(arg[n],XtNheight, PICT_SIZE); n++;X XtSetArg(arg[n],XtNwidth, PICT_SIZE); n++;X XtSetArg(arg[n], XtNvertDistance, 10); n++;X XtSetArg(arg[n], XtNfromVert, file_menu_button); n++;X canvas_widget = XtCreateManagedWidget("canvas", compositeWidgetClass,X box_widget, arg, n);XX /* Add callback for exposure */XX XtAddEventHandler(canvas_widget,ExposureMask,False,Exposed,NULL);XX /* Realize everything */XX XtRealizeWidget(top_level_widget);XX /* Set up the drawing environment */XX display = XtDisplay(canvas_widget);X window = XtWindow(canvas_widget); X screen = DefaultScreen(display);X visual = DefaultVisual(display, screen);X depth = DisplayPlanes(display, screen);X (void) printf("depth = %d\n",depth);X gc = XCreateGC(display, window, 0, (XGCValues *) NULL); X X Setcmap();XX /* Make the pixmap for the check mark for a selected menu itemX and mark the cycle item as selected */XX check_mark = XCreateBitmapFromData(display, window, X check_bits, check_width, check_height);X n=0;X XtSetArg(arg[n], XtNrightBitmap, check_mark); n++;X XtSetValues(file_menu_widgets[1], arg, n);XX /* Make image to match the size of our canvas .. PICT_SIZExPICT_SIZE */XX pict = (u_char *) malloc(PICT_SIZE*PICT_SIZE);X image = XCreateImage(display, visual, depth, ZPixmap, 0,X pict, PICT_SIZE, PICT_SIZE, 8, 0);XX /* Make the byte array which will hold the frames */XX grid = (u_char *) malloc(max_grid_size*max_grid_size);XX /* Enter the event loop */XX XtMainLoop();XX return 0; /* Never actually does this */X}//E*O*F xpix.c//exit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -