Bill Allombert on Mon, 12 Sep 2005 19:42:16 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: object-oriented graphic engine |
On Fri, Aug 26, 2005 at 02:06:23PM +0200, Bill Allombert wrote: > Hello PARI-dev, > > I would like to propose a rewrite of the graphic code in > an object-oriented fashion to avoid duplication. > This one follow more closely the RectObj code. > > Once this patch is accepted, we should use gen_rectdraw0 for the > other graphic output. Since Karim has commited this patch, I propose the sequel for plotfltk and plotQt. Warning: they are C++ files and I am not fluent in this idiom... Maybe we could clean up the interface by letting gen_rectdraw computing xs and ys. We should probably rename gen_rectdraw. Cheers, Bill.
Index: src/graph/plotfltk.c =================================================================== RCS file: /home/cvs/pari/src/graph/plotfltk.c,v retrieving revision 1.10 diff -u -r1.10 plotfltk.c --- src/graph/plotfltk.c 5 Dec 2004 18:35:16 -0000 1.10 +++ src/graph/plotfltk.c 12 Sep 2005 17:37:01 -0000 @@ -29,21 +29,14 @@ #include <FL/Fl_Window.H> #include <FL/fl_draw.H> -typedef struct Point_s {long x, y;} Point; -typedef struct Rectangle_s {long x, y, width, height;} Rectangle; -typedef struct Segment_s {long x1, y1, x2, y2;} Segment; -typedef char* String; - class Plotter: public Fl_Window { public: //Plotter(int x, int y, int w, int h, const char // *label = 0); Plotter( long *w, long *x, long *y, long lw, const char* name = 0); - ~Plotter(); private: - void alloc(); void draw(); int handle(int event); @@ -52,17 +45,7 @@ long *my_x; // x, y: array of x,y-coordinates of the long *my_y; // top left corners of the rectwindows long my_lw; // lw: number of rectwindows - col_counter rcolcnt; - long rcnt[ROt_MAX+1]; - Point *points[MAX_COLORS]; - Segment *seg[MAX_COLORS]; - Point **lines[MAX_COLORS]; - Rectangle *rec[MAX_COLORS]; - Point *textPos[MAX_COLORS]; - String *texts[MAX_COLORS]; Fl_Color color[MAX_COLORS]; - long *numpoints[MAX_COLORS]; - long *numtexts[MAX_COLORS]; }; Fl_Color rgb_color(int R, int G, int B) @@ -78,7 +61,6 @@ { this->my_w=w; this->my_x=x; this->my_y=y; this->my_lw=lw; - alloc(); color[0] = FL_WHITE; color[BLACK] = FL_BLACK; color[BLUE] = FL_BLUE; @@ -89,177 +71,71 @@ color[GAINSBORO] = rgb_color( 220, 220, 220); } -Plotter::~Plotter() { - - for( int col = 1; col < MAX_COLORS; col++) { - delete[] points[col]; - delete[] seg[col]; - delete[] rec[col]; - for(int i=0;i<rcolcnt[col][ROt_ML];i++) delete lines[col][i]; - delete[] lines[col]; - delete[] texts[col]; - delete[] numpoints[col]; - delete[] numtexts[col]; - } +static void SetForeground(void *data, long col) +{ + Fl_Color *color=(Fl_Color*) data; + fl_color(color[col]); } -void DrawPoints(Point *points,long n) +static void DrawPoint(void *data, long x, long y) { - for(int i=0;i<n;i++) - fl_point(points[i].x, points[i].y); + fl_point(x, y); +} + +static void DrawLine(void *data, long x1, long y1, long x2, long y2) +{ + fl_line(x1, y1, x2, y2); } -void DrawSegments(Segment *seg,long n) +static void DrawRectangle(void *data, long x, long y, long w, long h) { - for(int i=0;i<n;i++) - fl_line(seg[i].x1, seg[i].y1, seg[i].x2, seg[i].y2); + fl_rect(x,y, w,h); } -void DrawRectangles(Rectangle *rec, long n) +static void DrawPoints(void *data, long nb, struct plot_points *p) { - for(int i=0;i<n;i++) - fl_rect(rec[i].x,rec[i].y,rec[i].width,rec[i].height); + long i; + for (i=0;i<nb;i++) + fl_point(p[i].x, p[i].y); } -void DrawLines(Point *lines, long n) +static void DrawLines(void *data, long nb, struct plot_points *p) { - for(int i=1;i<n;i++) - fl_line(lines[i-1].x, lines[i-1].y, lines[i].x, lines[i].y); + long i; + for (i=1; i<nb; i++) + fl_line(p[i-1].x, p[i-1].y, p[i].x, p[i].y); } -void DrawString(Point textPos, String text, long n) +static void DrawString(void *data, long x, long y, char *text, long numtext) { - fl_draw(text,n,textPos.x,textPos.y); + fl_draw(text,numtext,x,y); } void Plotter::draw() { - long shift; - long j; - long hjust, vjust, hgap, vgap, hgapsize, vgapsize; + long hgapsize, vgapsize; long *w=my_w; // map into rectgraph indexes long *x=my_x; // x, y: array of x,y-coorinates of the long *y=my_y; // top left corners of the rectwindows long lw=my_lw; // lw: number of rectwindows - long *c; - long col; double xs = double(this->w())/pari_plot.width; double ys = double(this->h())/pari_plot.height; - for( int col = 1; col < MAX_COLORS; col++) { - c = rcolcnt[col]; - c[ROt_PT]=c[ROt_LN]=c[ROt_BX]=c[ROt_ML]=c[ROt_ST]=0; - } hgapsize = h_unit; vgapsize = v_unit; - for(int i=0; i<lw; i++) - { - PariRect *e=rectgraph[w[i]]; - RectObj *p1=RHead(e); - long x0=x[i],y0=y[i]; - while(p1) - { - col=RoCol(p1); c=rcolcnt[col]; - switch(RoType(p1)) - { - case ROt_PT: - points[col][c[ROt_PT]].x = DTOL((RoPTx(p1)+x0)*xs); - points[col][c[ROt_PT]].y = DTOL((RoPTy(p1)+y0)*ys); - c[ROt_PT]++;break; - case ROt_LN: - seg[col][c[ROt_LN]].x1 = DTOL((RoLNx1(p1)+x0)*xs); - seg[col][c[ROt_LN]].y1 = DTOL((RoLNy1(p1)+y0)*ys); - seg[col][c[ROt_LN]].x2 = DTOL((RoLNx2(p1)+x0)*xs); - seg[col][c[ROt_LN]].y2 = DTOL((RoLNy2(p1)+y0)*ys); - c[ROt_LN]++;break; - case ROt_BX: - rec[col][c[ROt_BX]].x = DTOL((RoBXx1(p1)+x0)*xs); - rec[col][c[ROt_BX]].y = DTOL((RoBXy1(p1)+y0)*ys); - rec[col][c[ROt_BX]].width = DTOL((RoBXx2(p1)-RoBXx1(p1))*xs); - rec[col][c[ROt_BX]].height = DTOL((RoBXy2(p1)-RoBXy1(p1))*ys); - c[ROt_BX]++;break; - case ROt_MP: - { - double *ptx = RoMPxs(p1), *pty = RoMPys(p1); - for(int j=0;j<RoMPcnt(p1);j++) - { - points[col][c[ROt_PT]+j].x = DTOL((ptx[j]+x0)*xs); - points[col][c[ROt_PT]+j].y = DTOL((pty[j]+y0)*ys); - } - c[ROt_PT]+=RoMPcnt(p1); - break; - } - case ROt_ML: - { - double *ptx=RoMLxs(p1), *pty=RoMLys(p1); - numpoints[col][c[ROt_ML]] = RoMLcnt(p1); - lines[col][c[ROt_ML]] = new Point[RoMLcnt(p1)]; - for(j=0;j<RoMLcnt(p1);j++) - { - lines[col][c[ROt_ML]][j].x = DTOL((ptx[j]+x0)*xs); - lines[col][c[ROt_ML]][j].y = DTOL((pty[j]+y0)*ys); - } - c[ROt_ML]++;break; - } - case ROt_ST: - hjust = RoSTdir(p1) & RoSTdirHPOS_mask; - vjust = RoSTdir(p1) & RoSTdirVPOS_mask; - hgap = RoSTdir(p1) & RoSTdirHGAP; - if (hgap) - hgap = (hjust == RoSTdirLEFT) ? hgapsize : -hgapsize; - vgap = RoSTdir(p1) & RoSTdirVGAP; - if (vgap) - vgap = (vjust == RoSTdirBOTTOM) ? 2*vgapsize : -2*vgapsize; - if (vjust != RoSTdirBOTTOM) - vgap -= ((vjust == RoSTdirTOP) ? 2 : 1)*(f_height - 1); - texts[col][c[ROt_ST]]=RoSTs(p1); - numtexts[col][c[ROt_ST]]=RoSTl(p1); - shift = (hjust == RoSTdirLEFT ? 0 : - (hjust == RoSTdirRIGHT ? 2 : 1)); - textPos[col][c[ROt_ST]].x - = DTOL(( RoSTx(p1) + x0 + hgap - - (strlen(RoSTs(p1)) * pari_plot.fwidth - * shift)/2)*xs); - textPos[col][c[ROt_ST]].y = DTOL((RoSTy(p1)+y0-vgap/2)*ys); - c[ROt_ST]++;break; - default: break; - } - p1=RoNext(p1); - } - } - fl_font(FL_COURIER, int(pari_plot.fheight * xs)); - fl_color(FL_WHITE); // transparent window on Windows otherwise - fl_rectf(0, 0, this->w(), this->h()); - for(col=1; col<MAX_COLORS; col++) - { - c = rcolcnt[col]; - fl_color(color[col]); - if(c[ROt_PT]) DrawPoints(points[col],c[ROt_PT]); - if(c[ROt_LN]) DrawSegments(seg[col],c[ROt_LN]); - if(c[ROt_BX]) DrawRectangles(rec[col],c[ROt_BX]); - for(long i=0;i<c[ROt_ML];i++) - DrawLines(lines[col][i],numpoints[col][i]); - for(long i=0;i<c[ROt_ST];i++) - DrawString(textPos[col][i],texts[col][i],numtexts[col][i]); - c[ROt_PT]=c[ROt_LN]=c[ROt_BX]=c[ROt_ML]=c[ROt_ST]=0; - } -} - -void Plotter::alloc() { - long *c; - plot_count(my_w, my_lw, rcolcnt); - for (int col = 1; col<MAX_COLORS; col++) - { - c = rcolcnt[col]; - points[col]=new Point[c[ROt_PT]]; - seg[col] = new Segment[c[ROt_LN]]; - rec[col] = new Rectangle[c[ROt_BX]]; - lines[col] = new Point*[c[ROt_ML]]; - textPos[col] = new Point[c[ROt_ST]]; - texts[col] = new String[c[ROt_ST]]; - numpoints[col] = new long[c[ROt_ML]]; - numtexts [col] = new long[c[ROt_ST]]; - } + fl_font(FL_COURIER, int(pari_plot.fheight * xs)); + fl_color(FL_WHITE); // transparent window on Windows otherwise + fl_rectf(0, 0, this->w(), this->h()); + struct plot_eng plotfltk; + plotfltk.sc=&SetForeground; + plotfltk.pt=&DrawPoint; + plotfltk.ln=&DrawLine; + plotfltk.bx=&DrawRectangle; + plotfltk.mp=&DrawPoints; + plotfltk.ml=&DrawLines; + plotfltk.st=&DrawString; + plotfltk.pl=&pari_plot; + gen_rectdraw0(&plotfltk, color, w, x, y,lw,xs,ys); } int Plotter::handle(int event)
Attachment:
patch.Qt
Description: QuickTime movie