]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/xpmdecod.cpp
merged fixes for accel and command event non propagation from 2.2
[wxWidgets.git] / src / common / xpmdecod.cpp
index 68a56d178855738c4826c08519c8b237cb5455ae..3b33170ab78a8f26b60f15a77afbe00092d54a35 100644 (file)
@@ -131,14 +131,14 @@ 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 *p, *q;
     size_t i;
 
     if ( stream.Read(xpm_buffer, length).LastError() != wxSTREAM_NO_ERROR )
         return FALSE;
-        
+
     /*
      *  Remove comments from the file:
      */
@@ -178,7 +178,7 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
     i = 0;
     for (p = xpm_buffer; *p != '\0'; p++)
     {
-        if ( *p != '"' ) 
+        if ( *p != '"' )
             continue;
         for (q = p + 1; *q != '\0'; q++)
             if (*q == '"')
@@ -189,40 +189,44 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
         p = q + 1;
     }
     xpm_buffer[i] = '\0';
-    
+
     /*
      *  Create array of lines and convert \n's to \0's:
      */
     const char **xpm_lines;
     size_t lines_cnt = 0;
     size_t line;
-    
+
     for (p = xpm_buffer; *p != '\0'; p++)
     {
-        if ( *p == '\n' ) 
+        if ( *p == '\n' )
             lines_cnt++;
     }
-    
+
     xpm_lines = new const char*[lines_cnt];
     xpm_lines[0] = xpm_buffer;
     line = 1;
     for (p = xpm_buffer; (*p != '\0') && (line < lines_cnt); p++)
     {
-        if ( *p == '\n' ) 
+        if ( *p == '\n' )
         {
             xpm_lines[line] = p + 1;
             *p = '\0';
             line++;
         }
     }
-    
+
     /*
      *  Read the image:
      */
     wxImage img = ReadData(xpm_lines);
-    
+
     delete[] xpm_buffer;
+#ifdef __WIN16__
+    delete[] (char**) xpm_lines;
+#else
     delete[] xpm_lines;
+#endif
     return img;
 }
 #endif // wxUSE_STREAMS
@@ -243,7 +247,7 @@ wxImage wxXPMDecoder::ReadFile(wxInputStream& stream)
 \*****************************************************************************/
 
 
-typedef struct 
+typedef struct
 {
     char *name;
     wxUint32 rgb;
@@ -491,6 +495,25 @@ static rgbRecord theRGBRecords[] =
 };
 static int numTheRGBRecords = 234;
 
