1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/cocoa/icon.mm
3// Purpose:     wxIcon class
4// Author:      David Elliott
5// Modified by:
6// Created:     2003/08/11
7// Copyright:   (c) 2003 David Elliott
8// Licence:     wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11#include "wx/wxprec.h"
12
13#include "wx/icon.h"
14
15#ifndef WX_PRECOMP
16    #include "wx/bitmap.h"
17#endif //WX_PRECOMP
18
19#include "wx/cocoa/autorelease.h"
20
21#import <AppKit/NSImage.h>
22
23// ========================================================================
24// wxIconRefData
25// ========================================================================
26class wxIconRefData: public wxGDIRefData
27{
28    friend class wxIcon;
29public:
30    wxIconRefData();
31    wxIconRefData( const wxIconRefData& data );
32    virtual ~wxIconRefData();
33
34    virtual bool IsOk() const { return m_ok; }
35
36protected:
37    int                 m_width;
38    int                 m_height;
39    int                 m_depth;
40    bool                m_ok;
41    int                 m_numColors;
42    int                 m_quality;
43    WX_NSImage          m_cocoaNSImage;
44};
45
46#define M_ICONDATA ((wxIconRefData *)m_refData)
47
48wxIconRefData::wxIconRefData()
49{
50    m_ok = false;
51    m_width = 0;
52    m_height = 0;
53    m_depth = 0;
54    m_quality = 0;
55    m_numColors = 0;
56    m_cocoaNSImage = nil;
57}
58
59wxIconRefData::wxIconRefData( const wxIconRefData& data)
60{
61    m_width = data.m_width;
62    m_height = data.m_height;
63    m_depth = data.m_depth;
64    m_ok = data.m_ok;
65    m_numColors = data.m_numColors;
66    m_quality = data.m_quality;
67    m_cocoaNSImage = [data.m_cocoaNSImage copyWithZone:nil];
68}
69
70wxIconRefData::~wxIconRefData()
71{
72    wxAutoNSAutoreleasePool pool;
73    [m_cocoaNSImage release];
74    m_cocoaNSImage = NULL;
75}
76
77
78// ========================================================================
79// wxIcon
80// ========================================================================
81IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxGDIObject)
82
83wxIcon::wxIcon()
84{
85}
86
87wxIcon::wxIcon(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height))
88{
89}
90
91wxIcon::wxIcon(const wxString& icon_file, int flags,
92    int desiredWidth, int desiredHeight)
93
94{
95    LoadFile(icon_file, (wxBitmapType)flags, desiredWidth, desiredHeight);
96}
97
98wxIcon::~wxIcon()
99{
100}
101
102wxGDIRefData *wxIcon::CreateGDIRefData() const
103{
104    return new wxIconRefData;
105}
106
107wxGDIRefData *wxIcon::CloneGDIRefData(const wxGDIRefData *data) const
108{
109    return new wxIconRefData(*static_cast<const wxIconRefData *>(data));
110}
111
112bool wxIcon::CreateFromXpm(const char* const* xpm)
113{
114    wxBitmap bitmap(xpm);
115    CopyFromBitmap(bitmap);
116    return IsOk();
117}
118
119bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type,
120    int desiredWidth, int desiredHeight)
121{
122    wxBitmap bitmap(filename, type);
123    CopyFromBitmap(bitmap);
124    return bitmap.IsOk();
125}
126
127void wxIcon::CopyFromBitmap(const wxBitmap& bitmap)
128{
129    UnRef();
130    m_refData = new wxIconRefData;
131    M_ICONDATA->m_width = bitmap.GetWidth();
132    M_ICONDATA->m_height = bitmap.GetHeight();
133    wxAutoNSAutoreleasePool pool;
134    M_ICONDATA->m_cocoaNSImage = [bitmap.GetNSImage(true) retain];
135    M_ICONDATA->m_ok = bitmap.IsOk();
136    M_ICONDATA->m_numColors = 0;
137    M_ICONDATA->m_quality = 0;
138}
139
140int wxIcon::GetWidth() const
141{
142    if(!m_refData)
143        return 0;
144    return M_ICONDATA->m_width;
145}
146
147int wxIcon::GetHeight() const
148{
149    if(!m_refData)
150        return 0;
151    return M_ICONDATA->m_height;
152}
153
154WX_NSImage wxIcon::GetNSImage() const
155{
156    if(!M_ICONDATA)
157        return nil;
158    return M_ICONDATA->m_cocoaNSImage;
159}
160