我正在編寫的應用程序使用libcairo輸出矢量圖形;對於支持多頁(PDF,PostScript)的輸出格式,一切正常,但是我也想支持SVG和光柵圖像格式。使用libcairo和Haskell的多頁SVG
我現在只是簡單地用showPage
推動頁面,只要我會溢出底部邊距,我想保持這種方式的代碼結構。我來了兩個theroretically可能的解決方案:
一)一個輔助的單子是環繞開羅Render
單子,但提供了一個flushPage
動作,當鏈接到它,使當前渲染動作到內部頁堆棧, liftRender
將通過將其鏈接到以前緩存的動作中,將單個動作解壓到單聲道中,然後使用輔助函數提取Render()
動作列表,每個頁面一個動作。所以我只是簡單地調用我的主要渲染函數,而不是Render()
動作,它會返回一個分頁包裝操作,然後我會從中提取單個頁面並處理它們 - 對於多頁面格式,我可以將它們鏈接在一起,在它們之間插入showPage
動作,而對於單頁格式,我會單獨渲染它們。作爲一個例子,這裏是它會是什麼樣子:
-- original code
renderMe :: Render()
renderMe = do
newPath
moveTo 10 10
lineTo 20 20
lineTo 10 30
lineTo 10 10
fill
showPage
newPath
moveTo 10 10
lineTo 20 20
lineTo 10 30
lineTo 10 10
fill
-- new code
renderPages :: PagedRender()
renderPages = do
liftRender (do
newPath
moveTo 10 10
lineTo 20 20
lineTo 10 30
lineTo 10 10
fill)
flushPage
liftRender (do
newPath
moveTo 10 10
lineTo 20 20
lineTo 10 30
lineTo 10 10
fill)
flushPage
B),其作用類似於在外面多頁文檔開羅面型,但產生了一系列的外單頁文檔。這將是理想的,因爲它根本不需要對渲染代碼進行任何更改,但是我不確定是否可以在不破壞開源本身的情況下做到這一點。
所以,實際問題:以上解決方案是否已經存在?如有,有人寫過'分頁包裝monad'或'多頁SVG表面'嗎?並且,如果答案是「否」;哪一個更好?你將如何去實施它?
這不完全是我正在尋找的 - 我實際上將SVG和其他矢量格式輸出到文件中,並且因爲我正在使用libcairo進行此操作,所以我沒有達到此級別的控制要求。 – tdammers