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

📄 xpicker.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 4 页
字号:
	for(i=0;i<*pickdimax;i++) {		if((*apick)[i].picked) {			if (x1x2==0) {			fprintf(fp,"%f %f\n",(*apick)[i].x2,(*apick)[i].time);			} else {			fprintf(fp,"%f %f\n",(*apick)[i].time,(*apick)[i].x2);			}    		}	}	fclose(fp);	warn("Pick output successful");}void load_picks(pick_t **apick, int num_wiggles, char *fname,      int *pickdimax, int *pickdimend, int verbose, int x1x2){	FILE *fp;	int i,num_picks = num_wiggles/*dummy*/;	float xval,time;	if((fp=fopen(fname,"r+")) == NULL)		err("Could not open pick input file '%s'",fname);	 /* fscanf(fp,"%d\n",&num_picks); *//* dynamically reallocate memory for picks if necessary  - Bill Lutter    */     realloc_picks(apick, num_picks, pickdimax, pickdimend,verbose);	for(i=0;i<num_picks;i++) {		++*pickdimend;		if (x1x2==0) {			fscanf(fp,"%f %f\n",&xval,&time);		} else {			fscanf(fp,"%f %f\n",&time,&xval);		}		(*apick)[*pickdimend-1].picked=TRUE;		(*apick)[*pickdimend-1].x2=xval;		(*apick)[*pickdimend-1].time=time;       printf("load: %d %f %f %d \n",*pickdimend,(*apick)[*pickdimend-1].x2,	   (*apick)[*pickdimend-1].time,(*apick)[*pickdimend-1].picked);	}	printf("load: end %d max %d  \n",*pickdimend,*pickdimax);	fclose(fp);	warn("Pick input successful");}void edit_pick(Display *dpy, Window win, GC gc, XEvent event,	       int style, int x, int y,	       int width, int height,	       pick_t **apick, int num_wiggles,	       float x1begb, float x1endb,	       float x2begb, float x2endb,	       float p2beg, float p2end,	       int control_mode,	       int edit_mode,	       int cross_mode,	       int *pickdimax,	       int *pickdimend,	       int ioff, float *off, int verbose){  		int done=FALSE;		float fy;		int oldy=num_wiggles/*dummy*/;		int pick_num;		int pick_x;		float scale,base;/*    Added by bill Lutter	   */		int ihead = -1;				if((control_mode==PICK_MODE) &&			(event.xbutton.x > x) &&			(event.xbutton.x < x+width) &&			(event.xbutton.y > y) &&			(event.xbutton.y < y+height)) {			if(edit_mode==DELETE_MODE) {				pick_num = (int)(p2beg+x2begb+(p2end+x2endb-x2begb-p2beg)*			       (event.xbutton.x-x)/width+0.5);				fy=x1begb+(x1endb-x1begb)*(event.xbutton.y-y)/height;/* existence of x2file= file with x-axis header values is   indicated by positive values of "ioff".  If file does not exist   then ioff is negative.  Then use mouse derived x-axis value for pick.  */				del_pick(apick, pickdimax, pickdimend, off, ioff, 				   fy, &pick_num, &ihead,verbose);		       if ( ihead >= 0 && ihead < *pickdimend )  {				if((*apick)[ihead].picked) {					draw_pick(dpy,win,red_r_gc,*apick,ihead,						x,y, width,height, x1begb,						x1endb, x2begb,x2endb,						p2beg,p2end);					(*apick)[ihead].picked=FALSE;      				}		 	}			} else {				fy=x1begb+(x1endb-x1begb)*(event.xbutton.y-y)/height;				pick_num = (int)(p2beg+x2begb+(p2end+x2endb-x2begb-p2beg)*				(event.xbutton.x-x)/width+0.5);				add_pick(apick, pickdimax, pickdimend, off, ioff, 				   fy, &pick_num, &ihead,verbose); /*			       if((*apick)[pick_num-1].picked) {					draw_pick(dpy,win,red_r_gc,*apick,pick_num,							x,y, width,height,		 					x1begb,x1endb,							x2begb,x2endb,							p2beg,p2end);				}   */      			scale = width/(x2endb+p2end-x2begb-p2beg);			base = x-scale*(x2begb+p2beg);			pick_x = base+scale*pick_num-0.5;			oldy=event.xbutton.y;			draw_seg(dpy,win,gc,pick_x,oldy);			xMouseLoc(dpy,win,event,style,True,				x,y,width,height,x1begb,x1endb,				x2begb,x2endb,p2beg,p2end);			while(!done) {				XSync(display,0);				XNextEvent(display, &event);				if(event.type == MotionNotify) {	  				draw_cross(dpy,win,red_r_gc,x,y,							width,height,		     					event.xmotion.x,							event.xmotion.y,							cross_mode,DRAW_FLAG);	  				fy=x1begb+(x1endb-x1begb)*(event.xmotion.y-y)/height;	  				draw_seg(dpy,win,gc,pick_x,oldy);	  				oldy=event.xmotion.y;	  				draw_seg(dpy,win,gc,pick_x,oldy);	  				xMouseLoc(dpy,win,event,style,True,		    				x,y,width,height,x1begb,x1endb,		    				x2begb,x2endb,p2beg,p2end);				}				if(event.type == ButtonRelease) {					done=TRUE;				}      			}		}	}}void draw_pick(Display *dpy, Window win, GC gc, pick_t *pick, int i,	       int xmargin, int ymargin,	       int width, int height,	       float x1begb, float x1endb,	       float x2begb, float x2endb,	       float p2beg, float p2end){	int x,y;	float scale,base;	scale = width/(x2endb+p2end-x2begb-p2beg);	base = xmargin-scale*(x2begb+p2beg);/*	x = base+scale*i-0.5;     */  	x = base+scale*(pick[i].x2)-0.5;       	y=ymargin+x1begb+(pick[i].time-x1begb)/(x1endb-x1begb)*height;	printf("DRAW: %d %f %f \n",i,pick[i].x2,pick[i].time);	draw_seg(dpy,win,gc,x,y);}void check_buttons(Display *dpy, Window win, GC gc,XEvent event,pick_t **apick, 		   int num_wiggles,		   int x, int y,		   int winwidth, int height,		   float x1begb, float x1endb,		   float x2begb, float x2endb,		   float p2beg, float p2end,		   TextSet *filename_input,		   char *pick_fname,		   int *control_mode,		   int *edit_mode,		   int *cross_mode,		   int *pickdimax,		   int *pickdimend,	           int verbose,		   int x1x2){	int mx=event.xbutton.x;	int my=event.xbutton.y;	if(gc != gc)	height += 0;  x+= 0;  y += 0; /* keep compiler happy */	x1begb += 0.0; x1endb += 0.0; /* keep compiler happy */	x2begb += 0.0; x2endb += 0.0; /* keep compiler happy */	p2beg  += 0.0; p2end  += 0.0; /* keep compiler happy */	if(mx>winwidth-COMMAND_WIDTH-10 &&	      mx<winwidth-COMMAND_WIDTH+BUTTON_WIDTH-10) {		if(my>BUTTON_HEIGHT*1-(char_height+10) && my<BUTTON_HEIGHT*1) {			AddTextSetString(filename_input,"");			filename_input->char_pos=0;			RefreshTextSet(filename_input);    		}		if(my>BUTTON_HEIGHT*2 && my<BUTTON_HEIGHT*3) {    /*LOAD*/			NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*2,				BUTTON_WIDTH,BUTTON_HEIGHT,				DOWN,grey_color,black_color,				"Load",char_width,char_height,RELATIVE);				GetTextLineString(filename_input,0,pick_fname);			   if (verbose) warn("before load: 1: %lu 2: %lu",					(unsigned long) *apick, (unsigned long) *apick+1);				load_picks(apick,num_wiggles,pick_fname,				 pickdimax, pickdimend,verbose,x1x2);			   if (verbose) warn("after load: 1: %lu 2: %lu",					(unsigned long) *apick, (unsigned long) *apick+1);      			/* force expose event */			XClearArea(dpy,win,0,0,0,0,True);	      			NewButton(window,winwidth-COMMAND_WIDTH-10,				BUTTON_HEIGHT*2,				BUTTON_WIDTH,BUTTON_HEIGHT,				UP,grey_color,black_color,				"Load",char_width,char_height,RELATIVE);    		}		if(my>BUTTON_HEIGHT*4 && my<BUTTON_HEIGHT*5) {   /*save*/			NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4,				BUTTON_WIDTH,BUTTON_HEIGHT,				DOWN,grey_color,black_color,				"Save",char_width,char_height,RELATIVE);				GetTextLineString(filename_input,0,pick_fname);			   if (verbose) warn("before save: 1: %lu 2: %lu",				(unsigned long) *apick, (unsigned long) *apick+1);      				save_picks(apick,num_wiggles,pick_fname,				 pickdimax,pickdimend,verbose,x1x2);			   if (verbose) warn("after save: 1: %lu 2: %lu",				(unsigned long) *apick,(unsigned long) *apick+1);			NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4,				BUTTON_WIDTH,BUTTON_HEIGHT,				UP,grey_color,black_color,				"Save",char_width,char_height,RELATIVE);		}    		if(my>BUTTON_HEIGHT*6 && my<BUTTON_HEIGHT*7) {   /*control mode*/				*control_mode=!(*control_mode);      			if(*control_mode==PICK_MODE) {				SetCurrentTextSet(filename_input,DOWN);			} else {				SetCurrentTextSet(filename_input,UP);      			}			/* force expose event */			XClearArea(dpy,win,0,0,0,0,True);				NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*6,				BUTTON_WIDTH,BUTTON_HEIGHT,				UP,grey_color,black_color,				(*control_mode==PICK_MODE) ? "Pick" : "View only",				char_width,char_height,RELATIVE);    		}		if(my>BUTTON_HEIGHT*8 && my<BUTTON_HEIGHT*9) {  /*edit mode*/			*edit_mode = !(*edit_mode);			NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*8,				BUTTON_WIDTH,BUTTON_HEIGHT,				UP,grey_color,black_color,				(*edit_mode==ADD_MODE) ? "Add" : "Delete",				char_width,char_height,RELATIVE);    		}		if(my>BUTTON_HEIGHT*10 && my<BUTTON_HEIGHT*11) {  /*crosshair toggle*/			*cross_mode = !(*cross_mode);			NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*10,				BUTTON_WIDTH,BUTTON_HEIGHT,				UP,grey_color,black_color,				(*cross_mode) ? "Cross On" : "Cross Off",				char_width,char_height,RELATIVE);		}	}}void draw_command_bar(int winwidth, TextSet *filename_input,		      char *pick_fname, int control_mode, int edit_mode,		      int cross_mode){	/* load button */	NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*2,			BUTTON_WIDTH,BUTTON_HEIGHT,			UP,grey_color,black_color,			"Load",char_width,char_height,RELATIVE);	/* save button */	NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4,			BUTTON_WIDTH,BUTTON_HEIGHT,			UP,grey_color,black_color,			"Save",char_width,char_height,RELATIVE);	/* command-mode button */	NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*6,			BUTTON_WIDTH,BUTTON_HEIGHT,			UP,grey_color,black_color,			(control_mode==PICK_MODE) ? "Pick" : "View Only",			char_width,char_height,RELATIVE);  	/* edit-mode button */	NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*8,			BUTTON_WIDTH,BUTTON_HEIGHT,			UP,grey_color,black_color,			(edit_mode==ADD_MODE) ? "Add" : "Delete",			char_width,char_height,RELATIVE);	/* cross-hair toggle */	NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*10,			BUTTON_WIDTH,BUTTON_HEIGHT,			UP,grey_color,black_color,			(cross_mode) ? "Cross On" : "Cross Off",			char_width,char_height,RELATIVE);	AddTextSetString(filename_input,pick_fname);	if(control_mode==PICK_MODE) 		SetCurrentTextSet(filename_input,DOWN);	else		SetCurrentTextSet(filename_input,UP);		RefreshTextSet(filename_input);	/* 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 draw_seg(Display *dpy, Window win, GC gc, int x, int y){	XDrawLine(dpy,win,gc,x-10,y+5,x,y);	XDrawLine(dpy,win,gc,x-10,y-5,x,y);}float *read_keyval(char *x2file,int *ioff,int verbose){	char line[80];	float off_tmp;	float *off;     /* pointer for 1-d float array */	int keyvalnum;	FILE *infpoff;/* Read in header values (allowable pick.x2 values and also   allowable values (for these traces) in pick file  */	  keyvalnum = 10;	  infpoff = fopen(x2file,"r");	  off = (float *) malloc(keyvalnum*sizeof(float ));	  if (infpoff == 0 ) {	    *ioff = -99;	  } else {	    *ioff = -1; 	    while ( fgets(line,81,infpoff) != 0 && line[0] != '\n' )	    {	       ++*ioff;	       if ( *ioff >= (keyvalnum - 2 ) ) {		  keyvalnum = 2 * keyvalnum;		  off = (float *) realloc(off,keyvalnum*sizeof(float ));	       }	       sscanf(line,"%f",&off_tmp);	       *(off + *ioff) = off_tmp;		if (verbose) warn("x-axis value  %d %f",*ioff,off[*ioff]);	    }	  }	  return(off);}void realloc_picks(pick_t **apick, int more, int *pickdimax, int *pickdimend,			int verbose){	    int i;   /* loop counter *//* dynamically reallocate memory for picks  - Bill Lutter    */	    if ( (more + *pickdimend) >=  *pickdimax - 2 )	    {	      *pickdimax =  2*( *pickdimax + more );			   if (verbose) warn("before realloc: 1: %lu 2: %lu",				(unsigned long) *apick, (unsigned long) *apick+1);	     *apick = (pick_t *) realloc(*apick,*pickdimax*sizeof(struct pick_tag ));			   if (verbose) warn("after realloc: 1: %lu 2: %lu\n",				(unsigned long) *apick, (unsigned long) *apick+1);		if(*apick==NULL)  err("Could not allocate picks!");		for(i= *pickdimend;i< *pickdimax;i++) {			(*apick)[i].picked=FALSE;    		}   	}}void init_picks(pick_t **apick, int *pickdimax, int *pickdimend){int i = pickdimend[0]/*dummy*/;/* dynamically allocate memory for picks  - Bill Lutter    */		if(*apick==NULL) err("Could not allocate picks!");		for(i=0;i<*pickdimax;i++) {			(*apick)[i].picked=FALSE;    		}}void add_pick(pick_t **apick, int *pickdimax, int *pickdimend,	     float *off, int ioff, 	     float fy, int *pick_num, int *ihead, int verbose){	   int i, more=1;	   float dxval, dxmin=100000.;/* dynamically reallocate memory for picks  - Bill Lutter    */	    realloc_picks(apick, more, pickdimax, pickdimend, verbose);  /* existence of x2file= file with x-axis header values is   indicated by positive values of "ioff".  If file does not exist   then ioff is negative.  Then use mouse derived x-axis value for pick.  */			      if (ioff >= 0 ) {				for (i=0;i <= ioff; i++) {				   dxval = abs(off[i] - *pick_num);				   if ( dxval <= dxmin) {				      *ihead = i;				      dxmin = dxval;   				   }				}   				*pick_num = off[*ihead];			      }   			       (*apick)[*pickdimend].x2 = *pick_num;			       (*apick)[*pickdimend].time = fy;			       (*apick)[*pickdimend].picked=TRUE;		   printf("ADD (x,t): (%d, %f) pick(i,x,t): (%d, %f, %f)\n",		   *pick_num, fy,*pickdimend,(*apick)[*pickdimend].x2,(*apick)[*pickdimend].time);			       ++*pickdimend;}void del_pick(pick_t **apick, int *pickdimax, int *pickdimend,	     float *off, int ioff, 	     float fy, int *pick_num, int *ihead, int verbose){int i = pickdimax[0]/*dummy*/;float dxmin=100000., dxval,dtval;			      if (ioff >= 0 ) {				for (i=0;i <= ioff; i++) {				   dxval = abs(off[i] - *pick_num);				   if ( dxval <= dxmin) {				      *ihead = i;				      dxmin = dxval;   				   }				}   				if (*ihead >=0 )				   *pick_num = off[*ihead];			      }/* search for pick to delete */   			      dxmin = 10000000.;			      *ihead = -1;			      for (i=0;i < *pickdimend; i++) {				dxval = (*apick)[i].x2 - *pick_num;				dxval = dxval * dxval;				dtval = fy - (*apick)[i].time; 				dtval = dtval * dtval;				dxval = dxval + dtval;				 if ( dxval <= dxmin) {				    *ihead = i;				    dxmin = dxval;				 } 			       }		   if (verbose) warn("DEL (x,t): (%d, %f) pick(i,x,t): (%d, %f, %f)",		    *pick_num, fy,*ihead,(*apick)[*ihead].x2,(*apick)[*ihead].time);}

⌨️ 快捷键说明

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