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:
@@ -9,27 +9,13 @@
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_REGION_H_
|
||||
#define _WX_REGION_H_
|
||||
#ifndef _WX_OS2_REGION_H_
|
||||
#define _WX_OS2_REGION_H_
|
||||
|
||||
#include "wx/list.h"
|
||||
#include "wx/gdiobj.h"
|
||||
#include "wx/gdicmn.h"
|
||||
#include "wx/bitmap.h"
|
||||
#include "wx/os2/private.h"
|
||||
|
||||
class WXDLLEXPORT wxRect;
|
||||
class WXDLLEXPORT wxPoint;
|
||||
|
||||
// So far, for internal use only
|
||||
enum wxRegionOp { wxRGN_AND // Creates the intersection of the two combined regions.
|
||||
,wxRGN_COPY // Creates a copy of the region identified by hrgnSrc1.
|
||||
,wxRGN_DIFF // Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.
|
||||
,wxRGN_OR // Creates the union of two combined regions.
|
||||
,wxRGN_XOR // Creates the union of two combined regions except for any overlapping areas.
|
||||
};
|
||||
|
||||
class WXDLLEXPORT wxRegion : public wxGDIObject
|
||||
class WXDLLEXPORT wxRegion : public wxRegionWithCombine
|
||||
{
|
||||
public:
|
||||
wxRegion( wxCoord x
|
||||
@@ -62,176 +48,32 @@ public:
|
||||
//
|
||||
// Clear current region
|
||||
//
|
||||
void Clear(void);
|
||||
|
||||
bool Offset( wxCoord x
|
||||
,wxCoord y
|
||||
);
|
||||
|
||||
//
|
||||
// Union rectangle or region with this.
|
||||
//
|
||||
inline bool Union( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord vWidth
|
||||
,wxCoord vHeight
|
||||
)
|
||||
{
|
||||
return Combine( x
|
||||
,y
|
||||
,vWidth
|
||||
,vHeight
|
||||
,wxRGN_OR
|
||||
);
|
||||
}
|
||||
inline bool Union( const wxRect& rRect) { return Combine(rRect, wxRGN_OR); }
|
||||
inline bool Union(const wxRegion& rRegion) { return Combine(rRegion, wxRGN_OR); }
|
||||
|
||||
//
|
||||
// Intersect rectangle or region with this.
|
||||
//
|
||||
inline bool Intersect( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord vWidth
|
||||
,wxCoord vHeight
|
||||
)
|
||||
{
|
||||
return Combine( x
|
||||
,y
|
||||
,vWidth
|
||||
,vHeight
|
||||
,wxRGN_AND
|
||||
);
|
||||
}
|
||||
inline bool Intersect(const wxRect& rRect) { return Combine(rRect, wxRGN_AND); }
|
||||
inline bool Intersect(const wxRegion& rRegion) { return Combine(rRegion, wxRGN_AND); }
|
||||
|
||||
//
|
||||
// Subtract rectangle or region from this:
|
||||
// Combines the parts of 'this' that are not part of the second region.
|
||||
//
|
||||
inline bool Subtract( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord vWidth
|
||||
,wxCoord vHeight
|
||||
)
|
||||
{
|
||||
return Combine( x
|
||||
,y
|
||||
,vWidth
|
||||
,vHeight
|
||||
,wxRGN_DIFF
|
||||
);
|
||||
}
|
||||
inline bool Subtract(const wxRect& rRect) { return Combine(rRect, wxRGN_DIFF); }
|
||||
inline bool Subtract(const wxRegion& rRegion) { return Combine(rRegion, wxRGN_DIFF); }
|
||||
|
||||
//
|
||||
// XOR: the union of two combined regions except for any overlapping areas.
|
||||
//
|
||||
inline bool Xor( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord vWidth
|
||||
,wxCoord vHeight
|
||||
)
|
||||
{
|
||||
return Combine( x
|
||||
,y
|
||||
,vWidth
|
||||
,vHeight
|
||||
,wxRGN_XOR
|
||||
);
|
||||
}
|
||||
inline bool Xor(const wxRect& rRect) { return Combine(rRect, wxRGN_XOR); }
|
||||
inline bool Xor(const wxRegion& rRegion) { return Combine(rRegion, wxRGN_XOR); }
|
||||
|
||||
//
|
||||
// Information on region
|
||||
// Outer bounds of region
|
||||
//
|
||||
void GetBox( wxCoord& rX
|
||||
,wxCoord& rY
|
||||
,wxCoord& rWidth
|
||||
,wxCoord& rHeight
|
||||
) const;
|
||||
wxRect GetBox(void) const;
|
||||
virtual void Clear();
|
||||
|
||||
//
|
||||
// Is region empty?
|
||||
//
|
||||
bool Empty(void) const;
|
||||
inline bool IsEmpty() const { return Empty(); }
|
||||
|
||||
//
|
||||
// Tests
|
||||
// Does the region contain the point (x,y)?
|
||||
//
|
||||
inline wxRegionContain Contains( wxCoord lX, wxCoord lY ) const{
|
||||
return Contains( wxPoint( lX, lY ) );
|
||||
}
|
||||
//
|
||||
// Convert the region to a B&W bitmap with the black pixels being inside
|
||||
// the region.
|
||||
//
|
||||
wxBitmap ConvertToBitmap(void) 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);
|
||||
|
||||
//
|
||||
// Does the region contain the point pt?
|
||||
//
|
||||
wxRegionContain Contains(const wxPoint& rPoint) const;
|
||||
|
||||
//
|
||||
// Does the region contain the rectangle (x, y, w, h)?
|
||||
//
|
||||
wxRegionContain Contains( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord lWidth
|
||||
,wxCoord lHeight
|
||||
) const;
|
||||
|
||||
//
|
||||
// Does the region contain the rectangle rect?
|
||||
//
|
||||
inline wxRegionContain Contains(const wxRect& rRect) const{
|
||||
return Contains( rRect.x, rRect.y,
|
||||
rRect.GetWidth(), rRect.GetHeight());
|
||||
}
|
||||
|
||||
//
|
||||
// Internal
|
||||
//
|
||||
bool Combine( wxCoord x
|
||||
,wxCoord y
|
||||
,wxCoord vWidth
|
||||
,wxCoord vHeight
|
||||
,wxRegionOp eOp
|
||||
);
|
||||
bool Combine( const wxRegion& rRegion
|
||||
,wxRegionOp eOp
|
||||
);
|
||||
bool Combine( const wxRect& rRect
|
||||
,wxRegionOp eOp
|
||||
);
|
||||
virtual bool IsEmpty() const;
|
||||
|
||||
//
|
||||
// Get internal region handle
|
||||
//
|
||||
WXHRGN GetHRGN(void) const;
|
||||
WXHRGN GetHRGN() const;
|
||||
|
||||
void SetPS(HPS hPS);
|
||||
|
||||
protected:
|
||||
virtual wxObjectRefData* CreateData(void) const;
|
||||
virtual wxObjectRefData* CloneData(const wxObjectRefData* pData) const;
|
||||
|
||||
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 DoCombine(const wxRegion& region, wxRegionOp op);
|
||||
|
||||
friend class WXDLLEXPORT wxRegionIterator;
|
||||
DECLARE_DYNAMIC_CLASS(wxRegion);
|
||||
|
||||
@@ -269,5 +111,4 @@ private:
|
||||
wxRect* m_pRects;
|
||||
}; // end of wxRegionIterator
|
||||
|
||||
#endif
|
||||
// _WX_REGION_H_
|
||||
#endif // _WX_OS2_REGION_H_
|
||||
|
Reference in New Issue
Block a user