]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/xpmdecod.cpp
Don't complain under MicroWindows if a wxDC's HDC is NULL - it happens
[wxWidgets.git] / src / common / xpmdecod.cpp
index f05334ba3f3045dca9704fa2a193ffa7a02cf6f0..a0d99a11db2db24a8d8661dba00c578af78de168 100644 (file)
@@ -136,7 +136,7 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
     char *p, *q;
     size_t i;
 
-    if ( stream.Read(xpm_buffer, length).LastError() != wxSTREAM_NO_ERROR )
+    if ( stream.Read(xpm_buffer, length).LastError() == wxSTREAM_READ_ERROR )
         return FALSE;
 
     /*
@@ -222,7 +222,11 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
     wxImage img = ReadData(xpm_lines);
 
     delete[] xpm_buffer;
+#ifdef __WIN16__
+    delete[] (char**) xpm_lines;
+#else
     delete[] xpm_lines;
+#endif
     return img;
 }
 #endif // wxUSE_STREAMS
@@ -519,12 +523,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;
     }
@@ -557,41 +563,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)
@@ -637,8 +649,8 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     wxImage img;
     int count;
     unsigned width, height, colors_cnt, chars_per_pixel;
-    unsigned i, j;
-    char key[64];
+    size_t i, j, i_key;
+    wxChar key[64];
     const char *clr_def;
     bool hasMask;
     wxXPMColourMapData *clr_data;
@@ -665,7 +677,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     if ( !img.Ok() ) return img;
 
     img.SetMask(FALSE);
-    key[chars_per_pixel] = '\0';
+    key[chars_per_pixel] = wxT('\0');
     hasMask = FALSE;
     clr_tbl.DeleteContents(TRUE);
 
@@ -674,7 +686,8 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
      */
     for (i = 0; i < colors_cnt; i++)
     {
-        memcpy(key, xpm_data[1 + i], chars_per_pixel);
+        for (i_key = 0; i_key < chars_per_pixel; i_key++)
+            key[i_key] = (wxChar)xpm_data[1 + i][i_key];
         clr_def = ParseColor(xpm_data[1 + i]);
         clr_data = new wxXPMColourMapData;
 
@@ -721,9 +734,9 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     {
         for (i = 0; i < width; i++, img_data += 3)
         {
-            memcpy(key,
-                   xpm_data[1 + colors_cnt + j] + chars_per_pixel * i,
-                   chars_per_pixel);
+            for (i_key = 0; i_key < chars_per_pixel; i_key++)
+                key[i_key] = (wxChar)xpm_data[1 + colors_cnt + j]
+                                             [chars_per_pixel * i + i_key];
             clr_data = (wxXPMColourMapData*) clr_tbl.Get(key);
             if ( clr_data == NULL )
             {
@@ -741,5 +754,4 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     return img;
 }
 
-
 #endif // wxUSE_IMAGE && wxUSE_XPM