Implemented wxGDIObject::Create/CloneGDIRefData() for the relevant classes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51177 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Neis 2008-01-12 15:05:15 +00:00
parent a625c5b6c0
commit 4b3f61d14c
15 changed files with 196 additions and 147 deletions

View File

@ -216,7 +216,6 @@ protected:
bool CreateFromImage(const wxImage& image, int depth);
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
private:
@ -343,7 +342,7 @@ public:
private:
inline virtual bool Load( wxGDIImage* WXUNUSED(pImage)
,const wxString& WXUNUSED(rName)
,HPS WXUNUSED(hPs)
,WXHANDLE WXUNUSED(hPs)
,long WXUNUSED(lFlags)
,int WXUNUSED(nDesiredWidth)
,int WXUNUSED(nDesiredHeight)

View File

@ -46,8 +46,6 @@ protected:
// Brush
class WXDLLEXPORT wxBrush: public wxBrushBase
{
DECLARE_DYNAMIC_CLASS(wxBrush)
public:
wxBrush();
wxBrush(const wxColour& rCol, int nStyle = wxSOLID);
@ -79,7 +77,13 @@ public:
virtual WXHANDLE GetResourceHandle(void) const;
bool FreeResource(bool bForce = false);
bool IsFree(void) const;
void Unshare(void);
protected:
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
private:
DECLARE_DYNAMIC_CLASS(wxBrush)
}; // end of CLASS wxBrush
#endif

View File

@ -113,7 +113,9 @@ public:
protected:
virtual void DoSetNativeFontInfo(const wxNativeFontInfo& rInfo);
void Unshare(void);
// implement wxObject virtuals which are used by AllocExclusive()
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
private:
DECLARE_DYNAMIC_CLASS(wxFont)

View File

@ -74,7 +74,7 @@ public:
WXHCURSOR m_hCursor;
};
UINT m_uId;
unsigned int m_uId;
};
// ----------------------------------------------------------------------------
@ -204,7 +204,7 @@ public:
}
void SetSize(const wxSize& rSize) { SetSize(rSize.x, rSize.y); }
UINT GetId(void) const
unsigned int GetId(void) const
{
wxGDIImageRefData* pData;
@ -214,7 +214,7 @@ public:
else
return pData->m_uId;
} // end of WxWinGdi_CGDIImage::GetId
void SetId(UINT uId)
void SetId(unsigned int uId)
{
wxGDIImageRefData* pData;
@ -231,6 +231,15 @@ protected:
virtual wxGDIImageRefData* CreateData() const = 0;
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;
};

View File