+static unsigned char ParseHexadecimal(char digit1, char digit2)
+{
+    unsigned char i1, i2;
+
+    if (digit1 >= 'a')
+        i1 = digit1 - 'a' + 0x0A;
+    else if (digit1 >= 'A')
+        i1 = digit1 - 'A' + 0x0A;
+    else
+        i1 = digit1 - '0';
+    if (digit2 >= 'a')
+        i2 = digit2 - 'a' + 0x0A;
+    else if (digit2 >= 'A')
+        i2 = digit2 - 'A' + 0x0A;
+    else
+        i2 = digit2 - '0';
+    return (0x10 * i1 + i2);
+}
+
 static bool GetRGBFromName(const char *inname, bool *isNone,
                            unsigned char *r, unsigned char*g, unsigned char *b)
 {
@@ -503,16 +526,10 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
     // #rrggbb are not in database, we parse them directly
     if ( *inname == '#' && strlen(inname) == 7 )
     {
-        char buf[3];
-        buf[2] = 0;
-        buf[0] = inname[1]; buf[1] = inname[2];
-        *r = (unsigned char) wxHexToDec(buf);
-        buf[0] = inname[3]; buf[1] = inname[4];
-        *g = (unsigned char) wxHexToDec(buf);
-        buf[0] = inname[5]; buf[1] = inname[6];
-        *b = (unsigned char) wxHexToDec(buf);
+        *r = ParseHexadecimal(inname[1], inname[2]);
+        *g = ParseHexadecimal(inname[3], inname[4]);
+        *b = ParseHexadecimal(inname[5], inname[6]);
         *isNone = FALSE;
-        
         return TRUE;
     }
 
@@ -522,7 +539,7 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
     // lot of gray...
 
     // so first extract ' '
-    while ((p = strchr(name, ' '))
+    while ((p = strchr(name, ' ')) != NULL)
     {
         while (*(p))            // till eof of string
         {
@@ -532,7 +549,7 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
     }
     // fold to lower case
     p = name;
-    while (*p) 
+    while (*p)
     {
         *p = tolower(*p);
         p++;
@@ -540,7 +557,7 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
 
     // substitute Grey with Gray, else rgbtab.h would have more than 100
     // 'duplicate' entries
-    if ( (grey = strstr(name, "grey")) )
+    if ( (grey = strstr(name, "grey")) != NULL )
         grey[2] = 'a';
 
     // check for special 'none' colour:
@@ -553,25 +570,25 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
     // binary search:
     left = 0;
     right = numTheRGBRecords - 1;
-    do 
+    do
     {
         middle = (left + right) / 2;
         cmp = strcmp(name, theRGBRecords[middle].name);
         if ( cmp == 0 )
         {
             rgbVal = theRGBRecords[middle].rgb;
-            *r = (rgbVal >> 16) & 0xFF;
-            *g = (rgbVal >> 8) & 0xFF;
-            *b = (rgbVal) & 0xFF;
+            *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 ) 
+        }
+        else if ( cmp < 0 )
         {
             right = middle - 1;
-        } 
-        else 
+        }
+        else
         {           // > 0
             left = middle + 1;
         }
@@ -583,7 +600,7 @@ static bool GetRGBFromName(const char *inname, bool *isNone,
 
 static const char *ParseColor(const char *data)
 {
-    static const char *targets[] = 
+    static const char *targets[] =
                         {"c ", "g ", "g4 ", "m ", "b ", "s ", NULL};
 
     const char *p, *r;
@@ -630,11 +647,12 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     bool hasMask;
     wxXPMColourMapData *clr_data;
     wxHashTable clr_tbl(wxKEY_STRING);
-    
+
     /*
      *  Read hints and initialize structures:
      */
-    count = sscanf(xpm_data[0], "%u %u %u %u", 
+     
+    count = sscanf(xpm_data[0], "%u %u %u %u",
                    &width, &height, &colors_cnt, &chars_per_pixel);
     if ( count != 4 || width * height * colors_cnt == 0 )
     {
@@ -646,7 +664,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     //     92 possible values on each position, 92^64 is *way* larger space than
     //     8bit RGB...
     wxCHECK_MSG(chars_per_pixel < 64, wxNullImage, wxT("XPM colormaps this large not supported."));
-    
+
     img.Create(width, height);
     if ( !img.Ok() ) return img;
 
@@ -654,7 +672,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     key[chars_per_pixel] = '\0';
     hasMask = FALSE;
     clr_tbl.DeleteContents(TRUE);
-    
+
     /*
      *  Create colour map:
      */
@@ -672,7 +690,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
         else
         {
             bool isNone;
-            if ( !GetRGBFromName(clr_def, &isNone, 
+            if ( !GetRGBFromName(clr_def, &isNone,
                                  &clr_data->R, &clr_data->G, &clr_data->B) )
             {
                 wxLogError(_("XPM: malformed colour definition '%s'!"), xpm_data[1+i]);
@@ -689,7 +707,7 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
                 }
                 else
                 {
-                    if ( hasMask && clr_data->R == 255 && 
+                    if ( hasMask && clr_data->R == 255 &&
                                     clr_data->G == 0 && clr_data->B == 255 )
                         clr_data->B = 254;
                 }
@@ -701,13 +719,13 @@ wxImage wxXPMDecoder::ReadData(const char **xpm_data)
     /*
      *  Parse image data:
      */
-     
+
     unsigned char *img_data = img.GetData();
     for (j = 0; j < height; j++)
     {
         for (i = 0; i < width; i++, img_data += 3)
         {
-            memcpy(key, 
+            memcpy(key,
                    xpm_data[1 + colors_cnt + j] + chars_per_pixel * i,
                    chars_per_pixel);
             clr_data = (wxXPMColourMapData*) clr_tbl.Get(key);