1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/mac/carbon/dcmemory.cpp
3// Purpose:     wxMemoryDC class
4// Author:      Stefan Csomor
5// Modified by:
6// Created:     01/02/97
7// RCS-ID:      $Id: dcmemory.cpp 46294 2007-06-03 11:01:00Z SC $
8// Copyright:   (c) Stefan Csomor
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#include "wx/dcmemory.h"
15#include "wx/graphics.h"
16
17#include "wx/mac/private.h"
18
19//-----------------------------------------------------------------------------
20// wxMemoryDC
21//-----------------------------------------------------------------------------
22
23IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC)
24
25void wxMemoryDC::Init()
26{
27    m_ok = true;
28    SetBackground(*wxWHITE_BRUSH);
29    SetBrush(*wxWHITE_BRUSH);
30    SetPen(*wxBLACK_PEN);
31    SetFont(*wxNORMAL_FONT);
32    m_ok = false;
33}
34
35wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
36: m_selected()
37{
38    Init();
39}
40
41wxMemoryDC::~wxMemoryDC()
42{
43    if ( m_selected.Ok() )
44    {
45#if wxMAC_USE_CORE_GRAPHICS
46        m_selected.EndRawAccess() ;
47        delete m_graphicContext ;
48        m_graphicContext = NULL ;
49#else
50// TODO: UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) );
51#endif
52    }
53}
54
55void wxMemoryDC::DoSelect( const wxBitmap& bitmap )
56{
57    if ( m_selected.Ok() )
58    {
59#if wxMAC_USE_CORE_GRAPHICS
60        m_selected.EndRawAccess() ;
61        delete m_graphicContext ;
62        m_graphicContext = NULL ;
63#else
64// TODO: UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) );
65#endif
66    }
67
68    m_selected = bitmap;
69    if (m_selected.Ok())
70    {
71#if wxMAC_USE_CORE_GRAPHICS
72        if ( m_selected.GetDepth() != 1 )
73            m_selected.UseAlpha() ;
74        m_selected.BeginRawAccess() ;
75		m_width = bitmap.GetWidth();
76		m_height = bitmap.GetHeight();
77        CGColorSpaceRef genericColorSpace  = wxMacGetGenericRGBColorSpace();
78        CGContextRef bmCtx = (CGContextRef) m_selected.GetHBITMAP();
79
80        if ( bmCtx )
81        {
82            CGContextSetFillColorSpace( bmCtx, genericColorSpace );
83            CGContextSetStrokeColorSpace( bmCtx, genericColorSpace );
84			SetGraphicsContext( wxGraphicsContext::CreateFromNative( bmCtx ) );
85        }
86        m_ok = (m_graphicContext != NULL) ;
87
88#else
89        m_macPort = m_selected.GetHBITMAP( &m_macMask ) ;
90        m_ok = (m_macPort != NULL) ;
91        if (m_ok)
92        {
93            LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ;
94            SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , 0 , 0 , m_selected.GetWidth() , m_selected.GetHeight() ) ;
95            CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
96        }
97#endif
98    }
99    else
100    {
101        m_ok = false;
102    }
103}
104
105void wxMemoryDC::DoGetSize( int *width, int *height ) const
106{
107    if (m_selected.Ok())
108    {
109        if (width)
110            (*width) = m_selected.GetWidth();
111        if (height)
112            (*height) = m_selected.GetHeight();
113    }
114    else
115    {
116        if (width)
117            (*width) = 0;
118        if (height)
119            (*height) = 0;
120    }
121}
122