home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 487.lha / FileID_v1.30 / IFF.c < prev    next >
C/C++ Source or Header  |  1991-03-11  |  27KB  |  1,104 lines

  1. /**************************************************
  2.  *
  3.  * IFF.c
  4.  *
  5.  *   IFF file manipulation code
  6.  *
  7.  *    Copyright(c), 1990, 1991 Lloyd B. Eldred
  8.  *                           & Fredrick R Homan
  9.  **************************************************/
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include <string.h>
  13. #include "fi_IFF.h"
  14.  
  15. extern UBYTE VERBOSE, TERSE,COMMENT;  /* Yuck, global variables... */
  16. UBYTE ANIM_FLAG=FALSE;
  17.  
  18. /*****************************************************************/
  19. /*    IFF Groups                                                 */
  20. /*****************************************************************/
  21.  
  22. void IFF_FORM(picfile,size)
  23. FILE *picfile;
  24. LONG size;
  25. {
  26.    union chunk_ID{
  27.        char text_ID[4];
  28.        LONG long_ID;} chunk;
  29.        
  30.    LONG sizem4;
  31.       
  32.    if(VERBOSE) printf("  Group FORM (data chunk)\n");
  33.    
  34.    sizem4 = size - 4;
  35.    
  36.    IFF_ID(picfile,chunk.text_ID);
  37.    
  38.    switch (chunk.long_ID){
  39.       case ID_ILBM :
  40.             IFF_ILBM(picfile,sizem4);
  41.             break;
  42.       case ID_ANIM :
  43.             IFF_ANIM(picfile,sizem4);
  44.             break;
  45.       case ID_SMUS :
  46.             IFF_SMUS(picfile,sizem4);
  47.             break;
  48.       case ID_8SVX :
  49.             IFF_8SVX(picfile,sizem4);
  50.             break;
  51.       case ID_ANBM :
  52.             IFF_ANBM(picfile,sizem4);
  53.             break;
  54.       case ID_ACBM :
  55.             IFF_ACBM(picfile,sizem4);
  56.             break;
  57.       case ID_FTXT :
  58.             IFF_FTXT(picfile,sizem4);
  59.             break;
  60.       case ID_AIFF :
  61.             IFF_AIFF(picfile,sizem4);
  62.             break;
  63.       case ID_BANK :
  64.             IFF_BANK(picfile,sizem4);
  65.             break;
  66.       case ID_HEAD :
  67.             IFF_HEAD(picfile,sizem4);
  68.             break;
  69.       case ID_MIDI :
  70.             IFF_MIDI(picfile,sizem4);
  71.             break;
  72.       case ID_PGTB : 
  73.             IFF_PGTB(picfile,sizem4);
  74.             break;
  75.       case ID_SYTH :
  76.             IFF_SYTH(picfile,sizem4);
  77.             break;
  78.       case ID_WORD :
  79.             IFF_WORD(picfile,sizem4);
  80.             break;
  81.       case ID_C100 :
  82.             IFF_C100(picfile,sizem4);
  83.             break;
  84.       case ID_PDEF :
  85.             IFF_PDEF(picfile,sizem4);
  86.             break;
  87. /*
  88.       case ID_RGB4 :
  89.             IFF_RGB4(picfile,sizem4);
  90.             break;
  91. */
  92.       case ID_SHAK :
  93.             IFF_SHAK(picfile,sizem4);
  94.             break;
  95.       case ID_VDEO :
  96.             IFF_VDEO(picfile,sizem4);
  97.             break;
  98.       case ID_SAMP :
  99.             IFF_SAMP(picfile,sizem4);
  100.             break;
  101.       case ID_TDDD :
  102.             IFF_TDDD(picfile,sizem4);
  103.             break;
  104.       case ID_SC3D :
  105.             IFF_SC3D(picfile,sizem4);
  106.             break;
  107.       case ID_TEXT :
  108.             IFF_TEXT(picfile,sizem4);
  109.             break;
  110.       case ID_FNTR :
  111.             IFF_FNTR(picfile,sizem4);
  112.             break;
  113.       case ID_FNTV :
  114.             IFF_FNTV(picfile,sizem4);
  115.             break;
  116.       case ID_GSCR :
  117.             IFF_GSCR(picfile,sizem4);
  118.             break;
  119.       case ID_PLBM :
  120.             IFF_PLBM(picfile,sizem4);
  121.             break;
  122.       case ID_USCR :
  123.             IFF_USCR(picfile,sizem4);
  124.             break;
  125.       case ID_UVOX :
  126.             IFF_UVOX(picfile,sizem4);
  127.             break;
  128.       case ID_ARC :
  129.             IFF_ARC(picfile,sizem4);
  130.             break;
  131.       default:
  132.             if(VERBOSE) printf("  Type: %4s\n",chunk.text_ID);
  133.             if(TERSE) printf(" %4s\n",chunk.text_ID);
  134.             IFF_GotoEnd(picfile,sizem4);
  135.  
  136.       } /* end of switch */
  137.  
  138.    if(VERBOSE) printf("  At end of current FORM.\n");      
  139. }
  140.  
  141. void IFF_PROP(picfile,size)
  142. FILE *picfile;
  143. LONG size;
  144. {
  145.    union chunk_ID{
  146.        char text_ID[4];
  147.        LONG long_ID;} chunk;
  148.    LONG sizem4;
  149.       
  150.    if(VERBOSE) printf("  Group PROP (property setting chunk)\n");
  151.  
  152.    sizem4 = size - 4;
  153.    
  154.    IFF_ID(picfile,chunk.text_ID);
  155.  
  156.    switch (chunk.long_ID){
  157.       case ID_ILBM :
  158.             IFF_ILBM(picfile,sizem4);
  159.             break;
  160.       case ID_ANIM :
  161.             IFF_ANIM(picfile,sizem4);
  162.             break;
  163.       case ID_SMUS :
  164.             IFF_SMUS(picfile,sizem4);
  165.             break;
  166.       case ID_8SVX :
  167.             IFF_8SVX(picfile,sizem4);
  168.             break;
  169.       case ID_ANBM :
  170.             IFF_ANBM(picfile,sizem4);
  171.             break;
  172.       case ID_ACBM :
  173.             IFF_ACBM(picfile,sizem4);
  174.             break;
  175.       case ID_FTXT :
  176.             IFF_FTXT(picfile,sizem4);
  177.             break;
  178.       case ID_AIFF :
  179.             IFF_AIFF(picfile,sizem4);
  180.             break;
  181.       case ID_BANK :
  182.             IFF_BANK(picfile,sizem4);
  183.             break;
  184.       case ID_HEAD :
  185.             IFF_HEAD(picfile,sizem4);
  186.             break;
  187.       case ID_MIDI :
  188.             IFF_MIDI(picfile,sizem4);
  189.             break;
  190.       case ID_PGTB : 
  191.             IFF_PGTB(picfile,sizem4);
  192.             break;
  193.       case ID_SYTH :
  194.             IFF_SYTH(picfile,sizem4);
  195.             break;
  196.       case ID_WORD :
  197.             IFF_WORD(picfile,sizem4);
  198.             break;
  199.       case ID_C100 :
  200.             IFF_C100(picfile,sizem4);
  201.             break;
  202.       case ID_PDEF :
  203.             IFF_PDEF(picfile,sizem4);
  204.             break;
  205. /*
  206.       case ID_RGB4 :
  207.             IFF_RGB4(picfile,sizem4);
  208.             break;
  209. */
  210.       case ID_SHAK :
  211.             IFF_SHAK(picfile,sizem4);
  212.             break;
  213.       case ID_VDEO :
  214.             IFF_VDEO(picfile,sizem4);
  215.             break;
  216.       case ID_SAMP :
  217.             IFF_SAMP(picfile,sizem4);
  218.             break;
  219.       case ID_TDDD :
  220.             IFF_TDDD(picfile,sizem4);
  221.             break;
  222.       case ID_SC3D :
  223.             IFF_SC3D(picfile,sizem4);
  224.             break;
  225.       case ID_TEXT :
  226.             IFF_TEXT(picfile,sizem4);
  227.             break;
  228.       case ID_FNTR :
  229.             IFF_FNTR(picfile,sizem4);
  230.             break;
  231.       case ID_FNTV :
  232.             IFF_FNTV(picfile,sizem4);
  233.             break;
  234.       case ID_GSCR :
  235.             IFF_GSCR(picfile,sizem4);
  236.             break;
  237.       case ID_PLBM :
  238.             IFF_PLBM(picfile,sizem4);
  239.             break;
  240.       case ID_USCR :
  241.             IFF_USCR(picfile,sizem4);
  242.             break;
  243.       case ID_UVOX :
  244.             IFF_UVOX(picfile,sizem4);
  245.             break;
  246.       case ID_ARC :
  247.             IFF_ARC(picfile,sizem4);
  248.             break;
  249.       case ID_FORM :
  250.             IFF_FORM(picfile,sizem4);
  251.             break;
  252.       case ID_LIST :
  253.             IFF_LIST(picfile,sizem4);
  254.             break;
  255.       case ID_CAT :
  256.             IFF_CAT(picfile,sizem4);
  257.             break;
  258.       case ID_PROP :
  259.             IFF_PROP(picfile,sizem4);
  260.             break;
  261.  
  262.       default:
  263.             if(VERBOSE) printf("  Type: %4s\n",chunk.text_ID);
  264.             IFF_GotoEnd(picfile,sizem4);
  265.  
  266.       } /* end of switch */
  267.       
  268.    if(VERBOSE) printf("  End of PROP\n");
  269. }
  270.  
  271. void IFF_LIST(picfile,size)
  272. FILE *picfile;
  273. LONG size;
  274. {
  275.    union chunk_ID{
  276.        char text_ID[4];
  277.        LONG long_ID;} chunk;
  278.  
  279.    LONG sizem4;
  280.       
  281.    if(VERBOSE) printf("  Group LIST (group of related data objects)\n");
  282.  
  283.    sizem4 = size - 4;
  284.    
  285.    IFF_ID(picfile,chunk.text_ID);
  286.  
  287.    switch (chunk.long_ID){
  288.       case ID_ILBM :
  289.             IFF_ILBM(picfile,sizem4);
  290.             break;
  291.       case ID_ANIM :
  292.             IFF_ANIM(picfile,sizem4);
  293.             break;
  294.       case ID_SMUS :
  295.             IFF_SMUS(picfile,sizem4);
  296.             break;
  297.       case ID_8SVX :
  298.             IFF_8SVX(picfile,sizem4);
  299.             break;
  300.       case ID_ANBM :
  301.             IFF_ANBM(picfile,sizem4);
  302.             break;
  303.       case ID_ACBM :
  304.             IFF_ACBM(picfile,sizem4);
  305.             break;
  306.       case ID_FTXT :
  307.             IFF_FTXT(picfile,sizem4);
  308.             break;
  309.       case ID_AIFF :
  310.             IFF_AIFF(picfile,sizem4);
  311.             break;
  312.       case ID_BANK :
  313.             IFF_BANK(picfile,sizem4);
  314.             break;
  315.       case ID_HEAD :
  316.             IFF_HEAD(picfile,sizem4);
  317.             break;
  318.       case ID_MIDI :
  319.             IFF_MIDI(picfile,sizem4);
  320.             break;
  321.       case ID_PGTB : 
  322.             IFF_PGTB(picfile,sizem4);
  323.             break;
  324.       case ID_SYTH :
  325.             IFF_SYTH(picfile,sizem4);
  326.             break;
  327.       case ID_WORD :
  328.             IFF_WORD(picfile,sizem4);
  329.             break;
  330.       case ID_C100 :
  331.             IFF_C100(picfile,sizem4);
  332.             break;
  333.       case ID_PDEF :
  334.             IFF_PDEF(picfile,sizem4);
  335.             break;
  336. /*
  337.       case ID_RGB4 :
  338.             IFF_RGB4(picfile,sizem4);
  339.             break;
  340. */
  341.       case ID_SHAK :
  342.             IFF_SHAK(picfile,sizem4);
  343.             break;
  344.       case ID_VDEO :
  345.             IFF_VDEO(picfile,sizem4);
  346.             break;
  347.       case ID_SAMP :
  348.             IFF_SAMP(picfile,sizem4);
  349.             break;
  350.       case ID_TDDD :
  351.             IFF_TDDD(picfile,sizem4);
  352.             break;
  353.       case ID_SC3D :
  354.             IFF_SC3D(picfile,sizem4);
  355.             break;
  356.       case ID_TEXT :
  357.             IFF_TEXT(picfile,sizem4);
  358.             break;
  359.       case ID_FNTR :
  360.             IFF_FNTR(picfile,sizem4);
  361.             break;
  362.       case ID_FNTV :
  363.             IFF_FNTV(picfile,sizem4);
  364.             break;
  365.       case ID_GSCR :
  366.             IFF_GSCR(picfile,sizem4);
  367.             break;
  368.       case ID_PLBM :
  369.             IFF_PLBM(picfile,sizem4);
  370.             break;
  371.       case ID_USCR :
  372.             IFF_USCR(picfile,sizem4);
  373.             break;
  374.       case ID_UVOX :
  375.             IFF_UVOX(picfile,sizem4);
  376.             break;
  377.       case ID_ARC :
  378.             IFF_ARC(picfile,sizem4);
  379.             break;
  380.       case ID_FORM :
  381.             IFF_FORM(picfile,sizem4);
  382.             break;
  383.       case ID_LIST :
  384.             IFF_LIST(picfile,sizem4);
  385.             break;
  386.       case ID_CAT :
  387.             IFF_CAT(picfile,sizem4);
  388.             break;
  389.       case ID_PROP :
  390.             IFF_PROP(picfile,sizem4);
  391.             break;
  392.       default:
  393.             if(VERBOSE) printf("  Type: %4s\n",chunk.text_ID);
  394.             IFF_GotoEnd(picfile,sizem4);
  395.  
  396.       } /* end of switch */
  397.  
  398.    if(VERBOSE) printf("  End of LIST\n");
  399.    
  400. }
  401.  
  402. void IFF_CAT(picfile,size)
  403. FILE *picfile;
  404. LONG size;
  405. {
  406.    union chunk_ID{
  407.        char text_ID[4];
  408.        LONG long_ID;} chunk;
  409.  
  410.    LONG sizem4;
  411.       
  412.    if(VERBOSE) printf("  Group CAT (untyped group of data objects)\n");
  413.  
  414.    sizem4 = size - 4;
  415.    
  416.    IFF_ID(picfile,chunk.text_ID);
  417.  
  418.    switch (chunk.long_ID){
  419.       case ID_ILBM :
  420.             IFF_ILBM(picfile,sizem4);
  421.             break;
  422.       case ID_ANIM :
  423.             IFF_ANIM(picfile,sizem4);
  424.             break;
  425.       case ID_SMUS :
  426.             IFF_SMUS(picfile,sizem4);
  427.             break;
  428.       case ID_8SVX :
  429.             IFF_8SVX(picfile,sizem4);
  430.             break;
  431.       case ID_ANBM :
  432.             IFF_ANBM(picfile,sizem4);
  433.             break;
  434.       case ID_ACBM :
  435.             IFF_ACBM(picfile,sizem4);
  436.             break;
  437.       case ID_FTXT :
  438.             IFF_FTXT(picfile,sizem4);
  439.             break;
  440.       case ID_AIFF :
  441.             IFF_AIFF(picfile,sizem4);
  442.             break;
  443.       case ID_BANK :
  444.             IFF_BANK(picfile,sizem4);
  445.             break;
  446.       case ID_HEAD :
  447.             IFF_HEAD(picfile,sizem4);
  448.             break;
  449.       case ID_MIDI :
  450.             IFF_MIDI(picfile,sizem4);
  451.             break;
  452.       case ID_PGTB : 
  453.             IFF_PGTB(picfile,sizem4);
  454.             break;
  455.       case ID_SYTH :
  456.             IFF_SYTH(picfile,sizem4);
  457.             break;
  458.       case ID_WORD :
  459.             IFF_WORD(picfile,sizem4);
  460.             break;
  461.       case ID_C100 :
  462.             IFF_C100(picfile,sizem4);
  463.             break;
  464.       case ID_PDEF :
  465.             IFF_PDEF(picfile,sizem4);
  466.             break;
  467. /*
  468.       case ID_RGB4 :
  469.             IFF_RGB4(picfile,sizem4);
  470.             break;
  471. */
  472.       case ID_SHAK :
  473.             IFF_SHAK(picfile,sizem4);
  474.             break;
  475.       case ID_VDEO :
  476.             IFF_VDEO(picfile,sizem4);
  477.             break;
  478.       case ID_SAMP :
  479.             IFF_SAMP(picfile,sizem4);
  480.             break;
  481.       case ID_TDDD :
  482.             IFF_TDDD(picfile,sizem4);
  483.             break;
  484.       case ID_SC3D :
  485.             IFF_SC3D(picfile,sizem4);
  486.             break;
  487.       case ID_TEXT :
  488.             IFF_TEXT(picfile,sizem4);
  489.             break;
  490.       case ID_FNTR :
  491.             IFF_FNTR(picfile,sizem4);
  492.             break;
  493.       case ID_FNTV :
  494.             IFF_FNTV(picfile,sizem4);
  495.             break;
  496.       case ID_GSCR :
  497.             IFF_GSCR(picfile,sizem4);
  498.             break;
  499.       case ID_PLBM :
  500.             IFF_PLBM(picfile,sizem4);
  501.             break;
  502.       case ID_USCR :
  503.             IFF_USCR(picfile,sizem4);
  504.             break;
  505.       case ID_UVOX :
  506.             IFF_UVOX(picfile,sizem4);
  507.             break;
  508.       case ID_ARC :
  509.             IFF_ARC(picfile,sizem4);
  510.             break;
  511.       case ID_FORM :
  512.             IFF_FORM(picfile,sizem4);
  513.             break;
  514.       case ID_LIST :
  515.             IFF_LIST(picfile,sizem4);
  516.             break;
  517.       case ID_CAT :
  518.             IFF_CAT(picfile,sizem4);
  519.             break;
  520.       case ID_PROP :
  521.             IFF_PROP(picfile,sizem4);
  522.             break;
  523.       default:
  524.             if(VERBOSE) printf("  Type: %4s\n",chunk.text_ID);
  525.             IFF_GotoEnd(picfile,sizem4);
  526.  
  527.       } /* end of switch */
  528.    
  529.    if(VERBOSE)printf("  End of CAT.\n");
  530. }
  531.  
  532. /***************************************************************/ 
  533. /* FORM type handling   (see ILBM.c, SMUS.c, etc for others    */
  534. /***************************************************************/
  535.  
  536. void IFF_ANIM(picfile,size)
  537. FILE *picfile;
  538. LONG size;
  539.  
  540. {
  541.    union chunk_ID{
  542.        char text_ID[4];
  543.        LONG long_ID;} chunk;
  544.    LONG ch_size,offset;
  545.         
  546.     if(!TERSE)printf("    ANIM (Cel Animation)\n");
  547.    if(TERSE)printf("ANIM");
  548.    offset=0;
  549.    ANIM_FLAG = TRUE;
  550.    
  551.    while(offset <= size-8){
  552.       IFF_ID(picfile,chunk.text_ID);
  553.       ch_size = IFF_size(picfile);
  554.       offset += (8+ch_size+is_odd(ch_size));
  555.             
  556.       switch(chunk.long_ID){
  557.          case ID_ANHD :
  558.             IFF_ANHD(picfile,ch_size);
  559.             break;
  560.          case ID_DLTA :
  561.             IFF_DLTA(picfile,ch_size);
  562.             break;
  563.          case ID_FORM :
  564.             IFF_FORM(picfile,ch_size);
  565.             break;
  566.          case ID_ILBM :
  567.             IFF_ILBM(picfile,ch_size);
  568.             break;
  569.          default:
  570.             if(VERBOSE) printf(
  571.                "   Inappropriate sub chunk for ANIM: %4s\n",chunk.text_ID);
  572.             IFF_GotoEnd(picfile,ch_size);
  573.       } /* end of switch */
  574.       
  575.    } /* end of while */
  576.  
  577.    IFF_GotoEnd(picfile,size-offset);
  578.          
  579.    if(VERBOSE) printf("    End of ANIM.\n");
  580.    
  581. } /* End of IFF_Anim */
  582.  
  583. void IFF_ANBM(picfile,size)
  584. FILE *picfile;
  585. LONG size;
  586.  
  587. {
  588.    union chunk_ID{
  589.        char text_ID[4];
  590.        LONG long_ID;} chunk;
  591.    LONG ch_size,offset;
  592.         
  593.    printf("    ANBM (Animated bitmap -- Deluxe Video)\n");
  594.    offset=0;
  595.    
  596.    while(offset <= size-8){
  597.       IFF_ID(picfile,chunk.text_ID);
  598.       ch_size = IFF_size(picfile);
  599.       offset += (8+ch_size+is_odd(ch_size));
  600.             
  601.       switch(chunk.long_ID){
  602.          case ID_FSQN :
  603.             IFF_FSQN(picfile,ch_size);
  604.             break;
  605.          case ID_LIST :
  606.             IFF_LIST(picfile,ch_size);
  607.             break;
  608.          case ID_PROP :
  609.             IFF_PROP(picfile,ch_size);
  610.             break;
  611.          case ID_FORM :
  612.             IFF_FORM(picfile,ch_size);
  613.             break;
  614.          case ID_BODY :
  615.             IFF_BODY(picfile,ch_size);
  616.             break;
  617.          default:
  618.             if(VERBOSE) printf(
  619.                "   Inappropriate sub chunk for ANBM: %4s\n",chunk.text_ID);
  620.             IFF_GotoEnd(picfile,ch_size);
  621.       } /* end of switch */
  622.       
  623.    } /* end of while */
  624.    IFF_GotoEnd(picfile,size-offset);
  625.    
  626.    if(VERBOSE) printf("    End of ANBM.\n");
  627.    
  628. } /* end of IFF_ANBM */
  629.  
  630. void IFF_ACBM(picfile,size)
  631. FILE *picfile;
  632. LONG size;
  633.  
  634. {
  635.    union chunk_ID{
  636.        char text_ID[4];
  637.        LONG long_ID;} chunk;
  638.  
  639.    LONG ch_size,offset,vpmodes;
  640.    BitMapHeader *BMHD;
  641.         
  642.    printf("    ACBM (Amiga Continuous Bit Map)\n");
  643.    
  644.    offset=0;
  645.    
  646.    while(offset <= (size-8)){
  647.       IFF_ID(picfile,chunk.text_ID);
  648.       ch_size = IFF_size(picfile);
  649.       offset += (8+ch_size+is_odd(ch_size));
  650.                     
  651.       switch(chunk.long_ID){
  652.          case ID_BMHD :
  653.             BMHD = malloc(sizeof(BitMapHeader));
  654.             if(BMHD == NULL){
  655.                printf(" Can't allocate memory for BMHD structure.\n");
  656.                fi_exit();
  657.             }
  658.             IFF_BMHD(picfile,ch_size,BMHD);
  659.             if(VERBOSE) 
  660.                printf("      BMHD (Bit Map HeaDer chunk)\n");
  661.                printf("        Width        : %d\n"
  662.                        "        Height       : %d\n"
  663.                        "        # bit planes : %d\n",
  664.                        BMHD->w,BMHD->h,BMHD->nPlanes);
  665.             free(BMHD);
  666.             break;
  667.             
  668.          case ID_CMAP :
  669.             IFF_CMAP(picfile,ch_size);
  670.             break;
  671.          case ID_ABIT :
  672.             IFF_ABIT(picfile,ch_size);
  673.             break;
  674.          case ID_ANHD :
  675.             IFF_ANHD(picfile,ch_size);
  676.             break;
  677.          case ID_GRAB :
  678.             IFF_GRAB(picfile,ch_size);
  679.             break;
  680.          case ID_DEST :
  681.             IFF_DEST(picfile,ch_size);
  682.             break;
  683.          case ID_SPRT :
  684.             IFF_SPRT(picfile,ch_size);
  685.             break;
  686.          case ID_CAMG :
  687.             vpmodes=IFF_CAMG(picfile,ch_size);
  688.             if(VERBOSE) printf("      CAMG (Amiga Display Mode) chunk.\n");
  689.             break;
  690.          case ID_CRNG :
  691.             IFF_CRNG(picfile,ch_size);
  692.             break;
  693.          case ID_CCRT :
  694.             IFF_CCRT(picfile,ch_size);
  695.             break;
  696.          case ID_NAME :
  697.             IFF_NAME(picfile,ch_size);
  698.             break;
  699.          case ID_copyright :
  700.             IFF_copyright(picfile,ch_size);
  701.             break;
  702.          case ID_AUTH :  
  703.             IFF_AUTH(picfile,ch_size);
  704.             break;
  705.          case ID_ANNO :
  706.             IFF_ANNO(picfile,ch_size);
  707.             break;
  708.          case ID_CHRS :
  709.             IFF_CHRS(picfile,ch_size);
  710.             break;
  711.          case ID_TEXT :
  712.             IFF_TEXT(picfile,ch_size);
  713.             break;
  714.          case ID_DPPV :
  715.             IFF_DPPV(picfile,ch_size);
  716.             break;
  717.          case ID_DGVW :
  718.             IFF_DGVW(picfile,ch_size);
  719.             break;
  720.          case ID_BHSM :
  721.             IFF_BHSM(picfile,ch_size);
  722.             break;
  723.          case ID_BHCP :
  724.             IFF_BHCP(picfile,ch_size);
  725.             break;
  726.          case ID_BHBA :
  727.             IFF_BHBA(picfile,ch_size);
  728.             break;
  729.          default:
  730.             if(VERBOSE) printf(
  731.                "     Inappropriate sub chunk for ACBM: %4s\n",chunk.text_ID);
  732.             IFF_GotoEnd(picfile,ch_size);
  733.       } /* end of switch */
  734.       
  735.    } /* end of while */
  736.  
  737.    IFF_GotoEnd(picfile,size-offset);
  738.    if(VERBOSE) printf("    End of ACBM chunk\n");
  739.       
  740. }/* end of IFF_ACBM */
  741.  
  742. /*************************************************************/ 
  743. /* Chunks that can appear anywhere                           */
  744. /*************************************************************/
  745.  
  746. void IFF_NAME(picfile,size)
  747. FILE *picfile;
  748. LONG size;
  749.  
  750. {
  751.    char c;
  752.    int i;
  753.    
  754.    if(VERBOSE || COMMENT) printf("      NAME chunk. (text follows)\n\n");
  755.    
  756.    for(i=0;i<size;i++){
  757.       fi_getc(picfile,&c);
  758.       if(VERBOSE || COMMENT) printf("%c",c);
  759.    }
  760.    if(VERBOSE || COMMENT) printf("\n\n");
  761.    
  762.    if(is_odd(size)) fi_getc(picfile,&c);
  763.    
  764. } /* end of IFF_NAME */
  765.  
  766. void IFF_copyright(picfile,size)
  767. FILE *picfile;
  768. LONG size;
  769.  
  770. {
  771.    char c;
  772.    int i;
  773.    
  774.    if(VERBOSE || COMMENT) printf(
  775.    "      Copyright chunk. (text follows)\n\n(c)");
  776.    
  777.    for(i=0;i<size;i++){
  778.       fi_getc(picfile,&c);
  779.       if(VERBOSE || COMMENT) printf("%c",c);
  780.    }
  781.    if(VERBOSE || COMMENT) printf("\n\n");
  782.    
  783.    if(is_odd(size)) fi_getc(picfile,&c);
  784.   
  785. } /* end of IFF_copyright */
  786.  
  787. void IFF_AUTH(picfile,size)
  788. FILE *picfile;
  789. LONG size;
  790.  
  791. {
  792.    char c;
  793.    int i;
  794.    
  795.    if(VERBOSE || COMMENT) printf
  796.       ("      AUTH (Author) chunk. (text follows)\n\n");
  797.    
  798.    for(i=0;i<size;i++){
  799.       fi_getc(picfile,&c);
  800.       if(VERBOSE || COMMENT)printf("%c",c);
  801.    }
  802.    if(VERBOSE || COMMENT ) printf("\n\n");
  803.    
  804.    if(is_odd(size)) fi_getc(picfile,&c);
  805.    
  806. } /* end of IFF_AUTH */
  807.  
  808. void IFF_ANNO(picfile,size)
  809. FILE *picfile;
  810. LONG size;
  811. {
  812.    char c;
  813.    int i;
  814.    
  815.    if(VERBOSE || COMMENT) 
  816.       printf("      ANNO (Annotation) chunk.(text follows)\n\n");
  817.    
  818.    for(i=0;i<size;i++){
  819.       fi_getc(picfile,&c);
  820.       if(VERBOSE || COMMENT)printf("%c",c);
  821.    }
  822.    if(VERBOSE || COMMENT) printf("\n\n");
  823.    
  824.    if(is_odd(size)) fi_getc(picfile,&c);
  825.    
  826. } /* end of IFF_ANNO */
  827.  
  828. /************************************************************/
  829. /* Useful chunks for non-picture files (headers in general) */
  830. /************************************************************/
  831.  
  832. void IFF_ANHD(picfile,size)  /* deal with ANimation HeaDer chunk */
  833. FILE *picfile;
  834. LONG size;
  835.  
  836. {
  837.    char c1,c2,c3,c4;
  838.    ULONG abstime,reltime,bits;
  839.    UBYTE operation,interleave;
  840.    UWORD w,h;
  841.    WORD x,y;
  842.    int XORprint;   /* logical: true if XOR mode and VERBOSE are true */
  843.    int BITprint;   /* logical:         mode 4 or 5 and VERBOSE */
  844.      
  845.     fi_getc(picfile,&c1);   /* UBYTE operation */
  846.    operation = c1;
  847.    
  848.    if(VERBOSE) printf("      ANHD (Animation Header) chunk.\n");
  849.    if(VERBOSE){
  850.             printf("       Compression Mode      :");
  851.             if(operation == 0) printf(" None\n");
  852.             if(operation == 1) printf(" XOR ILBM mode\n");
  853.             if(operation == 2) printf(" Long Delta mode\n");
  854.             if(operation == 3) printf(" Short Delta mode\n");
  855.             if(operation == 4) printf(
  856.                 " Gen. short/long Delta mode\n");
  857.             if(operation == 5) printf(
  858.                 " Byte Vertical Delta mode\n");
  859.             if(operation == 'J') printf(
  860.                 " Eric Graham's technique\n");
  861.             }
  862.    
  863.    XORprint = VERBOSE && (operation == 1);
  864.    BITprint = VERBOSE && (operation == 4 || operation == 5);
  865.    
  866.    fi_getc(picfile,&c2);   /* UBYTE mask */
  867.    
  868.    if(XORprint)
  869.          printf("       Plane mask: %d",c2);
  870.          
  871.    fi_getc(picfile,&c1);
  872.    fi_getc(picfile,&c2);
  873.    
  874.    w = c1 * 256 + c2;
  875.    
  876.    fi_getc(picfile,&c1);
  877.    fi_getc(picfile,&c2);
  878.    
  879.    h = c1 * 256 + c2;
  880.    
  881.    if(XORprint)
  882.       printf("       BODY part to be changed has: width %d and height %d.\n",
  883.                w,h);             
  884.    
  885.    fi_getc(picfile,&c1);
  886.    fi_getc(picfile,&c2);
  887.    
  888.    x = c1 * 256 + c2;
  889.    
  890.    fi_getc(picfile,&c1);
  891.    fi_getc(picfile,&c2);
  892.    
  893.    y = c1 * 256 + c2;
  894.    
  895.    if(XORprint)
  896.       printf("       BODY part to be changed has position:"
  897.              " x = %d and y = %d.\n",x,y);
  898.                 
  899.     fi_getc(picfile,&c1);
  900.    fi_getc(picfile,&c2);
  901.    fi_getc(picfile,&c3);
  902.    fi_getc(picfile,&c4);
  903.    
  904.    abstime = (unsigned long)makelong(c1,c2,c3,c4);
  905.     
  906.    if(VERBOSE && abstime)
  907.       printf("       Absolute Frame timing (jiffies): %d"
  908.                     ,abstime);
  909.      
  910.     fi_getc(picfile,&c1);
  911.    fi_getc(picfile,&c2);
  912.    fi_getc(picfile,&c3);
  913.    fi_getc(picfile,&c4);
  914.    
  915.    reltime = (unsigned long)makelong(c1,c2,c3,c4);
  916.     
  917.    if(VERBOSE && reltime)
  918.       printf("       Relative Frame timing (jiffies): %d"
  919.                     ,reltime);
  920.     
  921.    if(VERBOSE && (reltime || abstime)) 
  922.       printf("          (1 jiffy=1/60 sec)\n");
  923.    
  924.    fi_getc(picfile,&c1);
  925.    
  926.    interleave = c1;
  927.    
  928.    if(VERBOSE && interleave)
  929.       printf("       Interleave code : %d.\n",interleave);
  930.       
  931.    fi_getc(picfile,&c1);   /* pad0 byte */
  932.    
  933.    fi_getc(picfile,&c1);
  934.    fi_getc(picfile,&c2);
  935.    fi_getc(picfile,&c3);
  936.    fi_getc(picfile,&c4);
  937.    
  938.    if(BITprint){
  939.       bits = (ULONG)makelong(c1,c2,c3,c4);
  940.       printf("       Bit flag options:\n");
  941.       
  942.       printf("         Bit 0 :");
  943.       if(bits & 0x1)
  944.          printf(" one , long data\n");
  945.       else
  946.          printf(" zero, short data\n");
  947.          
  948.       printf("         Bit 1 :");
  949.       if(bits & 0x2)
  950.          printf(" one , XOR\n");
  951.       else
  952.          printf(" zero, set\n");
  953.       
  954.       printf("         Bit 2 :");
  955.       if(bits & 0x4)
  956.          printf(" one , one info list for all planes.\n");
  957.       else
  958.          printf(" zero, separate info for each plane.\n");
  959.  
  960.       printf("         Bit 3 :");
  961.       if(bits & 0x8)
  962.          printf(" one , Run length coded\n");
  963.       else
  964.          printf(" zero, not run length coded\n");
  965.          
  966.       printf("         Bit 4 :");
  967.       if(bits & 0x10)
  968.          printf(" one , vertical\n");
  969.       else
  970.          printf(" zero, horizontal\n");
  971.  
  972.       printf("         Bit 5 :");
  973.       if(bits & 0x20)
  974.          printf(" one , long info offsets\n");
  975.       else
  976.          printf(" zero, short info offsets\n");
  977.     
  978.       } /* end of if(BITprint) */
  979.       
  980. /* 
  981.  * This chunk is currently defined to have a 16 byte padding on it for
  982.  * future expansion. Skip it, and anything else left over from "size"
  983.  */
  984.  
  985.       IFF_GotoEnd(picfile,size-24);
  986.       
  987. } /* End of IFF_ANHD */
  988.  
  989. void IFF_DLTA(picfile,size)
  990. FILE *picfile;
  991. LONG size;
  992.  
  993. {
  994.    
  995.    if(VERBOSE) printf("      DLTA (Delta Compression Data) chunk.\n");
  996.    
  997.    IFF_GotoEnd(picfile,size);
  998.       
  999. } /* end of IFF_DLTA */
  1000.  
  1001. void IFF_FSQN(picfile,size)
  1002. FILE *picfile;
  1003. LONG size;
  1004.  
  1005. {
  1006.    char c1,c2,c3,c4;
  1007.    WORD numframes;
  1008.    LONG dt;
  1009.    WORD flags;
  1010.    int i;
  1011.    
  1012.    fi_getc(picfile,&c1);
  1013.    fi_getc(picfile,&c2);
  1014.             
  1015.    numframes = (WORD)c2 + (WORD)(c1<<8);
  1016.             
  1017.    fi_getc(picfile,&c1);
  1018.    fi_getc(picfile,&c2);
  1019.    fi_getc(picfile,&c3);
  1020.    fi_getc(picfile,&c4);
  1021.             
  1022.     dt = makelong(c1,c2,c3,c4);
  1023.    
  1024.    fi_getc(picfile,&c1);
  1025.    fi_getc(picfile,&c2);
  1026.             
  1027.    flags = (WORD)c2 + (WORD)(c1<<8);
  1028.     
  1029.            
  1030.    if(VERBOSE){
  1031.       printf("      FSQN (Frame sequence) chunk\n");
  1032.       printf("        Number of Frames              : %d\n",
  1033.                 numframes);
  1034.         printf("        Time between frames (jiffies) : %d",
  1035.                 dt);
  1036.         printf("           (1 jiffy=1/60 sec)\n");
  1037.       if(flags && 0x1)
  1038.          printf("       Cycle flag set: ignore sequence, cycle a..z,a..z\n");
  1039.       else if(flags && 0x2)
  1040.          printf("       To-fro flag set: ignore sequence, cycle a..z,y..a\n");
  1041.       else
  1042.          printf("       Sequence:");
  1043.    }
  1044.  
  1045.    for(i=0;i<80;i++){
  1046.       fi_getc(picfile,&c1);
  1047.       if(VERBOSE && !(flags && 0x3))
  1048.          printf("%c,",c1);
  1049.       }
  1050.       
  1051.    
  1052.    IFF_GotoEnd(picfile,size-86);
  1053.    
  1054. } /* End of IFF_FSQN */
  1055.  
  1056. /*************************************************************/
  1057. /*    Miscellaneous IFF utility functions                    */
  1058. /*************************************************************/
  1059.  
  1060. void IFF_ID(picfile,chunk_ID) /* read chunk ID (4 bytes) */
  1061. FILE *picfile;
  1062. char *chunk_ID;
  1063. {
  1064.    if(fread(chunk_ID,4,1,picfile) != 1)
  1065.       {
  1066.          printf("Unexpected end of file (I-ID)\n");
  1067.          close(picfile);
  1068.          fi_exit();
  1069.       }
  1070.    
  1071. } /* end of IFF_ID */
  1072.  
  1073. LONG IFF_size(picfile) /* return size of chunk */
  1074. FILE *picfile;
  1075. {
  1076.    LONG size;
  1077.    unsigned char c1,c2,c3,c4;
  1078.       
  1079.    fi_getc(picfile,&c1);
  1080.    fi_getc(picfile,&c2);
  1081.    fi_getc(picfile,&c3);
  1082.    fi_getc(picfile,&c4);
  1083.    
  1084.    size = (ULONG)(c1<<24) + (ULONG)(c2<<16) + (ULONG)(c3<<8) + (ULONG)c4;
  1085.           
  1086.    return(size);
  1087.    
  1088. } /* end of IFF_size */
  1089.  
  1090. void IFF_GotoEnd(picfile,offset) /* Goto end of chunk of size "offset" */
  1091. FILE *picfile;
  1092. LONG offset;
  1093. {
  1094.    char c;
  1095.    
  1096.    if (fseek(picfile,offset,1) == -1){
  1097.          printf(" Unexpected end of file. (I-GotoEnd)\n");  
  1098.          fclose(picfile);
  1099.          fi_exit();
  1100.       }
  1101.    
  1102.    if(is_odd(offset)) fi_getc(picfile,&c); /* read to even boundary */
  1103. }
  1104.