]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/xpmdecod.cpp
fixed serious bug in wxFont::operator== (ignored weight)
[wxWidgets.git] / src / common / xpmdecod.cpp
index 8d35786503e98e00115b7253d702b927e971bf87..434e8dedf911c50dedfa93ea836e0bb20d4e54be 100644 (file)
@@ -136,8 +136,8 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
     char *p, *q;
     size_t i;
 
-    if ( stream.Read(xpm_buffer, length).LastError() != wxSTREAM_NO_ERROR )
-        return FALSE;
+    if ( stream.Read(xpm_buffer, length).LastError() == wxSTREAM_READ_ERROR )
+        return wxNullImage;
 
     /*
      *  Remove comments from the file:
@@ -203,6 +203,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;
@@ -523,12 +529,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;
     }
@@ -561,41 +569,47 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
         grey[2] = 'a';
 
     // check for special 'none' colour:
+    bool found;
     if ( strcmp(name, "none") == 0 )
     {
         *isNone = TRUE;
-        return TRUE;
+        found = TRUE;
     }
-
-    // binary search:
-    left = 0;
-    right = numTheRGBRecords - 1;
-    do
+    else // not "None"
     {
-        middle = (left + right) / 2;
-        cmp = strcmp(name, theRGBRecords[middle].name);
-        if ( cmp == 0 )
-        {
-            rgbVal = theRGBRecords[middle].rgb;
-            *r = (unsigned char)((rgbVal >> 16) & 0xFF);
-            *g = (unsigned char)((rgbVal >> 8) & 0xFF);
-            *b = (unsigned char)((rgbVal) & 0xFF);
-            *isNone = FALSE;
-            free(name);
-            return TRUE;
-        }
-        else if ( cmp < 0 )
+        found = FALSE;
+
+        // binary search:
+        left = 0;
+        right = numTheRGBRecords - 1;
+        do
         {
-            right = middle - 1;
-        }
-        else
-        {           // > 0
-            left = middle + 1;
-        }
-    } while (left <= right);
+            middle = (left + right) / 2;
+            cmp = strcmp(name, theRGBRecords[middle].name);
+            if ( cmp == 0 )
+            {
+                rgbVal = theRGBRecords[middle].rgb;
+                *r = (unsigned char)((rgbVal >> 16) & 0xFF);
+                *g = (unsigned char)((rgbVal >> 8) & 0xFF);
+                *b = (unsigned char)((rgbVal) & 0xFF);
+                *isNone = FALSE;
+                found = TRUE;
+                break;
+            }
+            else if ( cmp < 0 )
+            {
+                right = middle - 1;
+            }
+            else // cmp > 0
+            {
+                left = middle + 1;
+            }
+        } while (left <= right);
+    }
 
     free(name);
-    return FALSE;
+
+    return found;
 }
 
 static const char *ParseColor(const char *data)
@@ -746,5 +760,4 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     return img;
 }
 
-
 #endif // wxUSE_IMAGE && wxUSE_XPM