/////////////////////////////////////////////////////////////////////////////
-// Name: imagbmp.cpp
+// Name: src/common/imagbmp.cpp
// Purpose: wxImage BMP,ICO and CUR handlers
// Author: Robert Roebling, Chris Elliott
// RCS-ID: $Id$
#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
//-----------------------------------------------------------------------------
verbose, IsBmp, true) )
{
if (verbose)
- wxLogError( _("Error in reading image DIB .") );
+ wxLogError( _("Error in reading image DIB.") );
return false;
}
}
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() )
#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