Caching 禁用模式缓存
我正在编写一个程序,将postscript文件转换为一个更简单的点序列,可以发送到我正在构建的绘图仪。为此,我运行了一些头代码,将绘制操作替换为打印指向stdout的操作,然后我的主控制程序将使用:Caching 禁用模式缓存,caching,postscript,Caching,Postscript,我正在编写一个程序,将postscript文件转换为一个更简单的点序列,可以发送到我正在构建的绘图仪。为此,我运行了一些头代码,将绘制操作替换为打印指向stdout的操作,然后我的主控制程序将使用: /stroke { gsave matrix defaultmatrix setmatrix flattenpath /str 20 string def {(m ) print 2 copy exch str cvs print ( ) print =} {(l )
/stroke { gsave
matrix defaultmatrix setmatrix
flattenpath
/str 20 string def
{(m ) print 2 copy exch str cvs print ( ) print =}
{(l ) print exch str cvs print ( ) print =}
{6 {pop} repeat (error) =} % should never happen...
{(l ) print exch str cvs print ( ) print =}
pathforall
grestore
stroke
} bind def
/fill {
gsave stroke grestore fill
} bind def
顺便说一下,我真希望postscript有一个printf命令,比如1 1 add 1+1=%d printf
为了使其与字体一起工作,我通过将缓存限制设置为0禁用了字体缓存,设置为0 setcachelimit。否则,postscript解释器将不会为后续使用缓存对象调用绘制操作。我宁愿通过重新定义setcachedevice和setcachedevice2来禁用字体缓存,但这些操作员还必须处理一些字符度量的内容,而不仅仅是缓存
用户路径也可以缓存,我可以通过重新定义ucache并通过/ucache{}def将缓存限制设置为0来禁用此缓存
但是,似乎没有用于配置模式缓存参数的命令,模式也不需要显式请求缓存。即使有,我也需要强制它为每个模式单元调用绘制操作,即使在相同的填充操作中也是如此。如何禁用模式缓存
假设您的解释器没有保护系统参数的密码,并且它尊重此系统参数
参见第三版PLRM的附录C,特别是第C.3.3节“其他缓存”。你也需要考虑表单。< P>这是一个PrimTF实现与语法匹配的尝试。
/formats <<
(d) { cvi 20 string cvs }
>> def
% val1 val2 .. valN (format-str) printf -
/printf {
0 1 index (%) { % ... (fmt) n (fmt) (%)
search { % ... (fmt) n (post)(%)(pre)
pop pop exch 1 add exch (%) % ... (fmt) n=n+1 (post) (%)
}{ % ... (fmt) n (rem)
pop exit
} ifelse
} loop % val1 val2 .. valN (fmt) n
dup { % ... (fmt) n
exch (%) search pop % ... n (post)(%)(pre)
print pop % ... n (post)
exch dup % ... (post) n n
2 add -1 roll % .. (post) n val1
3 1 roll 1 sub % .. val1 (post) n=n-1
exch % .. val1 n (post)
dup 0 1 getinterval % .. val1 n (post) (p)
exch 1 1 index % .. val1 n (p) (post) 1 (post)
length 1 sub getinterval % .. val1 n (p) (ost)
exch 4 -1 roll % .. n (ost) (p) val1
exch //formats exch
2 copy known not { pop /default } if get exec
print % .. n (ost)
exch
} repeat
pop
print
} def
1 1 add (1+1=%d) printf
但是,如果我可以批评一点的话,这可能不是postscript的最佳用途。首先,转换说明符并不是真正必要的,因为postscript对象具有自己的类型信息。有一个叫做printf的新闻分机操作员,我想它更接近这个标记
我知道这里说的是sprintf,这有点不同,但是printf条目只是指这个条目。你知道有一个解释程序会尊重这个参数吗?我用ghostscript试过了,但它一直在缓存它们,即使在单独的填充操作之间也是如此。我想Adobe的CPSI和Global Graphics的JAWS Rip也一样。我对别人没有真正的了解。如果你指的是一个“免费开源”的PostScript解释器,那么我认为现在除了Ghostscript之外没有其他解释器了,不过Luser Droog有一个,但我不确定它是否完整到足以处理模式。您不能禁用Ghostscript中的模式缓存,这是图形库操作的基础。您可能需要考虑调用GHOST脚本设备,而不是入侵该语言,这会让您访问对象,而不是试图以这种缓慢而痛苦的方式提取对象。最后,您可以重新定义makepattern和setpattern来自己存储模式定义。然后,您可以重新定义setcolorspace,自己在该区域上平铺图案。您计划如何处理图像和阴影?
/formats <<
(d) { cvi 20 string cvs }
>> def
% val1 val2 .. valN (format-str) printf -
/printf {
0 1 index (%) { % ... (fmt) n (fmt) (%)
search { % ... (fmt) n (post)(%)(pre)
pop pop exch 1 add exch (%) % ... (fmt) n=n+1 (post) (%)
}{ % ... (fmt) n (rem)
pop exit
} ifelse
} loop % val1 val2 .. valN (fmt) n
dup { % ... (fmt) n
exch (%) search pop % ... n (post)(%)(pre)
print pop % ... n (post)
exch dup % ... (post) n n
2 add -1 roll % .. (post) n val1
3 1 roll 1 sub % .. val1 (post) n=n-1
exch % .. val1 n (post)
dup 0 1 getinterval % .. val1 n (post) (p)
exch 1 1 index % .. val1 n (p) (post) 1 (post)
length 1 sub getinterval % .. val1 n (p) (ost)
exch 4 -1 roll % .. n (ost) (p) val1
exch //formats exch
2 copy known not { pop /default } if get exec
print % .. n (ost)
exch
} repeat
pop
print
} def
1 1 add (1+1=%d) printf