2013-04-26 2 views
3

У меня есть вопрос о текущем состоянии графики и стеке состояния графики в PostScript.Реализация состояния текущей графики PostScript

В моем коде у меня теперь есть стек, который представляет текущее состояние графики. Когда я инициализирую свой интерпретатор, он создает новый объект GraphicsState и добавляет его в «gsstack».

My Current Graphics State реализуется как: 'gsstack'.Peek(), который всегда возвращает самое верхнее графическое состояние.

с оператором gsave Я создаю клон текущего состояния графики и нажимаю его на «gsstack», поэтому у меня есть новое верхнее графическое состояние в стеке (и это означает, что у меня есть новый объект Current Graphics State) ,

Теперь с grestore я прочитал это из http://www.tailrecursive.org/postscript/operators.html#grestore

«Устанавливает текущее графическое состояние в верхней графики состояния на графическое состояние стека и выскакивает это состояние из стека.»

Как работает этот grestore, потому что мое текущее состояние графики уже является самым верхним графическим состоянием ... я должен просто выскочить из стека?

Или моя реализация неправильная? Когда я инициализирую свой интерпретатор, должен ли я создать новый объект «Текущее графическое состояние», но не добавить его в «gsstack» и только нажать его на «gsstack» при вызове оператора gsave?

Заранее спасибо

+0

Использовать надлежащее справочное руководство по PostScript http://www.adobe.com/products/postscript/pdfs/PLRM.pdf не сторонний учебник – piokuc

+0

«Самое высокое графическое состояние всегда является текущим графическим состоянием». путающая информация http://stackoverflow.com/a/11139870/187650 – juFo

+0

Если это вам полезно, у меня есть полный переводчик уровня 1 в C, доступный [здесь] (http://code.google.com /p/xpost/downloads/detail?name=xpost2g.zip) (Недостаточно некоторых очень трудных операторов, таких как 'definefont'.) –

ответ

0

Да, grestore просто выталкивает стек графики.

Как и в стеке словаря, всегда должен быть systemdict и userdict (по крайней мере) внизу, всегда должно быть как минимум одно графическое состояние в стеке графики. Таким образом, grestore должен выдавать ошибку, если он обнаруживает только одно состояние в стеке (точно так же, как end следует выбросить ошибку, если обнаруживает только постоянные словари (systemdict и userdict для Level-1, добавляющий statusdict и globaldict для Level-2)).

Но вы можете захотеть реализовать графический стек по-другому от других стеков, потому что на него также влияют save и restore. restore должен всплыть во всех штатах более поздних, чем последние save. Если графический стек реализован как связанный список массивов или словарей, то restore сделает свою часть без лишних хлопот.

из PLRM, 3ED:

-   grestore   -

сбрасывает текущее графическое состояние от одного на верхней части графика состояния стека и выталкивает графика состояния стека, восстанавливая графическое состояние, действующее на момент операции gsave. Этот оператор обеспечивает простой способ отмены сложных преобразований и других модификаций состояния графики без для восстановления всех параметров графического состояния по отдельности.

Если верхнее графическое состояние на стеке было сохранено с сохранением, а не gsave (то есть, если не было gsave работы с момента последней непревзойденной экономии), grestore восстанавливает, что верхнее графическое состояние без выскакиваю его из стек . Если нет непревзойденного сохранения (что может произойти только во время неинкапсулированного задания ), и стек состояния графики пуст, grestore не влияет.

Вы можете игнорировать save и restore в первом, и просто сосредоточиться на gsave и grestore (и остальной функциональностью графики). save и restore получить очень сложно. Я несколько раз переработал свой интерпретатор, чтобы попытаться заставить их работать правильно.

+1

это правильно: если вы начинаете свой интерпретатор, у вас есть стек состояния графики, который имеет один Графическое состояние по умолчанию. Текущее состояние графики не смотрит прямо в стек с .Peek(), но имеет копию самого верхнего элемента в стеке состояния графики. Таким образом, интерпретатор имеет GSStack по умолчанию с одним GS и копией этого GS в текущем состоянии графики. ? – juFo

+0

Это кажется прекрасным, чтобы сделать копию для * active * gstate. Но использование .Peek() также должно работать. Для моего переводчика я использовал Cairo для графики, которая имеет свой собственный внутренний стек gstate. Так что было сложно сделать операцию сохранения/восстановления с помощью gsave/grestore. –

+0

, но Peek() смотрит и работает с последним элементом, который вы разместили в стеке. это не звучит хорошо? : s – juFo