artfile.cpp

Go to the documentation of this file.
00001 #include "stdafx.h"
00002 #include "artfile.h"
00003 #include <string.h>
00004 
00005 ArtFile::ArtFile(FILESTRUCT* data)
00006 {
00007         if(data == NULL)
00008         {
00009                 m_nStatus = BL_ERROR;
00010                 return;
00011         }
00012 
00013         //Make sure our data is initialized     
00014         m_Art.Clear();
00015 
00016         m_nStatus = BL_OK;
00017         
00018         uint32 nMemOffset = 0; 
00019         memcpy(&m_Art.nVersion, &data->data[nMemOffset], 4);
00020         nMemOffset += (sizeof(char) * 4);
00021 
00022         //This value gets discarded later for the real value.
00023         memcpy(&m_Art.nNumTiles, &data->data[nMemOffset], 4);
00024         nMemOffset += (sizeof(char) * 4);
00025 
00026         memcpy(&m_Art.nTileStart , &data->data[nMemOffset], 4);
00027         nMemOffset += (sizeof(char) * 4);
00028 
00029         memcpy(&m_Art.nTileEnd , &data->data[nMemOffset], 4);
00030         nMemOffset += (sizeof(char) * 4);
00031 
00032         //Calculate the real value of the tile count
00033         m_Art.nNumTiles = (m_Art.nTileEnd - m_Art.nTileStart) + 1;
00034 
00035         /*
00036         memcpy(&m_Art.tilesizex[0] , &data->data[nMemOffset], (m_Art.nNumTiles * 2));
00037         nMemOffset += (sizeof(char) * (m_Art.nNumTiles * 2));
00038         */
00039         
00040         m_Art.tilesizex = new uint16[m_Art.nNumTiles];
00041         memcpy(&m_Art.tilesizex[0] , &data->data[nMemOffset], (m_Art.nNumTiles * 2));
00042         nMemOffset += (sizeof(char) * (m_Art.nNumTiles * 2));
00043 
00044         m_Art.tilesizey = new uint16[m_Art.nNumTiles];
00045         memcpy(&m_Art.tilesizey[0] , &data->data[nMemOffset], (m_Art.nNumTiles * 2));
00046         nMemOffset += (sizeof(char) * (m_Art.nNumTiles * 2));
00047 
00048         m_Art.picanm = new uint32[m_Art.nNumTiles];
00049         memcpy(&m_Art.picanm[0] , &data->data[nMemOffset], (m_Art.nNumTiles * 4));
00050         nMemOffset += (sizeof(char) * (m_Art.nNumTiles * 4));   
00051         
00052         //Create or tile array
00053         m_Art.tiles = new TILESTRUCT[m_Art.nNumTiles];
00054 
00055         uint32 i = 0;
00056         for(i = 0; i < m_Art.nNumTiles; i++)
00057         {
00058                 m_Art.tiles[i].tilesizex = m_Art.tilesizex[i];
00059                 m_Art.tiles[i].tilesizey = m_Art.tilesizey[i];
00060                 m_Art.tiles[i].picanm = m_Art.picanm[i];                
00061         }
00062 
00063         //delete our temp data
00064         if(m_Art.tilesizex)
00065         {
00066                 delete[] m_Art.tilesizex;
00067         }
00068 
00069         if(m_Art.tilesizey)
00070         {
00071                 delete[] m_Art.tilesizey;
00072         }
00073 
00074         if(m_Art.picanm)
00075         {
00076                 delete[] m_Art.picanm;
00077         }
00078 
00079         //Read our actual tile data now
00080         for(i = 0; i < m_Art.nNumTiles; i++)
00081         {
00082                 uint32 nSize = m_Art.tiles[i].tilesizex * m_Art.tiles[i].tilesizey;
00083                 if( nSize > 0 )
00084                 {
00085                         m_Art.tiles[i].data = new uint8[nSize];
00086                         memcpy(&m_Art.tiles[i].data[0] , &data->data[nMemOffset], nSize);
00087                         nMemOffset += (sizeof(char) * nSize);
00088 
00089                 }
00090                 else
00091                 {
00092                         m_Art.tiles[i].data = NULL;
00093                 }
00094         }
00095 
00096 
00097 }
00098 
00099 
00100 ArtFile::ArtFile(const char* sFilename)
00101 {
00102         //Make sure our data is initialized
00103         m_Art.Clear();
00104 
00105         m_nStatus = BL_OK;
00106 
00107         FILE *fp = fopen(sFilename, "rb");
00108         if(fp != NULL)
00109         {
00110                 //Read contents of the Art file.
00111                 fread(&m_Art.nVersion, 4, 1, fp);
00112                 //This value gets discarded later for the real value.
00113                 fread(&m_Art.nNumTiles, 4, 1, fp);
00114 
00115                 fread(&m_Art.nTileStart, 4, 1, fp);
00116                 fread(&m_Art.nTileEnd, 4, 1, fp);
00117 
00118                 m_Art.nNumTiles = (m_Art.nTileEnd - m_Art.nTileStart) + 1;
00119 
00120                 m_Art.tilesizex = new uint16[m_Art.nNumTiles];
00121                 fread(&m_Art.tilesizex[0], 2, m_Art.nNumTiles, fp);
00122 
00123                 m_Art.tilesizey = new uint16[m_Art.nNumTiles];
00124                 fread(&m_Art.tilesizey[0], 2, m_Art.nNumTiles, fp);
00125 
00126                 m_Art.picanm = new uint32[m_Art.nNumTiles];
00127                 fread(&m_Art.picanm[0], 4, m_Art.nNumTiles, fp);
00128 
00129                 //Create or tile array
00130                 m_Art.tiles = new TILESTRUCT[m_Art.nNumTiles];
00131 
00132                 uint32 i = 0;
00133                 for(i = 0; i < m_Art.nNumTiles; i++)
00134                 {
00135                         m_Art.tiles[i].tilesizex = m_Art.tilesizex[i];
00136                         m_Art.tiles[i].tilesizey = m_Art.tilesizey[i];
00137                         m_Art.tiles[i].picanm = m_Art.picanm[i];                
00138                 }
00139 
00140                 //delete our temp data
00141                 if(m_Art.tilesizex)
00142                 {
00143                         delete[] m_Art.tilesizex;
00144                 }
00145 
00146                 if(m_Art.tilesizey)
00147                 {
00148                         delete[] m_Art.tilesizey;
00149                 }
00150 
00151                 if(m_Art.picanm)
00152                 {
00153                         delete[] m_Art.picanm;
00154                 }
00155 
00156                 //Read our actual tile data now
00157                 for(i = 0; i < m_Art.nNumTiles; i++)
00158                 {
00159                         uint32 nSize = m_Art.tiles[i].tilesizex * m_Art.tiles[i].tilesizey;
00160                         if( nSize > 0 )
00161                         {
00162                                 m_Art.tiles[i].data = new uint8[nSize];
00163                                 fread(&m_Art.tiles[i].data[0], nSize, 1, fp);
00164                         }
00165                         else
00166                         {
00167                                 m_Art.tiles[i].data = NULL;
00168                         }
00169                 }
00170 
00171                 fclose(fp);
00172         }
00173         else
00174         {
00175                 m_nStatus = BL_ERROR;
00176         }
00177 }
00178 
00179 ArtFile::ArtFile()
00180 {
00181         //Make sure our data is initialized
00182         m_Art.Clear();
00183 
00184         m_nStatus = BL_OK;
00185 }
00186 
00187 
00188 ArtFile::~ArtFile()
00189 {
00190 
00191         if(m_Art.tiles)
00192         {
00193                 for(uint32 i = 0; i <m_Art.nNumTiles; i++)
00194                 {
00195                         //delete each tile's data
00196                         if( m_Art.tiles[i].data )
00197                         {
00198                                 delete[] m_Art.tiles[i].data;
00199                         }
00200                 }
00201                 delete[] m_Art.tiles;
00202         }
00203 
00204         /*
00205         if(m_Art.tilesizex)
00206         {
00207                 delete[] m_Art.tilesizex;
00208         }
00209 
00210         if(m_Art.tilesizey)
00211         {
00212                 delete[] m_Art.tilesizey;
00213         }
00214 
00215         if(m_Art.picanm)
00216         {
00217                 delete[] m_Art.picanm;
00218         }
00219         */
00220 
00221 }
00222 
00223 uint16 ArtFile::GetTileSizeX(uint32 nNum)
00224 {
00225         if( nNum < ((GetTileEnd() - GetTileStart()) + 1) )
00226         {
00227                 return m_Art.tiles[nNum].tilesizex; //m_Art.tilesizex[nNum];
00228         }
00229 
00230         return 0;
00231 }
00232 
00233 uint16 ArtFile::GetTileSizeY(uint32 nNum)
00234 {
00235         if( nNum < ((GetTileEnd() - GetTileStart()) + 1) )
00236         {
00237                 return m_Art.tiles[nNum].tilesizey;             
00238         }
00239 
00240         return 0;
00241 }

Generated on Sat Jan 11 23:36:55 2003 for Build-Lib by doxygen1.2.18