Load_IFF() support for ANIM with sound chunks
This commit is contained in:
		
							parent
							
								
									93bc0e6459
								
							
						
					
					
						commit
						c86babeb35
					
				@ -291,61 +291,64 @@ void Test_IFF(FILE * IFF_file, const char *sub_type)
 | 
			
		||||
 | 
			
		||||
  File_error=1;
 | 
			
		||||
 | 
			
		||||
    do // Dummy loop, so that all breaks jump to end.
 | 
			
		||||
  if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
    return;
 | 
			
		||||
  if (memcmp(section,"FORM",4))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
  if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
    return;
 | 
			
		||||
  //   On aurait pu vérifier que ce long est égal à la taille
 | 
			
		||||
  // du fichier - 8, mais ça aurait interdit de charger des
 | 
			
		||||
  // fichiers tronqués (et déjà que c'est chiant de perdre
 | 
			
		||||
  // une partie du fichier il faut quand même pouvoir en
 | 
			
		||||
  // garder un peu... Sinon, moi je pleure :'( !!! )
 | 
			
		||||
  if (! Read_bytes(IFF_file,format,4))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (!memcmp(format,"ANIM",4))
 | 
			
		||||
  {
 | 
			
		||||
    dword size;
 | 
			
		||||
 | 
			
		||||
    // An ANIM header: need to check that it encloses an image
 | 
			
		||||
    do
 | 
			
		||||
    {
 | 
			
		||||
      if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
        break;
 | 
			
		||||
        return;
 | 
			
		||||
      if (memcmp(section,"FORM",4))
 | 
			
		||||
        break;
 | 
			
		||||
      
 | 
			
		||||
      if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
        break;
 | 
			
		||||
      //   On aurait pu vérifier que ce long est égal à la taille
 | 
			
		||||
      // du fichier - 8, mais ça aurait interdit de charger des
 | 
			
		||||
      // fichiers tronqués (et déjà que c'est chiant de perdre
 | 
			
		||||
      // une partie du fichier il faut quand même pouvoir en
 | 
			
		||||
      // garder un peu... Sinon, moi je pleure :'( !!! )
 | 
			
		||||
        return;
 | 
			
		||||
      if (! Read_dword_be(IFF_file, &size))
 | 
			
		||||
        return;
 | 
			
		||||
      if (! Read_bytes(IFF_file,format,4))
 | 
			
		||||
        break;
 | 
			
		||||
        
 | 
			
		||||
      if (!memcmp(format,"ANIM",4))
 | 
			
		||||
      {
 | 
			
		||||
        // An ANIM header: need to check that it encloses an image
 | 
			
		||||
        if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
          break;
 | 
			
		||||
        if (memcmp(section,"FORM",4))
 | 
			
		||||
          break;
 | 
			
		||||
        if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
          break;
 | 
			
		||||
        if (! Read_bytes(IFF_file,format,4))
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
      else if(memcmp(format,"DPST",4) == 0)
 | 
			
		||||
      {
 | 
			
		||||
        if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
          break;
 | 
			
		||||
        if (memcmp(section, "DPAH", 4) != 0)
 | 
			
		||||
          break;
 | 
			
		||||
        if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
          break;
 | 
			
		||||
        fseek(IFF_file, dummy, SEEK_CUR);
 | 
			
		||||
        if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
          break;
 | 
			
		||||
        if (memcmp(section,"FORM",4))
 | 
			
		||||
          break;
 | 
			
		||||
        if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
          break;
 | 
			
		||||
        if (! Read_bytes(IFF_file,format,4))
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
      if ( memcmp(format,sub_type,4))
 | 
			
		||||
        break;
 | 
			
		||||
      
 | 
			
		||||
      // If we reach this part, file is indeed ILBM/PBM or ANIM
 | 
			
		||||
      File_error=0;
 | 
			
		||||
      
 | 
			
		||||
    } while (0);
 | 
			
		||||
    
 | 
			
		||||
        return;
 | 
			
		||||
      if (fseek(IFF_file, size - 4, SEEK_CUR) < 0)
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    while(0 == memcmp(format, "8SVX", 4));  // skip sound frames
 | 
			
		||||
  }
 | 
			
		||||
  else if(memcmp(format,"DPST",4) == 0)
 | 
			
		||||
  {
 | 
			
		||||
    if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
      return;
 | 
			
		||||
    if (memcmp(section, "DPAH", 4) != 0)
 | 
			
		||||
      return;
 | 
			
		||||
    if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
      return;
 | 
			
		||||
    fseek(IFF_file, dummy, SEEK_CUR);
 | 
			
		||||
    if (! Read_bytes(IFF_file,section,4))
 | 
			
		||||
      return;
 | 
			
		||||
    if (memcmp(section,"FORM",4))
 | 
			
		||||
      return;
 | 
			
		||||
    if (! Read_dword_be(IFF_file, &dummy))
 | 
			
		||||
      return;
 | 
			
		||||
    if (! Read_bytes(IFF_file,format,4))
 | 
			
		||||
      return;
 | 
			
		||||
  }
 | 
			
		||||
  if ( memcmp(format,sub_type,4))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  // If we reach this part, file is indeed ILBM/PBM or ANIM
 | 
			
		||||
  File_error=0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Test_PBM(T_IO_Context * context, FILE * f)
 | 
			
		||||
@ -966,8 +969,17 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
    {
 | 
			
		||||
      // Skip a bit, brother
 | 
			
		||||
      Read_bytes(IFF_file,section,4);
 | 
			
		||||
      Read_dword_be(IFF_file,&dummy);
 | 
			
		||||
      Read_dword_be(IFF_file,§ion_size);
 | 
			
		||||
      Read_bytes(IFF_file,format,4);
 | 
			
		||||
      while (0 == memcmp(format, "8SVX", 4))
 | 
			
		||||
      {
 | 
			
		||||
        GFX2_Log(GFX2_DEBUG, "IFF : skip sound %.4s %u bytes\n", format, section_size);
 | 
			
		||||
        if (fseek(IFF_file, section_size - 4, SEEK_CUR) < 0)
 | 
			
		||||
          break;
 | 
			
		||||
        Read_bytes(IFF_file,section,4);
 | 
			
		||||
        Read_dword_be(IFF_file,§ion_size);
 | 
			
		||||
        Read_bytes(IFF_file,format,4);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else if(memcmp(format,"DPST",4)==0)
 | 
			
		||||
    {
 | 
			
		||||
@ -1002,9 +1014,7 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
      iff_format = FORMAT_ACBM;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      char tmp_msg[60];
 | 
			
		||||
      snprintf(tmp_msg, sizeof(tmp_msg), "Unknown IFF format '%.4s'", format);
 | 
			
		||||
      Warning(tmp_msg);
 | 
			
		||||
      GFX2_Log(GFX2_WARNING, "Unknown IFF format '%.4s'\n", format);
 | 
			
		||||
      File_error=1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
@ -1068,6 +1078,12 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
            File_error = 1;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          GFX2_Log(GFX2_DEBUG, "IFF BMHD : origin (%u,%u) size %ux%u BitPlanes=%u Mask=%u Compression=%u\n",
 | 
			
		||||
                   header.X_org, header.Y_org, header.Width, header.Height,
 | 
			
		||||
                   header.BitPlanes, header.Mask, header.Compression);
 | 
			
		||||
          GFX2_Log(GFX2_DEBUG, "          Transp_col=#%u aspect ratio %u/%u screen size %ux%u\n",
 | 
			
		||||
                   header.Transp_col, header.X_aspect, header.Y_aspect,
 | 
			
		||||
                   header.X_screen, header.Y_screen);
 | 
			
		||||
          real_bit_planes = header.BitPlanes;
 | 
			
		||||
          stored_bit_planes = header.BitPlanes;
 | 
			
		||||
          if (header.Mask==1)
 | 
			
		||||
@ -1196,7 +1212,7 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
                continue;
 | 
			
		||||
              if (plane >= real_bit_planes)
 | 
			
		||||
              {
 | 
			
		||||
                Warning("too much bitplanes in DLTA data");
 | 
			
		||||
                GFX2_Log(GFX2_WARNING, "IFF : too much bitplanes in DLTA data %u >= %u (frame #%u/%u)\n", plane, real_bit_planes, current_frame + 1, frame_count);
 | 
			
		||||
                break;
 | 
			
		||||
              }
 | 
			
		||||
              while (current_offset < offsets[plane])
 | 
			
		||||
@ -1372,7 +1388,7 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            Warning("Unsupported compression type in ILBM DLTA chunk");
 | 
			
		||||
            GFX2_Log(GFX2_INFO, "IFF DLTA : Unsupported compression type %u\n", aheader.operation);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          if (File_error == 0)
 | 
			
		||||
@ -1504,9 +1520,10 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
            File_error = 1;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          GFX2_Log(GFX2_DEBUG, "IFF CMAP : %u colors (header.BitPlanes=%u)\n", nb_colors, header.BitPlanes);
 | 
			
		||||
 | 
			
		||||
          if (current_frame != 0)
 | 
			
		||||
            Warning("One CMAP per frame is not supported");
 | 
			
		||||
            GFX2_Log(GFX2_WARNING, "IFF : One CMAP per frame is not supported (frame #%u/%u)\n", current_frame + 1, frame_count);
 | 
			
		||||
          if ((header.BitPlanes==6 && nb_colors==16) || (header.BitPlanes==8 && nb_colors==64))
 | 
			
		||||
          {
 | 
			
		||||
            Image_HAM=header.BitPlanes;
 | 
			
		||||
@ -1566,6 +1583,7 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
            && (Read_byte(IFF_file,&min_col))
 | 
			
		||||
            && (Read_byte(IFF_file,&max_col)))
 | 
			
		||||
          {
 | 
			
		||||
            GFX2_Log(GFX2_DEBUG, "IFF CRNG : [#%u #%u] rate=%u flags=%04x\n", min_col, max_col, rate, flags);
 | 
			
		||||
            if (section_size == 8 && min_col != max_col)
 | 
			
		||||
            {
 | 
			
		||||
              // Valid cycling range
 | 
			
		||||
@ -1574,7 +1592,7 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
 | 
			
		||||
              if (context->Color_cycles >= 16)
 | 
			
		||||
              {
 | 
			
		||||
                Warning("Maximum CRNG number is 16");
 | 
			
		||||
                GFX2_Log(GFX2_INFO, "IFF CRNG : Maximum CRNG number is 16\n");
 | 
			
		||||
              }
 | 
			
		||||
              else
 | 
			
		||||
              {
 | 
			
		||||
@ -2048,11 +2066,17 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          char tmp_msg[60];
 | 
			
		||||
          // skip section
 | 
			
		||||
          snprintf(tmp_msg, sizeof(tmp_msg), "Skip unknown section '%.4s' of %u bytes", section, section_size);
 | 
			
		||||
          Warning(tmp_msg);
 | 
			
		||||
          fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
 | 
			
		||||
          GFX2_Log(GFX2_INFO, "IFF : Skip unknown section '%.4s' of %u bytes at offset %06X\n", section, section_size, ftell(IFF_file));
 | 
			
		||||
          if (section_size < 256)
 | 
			
		||||
          {
 | 
			
		||||
            byte buffer[256];
 | 
			
		||||
 | 
			
		||||
            Read_bytes(IFF_file, buffer, (section_size+1)&~1);
 | 
			
		||||
            GFX2_LogHexDump(GFX2_DEBUG, "", buffer, 0, (section_size+1)&~1);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
            fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user