X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..5dafb071ba85e7329aa4a0ac176f3ec8e13e55dc:/src/mac/carbon/dcmemory.cpp?ds=sidebyside diff --git a/src/mac/carbon/dcmemory.cpp b/src/mac/carbon/dcmemory.cpp index e850a59e4d..541ad66c4e 100644 --- a/src/mac/carbon/dcmemory.cpp +++ b/src/mac/carbon/dcmemory.cpp @@ -1,19 +1,19 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcmemory.cpp +// Name: src/mac/carbon/dcmemory.cpp // Purpose: wxMemoryDC class // Author: Stefan Csomor // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "dcmemory.h" -#endif +#include "wx/wxprec.h" #include "wx/dcmemory.h" +#include "wx/graphics.h" + #include "wx/mac/private.h" //----------------------------------------------------------------------------- @@ -22,64 +22,113 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC) -wxMemoryDC::wxMemoryDC(void) +wxMemoryDC::wxMemoryDC( const wxBitmap& bitmap ) : m_selected() { - m_ok = TRUE; + m_ok = true; SetBackground(*wxWHITE_BRUSH); SetBrush(*wxWHITE_BRUSH); SetPen(*wxBLACK_PEN); - m_ok = FALSE; -}; + SetFont(*wxNORMAL_FONT); + m_ok = false; + + if ( bitmap.IsOk() ) + SelectObject(bitmap); +} wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) ) : m_selected() { - m_ok = TRUE; + m_ok = true; SetBackground(*wxWHITE_BRUSH); SetBrush(*wxWHITE_BRUSH); SetPen(*wxBLACK_PEN); - m_ok = FALSE; -}; + SetFont(*wxNORMAL_FONT); + m_ok = false; +} wxMemoryDC::~wxMemoryDC() { if ( m_selected.Ok() ) { - UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) ); +#if wxMAC_USE_CORE_GRAPHICS + m_selected.EndRawAccess() ; + CGContextRef bmCtx = (CGContextRef) 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() ) { - UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) ); +#if wxMAC_USE_CORE_GRAPHICS + m_selected.EndRawAccess() ; + CGContextRef bmCtx = (CGContextRef) 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 ( m_selected.GetHBITMAP() ) +#if wxMAC_USE_CORE_GRAPHICS + if ( m_selected.GetDepth() != 1 ) + m_selected.UseAlpha() ; + void * data = m_selected.BeginRawAccess() ; + + int bitsPerComp = 8 ; + int bytesPerPixel = 4 ; + int w = bitmap.GetWidth() ; + int h = bitmap.GetHeight() ; + m_width = w; + m_height = h; + + // TODO: should this be kCGImageAlphaPremultiplied[First,Last] ? + 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") ) ; + + if ( bmCtx ) { - m_macPort = (GrafPtr) m_selected.GetHBITMAP() ; - LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ; - wxMask * mask = bitmap.GetMask() ; - if ( mask ) - { - m_macMask = mask->GetMaskBitmap() ; - } - SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , 0 , 0 , m_selected.GetWidth() , m_selected.GetHeight() ) ; - CopyRgn( (RgnHandle) m_macBoundaryClipRgn ,(RgnHandle) m_macCurrentClipRgn ) ; - m_ok = TRUE ; + CGContextSetFillColorSpace( bmCtx, genericColorSpace ); + CGContextSetStrokeColorSpace( bmCtx, genericColorSpace ); + + CGContextTranslateCTM( bmCtx , 0 , m_selected.GetHeight() ) ; + CGContextScaleCTM( bmCtx , 1 , -1 ) ; + + SetGraphicsContext( wxGraphicsContext::CreateFromNative( bmCtx ) ); + m_graphicContext->SetPen( m_pen ) ; + m_graphicContext->SetBrush( m_brush ) ; + m_graphicContext->SetFont( m_font ) ; } - else + m_ok = (m_graphicContext != NULL) ; + +#else + m_macPort = m_selected.GetHBITMAP( &m_macMask ) ; + m_ok = (m_macPort != NULL) ; + if (m_ok) { - m_ok = FALSE; + LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ; + SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , 0 , 0 , m_selected.GetWidth() , m_selected.GetHeight() ) ; + CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; } +#endif } else { - m_ok = FALSE; + m_ok = false; } } @@ -87,14 +136,16 @@ void wxMemoryDC::DoGetSize( int *width, int *height ) const { if (m_selected.Ok()) { - if (width) (*width) = m_selected.GetWidth(); - if (height) (*height) = m_selected.GetHeight(); + if (width) + (*width) = m_selected.GetWidth(); + if (height) + (*height) = m_selected.GetHeight(); } else { - if (width) (*width) = 0; - if (height) (*height) = 0; + if (width) + (*width) = 0; + if (height) + (*height) = 0; } } - -