2015-01-09 2 views
2

Я пишу программу, которая преобразует файл постскриптума в более простую последовательность точек, которые я могу отправить на плоттер, который я создаю. Я делаю это, запустив немного кода заголовка, который заменяет операции рисования с операциями, которые печати указывает на стандартный вывод, что моя основная программа управления будет использовать:Отключить шаблон кэширования

/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 

Как примечание стороны, я действительно хочу приписка была команда printf, например 1 1 add (1+1=%d) printf.

Для этого, чтобы работать со шрифтами, я отключил кеширование шрифтов, установив ограничение кеша на 0, с 0 setcachelimit. В противном случае интерпретатор postscript не будет вызывать операции рисования для последующего использования кешированных объектов. Я бы скорее отключил кеширование шрифтов, переопределив setcachedevice и setcachedevice2, но эти операторы также должны обрабатывать некоторые характеристики метрики символов, а не только кеширование.

Пути пользователя также могут быть кэшированы, и я был в состоянии отключить это кэширование, переопределив ucache и установив ограничение на кеш на 0 через /ucache {} def.

Однако не существует команды для настройки параметров кэша паттерна, и шаблонам не требуется явно запрашивать кеширование., И даже если бы это было, мне нужно было заставить его вызывать операции рисования для каждого и каждой ячейке шаблона даже в пределах одной операции заполнения. Как отключить кэширование шаблонов?

ответ

2
<</MaxPatternCache 0>> setsystemparams 

Предполагая, что ваш переводчик не имеет пароля, защищающий параметры системы, и что он почитает это системный параметр.

См. Приложение C третьего издания PLRM, особенно раздел «C.3.3 Другие кэш». Вам также нужно будет рассмотреть формы.

+0

Вы знаете об интерпретаторе, который будет уважать этот параметр? Я попробовал его с ghostscript, но он все равно кэширует их, даже между отдельными операциями заполнения. – AJMansfield

+0

Ну, я полагаю, что CPSI от Adobe делает это, также делает Global Graphics 'JAWS Rip. У меня нет реального представления о других. Если вы имеете в виду интерпретатор PostScript с открытым исходным кодом, то я не думаю, что в наши дни есть какие-то исключения, кроме Ghostscript (у Luser Droog есть один, но я не уверен, что он достаточно полно, чтобы иметь дело с шаблонами). Вы не можете отключить кеш шаблона в Ghostscript, что является фундаментальным для работы графической библиотеки. – KenS

+0

Возможно, вам захочется рассмотреть wirting устройство Ghostscript вместо того, чтобы взломать язык, который даст вам доступ к объектам, а не пытается извлечь их в этом довольно медленном и болезненном виде. Наконец, вы можете переопределить makepattern и setpattern, чтобы сохранить определение шаблона самостоятельно.Затем вы можете переопределить setcolorspace, чтобы пометить шаблон по области самостоятельно. Как вы планируете иметь дело с изображениями и оттенками? – KenS

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 несут свою собственную информацию о типе. Был оператор расширения NeWS под названием printf, который приближается к отметке, я думаю (ref) (pdf).

enter image description here

Я знаю, что говорит sprintf здесь, который немного отличается, но printf запись просто называют эту запись.