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");
    }
}
Ejemplo n.º 7
0
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;
}