2017-05-09 95 views
1

我對圖形狀態和設備有點困惑。PostScript(page)設備問題

PLRM頁679:

如果有效 當前頁面的設備,這些請求的值是通過setpagedevice合併到 當前頁面設備字典。這些參數的解釋在第6.2節中描述「頁設備參數。」

如果我讀這個我明白,圖形狀態保持當前頁設備字典。 它似乎也舉行「當前頁面設備

我假設詞典是一個你可以修改和當前頁面設備是隻讀的「對象」從設備默認值?

通過閱讀你知道,有一個以上的設備手冊:

  • pagedevice
  • cachedevice
  • nulldevice
  • ...

但graphicsstate似乎只關心pagedevices。它是否正確? 設置時cachedevice和nulldevice存儲在哪裏?

如果我嘗試IdePS,那麼我看到ghostscript只有在狀態字典中有一個currentpagedevice。當執行「nulldevice」時,currentpagedevice仍然存在。 enter image description here

這個「當前頁面設備」(而不是字典),這也存儲在graphicstate?

回答

2

當前頁面設備是在介質上做標記的設備,在Ghostscript中-sDEVICE參數是初始頁面設備。

但是可以有許多其他設備,最明顯的是nulldevice,這只是一個小桶。如果您執行nulldevice那麼這將用空設備替換處於圖形狀態的當前頁面設備。顯然你通常在gsave/grestore對裏面這樣做,這樣你就可以grestore回到原來的設備!

同樣,將字形渲染到緩存時,其正常情況下會推送緩存設備並使其成爲當前頁面設備。再次,這是在隱式保存/恢復中完成的,以便您可以返回到常規頁面設備。這是爲了讓您可以獲取表示呈現的字形的位圖,以便對其進行緩存。

這些被稱爲頁面設備,以區別於其他設備,如I/O設備。

每個頁面設備都有一個包含鍵和值的頁面設備字典(它可以是空的)。您可以通過執行currentpagedevice以字典的形式檢索設備的當前設置。您可以通過使用鍵/值對創建字典並使用setpagedevice將請求發送到設備來修改設備的行爲。請注意,設備可能會忽略該請求,如果沒有,則會重置當前頁面。

,所以我期望:

currentpagedevice {exch == ==} forall 
nulldevice 
currentpagedevice {exch == ==} forall 

給出不同的結果。

備註 頁面設備字典不作爲圖形狀態的一部分進行維護,它由設備維護。

圖形狀態是設備本身,通常是某種不透明的對象,你不能做任何事情。

我不確定你的意思是:「如果我嘗試使用IdePS,那麼我會看到ghostscript在狀態字典中只有一個currentpagedevice。當執行」nulldevice「時,currentpagedevice仍然存在。

currentpagdevice是返回屬於當前頁面設備的頁面設備字典的運算符。所以你不能有「狀態字典中的currentpagedevice」。 currentpagedevice總是存在,因爲它是一個操作符。

如果我運行上面的代碼,我發現原始頁面設備有一個包含許多條目的字典,但是空設備有一個空的頁面設備字典。

[編輯]

那麼,它的真實,其在Ghostscript的,但這是(至少部分地),因爲不可思議的方式Ghostscript的字典實現setpagedevice。 FWIW Distiller也將它實現爲一個字典,但我至少知道一個解釋器,它不會從C結構中維護的條目創建一個新字典,並在執行currentpagedevice時返回該字典。我的印象是這是一個PostScript問題,而不是一個特定的Ghostscript問題.... :-)

如果您將它作爲字典實現,那麼您必須確保由設備維護的字典是同步的字典處於圖形狀態,或者使用其他方法從currentpagedevice返回字典。當然,這些可以是相同的字典,這意味着它不是問題。

我不確定你的程序是如何工作的,圖形狀態是一個不透明的對象,它不能審問它。我的猜測是,該計劃保持着自己的'國家'記錄。這個記錄與口譯員的內部狀態無關。我可以告訴你一個事實,即你在'state'下列出的內容甚至不接近由Ghostscript內部維護的圖形狀態的內容。

我建議IdePS程序是(幕後)執行一個currentpagedevice並閱讀字典內容。請注意,左側的字典有內容,右側是空的。

我不認爲'狀態'是指在解釋器中的任何特定的實現,它只是程序跟蹤的東西本身。 「

+0

」頁面設備字典不作爲圖形狀態的一部分進行維護,它由設備維護。「 看到我的截圖,你會看到「currentpagedevice」是圖形狀態中的一個dicttype。所以它是圖形狀態的一部分,但是你說它不作爲圖形狀態的一部分被維護,它是一個單獨的對象。你能更清楚一點嗎? 我是否正確理解nulldevice,cachedevice和displaydevice都是「頁面設備」。並且nulldevice只是一個頁面設備,它具有空的頁面設備字典? – juFo