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
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
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
00033 m_Art.nNumTiles = (m_Art.nTileEnd - m_Art.nTileStart) + 1;
00034
00035
00036
00037
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
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
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
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
00103 m_Art.Clear();
00104
00105 m_nStatus = BL_OK;
00106
00107 FILE *fp = fopen(sFilename, "rb");
00108 if(fp != NULL)
00109 {
00110
00111 fread(&m_Art.nVersion, 4, 1, fp);
00112
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
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
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
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
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
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
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
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;
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 }