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

📄 xipick.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
			} else if (keysym==XK_c) {				pkey = 5;			}			if (pkey<=5) {				xMousePicks(dpy,win,event,style,					mpcolor,					mpicksfp, x,y,width,height,					x1begb,x1endb,x2begb,x2endb,					pcard,ppos,porder,x1picks,x2picks,					x1pscale,x2pscale,&npicks,gci,pkey,					&savebg);			/* output the picks */			} else if (keysym==XK_s) {				xMousePrint(dpy,win,event,style,					mpicksfp, x,y,width,height,					x1begb,x1endb,x2begb,x2endb,					pcard,ppos,porder,x1picks,x2picks,					x1pscale,x2pscale,npicks,fex);			} else if (keysym==XK_Q) {			/* This is the exit from the event loop */				break;			} else {				continue;			}		/* else if button down (1 == zoom, 2 == mouse tracking */		} else if (event.type==ButtonPress) {			/* if 1st button: zoom */			if (event.xbutton.button==Button1) {				savebg = 1;				/* track pointer and get new box */				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;					nxb = nx;					nyb = ny;					ixb = iyb = 0;					if (czb!=cz) free1(czb);					czb = cz;							/* else, if new box has non-zero width				/* and height */				} else {								/* calculate new box parameters */					if (style==NORMAL) {					    zoomBox(x,y,width,height,						    xb,yb,wb,hb,						    nxb,ixb,x1begb,x1endb,						    nyb,iyb,x2endb,x2begb,						    &nxb,&ixb,&x1begb,&x1endb,						    &nyb,&iyb,&x2endb,&x2begb);					} else {					    zoomBox(x,y,width,height,						    xb,yb,wb,hb,						    nxb,ixb,x2begb,x2endb,						    nyb,iyb,x1begb,x1endb,						    &nxb,&ixb,&x2begb,&x2endb,						    &nyb,&iyb,&x1begb,&x1endb);					}								/* make new bytes in zoombox */					if (czb!=cz) free1(czb);					czb = ealloc1(nxb*nyb,						sizeof(signed char));					for (i=0,czbp=czb; i<nyb; i++) {					    czp = cz+(iyb+i)*nx+ixb;					    for (j=0; j<nxb; j++)						    *czbp++ = *czp++; 					}				}							/* clear background */                        	if(savebg) XSetWindowBackground(dpy,win,0L);				/* 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);			/* else if 3rd button down: track and pick */                        } else if (event.xbutton.button==Button3) {				pkey = 0;				xMousePicks(dpy,win,event,style,					mpcolor,					mpicksfp, x,y,width,height,					x1begb,x1endb,x2begb,x2endb,					pcard,ppos,porder,x1picks,x2picks,					x1pscale,x2pscale,&npicks,gci,pkey,					&savebg);			} else {				continue;			}		/* else if pointer has moved */		} else if (event.type==MotionNotify) {						/* if button2 down, show mouse location */			if (showloc)				xMouseLoc(dpy,win,event,style,True,					x,y,width,height,					x1begb,x1endb,x2begb,x2endb);		/* 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;}/* 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,	int nx, int ix, float x1, float x2,	int ny, int iy, float y1, float y2,	int *nxb, int *ixb, float *x1b, float *x2b,	int *nyb, int *iyb, float *y1b, float *y2b){	/* if width and/or height of box are zero, just copy values */	if (wb==0 || hb==0) {		*nxb = nx; *ixb = ix; *x1b = x1; *x2b = x2;		*nyb = ny; *iyb = iy; *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 number of samples in rubber box (at least 2) */	*nxb = MAX(nx*wb/w,2);	*nyb = MAX(ny*hb/h,2);		/* determine indices of first samples in box */	*ixb = ix+(xb-x)*(nx-1)/w;	*ixb = MIN(*ixb,ix+nx-*nxb);	*iyb = iy+(yb-y)*(ny-1)/h;	*iyb = MIN(*iyb,iy+ny-*nyb);			/* determine box limits to nearest samples */	*x1b = x1+(*ixb-ix)*(x2-x1)/(nx-1);	*x2b = x1+(*ixb+*nxb-1-ix)*(x2-x1)/(nx-1);	*y1b = y1+(*iyb-iy)*(y2-y1)/(ny-1);	*y2b = y1+(*iyb+*nyb-1-iy)*(y2-y1)/(ny-1);}/* return pointer to new interpolated array of bytes */static unsigned char *newInterpBytes (int n1in, int n2in, unsigned char *bin,	int n1out, int n2out){	unsigned char *bout;	float d1in,d2in,d1out,d2out,f1in,f2in,f1out,f2out;		f1in = f2in = f1out = f2out = 0.0;	d1in = d2in = 1.0;	d1out = d1in*(float)(n1in-1)/(float)(n1out-1);	d2out = d2in*(float)(n2in-1)/(float)(n2out-1);	bout = ealloc1(n1out*n2out,sizeof(unsigned char));	intl2b(n1in,d1in,f1in,n2in,d2in,f2in,bin,		n1out,d1out,f1out,n2out,d2out,f2out,bout);	return bout;}	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){	XGCValues values;	static XFontStruct *fs=NULL;	static XCharStruct overall;	static GC gc;	int dummy,xoffset=10,yoffset=10;	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,&values);		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 = 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;	}	/* draw string indicating mouse location */	sprintf(string,"(%0.4g,%0.4g)",x1,x2);	XTextExtents(fs,string,strlen(string),&dummy,&dummy,&dummy,&overall);	XDrawImageString(dpy,win,gc,xoffset,yoffset+overall.ascent,		string,strlen(string));}void xMousePrint(Display *dpy, Window win, XEvent event, int style,	FILE *mpicksfp, int x, int y, int width, int height,	float x1begb, float x1endb, float x2begb, float x2endb,	char *pcard, int ppos, int porder, float *x1picks, float *x2picks,	float x1pscale, float x2pscale, int npicks, int fex){	int ic,ip,np; 	int p1,p2;	static int first=1;	/* output picks */	if(first==1 && fex==0) {		first=999;		fprintf(mpicksfp,"1---5---10---15---20---25---30---35---40---45---50---55---60---65---70\n");		fprintf(mpicksfp,"pcard      ppos       px1  py1  px2  py2  px3  py3  px4  py4  px5  py5\n");		fprintf(mpicksfp,"\n");	}	for (ic=0;ic<(npicks+4)/5;ic++) {	   if( (ic+1)*5 < npicks ) {	      np = 5;  	   }	   else { 	      np = npicks - ic*5;	   }	   fprintf(mpicksfp, "%-5s%10d     ",pcard,ppos);	   for(ip=0;ip<np;ip++) {	      if(porder==0) {	         p1 = x1picks[ic*5+ip]*x1pscale;		         p2 = x2picks[ic*5+ip]*x2pscale;		      } else {	         p1 = x2picks[ic*5+ip]*x2pscale;		         p2 = x1picks[ic*5+ip]*x1pscale;		      }	      fprintf(mpicksfp,"%5d%5d",p1,p2);	   }	   fprintf(mpicksfp,"\n");	}	fflush(mpicksfp);}void xMousePicks(Display *dpy, Window win, XEvent event, int style,	char *mpcolor,	FILE *mpicksfp, int x, int y, int width, int height,	float x1begb, float x1endb, float x2begb, float x2endb,	char *pcard, int ppos, int porder, float *x1picks, float *x2picks,	float x1pscale, float x2pscale, int *npicks, GC gc, int pkey,	int *savebg){	float x1,x2;	int ipicks;	int xx1,yy1,xx2,yy2,temp,ip;	int dismin,dis;	int ipmin, ipins;	GC gcp;        XGCValues *values;        XColor scolor,ecolor;        XWindowAttributes wa;        Colormap cmap;        int scr;	/* save bitmap of window to background for retrival */ 	if(*savebg) {		fg2bg(dpy,win);		*savebg = 0;	}	/* 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;	}	/* save to x1picks and x2picks */	if( pkey == 0 ) {		ipicks = *npicks;		x1picks[ipicks] = x1;		x2picks[ipicks] = x2;		*npicks = *npicks + 1;	/* delete nearest picks from x1picks and x2picks*/	} else if ( pkey==1 && *npicks > 0 ) {		ipicks = *npicks;			dismin=(x1-x1picks[0])*(x1-x1picks[0])+		       (x2-x2picks[0])*(x2-x2picks[0]);		ipmin = 0;		for(ip=1;ip<ipicks;ip++) {		   	dis=(x1-x1picks[ip])*(x1-x1picks[ip])+		       		(x2-x2picks[ip])*(x2-x2picks[ip]);			if(dis<dismin) {				dismin = dis;				ipmin = ip;			}		}		ipicks = ipicks - 1;		for(ip=ipmin;ip<ipicks;ip++) {			x1picks[ip] = x1picks[ip+1];			x2picks[ip] = x2picks[ip+1];		}		*npicks = ipicks;	/* insert the pick into x1picks and x2picks */	} else if ( pkey==2 ) {		ipicks = *npicks;			if (porder==0) {			dismin=(x1-x1picks[0])*(x1-x1picks[0]);			ipmin = 0;			for(ip=1;ip<ipicks;ip++) {		   		dis=(x1-x1picks[ip])*(x1-x1picks[ip]);				if(dis<dismin) {					dismin = dis;					ipmin = ip;				}			}			if(x1>x1picks[ipmin]) { 				ipins = ipmin+1;				ipicks +=1;				for(ip=ipicks;ip>ipins;ip--) {					x1picks[ip] = x1picks[ip-1];					x2picks[ip] = x2picks[ip-1];				}				x1picks[ipins] = x1;				x2picks[ipins] = x2;			} else if(x1<x1picks[ipmin]) {				ipins = ipmin;				ipicks +=1;				for(ip=ipicks;ip>ipins;ip--) {					x1picks[ip] = x1picks[ip-1];					x2picks[ip] = x2picks[ip-1];				}				x1picks[ipins] = x1;				x2picks[ipins] = x2;			}		} else {			dismin=(x2-x2picks[0])*(x2-x2picks[0]);			ipmin = 0;			for(ip=1;ip<ipicks;ip++) {		   		dis=(x2-x2picks[ip])*(x2-x2picks[ip]);				if(dis<dismin) {					dismin = dis;					ipmin = ip;				}			}			if(x2>x2picks[ipmin]) { 				ipins = ipmin+1;				ipicks +=1;				for(ip=ipicks;ip>ipins;ip--) {					x1picks[ip] = x1picks[ip-1];					x2picks[ip] = x2picks[ip-1];				}				x1picks[ipins] = x1;				x2picks[ipins] = x2;			} else if(x2<x2picks[ipmin]) {				ipins = ipmin;				ipicks +=1;				for(ip=ipicks;ip>ipins;ip--) {					x1picks[ip] = x1picks[ip-1];					x2picks[ip] = x2picks[ip-1];				}				x1picks[ipins] = x1;				x2picks[ipins] = x2;			}		}		*npicks = ipicks;	}	if ( pkey==5 ) {		for(ip=0;ip<*npicks;ip++) {			x1picks[ip] = 0.;			x2picks[ip] = 0.;		}		*npicks = 0;		ipicks = 0;	}	ipicks = *npicks;	/* draw lines between picks */	if(ipicks>0) {       		XClearWindow(dpy, win);		/* get screen */                scr = DefaultScreen(dpy);                /* determine window's current colormap */                XGetWindowAttributes(dpy,win,&wa);                cmap = wa.colormap;                gcp = XCreateGC(dpy,win,0,values);                if (XAllocNamedColor(dpy,cmap,mpcolor,&scolor,&ecolor))                        XSetForeground(dpy,gcp,ecolor.pixel);                else                        XSetForeground(dpy,gcp,1L);                XSetLineAttributes(dpy,gcp,2,LineSolid,CapButt,JoinMiter);		for(ip=1;ip<ipicks;ip++) {			if (style==NORMAL) {			xx1=(x1picks[ip-1]-x1begb)/(x1endb-x1begb)*width+x;			yy1=(x2picks[ip-1]-x2endb)/(x2begb-x1endb)*height+y;			xx2=(x1picks[ip]-x1begb)/(x1endb-x1begb)*width+x;			yy2=(x2picks[ip]-x2endb)/(x2begb-x1endb)*height+y;			} else {			yy1=(x1picks[ip-1]-x1begb)/(x1endb-x1begb)*height+y;			xx1=(x2picks[ip-1]-x2begb)/(x2endb-x2begb)*width+x;			yy2=(x1picks[ip]-x1begb)/(x1endb-x1begb)*height+y;			xx2=(x2picks[ip]-x2begb)/(x2endb-x2begb)*width+x;			}			XDrawLine(dpy,win,gcp,xx1,yy1,xx2,yy2);		}		/* free resources before returning */                XFreeGC(dpy,gcp);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -