Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Possible bug in Mac Distiller's charpath?

45 views
Skip to first unread message

jdaw1

unread,
Feb 16, 2008, 6:17:52 PM2/16/08
to
Please consider the following code, also available at
www.jdawiseman.com/papers/bugs/20080216_charpath.ps
%!

% Julian D. A. Wiseman, 16th February 2008, www.jdawiseman.com

/FontSize 100 def
/Times-Roman FontSize selectfont
0 setgray 0.24 setlinewidth 1 setlinecap 1 setlinejoin [] 0
setdash

72 72 FontSize 6 mul add moveto
(0) true charpath
(2) true charpath
stroke

72 72 FontSize 4.5 mul add moveto
FontSize 2 div FontSize rlineto FontSize 2 div FontSize neg rlineto
stroke

72 72 FontSize 3 mul add moveto
(0) true charpath
FontSize 2 div FontSize rlineto FontSize 2 div FontSize neg rlineto
(2) true charpath
stroke

showpage

GhostScript correctly outputs www.jdawiseman.com/papers/bugs/20080216_charpath_Ghostscript.pdf

But Mac Distiller (Professional, 8.1.0, 10/23/06) outputs
www.jdawiseman.com/papers/bugs/20080216_charpath_MacDistiller.pdf
which is missing the lines drawn by the two linetos (though not the
positioning affect). Mac Preview is very similar to the Distiller:
www.jdawiseman.com/papers/bugs/20080216_charpath_Preview.pdf

-- Please, am I doing something wrong?
-- Please, is there a workaround?
-- How can I nag Adobe to fix it? (The bug-submission page on Adobe
doesn't work!)

abe...@hotmail.com

unread,
Feb 18, 2008, 5:28:54 PM2/18/08
to

Try a string false charpath. False is for stroking and true
is for filling or clipping.

Ed

jdaw1

unread,
Feb 18, 2008, 6:20:38 PM2/18/08
to
> Try a string false charpath. False is for stroking and true
> is for filling or clipping.

Not quite.
-- The boolean is only relevant when the characters are for stroking.
Times-Roman is for filling.
-- If that were the problem, why would it affect the intervening
linetos but not the character paths themselves?
-- More convincingly, when tested, changing the boolean makes no
difference.

Also, the problem isn't caused by the 'hand drawn' path being open, as
adding currentpoint closepath moveto to the end of the rlineto lines
doesn't fix it either.

I'm stuck on this odd problem. Please could someone tell what happens
with PC distiller?

jdaw1

unread,
Feb 25, 2008, 12:08:31 PM2/25/08
to
Bumping this as I'm sure that somebody will have a solution.

ken

unread,
Feb 25, 2008, 12:31:42 PM2/25/08
to
In article <4a93619f-78c4-46a2-9e44-
b8e64b...@o77g2000hsf.googlegroups.com>, jdawi...@gmail.com says...

> Bumping this as I'm sure that somebody will have a solution.
>

Solution in what sense ? I agree that the result appears incorrect, and
is the same using Distiller 8 under Windows.

All the PostScript RIPs I have available to test with (Ghostscript, Jaws
and Harlequin) agree that the PDF produced is incorrect. Those which can
produce PDF output (Jaws and GS) produce 'correct' PDFs.

I don't have a copy of CPSI to test with, and the only person I know who
has one has quite an old copy. Amusingly, a version we already know has
a problem with charpath...

So it seems your only recourse is to use something other than Distiller,
or get Adobe to accept the bug (or explain why it isn't a bug ;-)

Can't help you with tha I'm afraid.


Ken

sjprouty

unread,
Feb 25, 2008, 1:01:23 PM2/25/08
to
If you are just looking for a work around, here is a way to restructure the
code that seems to work:

72 72 FontSize 3 mul add moveto
(0) true charpath

currentpoint stroke moveto


FontSize 2 div FontSize rlineto FontSize 2 div FontSize neg rlineto

currentpoint stroke moveto
(2) true charpath
stroke

Thanks
Scott Prouty


--
Message posted using http://www.talkaboutprogramming.com/group/comp.lang.postscript/
More information at http://www.talkaboutprogramming.com/faq.html

deed...@gmail.com

unread,
Feb 25, 2008, 1:47:54 PM2/25/08
to
Yes, you can stroke the path in three sections but that doesn't help
if there are line joining issues or you want to use the whole path for
clipping.

Note how adding clipping makes it REALLY different from Ghostscript:

%!PS-Bug


72 72 FontSize 3 mul add moveto
(0) true charpath

FontSize 2 div FontSize rlineto FontSize 2 div FontSize neg rlineto

currentpoint moveto
(2) true charpath clip clippath initclip
stroke

showpage

I've seen this problem before and assumed it was related to "charpath
security" i.e. preventing the unauthorized extracting of copyrighted
font outlines. As such, a possible solution would be to use the
"superexec" operator with that magic number Adobe published in the
little black book to enable the use of "pathforall" on the character
outlines to extract all the lineto's and curveto's and then draw them
as a regular path (not a charpath).

-David W.

jdaw1

unread,
Feb 26, 2008, 3:04:48 PM2/26/08
to
> Yes, you can stroke the path in three sections but that doesn't help if ... you want to use the whole path for clipping.

Alas I do want to use it for clipping, so stroking in pieces doesn't
work.

> a possible solution would be to use the "superexec" operator with that magic number Adobe published in the little black book to enable the use of "pathforall" on the character outlines to extract all the lineto's and curveto's and then draw them as a regular path (not a charpath).

That might help. Thank you for the clue. An online search reveals code
using
1183615869 internaldict /superexec get exec
The only documentation I can find, at www.tinaja.com/glib/pssecrets.pdf,
says:
> Here's how to activate superexec: First, you do a 1183615869 internaldict begin. From that point on, a {forall} superexec or a {get} superexec will often override and ignore any possible invalidaccess errors. This greatly expands your abilities to customize PostScript code and operations.

Please, is there fuller documentation anywhere? E.g., what does
"often" mean? This seems very useful.

jdaw1

unread,
Feb 26, 2008, 3:27:03 PM2/26/08
to
superexec is also mention in www.tinaja.com/glib/atg2.pdf (a set of
reprints of Computer Shopper series from November 1987 to December
1989!).

> The 1183615869 internaldict begin command will activate superexec for your use. For instance, if a gives you an error, a often will not. The same trick will often work for {get} superexec.

jdaw1

unread,
Feb 26, 2008, 10:09:37 PM2/26/08
to
http://pages.cs.wisc.edu/~ghost/doc/cvs/History3.htm#V3.41_Interpreter
(a history of Ghostscript versions 3.n) says at the end of the section
entitled "30.7 Interpreter":

> Adds superexec, an undocumented operator that is equivalent to exec but
suppresses all invalidaccess checks. NOT COMPLETED YET; currently
superexec
is equivalent to exec. (zcontrol.c)

Which suggests that it doesn't work in GhostScript.

PS: I'm adding these links to this thread so that my code can contain
a single reference leading to everything.
% groups.google.com/group/comp.lang.postscript/browse_thread/thread/
8599a22cfa270e5f/

deed...@gmail.com

unread,
Feb 28, 2008, 10:57:27 PM2/28/08
to

You know what, now it seems that superexec isn't necessary.
Maybe that restriction was removed a long time ago and I'm just
showing my age?

Note the line I have added between the 'charpath' and the 'stroke'
below:

%!PS-Bug
/FontSize 100 def
/Times-Bold FontSize selectfont

72 72 FontSize 3 mul add moveto
(0) true charpath
FontSize 2 div FontSize rlineto FontSize 2 div FontSize neg rlineto
currentpoint moveto
(2) true charpath

mark{/moveto load}{/lineto load}{/curveto load}{/closepath load}
pathforall ] newpath cvx exec

stroke

showpage

-----------------------
One more word of warning: if Distiller attempts to do font
substitution and you get the message "Font cannot be embedded", then
it doesn't work. At least, that happened to me. When I used Times-Bold
as you did, I got the substitution message and bad outlines. When I
used TimesNewRomanPS-BoldMT (which is available on my Windows system)
then it works. Also, if it's a really unknown font name, like
CrazyTimes-Wacko, then Distiller just uses Courier and it works
(albeit with Courier outlines).


-David W.

jdaw1

unread,
Mar 16, 2008, 11:00:41 PM3/16/08
to
It seems to me that the

mark{/moveto load}{/lineto load}{/curveto load}{/closepath load}
pathforall ] newpath cvx exec

