Как сбросить до идентичности "текущую матрицу преобразования" с некоторой функцией CGContext?


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

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

3 7

3 ответа:

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

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

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

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