2 * PostScript backend for Halibut
9 paragraph
*ps_config_filename(char *filename
)
12 wchar_t *ufilename
, *up
;
16 memset(p
, 0, sizeof(*p
));
17 p
->type
= para_Config
;
19 p
->fpos
.filename
= "<command line>";
20 p
->fpos
.line
= p
->fpos
.col
= -1;
22 ufilename
= ufroma_dup(filename
);
23 len
= ustrlen(ufilename
) + 2 + lenof(L
"ps-filename");
24 p
->keyword
= mknewa(wchar_t, len
);
26 ustrcpy(up
, L
"ps-filename");
28 ustrcpy(up
, ufilename
);
31 assert(up
- p
->keyword
< len
);
37 void ps_backend(paragraph
*sourceform
, keywordlist
*keywords
,
38 indexdata
*idx
, void *vdoc
) {
39 document
*doc
= (document
*)vdoc
;
51 filename
= dupstr("output.ps");
52 for (p
= sourceform
; p
; p
= p
->next
) {
53 p
->private_data
= NULL
;
54 if (p
->type
== para_Config
&& p
->parent
) {
55 if (!ustricmp(p
->keyword
, L
"ps-filename")) {
57 filename
= utoa_dup(uadv(p
->keyword
));
62 fp
= fopen(filename
, "w");
64 error(err_cantopenw
, filename
);
68 fprintf(fp
, "%%!PS-Adobe-1.0\n");
69 for (pageno
= 0, page
= doc
->pages
; page
; page
= page
->next
)
71 fprintf(fp
, "%%%%Pages: %d\n", pageno
);
72 fprintf(fp
, "%%%%EndComments\n");
74 fprintf(fp
, "%%%%BeginProlog\n");
75 fprintf(fp
, "%%%%EndProlog\n");
77 fprintf(fp
, "%%%%BeginSetup\n");
79 * Re-encode and re-metric the fonts.
82 for (fe
= doc
->fonts
->head
; fe
; fe
= fe
->next
) {
86 sprintf(fname
, "f%d", font_index
++);
87 fe
->name
= dupstr(fname
);
89 fprintf(fp
, "/%s findfont dup length dict begin\n", fe
->font
->name
);
90 fprintf(fp
, "{1 index /FID ne {def} {pop pop} ifelse} forall\n");
91 fprintf(fp
, "/Encoding [\n");
92 for (i
= 0; i
< 256; i
++)
93 fprintf(fp
, "/%s\n", fe
->vector
[i
] ? fe
->vector
[i
] : ".notdef");
94 fprintf(fp
, "] def /Metrics 256 dict dup begin\n");
95 for (i
= 0; i
< 256; i
++) {
96 if (fe
->indices
[i
] >= 0) {
97 double width
= fe
->font
->widths
[fe
->indices
[i
]];
98 fprintf(fp
, "/%s %g def\n", fe
->vector
[i
],
99 1000.0 * width
/ 4096.0);
102 fprintf(fp
, "end def currentdict end\n");
103 fprintf(fp
, "/fontname-%s exch definefont /%s exch def\n\n",
106 fprintf(fp
, "%%%%EndSetup\n");
112 for (page
= doc
->pages
; page
; page
= page
->next
) {
116 fprintf(fp
, "%%%%Page: %d %d\n", pageno
, pageno
);
117 fprintf(fp
, "%%%%BeginPageSetup\n");
118 fprintf(fp
, "%%%%EndPageSetup\n");
124 * I used this diagnostic briefly to ensure that
125 * cross-reference rectangles were being put where they
128 for (xr
= page
->first_xref
; xr
; xr
= xr
->next
) {
129 fprintf(fp
, "gsave 0.7 setgray %g %g moveto",
130 xr
->lx
/4096.0, xr
->ty
/4096.0);
131 fprintf(fp
, " %g %g lineto %g %g lineto",
132 xr
->lx
/4096.0, xr
->by
/4096.0,
133 xr
->rx
/4096.0, xr
->by
/4096.0);
134 fprintf(fp
, " %g %g lineto closepath fill grestore\n",
135 xr
->rx
/4096.0, xr
->ty
/4096.0);
140 for (frag
= page
->first_text
; frag
; frag
= frag
->next
) {
143 fprintf(fp
, "%s %d scalefont setfont %g %g moveto (",
144 frag
->fe
->name
, frag
->fontsize
,
145 frag
->x
/4096.0, frag
->y
/4096.0);
147 for (c
= frag
->text
; *c
; c
++) {
148 if (*c
== '(' || *c
== ')' || *c
== '\\')
153 fprintf(fp
, ") show\n");
156 fprintf(fp
, "showpage\n");
159 fprintf(fp
, "%%%%EOF\n");