+#endif // wxUSE_STREAMS
+
+//-----------------------------------------------------------------------------
+// wxANIHandler
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxANIHandler, wxCURHandler)
+
+#if wxUSE_STREAMS
+
+bool wxANIHandler::LoadFile(wxImage *image, wxInputStream& stream,
+ bool 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 )
+ 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;
+}
+
+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;
+}
+
+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 )
+ 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;
+}
+
+#endif // wxUSE_STREAMS
+
+#endif // wxUSE_ICO_CUR
+
+#endif // wxUSE_IMAGE