objective framework developer apple cocoa-touch matrix core-graphics

cocoa touch - framework - ¿Cómo reiniciar para identificar la "matriz de transformación actual" con alguna función CGContext?



objective c documentation (3)

Obtenga la matriz de transformación actual a través de CGContextGetCTM , inviértala con CGAffineTransformInvert y multiplique la matriz actual por la invertida (¡eso es importante!) Con CGContextConcatCTM . CTM ahora es identidad.

Estoy haciendo una serie de traducciones y rotaciones en el CTM y en algún momento necesito restablecerlo a identidad antes de ir más allá con las transformaciones.

No puedo encontrar ninguna forma adecuada de hacerlo (obviamente, debería haber habido una función llamada CGContextSetCTM o más) y dado que la eficiencia es la clave, no quiero usar CGContextSaveGState / CGContextRestoreGState ...


Las operaciones de guardar / restaurar son probablemente una sola copia de memoria de una región de memoria comparable al tamaño de la matriz de identidad (dos o tres veces el tamaño). Puede suceder solo para la operación de salvar. Considere que esto probablemente no sea mucho más lento que una llamada de función de nop. Cada operación gráfica está en la escala de varias operaciones de multiplicación y supongo que esto sucede más de una vez en tu código para cada ciclo de salvar / restaurar. El tiempo de una operación gráfica es probablemente más grande que un solo ciclo de guardar / restaurar.


Tenga en cuenta que invertir el CTM actual con CGAffineTransformInvert no funciona si su CTM actual es singular.

El caso obvio es si previamente CGContextConcatCTM se realizó con la matriz CGAffineTransformMake (0, 0, 0, 0, 0, 0).