禁用模式缓存

时间:2015-01-09 16:09:03

标签: caching postscript

我正在编写一个程序,它将postscript文件转换为更简单的点序列,我可以发送给我正在构建的绘图仪。我这样做是通过运行一些头代码来替换绘制操作,将操作打印到stdout,然后我的主控制程序将使用它:

/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 setcachelimit将缓存限制设置为0来禁用字体缓存。否则,postscript解释器将不会为后续使用缓存对象调用绘制操作。我宁愿通过重新定义setcachedevicesetcachedevice2禁用字体缓存,但这些运算符还必须处理一些字符度量标准,而不仅仅是缓存。

用户路径也可以缓存,我可以通过重新定义ucache并通过/ucache {} def将缓存限制设置为0来禁用此缓存。

但是,似乎没有配置模式缓存参数的命令,模式不需要显式请求缓存。即使有,我也需要强制它来调用每个参数的绘制操作。每个模式单元甚至在相同的填充操作中。 如何禁用模式缓存?

2 个答案:

答案 0 :(得分:2)

<</MaxPatternCache 0>> setsystemparams

假设您的口译员没有密码保护系统参数,并且它尊重此系统参数。

参见第3版PLRM的附录C,特别是&#34; C.3.3其他缓存&#34;。您还需要考虑表格。

答案 1 :(得分:2)

这是尝试printf实现以匹配您的语法。

/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对象带有它们自己的类型信息。有一个名为printf的NeWS扩展运算符更接近标记,我认为(ref)(pdf)。

enter image description here

我知道它在sprintf这里有点不同,但printf条目只是引用了这个条目。