axesbox.c
来自「seismic software,very useful」· C语言 代码 · 共 482 行 · 第 1/2 页
C
482 行
n2num = (style==NORMAL ? height : width)/(8*labelcw); scaxis(x2beg,x2end,&n2num,&d2num,&f2num); } /* draw horizontal axis */ if (style==NORMAL) { amin = (x1beg<x1end)?x1beg:x1end; amax = (x1beg>x1end)?x1beg:x1end; dnum = d1num; fnum = f1num; ntic = n1tic; scale = width/(x1end+p1end-x1beg-p1beg); base = x-scale*(x1beg+p1beg); ya = y+height; ticb = ticsize; numb = ticb+labelca; labelb = numb+labelch; grid = grid1; label = label1; } else { amin = (x2beg<x2end)?x2beg:x2end; amax = (x2beg>x2end)?x2beg:x2end; dnum = d2num; fnum = f2num; ntic = n2tic; scale = width/(x2end+p2end-x2beg-p2beg); base = x-scale*(x2beg+p2beg); ya = y; ticb = -ticsize; numb = ticb-labelcd; labelb = numb-labelch; grid = grid2; label = label2; } if (grid==SOLID) grided = True; else if (grid==DASH) { grided = True; XSetLineAttributes(dpy,gcg,1L,LineOnOffDash,CapButt,JoinMiter); dash[0] = 8; dash[1] = 4; XSetDashes(dpy,gcg,0,dash,2); } else if (grid==DOT) { grided = True; XSetLineAttributes(dpy,gcg,1L,LineOnOffDash,CapButt,JoinMiter); dash[0] = 1; dash[1] = 4; XSetDashes(dpy,gcg,0,dash,2); } else grided = False; azero = 0.0001*(amax-amin); for (anum=fnum; anum<=amax; anum+=dnum) { if (anum<amin) continue; xa = base+scale*anum; if (grided) XDrawLine(dpy,win,gcg,xa,y,xa,y+height); XDrawLine(dpy,win,gca,xa,ya,xa,ya+ticb); if (anum>-azero && anum<azero) sprintf(str,"%1.5g",0.0); else sprintf(str,"%1.5g",anum); lstr = strlen(str); tw = XTextWidth(fa,str,lstr); XDrawString(dpy,win,gca,xa-tw/2,ya+numb,str,lstr); } dtic = dnum/ntic; for (atic=fnum-ntic*dtic-dtic; atic<=amax; atic+=dtic) { if (atic<amin) continue; xa = base+scale*atic; XDrawLine(dpy,win,gca,xa,ya,xa,ya+ticb/2); } lstr = strlen(label); tw = XTextWidth(fa,label,lstr); XDrawString(dpy,win,gca,x+width-tw,ya+labelb,label,lstr); /* draw vertical axis */ if (style==NORMAL) { amin = (x2beg<x2end)?x2beg:x2end; amax = (x2beg>x2end)?x2beg:x2end; dnum = d2num; fnum = f2num; ntic = n2tic; scale = -height/(x2end+p2end-x2beg-p2beg); base = y+height-scale*(x2beg+p2beg); grid = grid2; label = label2; } else { amin = (x1beg<x1end)?x1beg:x1end; amax = (x1beg>x1end)?x1beg:x1end; dnum = d1num; fnum = f1num; ntic = n1tic; scale = height/(x1end+p1end-x1beg-p1beg); base = y-scale*(x1beg+p1beg); grid = grid1; label = label1; } xa = x; ticb = -ticsize; numb = ticb-ticsize/4; if (grid==SOLID) grided = True; else if (grid==DASH) { grided = True; XSetLineAttributes(dpy,gcg,1L,LineOnOffDash,CapButt,JoinMiter); dash[0] = 8; dash[1] = 4; XSetDashes(dpy,gcg,0,dash,2); } else if (grid==DOT) { grided = True; XSetLineAttributes(dpy,gcg,1L,LineOnOffDash,CapButt,JoinMiter); dash[0] = 1; dash[1] = 4; XSetDashes(dpy,gcg,0,dash,2); } else grided = False; azero = 0.0001*(amax-amin); for (anum=fnum; anum<=amax; anum+=dnum) { if (anum<amin) continue; ya = base+scale*anum; if (grided) XDrawLine(dpy,win,gcg,x,ya,x+width,ya); XDrawLine(dpy,win,gca,xa,ya,xa+ticb,ya); if (anum>-azero && anum<azero) sprintf(str,"%1.5g",0.0); else sprintf(str,"%1.5g",anum); lstr = strlen(str); tw = XTextWidth(fa,str,lstr); XDrawString(dpy,win,gca,xa+numb-tw,ya+labelca/4,str,lstr); } dtic = dnum/ntic; for (atic=fnum-ntic*dtic-dtic; atic<=amax; atic+=dtic) { if (atic<amin) continue; ya = base+scale*atic; XDrawLine(dpy,win,gca,xa,ya,xa+ticb/2,ya); } lstr = strlen(label); if (style==NORMAL) XDrawString(dpy,win,gca, x+ticb-9*labelcw, y+labelca/4-labelch,label,lstr); else XDrawString(dpy,win,gca, x+ticb-9*labelcw, y+height+labelca/4+labelch,label,lstr); /* draw title */ lstr = strlen(title); tw = XTextWidth(ft,title,lstr); if (style==NORMAL) XDrawString(dpy,win,gct, x+width/2-tw/2, y+labelca/4-labelch-labelch,title,lstr); else XDrawString(dpy,win,gct, x+width/2-tw/2, y+height+labelca/4+labelch+titleca,title,lstr); /* draw axes box */ XDrawRectangle(dpy,win,gca,x,y,width,height); /* free resources before returning */ XFreeGC(dpy,gca); XFreeGC(dpy,gct); XFreeGC(dpy,gcg); XFreeFont(dpy,fa); XFreeFont(dpy,ft);}voidxSizeAxesBox (Display *dpy, Window win, char *labelfont, char *titlefont, int style, int *x, int *y, int *width, int *height)/*****************************************************************************determine optimal origin and size for a labeled axes box******************************************************************************Input:dpy display pointerwin windowlabelfont name of font to use for axes labelstitlefont name of font to use for titleint style NORMAL (axis 1 on bottom, axis 2 on left) SEISMIC (axis 1 on left, axis 2 on top)Output:x x coordinate of upper left corner of boxy y coordinate of upper left corner of boxwidth width of boxheight height of box******************************************************************************Notes:xSizeAxesBox is intended to be used prior to xDrawAxesBox.An "optimal" axes box is one that more or less fills the window, with little wasted space around the edges of the window.******************************************************************************Author: Dave Hale, Colorado School of Mines, 01/27/90*****************************************************************************/{ XFontStruct *fa,*ft; XWindowAttributes attr; int labelch,labelcw,titlech,titlecw,bl,bt,br,bb; /* get fonts and determine character dimensions */ fa = XLoadQueryFont(dpy,labelfont); if (fa==NULL) fa = XLoadQueryFont(dpy,"fixed"); if (fa==NULL) { fprintf(stderr,"Cannot load/query labelfont=%s\n",labelfont); exit(-1); } labelch = fa->max_bounds.ascent+fa->max_bounds.descent; labelcw = fa->max_bounds.lbearing+fa->max_bounds.rbearing; ft = XLoadQueryFont(dpy,titlefont); if (ft==NULL) ft = XLoadQueryFont(dpy,"fixed"); if (ft==NULL) { fprintf(stderr,"Cannot load/query titlefont=%s\n",titlefont); exit(-1); } titlech = ft->max_bounds.ascent+ft->max_bounds.descent; titlecw = ft->max_bounds.lbearing+ft->max_bounds.rbearing; /* determine axes box origin and size */ XGetWindowAttributes(dpy,win,&attr); bl = 10*labelcw; br = attr.width-5*labelcw; while (br<=bl) { br += labelcw; bl -= labelcw; } if (bl<0) bl = 0; if (br>attr.width) br = attr.width; if (style==NORMAL) { bt = labelch+labelch/2+titlech; bb = attr.height-3*labelch; } else { bt = 3*labelch; bb = attr.height-labelch-labelch/2-titlech; } while (bb<=bt) { bb += labelch; bt -= labelch; } if (bt<0) bt = 0; if (bb>attr.height) bb = attr.height; *x = bl; *y = bt; *width = br-bl; *height = bb-bt; XFreeFont(dpy,fa); XFreeFont(dpy,ft);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?