使用过程作为 ReusableStreamDecode 过滤器的数据源
Using procedure as data source for ReusableStreamDecode filter
累积对于 PostScript 规范,第 124 页,解码过滤器的数据源可以是一个过程。
它说:
The procedure must return on the operand stack a readable string
containing any number of bytes of data. The filter pops this string
from the stack and uses its contents as input to the filter. This process repeats until the
filter encounters end-of-data (EOD).
这是一个示例 PS 文件,其中的字符串文字用作数据源:
%!
/myDataSource (Hello ABC!) /ReusableStreamDecode filter def
% testing random access
myDataSource dup 6 setfileposition read {==} if % 65 A
myDataSource dup 0 setfileposition read {==} if % 72 H
myDataSource dup 8 setfileposition read {==} if % 67 C
如何制作一个 PS 过程来代替字符串作为数据源?通过这种方式,我想避开 PostScript 字符串的大小限制(65535 个字符)。 (毕竟,我想用一个 /DataSource <file>
条目定义一个 /FunctionType 0
的函数,其中 <file>
是一个大于字符串大小限制的可重定位文件对象。)
此解决方案基于 article pointed to by user beginner6789。
数据本质上是以字符串数组的形式提供的,将上限扩展到64K²=4G的数据量,已经相当多了。 (PostScript 数组与 PostScript 字符串一样具有相同的 65535 个元素限制。)
用于替换原始代码中用作数据源的单个文字字符串的过程每次从数组中获取一个字符串,并在过滤器调用时将其压入操作数堆栈。我们需要跟踪最后检索到的元素的数组索引。索引变量在 userdict
中定义,并在执行过程时更新。另外值得注意的是,空字符串 ()
必须作为最后一个元素放入数组中。它向过滤器发出 End-of-Data 信号:
%!
/myDataArray [(Hello) ( ) (A) (BC) (!) ()] def
userdict /idx 0 put
/myDataSource {myDataArray idx get /idx idx 1 add store} /ReusableStreamDecode filter def
% testing random access
myDataSource dup 6 setfileposition read {==} if % 65 A
myDataSource dup 0 setfileposition read {==} if % 72 H
myDataSource dup 8 setfileposition read {==} if % 67 C
累积对于 PostScript 规范,第 124 页,解码过滤器的数据源可以是一个过程。
它说:
The procedure must return on the operand stack a readable string containing any number of bytes of data. The filter pops this string from the stack and uses its contents as input to the filter. This process repeats until the filter encounters end-of-data (EOD).
这是一个示例 PS 文件,其中的字符串文字用作数据源:
%!
/myDataSource (Hello ABC!) /ReusableStreamDecode filter def
% testing random access
myDataSource dup 6 setfileposition read {==} if % 65 A
myDataSource dup 0 setfileposition read {==} if % 72 H
myDataSource dup 8 setfileposition read {==} if % 67 C
如何制作一个 PS 过程来代替字符串作为数据源?通过这种方式,我想避开 PostScript 字符串的大小限制(65535 个字符)。 (毕竟,我想用一个 /DataSource <file>
条目定义一个 /FunctionType 0
的函数,其中 <file>
是一个大于字符串大小限制的可重定位文件对象。)
此解决方案基于 article pointed to by user beginner6789。
数据本质上是以字符串数组的形式提供的,将上限扩展到64K²=4G的数据量,已经相当多了。 (PostScript 数组与 PostScript 字符串一样具有相同的 65535 个元素限制。)
用于替换原始代码中用作数据源的单个文字字符串的过程每次从数组中获取一个字符串,并在过滤器调用时将其压入操作数堆栈。我们需要跟踪最后检索到的元素的数组索引。索引变量在 userdict
中定义,并在执行过程时更新。另外值得注意的是,空字符串 ()
必须作为最后一个元素放入数组中。它向过滤器发出 End-of-Data 信号:
%!
/myDataArray [(Hello) ( ) (A) (BC) (!) ()] def
userdict /idx 0 put
/myDataSource {myDataArray idx get /idx idx 1 add store} /ReusableStreamDecode filter def
% testing random access
myDataSource dup 6 setfileposition read {==} if % 65 A
myDataSource dup 0 setfileposition read {==} if % 72 H
myDataSource dup 8 setfileposition read {==} if % 67 C