Wie wird die "aktuelle Transformationsmatrix" mit einer CGContext-Funktion zurückgesetzt?

7

Ich mache eine Reihe von Übersetzungen und Drehungen auf der CTM und irgendwann muss ich sie auf die Identität zurücksetzen, bevor ich mit den Transformationen fortfahre.

Ich kann keinen geeigneten Weg finden, es zu tun (offensichtlich hätte es eine Funktion namens CGContextSetCTM oder so geben sollen) und da Effizienz der Schlüssel ist, möchte ich CGContextSaveGState / CGContextRestoreGState nicht verwenden ...

    
Ariel Malka 22.01.2009, 15:12
quelle

3 Antworten

14

Holen Sie sich die aktuelle Transformationsmatrix über CGContextGetCTM , invertiere es mit CGAffineTransformInvert und multipliziere die aktuelle Matrix mit der invertierten (das ist wichtig!) mit CGContextConcatCTM . CTM ist jetzt Identität.

    
EightyEight 07.02.2009, 00:57
quelle
3

Beachten Sie, dass das Invertieren der aktuellen CTM mit CGAffineTransformInvert nicht funktioniert, wenn Ihre aktuelle CTM singulär ist.

Der offensichtliche Fall ist, wenn zuvor CGContextConcatCTM mit der Matrix CGAffineTransformMake (0, 0, 0, 0, 0, 0) durchgeführt wurde.

    
jhavatar 01.06.2011 07:57
quelle
2

Die Sicherungs- / Wiederherstellungsoperationen sind wahrscheinlich eine einzelne Speicherkopie einer Speicherregion, die mit der Größe der Identitätsmatrix vergleichbar ist (zweimal oder dreimal so groß). Dies kann nur für die Speicheroperation geschehen. Beachten Sie, dass dies wahrscheinlich nicht viel langsamer ist als ein nop FUNCTION-Aufruf. Jede Grafikoperation hat die Skalierung mehrerer Multiplikationsoperationen, und ich vermute, dass dies für jeden Speicher / Wiederherstellungszyklus mehr als einmal in Ihrem Code passiert. Der Zeitpunkt einer Grafikoperation ist wahrscheinlich größer als ein einzelner Speicher- / Wiederherstellungszyklus.

    
Qwmiwn 25.04.2011 14:57
quelle