X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/452418c4b0763eb611432e84f077c9766e282057..9f7e7edb78aa19d6aed53b113aa953c24d6335b1:/src/common/xpmdecod.cpp?ds=sidebyside diff --git a/src/common/xpmdecod.cpp b/src/common/xpmdecod.cpp index 709cc6e7dc..a752ead86f 100644 --- a/src/common/xpmdecod.cpp +++ b/src/common/xpmdecod.cpp @@ -265,7 +265,7 @@ typedef struct #define myRGB(r,g,b) ((wxUint32)r<<16|(wxUint32)g<<8|(wxUint32)b) -static rgbRecord theRGBRecords[] = +static const rgbRecord theRGBRecords[] = { {"aliceblue", myRGB(240, 248, 255)}, {"antiquewhite", myRGB(250, 235, 215)}, @@ -504,7 +504,7 @@ static rgbRecord theRGBRecords[] = {"yellowgreen", myRGB(50, 216, 56)}, {NULL, myRGB(0, 0, 0)} }; -static int numTheRGBRecords = 235; +static const int numTheRGBRecords = 235; static unsigned char ParseHexadecimal(char digit1, char digit2) { @@ -664,12 +664,12 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) int count; unsigned width, height, colors_cnt, chars_per_pixel; size_t i, j, i_key; - wxChar key[64]; + char key[64]; const char *clr_def; - bool hasMask; wxXPMColourMap clr_tbl; wxXPMColourMap::iterator it; wxString maskKey; + wxString keyString; /* * Read hints and initialize structures: @@ -688,12 +688,10 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) // 8bit RGB... wxCHECK_MSG(chars_per_pixel < 64, wxNullImage, wxT("XPM colormaps this large not supported.")); - if ( !img.Create(width, height) ) + if (!img.Create(width, height, false)) return wxNullImage; - img.SetMask(false); - key[chars_per_pixel] = wxT('\0'); - hasMask = false; + key[chars_per_pixel] = '\0'; /* * Create colour map: @@ -712,7 +710,7 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) } for (i_key = 0; i_key < chars_per_pixel; i_key++) - key[i_key] = (wxChar)xmpColLine[i_key]; + key[i_key] = xmpColLine[i_key]; clr_def = ParseColor(xmpColLine + chars_per_pixel); if ( clr_def == NULL ) @@ -731,36 +729,41 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) return wxNullImage; } + keyString = key; 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; - } + maskKey = keyString; - clr_tbl[key] = clr_data; + clr_tbl[keyString] = 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): - */ - if (hasMask) + // 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 (!maskKey.empty()) { - for (it = clr_tbl.begin(); it != clr_tbl.end(); ++it) + wxLongToLongHashMap rgb_table; + long rgb; + const size_t n = clr_tbl.size(); + wxXPMColourMap::const_iterator iter = clr_tbl.begin(); + for (i = 0; i < n; ++i, ++iter) { - if (it->second.R == 255 && it->second.G == 0 && - it->second.B == 255 && - it->first != maskKey) - { - it->second.B = 254; - } + const wxXPMColourMapData& data = iter->second; + rgb = (data.R << 16) + (data.G << 8) + data.B; + rgb_table[rgb]; + } + for (rgb = 0; rgb <= 0xffffff && rgb_table.count(rgb); ++rgb) + ; + if (rgb > 0xffffff) + { + wxLogError(_("XPM: no colors left to use for mask!")); + return wxNullImage; } + + wxXPMColourMapData& maskData = clr_tbl[maskKey]; + maskData.R = wxByte(rgb >> 16); + maskData.G = wxByte(rgb >> 8); + maskData.B = wxByte(rgb); + + img.SetMaskColour(maskData.R, maskData.G, maskData.B); } /* @@ -785,10 +788,11 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) for (i_key = 0; i_key < chars_per_pixel; i_key++) { - key[i_key] = (wxChar)xpmImgLine[chars_per_pixel * i + i_key]; + key[i_key] = xpmImgLine[chars_per_pixel * i + i_key]; } - entry = clr_tbl.find(key); + keyString = key; + entry = clr_tbl.find(keyString); if ( entry == end ) { wxLogError(_("XPM: Malformed pixel data!")); @@ -799,12 +803,10 @@ wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) // each remaining pixel if we don't bail out return wxNullImage; } - else - { - img_data[0] = entry->second.R; - img_data[1] = entry->second.G; - img_data[2] = entry->second.B; - } + + img_data[0] = entry->second.R; + img_data[1] = entry->second.G; + img_data[2] = entry->second.B; } }