/*===========================================================================
 *
 * TextTest.CPP - Dave Humphrey (uesp@m0use.net), 2 November 2000
 *
 *=========================================================================*/

	/* Includes */
#include "dftexture.h"
#include "io.h"
#include "pcx.h"
#include "dfcif.h"
#include "dfcommon.h"


long U1Count = 0;
long U2Count = 0;
long U3Count = 0;
long ImageCount = 0;
int  ReadFailedCount = 0;
CPCXImage PCXImage;


/*===========================================================================
 *
 * Function - void CheckOffsets (pDFTexture);
 *
 *=========================================================================*/
void CheckOffsets (CDFTexture* pDFTexture) {
  int		      LoopCounter;
  dftexture_offset_t* pOffset;

  for (LoopCounter = 0; LoopCounter < pDFTexture->GetNumImages(); LoopCounter++) {
    pOffset = pDFTexture->GetOffsetData(LoopCounter);
    if (pOffset == NULL) continue;
    if (pOffset->Unknown1 != 0) { 
      U1Count++; 
      //SystemLog.Printf ("U1 = 0x%08lX", pOffset->Unknown1); 
     }
    if (pOffset->NullValue1 != 0) U2Count++;
    if (pOffset->NullValue2 != 0) U3Count++;
    ImageCount += pDFTexture->GetNumSubImages(LoopCounter);
   }

 }
/*===========================================================================
 *		End of Function CheckOffsets();
 *=========================================================================*/


/*===========================================================================
 *
 * Function - void LoadAllTextures (char* pFileSpec);
 *
 * Attempts to load all textures in the Arena2 directory.
 *
 *=========================================================================*/
void LoadAllTextures (char* pFileSpec) {
  _finddata_t FindData;
  char	      Buffer[256];
  CDFTexture  DFTexture;  
  long        FindHandle;
  int	      Result;
  boolean     bResult;
  int	      FileCount = 0;
  int	      LoopCounter;
  int         SubCounter;
  int	      MaxImages = 0;
  int	      MinImages = 10000;

	/* Setup parameters */
  QuietLogOutput = TRUE;
  chdir("f:\\dagger\\arena2");

  	/* Find the first texture */
  FindHandle = _findfirst(pFileSpec, &FindData);

  if (FindHandle == -1) {
    SystemLog.Printf(stdout, "No texture files found!\n");
    return;
   }

	/* Find all matching files */
  do { 
    SystemLog.Printf ("Texture '%s' (0x%lX bytes)", FindData.name, FindData.size);
    printf ("%s...", FindData.name);
    FileCount++;
    
    bResult = DFTexture.Load(FindData.name);
    printf ("%s\n", bResult ? "Loaded." : "Failed!");

    if (bResult) {
      //DFTexture.Dump(SystemLog.GetFileHandle(), DFTEXTURE_DM_TEXTUREINFO | DFTEXTURE_DM_IMAGE | DFTEXTURE_DM_IMAGEUNKNOWNS | DFTEXTURE_DM_OFFSETLIST | DFTEXTURE_DM_IMAGEHEADER);
      CheckOffsets(&DFTexture);

      sprintf(Buffer, "d:\\dfpcx\\%03.3s", FindData.name+8);
      mkdir(Buffer);

//*
     for (LoopCounter = 0; LoopCounter < DFTexture.GetNumImages(); LoopCounter++) {
        for (SubCounter = 0; SubCounter < DFTexture.GetNumSubImages(LoopCounter); SubCounter++) {
          sprintf(Buffer, "d:\\dfpcx\\%03.3s\\%02d_%02d.pcx", FindData.name+8, LoopCounter, SubCounter);
          PCXImage.ExportLBM(Buffer, DFTexture.GetWidth(LoopCounter, SubCounter), DFTexture.GetHeight(LoopCounter, SubCounter), DFTexture.GetImageData(LoopCounter, SubCounter));
	 }
       } //*/
     }
    else {
      //DFTexture.Dump(SystemLog.GetFileHandle(), DFTEXTURE_DM_TEXTUREINFO | DFTEXTURE_DM_IMAGE | DFTEXTURE_DM_IMAGEUNKNOWNS | DFTEXTURE_DM_OFFSETLIST | DFTEXTURE_DM_IMAGEHEADER);
      ReadFailedCount++;
      SystemLog.Printf ("\tFailed to load texture!");
     }

		/* Find the next texture */
    Result = _findnext(FindHandle, &FindData);
  } while (Result == 0);

	/* Close the find files handle */
  _findclose(FindHandle);

  SystemLog.Printf (stdout, "NumFiles = %d (%d Read Failed)\n", FileCount, ReadFailedCount);
  SystemLog.Printf (stdout, "NumImages = %d / %d / %d\n", MinImages, MaxImages, ImageCount);
  SystemLog.Printf (stdout, "U1Count = %ld\n", U1Count);
  SystemLog.Printf (stdout, "U2Count = %ld\n", U2Count);
  SystemLog.Printf (stdout, "U3Count = %ld\n", U3Count);
 }
