X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ffb81a42350ef0fe9161185480ed41d3f0e76dd..aa99e0cd2242db04fe1f9bb7d91aea545def2422:/src/common/xpmdecod.cpp diff --git a/src/common/xpmdecod.cpp b/src/common/xpmdecod.cpp index c6e10441c9..f8524971a0 100644 --- a/src/common/xpmdecod.cpp +++ b/src/common/xpmdecod.cpp @@ -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); @@ -178,7 +178,10 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream) if ( (*q == '*') && (*(q + 1) == '/') ) break; } - strcpy(p, q + 2); + + // memmove allows overlaps (unlike strcpy): + size_t cpylen = strlen(q + 2) + 1; + memmove(p, q + 2, cpylen); } /* @@ -236,11 +239,7 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream) */ wxImage img = ReadData(xpm_lines); -#ifdef __WIN16__ - delete[] (char**) xpm_lines; -#else delete[] xpm_lines; -#endif return img; } @@ -547,8 +546,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 +581,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 +601,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 +670,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 +693,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 +708,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 +718,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: */