@ -17,6 +17,7 @@
#include "wx/dc.h"
#include "wx/gdiobj.h"
#include "wx/os2/dc.h"
#if wxUSE_DRAG_AND_DROP
#include "wx/dataobj.h"
@ -66,53 +67,76 @@ public:
void SetHMETAFILE(WXHANDLE mf) ;
inline int GetWindowsMappingMode(void) { return M_METAFILEDATA->m_windowsMappingMode; }
void SetWindowsMappingMode(int mm);
};
class WXDLLEXPORT wxMetafileDC: public wxDC
{
DECLARE_DYNAMIC_CLASS(wxMetafileDC)
public:
// Don't supply origin and extent
// Supply them to wxMakeMetaFilePlaceable instead.
wxMetafileDC(const wxString& file = wxEmptyString);
// Supply origin and extent (recommended).
// Then don't need to supply them to wxMakeMetaFilePlaceable.
wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg);
virtual ~wxMetafileDC(void);
// Should be called at end of drawing
virtual wxMetafile *Close(void);
virtual void SetMapMode(int mode);
virtual void GetTextExtent(const wxString& string, long *x, long *y,
long *descent = NULL, long *externalLeading = NULL,
const wxFont *theFont = NULL, bool use16bit = false) const;
// Implementation
inline wxMetafile *GetMetaFile(void) const { return m_metaFile; }
inline void SetMetaFile(wxMetafile *mf) { m_metaFile = mf; }
inline int GetWindowsMappingMode(void) const { return m_windowsMappingMode; }
inline void SetWindowsMappingMode(int mm) { m_windowsMappingMode = mm; }
protected:
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
};
class WXDLLEXPORT wxMetafileDCImpl: public wxPMDCImpl
{
public:
wxMetafileDCImpl(wxDC *owner, const wxString& file = wxEmptyString);
wxMetafileDCImpl(wxDC *owner, const wxString& file,
int xext, int yext, int xorg, int yorg);
virtual ~wxMetafileDCImpl();
virtual wxMetafile *Close();
virtual void SetMapMode(int mode);
virtual void DoGetTextExtent(const wxString& string,
wxCoord *x, wxCoord *y,
wxCoord *descent = NULL,
wxCoord *externalLeading = NULL,
const wxFont *theFont = NULL) const;
// Implementation
wxMetafile *GetMetaFile() const { return m_metaFile; }
void SetMetaFile(wxMetafile *mf) { m_metaFile = mf; }
int GetWindowsMappingMode() const { return m_windowsMappingMode; }
void SetWindowsMappingMode(int mm) { m_windowsMappingMode = mm; }
protected:
virtual void DoGetSize(int *width, int *height) const;
int m_windowsMappingMode;
wxMetafile* m_metaFile;
private:
#ifndef __WATCOMC__
// function hiding warning supression
// still required ??
inline virtual void GetTextExtent( const wxString& string
,long* width
,long* height
,long* descent = NULL
,long* externalLeading = NULL
,wxFont* theFont = NULL
) const
{ GetTextExtent( string, width, height, descent, externalLeading, theFont, false);};
#endif
DECLARE_CLASS(wxMetafileDCImpl)
DECLARE_NO_COPY_CLASS(wxMetafileDCImpl)
};
class WXDLLEXPORT wxMetafileDC: public wxDC
{
public:
// Don't supply origin and extent
// Supply them to wxMakeMetaFilePlaceable instead.
wxMetafileDC(const wxString& file = wxEmptyString)
:wxDC(new wxMetafileDCImpl( this, file ))
{ }
// Supply origin and extent (recommended).
// Then don't need to supply them to wxMakeMetaFilePlaceable.
wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg)
: wxDC(new wxMetafileDCImpl( this, file, xext, yext, xorg, yorg ))
{ }
wxMetafile *GetMetafile() const
{ return ((wxMetafileDCImpl*)m_pimpl)->GetMetaFile(); }
virtual ~wxMetafileDC(void)
{ delete m_pimpl; }
// Should be called at end of drawing
virtual wxMetafile *Close(void)
{ return ((wxMetafileDCImpl*)m_pimpl)->Close(); }
inline void SetMetaFile(wxMetafile *mf)
{ ((wxMetafileDCImpl*)m_pimpl)->SetMetaFile(mf); }
private:
DECLARE_CLASS(wxMetafileDC)
DECLARE_NO_COPY_CLASS(wxMetafileDC)
};
/*

View File

@ -32,8 +32,6 @@ public:
class WXDLLEXPORT wxPalette: public wxPaletteBase
{
DECLARE_DYNAMIC_CLASS(wxPalette)
public:
wxPalette();
@ -64,6 +62,13 @@ public:
inline WXHPALETTE GetHPALETTE(void) const { return (M_PALETTEDATA ? M_PALETTEDATA->m_hPalette : 0); }
void SetHPALETTE(WXHPALETTE hPalette);
void SetPS(HPS hPS);
protected:
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
private:
DECLARE_DYNAMIC_CLASS(wxPalette)
}; // end of CLASS wxPalette
#endif

View File

@ -58,7 +58,6 @@ protected:
// Pen
class WXDLLEXPORT wxPen : public wxGDIObject
{
DECLARE_DYNAMIC_CLASS(wxPen)
public:
wxPen();
wxPen( const wxColour& rColour
@ -124,11 +123,19 @@ public:
bool FreeResource(bool bForce = false);
virtual WXHANDLE GetResourceHandle(void) const;
bool IsFree(void) const;
void Unshare(void);
private:
LINEBUNDLE m_vLineBundle;
AREABUNDLE m_vAreaBundle;
protected:
virtual wxGDIRefData* CreateGDIRefData() const;
virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* data) const;
// same as FreeResource() + RealizeResource()
bool Recreate();
DECLARE_DYNAMIC_CLASS(wxPen)
}; // end of CLASS wxPen
extern int wx2os2PenStyle(int nWxStyle);

View File

@ -64,8 +64,8 @@ public:
void SetPS(HPS hPS);
protected:
virtual wxGDIRefData* CreateData(void) const;
virtual wxGDIRefData* CloneData(const wxGDIRefData* pData) const;
virtual wxGDIRefData* CreateGDIRefData(void) const;
virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* pData) const;
virtual bool DoIsEqual(const wxRegion& region) const;
virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const;
@ -82,7 +82,6 @@ protected:
class WXDLLEXPORT wxRegionIterator : public wxObject
{
DECLARE_DYNAMIC_CLASS(wxRegionIterator);
public:
wxRegionIterator();
wxRegionIterator(const wxRegion& rRegion);
@ -110,6 +109,8 @@ private:
long m_lNumRects;
wxRegion m_vRegion;
wxRect* m_pRects;
DECLARE_DYNAMIC_CLASS(wxRegionIterator)
}; // end of wxRegionIterator
#endif // _WX_OS2_REGION_H_

View File

@ -94,11 +94,6 @@ void wxBitmapRefData::Free()
// wxBitmap creation
// ----------------------------------------------------------------------------
wxGDIRefData* wxBitmap::CreateGDIRefData() const
{
return new wxBitmapRefData;
}
wxGDIRefData* wxBitmap::CloneGDIRefData(const wxGDIRefData* data) const
{
return new wxBitmapRefData(*wx_static_cast(const wxBitmapRefData *, data));

View File

@ -234,40 +234,23 @@ bool wxBrush::IsFree() const
return (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0));
} // end of wxBrush::IsFree
void wxBrush::Unshare()
{
//
// Don't change shared data
//
if (!m_refData)
{
m_refData = new wxBrushRefData();
}
else
{
wxBrushRefData* ref = new wxBrushRefData(*(wxBrushRefData*)m_refData);
UnRef();
m_refData = ref;
}
} // end of wxBrush::Unshare
void wxBrush::SetColour( const wxColour& rColour )
{
Unshare();
AllocExclusive();
M_BRUSHDATA->m_vColour = rColour;
RealizeResource();
}
void wxBrush::SetColour(unsigned char cRed, unsigned char cGreen, unsigned char cBlue)
{
Unshare();
AllocExclusive();
M_BRUSHDATA->m_vColour.Set( cRed, cGreen, cBlue );
RealizeResource();
} // end of wxBrush::SetColour
void wxBrush::SetStyle(int nStyle)
{
Unshare();
AllocExclusive();
M_BRUSHDATA->m_nStyle = nStyle;
RealizeResource();
} // end of wxBrush::SetStyle
@ -276,7 +259,7 @@ void wxBrush::SetStipple(
const wxBitmap& rStipple
)
{
Unshare();
AllocExclusive();
M_BRUSHDATA->m_vStipple = rStipple;
RealizeResource();
} // end of wxBrush::SetStipple
@ -285,7 +268,7 @@ void wxBrush::SetPS(
HPS hPS
)
{
Unshare();
AllocExclusive();
if (M_BRUSHDATA->m_hBrush)
::GpiDestroyPS(M_BRUSHDATA->m_hBrush);
M_BRUSHDATA->m_hBrush = hPS;
@ -304,3 +287,12 @@ bool wxBrush::operator == (
return ( *(wxBrushRefData*)m_refData == *(wxBrushRefData*)brush.m_refData );
} // end of wxBrush::operator ==
wxGDIRefData *wxBrush::CreateGDIRefData() const
{
return new wxBrushRefData;
}
wxGDIRefData *wxBrush::CloneGDIRefData(const wxGDIRefData *data) const
{
return new wxBrushRefData(*(const wxBrushRefData *)data);
}

View File

@ -931,6 +931,16 @@ wxFont::~wxFont()
// here, but we may check that font definition is true
// ----------------------------------------------------------------------------
wxGDIRefData *wxFont::CreateGDIRefData() const
{
return new wxFontRefData();
}
wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const
{
return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data));
}
bool wxFont::RealizeResource()
{
if ( GetResourceHandle() )
@ -965,21 +975,6 @@ bool wxFont::IsFree() const
return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
} // end of wxFont::IsFree
void wxFont::Unshare()
{
// Don't change shared data
if ( !m_refData )
{
m_refData = new wxFontRefData();
}
else
{
wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
UnRef();
m_refData = ref;
}
} // end of wxFont::Unshare
// ----------------------------------------------------------------------------
// change font attribute: we recreate font when doing it
// ----------------------------------------------------------------------------
@ -988,7 +983,7 @@ void wxFont::SetPointSize(
int nPointSize
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetPointSize(nPointSize);
@ -999,7 +994,7 @@ void wxFont::SetFamily(
int nFamily
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetFamily(nFamily);
@ -1010,7 +1005,7 @@ void wxFont::SetStyle(
int nStyle
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetStyle(nStyle);
@ -1021,7 +1016,7 @@ void wxFont::SetWeight(
int nWeight
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetWeight(nWeight);
@ -1032,7 +1027,7 @@ bool wxFont::SetFaceName(
const wxString& rsFaceName
)
{
Unshare();
AllocExclusive();
bool refdataok = M_FONTDATA->SetFaceName(rsFaceName);
@ -1045,7 +1040,7 @@ void wxFont::SetUnderlined(
bool bUnderlined
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetUnderlined(bUnderlined);
@ -1056,7 +1051,7 @@ void wxFont::SetEncoding(
wxFontEncoding vEncoding
)
{
Unshare();
AllocExclusive();
M_FONTDATA->SetEncoding(vEncoding);
@ -1067,7 +1062,7 @@ void wxFont::DoSetNativeFontInfo(
const wxNativeFontInfo& rInfo
)
{
Unshare();
AllocExclusive();
FreeResource();
@ -1147,7 +1142,7 @@ void wxFont::SetFM( PFONTMETRICS pFM, int nNumFonts )
void wxFont::SetPS( HPS hPS )
{
Unshare();
AllocExclusive();
M_FONTDATA->SetPS(hPS);

View File

@ -66,6 +66,16 @@ wxMetafile::~wxMetafile(void)
{
}
wxGDIRefData *wxMetafile::CreateGDIRefData() const
{
return new wxMetafileRefData;
}
wxGDIRefData *wxMetafile::CloneGDIRefData(const wxGDIRefData *data) const
{
return new wxMetafileRefData(*wx_static_cast(const wxMetafileRefData *, data));
}
bool wxMetafile::SetClipboard(int width, int height)
{
#if !wxUSE_CLIPBOARD
@ -122,7 +132,8 @@ void wxMetafile::SetWindowsMappingMode(int mm)
// Original constructor that does not takes origin and extent. If you use this,
// *DO* give origin/extent arguments to wxMakeMetafilePlaceable.
wxMetafileDC::wxMetafileDC(const wxString& file)
wxMetafileDCImpl::wxMetafileDCImpl(wxDC *owner, const wxString& file)
: wxPMDCImpl(owner)
{
m_metaFile = NULL;
m_minX = 10000;
@ -152,11 +163,12 @@ wxMetafileDC::wxMetafileDC(const wxString& file)
// New constructor that takes origin and extent. If you use this, don't
// give origin/extent arguments to wxMakeMetafilePlaceable.
wxMetafileDC::wxMetafileDC( const wxString& file,
int WXUNUSED(xext),
int WXUNUSED(yext),
int WXUNUSED(xorg),
int WXUNUSED(yorg) )
wxMetafileDCImpl::wxMetafileDCImpl( wxDC *owner, const wxString& file,
int WXUNUSED(xext),
int WXUNUSED(yext),
int WXUNUSED(xorg),
int WXUNUSED(yorg) )
: wxPMDCImpl(owner)
{
m_minX = 10000;
m_minY = 10000;
@ -178,18 +190,17 @@ wxMetafileDC::wxMetafileDC( const wxString& file,
SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct)
}
wxMetafileDC::~wxMetafileDC(void)
wxMetafileDCImpl::~wxMetafileDCImpl(void)
{
m_hDC = 0;
}
void wxMetafileDC::GetTextExtent(const wxString& WXUNUSED(string),
long *WXUNUSED(x),
long *WXUNUSED(y),
long *WXUNUSED(descent),
long *WXUNUSED(externalLeading),
const wxFont *theFont,
bool WXUNUSED(use16bit) ) const
void wxMetafileDCImpl::DoGetTextExtent(const wxString& WXUNUSED(string),
wxCoord *WXUNUSED(x),
wxCoord *WXUNUSED(y),
wxCoord *WXUNUSED(descent),
wxCoord *WXUNUSED(externalLeading),
const wxFont *theFont) const
{
const wxFont *fontToUse = theFont;
if (!fontToUse)
@ -217,7 +228,7 @@ void wxMetafileDC::GetTextExtent(const wxString& WXUNUSED(string),
*/
}
wxMetafile *wxMetafileDC::Close(void)
wxMetafile *wxMetafileDCImpl::Close(void)
{
SelectOldObjects(m_hDC);
HANDLE mf = 0; // TODO: CloseMetaFile((HDC) m_hDC);
@ -232,7 +243,7 @@ wxMetafile *wxMetafileDC::Close(void)
return NULL;
}
void wxMetafileDC::SetMapMode(int mode)
void wxMetafileDCImpl::SetMapMode(int mode)
{
m_mappingMode = mode;

View File

@ -104,6 +104,16 @@ bool wxPalette::Create( int n,
return true;
} // end of wxPalette::Create
wxGDIRefData *wxPalette::CreateGDIRefData() const
{
return new wxPaletteRefData;
}
wxGDIRefData *wxPalette::CloneGDIRefData(const wxGDIRefData *data) const
{
return new wxPaletteRefData(*wx_static_cast(const wxPaletteRefData *, data));
}
int wxPalette::GetPixel( unsigned char cRed,
unsigned char cGreen,
unsigned char cBlue) const

View File

@ -327,38 +327,33 @@ bool wxPen::IsFree() const
return (M_PENDATA && M_PENDATA->m_hPen == 0);
}
void wxPen::Unshare()
wxGDIRefData* wxPen::CreateGDIRefData() const
{
// Don't change shared data
if (!m_refData)
{
m_refData = new wxPenRefData();
}
else
{
wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData);
UnRef();
m_refData = ref;
}
} // end of wxPen::Unshare
return new wxPenRefData;
}
wxGDIRefData* wxPen::CloneGDIRefData(const wxGDIRefData* data) const
{
return new wxPenRefData(*wx_static_cast(const wxPenRefData*, data));
}
void wxPen::SetColour( const wxColour& rColour )
{
Unshare();
AllocExclusive();
M_PENDATA->m_vColour = rColour;
RealizeResource();
} // end of wxPen::SetColour
void wxPen::SetColour( unsigned char cRed, unsigned char cGreen, unsigned char cBlue)
{
Unshare();
AllocExclusive();
M_PENDATA->m_vColour.Set(cRed, cGreen, cBlue);
RealizeResource();
} // end of wxPen::SetColour
void wxPen::SetPS( HPS hPS )
{
Unshare();
AllocExclusive();
if (M_PENDATA->m_hPen)
::GpiDestroyPS(M_PENDATA->m_hPen);
M_PENDATA->m_hPen = hPS;
@ -369,7 +364,7 @@ void wxPen::SetWidth(
int nWidth
)
{
Unshare();
AllocExclusive();
M_PENDATA->m_nWidth = nWidth;
RealizeResource();
} // end of wxPen::SetWidth
@ -378,7 +373,7 @@ void wxPen::SetStyle(
int nStyle
)
{
Unshare();
AllocExclusive();
M_PENDATA->m_nStyle = nStyle;
RealizeResource();
} // end of wxPen::SetStyle
@ -387,7 +382,7 @@ void wxPen::SetStipple(
const wxBitmap& rStipple
)
{
Unshare();
AllocExclusive();
M_PENDATA->m_vStipple = rStipple;
M_PENDATA->m_nStyle = wxSTIPPLE;
RealizeResource();
@ -405,7 +400,7 @@ void wxPen::SetJoin(
int nJoin
)
{
Unshare();
AllocExclusive();
M_PENDATA->m_nJoin = nJoin;
RealizeResource();
} // end of wxPen::SetJoin
@ -414,7 +409,7 @@ void wxPen::SetCap(
int nCap
)
{
Unshare();
AllocExclusive();
M_PENDATA->m_nCap = nCap;
RealizeResource();
} // end of wxPen::SetCap

View File

@ -233,12 +233,12 @@ wxRegion::~wxRegion()
{
} // end of wxRegion::~wxRegion
wxGDIRefData *wxRegion::CreateData() const
wxGDIRefData *wxRegion::CreateGDIRefData() const
{
return new wxRegionRefData;
}
wxGDIRefData *wxRegion::CloneData(const wxGDIRefData *data) const
wxGDIRefData *wxRegion::CloneGDIRefData(const wxGDIRefData *data) const
{
return new wxRegionRefData(*(wxRegionRefData *)data);
}