Как сбросить до тождества «текущую матрицу преобразования» с какой-то функцией CGContext? - PullRequest
7 голосов
/ 22 января 2009

Я делаю серию переводов и ротаций на CTM, и в какой-то момент мне нужно сбросить его на идентичность, прежде чем идти дальше с преобразованиями.

Я не могу найти какой-либо правильный способ сделать это (очевидно, должна была быть функция с именем CGContextSetCTM или около того), и поскольку эффективность является ключевым фактором, я не хочу использовать CGContextSaveGState / CGContextRestoreGState ...

Ответы [ 3 ]

15 голосов
/ 07 февраля 2009

Получить текущую матрицу преобразования через CGContextGetCTM , инвертировать ее с помощью CGAffineTransformInvert и умножить текущую матрицу на инвертированную (это важно!) С CGContextConcatCTM . CTM теперь личность.

3 голосов
/ 01 июня 2011

Обратите внимание, что инвертирование текущего CTM с помощью CGAffineTransformInvert не работает, если ваш текущий CTM является единственным.

Очевидный случай, если ранее CGContextConcatCTM выполнялся с матрицей CGAffineTransformMake (0, 0, 0, 0, 0, 0).

2 голосов
/ 25 апреля 2011

Операции сохранения / восстановления, вероятно, представляют собой одну копию памяти области памяти, сопоставимой с размером матрицы идентификаторов (в два или три раза больше). Это может произойти только для операции сохранения. Учтите, что это, вероятно, не намного медленнее, чем вызов nop FUNCTION. Каждая графическая операция имеет масштаб нескольких операций умножения, и я предполагаю, что это происходит более одного раза в вашем коде для каждого цикла сохранения / восстановления. Время одной графической операции, вероятно, больше, чем один цикл сохранения / восстановления.

...