/*===========================================================================
 *		End of Function LoadAllTextures()
 *=========================================================================*/


/*===========================================================================
 *
 * Function - void LoadAllCifs (char* pFileSpec);
 *
 * Attempts to load all cifs from the Arena2 directory.
 *
 *=========================================================================*/
void LoadAllCifs (char* pFileSpec) {
  _finddata_t FindData;
  char	      Buffer[256];
  CDFCifFile  DFCif;
  CDFImgFile  DFImage;
  long        FindHandle;
  int	      Result;
  boolean     bResult;
  int	      FileCount = 0;
  int	      LoopCounter;

	/* Setup parameters */
  QuietLogOutput = TRUE;
  chdir("f:\\dagger\\arena2");

  	/* Find the first texture */
  FindHandle = _findfirst(pFileSpec, &FindData);

  if (FindHandle == -1) {
    SystemLog.Printf(stdout, "No cif files found!\n");
    return;
   }

	/* Find all matching files */
  do { 
    SystemLog.Printf ("CIF '%s' (0x%lX bytes)", FindData.name, FindData.size);
    printf ("%s...", FindData.name);
    FileCount++;
    
    bResult = DFCif.Load(FindData.name);
    //bResult = DFImage.Load(FindData.name);
    printf ("%s\n", bResult ? "Loaded." : "Failed!");

    if (bResult) {
      //sprintf(Buffer, "d:\\dfpcx\\img\\%.8s.pcx", FindData.name, FindData.name+3);
      //PCXImage.ExportLBM(Buffer, DFImage.GetWidth(), DFImage.GetHeight(), DFImage.GetImageData());
//*
      for (LoopCounter = 0; LoopCounter < DFCif.GetNumImages(); LoopCounter++) {
        sprintf(Buffer, "d:\\dfpcx\\cif\\%c%5s%02d.pcx", FindData.name[0], FindData.name+3, LoopCounter);
	PCXImage.ExportLBM(Buffer, DFCif.GetWidth(LoopCounter), DFCif.GetHeight(LoopCounter), DFCif.GetImageData(LoopCounter));
       } //*/   
     }
    else {
      ReadFailedCount++;
      SystemLog.Printf ("\tFailed to load cif!");
     }

		/* Find the next texture */
    Result = _findnext(FindHandle, &FindData);
  } while (Result == 0);

	/* Close the find files handle */
  _findclose(FindHandle);

  SystemLog.Printf (stdout, "NumFiles = %d (%d Read Failed)\n", FileCount, ReadFailedCount);
  SystemLog.Printf (stdout, "NumImages = %d \n", ImageCount);  
 }
/*===========================================================================
 *		End of Function LoadAllCifs()
 *=========================================================================*/


/*===========================================================================
 *
 * Begin Main Program
 *
 *=========================================================================*/
void main (void) {

  SystemLog.Open("texttest.log");
  SystemLog.Printf ("Offset Size = %d", sizeof(dftexture_offset_t));
  SystemLog.Printf ("PCXHeader Size = %d", sizeof(CPCXHeader));

	/* Setup the PCX palette */
  PCXImage.SetVGAPalette(DFPalette);

  //LoadAllTextures("f:\\dagger\\arena2\\texture.253");
  LoadAllCifs("f:\\dagger\\arena2\\*.cif");
 }
/*===========================================================================
 *		End of Main Program
 *=========================================================================*/