Contributor: AVONTURE CHRISTOPHE

{
                  =======================================

                       ANI2ICO V1.0 (c) AVC Software
                                Cardware

                   ANI2ICO extract all pictures from an
                   ANI file (animated cursor).

                   This is a DOS based program and help
                   can be obtain when you launch the
                   program without argument.

                           AVONTURE Christophe
                      Boulevard Edmond Macthens 157
                               Boite 53
                           B-1080 Bruxelles
                               BELGIQUE

                  =======================================


   The purpose of this program is to extract all CURSOR in a Windows 95 (c)
   Animated Cursor file (ANI  extension) and save these  cursors for  later
   use in Delphi, or all other Windows program that accept Cursor.

   I have use an Hexadecimal viewer program to find the layout of the file:
   don't ask  me about  the  signification of some  block or why  there are
   always 8 bytes between each cursors; and so on.

   This program works on  almost file: there are a few  Ani file where this
   program should not work -only for the last cursor-.




               ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
               º                                        º°
               º          AVONTURE CHRISTOPHE           º°
               º              AVC SOFTWARE              º°
               º     BOULEVARD EDMOND MACHTENS 157/53   º°
               º           B-1080 BRUXELLES             º°
               º              BELGIQUE                  º°
               º                                        º°
               ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ°
               °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

}

Uses Crt;

TYPE
   TAniHeader = Record
      sRiff        : Array [1..4] of Char;
      wFileSize    : LongInt;
      sAconList    : Array [1..8] of Char;
      wTextSize    : LongInt;
      sInfoInam    : Array [1..8] of Char;
      wTitleLength : LongInt;
   End;

VAR
   fAni        : FILE;
   Header      : TAniHeader;
   sTitre      : String;
   sIART       : Array[1..4] of Char;
   wCopyLength : LongInt;
   sCopywrigth : String;
   sAnih       : Array[1..4] of Char;
   wSizeAnih   : LongInt;
   sRate       : Array[1..4] of Char;
   wSizeRate   : LongInt;
   sList       : Array[1..4] of Char;
   wSizeList   : LongInt;
   sFramIcon   : Array[1..8] of Char;
   wIconSize   : LongInt;
   sSeq        : Array[1..4] of Char;
   wSizeSeq    : LongInt;
   wHeaderSize : Word;

   pTemp       : Pointer;
   pBuf        : Pointer;
   pRate        : Pointer;
   pSeq        : Pointer;

   fIco        : File;
   pIco        : Pointer;
   wIco        : Word;
   sIcoName    : String;

   I           : Word;
   wTemp       : LongInt;

   sTemp       : String;

Procedure ClrScrWin (FirstCol, FirstLine, LastCol, LastLine : Byte);
Var I, J : byte;
    S    : String;
Begin
     J := (LastCol - FirstCol) + 1;

     FillChar(S[1], J, ' ');
     S[0] := Chr(J);

     For i:= FirstLine to LastLine Do
       Begin
          GotoXy (FirstCol, I);
          WriteLn (S);
       End;
End;

procedure Process;

