ref: f5144a0fb1334c32890f4077ea1ea937701b8d29
parent: 976bd33db97521c48309b9e4ed1a6ff466956c20
author: Ali Gholami Rudi <ali@rudi.ir>
date: Wed Jun 12 15:37:31 EDT 2013
post: drawing commands
--- a/dev.c
+++ b/dev.c
@@ -130,11 +130,9 @@
return fn < fn_n ? fn_font[fn] : NULL;
}
-int dev_fontid(struct font *fn, int cur)
+int dev_fontid(struct font *fn)
{
int i;
- if (fn_font[cur] == fn)
- return cur;
for (i = 0; i < fn_n; i++)
if (fn_font[i] == fn)
return i;
--- a/out.c
+++ b/out.c
@@ -12,16 +12,16 @@
static int o_qv, o_qh, o_qend; /* queued character position */
char o_fonts[FNLEN * NFONTS] = " ";
-static void outf(char *s, va_list ap)
+static void outvf(char *s, va_list ap)
{
vfprintf(stdout, s, ap);
}
-void outvf(char *s, ...)
+void outf(char *s, ...)
{
va_list ap;
va_start(ap, s);
- outf(s, ap);
+ outvf(s, ap);
va_end(ap);
}
@@ -28,9 +28,9 @@
static void o_flush(void)
{
if (o_qtype == 1)
- outvf(") %d %d w\n", o_qh, o_qv);
+ outf(") %d %d w\n", o_qh, o_qv);
if (o_qtype == 2)
- outvf("] %d %d g\n", o_qh, o_qv);
+ outf("] %d %d g\n", o_qh, o_qv);
o_qtype = 0;
}
@@ -52,16 +52,15 @@
o_qh = o_h;
o_qv = o_v;
o_qtype = type;
- outvf(type == 1 ? "(" : "[");
+ outf(type == 1 ? "(" : "[");
}
if (o_qtype == 1) {
if (num >= ' ' && num <= '~')
- outvf("%s%c", strchr("()\\", num) ? "\\" : "", num);
+ outf("%s%c", strchr("()\\", num) ? "\\" : "", num);
else
- outvf("\\%d%d%d",
- (num >> 6) & 7, (num >> 3) & 7, num & 7);
+ outf("\\%d%d%d", (num >> 6) & 7, (num >> 3) & 7, num & 7);
} else {
- outvf("/%s", g->id);
+ outf("/%s", g->id);
}
o_qend = o_h + charwid(g->wid, o_s);
}
@@ -72,7 +71,7 @@
va_list ap;
o_flush();
va_start(ap, s);
- outf(s, ap);
+ outvf(s, ap);
va_end(ap);
}
@@ -106,12 +105,25 @@
}
}
+static void out_fontup(int fid)
+{
+ char fnname[FNLEN];
+ struct font *fn;
+ if (fid != p_f || o_s != p_s) {
+ fn = dev_font(fid);
+ out("%d /%s f\n", o_s, fn->psname);
+ p_f = fid;
+ p_s = o_s;
+ sprintf(fnname, " %s ", fn->psname);
+ if (!strstr(o_fonts, fnname))
+ sprintf(strchr(o_fonts, '\0'), "%s ", fn->psname);
+ }
+}
+
void outc(char *c)
{
struct glyph *g;
struct font *fn;
- char fnname[FNLEN];
- int fontid;
int dh, dv;
g = dev_glyph(c, o_f);
fn = g ? g->font : dev_font(o_f);
@@ -119,15 +131,7 @@
outrel(*c == ' ' && fn ? charwid(fn->spacewid, o_s) : 1, 0);
return;
}
- fontid = dev_fontid(fn, o_f);
- if (fontid != p_f || o_s != p_s) {
- out("%d /%s f\n", o_s, fn->psname);
- p_f = fontid;
- p_s = o_s;
- sprintf(fnname, " %s ", fn->psname);
- if (!strstr(o_fonts, fnname))
- sprintf(strchr(o_fonts, '\0'), "%s ", fn->psname);
- }
+ out_fontup(dev_fontid(fn));
fixpos(g, &dh, &dv);
o_h += dh;
o_v += dv;
@@ -160,4 +164,47 @@
void outsize(int s)
{
o_s = s;
+}
+
+void drawbeg(void)
+{
+ o_flush();
+ out_fontup(o_f);
+ outf("newpath %d %d m ", o_h, o_v);
+}
+
+void drawend(void)
+{
+ outf("stroke\n");
+}
+
+void drawl(int h, int v)
+{
+ outrel(h, v);
+ outf("%d %d drawl ", o_h, o_v);
+}
+
+void drawc(int c)
+{
+ outrel(c, 0);
+ outf("%d %d drawe ", c, c);
+}
+
+void drawe(int h, int v)
+{
+ outrel(h, 0);
+ outf("%d %d drawe ", h, v);
+}
+
+void drawa(int h1, int v1, int h2, int v2)
+{
+ outf("%d %d %d %d drawa ", h1, v1, h2, v2);
+ outrel(h1 + h2, v1 + v2);
+}
+
+void draws(int h1, int v1, int h2, int v2)
+{
+ outf("%d %d %d %d %d %d draws ", o_h, o_v, o_h + h1, o_v + v1,
+ o_h + h1 + h2, o_v + v1 + v2);
+ outrel(h1, v1);
}
--- a/post.c
+++ b/post.c
@@ -88,7 +88,7 @@
int c;
do {
c = next();
- } while (c != ' ');
+ } while (c == ' ');
if (c != '\n')
back(c);
return c == '\n';
@@ -117,24 +117,37 @@
*s = '\0';
}
-static void draw(void)
+static void postspline(int h1, int v1)
{
+ int h2, v2;
+ while (!iseol()) {
+ h2 = nextnum();
+ v2 = nextnum();
+ draws(h1, v1, h2, v2);
+ h1 = h2;
+ v1 = v2;
+ }
+ draws(h1, v1, 0, 0);
+}
+
+static void postdraw(void)
+{
int h1, h2, v1, v2;
int c = next();
+ drawbeg();
switch (c) {
case 'l':
h1 = nextnum();
v1 = nextnum();
- outrel(h1, v1);
+ drawl(h1, v1);
break;
case 'c':
- h1 = nextnum();
- outrel(h1, 0);
+ drawc(nextnum());
break;
case 'e':
h1 = nextnum();
v1 = nextnum();
- outrel(h1, 0);
+ drawe(h1, v1);
break;
case 'a':
h1 = nextnum();
@@ -141,19 +154,18 @@
v1 = nextnum();
h2 = nextnum();
v2 = nextnum();
- outrel(h1 + h2, v1 + v2);
+ drawa(h1, v1, h2, v2);
break;
- default:
+ case '~':
h1 = nextnum();
v1 = nextnum();
- outrel(h1, v1);
- while (!iseol()) {
- h2 = nextnum();
- v2 = nextnum();
- outrel(h2, v2);
- }
+ if (iseol())
+ drawl(h1, v1);
+ else
+ postspline(h1, v1);
break;
}
+ drawend();
nexteol();
}
@@ -239,7 +251,7 @@
nextnum();
break;
case 'D':
- draw();
+ postdraw();
break;
case 'x':
postx();
--- a/post.h
+++ b/post.h
@@ -42,7 +42,7 @@
void dev_close(void);
int dev_mnt(int pos, char *id, char *name);
struct font *dev_font(int fn);
-int dev_fontid(struct font *fn, int cur);
+int dev_fontid(struct font *fn);
int charwid(int wid, int sz);
struct glyph *dev_glyph(char *c, int fn);
struct glyph *dev_glyph_byid(char *id, int fn);
@@ -63,6 +63,14 @@
void outsize(int s);
void outpage(void);
extern char o_fonts[];
+
+void drawbeg(void);
+void drawend(void);
+void drawl(int h, int v);
+void drawc(int c);
+void drawe(int h, int v);
+void drawa(int h1, int v1, int h2, int v2);
+void draws(int h1, int v1, int h2, int v2);
/* postscript functions */
void ps_header(void);
--- a/ps.c
+++ b/ps.c
@@ -32,14 +32,11 @@
"\n"
"/setup {\n"
" counttomark 2 idiv {def} repeat pop\n"
- "\n"
" /scaling 72 resolution div def\n"
" linewidth setlinewidth\n"
" 1 setlinecap\n"
- "\n"
" 0 pagesize 1 get translate\n"
" scaling scaling scale\n"
- "\n"
" 0 0 moveto\n"
"} def\n"
"\n"
@@ -51,7 +48,7 @@
"} def\n"
"\n"
"/w {neg moveto show} bind def\n"
- "/m {neg dup /y exch def moveto} bind def\n"
+ "/m {neg moveto} bind def\n"
"/g {neg moveto {glyphshow} forall} bind def\n"
"/done {/lastpage where {pop lastpage} if} def\n"
"\n"
@@ -59,6 +56,42 @@
" dup /font exch def findfont exch\n"
" dup /ptsize exch def scaling div dup /size exch def scalefont setfont\n"
" linewidth ptsize mul scaling 10 mul div setlinewidth\n"
+ "} bind def\n"
+ "\n"
+ "/savedmatrix matrix def\n"
+ "/drawl {\n"
+ " neg lineto\n"
+ "} bind def\n"
+ "/drawe {\n"
+ " savedmatrix currentmatrix pop scale\n"
+ " .5 0 rmoveto currentpoint .5 0 rmoveto .5 0 360 arc\n"
+ " savedmatrix setmatrix\n"
+ "} bind def\n"
+ "/drawa {\n"
+ " /dy2 exch def\n"
+ " /dx2 exch def\n"
+ " /dy1 exch def\n"
+ " /dx1 exch def\n"
+ " currentpoint dy1 neg add exch dx1 add exch\n"
+ " dx1 dx1 mul dy1 dy1 mul add sqrt\n"
+ " dy1 dx1 neg atan\n"
+ " dy2 neg dx2 atan\n"
+ " arc\n"
+ "} bind def\n"
+ "/draws {\n"
+ " /y2 exch def\n"
+ " /x2 exch def\n"
+ " /y1 exch def\n"
+ " /x1 exch def\n"
+ " /y0 exch def\n"
+ " /x0 exch def\n"
+ " x0 5 x1 mul add 6 div\n"
+ " y0 5 y1 mul add -6 div\n"
+ " x2 5 x1 mul add 6 div\n"
+ " y2 5 y1 mul add -6 div\n"
+ " x1 x2 add 2 div\n"
+ " y1 y2 add -2 div\n"
+ " curveto\n"
"} bind def\n";
void ps_header(void)