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

  1. /**************************************************
  2.  *
  3.  * ILBM.c
  4.  *
  5.  *   IFF-ILBM 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,ANIM_FLAG;  /* Yuck, global variables... */
  16.  
  17. void IFF_ILBM(picfile,size)
  18. FILE *picfile;
  19. LONG size;
  20.  
  21. {
  22.    union chunk_ID{
  23.        char text_ID[4];
  24.        LONG long_ID;} chunk;
  25.  
  26.    LONG ch_size,offset,vpmodes;
  27.    BitMapHeader *BMHD;
  28.    int bmhd_found = FALSE;
  29.    int camg_found = FALSE;
  30.    int i,colors;
  31.         
  32.    if(!TERSE && !ANIM_FLAG) 
  33.       printf("    ILBM (Interleaved Bit Map)\n");
  34.    if(ANIM_FLAG && VERBOSE) 
  35.       printf("    ILBM (Interleaved Bit Map)\n");
  36.    if(TERSE && !ANIM_FLAG) printf("ILBM ");
  37.    offset=0;
  38.    
  39.    while(offset <= (size-8)){
  40.       IFF_ID(picfile,chunk.text_ID);
  41.       ch_size = IFF_size(picfile);
  42.       offset += (8+ch_size+is_odd(ch_size));
  43.                     
  44.       switch(chunk.long_ID){
  45.          case ID_BMHD :
  46.             BMHD = malloc(sizeof(BitMapHeader));
  47.             if(BMHD == NULL){
  48.                printf(" Can't allocate memory for BMHD structure.\n");
  49.                fi_exit();
  50.             }
  51.             IFF_BMHD(picfile,ch_size,BMHD);
  52.             bmhd_found = TRUE;
  53.             if(VERBOSE) {
  54.                printf("      BMHD (Bit Map HeaDer chunk)\n");
  55.                printf("        Width        : %d\n"
  56.                        "        Height       : %d\n"
  57.                        "        # bit planes : %d\n",
  58.                        BMHD->w,BMHD->h,BMHD->nPlanes);
  59.             }
  60.             if(TERSE) printf("   %d   %d   %d\n",
  61.                 BMHD->w,BMHD->h,BMHD->nPlanes);
  62.             break;
  63.          case ID_CMAP :
  64.             IFF_CMAP(picfile,ch_size);
  65.             break;
  66.          case ID_BODY :
  67.             IFF_BODY(picfile,ch_size);
  68.             break;
  69.          case ID_ANHD :
  70.             IFF_ANHD(picfile,ch_size);
  71.             break;
  72.          case ID_GRAB :
  73.             IFF_GRAB(picfile,ch_size);
  74.             break;
  75.          case ID_DEST :
  76.             IFF_DEST(picfile,ch_size);
  77.             break;
  78.          case ID_SPRT :
  79.             IFF_SPRT(picfile,ch_size);
  80.             break;
  81.          case ID_CAMG :
  82.             vpmodes=IFF_CAMG(picfile,ch_size);
  83.             camg_found = TRUE;
  84.             if(VERBOSE){
  85.                 printf("      CAMG (Amiga Display Mode) chunk.\n");
  86.                 if(vpmodes & HIRES) printf("         HiRes flag set\n");
  87.                 if(vpmodes & LACE) printf("         Interlace flag set\n");
  88.                 if(vpmodes & HAM) printf("         HAM mode flag set\n");
  89.                 if(vpmodes & HALFBRITE) 
  90.                     printf("         Halfbright mode flag set\n");
  91.             }
  92.             break;
  93.          case ID_CRNG :
  94.             IFF_CRNG(picfile,ch_size);
  95.             break;
  96.          case ID_CCRT :
  97.             IFF_CCRT(picfile,ch_size);
  98.             break;
  99.          case ID_NAME :
  100.             IFF_NAME(picfile,ch_size);
  101.             break;
  102.          case ID_copyright :
  103.             IFF_copyright(picfile,ch_size);
  104.             break;
  105.          case ID_AUTH :  
  106.             IFF_AUTH(picfile,ch_size);
  107.             break;
  108.          case ID_ANNO :
  109.             IFF_ANNO(picfile,ch_size);
  110.             break;
  111.          case ID_CHRS :
  112.             IFF_CHRS(picfile,ch_size);
  113.             break;
  114.          case ID_TEXT :
  115.             IFF_TEXT(picfile,ch_size);
  116.             break;
  117.          case ID_DPPS :
  118.             IFF_DPPS(picfile,ch_size);
  119.             break;
  120.          case ID_DPPV :
  121.             IFF_DPPV(picfile,ch_size);
  122.             break;
  123.          case ID_DGVW :
  124.             IFF_DGVW(picfile,ch_size);
  125.             break;
  126.          case ID_BHSM :
  127.             IFF_BHSM(picfile,ch_size);
  128.             break;
  129.          case ID_BHCP :
  130.             IFF_BHCP(picfile,ch_size);
  131.             break;
  132.          case ID_BHBA :
  133.             IFF_BHBA(picfile,ch_size);
  134.             break;
  135.          case ID_DLTA :
  136.             IFF_DLTA(picfile,ch_size);
  137.             break;
  138.          default:
  139.             if(VERBOSE) printf(
  140.                "     Inappropriate sub chunk for ILBM: %4s\n",chunk.text_ID);
  141.             IFF_GotoEnd(picfile,ch_size);
  142.       } /* end of switch */
  143.       
  144.    } /* end of while */
  145.  
  146.    IFF_GotoEnd(picfile,size-offset);
  147.  
  148.    if(!VERBOSE && !TERSE && !COMMENT){   /* Normal mode ? */
  149.       if(bmhd_found && camg_found){
  150.          printf("         Width  : %d", BMHD->w);
  151.          if(vpmodes & HIRES) printf("  HiRes");
  152.          printf("\n");
  153.          printf("         Height : %d",BMHD->h);
  154.          if(vpmodes & LACE) printf("   Interlaced");
  155.          printf("\n");
  156.          printf("         Colors :");
  157.          if(vpmodes & HAM) printf(" 4096  HAM\n");
  158.          else{  /* not HAM */
  159.             colors=1;
  160.             for(i=1; i< (BMHD->nPlanes); i++) colors *= 2;
  161.             printf(" %d ",colors);
  162.             if(vpmodes & HALFBRITE) printf("   Extra Halfbright");
  163.             printf("\n");         
  164.          } /* end of else */
  165.       
  166.       } /* end of both found */
  167.       
  168.       else if(bmhd_found)printf("        Width        : %d\n"
  169.                        "        Height       : %d\n"
  170.                        "        # bit planes : %d\n",
  171.                        BMHD->w,BMHD->h,BMHD->nPlanes);
  172.       else if(camg_found){
  173.                 if(vpmodes & HIRES) printf("      HiRes flag set\n");
  174.                 if(vpmodes & LACE) printf("      Interlace flag set\n");
  175.                 if(vpmodes & HAM) printf("      HAM mode flag set\n");
  176.                 if(vpmodes & HALFBRITE) 
  177.                     printf("      Extra Halfbright mode flag set\n");
  178.                }
  179.    } /* end of if(NORMAL) */
  180.    
  181.    if(VERBOSE) printf("    End of ILBM chunk\n");
  182.    if(bmhd_found) free(BMHD);
  183.       
  184. }/* end of IFF_ILBM */
  185.  
  186. /*************************************************************/ 
  187. /* Chunks that are generally ILBM (pic) Chunks               */
  188. /*************************************************************/
  189.     
  190. void IFF_BMHD(picfile,size,BMHD) /* Read BitMapHeaDer block */
  191. FILE *picfile;
  192. LONG size;
  193. BitMapHeader *BMHD;
  194. {
  195.    unsigned char c1,c2,c3,c4;
  196.     
  197.    fi_getc(picfile,&c1);
  198.    fi_getc(picfile,&c2);
  199.    BMHD->w = (UWORD)c2 + ((UWORD)c1) * 256; /* raster width */
  200.    
  201.     fi_getc(picfile,&c3);
  202.    fi_getc(picfile,&c4);
  203.    BMHD->h = (UWORD)c4 + ((UWORD)c3) * 256; /* raster height */
  204.            
  205.    fi_getc(picfile,&c1);
  206.    fi_getc(picfile,&c2);
  207.    BMHD->x = (UWORD)c2 + ((UWORD)c1) * 256; /* x pos of image */
  208.   
  209.     fi_getc(picfile,&c3);
  210.    fi_getc(picfile,&c4);
  211.    BMHD->y = (UWORD)c4 + ((UWORD)c3) * 256; /* y pos of image */
  212.            
  213.    fi_getc(picfile,&c1);
  214.    BMHD->nPlanes=(UBYTE)c1; /* # of source bit planes */
  215.    
  216.    fi_getc(picfile,&c1);
  217.    BMHD->masking=(UBYTE)c1;/* masking technique */
  218.    
  219.    fi_getc(picfile,&c1);
  220.    BMHD->compression=(UBYTE)c1;  /* compression technique */
  221.  
  222.    fi_getc(picfile,&c1);  /* pad byte */
  223.    
  224.     fi_getc(picfile,&c1);
  225.    fi_getc(picfile,&c2);
  226.    BMHD->transparentColor = (UWORD)c2 + ((UWORD)c1) * 256; 
  227.                               /* trans color # */
  228.  
  229.    fi_getc(picfile,&c1);
  230.    BMHD->xAspect=(UBYTE)c1;  /* pixel aspect ratio */
  231.    
  232.    fi_getc(picfile,&c1);
  233.    BMHD->yAspect=(UBYTE)c1;  /* pixel aspect ratio */
  234.  
  235.     fi_getc(picfile,&c1);
  236.    fi_getc(picfile,&c2);
  237.    BMHD->pageWidth = (UWORD)c2 + ((UWORD)c1) * 256; /* source page width */
  238.  
  239.     fi_getc(picfile,&c1);
  240.    fi_getc(picfile,&c2);
  241.    BMHD->pageHeight = (UWORD)c2 + ((UWORD)c1) * 256; /* source page Height */
  242.  
  243.    if(size!=20) IFF_GotoEnd(picfile,size-20);
  244.  
  245. } /* end of IFF_BMHD */        
  246.  
  247. long IFF_CAMG(picfile,size)   /* Deal with CAMG chunk */
  248. FILE *picfile;
  249. LONG size;
  250. {
  251.    long vpmode;
  252.    char c1,c2,c3,c4;
  253.       
  254.    fi_getc(picfile,&c1);
  255.    fi_getc(picfile,&c2);
  256.    fi_getc(picfile,&c3);
  257.    fi_getc(picfile,&c4);
  258.  
  259.     vpmode = makelong(c1,c2,c3,c4);
  260.  
  261.    if(size !=4) IFF_GotoEnd(picfile,size-4);
  262.  
  263.    return(vpmode);
  264.            
  265. } /* end of IFF_CAMG */
  266.  
  267. void IFF_CMAP(picfile,size)
  268. FILE *picfile;
  269. LONG size;
  270.  
  271. {
  272.    if(VERBOSE) printf("      CMAP (color map) chunk.\n");
  273.    
  274.    IFF_GotoEnd(picfile,size);
  275.    
  276. } /* end of IFF_CMAP */
  277.  
  278. void IFF_GRAB(picfile,size)
  279. FILE *picfile;
  280. LONG size;
  281.  
  282. {
  283.    if(VERBOSE) printf("      GRAB (brush handle) chunk.\n");
  284.    
  285.    IFF_GotoEnd(picfile,size);
  286.    
  287.   
  288. } /* end of IFF_GRAB */
  289.  
  290. void IFF_DEST(picfile,size)
  291. FILE *picfile;
  292. LONG size;
  293.  
  294. {
  295.    if(VERBOSE) printf("      DEST (bitplane destination) chunk.\n");
  296.    
  297.    IFF_GotoEnd(picfile,size);
  298.    
  299.   
  300. } /* end of IFF_DEST */
  301.  
  302. void IFF_SPRT(picfile,size)
  303. FILE *picfile;
  304. LONG size;
  305.  
  306. {
  307.    if(VERBOSE) printf("      SPRT (Sprite) chunk.\n");
  308.    
  309.    IFF_GotoEnd(picfile,size);
  310.    
  311.   
  312. } /* end of IFF_SPRT */
  313.  
  314. void IFF_BODY(picfile,size)
  315. FILE *picfile;
  316. LONG size;
  317.  
  318. {
  319.    if(VERBOSE) printf("      BODY (data) chunk.\n");
  320.  
  321.    IFF_GotoEnd(picfile,size);
  322.  
  323. } /* end of IFF_BODY */
  324.  
  325. void IFF_CRNG(picfile,size)
  326. FILE *picfile;
  327. LONG size;
  328.  
  329. {
  330.    if(VERBOSE) printf("      CRNG (color cycling) chunk.\n");
  331.    
  332.    IFF_GotoEnd(picfile,size);
  333.   
  334. } /* end of IFF_CRNG */
  335.  
  336. void IFF_CCRT(picfile,size)
  337. FILE *picfile;
  338. LONG size;
  339.  
  340. {
  341.    if(VERBOSE) printf("      CCRT (color cycling) chunk.\n");
  342.    
  343.    IFF_GotoEnd(picfile,size);
  344.   
  345. } /* end of IFF_CCRT */
  346.  
  347.  
  348. void IFF_DPPV(picfile,size)
  349. FILE *picfile;
  350. LONG size;
  351.  
  352. {
  353.    
  354.    if(VERBOSE) printf("      DPPV (Deluxe Paint II perspective) chunk.\n");
  355.    
  356.    IFF_GotoEnd(picfile,size);
  357.       
  358. } /* end of IFF_DPPV */
  359.  
  360. void IFF_DPPS(picfile,size)
  361. FILE *picfile;
  362. LONG size;
  363.  
  364. {
  365.    
  366.    if(VERBOSE) printf("      DPPS (Deluxe Paint III perspective) chunk.\n");
  367.    
  368.    IFF_GotoEnd(picfile,size);
  369.       
  370. } /* end of IFF_DPPS */
  371.  
  372. void IFF_DGVW(picfile,size)
  373. FILE *picfile;
  374. LONG size;
  375.  
  376. {
  377.    
  378.    if(VERBOSE) printf("      DGVW (Digi-View control panel settings) chunk.\n");
  379.    
  380.    IFF_GotoEnd(picfile,size);
  381.       
  382. } /* end of IFF_DGVW */
  383.  
  384. void IFF_BHSM(picfile,size)
  385. FILE *picfile;
  386. LONG size;
  387.  
  388. {
  389.    
  390.    if(VERBOSE) printf("      BHSM (Photon Paint private) chunk.\n");
  391.    
  392.    IFF_GotoEnd(picfile,size);
  393.       
  394. } /* end of IFF_BHSM */
  395.  
  396. void IFF_BHCP(picfile,size)
  397. FILE *picfile;
  398. LONG size;
  399.  
  400. {
  401.    
  402.    if(VERBOSE) printf("      BHCP (Photon Paint private) chunk.\n");
  403.    
  404.    IFF_GotoEnd(picfile,size);
  405.       
  406. } /* end of IFF_BHCP */
  407.  
  408. void IFF_BHBA(picfile,size)
  409. FILE *picfile;
  410. LONG size;
  411.  
  412. {
  413.    
  414.    if(VERBOSE) printf("      BHBA (Photon Paint private) chunk.\n");
  415.    
  416.    IFF_GotoEnd(picfile,size);
  417.       
  418. } /* end of IFF_BHBA */
  419.  
  420. void IFF_ABIT(picfile,size)
  421. FILE *picfile;
  422. LONG size;
  423.  
  424. {
  425.    if(VERBOSE) printf("      ABIT (Amiga BITplanes) chunk.\n");
  426.  
  427.    IFF_GotoEnd(picfile,size);
  428.  
  429. } /* end of IFF_ABIT */
  430.  
  431.