X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..137c8bde085d6d5b7c459902d2ea1a198ab48765:/src/common/rgncmn.cpp?ds=sidebyside diff --git a/src/common/rgncmn.cpp b/src/common/rgncmn.cpp index d26eca7b55..6b7bac3a5c 100644 --- a/src/common/rgncmn.cpp +++ b/src/common/rgncmn.cpp @@ -1,35 +1,31 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: rgncmn.cpp +// Name: src/common/rgncmn.cpp // Purpose: Methods of wxRegion that have a generic implementation // Author: Robin Dunn // Modified by: // Created: 27-Mar-2003 // RCS-ID: $Id$ // Copyright: (c) Robin Dunn -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "rgncmn.h" -#endif - - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #include "wx/region.h" -#include "wx/bitmap.h" -#if wxUSE_IMAGE -#include "wx/image.h" -#endif -#include "wx/dcmemory.h" +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" + #include "wx/bitmap.h" +#endif //WX_PRECOMP -//--------------------------------------------------------------------------- +#if wxUSE_IMAGE + #include "wx/image.h" +#endif @@ -51,41 +47,18 @@ wxBitmap wxRegion::ConvertToBitmap() const //--------------------------------------------------------------------------- #if wxUSE_IMAGE -bool wxRegion::Union(const wxBitmap& bmp, - const wxColour& transColour, - int tolerance) -#else -bool wxRegion::Union(const wxBitmap& WXUNUSED(bmp), - const wxColour& WXUNUSED(transColour), - int WXUNUSED(tolerance)) -#endif +static bool DoRegionUnion(wxRegion& region, + const wxImage& image, + unsigned char loR, + unsigned char loG, + unsigned char loB, + int tolerance) { -#if wxUSE_IMAGE - 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); + hiR = (unsigned char)wxMin(0xFF, loR + tolerance); + hiG = (unsigned char)wxMin(0xFF, loG + tolerance); + hiB = (unsigned char)wxMin(0xFF, loB + tolerance); // Loop through the image row by row, pixel by pixel, building up // rectangles to add to the region. @@ -117,16 +90,65 @@ bool wxRegion::Union(const wxBitmap& WXUNUSED(bmp), if (x > x0) { rect.x = x0; rect.width = x - x0; - Union(rect); + region.Union(rect); } } } return true; +} + + +bool wxRegion::Union(const wxBitmap& bmp) +{ +#if (!defined(__WXMSW__) || wxUSE_WXDIB) + 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 +#endif + { + return Union(0, 0, bmp.GetWidth(), bmp.GetHeight()); + } +} + +bool wxRegion::Union(const wxBitmap& bmp, + const wxColour& transColour, + int tolerance) +{ +#if (!defined(__WXMSW__) || wxUSE_WXDIB) + wxImage image = bmp.ConvertToImage(); + return DoRegionUnion(*this, image, + transColour.Red(), + transColour.Green(), + transColour.Blue(), + tolerance); #else - // No wxImage support return false; #endif } -//--------------------------------------------------------------------------- +#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