]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/xpmdecod.cpp
Pass length including the null-terminator to cWC2MB
[wxWidgets.git] / src / common / xpmdecod.cpp
index ac1b1b7249151f5ce7dd67cc03bff742c2fea99d..b866d751aa5bd0c358a7b12640218a31d11ceeb2 100644 (file)
@@ -99,23 +99,20 @@ license is as follows:
 
 #if wxUSE_IMAGE && wxUSE_XPM
 
+#include "wx/xpmdecod.h"
+
 #ifndef WX_PRECOMP
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/utils.h"
-    #if wxUSE_STREAMS
-        #include "wx/stream.h"
-    #endif
+    #include "wx/hashmap.h"
+    #include "wx/stream.h"
+    #include "wx/image.h"
 #endif
 
-#include "wx/image.h"
-#include "wx/hashmap.h"
 #include <string.h>
-
 #include <ctype.h>
 
-#include "wx/xpmdecod.h"
-
 #if wxUSE_STREAMS
 bool wxXPMDecoder::CanRead(wxInputStream& stream)
 {
@@ -659,7 +656,7 @@ struct wxXPMColourMapData
 };
 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") );
 
@@ -736,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;
         }
@@ -748,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);
     }
 
     /*