The Great wxRegion Refactoring:

1. added wxRegionBase class and derive all wxRegions from it
2. also added wxRegionWithCombine for the ports providing Combine() method
   (MSW, OS2 and Mac) to reduce code duplication further
3. made sure region comparison works the same way in all ports (except those
   not implementing it) and added IsEqual() method


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41429 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-09-25 11:47:23 +00:00
parent b48f51ca74
commit 8a16d7370e
24 changed files with 751 additions and 1654 deletions

View File

@@ -12,16 +12,8 @@
#ifndef _WX_GENERIC_REGION_H__
#define _WX_GENERIC_REGION_H__
#include "wx/gdiobj.h"
#include "wx/gdicmn.h"
class WXDLLEXPORT wxRect;
class WXDLLEXPORT wxPoint;
class WXDLLEXPORT wxRegionGeneric : public wxGDIObject
class WXDLLEXPORT wxRegionGeneric : public wxRegionBase
{
// DECLARE_DYNAMIC_CLASS(wxRegionGeneric);
friend class WXDLLEXPORT wxRegionIteratorGeneric;
public:
wxRegionGeneric(wxCoord x, wxCoord y, wxCoord w, wxCoord h);
wxRegionGeneric(const wxPoint& topLeft, const wxPoint& bottomRight);
@@ -29,82 +21,32 @@ public:
wxRegionGeneric();
virtual ~wxRegionGeneric();
bool Ok() const { return m_refData != NULL; }
bool operator == ( const wxRegionGeneric& region ) const;
bool operator != ( const wxRegionGeneric& region ) const { return !(*this == region); }
//# Modify region
// Clear current region
void Clear();
// Move the region
bool Offset(wxCoord x, wxCoord y);
// Union rectangle or region with this.
bool Union(long x, long y, long width, long height)
{ return Union(wxRect(x,y,width,height)); }
bool Union(const wxRect& rect);
bool Union(const wxRegionGeneric& region);
// Intersect rectangle or region with this.
bool Intersect(long x, long y, long width, long height)
{ return Intersect(wxRect(x,y,width,height)); }
bool Intersect(const wxRect& rect);
bool Intersect(const wxRegionGeneric& region);
// Subtract rectangle or region from this:
// Combines the parts of 'this' that are not part of the second region.
bool Subtract(long x, long y, long width, long height)
{ return Subtract(wxRect(x,y,width,height)); }
bool Subtract(const wxRect& rect);
bool Subtract(const wxRegionGeneric& region);
// XOR: the union of two combined regions except for any overlapping areas.
bool Xor(long x, long y, long width, long height);
bool Xor(const wxRect& rect);
bool Xor(const wxRegionGeneric& region);
//# Information on region
// Outer bounds of region
void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const;
wxRect GetBox() const;
// Is region empty?
bool Empty() const;
inline bool IsEmpty() const { return Empty(); }
//# Tests
// Does the region contain the point (x,y)?
wxRegionContain Contains(long x, long y) const;
// Does the region contain the point pt?
wxRegionContain Contains(const wxPoint& pt) const;
// Does the region contain the rectangle (x, y, w, h)?
wxRegionContain Contains(long x, long y, long w, long h) const;
// Does the region contain the rectangle rect?
wxRegionContain Contains(const wxRect& rect) const;
// Use the non-transparent pixels of a wxBitmap for the region to combine
// with this region. First version takes transparency from bitmap's mask,
// second lets the user specify the colour to be treated as transparent
// along with an optional tolerance value.
// NOTE: implemented in common/rgncmn.cpp
bool Union(const wxBitmap& bmp);
bool Union(const wxBitmap& bmp,
const wxColour& transColour, int tolerance = 0);
// Convert the region to a B&W bitmap with the white pixels being inside
// the region.
wxBitmap ConvertToBitmap() const;
// wxRegionBase pure virtuals
virtual void Clear();
virtual bool IsEmpty() const;
protected:
virtual wxObjectRefData *CreateRefData() const;
virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
// wxRegionBase pure virtuals
virtual bool DoIsEqual(const wxRegion& region) const;
virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const;
virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const;
virtual wxRegionContain DoContainsRect(const wxRect& rect) const;
virtual bool DoOffset(wxCoord x, wxCoord y);
virtual bool DoUnionWithRect(const wxRect& rect);
virtual bool DoUnionWithRegion(const wxRegion& region);
virtual bool DoIntersect(const wxRegion& region);
virtual bool DoSubtract(const wxRegion& region);
virtual bool DoXor(const wxRegion& region);
friend class WXDLLEXPORT wxRegionIteratorGeneric;
};
class WXDLLEXPORT wxRegionIteratorGeneric : public wxObject
{
// DECLARE_DYNAMIC_CLASS(wxRegionIteratorGeneric);
public:
wxRegionIteratorGeneric();
wxRegionIteratorGeneric(const wxRegionGeneric& region);
@@ -134,4 +76,4 @@ private:
wxRegionGeneric m_region;
};
#endif //ndef _WX_GENERIC_REGION_H__
#endif // _WX_GENERIC_REGION_H__