X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fpostscript.c;h=c828a0df2a49136cf73433458384996355516d31;hb=6d7e2826ba9c863f6261e9718e0e822e0ca60aa0;hp=7b1f6e1562d58b473c4087d2f681602a6805daa8;hpb=b7852df2743416201dc85fd672644799cdd1b7b5;p=pspp diff --git a/src/postscript.c b/src/postscript.c index 7b1f6e1562..c828a0df2a 100644 --- a/src/postscript.c +++ b/src/postscript.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include @@ -54,6 +54,7 @@ #include "misc.h" #include "misc.h" #include "output.h" +#include "som.h" #include "version.h" /* FIXMEs: @@ -1693,6 +1694,8 @@ ps_open_page (struct outp_driver *this) draw_headers (this); } + this->cp_y = 0; + return !ferror (x->file.file); } @@ -1714,6 +1717,19 @@ ps_close_page (struct outp_driver *this) this->page_open = 0; return !ferror (x->file.file); } + +static void +ps_submit (struct outp_driver *this UNUSED, struct som_entity *s) +{ + switch (s->type) + { + case SOM_CHART: + break; + default: + assert(0); + break; + } +} /* Lines. */ @@ -2871,6 +2887,86 @@ load_font (struct outp_driver *this, const char *dit) return fe; } +static void +ps_chart_initialise (struct outp_driver *this UNUSED, struct chart *ch) +{ +#ifdef NO_CHARTS + ch->lp = NULL; +#else + struct ps_driver_ext *x = this->ext; + char page_size[128]; + int size; + int x_origin, y_origin; + + ch->file = tmpfile (); + if (ch->file == NULL) + { + ch->lp = NULL; + return; + } + + size = this->width < this->length ? this->width : this->length; + x_origin = x->left_margin + (size - this->width) / 2; + y_origin = x->bottom_margin + (size - this->length) / 2; + + snprintf (page_size, sizeof page_size, + "a,xsize=%.3f,ysize=%.3f,xorigin=%.3f,yorigin=%.3f", + (double) size / PSUS, (double) size / PSUS, + (double) x_origin / PSUS, (double) y_origin / PSUS); + + ch->pl_params = pl_newplparams (); + pl_setplparam (ch->pl_params, "PAGESIZE", page_size); + ch->lp = pl_newpl_r ("ps", NULL, ch->file, stderr, ch->pl_params); +#endif +} + +static void +ps_chart_finalise (struct outp_driver *this UNUSED, struct chart *ch UNUSED) +{ +#ifndef NO_CHARTS + struct ps_driver_ext *x = this->ext; + char buf[BUFSIZ]; + static int doc_num = 0; + + if (this->page_open) + { + this->class->close_page (this); + this->page_open = 0; + } + this->class->open_page (this); + fprintf (x->file.file, + "/sp save def%s" + "%d %d translate 1000 dup scale%s" + "userdict begin%s" + "/showpage { } def%s" + "0 setgray 0 setlinecap 1 setlinewidth%s" + "0 setlinejoin 10 setmiterlimit [ ] 0 setdash newpath clear%s" + "%%%%BeginDocument: %d%s", + x->eol, + -x->left_margin, -x->bottom_margin, x->eol, + x->eol, + x->eol, + x->eol, + x->eol, + doc_num++, x->eol); + + rewind (ch->file); + while (fwrite (buf, 1, fread (buf, 1, sizeof buf, ch->file), x->file.file)) + continue; + fclose (ch->file); + + fprintf (x->file.file, + "%%%%EndDocument%s" + "end%s" + "sp restore%s", + x->eol, + x->eol, + x->eol); + this->class->close_page (this); + this->page_open = 0; +#endif +} + /* PostScript driver class. */ struct outp_class postscript_class = { @@ -2890,7 +2986,7 @@ struct outp_class postscript_class = ps_open_page, ps_close_page, - NULL, + ps_submit, ps_line_horz, ps_line_vert, @@ -2911,8 +3007,8 @@ struct outp_class postscript_class = ps_text_metrics, ps_text_draw, - NULL, - NULL + ps_chart_initialise, + ps_chart_finalise }; /* EPSF driver class. FIXME: Probably doesn't work right. */ @@ -2934,7 +3030,7 @@ struct outp_class epsf_class = ps_open_page, ps_close_page, - NULL, + ps_submit, ps_line_horz, ps_line_vert, @@ -2955,8 +3051,9 @@ struct outp_class epsf_class = ps_text_metrics, ps_text_draw, - NULL, - NULL + ps_chart_initialise, + ps_chart_finalise + }; #endif /* NO_POSTSCRIPT */