首页 > 解决方案 > CMap 定义中的 Ghostscript /stackunderflow

问题描述

我正在尝试创建一个带有两个 CID 映射的简单 CMap。知道跟随 CMap 有什么问题吗?

/CIDInit /ProcSet findresource begin
13 dict begin
begincmap /CIDSystemInfo <<
/Registry (Adobe) /Ordering (Identity) /Supplement 0 >> def
/CMapName /CM def
/CMapType 1 def
1 begincodespacerange
<00> <02>
endcodespacerange

2 begincidchar
<01> 6691
<02> 6692
endcidchar
endcmap CMapName currentdict /CMap defineresource
pop end end

gs 解释器抛出以下错误:

Error: /stackunderflow in --index--
Operand stack:
   1   --nostringval--   (\002)   6691   (\001)   (\000\000\000\002)   ()   (\032#)   0   (\001)   10
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1992   1   3   %oparray_pop   1991   1   3   %oparray_pop   1979   1   3   %oparray_pop   1833   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   1   --nostringval--   %repeat_continue   --nostringval--   --nostringval--
Dictionary stack:
   --dict:730/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--   --dict:38/38(ro)(G)--   --dict:8/13(L)--
Current allocation mode is local
Current file position is 270
GPL Ghostscript 9.27: Unrecoverable error, exit code 1

标签: ghostscript

解决方案


这是一个错误,现在已修复。

对于单个代码映射(endnotdefchar/endcidchar),我们检查之前的映射值是否与当前的映射值相邻,因此我们可以通过将它们合并到一个范围中来进行优化。每个映射涉及堆栈上的 5 个条目,并且触发合并尝试的检查检查堆栈上的 >5 个条目。只要映射的数量足够大,我们总是有至少 10 个条目(合并代码将处理未处理的条目),它就可以工作。在这种情况下,我们只有两个映射,当我们检查一个marge condidate时,堆栈上有七个条目(当前5个,剩余映射2个),我们最终会出现stackunderflow错误,因为代码期望堆栈上至少有 10 个对象。

谢谢@chrisl


推荐阅读