]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagbmp.cpp
Pass length including the null-terminator to cWC2MB
[wxWidgets.git] / src / common / imagbmp.cpp
index ea4fd78d0411ed02160fa16fdc53d9d9bcd8f1e4..5f45ba920795ad8182929baeaf165edb566d44ee 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        imagbmp.cpp
+// Name:        src/common/imagbmp.cpp
 // Purpose:     wxImage BMP,ICO and CUR handlers
 // Author:      Robert Roebling, Chris Elliott
 // RCS-ID:      $Id$
@@ -7,31 +7,32 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "imagbmp.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
-#include "wx/defs.h"
-
 #if wxUSE_IMAGE
 
 #include "wx/imagbmp.h"
-#include "wx/bitmap.h"
-#include "wx/debug.h"
-#include "wx/log.h"
-#include "wx/app.h"
+
+#ifndef WX_PRECOMP
+    #ifdef __WXMSW__
+        #include "wx/msw/wrapwin.h"
+    #endif
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/bitmap.h"
+    #include "wx/palette.h"
+    #include "wx/intl.h"
+#endif
+
 #include "wx/filefn.h"
 #include "wx/wfstream.h"
-#include "wx/intl.h"
-#include "wx/module.h"
 #include "wx/quantize.h"
+#include "wx/anidecod.h"
 
 // For memcpy
 #include <string.h>
 #endif
 #endif
 
-#ifdef __WXMSW__
-#include "wx/msw/wrapwin.h"
-#endif
-
 //-----------------------------------------------------------------------------
 // wxBMPHandler
 //-----------------------------------------------------------------------------
@@ -273,14 +270,16 @@ bool wxBMPHandler::SaveDib(wxImage *image,
     else if ( (format == wxBMP_8BPP_GREY) || (format == wxBMP_8BPP_RED) ||
               (format == wxBMP_1BPP_BW) )
     {
-        int i;
         rgbquad = new wxUint8 [palette_size*4];
 
-        for (i = 0; i < palette_size; i++)
+        for ( int i = 0; i < palette_size; i++ )
         {
-            // if 1BPP_BW then just 0 and 255 then exit
-            if (( i > 0) && (format == wxBMP_1BPP_BW)) i = 255;
-            rgbquad[i*4] = rgbquad[i*4+1] = rgbquad[i*4+2] = (wxUint8)i;
+            // if 1BPP_BW then the value should be either 0 or 255
+            wxUint8 c = (wxUint8)((i > 0) && (format == wxBMP_1BPP_BW) ? 255 : i);
+
+            rgbquad[i*4] =
+            rgbquad[i*4+1] =
+            rgbquad[i*4+2] = c;
             rgbquad[i*4+3] = 0;
         }
     }
@@ -865,8 +864,8 @@ bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream,
     offset = offset + wxINT32_SWAP_ON_BE(dbuf[2]);
 
     stream.Read(dbuf, 4 * 2);
-    int width = (int)wxINT32_SWAP_ON_BE(dbuf[0]);
-    int height = (int)wxINT32_SWAP_ON_BE(dbuf[1]);
+    int width = wxINT32_SWAP_ON_BE((int)dbuf[0]);
+    int height = wxINT32_SWAP_ON_BE((int)dbuf[1]);
     if ( !IsBmp)height = height  / 2; // for icons divide by 2
 
     if ( width > 32767 )
@@ -888,7 +887,7 @@ bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream,
             int planes = (int)wxUINT16_SWAP_ON_BE( aWord );
         */
     stream.Read(&aWord, 2);
-    int bpp = (int)wxUINT16_SWAP_ON_BE(aWord);
+    int bpp = wxUINT16_SWAP_ON_BE((int)aWord);
     if ( bpp != 1 && bpp != 4 && bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32 )
     {
         if (verbose)
@@ -897,7 +896,7 @@ bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream,
     }
 
     stream.Read(dbuf, 4 * 4);
-    int comp = (int)wxINT32_SWAP_ON_BE(dbuf[0]);
+    int comp = wxINT32_SWAP_ON_BE((int)dbuf[0]);
     if ( comp != BI_RGB && comp != BI_RLE4 && comp != BI_RLE8 &&
          comp != BI_BITFIELDS )
     {
@@ -907,7 +906,7 @@ bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream,
     }
 
     stream.Read(dbuf, 4 * 2);
-    int ncolors = (int)wxINT32_SWAP_ON_BE( dbuf[0] );
+    int ncolors = wxINT32_SWAP_ON_BE( (int)dbuf[0] );
     if (ncolors == 0)
         ncolors = 1 << bpp;
     /* some more sanity checks */
@@ -925,7 +924,7 @@ bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream,
                     verbose, IsBmp, true) )
     {
         if (verbose)
-            wxLogError( _("Error in reading image DIB .") );
+            wxLogError( _("Error in reading image DIB.") );
         return false;
     }
 
@@ -1021,7 +1020,7 @@ bool wxICOHandler::SaveFile(wxImage *image,
         return false;
     }
 
-    int images = 1; // only generate one image
+    const int images = 1; // only generate one image
 
     // VS: This is a hack of sort - since ICO and CUR files are almost
     //     identical, we have all the meat in wxICOHandler and check for
