當前頁面設備是在介質上做標記的設備,在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並閱讀字典內容。請注意,左側的字典有內容,右側是空的。
我不認爲'狀態'是指在解釋器中的任何特定的實現,它只是程序跟蹤的東西本身。 「
」頁面設備字典不作爲圖形狀態的一部分進行維護,它由設備維護。「 看到我的截圖,你會看到「currentpagedevice」是圖形狀態中的一個dicttype。所以它是圖形狀態的一部分,但是你說它不作爲圖形狀態的一部分被維護,它是一個單獨的對象。你能更清楚一點嗎? 我是否正確理解nulldevice,cachedevice和displaydevice都是「頁面設備」。並且nulldevice只是一個頁面設備,它具有空的頁面設備字典? – juFo