X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f1c8bd4d13ee2e1a6830c68770b7acdad7ca946..5f7348ce627157e21bec507623ebd31c1e9dc762:/src/mac/carbon/utils.cpp diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index cef9733b64..479e31e3cd 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -93,7 +93,7 @@ static int DoGetOSVersion(int *majorVsn, int *minorVsn) // debugging support // ---------------------------------------------------------------------------- -#if defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400) +#if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400) // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds... @@ -1107,10 +1107,25 @@ void wxMacControl::SetDrawingEnabled( bool enable ) bool wxMacControl::GetNeedsDisplay() const { #if TARGET_API_MAC_OSX - return HIViewGetNeedsDisplay( m_controlRef ) ; -#else - return false ; + if ( m_isCompositing ) + { + return HIViewGetNeedsDisplay( m_controlRef ) ; + } + else #endif + { + if ( !IsVisible() ) + return false ; + + Rect controlBounds ; + GetControlBounds( m_controlRef, &controlBounds ) ; + RgnHandle rgn = NewRgn() ; + GetWindowRegion ( GetControlOwner( m_controlRef ) , kWindowUpdateRgn , rgn ) ; + Boolean intersect = RectInRgn ( &controlBounds , rgn ) ; + DisposeRgn( rgn ) ; + return intersect ; + } + } #endif @@ -1223,6 +1238,8 @@ void wxMacControl::SetRect( Rect *r ) Rect controlBounds = *r ; + // since the rect passed in is always (even in non-compositing) relative + // to the (native) parent, we have to adjust to window relative here wxMacControl* parent = m_peer->GetParent()->GetPeer() ; if( parent->m_isRootControl == false ) { @@ -1351,12 +1368,29 @@ void wxMacControl::InvalidateWithChildren() #endif } -void wxMacControl::ScrollRect( const wxRect &r , int dx , int dy ) +void wxMacControl::ScrollRect( wxRect *r , int dx , int dy ) { + wxASSERT( r != NULL ) ; #if TARGET_API_MAC_OSX - HIRect scrollarea = CGRectMake( r.x , r.y , r.width , r.height) ; - HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ) ; + if ( m_isCompositing ) + { + HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height) ; + HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ) ; + } + else #endif + { + Rect bounds ; + GetControlBounds( m_controlRef , &bounds ) ; + bounds.left += r->x ; + bounds.top += r->y ; + bounds.bottom = bounds.top + r->height ; + bounds.right = bounds.left + r->width ; + wxMacWindowClipper clip( m_peer ) ; + RgnHandle updateRgn = NewRgn() ; + ::ScrollRect( &bounds , dx , dy , updateRgn ) ; + InvalWindowRgn( GetControlOwner( m_controlRef ) , updateRgn ) ; + } } @@ -1457,5 +1491,73 @@ OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable ) return ::SetTabEnabled( m_controlRef , tabNo , enable ) ; } +// +// Quartz Support +// + +#ifdef __WXMAC_OSX__ +// snippets from Sketch Sample from Apple : + +#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc" +/* + This function locates, opens, and returns the profile reference for the calibrated + Generic RGB color space. It is up to the caller to call CMCloseProfile when done + with the profile reference this function returns. +*/ +CMProfileRef wxMacOpenGenericProfile(void) +{ + static CMProfileRef cachedRGBProfileRef = NULL; + + // we only create the profile reference once + if (cachedRGBProfileRef == NULL) + { + CMProfileLocation loc; + + loc.locType = cmPathBasedProfile; + strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr); + + verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) ); + } + + if (cachedRGBProfileRef) + { + // clone the profile reference so that the caller has their own reference, not our cached one + CMCloneProfileRef(cachedRGBProfileRef); + } + + return cachedRGBProfileRef; +} + +/* + Return the generic RGB color space. This is a 'get' function and the caller should + not release the returned value unless the caller retains it first. Usually callers + of this routine will immediately use the returned colorspace with CoreGraphics + so they typically do not need to retain it themselves. + + This function creates the generic RGB color space once and hangs onto it so it can + return it whenever this function is called. +*/ + +CGColorSpaceRef wxMacGetGenericRGBColorSpace() +{ + static CGColorSpaceRef genericRGBColorSpace = NULL; + + if (genericRGBColorSpace == NULL) + { + CMProfileRef genericRGBProfile = wxMacOpenGenericProfile(); + + if (genericRGBProfile) + { + genericRGBColorSpace = CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile); + wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") ) ; + + // we opened the profile so it is up to us to close it + CMCloseProfile(genericRGBProfile); + } + } + return genericRGBColorSpace; +} +#endif + #endif // wxUSE_GUI