]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagxpm.cpp
check for wxOnAssert reentrancy
[wxWidgets.git] / src / common / imagxpm.cpp
index b637c66808410feb9e3ad29bc716811fb6298207..7d3bced364b6307a1b5170759f4d51fb2824e038 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        imagxpm.cpp
 // Purpose:     wxXPMHandler
-// Author:      Vaclav Slavik
+// Author:      Vaclav Slavik, Robert Roebling
 // RCS-ID:      $Id$
 // Copyright:   (c) 2001 Vaclav Slavik
 // Licence:     wxWindows licence
@@ -77,14 +77,13 @@ license is as follows:
 #  include "wx/defs.h"
 #endif
 
-#if wxUSE_IMAGE && wxUSE_XPM
 
 #include "wx/imagxpm.h"
 #include "wx/wfstream.h"
 #include "wx/log.h"
 #include "wx/intl.h"
 #include "wx/utils.h"
-
+#include "wx/xpmdecod.h"
 
 IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler)
 
@@ -94,42 +93,50 @@ IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler)
 
 #if wxUSE_STREAMS
 
-bool wxXPMHandler::LoadFile(wxImage *WXUNUSED(image), 
-                            wxInputStream& WXUNUSED(stream), 
-                            bool verbose, int WXUNUSED(index))
+bool wxXPMHandler::LoadFile(wxImage *image,
+                            wxInputStream& stream,
+                            bool WXUNUSED(verbose), int WXUNUSED(index))
 {
-    if (verbose)
-        wxLogDebug(_("XPM: the handler is write-only!"));
-    return FALSE;
+    wxXPMDecoder decoder;
+
+    wxImage img = decoder.ReadFile(stream);
+    if ( !img.Ok() )
+        return FALSE;
+    *image = img;
+    return TRUE;
 }
 
 bool wxXPMHandler::SaveFile(wxImage * image,
-                            wxOutputStream& stream, bool verbose)
+                            wxOutputStream& stream, bool WXUNUSED(verbose))
 {
     wxString tmp;
     char tmp_c;
-    
+
     // 1. count colours:
     #define MaxCixels  92
-    static const char Cixel[MaxCixels+1] = 
+    static const char Cixel[MaxCixels+1] =
                          " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk"
                          "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|";
     int chars_per_pixel;
     int cols;
     int i, j, k;
-    
+
     cols = image->CountColours();
     chars_per_pixel = 1;
     for ( k = MaxCixels; cols > k; k *= MaxCixels)
         chars_per_pixel++;
 
     // 2. write the header:
-    tmp.Printf("/* XPM */\n"
+    char tmpbuf[200];
+    // VS: 200b is safe upper bound for anything produced by sprintf bellow
+    //     (101 bytes the string, neither %i can expand into more than 10 chars)
+    sprintf(tmpbuf, 
+               "/* XPM */\n"
                "static char *xpm_data[] = {\n"
                "/* columns rows colors chars-per-pixel */\n"
-               "\"%i %i %i %i\",\n", 
+               "\"%i %i %i %i\",\n",
                image->GetWidth(), image->GetHeight(), cols, chars_per_pixel);
-    stream.Write(tmp.mb_str(), tmp.Length());
+    stream.Write(tmpbuf, strlen(tmpbuf));
 
     // 3. create color symbols table:
     wxHashTable table(wxKEY_INTEGER);
@@ -143,7 +150,7 @@ bool wxXPMHandler::SaveFile(wxImage * image,
     if (image->HasMask())
         mask_key = (image->GetMaskRed() << 16) |
                    (image->GetMaskGreen() << 8) | image->GetMaskBlue();
-    
+
     // 2b. generate colour table:
     table.BeginFind();
     wxNode *node = NULL;
@@ -170,7 +177,7 @@ bool wxXPMHandler::SaveFile(wxImage * image,
         else if (key == mask_key)
             tmp.Printf(wxT("\"%s c None\",\n"), sym);
         else
-            tmp.Printf(wxT("\"%s c #%s%s%s\",\n"), sym, 
+            tmp.Printf(wxT("\"%s c #%s%s%s\",\n"), sym,
                        wxDecToHex((unsigned char)(key >> 16)).c_str(),
                        wxDecToHex((unsigned char)(key >> 8)).c_str(),
                        wxDecToHex((unsigned char)(key)).c_str());
@@ -199,7 +206,7 @@ bool wxXPMHandler::SaveFile(wxImage * image,
     }
     tmp = wxT("};\n");
     stream.Write(tmp.mb_str(), 3);
-    
+
     delete[] symbols;
     delete[] symbols_data;
 
@@ -208,14 +215,9 @@ bool wxXPMHandler::SaveFile(wxImage * image,
 
 bool wxXPMHandler::DoCanRead(wxInputStream& stream)
 {
-    unsigned char buf[9];
-
-    stream.Read(buf, 9);
-    stream.SeekI(-9, wxFromCurrent);
-
-    return (memcmp(buf, "/* XPM */", 9) == 0);
+    wxXPMDecoder decoder;
+    return decoder.CanRead(stream);
 }
 
 #endif  // wxUSE_STREAMS
 
-#endif // wxUSE_XPM && wxUSE_IMAGE