=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/plot/smoothing.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- OpenXM_contrib2/asir2000/plot/smoothing.c 2000/10/15 06:56:53 1.1 +++ OpenXM_contrib2/asir2000/plot/smoothing.c 2000/11/08 05:49:35 1.4 @@ -1,4 +1,4 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM_contrib2/asir2000/plot/smoothing.c,v 1.3 2000/10/24 01:53:53 takayama Exp $ */ #include "ca.h" #include "parse.h" #include "ox.h" @@ -24,6 +24,7 @@ static struct polyLine *polyLine_addNewSegment(struct int x,int y); static int polyLine_lastY(struct polyLine *pl); static void polyLine_outputPS(struct polyLine *pl); +static void polyLine_output_bezier_PS(struct polyLine *pl); static void polyLine_outputProlog(int xmin, int ymin, int xmax, int ymax); static void polyLine_outputEpilog(void); static void polyLine_error(char *s); @@ -41,6 +42,10 @@ static int Ysize = 0; static int updatePolyLine(struct polyLine *pl[], int plSize, int prev[], int Curr[], int x); +static void polyLine_outputPS_dashed_line(int x0,int y0,int x1,int y1); +static int polyLine_pline(struct canvas *can); +static int Strategy_generate_PS = 0; + static void *gcmalloc(a) { void *m; /* BUG: interruption must be locked. */ @@ -111,6 +116,28 @@ static void polyLine_outputPS(struct polyLine *pl) { } fflush(Fp); } +static void polyLine_output_bezier_PS(struct polyLine *pl) { + int n,i,m; + n = pl->numberOfSegments; + if (n == 1) { + fprintf(Fp," %d %d ifplot_putpixel\n",translateX(pl->x[0]),translateY(pl->y[0])); + }else if (n > 1) { + fprintf(Fp," newpath "); + i=0; + m = n-1-((n-1)/3)*3; + fprintf(Fp," %d %d ",translateX(pl->x[i]),translateY(pl->y[i])); + fprintf(Fp," moveto \n "); + for (i=1; i<= ((n-1)/3)*3; i++) { + fprintf(Fp," %d %d ",translateX(pl->x[i]),translateY(pl->y[i])); + if ( i%3 == 0) fprintf(Fp," curveto "); + } + for (i=n-m; ix[i]),translateY(pl->y[i])); + } + fprintf(Fp," stroke\n"); + } + fflush(Fp); +} static void polyLine_outputProlog(int xmin, int ymin,int xmax, int ymax) { fprintf(Fp,"%%!PS-Adobe-1.0\n"); fprintf(Fp,"%%%%BoundingBox: %d %d %d %d \n", @@ -119,6 +146,9 @@ static void polyLine_outputProlog(int xmin, int ymin,i fprintf(Fp,"%%%%Creator: This is generated by ifplot\n"); fprintf(Fp,"%%%%Title: ifplot\n"); fprintf(Fp,"%%%%EndComments: \n"); + fprintf(Fp,"0.1 setlinewidth \n"); + fprintf(Fp,"2 setlinecap \n"); + fprintf(Fp,"2 setlinejoin \n"); fprintf(Fp,"/ifplot_putpixel { \n"); fprintf(Fp," /yyy 2 1 roll def /xxx 2 1 roll def \n"); fprintf(Fp," gsave newpath xxx yyy .5 0 360 arc \n"); @@ -179,7 +209,8 @@ static int updatePolyLine(struct polyLine *pl[], int p } for (i=1; i<=Ysize; i++) { if (prevHasNext[i] == NO && prev[i] IS_POLYLINE) { - polyLine_outputPS(pl[prev[i]]); + /* polyLine_outputPS(pl[prev[i]]); */ + polyLine_output_bezier_PS(pl[prev[i]]); } } @@ -253,14 +284,75 @@ main() { } */ +static void polyLine_outputPS_dashed_line(int x0,int y0,int x1,int y1) { + extern FILE *Fp; + fprintf(Fp," gsave [3] 0 setdash newpath \n"); + fprintf(Fp," %d %d moveto %d %d lineto stroke \n",x0,y0,x1,y1); + fprintf(Fp," stroke grestore \n"); +} +#define D 5 +static int polyLine_pline(can) +struct canvas *can; +{ + double w,w1,k,e,n; + int x0,y0,x,y,xadj,yadj; + char buf[BUFSIZ]; + double adjust_scale(); + + if ( can->noaxis ) + return; + + xadj = yadj = 0; + if ( (can->xmin < 0) && (can->xmax > 0) ) { + x0 = (int)((can->width-1)*(-can->xmin/(can->xmax-can->xmin))); + polyLine_outputPS_dashed_line(translateX(x0),translateY(0), + translateX(x0),translateY(can->height)); + } else if ( can->xmin >= 0 ) + x0 = 0; + else + x0 = can->width-1-D; + if ( (can->ymin < 0) && (can->ymax > 0) ) { + y0 = (int)((can->height-1)*(can->ymax/(can->ymax-can->ymin))); + polyLine_outputPS_dashed_line(translateX(0),translateY(y0), + translateX(can->width),translateY(y0)); + } else if ( can->ymin >= 0 ) + y0 = can->height-1; + else + y0 = D; + /* BUG: not written yet a code for PS. + w = can->xmax-can->xmin; + w1 = w * DEFAULTWIDTH/can->width; + e = adjust_scale(EXP10(floor(log10(w1))),w1); + for ( n = ceil(can->xmin/e); n*e<= can->xmax; n++ ) { + x = (int)can->width*(n*e-can->xmin)/w; + DRAWLINE(display,d,drawGC,x,y0,x,y0-D); + sprintf(buf,"%g",n*e); + DRAWSTRING(display,d,scaleGC,x+2,y0,buf,strlen(buf)); + } + w = can->ymax-can->ymin; + w1 = w * DEFAULTHEIGHT/can->height; + e = adjust_scale(EXP10(floor(log10(w1))),w1); + for ( n = ceil(can->ymin/e); n*e<= can->ymax; n++ ) { + y = (int)can->height*(1-(n*e-can->ymin)/w); + DRAWLINE(display,d,drawGC,x0,y,x0+D,y); + sprintf(buf,"%g",n*e); + if ( can->xmax <= 0 ) + xadj = TEXTWIDTH(sffs,buf,strlen(buf)); + DRAWSTRING(display,d,scaleGC,x0-xadj,y,buf,strlen(buf)); + } + */ +} + generatePS_from_image(FILE *fp,XImage *image,int xsize, int ysize, - int color[],int colorSize) { + int color[],int colorSize, + struct canvas *can) { struct polyLine **pl; int plSize = 0; int *prev; int *curr; int i,x,y,c; + extern int Strategy_generate_PS; Xsize = xsize; Ysize = ysize; @@ -269,25 +361,44 @@ generatePS_from_image(FILE *fp,XImage *image,int xsize curr = (int *)gcmalloc(sizeof(int)*(Ysize+2)); Fp = fp; polyLine_outputProlog(0,0,Xsize,Ysize); - for (c=0; c