X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd1eb4e315ca84b5d1b574ab3f6308885ed097c2..c7382f913cc2d3ddcc782b876574c58865e7d842:/src/common/rgncmn.cpp diff --git a/src/common/rgncmn.cpp b/src/common/rgncmn.cpp index 0cf6f5ae06..2b1b5b6600 100644 --- a/src/common/rgncmn.cpp +++ b/src/common/rgncmn.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "rgncmn.h" #endif @@ -23,7 +23,9 @@ #include "wx/region.h" #include "wx/bitmap.h" +#if wxUSE_IMAGE #include "wx/image.h" +#endif #include "wx/dcmemory.h" @@ -37,10 +39,10 @@ wxBitmap wxRegion::ConvertToBitmap() const wxBitmap bmp(box.GetRight(), box.GetBottom()); wxMemoryDC dc; dc.SelectObject(bmp); - dc.SetBackground(*wxWHITE_BRUSH); + dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); dc.SetClippingRegion(*this); - dc.SetBackground(*wxBLACK_BRUSH); + dc.SetBackground(*wxWHITE_BRUSH); dc.Clear(); dc.SelectObject(wxNullBitmap); return bmp; @@ -48,32 +50,16 @@ wxBitmap wxRegion::ConvertToBitmap() const //--------------------------------------------------------------------------- -bool wxRegion::Union(const wxBitmap& bmp, - const wxColour& transColour, - int tolerance) +#if wxUSE_IMAGE +static bool DoRegionUnion(wxRegion& region, + const wxImage& image, + unsigned char loR, + unsigned char loG, + unsigned char loB, + int tolerance) { - unsigned char loR, loG, loB; unsigned char hiR, hiG, hiB; - wxCHECK_MSG((bmp.GetMask() != NULL) || transColour.Ok(), - FALSE, - wxT("Either the bitmap should have a mask or a colour should be given.")); - - wxImage image = bmp.ConvertToImage(); - - if (image.HasMask()) - { - loR = image.GetMaskRed(); - loG = image.GetMaskGreen(); - loB = image.GetMaskBlue(); - } - else - { - loR = transColour.Red(); - loG = transColour.Green(); - loB = transColour.Blue(); - } - hiR = wxMin(0xFF, loR + tolerance); hiG = wxMin(0xFF, loG + tolerance); hiB = wxMin(0xFF, loB + tolerance); @@ -108,12 +94,61 @@ bool wxRegion::Union(const wxBitmap& bmp, if (x > x0) { rect.x = x0; rect.width = x - x0; - Union(rect); + region.Union(rect); } } } - return TRUE; + return true; } + + +bool wxRegion::Union(const wxBitmap& bmp) +{ + if (bmp.GetMask()) + { + wxImage image = bmp.ConvertToImage(); + wxASSERT_MSG( image.HasMask(), _T("wxBitmap::ConvertToImage doesn't preserve mask?") ); + return DoRegionUnion(*this, image, + image.GetMaskRed(), + image.GetMaskGreen(), + image.GetMaskBlue(), + 0); + } + else + { + return Union(0, 0, bmp.GetWidth(), bmp.GetHeight()); + } +} + +bool wxRegion::Union(const wxBitmap& bmp, + const wxColour& transColour, + int tolerance) +{ + wxImage image = bmp.ConvertToImage(); + return DoRegionUnion(*this, image, + transColour.Red(), + transColour.Green(), + transColour.Blue(), + tolerance); +} + +#else + +bool wxRegion::Union(const wxBitmap& WXUNUSED(bmp)) +{ + // No wxImage support + return false; +} + +bool wxRegion::Union(const wxBitmap& WXUNUSED(bmp), + const wxColour& WXUNUSED(transColour), + int WXUNUSED(tolerance)) +{ + // No wxImage support + return false; +} + +#endif //---------------------------------------------------------------------------