just recreates the path. Please, how is that useful? (Aside: to
facilitate text editor bracket matching, I'd commence it with a "["
rather than a "mark".)

deed...@gmail.com

unread,
Mar 17, 2008, 9:27:30 PM3/17/08
to

Well, it is useful because it fixed the bug for me (Distiller 8.1.0 on
Windows). Did you try it?
If I comment out those two lines, the path does not draw completely.

Adobe attaches a nasty attribute of some kind to the internal path
data structure if it involves a character outline. Whatever this
attribute is, it causes a bug when you try to do certain things with
the path. So by regenerating the path using only moveto, lineto,
curveto and closepath, you create a new, clean path data structure
that the interpreter thinks does not involve character outlines
(because it was not built using 'charpath'), so it does not have the
nasty attribute, so it does not have the bug when you stroke it.

-David W.

Aandi Inston

unread,
Mar 18, 2008, 4:25:17 AM3/18/08
to
deed...@gmail.com wrote:

>Adobe attaches a nasty attribute of some kind to the internal path
>data structure if it involves a character outline. Whatever this

>attribute is, it causes a bug ...

I think that's right. Ignoring the bug, I think it is trying to do
something desirable: to recognise sequences like

charpath fill
charpath stroke
charpath gsave fill grestore stroke

and, rather than leaving them as a collection of outlines, distilling
into filled and/or stroked references to a real font.
----------------------------------------
Aandi Inston
Please support usenet! Post replies and follow-ups, don't e-mail them.

jdaw1

unread,
Mar 18, 2008, 12:47:21 PM3/18/08
to
Very logical, thank you. I will experiment.

OOI, why use

[ {/moveto load} {/lineto load} {/curveto load} {/closepath load}
pathforall ] newpath cvx exec

rather than a simpler

[ {moveto} {lineto} {curveto} {closepath} pathforall ] newpath cvx
exec

jdaw1

unread,
Mar 18, 2008, 1:17:19 PM3/18/08
to
> [ {moveto} {lineto} {curveto} {closepath} pathforall ] newpath cvx
> exec

Please ignore that question: very foolish.

0 new messages