]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/xpmdecod.cpp
use MoreFiles under Mac OS X
[wxWidgets.git] / src / common / xpmdecod.cpp
index 28d81ca4a3fa14e48e946de4d78fe5d0a3442822..1112b5123f37ced16d40cd951fbcb15472473304 100644 (file)
@@ -105,6 +105,7 @@ license is as follows:
 #  include "wx/defs.h"
 #endif
 
+#if wxUSE_IMAGE && wxUSE_XPM
 
 #include "wx/stream.h"
 #include "wx/image.h"
@@ -131,12 +132,13 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
     size_t length = stream.GetSize();
     wxCHECK_MSG(length != 0, wxNullImage, wxT("Cannot read XPM from stream of unknown size"));
 
-    char *xpm_buffer = new char[length];
+    char *xpm_buffer = new char[length+1];
     char *p, *q;
     size_t i;
 
     if ( stream.Read(xpm_buffer, length).LastError() == wxSTREAM_READ_ERROR )
-        return FALSE;
+        return wxNullImage;
+    xpm_buffer[length] = '\0';
 
     /*
      *  Remove comments from the file:
@@ -202,6 +204,12 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
             lines_cnt++;
     }
 
+    if ( !lines_cnt )
+    {
+        // this doesn't really look an XPM image
+        return wxNullImage;
+    }
+
     xpm_lines = new const char*[lines_cnt];
     xpm_lines[0] = xpm_buffer;
     line = 1;
@@ -522,12 +530,14 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
     char *name;
     char *grey, *p;
 
-    // #rrggbb are not in database, we parse them directly
-    if ( *inname == '#' && strlen(inname) == 7 )
+    // Neither #rrggbb nor #rrrrggggbbbb are in database, we parse them directly
+    size_t inname_len = strlen(inname);
+    if ( *inname == '#' && (inname_len == 7 || inname_len == 13))
     {
+        size_t ofs = (inname_len == 7) ? 2 : 4;
         *r = ParseHexadecimal(inname[1], inname[2]);
-        *g = ParseHexadecimal(inname[3], inname[4]);
-        *b = ParseHexadecimal(inname[5], inname[6]);
+        *g = ParseHexadecimal(inname[1*ofs+1], inname[1*ofs+2]);
+        *b = ParseHexadecimal(inname[2*ofs+1], inname[2*ofs+2]);
         *isNone = FALSE;
         return TRUE;
     }
@@ -751,4 +761,4 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     return img;
 }
 
-
+#endif // wxUSE_IMAGE && wxUSE_XPM