@@ -1035,8 +1034,8 @@ bool wxICOHandler::SaveFile(wxImage *image,
 
     ICONDIR IconDir;
     IconDir.idReserved = 0;
-    IconDir.idType = (wxUint16)wxUINT16_SWAP_ON_BE(type);
-    IconDir.idCount = (wxUint16)wxUINT16_SWAP_ON_BE(images);
+    IconDir.idType = wxUINT16_SWAP_ON_BE((wxUint16)type);
+    IconDir.idCount = wxUINT16_SWAP_ON_BE((wxUint16)images);
     stream.Write(&IconDir.idReserved, sizeof(IconDir.idReserved));
     stream.Write(&IconDir.idType, sizeof(IconDir.idType));
     stream.Write(&IconDir.idCount, sizeof(IconDir.idCount));
@@ -1049,7 +1048,7 @@ bool wxICOHandler::SaveFile(wxImage *image,
 
     // for each iamage write a description ICONDIRENTRY:
     ICONDIRENTRY icondirentry;
-    for (int i = 0; i < images; i++)
+    for (int img = 0; img < images; img++)
     {
         wxImage mask;
 
@@ -1116,7 +1115,7 @@ bool wxICOHandler::SaveFile(wxImage *image,
         }
         wxUint32 Size = cStream.GetSize();
 
-        // wxCountingOutputStream::Ok() always returns true for now and this
+        // wxCountingOutputStream::IsOk() always returns true for now and this
         // "if" provokes VC++ warnings in optimized build
 #if 0
         if ( !cStream.Ok() )
@@ -1326,160 +1325,28 @@ IMPLEMENT_DYNAMIC_CLASS(wxANIHandler, wxCURHandler)
 #if wxUSE_STREAMS
 
 bool wxANIHandler::LoadFile(wxImage *image, wxInputStream& stream,
-                            bool verbose, int index)
+                            bool WXUNUSED(verbose), int index)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    int iIcon = 0;
-
-    stream.SeekI(0);
-    stream.Read(&FCC1, 4);
-    if ( FCC1 != riff32 )
+    wxANIDecoder decoder;
+    if (!decoder.Load(stream))
         return false;
 
-    // we have a riff file:
-    while (stream.IsOk())
-    {
-        // we always have a data size
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        //now either data or a FCC
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            if (FCC1 == ico32 && iIcon >= index)
-            {
-                return DoLoadFile(image, stream, verbose, -1);
-            }
-            else
-            {
-                stream.SeekI(stream.TellI() + datalen);
-                if ( FCC1 == ico32 )
-                    iIcon ++;
-            }
-        }
-
-        // try to read next data chunk:
-        stream.Read(&FCC1, 4);
-    }
-    return false;
+    return decoder.ConvertToImage(index != -1 ? (size_t)index : 0, image);
 }
 
 bool wxANIHandler::DoCanRead(wxInputStream& stream)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen ;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    wxInt32 anih32;
-    memcpy( &anih32, "anih", 4 );
-
-    stream.SeekI(0);
-    if ( !stream.Read(&FCC1, 4) )
-        return false;
-
-    if ( FCC1 != riff32 )
-        return false;
-
-    // we have a riff file:
-    while ( stream.IsOk() )
-    {
-        if ( FCC1 == anih32 )
-            return true;
-        // we always have a data size:
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        // now either data or a FCC:
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            stream.SeekI(stream.TellI() + datalen);
-        }
-
-        // try to read next data chunk:
-        if ( !stream.Read(&FCC1, 4) )
-        {
-            // reading failed -- either EOF or IO error, bail out anyhow
-            return false;
-        }
-    }
-
-    return false;
+    wxANIDecoder decod;
+    return decod.CanRead(stream);
 }
 
 int wxANIHandler::GetImageCount(wxInputStream& stream)
 {
-    wxInt32 FCC1, FCC2;
-    wxUint32 datalen ;
-
-    wxInt32 riff32;
-    memcpy( &riff32, "RIFF", 4 );
-    wxInt32 list32;
-    memcpy( &list32, "LIST", 4 );
-    wxInt32 ico32;
-    memcpy( &ico32, "icon", 4 );
-    wxInt32 anih32;
-    memcpy( &anih32, "anih", 4 );
-
-    stream.SeekI(0);
-    stream.Read(&FCC1, 4);
-    if ( FCC1 != riff32 )
+    wxANIDecoder decoder;
+    if (!decoder.Load(stream))
         return wxNOT_FOUND;
 
-    // we have a riff file:
-    while ( stream.IsOk() )
-    {
-        // we always have a data size:
-        stream.Read(&datalen, 4);
-        datalen = wxINT32_SWAP_ON_BE(datalen) ;
-        //data should be padded to make even number of bytes
-        if (datalen % 2 == 1) datalen ++ ;
-        // now either data or a FCC:
-        if ( (FCC1 == riff32) || (FCC1 == list32) )
-        {
-            stream.Read(&FCC2, 4);
-        }
-        else
-        {
-            if ( FCC1 == anih32 )
-            {
-                wxUint32 *pData = new wxUint32[datalen/4];
-                stream.Read(pData, datalen);
-                int nIcons = wxINT32_SWAP_ON_BE(*(pData + 1));
-                delete[] pData;
-                return nIcons;
-            }
-            else
-                stream.SeekI(stream.TellI() + datalen);
-        }
-
-        // try to read next data chunk:
-        stream.Read(&FCC1, 4);
-    }
-
-    return wxNOT_FOUND;
+    return decoder.GetFrameCount();
 }
 
 #endif // wxUSE_STREAMS