static void psgen_polygon(GVJ_t * job, pointf * A, int n, int filled) { int j; if (filled && job->obj->fillcolor.u.HSVA[3] > .5) { ps_set_color(job, &(job->obj->fillcolor)); gvputs(job, "newpath "); gvprintpointf(job, A[0]); gvputs(job, " moveto\n"); for (j = 1; j < n; j++) { gvprintpointf(job, A[j]); gvputs(job, " lineto\n"); } gvputs(job, "closepath fill\n"); } if (job->obj->pencolor.u.HSVA[3] > .5) { ps_set_pen_style(job); ps_set_color(job, &(job->obj->pencolor)); gvputs(job, "newpath "); gvprintpointf(job, A[0]); gvputs(job, " moveto\n"); for (j = 1; j < n; j++) { gvprintpointf(job, A[j]); gvputs(job, " lineto\n"); } gvputs(job, "closepath stroke\n"); } }
static void psgen_bezier(GVJ_t * job, pointf * A, int n, int arrow_at_start, int arrow_at_end, int filled) { int j; if (filled && job->obj->fillcolor.u.HSVA[3] > .5) { ps_set_color(job, &(job->obj->fillcolor)); gvputs(job, "newpath "); gvprintpointf(job, A[0]); gvputs(job, " moveto\n"); for (j = 1; j < n; j += 3) { gvprintpointflist(job, &A[j], 3); gvputs(job, " curveto\n"); } gvputs(job, "closepath fill\n"); } if (job->obj->pencolor.u.HSVA[3] > .5) { ps_set_pen_style(job); ps_set_color(job, &(job->obj->pencolor)); gvputs(job, "newpath "); gvprintpointf(job, A[0]); gvputs(job, " moveto\n"); for (j = 1; j < n; j += 3) { gvprintpointflist(job, &A[j], 3); gvputs(job, " curveto\n"); } gvputs(job, "stroke\n"); } }
static void psgen_textspan(GVJ_t * job, pointf p, textspan_t * span) { char *str; if (job->obj->pencolor.u.HSVA[3] < .5) return; /* skip transparent text */ ps_set_color(job, &(job->obj->pencolor)); gvprintdouble(job, span->font->size); gvprintf(job, " /%s set_font\n", span->font->name); str = ps_string(span->str,isLatin1); switch (span->just) { case 'r': p.x -= span->size.x; break; case 'l': p.x -= 0.0; break; case 'n': default: p.x -= span->size.x / 2.0; break; } p.y += span->yoffset_centerline; gvprintpointf(job, p); gvputs(job, " moveto "); gvprintdouble(job, span->size.x); gvprintf(job, " %s alignedtext\n", str); }
static void psgen_library_shape(GVJ_t * job, char *name, pointf * A, int n, int filled) { if (filled && job->obj->fillcolor.u.HSVA[3] > .5) { ps_set_color(job, &(job->obj->fillcolor)); gvputs(job, "[ "); gvprintpointflist(job, A, n); gvputs(job, " "); gvprintpointf(job, A[0]); gvprintf(job, " ] %d true %s\n", n, name); } if (job->obj->pencolor.u.HSVA[3] > .5) { ps_set_pen_style(job); ps_set_color(job, &(job->obj->pencolor)); gvputs(job, "[ "); gvprintpointflist(job, A, n); gvputs(job, " "); gvprintpointf(job, A[0]); gvprintf(job, " ] %d false %s\n", n, name); } }
static void psgen_ellipse(GVJ_t * job, pointf * A, int filled) { /* A[] contains 2 points: the center and corner. */ pointf AA[2]; AA[0] = A[0]; AA[1].x = A[1].x - A[0].x; AA[1].y = A[1].y - A[0].y; if (filled && job->obj->fillcolor.u.HSVA[3] > .5) { ps_set_color(job, &(job->obj->fillcolor)); gvprintpointflist(job, AA, 2); gvputs(job, " ellipse_path fill\n"); } if (job->obj->pencolor.u.HSVA[3] > .5) { ps_set_pen_style(job); ps_set_color(job, &(job->obj->pencolor)); gvprintpointflist(job, AA, 2); gvputs(job, " ellipse_path stroke\n"); } }
static void psgen_polyline(GVJ_t * job, pointf * A, int n) { int j; if (job->obj->pencolor.u.HSVA[3] > .5) { ps_set_pen_style(job); ps_set_color(job, &(job->obj->pencolor)); gvputs(job, "newpath "); gvprintpointf(job, A[0]); gvputs(job, " moveto\n"); for (j = 1; j < n; j++) { gvprintpointf(job, A[j]); gvputs(job, " lineto\n"); } gvputs(job, "stroke\n"); } }
int to_eps (const GEN_PAR *pg, const OUT_PAR *po) { PlotCmd cmd; HPGL_Pt pt1 = {0,0}; FILE *md; int pen_no=0, pencolor=0, err; PEN_W pensize; err = 0; if (!pg->quiet) Eprintf ("\n\n- Writing EPS code to \"%s\"\n", *po->outfile == '-' ? "stdout" : po->outfile); /* Init. of PostScript file: */ if (*po->outfile != '-') { if ((md = fopen(po->outfile, "w")) == NULL) { PError("hp2xx (eps)"); return ERROR; } } else md = stdout; /* PS header */ pensize = pt.width[DEFAULT_PEN_NO]; /* Default pen */ ps_init (pg, po, md, pensize); if (pensize > 0.05) fprintf(md," %6.3f W\n", pensize); /* Factor for transformation of HP coordinates to mm */ xcoord2mm = po->width / (po->xmax - po->xmin); ycoord2mm = po->height / (po->ymax - po->ymin); xmin = po->xmin; ymin = po->ymin; /** ** Command loop: While temporary file not empty: process command. **/ while ((cmd = PlotCmd_from_tmpfile()) != CMD_EOF) { switch (cmd) { case NOP: break; case SET_PEN: if ((pen_no = fgetc(pg->td)) == EOF) { PError("Unexpected end of temp. file: "); err = ERROR; goto EPS_exit; } pensize = pt.width[pen_no]; pencolor = pt.color[pen_no]; break; case DEF_PW: if(!load_pen_width_table(pg->td)) { PError("Unexpected end of temp. file"); err = ERROR; goto EPS_exit; } pensize=pt.width[pen_no]; break; case DEF_PC: err=load_pen_color_table(pg->td); if (err<0) { PError("Unexpected end of temp. file"); err = ERROR; goto EPS_exit; } if (err==pencolor) pencolor *=-1; /*current pen changed*/ break; case DEF_LA: if(load_line_attr(pg->td) <0) { PError("Unexpected end of temp. file"); err = ERROR; goto EPS_exit; } break; case MOVE_TO: ps_set_linewidth(pensize, &pt1, md); ps_set_linecap(CurrentLineAttr.End, pensize, &pt1, md); if(pencolor <0) { pencolor=pt.color[pen_no]; ps_set_color ( pt.clut[pencolor][0]/255.0, pt.clut[pencolor][1]/255.0, pt.clut[pencolor][2]/255.0, &pt1, md); } HPGL_Pt_from_tmpfile (&pt1); if (pensize > 0.05) ps_stroke_and_move_to (&pt1, md); break; case DRAW_TO: ps_set_linewidth(pensize, &pt1, md); ps_set_linecap(CurrentLineAttr.End, pensize, &pt1, md); if(pencolor <0) { pencolor=pt.color[pen_no]; ps_set_color ( pt.clut[pencolor][0]/255.0, pt.clut[pencolor][1]/255.0, pt.clut[pencolor][2]/255.0, &pt1, md); } HPGL_Pt_from_tmpfile (&pt1); if (pensize > 0.05) ps_line_to (&pt1, 'D', md); break; case PLOT_AT: ps_set_linewidth(pensize, &pt1, md); ps_set_linecap(CurrentLineAttr.End, pensize, &pt1, md); if(pencolor<0) { pencolor=pt.color[pen_no]; ps_set_color ( pt.clut[pencolor][0]/255.0, pt.clut[pencolor][1]/255.0, pt.clut[pencolor][2]/255.0, &pt1, md); } HPGL_Pt_from_tmpfile (&pt1); if (pensize > 0.05) { ps_line_to (&pt1, 'M', md); ps_line_to (&pt1, 'D', md); /* not sure whether this is needed */ ps_draw_dot(&pt1,pensize/2,md); } break; default: Eprintf ("Illegal cmd in temp. file!"); err = ERROR; goto EPS_exit; } } /* Finish up */ ps_end (md); EPS_exit: if (md != stdout) fclose (md); if (!pg->quiet) Eprintf ("\n"); return err; }