3

PostScript の現在のグラフィックス状態とグラフィックス状態スタックについて質問があります。

私のコードでは、現在のグラフィックスの状態を表す Stack があります。インタープリターを初期化すると、新しい GraphicsState オブジェクトが作成され、「gsstack」に追加されます。

私の現在のグラフィックス状態は次のように実装されています: 'gsstack'.Peek() これは常に最上位のグラフィックス状態を返します。

gsave オペレーターを使用して、現在のグラフィック状態のクローンを作成し、それを「gsstack」にプッシュします。つまり、スタックに新しい最上位のグラフィック状態があります (これは、新しい Current Graphics State オブジェクトがあることを意味します)。

今grestoreで私はhttp://www.tailrecursive.org/postscript/operators.html#grestoreからこれを読みました

"現在のグラフィック状態をグラフィック状態スタックの最上位のグラフィック状態に設定し、その状態をスタックからポップします。"

私の現在のグラフィックス状態はすでに最上位のグラフィックス状態であるため、そのgrestoreはどのように機能しますか...スタックからポップする必要がありますか?

それとも私の実装が間違っていますか?インタープリターを初期化するときに、新しい現在のグラフィックス状態オブジェクトを作成する必要がありますが、それを「gsstack」に追加せず、gsave オペレーターが呼び出されたときにのみ「gsstack」にプッシュする必要がありますか?

前もって感謝します

4

1 に答える 1

0

はい、grestore単にグラフィック スタックをポップします。

ディクショナリ スタックの一番下に systemdict と userdict が常に (少なくとも) あるように、グラフィックス スタックには少なくとも 1 つのグラフィックス状態が常に存在する必要があります。そのgrestoreため、スタック上に 1 つの状態しか見つからない場合はエラーをスローする必要があります (永続的なend辞書 (レベル 1 の systemdict と userdict、レベル 2 の statusdict と globaldict を追加)のみを検出した場合にエラーをスローするのと同じように)。

saveただし、グラフィックス スタックはおよびの影響も受けるため、他のスタックとは異なる方法で実装することをお勧めしますrestorerestore前回よりも新しいすべての状態をポップする必要がありsaveます。グラフィックス スタックが配列または辞書のリンク リストとして実装されている場合、restore余分な手間をかけずにその役割を果たします。

PLRM から、3ed:

– グレストア –

グラフィックス状態スタックの一番上にあるものから現在のグラフィックス状態をリセットし、グラフィックス状態スタックをポップして、一致する gsave 操作の時点で有効なグラフィックス状態を復元します。この演算子は、すべてのグラフィックス状態パラメーターを個別に再確立することなく、複雑な変換やその他のグラフィックス状態の変更を元に戻す簡単な方法を提供します。

スタックの最上位のグラフィックス状態が gsave ではなく save で保存された場合 (つまり、最新の一致しない保存以降に gsave 操作が行われていない場合)、grestore はその最上位のグラフィックス状態をスタックからポップせずに復元します。一致しない保存 (カプセル化されていないジョブでのみ発生する可能性があります) がなく、グラフィック状態スタックが空の場合、grestore は効果がありません。

save最初はandを無視して、 and (およびその他のグラフィック機能)restoreだけに集中することもできます。と非常に複雑になります。インタープリターを正しく動作させるために、インタープリターを何度か再設計しました。gsavegrestoresaverestore

于 2013-04-27T13:14:43.870 に答える