2017-02-21 4 views
-1

Есть ли способ доступа к HTML Canvas элементам DrawingContext2Dsave и restore стек под капотом?Доступ к стеку холста Canvas's DrawingContext2D для сохранения/восстановления?

Цель будет save база государства, clip области его, чтобы некоторые операции, которые имеют место, которые могут применяться clip, save, restore с неопределенными заказами (то есть что-то может save 2-3 состояния в стек и никогда не восстановить их, или он может restore несколько раз и теряют первоначальный save состояние до перехода обратно в материнскую функцию, которая будет затем пытается restore государство, которое больше не существует в стеке.)

Я предпочитаю сделать это без класса обертки вокруг DrawingContext2D sinc e JavaScript становится немного медленнее при каждом вызове функции, и рендеринг имеет тенденцию быть чувствительным к времени.

Было бы также полезно ограничить количество возможных вызовов в вызываемой функции restore, не полагаясь на вызываемую функцию для поддержания этого предела.

ответ

2

Есть ли способ получить доступ к кадру сохранения и восстановления элемента DrawingContext2D элемента HTML Canvas под капотом?

Штатный стек является внутренним и не подвергается каким-либо образом. Вы можете сами использовать вызовы сохранения/восстановления, рекламируя свои собственные вызовы в качестве оберток в контексте прототипом (см., Например, this answer, который показывает один подход), а оттуда отслеживать отслеживание - это не повлияет на остальную часть контекста С точки зрения производительности. И, конечно, у вас все равно не будет доступа к внутренним. Были бы некоторые предостережения, например, как вы различаете источник вызова и как вы узнаете, когда должен быть разрешен вызов (нет ответа restore() более save()).

Однако, если возможно, я бы вообще не использовал сохранение/восстановление. Большинство состояний можно отслеживать «вручную», только отслеживая или устанавливая состояния, в которых вы действительно нуждаетесь, включая преобразования (setTransform() здесь очень удобно).

Главным препятствием является использование обрезки. В настоящее время нет способа сбросить клиппинг без использования сохранения/восстановления (или установить размер контекста) - standard includes it, но в настоящее время он не поддерживается ни одним из поставщиков. Однако во многих случаях вы можете заменить обрезку, используя вместо этого композицию, иногда комбинированную с заставками.

+1

[webkit said no] (https://bugs.webkit.org/show_bug.cgi?id=82801), потому что [* A library *] "* не может рисовать вне указанного вами клипа. С resetClip (), что библиотека JS может нарисовать везде, где он хочет ... * «[комментарий # 25] (https://bugs.webkit.org/show_bug.cgi?id=82801#c25) Этот бедный парень не делает знать трюк 'canvas.width = canvas.width' для * evil libs * и не сообщает нам, как мы, вероятно, делаем это неправильно *, когда мы просто хотим сбросить область отсечения, а не все другие свойства контекста ... – Kaiido

+0

@Kaiido просто ничего себе ...: -/ – K3N

+0

@Kaiido 'resetClip' не существует в' Chrome', не уверен в других браузерах. Любая идея, когда она делает это для производства? – CoryG

Смежные вопросы