begin

    GetMem (pTemp, 1000);
    GetMem (pBuf,  1000);
    GetMem (pRate, 1000);
    GetMem (pSeq,  1000);
    sSeq := '    ';

    Assign (fAni, ParamStr(1));
    filemode := 0;
    reset (fAni,1);

    BlockRead (fAni, Header,      SizeOf(Header));
    BlockRead (fAni, pTemp^,      Header.wTitleLength);

    FillChar (sTitre, 1, Header.wTitleLength);
    Move (pTemp^, sTitre[1], Header.wTitleLength);

    BlockRead (fAni, sIART,       SizeOf(sIart));
    IF sIart = chr(0)+'IAR' THEN
       BEGIN
         BlockRead (fAni, sIart, 1);
         sIart := 'IART';
       END;
	
    BlockRead (fAni, wCopyLength, SizeOf(wCopyLength));

    WITH Header DO
       wHeaderSize := SizeOf(sRiff) + SizeOf(wFileSize) + SizeOf(sAconList) +
                      SizeOf(wTextSize) + wTextSize;

    BlockRead (fAni, pTemp^,      wHeaderSize-FilePos(fAni));

    FillChar (sCopywrigth, 1, wCopyLength);
    Move (pTemp^, sCopywrigth[1], wCopyLength);

    BlockRead (fAni, sAnih,       SizeOf(sAnih));

    BlockRead (fAni, wSizeAnih,  SizeOf(wSizeAnih));


    BlockRead (fAni, pBuf^,       wSizeAnih);
    BlockRead (fAni, sRate,       SizeOf(sRate));

    IF (sRate = 'LIST') THEN
       BEGIN
          Move (sRate, sList, SizeOf(sList));
          sRate := '    ';
       END
    ELSE
       IF (sRate = 'seq ') THEN
          BEGIN
             Move (sRate, sSeq, SizeOf(sSeq));
             BlockRead (fAni, wSizeSeq,  SizeOf(wSizeSeq));
             BlockRead (fAni, pSeq^,     wSizeSeq);
             BlockRead (fAni, sList,     SizeOf(sList));
             sRate := '    ';
          END
       ELSE
          BEGIN
             BlockRead (fAni, wSizeRate, SizeOf(wSizeRate));

             BlockRead (fAni, pRate^,  wSizeRate);
             BlockRead (fAni, sList,       SizeOf(sList));
          END;

    IF NOT (sList = 'LIST') THEN
       BEGIN
          Move (sList, sSeq, SizeOf(sSeq));
          BlockRead (fAni, wSizeSeq,  SizeOf(wSizeSeq));
          BlockRead (fAni, pSeq^,     wSizeSeq);
          BlockRead (fAni, sList,     SizeOf(sList));
       END;

    BlockRead (fAni, wSizeList,   SizeOf(wSizeList));
    BlockRead (fAni, sFramIcon,   SizeOf(sFramIcon));
    BlockRead (fAni, wIconSize,   SizeOf(wIconSize));

    TextAttr := 14;

    WriteLn ('');
    WriteLn ('');
    WriteLn ('');
    WriteLn ('þ File : '+ParamStr(1));
    TextAttr := 11;
    WriteLn ('');
    WriteLn ('');
    WriteLn ('  Copywright message     : '+sCopywrigth);
    WriteLn ('');
    WriteLn ('');
    TextAttr := 10;

    GetMem (pIco, wIconSize);

    WHILE NOT (Eof(fAni)) DO
       BEGIN

          sIcoName := '';
          Str (wIco,sIcoName);

          IF wIco < 10 THEN
             sIcoName := 'ANI_000' + sIcoName + '.CUR'
          ELSE IF wIco < 100 THEN
             sIcoName := 'ANI_00' + sIcoName + '.CUR'
          ELSE IF wIco < 1000 THEN
             sIcoName := 'ANI_0' + sIcoName + '.CUR'
          ELSE
             sIcoName := 'ANI_' + sIcoName + '.CUR';

          Assign (fIco, sIcoName);
          Rewrite(fIco,1);

          BlockRead (fAni, pIco^, wIconSize);
          BlockWrite(fIco, pIco^, wIconSize);

          Close (fIco);

          IF NOT Eof(fAni) THEN
             BlockRead (fAni, pIco^, 8);

          Inc (wIco);

       END;

    Close (fAni);

    GotoXy (2, 15);
    sTemp := sIcoName;
    sIcoName := 'ANI_0000.CUR';
    WriteLn ('');
    WriteLn ('');
    WriteLn ('File saved : '+sIcoName+' to '+sTemp+'.');
    WriteLn ('');
    WriteLn ('');
    TextAttr := 7;

end;

Var
   Ch : Char;

