⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpicker.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 4 页
字号:
					  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 + -