Caching 禁用模式缓存

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 )

我正在编写一个程序,将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禁用了字体缓存,设置为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