X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2f1ae4143271ae63a17e052a1a471d16e9cd8c44..b905d6cc083a38d46ae48712f5221236247a39ce:/src/mac/carbon/dcmemory.cpp diff --git a/src/mac/carbon/dcmemory.cpp b/src/mac/carbon/dcmemory.cpp index a56c7b5c49..7fb6a99482 100644 --- a/src/mac/carbon/dcmemory.cpp +++ b/src/mac/carbon/dcmemory.cpp @@ -1,19 +1,22 @@ ///////////////////////////////////////////////////////////////////////////// // Name: dcmemory.cpp // Purpose: wxMemoryDC class -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dcmemory.h" #endif +#include "wx/wxprec.h" + #include "wx/dcmemory.h" +#include "wx/mac/private.h" //----------------------------------------------------------------------------- // wxMemoryDC @@ -22,71 +25,124 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC) wxMemoryDC::wxMemoryDC(void) +: m_selected() { - m_ok = FALSE; + m_ok = TRUE; + SetBackground(*wxWHITE_BRUSH); + SetBrush(*wxWHITE_BRUSH); + SetPen(*wxBLACK_PEN); + SetFont(*wxNORMAL_FONT) ; + m_ok = FALSE; }; wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) ) +: m_selected() { - m_ok = FALSE; + m_ok = TRUE; + SetBackground(*wxWHITE_BRUSH); + SetBrush(*wxWHITE_BRUSH); + SetPen(*wxBLACK_PEN); + SetFont(*wxNORMAL_FONT) ; + m_ok = FALSE; }; -wxMemoryDC::~wxMemoryDC(void) +wxMemoryDC::~wxMemoryDC() { - if ( m_selected.Ok() ) - { - wxBitmapRefData * bmap = (wxBitmapRefData*) (m_selected.GetRefData()) ; - UnlockPixels( GetGWorldPixMap( (CGrafPtr) bmap->m_hBitmap ) ) ; - } + if ( m_selected.Ok() ) + { +#if wxMAC_USE_CORE_GRAPHICS + m_selected.EndRawAccess() ; + CGContextRef bmCtx = dynamic_cast(m_graphicContext)->GetNativeContext() ; + delete m_graphicContext ; + m_graphicContext = NULL ; + CGContextRelease( bmCtx ) ; +#else +// TODO UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) ); +#endif + } }; void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) { - if ( m_selected.Ok() ) - { - wxBitmapRefData * bmap = (wxBitmapRefData*) (m_selected.GetRefData()) ; - UnlockPixels( GetGWorldPixMap( (CGrafPtr) bmap->m_hBitmap ) ) ; - } - m_selected = bitmap; - if (m_selected.Ok()) - { - wxBitmapRefData * bmap = (wxBitmapRefData*) (m_selected.GetRefData()) ; - if ( bmap->m_hBitmap ) - { - m_macPort = (GrafPtr) bmap->m_hBitmap ; - LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ; - wxMask * mask = bitmap.GetMask() ; - if ( mask ) - { - m_macMask = mask->GetMaskBitmap() ; - } - MacSetupPort() ; - m_ok = TRUE ; - // SetBackground(wxBrush(*wxWHITE, wxSOLID)); - } - else - { - m_ok = FALSE; - } - } - else - { - m_ok = FALSE; - }; -}; + if ( m_selected.Ok() ) + { +#if wxMAC_USE_CORE_GRAPHICS + m_selected.EndRawAccess() ; + CGContextRef bmCtx = dynamic_cast(m_graphicContext)->GetNativeContext() ; + delete m_graphicContext ; + m_graphicContext = NULL ; + CGContextRelease( bmCtx ) ; +#else +// TODO UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) ); +#endif + } + m_selected = bitmap; + if (m_selected.Ok()) + { +#if wxMAC_USE_CORE_GRAPHICS + m_selected.UseAlpha() ; + void * data = m_selected.BeginRawAccess() ; + + int bitsPerComp = 8 ; + int bytesPerPixel = 4 ; + int w = bitmap.GetWidth() ; + int h = bitmap.GetHeight() ; + CGImageAlphaInfo a = kCGImageAlphaNoneSkipFirst ; + CGColorSpaceRef genericColorSpace = wxMacGetGenericRGBColorSpace(); + CGContextRef bmCtx = CGBitmapContextCreate(data , w, h, bitsPerComp , bytesPerPixel * w , genericColorSpace, a); + wxASSERT_MSG( bmCtx , wxT("Unable to create bitmap context") ) ; + + CGContextSetFillColorSpace(bmCtx, genericColorSpace); + CGContextSetStrokeColorSpace(bmCtx, genericColorSpace); -void wxMemoryDC::GetSize( int *width, int *height ) const + if( bmCtx ) + { + CGContextTranslateCTM( bmCtx , 0 , m_selected.GetHeight() ) ; + CGContextScaleCTM( bmCtx , 1 , -1 ) ; + m_graphicContext = new wxMacCGContext( bmCtx ) ; + m_graphicContext->SetPen( m_pen ) ; + m_graphicContext->SetBrush( m_brush ) ; + } + m_ok = (m_graphicContext != NULL) ; +#else + if ( ( m_macPort = m_selected.GetHBITMAP( &m_macMask ) ) != NULL ) + { + LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ; + /* + wxMask * mask = bitmap.GetMask() ; + if ( mask ) + { + m_macMask = mask->GetHBITMAP() ; + } + */ + SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , 0 , 0 , m_selected.GetWidth() , m_selected.GetHeight() ) ; + CopyRgn( (RgnHandle) m_macBoundaryClipRgn ,(RgnHandle) m_macCurrentClipRgn ) ; + m_ok = TRUE ; + } + else + { + m_ok = FALSE; + } +#endif + } + else + { + m_ok = FALSE; + } +} + +void wxMemoryDC::DoGetSize( int *width, int *height ) const { - if (m_selected.Ok()) - { - if (width) (*width) = m_selected.GetWidth(); - if (height) (*height) = m_selected.GetHeight(); - } - else - { - if (width) (*width) = 0; - if (height) (*height) = 0; - }; -}; + if (m_selected.Ok()) + { + if (width) (*width) = m_selected.GetWidth(); + if (height) (*height) = m_selected.GetHeight(); + } + else + { + if (width) (*width) = 0; + if (height) (*height) = 0; + } +}