From f96c37eaccca688109f3094e8cfa2cfac967d267 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 27 Sep 2018 22:50:45 +0200 Subject: [PATCH] Preserve wxGraphicsContext settings while resetting the clipping To reset the clipping there is necessary to restore all CGContext settings so we need to set them back to the previous values based on the stored wxGraphicsContext attributes. --- src/osx/carbon/graphics.cpp | 203 +++++++++++++++++++++--------------- 1 file changed, 119 insertions(+), 84 deletions(-) diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index c2fc7523b6..cd99421373 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -1430,6 +1430,9 @@ public: private: bool EnsureIsValid(); void CheckInvariants() const; + bool DoSetAntialiasMode(wxAntialiasMode antialias); + bool DoSetInterpolationQuality(wxInterpolationQuality interpolation); + bool DoSetCompositionMode(wxCompositionMode op); virtual void DoDrawText( const wxString &str, wxDouble x, wxDouble y ) wxOVERRIDE; virtual void DoDrawRotatedText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ) wxOVERRIDE; @@ -1678,6 +1681,16 @@ bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) m_antialias = antialias; + if ( !DoSetAntialiasMode(antialias) ) + { + return false; + } + CheckInvariants(); + return true; +} + +bool wxMacCoreGraphicsContext::DoSetAntialiasMode(wxAntialiasMode antialias) +{ bool antialiasMode; switch (antialias) { @@ -1691,7 +1704,6 @@ bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) return false; } CGContextSetShouldAntialias(m_cgContext, antialiasMode); - CheckInvariants(); return true; } @@ -1704,9 +1716,20 @@ bool wxMacCoreGraphicsContext::SetInterpolationQuality(wxInterpolationQuality in return true; m_interpolation = interpolation; + + if ( !DoSetInterpolationQuality(interpolation) ) + { + return false; + } + CheckInvariants(); + return true; +} + +bool wxMacCoreGraphicsContext::DoSetInterpolationQuality(wxInterpolationQuality interpolation) +{ CGInterpolationQuality quality; - - switch (interpolation) + + switch (interpolation) { case wxINTERPOLATION_DEFAULT: quality = kCGInterpolationDefault; @@ -1727,7 +1750,6 @@ bool wxMacCoreGraphicsContext::SetInterpolationQuality(wxInterpolationQuality in return false; } CGContextSetInterpolationQuality(m_cgContext, quality); - CheckInvariants(); return true; } @@ -1741,7 +1763,17 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) m_composition = op; - if (m_composition == wxCOMPOSITION_DEST) + if ( !DoSetCompositionMode(op) ) + { + return false; + } + CheckInvariants(); + return true; +} + +bool wxMacCoreGraphicsContext::DoSetCompositionMode(wxCompositionMode op) +{ + if (op == wxCOMPOSITION_DEST) return true; // TODO REMOVE if we don't need it because of bugs in 10.5 @@ -1751,44 +1783,44 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) CGBlendMode mode = kCGBlendModeNormal; switch( op ) { - case wxCOMPOSITION_CLEAR: - cop = kCGCompositeOperationClear; - break; - case wxCOMPOSITION_SOURCE: - cop = kCGCompositeOperationCopy; - break; - case wxCOMPOSITION_OVER: - mode = kCGBlendModeNormal; - break; - case wxCOMPOSITION_IN: - cop = kCGCompositeOperationSourceIn; - break; - case wxCOMPOSITION_OUT: - cop = kCGCompositeOperationSourceOut; - break; - case wxCOMPOSITION_ATOP: - cop = kCGCompositeOperationSourceAtop; - break; - case wxCOMPOSITION_DEST_OVER: - cop = kCGCompositeOperationDestinationOver; - break; - case wxCOMPOSITION_DEST_IN: - cop = kCGCompositeOperationDestinationIn; - break; - case wxCOMPOSITION_DEST_OUT: - cop = kCGCompositeOperationDestinationOut; - break; - case wxCOMPOSITION_DEST_ATOP: - cop = kCGCompositeOperationDestinationAtop; - break; - case wxCOMPOSITION_XOR: - cop = kCGCompositeOperationXOR; - break; - case wxCOMPOSITION_ADD: - mode = kCGBlendModePlusLighter ; - break; - default: - return false; + case wxCOMPOSITION_CLEAR: + cop = kCGCompositeOperationClear; + break; + case wxCOMPOSITION_SOURCE: + cop = kCGCompositeOperationCopy; + break; + case wxCOMPOSITION_OVER: + mode = kCGBlendModeNormal; + break; + case wxCOMPOSITION_IN: + cop = kCGCompositeOperationSourceIn; + break; + case wxCOMPOSITION_OUT: + cop = kCGCompositeOperationSourceOut; + break; + case wxCOMPOSITION_ATOP: + cop = kCGCompositeOperationSourceAtop; + break; + case wxCOMPOSITION_DEST_OVER: + cop = kCGCompositeOperationDestinationOver; + break; + case wxCOMPOSITION_DEST_IN: + cop = kCGCompositeOperationDestinationIn; + break; + case wxCOMPOSITION_DEST_OUT: + cop = kCGCompositeOperationDestinationOut; + break; + case wxCOMPOSITION_DEST_ATOP: + cop = kCGCompositeOperationDestinationAtop; + break; + case wxCOMPOSITION_XOR: + cop = kCGCompositeOperationXOR; + break; + case wxCOMPOSITION_ADD: + mode = kCGBlendModePlusLighter ; + break; + default: + return false; } if ( cop != kCGCompositeOperationSourceOver ) CGContextSetCompositeOperation(m_cgContext, cop); @@ -1800,50 +1832,47 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) CGBlendMode mode = kCGBlendModeNormal; switch( op ) { - case wxCOMPOSITION_CLEAR: - mode = kCGBlendModeClear; - break; - case wxCOMPOSITION_SOURCE: - mode = kCGBlendModeCopy; - break; - case wxCOMPOSITION_OVER: - mode = kCGBlendModeNormal; - break; - case wxCOMPOSITION_IN: - mode = kCGBlendModeSourceIn; - break; - case wxCOMPOSITION_OUT: - mode = kCGBlendModeSourceOut; - break; - case wxCOMPOSITION_ATOP: - mode = kCGBlendModeSourceAtop; - break; - case wxCOMPOSITION_DEST_OVER: - mode = kCGBlendModeDestinationOver; - break; - case wxCOMPOSITION_DEST_IN: - mode = kCGBlendModeDestinationIn; - break; - case wxCOMPOSITION_DEST_OUT: - mode = kCGBlendModeDestinationOut; - break; - case wxCOMPOSITION_DEST_ATOP: - mode = kCGBlendModeDestinationAtop; - break; - case wxCOMPOSITION_XOR: - mode = kCGBlendModeExclusion; // Not kCGBlendModeXOR! - break; - - case wxCOMPOSITION_ADD: - mode = kCGBlendModePlusLighter ; - break; - default: - return false; + case wxCOMPOSITION_CLEAR: + mode = kCGBlendModeClear; + break; + case wxCOMPOSITION_SOURCE: + mode = kCGBlendModeCopy; + break; + case wxCOMPOSITION_OVER: + mode = kCGBlendModeNormal; + break; + case wxCOMPOSITION_IN: + mode = kCGBlendModeSourceIn; + break; + case wxCOMPOSITION_OUT: + mode = kCGBlendModeSourceOut; + break; + case wxCOMPOSITION_ATOP: + mode = kCGBlendModeSourceAtop; + break; + case wxCOMPOSITION_DEST_OVER: + mode = kCGBlendModeDestinationOver; + break; + case wxCOMPOSITION_DEST_IN: + mode = kCGBlendModeDestinationIn; + break; + case wxCOMPOSITION_DEST_OUT: + mode = kCGBlendModeDestinationOut; + break; + case wxCOMPOSITION_DEST_ATOP: + mode = kCGBlendModeDestinationAtop; + break; + case wxCOMPOSITION_XOR: + mode = kCGBlendModeExclusion; // Not kCGBlendModeXOR! + break; + case wxCOMPOSITION_ADD: + mode = kCGBlendModePlusLighter ; + break; + default: + return false; } CGContextSetBlendMode(m_cgContext, mode); } - - CheckInvariants(); return true; } @@ -1939,6 +1968,12 @@ void wxMacCoreGraphicsContext::ResetClip() transformNew = CGAffineTransformInvert( transformNew ) ; CGContextConcatCTM( m_cgContext, transformNew); CGContextConcatCTM( m_cgContext, transform); + // Retain antialiasing mode + DoSetAntialiasMode(m_antialias); + // Retain interpolation quality + DoSetInterpolationQuality(m_interpolation); + // Retain composition mode + DoSetCompositionMode(m_composition); } else {