X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/10a0bdb1933046d8f84d7c910c49cfa646181a39..c29e714c378d7e3164d71e2c306d990802fe678b:/include/wx/msw/gdiimage.h diff --git a/include/wx/msw/gdiimage.h b/include/wx/msw/gdiimage.h index 0dca4c7931..6ab0fa5a77 100644 --- a/include/wx/msw/gdiimage.h +++ b/include/wx/msw/gdiimage.h @@ -7,7 +7,7 @@ // Created: 20.11.99 // RCS-ID: $Id$ // Copyright: (c) 1999 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // NB: this is a private header, it is not intended to be directly included by @@ -16,23 +16,21 @@ #ifndef _WX_MSW_GDIIMAGE_H_ #define _WX_MSW_GDIIMAGE_H_ -#ifdef __GNUG__ - #pragma interface "gdiimage.h" -#endif - #include "wx/gdiobj.h" // base class #include "wx/gdicmn.h" // wxBITMAP_TYPE_INVALID #include "wx/list.h" -class WXDLLEXPORT wxGDIImageRefData; -class WXDLLEXPORT wxGDIImageHandler; -class WXDLLEXPORT wxGDIImage; +class WXDLLIMPEXP_FWD_CORE wxGDIImageRefData; +class WXDLLIMPEXP_FWD_CORE wxGDIImageHandler; +class WXDLLIMPEXP_FWD_CORE wxGDIImage; + +WX_DECLARE_EXPORTED_LIST(wxGDIImageHandler, wxGDIImageHandlerList); // ---------------------------------------------------------------------------- // wxGDIImageRefData: common data fields for all derived classes // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGDIImageRefData : public wxGDIRefData +class WXDLLIMPEXP_CORE wxGDIImageRefData : public wxGDIRefData { public: wxGDIImageRefData() @@ -40,14 +38,20 @@ public: m_width = m_height = m_depth = 0; m_handle = 0; + } + + wxGDIImageRefData(const wxGDIImageRefData& data) : wxGDIRefData(data) + { + m_width = data.m_width; + m_height = data.m_height; + m_depth = data.m_depth; -#if WXWIN_COMPATIBILITY_2 - m_ok = FALSE; -#endif // WXWIN_COMPATIBILITY_2 + // can't copy handles like this, derived class copy ctor must do it! + m_handle = NULL; } // accessors - bool IsOk() const { return m_handle != 0; } + virtual bool IsOk() const { return m_handle != 0; } void SetSize(int w, int h) { m_width = w; m_height = h; } @@ -70,59 +74,6 @@ public: WXHICON m_hIcon; WXHCURSOR m_hCursor; }; - - // this filed is redundant and using it is error prone but keep it for - // backwards compatibility -#if WXWIN_COMPATIBILITY_2 - void SetOk() { m_ok = m_handle != 0; } - - bool m_ok; -#endif // WXWIN_COMPATIBILITY_2 -}; - -// ---------------------------------------------------------------------------- -// wxGDIImageHandler: a class which knows how to load/save wxGDIImages. -// ---------------------------------------------------------------------------- - -class WXDLLEXPORT wxGDIImageHandler : public wxObject -{ -public: - // ctor - wxGDIImageHandler() { m_type = wxBITMAP_TYPE_INVALID; } - wxGDIImageHandler(const wxString& name, - const wxString& ext, - long type) - : m_name(name), m_extension(ext) - { - m_type = type; - } - - // accessors - void SetName(const wxString& name) { m_name = name; } - void SetExtension(const wxString& ext) { m_extension = ext; } - void SetType(long type) { m_type = type; } - - wxString GetName() const { return m_name; } - wxString GetExtension() const { return m_extension; } - long GetType() const { return m_type; } - - // real handler operations: to implement in derived classes - virtual bool Create(wxGDIImage *image, - void *data, - long flags, - int width, int height, int depth = 1) = 0; - virtual bool Load(wxGDIImage *image, - const wxString& name, - long flags, - int desiredWidth, int desiredHeight) = 0; - virtual bool Save(wxGDIImage *image, - const wxString& name, - int type) = 0; - -protected: - wxString m_name; - wxString m_extension; - long m_type; }; // ---------------------------------------------------------------------------- @@ -131,11 +82,11 @@ protected: // format. It also falls back to wxImage if no appropriate image is found. // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGDIImage : public wxGDIObject +class WXDLLIMPEXP_CORE wxGDIImage : public wxGDIObject { public: // handlers list interface - static wxList& GetHandlers() { return ms_handlers; } + static wxGDIImageHandlerList& GetHandlers() { return ms_handlers; } static void AddHandler(wxGDIImageHandler *handler); static void InsertHandler(wxGDIImageHandler *handler); @@ -152,41 +103,90 @@ public: wxGDIImageRefData *GetGDIImageData() const { return (wxGDIImageRefData *)m_refData; } - // create data if we don't have it yet - void EnsureHasData() { if ( IsNull() ) m_refData = CreateData(); } - // accessors WXHANDLE GetHandle() const { return IsNull() ? 0 : GetGDIImageData()->m_handle; } void SetHandle(WXHANDLE handle) - { EnsureHasData(); GetGDIImageData()->m_handle = handle; } - - bool Ok() const { return GetHandle() != 0; } + { AllocExclusive(); GetGDIImageData()->m_handle = handle; } int GetWidth() const { return IsNull() ? 0 : GetGDIImageData()->m_width; } int GetHeight() const { return IsNull() ? 0 : GetGDIImageData()->m_height; } int GetDepth() const { return IsNull() ? 0 : GetGDIImageData()->m_depth; } - void SetWidth(int w) { EnsureHasData(); GetGDIImageData()->m_width = w; } - void SetHeight(int h) { EnsureHasData(); GetGDIImageData()->m_height = h; } - void SetDepth(int d) { EnsureHasData(); GetGDIImageData()->m_depth = d; } + void SetWidth(int w) { AllocExclusive(); GetGDIImageData()->m_width = w; } + void SetHeight(int h) { AllocExclusive(); GetGDIImageData()->m_height = h; } + void SetDepth(int d) { AllocExclusive(); GetGDIImageData()->m_depth = d; } void SetSize(int w, int h) { - EnsureHasData(); + AllocExclusive(); GetGDIImageData()->SetSize(w, h); } void SetSize(const wxSize& size) { SetSize(size.x, size.y); } // forward some of base class virtuals to wxGDIImageRefData - bool FreeResource(bool force = FALSE); - virtual WXHANDLE GetResourceHandle(); + bool FreeResource(bool force = false); + virtual WXHANDLE GetResourceHandle() const; protected: // create the data for the derived class here virtual wxGDIImageRefData *CreateData() const = 0; - static wxList ms_handlers; + // implement the wxGDIObject method in terms of our, more specific, one + virtual wxGDIRefData *CreateGDIRefData() const { return CreateData(); } + + // we can't [efficiently] clone objects of this class + virtual wxGDIRefData * + CloneGDIRefData(const wxGDIRefData *WXUNUSED(data)) const + { + wxFAIL_MSG( _T("must be implemented if used") ); + + return NULL; + } + + static wxGDIImageHandlerList ms_handlers; +}; + +// ---------------------------------------------------------------------------- +// wxGDIImageHandler: a class which knows how to load/save wxGDIImages. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIImageHandler : public wxObject +{ +public: + // ctor + wxGDIImageHandler() { m_type = wxBITMAP_TYPE_INVALID; } + wxGDIImageHandler(const wxString& name, + const wxString& ext, + wxBitmapType type) + : m_name(name), m_extension(ext), m_type(type) { } + + // accessors + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetType(wxBitmapType type) { m_type = type; } + + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + wxBitmapType GetType() const { return m_type; } + + // real handler operations: to implement in derived classes + virtual bool Create(wxGDIImage *image, + const void* data, + wxBitmapType flags, + int width, int height, int depth = 1) = 0; + virtual bool Load(wxGDIImage *image, + const wxString& name, + wxBitmapType flags, + int desiredWidth, int desiredHeight) = 0; + virtual bool Save(const wxGDIImage *image, + const wxString& name, + wxBitmapType type) const = 0; + +protected: + wxString m_name; + wxString m_extension; + wxBitmapType m_type; }; #endif // _WX_MSW_GDIIMAGE_H_