📄 ximage.c
字号:
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("normal",styles)) style = NORMAL; else style = SEISMIC; getparstring("titlecolor",&titlecolor); getparstring("labelcolor",&labelcolor); getparstring("gridcolor",&gridcolor); getparstring("windowtitle",&windowtitle); /* 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); keep data for plotting GK */ /* initialize zoom box parameters */ dx = (style==NORMAL ? d1 : d2); dy = (style==NORMAL ? d2 : d1); 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,(int) black,(int) white,windowtitle); /* backwards compatibility */ if (STREQ(cmap,"gray")) { sprintf(cmap,"%s","rgb0"); } else if (STREQ(cmap,"hue")) { /* free1(cmap); */ cmap = (char *)alloc1(5,1); sprintf(cmap,"%s","hsv1"); } else if ((strncmp(cmap,"hsv",3)) && (strncmp(cmap,"rgb",3))){ if (verbose) warn ("cmap=%s using cmap=gray", cmap); /* free1(cmap); */ cmap = (char *)alloc1(5,1); sprintf (cmap, "%s", "rgb0"); } /* here are the new colormaps */ 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); if (verbose) warn("pmin=%x,pmax=%x\n",pmin,pmax); if(pmax==0L)pmax=255L; if (verbose) warn("pmin=%x,pmax=%x\n",pmin,pmax); data_legend = (unsigned char *) malloc(lwidth * lheight); if( bclip < wclip ){ base=256; fact=-256.0; }else{ base=0; fact=256.0; } ptr = data_legend; for (i=0; i<lheight; i++){ for( j=0; j<lwidth; j++ ){ *ptr++ = (unsigned char) (base + (fact*i)/lheight); } /* fprintf(stderr," %d ",*(ptr-1) ); */ } /* 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; /* main event loop */ while(imageOutOfDate|(~imageOutOfDate)/*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 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) { czbi = newInterpBytes(nxb,nyb,czb, width,height,blockinterp); if (image!=NULL) XDestroyImage(image); image = xNewImage(dpy,pmin,pmax, width,height,blank,czbi); /* BEREND create image */ if (legend) { if (image_legend!=NULL) XDestroyImage(image_legend); image_legend = xNewImage(dpy,pmin,pmax,lwidth,lheight,0,data_legend); } imageOutOfDate = 0; } /* draw image (before axes so grid lines visible) */ XPutImage(dpy,win,gci,image,0,0,x,y, image->width,image->height); /* BEREND display image */ if (legend) XPutImage(dpy,win,gci,image_legend, 0,0,lx,y+ly,lwidth,lheight); /* BEREND draw legend axes on top of image */ if (legend) xDrawLegendBox(dpy,win, lx,y+ly,lwidth,lheight, bclip,wclip,units,legendfont, labelfont,title,titlefont, labelcolor,titlecolor,gridcolor, style); /* draw curve on top of image */ for (i=0; i<curve; i++) xDrawCurve(dpy,win, x,y,width,height, x1begb,x1endb,0.0,0.0, x2begb,x2endb,0.0,0.0, x1curve[i],x2curve[i],npair[i], curvecolor[i],style); /* 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.xkey),keybuf,0,&keysym,&keystat); /* added moving, clipping and zooming GK */ if (keysym==XK_s) { xMousePrint(event,style, mpicksfp, x,y,width,height, x1begb,x1endb,x2begb,x2endb); } else if (keysym==XK_l ) { /* set lock */ lock = 1 ; if (verbose) warn("zoom lock set %d\n",lock); } else if (keysym==XK_u ) { /* unset lock */ lock = 0 ; if (verbose) warn("zoom lock released %d\n",lock); } else if (keysym==XK_Shift_L ) { /* if (verbose) fprintf(stderr,"Shift Left pressed \n");*/ } else if (keysym==XK_KP_1 || keysym==XK_1 ) { mvefac=1.; fprintf(stderr,"Zoom/Move factor = 1 \n"); } else if (keysym==XK_KP_2 || keysym==XK_2 ) { mvefac=2.; fprintf(stderr,"Zoom/Move factor = 2 \n"); } else if (keysym==XK_KP_3 || keysym==XK_3 ) { mvefac=3.; if (verbose) fprintf(stderr,"Zoom/Move factor = 3 \n"); } else if (keysym==XK_KP_4 || keysym==XK_4 ) { mvefac=4.; if (verbose) fprintf(stderr,"Zoom/Move factor = 4 \n"); } else if (keysym==XK_KP_5 || keysym==XK_5 ) { mvefac=5.; if (verbose) fprintf(stderr,"Zoom/Move factor = 5 \n"); } else if (keysym==XK_KP_6 || keysym==XK_6 ) { mvefac=6.; if (verbose) fprintf(stderr,"Zoom/Move factor = 6 \n"); } else if (keysym==XK_KP_7 || keysym==XK_7 ) { mvefac=7.; if (verbose) fprintf(stderr,"Zoom/Move factor = 7 \n"); } else if (keysym==XK_KP_8 || keysym==XK_8 ) { mvefac=8.; if (verbose) fprintf(stderr,"Zoom/Move factor = 8\n"); } else if (keysym==XK_KP_9 || keysym==XK_9 ) { mvefac=9.; if (verbose) fprintf(stderr,"Zoom/Move factor = 9\n"); } else if (keysym==XK_Left ) { /* move zoom box to left by half window width */ mve = (x2endb - x2begb)/mvefac ; x2begb = x2begb - mve ; x2endb = x2endb - mve ; msg="move "; /* check for bounds of full window */ if (x2begb < x2beg){ if ( lock ) { x2begb = x2begb + mve ; x2endb = x2endb + mve ; msg="limit "; mve=0; } else { x2begb = x2beg ; nxb=(int)((x2endb-x2begb)/dx); } } if (verbose) fprintf(stderr,"%s %g\n",msg,mve); ixb+=-(int)(mve/dx); if ( (ixb<0) || ((ixb+nxb)>nx) || (nxb<2) || (nxb>nx)) {ixb=0;nxb=nx; x2begb=x2beg; x2endb=x2end;} 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 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_Right ) { /* move zoom box to right by half window width*/ mve = (x2endb - x2begb)/mvefac ; x2begb = x2begb + mve ; x2endb = x2endb + mve ; msg="move "; /* check for bounds of full window */ if (x2endb > x2end){ if ( lock ) { x2begb = x2begb - mve ; x2endb = x2endb - mve ; msg="limit "; mve=0; } else { x2endb = x2end; nxb=(int)((x2endb-x2begb)/dx); } } if (verbose) fprintf(stderr,"%s %g\n",msg,mve); /* for replot require * ixb,iyb start samples of image * nxb,nyb number of samples of image */ ixb+=(int)(mve/dx); if ( (ixb<0) || ((ixb+nxb)>nx) || (nxb<2) ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -