📄 xpicker.c
字号:
/** added by Bill Lutter 10/96 */ /* Read in header values (allowable pick.x2 values and also */ /* allowable values (for these traces) in pick file */ off = read_keyval(x2file,&ioff,verbose); if (verbose) warn("x-axis value 0: %f\n",off[0]); if (verbose) warn("x-axis value ioff: %d %f\n",ioff,off[ioff]); } else { /* use n2 and x2 for the "ioff" and "off" values */ ioff = n2; off = ealloc1float(ioff); memcpy( (void *) off, (const void *) x2, n2*FSIZE); } /* dynamically allocate memory for picks - Bill Lutter */ cpick = (pick_t *) malloc(pickdimax*sizeof(struct pick_tag )); apick = &cpick; init_picks(apick,&pickdimax,&pickdimend); /* set up file to save mouse picks */ if (!getparstring("mpicks", &mpicks)) mpicks = "pick_file"; mpicksfp = efopen(mpicks, "w"); /* 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, subtract bias */ if (getparfloat("bias",&bias) && bias!=0.0) for (iz=0; iz<nz; iz++) z[iz] -= bias; /* if necessary, determine clip from percentile */ if (!getparfloat("clip",&clip)) { perc = 100.0; getparfloat("perc",&perc); temp = ealloc1float(nz); for (iz=0; iz<nz; iz++) temp[iz] = fabs(z[iz]); iz = (nz*perc/100.0); if (iz<0) iz = 0; if (iz>nz-1) iz = nz-1; qkfind(iz,nz,temp); clip = temp[iz]; free1float(temp); } verbose = 1; getparint("verbose",&verbose); if (verbose) warn("clip=%g",clip); /* get wiggle-trace-variable-area parameters */ wt = 1; getparint("wt",&wt); va = 1; getparint("va",&va); xcur = 1.0; getparfloat("xcur",&xcur); /* 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); getparstring("title",&title); getparstring("titlefont",&titlefont); titlesize = 24.0; getparfloat("titlesize",&titlesize); getparstring("style",&styles); if (STREQ("seismic",styles)) style = SEISMIC; else err("Sorry, only style=seismic is currently available!"); getparstring("titlecolor",&titlecolor); getparstring("labelcolor",&labelcolor); getparstring("gridcolor",&gridcolor); /* initialize zoom box parameters */ 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); /* set endian for display */ if (!getparint("endian",&endian)){ if (BitmapBitOrder(dpy)==LSBFirst) endian=0; else if (BitmapBitOrder(dpy)==MSBFirst) endian=1; else endian=CWPENDIAN; } /* set interpolation flag for display */ if (!getparint("interp",&interp)) interp = 0; /* create window */ win = xNewWindow(dpy,xbox,ybox, wbox+COMMAND_WIDTH,hbox,black,white,"xpicker"); /* make GC for image */ gci = XCreateGC(dpy,win,0,NULL); /* copy this stuff for garnish's stupid global variables */ display=dpy; window=win; gc=XCreateGC(dpy,win,0,NULL); /* GC for cross hairs */ rgc = XCreateGC(dpy,win,0,NULL); XSetFunction(dpy,rgc,GXxor); XSetForeground(dpy,rgc,0xffffff); XSetBackground(dpy,rgc,0); mask = BlackPixel(dpy,scr) ^ WhitePixel(dpy,scr); XSetPlaneMask(dpy,rgc,mask); /* make sure foreground/background are black/white */ XSetForeground(dpy,gci,black); XSetBackground(dpy,gci,white); /* set normal event mask */ XSelectInput(dpy,win, StructureNotifyMask | ExposureMask | KeyPressMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | Button1MotionMask | Button2MotionMask | Button3MotionMask); /* map window */ XMapWindow(dpy,win); /* clear the window */ XClearWindow(dpy,win); /* determine good size for axes box */ xSizeAxesBox(dpy,win, labelfont,titlefont,style, &x,&y,&width,&height); width-=COMMAND_WIDTH; /*had to make room for command buttons on left*/ /* note that image is out of date */ imageOutOfDate = 1; sprintf(pick_fname,mpicks); num_wiggles=n2; init_stuff(wbox,num_wiggles,&filename_input,pick_fname, &control_mode,&edit_mode,&cross_mode); /* 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); /*had to make room for command buttons on left*/ width-=COMMAND_WIDTH; /* clear the window */ XClearWindow(dpy,win); init_stuff(winwidth,num_wiggles, &filename_input,pick_fname, &control_mode,&edit_mode,&cross_mode); /* 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)); draw_command_bar(winwidth,filename_input,pick_fname, control_mode,edit_mode, cross_mode); /* if necessary, make new image */ if (imageOutOfDate) { if (image!=NULL) { /* free1(image->data); */ XDestroyImage(image); } image = newBitmap(dpy,width,height, n1,d1,f1,n2,x2,z, x1begb,x1endb,x2begb,x2endb, xcur,clip,wt,va, &p2beg,&p2end,endian,interp); imageOutOfDate = 0; } /* 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,p2beg,p2end, d2num,f2num,n2tic,grid2,label2, labelfont,title,titlefont, labelcolor,titlecolor,gridcolor, style); if (control_mode==PICK_MODE) { /*display pick points if in pick mode*/ for(i=0;i<pickdimax;i++) if((*apick)[i].picked) draw_pick(dpy,win,blue_r_gc, *apick,i, x,y, width,height, x1begb,x1endb, x2begb,x2endb, p2beg,p2end); } /* else if key down */ } else if (event.type==KeyPress) { XLookupString( (XKeyEvent*) &event, (char*) keybuf, (int) 1, (KeySym*) &keysym, (XComposeStatus*) &keystat); if(control_mode==REGULAR_MODE) { if (keysym==XK_s) { xMousePrint(event,style, mpicksfp, x,y,width,height, x1begb,x1endb,x2begb,x2endb); } else if (keysym==XK_q || keysym==XK_Q) { /* This is the exit from the event loop */ break; } else { continue; } } else { /*must be pick mode*/ if(keysym==XK_Delete || keysym==XK_BackSpace) DeleteTextSetChar(0); else if (keysym == XK_Left) TextLineBack(0); else if (keysym == XK_Right) TextLineForward(0); else if (keysym == XK_Up) TextLineUp(0); else if (keysym == XK_Down) TextLineDown(0); 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); } /* 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,red_r_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*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -