X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2884838a3c63fc196077ae0353cab3b5c8c5e6d7..541ea80f0ec8a1250981bfaa3452f370e5c42c3b:/src/common/xpmdecod.cpp?ds=sidebyside diff --git a/src/common/xpmdecod.cpp b/src/common/xpmdecod.cpp index 04b25527e2..b866d751aa 100644 --- a/src/common/xpmdecod.cpp +++ b/src/common/xpmdecod.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: xpmdecod.cpp +// Name: src/common/xpmdecod.cpp // Purpose: wxXPMDecoder // Author: John Cristy, Vaclav Slavik // RCS-ID: $Id$ @@ -94,27 +94,25 @@ license is as follows: #include "wx/wxprec.h" #ifdef __BORLANDC__ -# pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_IMAGE && wxUSE_XPM + +#include "wx/xpmdecod.h" + #ifndef WX_PRECOMP -# include "wx/defs.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/hashmap.h" + #include "wx/stream.h" + #include "wx/image.h" #endif -#if wxUSE_IMAGE && wxUSE_XPM - -#include "wx/stream.h" -#include "wx/image.h" -#include "wx/utils.h" -#include "wx/log.h" -#include "wx/hashmap.h" -#include "wx/intl.h" #include - #include -#include "wx/xpmdecod.h" - #if wxUSE_STREAMS bool wxXPMDecoder::CanRead(wxInputStream& stream) { @@ -653,11 +651,12 @@ static const char *ParseColor(const char *data) struct wxXPMColourMapData { + wxXPMColourMapData() { R = G = B = 0; } unsigned char R,G,B; }; WX_DECLARE_STRING_HASH_MAP(wxXPMColourMapData, wxXPMColourMap); -wxImage wxXPMDecoder::ReadData(const char **xpm_data) +wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) { wxCHECK_MSG(xpm_data, wxNullImage, wxT("NULL XPM data") ); @@ -699,6 +698,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) /* * Create colour map: */ + wxXPMColourMapData clr_data; for (i = 0; i < colors_cnt; i++) { const char *xmpColLine = xpm_data[1 + i]; @@ -711,8 +711,6 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) return wxNullImage; } - wxXPMColourMapData clr_data; - for (i_key = 0; i_key < chars_per_pixel; i_key++) key[i_key] = (wxChar)xmpColLine[i_key]; clr_def = ParseColor(xmpColLine + chars_per_pixel); @@ -735,11 +733,6 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) if ( isNone ) { - img.SetMask(true); - img.SetMaskColour(255, 0, 255); - clr_data.R = - clr_data.B = 255; - clr_data.G = 0; hasMask = true; maskKey = key; } @@ -747,22 +740,23 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) clr_tbl[key] = clr_data; } - /* - * Modify colour entries with RGB = (255,0,255) to (255,0,254) if - * mask colour is present (so that existing pixels with (255,0,255) - * magenta colour are not incorrectly made transparent): - */ + // deal with the mask: we must replace pseudo-colour "None" with the mask + // colour (which can be any colour not otherwise used in the image) if (hasMask) { - for (it = clr_tbl.begin(); it != clr_tbl.end(); ++it) + unsigned char r, g, b; + if ( !img.FindFirstUnusedColour(&r, &g, &b) ) { - if (it->second.R == 255 && it->second.G == 0 && - it->second.B == 255 && - it->first != maskKey) - { - it->second.B = 254; - } + wxLogError(_("XPM: no colors left to use for mask!")); + return wxNullImage; } + + clr_tbl[maskKey].R = r; + clr_tbl[maskKey].G = g; + clr_tbl[maskKey].B = b; + + img.SetMask(true); + img.SetMaskColour(r, g, b); } /*