X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0be9ace27e0a278272cbb1e9daa988b65898eca1..2d35020a8dd1a0908f4e76af323cc0d413d6b8c3:/src/common/xpmdecod.cpp diff --git a/src/common/xpmdecod.cpp b/src/common/xpmdecod.cpp index 4b4e47e045..cc0e2bad48 100644 --- a/src/common/xpmdecod.cpp +++ b/src/common/xpmdecod.cpp @@ -90,7 +90,7 @@ license is as follows: * in this Software without prior written authorization from GROUPE BULL. */ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "xpmdecod.h" #endif @@ -125,7 +125,7 @@ bool wxXPMDecoder::CanRead(wxInputStream& stream) unsigned char buf[9]; if ( !stream.Read(buf, WXSIZEOF(buf)) ) - return FALSE; + return false; stream.SeekI(-(off_t)WXSIZEOF(buf), wxFromCurrent); @@ -547,8 +547,8 @@ static bool GetRGBFromName(const char *inname, bool *isNone, *r = ParseHexadecimal(inname[1], inname[2]); *g = ParseHexadecimal(inname[1*ofs+1], inname[1*ofs+2]); *b = ParseHexadecimal(inname[2*ofs+1], inname[2*ofs+2]); - *isNone = FALSE; - return TRUE; + *isNone = false; + return true; } name = strdup(inname); @@ -582,12 +582,12 @@ static bool GetRGBFromName(const char *inname, bool *isNone, bool found; if ( strcmp(name, "none") == 0 ) { - *isNone = TRUE; - found = TRUE; + *isNone = true; + found = true; } else // not "None" { - found = FALSE; + found = false; // binary search: left = 0; @@ -602,8 +602,8 @@ static bool GetRGBFromName(const char *inname, bool *isNone, *r = (unsigned char)((rgbVal >> 16) & 0xFF); *g = (unsigned char)((rgbVal >> 8) & 0xFF); *b = (unsigned char)((rgbVal) & 0xFF); - *isNone = FALSE; - found = TRUE; + *isNone = false; + found = true; break; } else if ( cmp < 0 ) @@ -671,6 +671,8 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) bool hasMask; wxXPMColourMapData clr_data; wxXPMColourMap clr_tbl; + wxXPMColourMap::iterator it; + wxString maskKey; /* * Read hints and initialize structures: @@ -692,9 +694,9 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) img.Create(width, height); if ( !img.Ok() ) return img; - img.SetMask(FALSE); + img.SetMask(false); key[chars_per_pixel] = wxT('\0'); - hasMask = FALSE; + hasMask = false; /* * Create colour map: @@ -707,7 +709,8 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) if ( clr_def == NULL ) { - wxLogError(_("XPM: malformed colour definition '%s'!"), xpm_data[1+i]); + wxLogError(_("XPM: malformed colour definition '%s'!"), + xpm_data[1+i]); clr_data.R = 255, clr_data.G = 0, clr_data.B = 255; } else @@ -716,29 +719,43 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) if ( !GetRGBFromName(clr_def, &isNone, &clr_data.R, &clr_data.G, &clr_data.B) ) { - wxLogError(_("XPM: malformed colour definition '%s'!"), xpm_data[1+i]); + wxLogError(_("XPM: malformed colour definition '%s'!"), + xpm_data[1+i]); clr_data.R = 255, clr_data.G = 0, clr_data.B = 255; } else { if ( isNone ) { - img.SetMask(TRUE); + img.SetMask(true); img.SetMaskColour(255, 0, 255); - hasMask = TRUE; + hasMask = true; clr_data.R = 255, clr_data.G = 0, clr_data.B = 255; - } - else - { - if ( hasMask && clr_data.R == 255 && - clr_data.G == 0 && clr_data.B == 255 ) - clr_data.B = 254; + maskKey = key; } } } 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): + */ + if (hasMask) + { + for (it = clr_tbl.begin(); it != clr_tbl.end(); it++) + { + if (it->second.R == 255 && it->second.G == 0 && + it->second.B == 255 && + it->first != maskKey) + { + it->second.B = 254; + } + } + } + /* * Parse image data: */ @@ -758,6 +775,12 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data) if ( entry == end ) { wxLogError(_("XPM: Malformed pixel data!")); + + // better return right now as otherwise we risk to flood the + // user with error messages as something seems to be seriously + // wrong with the file and so we could give this message for + // each remaining pixel if we don't bail out + return wxNullImage; } else {