Discussion:
[tex-k] note from Don Knuth -- bug(s) in MetaPost?
Maggie McLoughlin
2014-01-16 04:31:55 UTC
Permalink
Dear TeX-Kers,

The "drawdot" command in MetaPost hasn't been working for me.
beginfig(1)
pickup pencircle scaled .4;
drawdot (10j,0) withpen pencircle scaled .5j;
pickup pencircle scaled .5j;
drawdot (10j,10);
endfor
endfig;
bye.
I ran this with newly installed MacTeX from the TeX Collection 2013.

When I say "tex mproof test.1" and then "dvips test -o", I get an output
file that contains nine correctly filled circles above nine strange
partially filled circles. The Postscript file begins with
%!PS-Adobe-2.0
%%Creator: dvips(k) 5.993 Copyright 2013 Radical Eye Software
%%Title: mproof.dvi
%%CreationDate: Wed Jan 15 19:07:45 2014
%%Pages: 1
%%PageOrder: Ascend
%%BoundingBox: 0 0 612 792
%%DocumentFonts: CMTEX10 CMR7 CMR10
%%DocumentPaperSizes: Letter
and then a whole bunch of infrastructure stuff and then the guts starts with
%%BeginDocument: test.1
%!PS
%%BoundingBox: 9 -3 93 13
%%HiResBoundingBox: 9.55 -2.45 92.45 12.25
%%Creator: MetaPost 1.803
%%CreationDate: 2014.01.15:1907
%%Pages: 1
%%BeginProlog
%%EndProlog
%%Page: 1 1
0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
[] 0 setdash 1 setlinejoin 10 setmiterlimit
newpath 10.2 0 moveto
10.2 0.05304 10.17892 0.10391 10.14142 0.14142 curveto
10.10391 0.17892 10.05304 0.2 10 0.2 curveto
9.94696 0.2 9.89609 0.17892 9.85858 0.14142 curveto
9.82108 0.10391 9.8 0.05304 9.8 0 curveto
9.8 -0.05304 9.82108 -0.10391 9.85858 -0.14142 curveto
9.89609 -0.17892 9.94696 -0.2 10 -0.2 curveto
10.05304 -0.2 10.10391 -0.17892 10.14142 -0.14142 curveto
10.17892 -0.10391 10.2 -0.05304 10.2 0 curveto closepath
gsave fill grestore stroke
newpath 10.25 10 moveto
10.25 10.0663 10.22366 10.12988 10.17677 10.17677 curveto
10.12988 10.22366 10.0663 10.25 10 10.25 curveto
9.9337 10.25 9.87012 10.22366 9.82323 10.17677 curveto
9.77634 10.12988 9.75 10.0663 9.75 10 curveto
9.75 9.9337 9.77634 9.87012 9.82323 9.82323 curveto
9.87012 9.77634 9.9337 9.75 10 9.75 curveto
10.0663 9.75 10.12988 9.77634 10.17677 9.82323 curveto
10.22366 9.87012 10.25 9.9337 10.25 10 curveto closepath fill
0 1 dtransform truncate idtransform setlinewidth pop
The bottom "newpath .. pop" works better, but the top "newpath .. stroke"
fails rather spectacularly. The definition of "drawdot" in the
"plain mem" file seems to use currentpen, without setting currentpen.

I believe the semantics of drawdot specify that "withpen" overrides
the current pen, while lack of "withpen" uses the current pen.
Thus, it seems to me, both lines of dots should have been identical.
But they obviously aren't.

Looking further, I believe BOTH of these are incorrect; because
both of them do a "stroke" as well as a "fill", while drawdot
in METAFONT is simply a "fill".

I also see that "withpen pencircle scaled 2" gives different results
from "withpen (pencircle scaled 2)"! In METAFONT there is no difference
between these.

Thus it seems that there are MULTIPLE errors in METAPOST with respect
to drawdot.

The idea of drawdot (see the METAFONT manual page 150) is to
"draw" a one-point path. When making fonts, this can help to
correct pixels at the endpoints of another path (as mentioned there).
With PostScript there is no such problem, at least not usually;
I suppose that's why people who come to METAPOST without beginning
with METAFONT have not used drawdot enough to run into this bug.

I'm kludging around this in my own METAPOST programs until the bug is fixed.

Sincerely, Don
Maggie McLoughlin
2014-01-16 04:56:06 UTC
Permalink
PS -- The "unfilled circles" happen when Ghostview or Preview renders
that PostScript file. But if you apply Acrobat Distiller, and presumably
also if you use a reputable Adobe "rip" to create the image, all of
the circles are filled in.

Some of them are however larger than others, because of the "stroke"
in addition to "fill", and that should not be.

Unfortunately the Ubuntu engine that converts PostScript to my
laserprinter has the same bug as Preview and Ghostview...

-- Don

Loading...