📄 graphics.c
字号:
xright += xdiff / 3.; ytop -= ydiff / 3.; ybot += ydiff / 3.; update_transform(); drawscreen();}static voidzoom_fit(void (*drawscreen) (void)){/* Sets the view back to the initial view set by init_world (i.e. a full * * view) of all the graphics. */ xleft = saved_xleft; xright = saved_xright; ytop = saved_ytop; ybot = saved_ybot; update_transform(); drawscreen();}static voidtranslate_up(void (*drawscreen) (void)){/* Moves view 1/2 screen up. */ float ystep; ystep = (ybot - ytop) / 2.; ytop -= ystep; ybot -= ystep; update_transform(); drawscreen();}static voidtranslate_down(void (*drawscreen) (void)){/* Moves view 1/2 screen down. */ float ystep; ystep = (ybot - ytop) / 2.; ytop += ystep; ybot += ystep; update_transform(); drawscreen();}static voidtranslate_left(void (*drawscreen) (void)){/* Moves view 1/2 screen left. */ float xstep; xstep = (xright - xleft) / 2.; xleft -= xstep; xright -= xstep; update_transform(); drawscreen();}static voidtranslate_right(void (*drawscreen) (void)){/* Moves view 1/2 screen right. */ float xstep; xstep = (xright - xleft) / 2.; xleft += xstep; xright += xstep; update_transform(); drawscreen();}static voidupdate_win(int x[2], int y[2], void (*drawscreen) (void)){ float x1, x2, y1, y2; x[0] = min(x[0], top_width - MWIDTH); /* Can't go under menu */ x[1] = min(x[1], top_width - MWIDTH); y[0] = min(y[0], top_height - T_AREA_HEIGHT); /* Can't go under text area */ y[1] = min(y[1], top_height - T_AREA_HEIGHT); if((x[0] == x[1]) || (y[0] == y[1])) { printf("Illegal (zero area) window. Window unchanged.\n"); return; } x1 = XTOWORLD(min(x[0], x[1])); x2 = XTOWORLD(max(x[0], x[1])); y1 = YTOWORLD(min(y[0], y[1])); y2 = YTOWORLD(max(y[0], y[1])); xleft = x1; xright = x2; ytop = y1; ybot = y2; update_transform(); drawscreen();}static voidadjustwin(void (*drawscreen) (void)){/* The window button was pressed. Let the user click on the two * * diagonally opposed corners, and zoom in on this area. */ XEvent report; int corner, xold, yold, x[2], y[2]; corner = 0; xold = -1; yold = -1; /* Don't need to init yold, but stops compiler warning. */ while(corner < 2) { XNextEvent(display, &report); switch (report.type) { case Expose:#ifdef VERBOSE printf("Got an expose event.\n"); printf("Count is: %d.\n", report.xexpose.count); printf("Window ID is: %d.\n", report.xexpose.window);#endif if(report.xexpose.count != 0) break; if(report.xexpose.window == menu) drawmenu(); else if(report.xexpose.window == toplevel) { drawscreen(); xold = -1; /* No rubber band on screen */ } else if(report.xexpose.window == textarea) draw_message(); break; case ConfigureNotify: top_width = report.xconfigure.width; top_height = report.xconfigure.height; update_transform();#ifdef VERBOSE printf("Got a ConfigureNotify.\n"); printf("New width: %d New height: %d.\n", top_width, top_height);#endif break; case ButtonPress:#ifdef VERBOSE printf("Got a buttonpress.\n"); printf("Window ID is: %d.\n", report.xbutton.window); printf("Location (%d, %d).\n", report.xbutton.x, report.xbutton.y);#endif if(report.xbutton.window != toplevel) break; x[corner] = report.xbutton.x; y[corner] = report.xbutton.y; if(corner == 0) { XSelectInput(display, toplevel, ExposureMask | StructureNotifyMask | ButtonPressMask | PointerMotionMask); } else { update_win(x, y, drawscreen); } corner++; break; case MotionNotify:#ifdef VERBOSE printf("Got a MotionNotify Event.\n"); printf("x: %d y: %d\n", report.xmotion.x, report.xmotion.y);#endif if(xold >= 0) { /* xold set -ve before we draw first box */ XDrawRectangle(display, toplevel, gcxor, min(x[0], xold), min(y[0], yold), abs(x[0] - xold), abs(y[0] - yold)); } /* Don't allow user to window under menu region */ xold = min(report.xmotion.x, top_width - 1 - MWIDTH); yold = report.xmotion.y; XDrawRectangle(display, toplevel, gcxor, min(x[0], xold), min(y[0], yold), abs(x[0] - xold), abs(y[0] - yold)); break; } } XSelectInput(display, toplevel, ExposureMask | StructureNotifyMask | ButtonPressMask);}static voidpostscript(void (*drawscreen) (void)){/* Takes a snapshot of the screen and stores it in pic?.ps. The * * first picture goes in pic1.ps, the second in pic2.ps, etc. */ static int piccount = 1; int success; char fname[20]; sprintf(fname, "pic%d.ps", piccount); success = init_postscript(fname); if(success == 0) return; /* Couldn't open file, abort. */ drawscreen(); close_postscript(); piccount++;}static voidproceed(void (*drawscreen) (void)){ /* Dummy routine. Just exit the event loop. */}static voidquit(void (*drawscreen) (void)){ close_graphics(); exit(0);}voidclose_graphics(void){/* Release all my drawing structures (through the X server) and * * close down the connection. */ int i; for(i = 1; i <= MAX_FONT_SIZE; i++) if(font_is_loaded[i]) XFreeFont(display, font_info[i]); XFreeGC(display, gc); XFreeGC(display, gcxor); XFreeGC(display, gc_menus); if(private_cmap != None) XFreeColormap(display, private_cmap); XCloseDisplay(display); free(button);}intinit_postscript(char *fname){/* Opens a file for PostScript output. The header information, * * clipping path, etc. are all dumped out. If the file could * * not be opened, the routine returns 0; otherwise it returns 1. */ ps = fopen(fname, "w"); if(ps == NULL) { printf("Error: could not open %s for PostScript output.\n", fname); printf("Drawing to screen instead.\n"); return (0); } disp_type = POSTSCRIPT; /* Graphics go to postscript file now. *//* Header for minimal conformance with the Adobe structuring convention */ fprintf(ps, "%%!PS-Adobe-1.0\n"); fprintf(ps, "%%%%DocumentFonts: Helvetica\n"); fprintf(ps, "%%%%Pages: 1\n");/* Set up postscript transformation macros and page boundaries */ update_ps_transform();/* Bottom margin is at ps_bot - 15. to leave room for the on-screen message. */ fprintf(ps, "%%%%BoundingBox: %d %d %d %d\n", (int)ps_left, (int)(ps_bot - 15.), (int)ps_right, (int)ps_top); fprintf(ps, "%%%%EndComments\n"); fprintf(ps, "/censhow %%draw a centered string\n"); fprintf(ps, " { moveto %% move to proper spot\n"); fprintf(ps, " dup stringwidth pop %% get x length of string\n"); fprintf(ps, " -2 div %% Proper left start\n"); fprintf(ps, " yoff rmoveto %% Move left that much and down half font height\n"); fprintf(ps, " show newpath } def %% show the string\n\n"); fprintf(ps, "/setfontsize %% set font to desired size and compute " "centering yoff\n"); fprintf(ps, " { /Helvetica findfont\n"); fprintf(ps, " exch scalefont\n"); fprintf(ps, " setfont %% Font size set ...\n\n"); fprintf(ps, " 0 0 moveto %% Get vertical centering offset\n"); fprintf(ps, " (Xg) true charpath\n"); fprintf(ps, " flattenpath pathbbox\n"); fprintf(ps, " /ascent exch def pop -1 mul /descent exch def pop\n"); fprintf(ps, " newpath\n"); fprintf(ps, " descent ascent sub 2 div /yoff exch def } def\n\n"); fprintf(ps, "%% Next two lines for debugging only.\n"); fprintf(ps, "/str 20 string def\n"); fprintf(ps, "/pnum {str cvs print ( ) print} def\n"); fprintf(ps, "/drawline %% draw a line from (x2,y2) to (x1,y1)\n"); fprintf(ps, " { moveto lineto stroke } def\n\n"); fprintf(ps, "/rect %% outline a rectangle \n"); fprintf(ps, " { /y2 exch def /x2 exch def /y1 exch def /x1 exch def\n"); fprintf(ps, " x1 y1 moveto\n"); fprintf(ps, " x2 y1 lineto\n"); fprintf(ps, " x2 y2 lineto\n"); fprintf(ps, " x1 y2 lineto\n"); fprintf(ps, " closepath } def\n\n"); fprintf(ps, "/drawrect %% draw outline of a rectanagle\n"); fprintf(ps, " { rect stroke } def\n\n"); fprintf(ps, "/fillrect %% fill in a rectanagle\n"); fprintf(ps, " { rect fill } def\n\n"); fprintf(ps, "/drawarc { arc stroke } def %% draw an arc\n"); fprintf(ps, "/drawarcn { arcn stroke } def " " %% draw an arc in the opposite direction\n\n"); fprintf(ps, "%%Fill a counterclockwise or clockwise arc sector, " "respectively.\n"); fprintf(ps, "/fillarc { moveto currentpoint 5 2 roll arc closepath fill } " "def\n"); fprintf(ps, "/fillarcn { moveto currentpoint 5 2 roll arcn closepath fill } " "def\n\n"); fprintf(ps, "/fillpoly { 3 1 roll moveto %% move to first point\n" " 2 exch 1 exch {pop lineto} for %% line to all other points\n" " closepath fill } def\n\n"); fprintf(ps, "%%Color Definitions:\n"); fprintf(ps, "/white { 1 setgray } def\n"); fprintf(ps, "/black { 0 setgray } def\n"); fprintf(ps, "/grey55 { .55 setgray } def\n"); fprintf(ps, "/grey75 { .75 setgray } def\n"); fprintf(ps, "/blue { 0 0 1 setrgbcolor } def\n"); fprintf(ps, "/green { 0 1 0 setrgbcolor } def\n"); fprintf(ps, "/yellow { 1 1 0 setrgbcolor } def\n"); fprintf(ps, "/cyan { 0 1 1 setrgbcolor } def\n"); fprintf(ps, "/red { 1 0 0 setrgbcolor } def\n"); fprintf(ps, "/darkgreen { 0 0.5 0 setrgbcolor } def\n"); fprintf(ps, "/magenta { 1 0 1 setrgbcolor } def\n"); fprintf(ps, "\n%%Solid and dashed line definitions:\n"); fprintf(ps, "/linesolid {[] 0 setdash} def\n"); fprintf(ps, "/linedashed {[3 3] 0 setdash} def\n"); fprintf(ps, "\n%%%%EndProlog\n"); fprintf(ps, "%%%%Page: 1 1\n\n");/* Set up PostScript graphics state to match current one. */ force_setcolor(currentcolor); force_setlinestyle(currentlinestyle); force_setlinewidth(currentlinewidth); force_setfontsize(currentfontsize);/* Draw this in the bottom margin -- must do before the clippath is set */ draw_message();/* Set clipping on page. */ fprintf(ps, "%.2f %.2f %.2f %.2f rect ", ps_left, ps_bot, ps_right, ps_top); fprintf(ps, "clip newpath\n\n"); return (1);}voidclose_postscript(void){/* Properly ends postscript output and redirects output to screen. */ fprintf(ps, "showpage\n"); fprintf(ps, "\n%%%%Trailer\n"); fclose(ps); disp_type = SCREEN; update_transform(); /* Ensure screen world reflects any changes * * made while printing. *//* Need to make sure that we really set up the graphics context -- * * don't want the change requested to match the current setting and * * do nothing -> force the changes. */ force_setcolor(currentcolor); force_setlinestyle(currentlinestyle); force_setlinewidth(currentlinewidth); force_setfontsize(currentfontsize);}#else /* NO_GRAPHICS build -- rip out graphics */voidevent_loop(void (*act_on_button) (float x, float y), void (*drawscreen) (void)){}voidinit_graphics(char *window_name){}voidclose_graphics(void){}voidupdate_message(char *msg){}voiddraw_message(void){}voidinit_world(float xl, float yt, float xr, float yb){}voidflushinput(void){}voidsetcolor(int cindex){}voidsetlinestyle(int linestyle){}voidsetlinewidth(int linewidth){}voidsetfontsize(int pointsize){}voiddrawline(float x1, float y1, float x2, float y2){}voiddrawrect(float x1, float y1, float x2, float y2){}voidfillrect(float x1, float y1, float x2, float y2){}voidfillpoly(t_point * points, int npoints){}voiddrawarc(float xcen, float ycen, float rad, float startang, float angextent){}voidfillarc(float xcen, float ycen, float rad, float startang, float angextent){}voiddrawtext(float xc, float yc, const char *text, float boundx){}voidclearscreen(void){}voidcreate_button(char *prev_button_text, char *button_text, void (*button_func) (void (*drawscreen) (void))){}voiddestroy_button(char *button_text){}intinit_postscript(char *fname){ return (1);}voidclose_postscript(void){}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -