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

📄 mipick.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
char *sdoc = "MIPICK - Mute pick using X IMAGE plot of uniformly-sampled function f(x1,x2)\n""\n""mipick n1= [optional parameters] <binaryfile\n""\n""See mutepick and ximage \n""\n"" author: Zhiming Li                            9/12/91                 \n""\n";#include "comva.h"#include "par.h"#include "xplot.h"#include <X11/Xatom.h>#include <X11/keysym.h>/* functions defined and used internally */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 *iby, float *y1b, float *y2b);static unsigned char *newInterpBytes (int n1in, int n2in, unsigned char *bin,	int n1out, int n2out);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);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, 	float *xtp, float *tp, int ntp, 	float *xbt, float *bt, int nbt, int fex);void xMousePicks(Display *dpy, Window win, XEvent event, int style,	char *topmutecolr, char *bottommutecolr,	FILE *mpicksfp, int x, int y, int width, int height,	float x1begb, float x1endb, float x2begb, float x2endb,	float *xtp, float *tp, int *ntp, float *xbt, float *bt, int *nbt, 	int pkey, int tkey, GC gc, int *savebg);static Display *dpy;static Window win;main (argc,argv)int argc; char **argv;{	int n1,n2,n1tic,n2tic,nfloats,		i1,i2,grid1,grid2,style,		n1c,n2c,i1beg,i1end,i2beg,i2end,i1c,i2c,		nz,iz,i1step,i2step,verbose,		xbox,ybox,wbox,hbox,		xb,yb,wb,hb,		x,y,width,height,		i,j,nx,ny,nxb,nyb,ixb,iyb,		imageOutOfDate,winwidth=-1,winheight=-1,		showloc=0,ppos,ntp=0,nbt=0,tkey=0,pkey,fex,savebg;	float labelsize,titlesize,perc,clip,bperc,wperc,bclip,wclip,		d1,f1,d2,f2,*z,*temp,zscale,zoffset,zi,		x1beg,x1end,x2beg,x2end,		x1min,x1max,x2min,x2max,		d1num,f1num,d2num,f2num,		x1begb,x1endb,x2begb,x2endb,blank,		*xtp,*tp,*xbt,*bt;	unsigned char *cz,*czp,*czb,*czbp,*czbi=NULL;	char *label1="time (or depth)",*label2="offset (or cdp)",		title[80],*ttl, 		*labelfont="Erg14",*titlefont="Rom22",		*styles="seismic",*grid1s="none",*grid2s="none",		*labelcolor="blue",*titlecolor="red",		*gridcolor="blue",*cmap="gray",keybuf[256],*mpicks,		*topmutecolor="blue",*bottommutecolor="red",		*pcard="MUTE";	FILE *infp=stdin, *mpicksfp;/*	Display *dpy;	Window win;*/	XEvent event;	KeySym keysym;	XComposeStatus keystat;	XImage *image=NULL;	GC gci;	int scr;	unsigned long black,white,pmin,pmax;	/* initialize getpar */	initargs(argc,argv);	askdoc(1);	/* get parameters describing 1st dimension sampling */	if (!getparint("n1",&n1))		err("Must specify number of samples in 1st dimension!\n");	d1 = 1.0;  getparfloat("d1",&d1);	f1 = d1;  getparfloat("f1",&f1);	x1min = (d1>0.0)?f1:f1+(n1-1)*d1;	x1max = (d1<0.0)?f1:f1+(n1-1)*d1;	/* get parameters describing 2nd dimension sampling */	if (!getparint("n2",&n2)) {		if (fseek(infp,0L,2)!=0)			err("must specify n2 if in a pipe!\n");		nfloats = eftell(infp)/sizeof(float);		efseek(infp,0L,0);		n2 = nfloats/n1;	}	d2 = 1.0;  getparfloat("d2",&d2);	f2 = d2;  getparfloat("f2",&f2);	x2min = (d2>0.0)?f2:f2+(n2-1)*d2;	x2max = (d2<0.0)?f2:f2+(n2-1)*d2;	/* set up file to save mouse picks */	if (!getparstring("mpicks", &mpicks)) {		mpicksfp = stderr;		fex = 0;	} else {		/* if file exist */		if((mpicksfp = fopen(mpicks,"r"))!=NULL) {			fclose(mpicksfp);			mpicksfp = efopen(mpicks,"a");			fex = 1;		} else {			mpicksfp = efopen(mpicks,"w");			fex = 0;		}	}	if (!getparint("ppos", &ppos)) ppos = 1;	/* 256 picks maximum */	xtp = (float*) malloc(256*sizeof(float));	tp = (float*) malloc(256*sizeof(float));	xbt = (float*) malloc(256*sizeof(float));	bt = (float*) malloc(256*sizeof(float));	/* read binary data to be plotted */	nz = n1*n2;	z = ealloc1float(nz);	if (fread(z,sizeof(float),nz,infp)!=nz)		err("error reading input file");	/* if necessary, determine clips from percentiles */	if (getparfloat("clip",&clip)) {		bclip = clip;		wclip = -clip;	}	if ((!getparfloat("bclip",&bclip) || !getparfloat("wclip",&wclip)) &&		!getparfloat("clip",&clip)) {		perc = 100.0;  getparfloat("perc",&perc);		temp = ealloc1float(nz);		for (iz=0; iz<nz; iz++)			temp[iz] = z[iz];		if (!getparfloat("bclip",&bclip)) {			bperc = perc;	getparfloat("bperc",&bperc);			iz = (nz*bperc/100.0);			if (iz<0) iz = 0;			if (iz>nz-1) iz = nz-1;			qkfind(iz,nz,temp);			bclip = temp[iz];		}		if (!getparfloat("wclip",&wclip)) {			wperc = 100.0-perc;  getparfloat("wperc",&wperc);			iz = (nz*wperc/100.0);			if (iz<0) iz = 0;			if (iz>nz-1) iz = nz-1;			qkfind(iz,nz,temp);			wclip = temp[iz];		}		free1float(temp);	}	verbose = 1;  getparint("verbose",&verbose);	if (verbose) warn("bclip=%g wclip=%g",bclip,wclip);	/* get colormap specification */	getparstring("cmap",&cmap);	blank = 0; getparfloat("blank",&blank);	/* get axes parameters */	xbox = 50; getparint("xbox",&xbox);	ybox = 50; getparint("ybox",&ybox);	wbox = 550; getparint("wbox",&wbox);	hbox = 700; getparint("hbox",&hbox);	x1beg = x1min; getparfloat("x1beg",&x1beg);	x1end = x1max; getparfloat("x1end",&x1end);	d1num = 0.0; getparfloat("d1num",&d1num);	f1num = x1min; getparfloat("f1num",&f1num);	n1tic = 1; getparint("n1tic",&n1tic);	getparstring("grid1",&grid1s);	if (STREQ("dot",grid1s)) grid1 = DOT;	else if (STREQ("dash",grid1s)) grid1 = DASH;	else if (STREQ("solid",grid1s)) grid1 = SOLID;	else grid1 = NONE;	getparstring("label1",&label1);	x2beg = x2min; getparfloat("x2beg",&x2beg);	x2end = x2max; getparfloat("x2end",&x2end);	d2num = 0.0; getparfloat("d2num",&d2num);	f2num = 0.0; getparfloat("f2num",&f2num);	n2tic = 1; getparint("n2tic",&n2tic);	getparstring("grid2",&grid2s);	if (STREQ("dot",grid2s)) grid2 = DOT;	else if (STREQ("dash",grid2s)) grid2 = DASH;	else if (STREQ("solid",grid2s)) grid2 = SOLID;	else grid2 = NONE;	getparstring("label2",&label2);	getparstring("labelfont",&labelfont);	labelsize = 18.0; getparfloat("labelsize",&labelsize);	if(!getparstring("title",&ttl)) {		ttl = (char*) malloc(30*sizeof(char));                strcpy(ttl,"Mute Picking ");	}		sprintf(title,"%s at position = %5d \0",ttl,ppos);	getparstring("titlefont",&titlefont);	titlesize = 24.0; getparfloat("titlesize",&titlesize);	getparstring("style",&styles);	if (STREQ("normal",styles)) style = NORMAL;	else style = SEISMIC;	getparstring("titlecolor",&titlecolor);	getparstring("labelcolor",&labelcolor);	getparstring("gridcolor",&gridcolor);	getparstring("topmutecolor",&topmutecolor);        getparstring("bottommutecolor",&bottommutecolor);	/* 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;	/* adjust x2beg and x2end to fall on sampled values */	i2beg = NINT((x2beg-f2)/d2);	i2beg = MAX(0,MIN(n2-1,i2beg));	x2beg = f2+i2beg*d2;	i2end = NINT((x2end-f2)/d2);	i2end = MAX(0,MIN(n2-1,i2end));	x2end = f2+i2end*d2;	/* allocate space for image bytes */	n1c = 1+abs(i1end-i1beg);	n2c = 1+abs(i2end-i2beg);	cz = ealloc1(n1c*n2c,sizeof(unsigned char));	/* convert data to be imaged into signed characters */	zscale = (wclip!=bclip)?255.0/(wclip-bclip):1.0e10;	zoffset = -bclip*zscale;	i1step = (i1end>i1beg)?1:-1;	i2step = (i2end>i2beg)?1:-1;	if (style==NORMAL) {		for (i2c=0,i2=i2beg; i2c<n2c; i2c++,i2+=i2step) {			czp = cz+n1c*n2c-(i2c+1)*n1c;			for (i1c=0,i1=i1beg; i1c<n1c; i1c++,i1+=i1step) {				zi = zoffset+z[i1+i2*n1]*zscale;				if (zi<0.0) zi = 0.0;				if (zi>255.0) zi = 255.0;				*czp++ = (unsigned char)zi;			}		}	} else {		czp = cz;		for (i1c=0,i1=i1beg; i1c<n1c; i1c++,i1+=i1step) {			for (i2c=0,i2=i2beg; i2c<n2c; i2c++,i2+=i2step) {				zi = zoffset+z[i1+i2*n1]*zscale;				if (zi<0.0) zi = 0.0;				if (zi>255.0) zi = 255.0;				*czp++ = (unsigned char)zi;			}		}	}	free1float(z);		/* initialize zoom box parameters */	nxb = nx = (style==NORMAL ? n1c : n2c);	nyb = ny = (style==NORMAL ? n2c : n1c);	ixb = iyb = 0;	czb = cz;	x1begb = x1beg;  x1endb = x1end;	x2begb = x2beg;  x2endb = x2end;	/* connect to X server */	if ((dpy=XOpenDisplay(NULL))==NULL)		err("Cannot connect to display %s!\n",XDisplayName(NULL));	scr = DefaultScreen(dpy);	black = BlackPixel(dpy,scr);	white = WhitePixel(dpy,scr);		/* create window */	win = xNewWindow(dpy,xbox,ybox,wbox,hbox,black,white,"xipick");	/* if necessary, create private colormap with gray scale */	if (strncmp(cmap, "rgb", 3) == 0)		XSetWindowColormap(dpy,win,			xCreateRGBColormap(dpy,win, cmap, verbose));	else if (strncmp (cmap, "hsv", 3) == 0)		XSetWindowColormap(dpy,win,			xCreateHSVColormap(dpy,win, cmap, verbose));	/* determine min and max pixels from standard colormap */	pmin = xGetFirstPixel(dpy);	pmax = xGetLastPixel(dpy);			/* make GC for image */	gci = XCreateGC(dpy,win,0,NULL);		/* set normal event mask */	XSelectInput(dpy,win,		StructureNotifyMask |		ExposureMask |		KeyPressMask |		PointerMotionMask |		ButtonPressMask |		ButtonReleaseMask |		Button1MotionMask |		Button2MotionMask);		/* map window */	XMapWindow(dpy,win);						/* determine good size for axes box */	xSizeAxesBox(dpy,win,		labelfont,titlefont,style,		&x,&y,&width,&height);		/* clear the window */	XClearWindow(dpy,win);		/* note that image is out of date */	imageOutOfDate = 1;	savebg = 1;	/* main event loop */	while(True) {		XNextEvent(dpy,&event);		/* if window was resized */		if (event.type==ConfigureNotify &&			(event.xconfigure.width!=winwidth ||			 event.xconfigure.height!=winheight)) {			winwidth = event.xconfigure.width;			winheight = event.xconfigure.height;										/* determine good size for axes box */			xSizeAxesBox(dpy,win,				labelfont,titlefont,style,				&x,&y,&width,&height);			/* clear background */                        if(savebg) XSetWindowBackground(dpy,win,0L);						/* clear the window */			XClearWindow(dpy,win);						/* note that image is out of date */			imageOutOfDate = 1;		/* else if window exposed */		} else if (event.type==Expose) {						/* clear all expose events from queue */			while (XCheckTypedEvent(dpy,Expose,&event));						/* if necessary, make new image */			if (imageOutOfDate) {				if (czbi!=NULL) free1(czbi);				czbi = newInterpBytes(nxb,nyb,czb,					width,height);				if (image!=NULL) XDestroyImage(image);				image = xNewImage(dpy,pmin,pmax,					width,height,blank,czbi);				imageOutOfDate = 0;			}			/* clear background */                        if(savebg) XSetWindowBackground(dpy,win,0L);				/* draw image (before axes so grid lines visible) */			XPutImage(dpy,win,gci,image,0,0,x,y,				image->width,image->height);						/* draw axes on top of image */			xDrawAxesBox(dpy,win,				x,y,width,height,				x1begb,x1endb,0.0,0.0,				d1num,f1num,n1tic,grid1,label1,				x2begb,x2endb,0.0,0.0,				d2num,f2num,n2tic,grid2,label2,				labelfont,title,titlefont,				labelcolor,titlecolor,gridcolor,				style);		/* else if key down */		} else if (event.type==KeyPress) {			XLookupString(&event,keybuf,0,&keysym,&keystat);			/* add, delete or insert picks */			pkey =99;			if (keysym==XK_a) {				pkey = 0; 				tkey = 0;			} else if ( keysym==XK_A ) {				pkey = 0; 				tkey = 1;			} else if ( keysym==XK_d ) {				pkey = 1; 				tkey = 0;			} else if ( keysym==XK_D ) {				pkey = 1; 				tkey = 1;			} else if ( keysym==XK_i ) {				pkey = 2; 				tkey = 0;			} else if ( keysym==XK_I ) {				pkey = 2; 				tkey = 1;			} else if (keysym==XK_p) {				pkey = 3;			}			if (pkey<=3) {				xMousePicks(dpy,win,event,style,					topmutecolor,bottommutecolor,					mpicksfp, x,y,width,height,					x1begb,x1endb,x2begb,x2endb,					xtp,tp,&ntp,xbt,bt,&nbt,pkey,tkey,gci,					&savebg);			} else if (keysym==XK_s) {				xMousePrint(dpy,win,event,style,					mpicksfp, x,y,width,height,					x1begb,x1endb,x2begb,x2endb,					pcard,ppos,xtp,tp,ntp,xbt,bt,nbt,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);

⌨️ 快捷键说明

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