📄 xpicker.c
字号:
msg="limit "; mve=0; } else { x1begb = x1beg ;} } if (verbose) fprintf(stderr,"%s %g\n",msg,mve); /* clear area and force an expose event */ XClearArea(dpy,win,0,0,0,0,True); /* note that image is out of date */ imageOutOfDate = 1; } else if (keysym == XK_Shift_L || keysym == XK_Shift_R || keysym == XK_Control_L || keysym == XK_Control_R || keysym == XK_Return) continue; else { AddTextSetChar(0,keybuf[0]); } } /* else if button down (1 == zoom, 2 == mouse tracking */ } else if (event.type==ButtonPress) { if(event.xbutton.x>x+width) { check_buttons(dpy,win,rgc,event, apick,num_wiggles, x,y, winwidth,height, x1begb,x1endb,x2begb,x2endb, p2beg,p2end, filename_input, pick_fname, &control_mode, &edit_mode, &cross_mode, &pickdimax, &pickdimend, verbose, x1x2); } /* if 1st button: zoom */ else if (event.xbutton.button==Button1) { /* track pointer and get new box */ draw_cross(dpy,win,blue_r_gc,x,y,width,height, event.xbutton.x,event.xbutton.y,cross_mode, ERASE_FLAG); xRubberBox(dpy,win,event,&xb,&yb,&wb,&hb); /* if new box has tiny width or height */ if (wb<4 || hb<4) { /* reset box to initial values */ x1begb = x1beg; x1endb = x1end; x2begb = x2beg; x2endb = x2end; /* else, if new box has non-zero width */ /* if new box has zero width or height */ } else { /* calculate new box parameters */ zoomBox(x,y,width,height, xb,yb,wb,hb, x2begb,x2endb, x1begb,x1endb, &x2begb,&x2endb, &x1begb,&x1endb); } /* clear area and force an expose event */ XClearArea(dpy,win,0,0,0,0,True); /* note that image is out of date */ imageOutOfDate = 1; /* else if 2nd button down: display mouse coords */ } else if (event.xbutton.button==Button2) { showloc = 1; xMouseLoc(dpy,win,event,style,showloc, x,y,width,height,x1begb,x1endb, x2begb,x2endb,p2beg,p2end); } else { /*3rd button*/ edit_pick(dpy,win,gc,event, style,x,y, width,height, apick,num_wiggles, x1begb,x1endb, x2begb,x2endb, p2beg,p2end, control_mode, edit_mode, cross_mode, &pickdimax, &pickdimend, ioff, off,verbose); } /* else if pointer has moved */ } else if (event.type==MotionNotify) { draw_cross(dpy,win,blue_r_gc,x,y,width,height, event.xbutton.x,event.xbutton.y,cross_mode, DRAW_FLAG); /* if button2 down, show mouse location */ if (showloc) xMouseLoc(dpy,win,event,style,True, x,y,width,height,x1begb,x1endb, x2begb,x2endb,p2beg,p2end); /* else if button2 released, stop tracking */ } else if (event.type==ButtonRelease && event.xbutton.button==Button2) { showloc = 0; } } /* end of event loop */ /* close connection to X server */ XCloseDisplay(dpy); return EXIT_SUCCESS;}/*draw a crosshair at coordinates*/static void draw_cross(Display *dpy, Window win, GC gc, int x, int y, int w, int h, int mx, int my, int cross_mode, int draw_f){ static int oldx, oldy, first_time=1; if(!cross_mode) return; if((mx < x) || (mx > x+w) || (my < y) || (my > y+h)) { if(!first_time) { first_time = TRUE; XDrawLine(dpy,win,gc,x,oldy,x+w,oldy); XDrawLine(dpy,win,gc,oldx,y,oldx,y+h); } return; } if(first_time) { first_time=0; oldx = mx; oldy = my; XDrawLine(dpy,win,gc,x,my,x+w,my); XDrawLine(dpy,win,gc,mx,y,mx,y+h); } else { XDrawLine(dpy,win,gc,x,oldy,x+w,oldy); XDrawLine(dpy,win,gc,oldx,y,oldx,y+h); oldx = mx; oldy = my; if(draw_f==DRAW_FLAG) { XDrawLine(dpy,win,gc,x,my,x+w,my); XDrawLine(dpy,win,gc,mx,y,mx,y+h); } else { first_time=1; } }} /* update parameters associated with zoom box */static void zoomBox (int x, int y, int w, int h, int xb, int yb, int wb, int hb, float x1, float x2, float y1, float y2, float *x1b, float *x2b, float *y1b, float *y2b){ /* if width and/or height of box are zero, just copy values */ if (wb==0 || hb==0) { *x1b = x1; *x2b = x2; *y1b = y1; *y2b = y2; return; } /* clip box */ if (xb<x) { wb -= x-xb; xb = x; } if (yb<y) { hb -= y-yb; yb = y; } if (xb+wb>x+w) wb = x-xb+w; if (yb+hb>y+h) hb = y-yb+h; /* determine box limits */ *x1b = x1+(xb-x)*(x2-x1)/w; *x2b = x1+(xb+wb-x)*(x2-x1)/w; *y1b = y1+(yb-y)*(y2-y1)/h; *y2b = y1+(yb+hb-y)*(y2-y1)/h;}/* return pointer to new image bitmap of rasterized wiggles */static XImage *newBitmap (Display *dpy, int width, int height, int n1, float d1, float f1, int n2, float *x2, float *z, float x1beg, float x1end, float x2beg, float x2end, float xcur, float clip, int wt, int va, float *p2begp, float *p2endp, int endian, int interp){ int widthpad,nbpr,i1beg,i1end,if1r,n1r,b1fz,b1lz,i2,i,n2in; float x2min,x2max,p2beg,p2end,bscale,boffset,bxcur,bx2; unsigned char *bits; int scr=DefaultScreen(dpy); /* determine bitmap dimensions and allocate space for bitmap */ widthpad = (1+(width-1)/(BitmapPad(dpy)/8))*BitmapPad(dpy)/8; nbpr = 1+(widthpad-1)/8; bits = ealloc1(nbpr*height,sizeof(unsigned char)); for (i=0; i<nbpr*height; ++i) bits[i] = 0; /* determine number of traces that fall within axis 2 bounds */ x2min = MIN(x2beg,x2end); x2max = MAX(x2beg,x2end); for (i2=0,n2in=0; i2<n2; i2++) if (x2[i2]>=x2min && x2[i2]<=x2max) n2in++; /* determine pads for wiggle excursion along axis 2 */ xcur = fabs(xcur); if (n2in>1) xcur *= (x2max-x2min)/(n2in-1); p2beg = (x2end>=x2beg)?-xcur:xcur; p2end = (x2end>=x2beg)?xcur:-xcur; /* determine scale and offset to map x2 units to bitmap units */ bscale = (width-1)/(x2end+p2end-x2beg-p2beg); boffset = -(x2beg+p2beg)*bscale; bxcur = xcur*bscale; /* adjust x1beg and x1end to fall on sampled values */ i1beg = NINT((x1beg-f1)/d1); i1beg = MAX(0,MIN(n1-1,i1beg)); x1beg = f1+i1beg*d1; i1end = NINT((x1end-f1)/d1); i1end = MAX(0,MIN(n1-1,i1end)); x1end = f1+i1end*d1; /* determine first sample and number of samples to rasterize */ if1r = MIN(i1beg,i1end); n1r = MAX(i1beg,i1end)-if1r+1; /* determine bits corresponding to first and last samples */ b1fz = (x1end>x1beg)?0:height-1; b1lz = (x1end>x1beg)?height-1:0; /* rasterize traces */ for (i2=0; i2<n2; i2++,z+=n1) { /* skip traces not in bounds */ if (x2[i2]<x2min || x2[i2]>x2max) continue; /* determine bitmap coordinate of trace */ bx2 = boffset+x2[i2]*bscale; /* rasterize one trace */ if (interp==0) { /* don't use interpolation */ rfwtva(n1r,&z[if1r],-clip,clip,va?0:clip, (int)(bx2-bxcur),(int)(bx2+bxcur),b1fz,b1lz, wt,nbpr,bits,endian); } else { /* Use sinc interpolation */ rfwtvaint(n1r,&z[if1r],-clip,clip,va?0:clip, (int)(bx2-bxcur),(int)(bx2+bxcur),b1fz,b1lz, wt,nbpr,bits,endian); } } /* return axis 2 pads */ *p2begp = p2beg; *p2endp = p2end; /* return pointer to image */ return XCreateImage((Display*) dpy, (Visual*) DefaultVisual(dpy,scr), (unsigned int) 1, (int) XYBitmap, (int) 0, (char*) bits, (unsigned int) widthpad, (unsigned int) height, (int) BitmapPad(dpy), (int) nbpr);} void xMouseLoc(Display *dpy, Window win, XEvent event, int style, Bool show, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb, float p2beg, float p2end){ static XFontStruct *fs=NULL; static XCharStruct overall; static GC gc; int dummy,xoffset=5,yoffset=5; float x1,x2; char string[256]; /* if first time, get font attributes and make gc */ if (fs==NULL) { fs = XLoadQueryFont(dpy,"fixed"); gc = XCreateGC(dpy,win,0,NULL); /* make sure foreground/background are black/white */ XSetForeground(dpy,gc,BlackPixel(dpy,DefaultScreen(dpy))); XSetBackground(dpy,gc,WhitePixel(dpy,DefaultScreen(dpy))); XSetFont(dpy,gc,fs->fid); overall.width = 1; overall.ascent = 1; overall.descent = 1; } /* erase previous string */ XClearArea(dpy,win,xoffset,yoffset, overall.width,overall.ascent+overall.descent,False); /* if not showing, then return */ if (!show) return; /* convert mouse location to (x1,x2) coordinates */ if (style==NORMAL) { x1 = x1begb+(x1endb-x1begb)*(event.xmotion.x-x)/width; x2 = p2end+x2endb+(p2beg+x2begb-x2endb-p2end)* (event.xmotion.y-y)/height; } else { x1 = x1begb+(x1endb-x1begb)*(event.xmotion.y-y)/height; x2 = p2beg+x2begb+(p2end+x2endb-x2begb-p2beg)* (event.xmotion.x-x)/width; } /* draw string indicating mouse location */ sprintf(string,"(%0.6g,%0.6g)",x1,x2); XTextExtents(fs,string,(int) strlen(string),&dummy,&dummy,&dummy,&overall); XDrawString(dpy,win,gc,xoffset,yoffset+overall.ascent, string,(int) strlen(string));}void xMousePrint(XEvent event, int style, FILE *mpicksfp, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb){ float x1,x2; /* convert mouse location to (x1,x2) coordinates */ if (style==NORMAL) { x1 = x1begb+(x1endb-x1begb)*(event.xmotion.x-x)/width; x2 = x2endb+(x2begb-x2endb)*(event.xmotion.y-y)/height; } else { x1 = x1begb+(x1endb-x1begb)*(event.xmotion.y-y)/height; x2 = x2begb+(x2endb-x2begb)*(event.xmotion.x-x)/width; } /* write string indicating mouse location */ fprintf(mpicksfp, "%0.6g %0.6g\n", x1, x2);}void init_stuff(int winwidth,int num_wiggles, TextSet **filename_input, char *pick_fname, int *control_mode,int *edit_mode, int *cross_mode){ static int first_time=TRUE; if(first_time && /*True*/(pick_fname == (pick_fname+0*num_wiggles)) ) { first_time=FALSE; screen=DefaultScreen(display); visual=DefaultVisual(display,screen); foreground=BlackPixel(display,screen); background=WhitePixel(display,screen); colormap=DefaultColormap(display,screen); grey_color.flags=COLOR_FLAGS; grey_color.red = grey_color.green = grey_color.blue = BUTTON_BRIGHTNESS; XAllocColor(display,colormap,&grey_color); grey_pixel = grey_color.pixel; black_color.flags=COLOR_FLAGS; black_color.red = black_color.green = black_color.blue = 0; XAllocColor(display,colormap,&black_color); black_pixel = black_color.pixel; red_color.flags=COLOR_FLAGS; red_color.red=65000; red_color.green=red_color.blue=0; XAllocColor(display,colormap,&red_color); red_pixel = red_color.pixel; blue_color.flags=COLOR_FLAGS; blue_color.blue=65000; blue_color.green=blue_color.red=0; XAllocColor(display,colormap,&blue_color); blue_pixel = blue_color.pixel; blue_r_gc = XCreateGC(display,window,0,NULL); XSetFunction(display,blue_r_gc,GXxor); XSetForeground(display,blue_r_gc,blue_pixel); red_r_gc = XCreateGC(display,window,0,NULL); XSetFunction(display,red_r_gc,GXxor); XSetForeground(display,red_r_gc,red_pixel); font_struct=XLoadQueryFont(display,FONT_NAME); if(!font_struct) err("Cannot allocate font '%s'.",FONT_NAME); char_width=font_struct->max_bounds.width; char_height=font_struct->ascent+font_struct->descent; font=XLoadFont(display, FONT_NAME); XSetFont(display,gc,font); *control_mode = REGULAR_MODE; *edit_mode = ADD_MODE; *cross_mode = 0; *filename_input = (TextSet *)CreateTextSet(window, winwidth-COMMAND_WIDTH-25,BUTTON_HEIGHT*1, 1,0,12,font,char_width,char_height+5, black_pixel,grey_pixel); SetTextSetLine(*filename_input,0); SetCurrentTextSet(*filename_input,UP); } else { if(*filename_input) { free(*filename_input); } *filename_input = (TextSet *)CreateTextSet(window, winwidth-COMMAND_WIDTH-25,BUTTON_HEIGHT*1, 1,0,12,font,char_width,char_height+5, black_pixel,grey_pixel); SetTextSetLine(*filename_input,0); } /* make sure fg,bg are what xpicker expects */ /* garnish may have mauled them */ XSetForeground(display,gc,BlackPixel(display,screen)); XSetBackground(display,gc,WhitePixel(display,screen));} void save_picks(pick_t **apick, int num_wiggles, char *fname, int *pickdimax, int *pickdimend, int verbose, int x1x2){ FILE *fp; int i=num_wiggles/*dummy*/; int num_picks=0; fp=fopen(fname,"w+"); if(fp == NULL) err("Could not open pick output file '%s'",fname); if (verbose) warn("save: end %d max %d ",*pickdimend,*pickdimax); for(i=0;i< *pickdimax;i++) { if((*apick)[i].picked) { num_picks++; if (verbose) warn("save: ar%d pick%d %f %f %d ", i,num_picks, (*apick)[i].x2, (*apick)[i].time,(*apick)[i].picked); } } /* fprintf(fp,"%d\n",num_picks); */ /* don't print number of picks */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -