2017-02-21 55 views
-1

有沒有一種方法可以在引擎蓋下訪問元素的DrawingContext2Dsaverestore堆棧的HTML Canvas訪問HTML5畫布的DrawingContext2D保存/恢復堆棧?

的目的是要save基本狀態,clip的它關閉的區域,允許一些操作,以採取可能適用clipsaverestore與不確定的訂單(即不是有什麼事情save 2-3狀態堆棧地方永不恢復它們也可能restore多次,要回這將隨後試圖restore在堆棧中不再存在的狀態父函數之前,失去了原有的save狀態。)

我寧願在沒有圍繞DrawingContext2D sinc的包裝類的情況下做到這一點e每次函數調用JavaScript都會稍微慢一點,渲染往往是時間敏感的。

能夠限制被調用函數中可能調用restore調用的次數也是非常好的,而不依賴於被調用的函數來維持該限制。

回答

2

有沒有一種方法可以訪問HTML Canvas元素的DrawingContext2D保存和恢復堆棧?

狀態堆棧是內部的而不是以任何方式暴露。您可以通過在上下文原型(例如參見this answer,其中顯示一種方法)上宣傳自己的調用作爲包裝,並從那裏保留計數跟蹤 - 這不會影響上下文的其餘部分性能明智的。當然,你仍然無法訪問內部。有一些警告,例如你如何區分呼叫源,你怎麼知道什麼時候應該允許呼叫(呼叫restore()超過save()是安全的)。

但是,如果可能的話,我會避免使用保存/恢復。大多數州可以通過跟蹤或設置您實際需要的狀態(包括轉換)「手動」進行跟蹤(setTransform()在這裏非常方便)。

主要障礙是使用裁剪時。目前沒有辦法在不使用保存/恢復(或設置上下文的大小)的情況下重置裁剪 - standard includes it,但目前似乎沒有任何供應商支持。但是,在許多情況下,您可以通過使用合成來代替裁剪,有時與屏幕畫布結合使用。

+1

[webkit said no](https://bugs.webkit.org/show_bug.cgi?id=82801)因爲[* A library *]「*無法在您指定的剪輯之外繪製。 ),JS庫可以在任何想要的地方繪製 ...... *「[comment#25](https://bugs.webkit.org/show_bug.cgi?id=82801#c25)這個可憐的人不會知道* evil libs *的'canvas.width = canvas.width'技巧,並沒有告訴我們我們可能做錯了*當我們只想重置剪輯區域而不是上下文的所有其他屬性時... – Kaiido

+0

@Kaiido just哇...: -/ – K3N

+0

@Kaiido'ChromeClip'中不存在resetClip,不知道其他瀏覽器。任何想法,當它生產? – CoryG