]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/msw/gdiimage.h
implemented wxDC::DoGetSize() correctly for metafile DC classes
[wxWidgets.git] / include / wx / msw / gdiimage.h
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: include/wx/msw/gdiimage.h
3// Purpose: wxGDIImage class: base class for wxBitmap, wxIcon, wxCursor
4// under MSW
5// Author: Vadim Zeitlin
6// Modified by:
7// Created: 20.11.99
8// RCS-ID: $Id$
9// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
10// Licence: wxWindows licence
11///////////////////////////////////////////////////////////////////////////////
12
13// NB: this is a private header, it is not intended to be directly included by
14// user code (but may be included from other, public, wxWin headers
15
16#ifndef _WX_MSW_GDIIMAGE_H_
17#define _WX_MSW_GDIIMAGE_H_
18
19#include "wx/gdiobj.h" // base class
20#include "wx/gdicmn.h" // wxBITMAP_TYPE_INVALID
21#include "wx/list.h"
22
23class WXDLLEXPORT wxGDIImageRefData;
24class WXDLLEXPORT wxGDIImageHandler;
25class WXDLLEXPORT wxGDIImage;
26
27WX_DECLARE_EXPORTED_LIST(wxGDIImageHandler, wxGDIImageHandlerList);
28
29// ----------------------------------------------------------------------------
30// wxGDIImageRefData: common data fields for all derived classes
31// ----------------------------------------------------------------------------
32
33class WXDLLEXPORT wxGDIImageRefData : public wxGDIRefData
34{
35public:
36 wxGDIImageRefData()
37 {
38 m_width = m_height = m_depth = 0;
39
40 m_handle = 0;
41 }
42
43 wxGDIImageRefData(const wxGDIImageRefData& data) : wxGDIRefData(data)
44 {
45 m_width = data.m_width;
46 m_height = data.m_height;
47 m_depth = data.m_depth;
48
49 // can't copy handles like this, derived class copy ctor must do it!
50 m_handle = NULL;
51 }
52
53 // accessors
54 bool IsOk() const { return m_handle != 0; }
55
56 void SetSize(int w, int h) { m_width = w; m_height = h; }
57
58 // free the ressources we allocated
59 virtual void Free() = 0;
60
61 // for compatibility, the member fields are public
62
63 // the size of the image
64 int m_width, m_height;
65
66 // the depth of the image
67 int m_depth;
68
69 // the handle to it
70 union
71 {
72 WXHANDLE m_handle; // for untyped access
73 WXHBITMAP m_hBitmap;
74 WXHICON m_hIcon;
75 WXHCURSOR m_hCursor;
76 };
77};
78
79// ----------------------------------------------------------------------------
80// wxGDIImageHandler: a class which knows how to load/save wxGDIImages.
81// ----------------------------------------------------------------------------
82
83class WXDLLEXPORT wxGDIImageHandler : public wxObject
84{
85public:
86 // ctor
87 wxGDIImageHandler() { m_type = wxBITMAP_TYPE_INVALID; }
88 wxGDIImageHandler(const wxString& name,
89 const wxString& ext,
90 long type)
91 : m_name(name), m_extension(ext)
92 {
93 m_type = type;
94 }
95
96 // accessors
97 void SetName(const wxString& name) { m_name = name; }
98 void SetExtension(const wxString& ext) { m_extension = ext; }
99 void SetType(long type) { m_type = type; }
100
101 const wxString& GetName() const { return m_name; }
102 const wxString& GetExtension() const { return m_extension; }
103 long GetType() const { return m_type; }
104
105 // real handler operations: to implement in derived classes
106 virtual bool Create(wxGDIImage *image,
107 void *data,
108 long flags,
109 int width, int height, int depth = 1) = 0;
110 virtual bool Load(wxGDIImage *image,
111 const wxString& name,
112 long flags,
113 int desiredWidth, int desiredHeight) = 0;
114 virtual bool Save(wxGDIImage *image,
115 const wxString& name,
116 int type) = 0;
117
118protected:
119 wxString m_name;
120 wxString m_extension;
121 long m_type;
122};
123
124// ----------------------------------------------------------------------------
125// wxGDIImage: this class supports GDI image handlers which may be registered
126// dynamically and will be used for loading/saving the images in the specified
127// format. It also falls back to wxImage if no appropriate image is found.
128// ----------------------------------------------------------------------------
129
130class WXDLLEXPORT wxGDIImage : public wxGDIObject
131{
132public:
133 // handlers list interface
134 static wxGDIImageHandlerList& GetHandlers() { return ms_handlers; }
135
136 static void AddHandler(wxGDIImageHandler *handler);
137 static void InsertHandler(wxGDIImageHandler *handler);
138 static bool RemoveHandler(const wxString& name);
139
140 static wxGDIImageHandler *FindHandler(const wxString& name);
141 static wxGDIImageHandler *FindHandler(const wxString& extension, long type);
142 static wxGDIImageHandler *FindHandler(long type);
143
144 static void InitStandardHandlers();
145 static void CleanUpHandlers();
146
147 // access to the ref data casted to the right type
148 wxGDIImageRefData *GetGDIImageData() const
149 { return (wxGDIImageRefData *)m_refData; }
150
151 // accessors
152 WXHANDLE GetHandle() const
153 { return IsNull() ? 0 : GetGDIImageData()->m_handle; }
154 void SetHandle(WXHANDLE handle)
155 { AllocExclusive(); GetGDIImageData()->m_handle = handle; }
156
157 bool Ok() const { return GetHandle() != 0; }
158
159 int GetWidth() const { return IsNull() ? 0 : GetGDIImageData()->m_width; }
160 int GetHeight() const { return IsNull() ? 0 : GetGDIImageData()->m_height; }
161 int GetDepth() const { return IsNull() ? 0 : GetGDIImageData()->m_depth; }
162
163 void SetWidth(int w) { AllocExclusive(); GetGDIImageData()->m_width = w; }
164 void SetHeight(int h) { AllocExclusive(); GetGDIImageData()->m_height = h; }
165 void SetDepth(int d) { AllocExclusive(); GetGDIImageData()->m_depth = d; }
166
167 void SetSize(int w, int h)
168 {
169 AllocExclusive();
170 GetGDIImageData()->SetSize(w, h);
171 }
172 void SetSize(const wxSize& size) { SetSize(size.x, size.y); }
173
174 // forward some of base class virtuals to wxGDIImageRefData
175 bool FreeResource(bool force = false);
176 virtual WXHANDLE GetResourceHandle() const;
177
178protected:
179 // create the data for the derived class here
180 virtual wxGDIImageRefData *CreateData() const = 0;
181
182 // implement the wxObject method in terms of our, more specific, one
183 virtual wxObjectRefData *CreateRefData() const { return CreateData(); }
184
185 static wxGDIImageHandlerList ms_handlers;
186};
187
188#endif // _WX_MSW_GDIIMAGE_H_