begin

     ClrScr;
     TextAttr := 30;
     WriteLn('');
     WriteLn('ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿');
     WriteLn('³ Ani2Ico : Extraction utility from Christophe AVONTURE                ³');
     WriteLn('ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ');
     WriteLn('');
     WriteLn('');
     TextAttr := 7;

     If Not (ParamCount = 1) then Begin
        TextAttr := 14;
        WriteLn('þ PURPOSE');
        TextAttr := 11;
        WriteLn('');
        WriteLn('  Ani2Ico program  will allowed you to  extract all cursors pictures  from');
        WriteLn('  an animated Windows 95 (c) cursor file.');
        WriteLn('');
        WriteLn('  This program will scan the enterly file and, each time  he encounters an');
        WriteLn('  picture, he will saved it into the current directory.');
        WriteLn('');
        WriteLn('');
        Ch := ReadKey; If Ch = #0 then Ch := ReadKey;
        ClrScrWin (1,6,79,24);
        GotoXy (1,6);
        TextAttr := 14;
        WriteLn('þ UTILISATION');
        TextAttr := 11;
        WriteLn('');
        WriteLn('');
        WriteLn('  Very easy!');
        WriteLn('');
        WriteLn('');
        WriteLn('  Just type  the file name  of your  animated  cursor file  (with path  if');
        WriteLn('  needed) as the first parameter.');
        WriteLn('');
        WriteLn('  For example, you can type "Ani2Ico.Exe Eyes.Ani".');
        WriteLn('');
        WriteLn('  You will receive several file name ANI_9999.ICO  or ANI_9999.CUR depends');
        WriteLn('  on the size in bytes of the picture. 9999 is a numerical value from 0001');
        WriteLn('  to the number of images in the animated cursor.');
        WriteLn('');
        Ch := ReadKey; If Ch = #0 then Ch := ReadKey;
        ClrScrWin (1,6,79,24);
        GotoXy (1,6);
        TextAttr := 14;
        WriteLn('þ IN THE FUTURE');
        TextAttr := 11;
        WriteLn('');
        WriteLn('  Actually, I''m developping a Delphi component for  Delphi 1.0  and Delphi');
        WriteLn('  2.0 component.  This component will allowed you to  increase the  design');
        WriteLn('  of your applications by some animations.');
        WriteLn('');
        WriteLn('  This component is in developpement -I''ve just started-!');
        WriteLn('');
        WriteLn('  I think that I will distribute it as Shareware.  Wait and see...');
        WriteLn('');
        WriteLn('');
        WriteLn('  People interested by this component should send me an email  and type in');
        WriteLn('  the mail subject "Component TAVCAnimated wanted".');
        WriteLn('');
        WriteLn('');
        GotoXy (0,6);
        Ch := ReadKey; If Ch = #0 then Ch := ReadKey;
        ClrScrWin (1,6,79,23);
        GotoXy (1,6);
        TextAttr := 14;
        WriteLn('þ REGISTRATION');
        TextAttr := 11;
        WriteLn('');
        WriteLn('  This program is free. ');
        WriteLn('');
        WriteLn('  No need to send me a lot of  US Dollar but you can if you want  (Hum, is');
        WriteLn('  there somebody here?).');
        WriteLn('');
        WriteLn('  My only requirement is: IF YOU USE  THIS PROGRAM AND  IF THIS PROGRAM IS');
        WriteLn('  USEFULL, PLEASE  SEND ME A POSTCARD (MY PREFERENCE) FROM  WHERE YOU LIVE');
        WriteLn('  OR AN ELECTRONIC E-MAIL THROUGH INTERNET.  I WILL REALLY APPRECIATE.');
        WriteLn('');
        TextAttr := 10;
        WriteLn('   AVONTURE Christophe');
        WriteLn('   AVC Software');
        WriteLn('   boulevard Edmond Machtens, 175 - Bte 53');
        WriteLn('   B-1080 Bruxelles');
        WriteLn('   BELGIQUE');
        WriteLn('');
        Ch := ReadKey; If Ch = #0 then Ch := ReadKey;

     End
   ELSE
      Process;

end.