--- old-bigendian/glest-cvs/source/glest_game/menu/main_menu.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/glest_game/menu/main_menu.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -23,6 +23,8 @@ #include "faction.h" #include "metrics.h" #include "leak_dumper.h" +#include "maps.h" +#include "agnosticity.h" using namespace Shared::Sound; using namespace Shared::Util; @@ -492,16 +494,6 @@ void MenuStateGameSettings::loadMapInfo(string file, MapInfo *mapInfo){ - struct MapFileHeader{ - int32 version; - int32 maxPlayers; - int32 width; - int32 height; - int32 altFactor; - int32 waterLevel; - int8 title[128]; - }; - Lang &lang= Lang::getInstance(); try{ @@ -511,6 +503,7 @@ MapFileHeader header; fread(&header, sizeof(MapFileHeader), 1, f); + normalizeMapFileHeader(&header); mapInfo->size.x= header.width; mapInfo->size.y= header.height; diff -rN -u old-bigendian/glest-cvs/source/glest_game/world/map.cpp new-bigendian/glest-cvs/source/glest_game/world/map.cpp --- old-bigendian/glest-cvs/source/glest_game/world/map.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/glest_game/world/map.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -20,6 +20,8 @@ #include "tech_tree.h" #include "config.h" #include "leak_dumper.h" +#include "agnosticity.h" +#include "maps.h" using namespace Shared::Graphics; using namespace Shared::Util; @@ -102,18 +104,6 @@ } void Map::load(const string &path, TechTree *techTree, Tileset *tileset){ - - struct MapFileHeader{ - int32 version; - int32 maxPlayers; - int32 width; - int32 height; - int32 altFactor; - int32 waterLevel; - int8 title[128]; - int8 author[128]; - int8 description[256]; - }; try{ FILE *f= fopen(path.c_str(), "rb"); @@ -122,6 +112,7 @@ //read header MapFileHeader header; fread(&header, sizeof(MapFileHeader), 1, f); + normalizeMapFileHeader(&header); if(next2Power(header.width) != header.width){ throw runtime_error("Map width is not a power of 2"); @@ -146,7 +137,13 @@ for(int i=0; i @@ -229,6 +230,7 @@ void smoothSurface(); void computeNearSubmerged(); void computeCellColors(); + }; diff -rN -u old-bigendian/glest-cvs/source/shared_lib/include/graphics/maps.h new-bigendian/glest-cvs/source/shared_lib/include/graphics/maps.h --- old-bigendian/glest-cvs/source/shared_lib/include/graphics/maps.h 1970-01-01 02:00:00.000000000 +0200 +++ new-bigendian/glest-cvs/source/shared_lib/include/graphics/maps.h 2006-09-25 16:18:00.000000000 +0300 @@ -0,0 +1,26 @@ +#ifndef _SHARED_LIB_INCLUDE_MAP_H_ +#define _SHARED_LIB_INCLUDE_MAP_H_ + +#include "types.h" + +using Shared::Platform::int32; +using Shared::Platform::int8; + +typedef struct { + int32 version; + int32 maxPlayers; + int32 width; + int32 height; + int32 altFactor; + int32 waterLevel; + int8 title[128]; + int8 author[128]; + int8 description[256]; +} MapFileHeader; + +namespace Shared{ namespace Util{ + +void normalizeMapFileHeader(MapFileHeader *header); + +}}//end namespace +#endif // _SHARED_LIB_INCLUDE_MAP_H_ diff -rN -u old-bigendian/glest-cvs/source/shared_lib/include/graphics/model.h new-bigendian/glest-cvs/source/shared_lib/include/graphics/model.h --- old-bigendian/glest-cvs/source/shared_lib/include/graphics/model.h 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/include/graphics/model.h 2006-09-25 16:18:00.000000000 +0300 @@ -116,6 +116,10 @@ void load(const string &dir, FILE *f, TextureManager *textureManager); void save(const string &dir, FILE *f); + //endianness + void normalizeMeshHeader(MeshHeader *header); + void normalizeMeshHeaderV3(MeshHeaderV3 *header); + void normalizeMeshHeaderV2(MeshHeaderV2 *header); private: void computeTangents(); }; @@ -165,6 +169,8 @@ private: void buildInterpolationData() const; + + void normalizeModelHeader(struct ModelHeader*header); }; }}//end namespace diff -rN -u old-bigendian/glest-cvs/source/shared_lib/include/graphics/pixmap.h new-bigendian/glest-cvs/source/shared_lib/include/graphics/pixmap.h --- old-bigendian/glest-cvs/source/shared_lib/include/graphics/pixmap.h 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/include/graphics/pixmap.h 2006-09-25 16:18:00.000000000 +0300 @@ -71,6 +71,8 @@ virtual void openWrite(const string &path, int w, int h, int components); virtual void write(uint8 *pixels); + + virtual void normalizeFileHeader(struct TargaFileHeader *header); }; // ===================================================== @@ -91,6 +93,9 @@ virtual void openWrite(const string &path, int w, int h, int components); virtual void write(uint8 *pixels); + + virtual void normalizeFileHeader(struct BitmapFileHeader *header); + virtual void normalizeInfoHeader(struct BitmapInfoHeader *header); }; // ===================================================== diff -rN -u old-bigendian/glest-cvs/source/shared_lib/include/util/agnosticity.h new-bigendian/glest-cvs/source/shared_lib/include/util/agnosticity.h --- old-bigendian/glest-cvs/source/shared_lib/include/util/agnosticity.h 1970-01-01 02:00:00.000000000 +0200 +++ new-bigendian/glest-cvs/source/shared_lib/include/util/agnosticity.h 2006-09-25 16:18:00.000000000 +0300 @@ -0,0 +1,37 @@ +// ============================================================== +// This file is part of Glest Shared Library (www.glest.org) +// +// Copyright (C) 2006 Eddy Petris,or +// +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version +// ============================================================== + +#ifndef _SHARED_UTIL_AGNOSTICITY_H_ +#define _SHARED_UTIL_AGNOSTICITY_H_ + +#include "types.h" +#include "util.h" + +using Shared::Platform::uint8; +using Shared::Platform::uint16; +using Shared::Platform::int16; +using Shared::Platform::uint32; +using Shared::Platform::int32; + +namespace Shared{ namespace Util{ + +//endian agnosticity +void swap(uint8 size, void *data); +void swap16(uint16 *data); +void swap16(int16 *data); +void swap32(uint32 *data); +void swap32(int32 *data); +void swap32x(uint32 *data, uint8 count); +void swap32x(int32 *data, uint8 count); + +}}//end namespace + +#endif // _SHARED_UTIL_AGNOSTICITY_H_ diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/graphics/maps.cpp new-bigendian/glest-cvs/source/shared_lib/sources/graphics/maps.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/graphics/maps.cpp 1970-01-01 02:00:00.000000000 +0200 +++ new-bigendian/glest-cvs/source/shared_lib/sources/graphics/maps.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -0,0 +1,36 @@ +// ============================================================== +// This file is part of Glest Shared Library (www.glest.org) +// +// Copyright (C) 2006 Eddy Petris,or +// +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version +// ============================================================== + +#include "maps.h" +#include "agnosticity.h" + +using Shared::Util::swap32; + +namespace Shared{ namespace Util{ + +void normalizeMapFileHeader(MapFileHeader *header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->version)); + swap32(&(header->maxPlayers)); + swap32(&(header->width)); + swap32(&(header->height)); + swap32(&(header->altFactor)); + swap32(&(header->waterLevel)); + +#endif // WORDS_BIGENDIAN=1 +} + + + +}}//end namespace + diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/graphics/model.cpp new-bigendian/glest-cvs/source/shared_lib/sources/graphics/model.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/graphics/model.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/sources/graphics/model.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -19,9 +19,11 @@ #include "conversion.h" #include "util.h" #include "leak_dumper.h" +#include "agnosticity.h" -using namespace Shared::Platform; +using namespace Shared::Platform; +using namespace Shared::Util; using namespace std; namespace Shared{ namespace Graphics{ @@ -95,6 +97,7 @@ //read header MeshHeaderV2 meshHeader; fread(&meshHeader, sizeof(MeshHeaderV2), 1, f); + normalizeMeshHeaderV2(&meshHeader); if(meshHeader.normalFrameCount!=meshHeader.vertexFrameCount){ @@ -138,13 +141,16 @@ fread(&opacity, sizeof(float32), 1, f); fseek(f, sizeof(Vec4f)*(meshHeader.colorFrameCount-1), SEEK_CUR); fread(indices, sizeof(uint32)*indexCount, 1, f); + #if WORDS_BIGENDIAN==1 + swap32x(indices, indexCount); + #endif // WORDS_BIGENDIAN==1 } void Mesh::loadV3(const string &dir, FILE *f, TextureManager *textureManager){ //read header MeshHeaderV3 meshHeader; fread(&meshHeader, sizeof(MeshHeaderV3), 1, f); - + normalizeMeshHeaderV3(&meshHeader); if(meshHeader.normalFrameCount!=meshHeader.vertexFrameCount){ throw runtime_error("Old model: vertex frame count different from normal frame count"); @@ -185,12 +191,16 @@ fread(&opacity, sizeof(float32), 1, f); fseek(f, sizeof(Vec4f)*(meshHeader.colorFrameCount-1), SEEK_CUR); fread(indices, sizeof(uint32)*indexCount, 1, f); + #if WORDS_BIGENDIAN==1 + swap32x(indices, indexCount); + #endif // WORDS_BIGENDIAN==1 } void Mesh::load(const string &dir, FILE *f, TextureManager *textureManager){ //read header MeshHeader meshHeader; fread(&meshHeader, sizeof(MeshHeader), 1, f); + normalizeMeshHeader(&meshHeader); //init frameCount= meshHeader.frameCount; @@ -238,6 +248,9 @@ fread(texCoords, sizeof(Vec2f)*vertexCount, 1, f); } fread(indices, sizeof(uint32)*indexCount, 1, f); + #if WORDS_BIGENDIAN==1 + swap32x(indices, indexCount); + #endif // WORDS_BIGENDIAN==1 //tangents if(textures[mtNormal]!=NULL){ @@ -267,11 +280,15 @@ texture->getPixmap()->saveTga(dir+"/"+texName); } + normalizeMeshHeader(&meshHeader); fwrite(&meshHeader, sizeof(MeshHeader), 1, f); fwrite(vertices, sizeof(Vec3f)*vertexFrameCount*pointCount, 1, f); fwrite(normals, sizeof(Vec3f)*normalFrameCount*pointCount, 1, f); fwrite(texCoords, sizeof(Vec2f)*texCoordFrameCount*pointCount, 1, f); fwrite(colors, sizeof(Vec4f)*colorFrameCount, 1, f); + #if WORDS_BIGENDIAN==1 + swap32x(indices, indexCount); + #endif // WORDS_BIGENDIAN==1 fwrite(indices, sizeof(uint32)*indexCount, 1, f);*/ } @@ -313,6 +330,58 @@ } } +void Mesh::normalizeMeshHeader(MeshHeader *header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->frameCount)); + swap32(&(header->vertexCount)); + swap32(&(header->indexCount)); +/* + float32 diffuseColor[3]; + float32 specularColor[3]; + float32 specularPower; + float32 opacity; +*/ + swap32(&(header->properties)); + swap32(&(header->textures)); + +#endif // WORDS_BIGENDIAN==1 + +} + +void Mesh::normalizeMeshHeaderV3(MeshHeaderV3 *header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->vertexFrameCount)); + swap32(&(header->normalFrameCount)); + swap32(&(header->texCoordFrameCount)); + swap32(&(header->colorFrameCount)); + swap32(&(header->pointCount)); + swap32(&(header->indexCount)); + swap32(&(header->properties)); + +#endif // WORDS_BIGENDIAN==1 + +} + + +void Mesh::normalizeMeshHeaderV2(MeshHeaderV2 *header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->vertexFrameCount)); + swap32(&(header->normalFrameCount)); + swap32(&(header->texCoordFrameCount)); + swap32(&(header->colorFrameCount)); + swap32(&(header->pointCount)); + swap32(&(header->indexCount)); + +#endif // WORDS_BIGENDIAN==1 + +} + // =============================================== // class Model // =============================================== @@ -452,6 +521,8 @@ //model header ModelHeader modelHeader; fread(&modelHeader, sizeof(ModelHeader), 1, f); + normalizeModelHeader(&modelHeader); + meshCount= modelHeader.meshCount; if(modelHeader.type!=mtMorphMesh){ throw runtime_error("Invalid model type"); @@ -468,6 +539,9 @@ else if(fileHeader.version==3){ fread(&meshCount, sizeof(meshCount), 1, f); + #if WORDS_BIGENDIAN==1 + swap(sizeof(meshCount), (void *)&meshCount); + #endif // WORDS_BIGENDIAN==1 meshes= new Mesh[meshCount]; for(uint32 i=0; imeshCount)); + +#endif // WORDS_BIGENDIAN==1 + +} + }}//end namespace diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/graphics/pixmap.cpp new-bigendian/glest-cvs/source/shared_lib/sources/graphics/pixmap.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/graphics/pixmap.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/sources/graphics/pixmap.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -18,6 +18,7 @@ #include "util.h" #include "math_util.h" #include "leak_dumper.h" +#include "agnosticity.h" using namespace std; @@ -97,7 +98,8 @@ //read header TargaFileHeader fileHeader; fread(&fileHeader, sizeof(TargaFileHeader), 1, file); - + normalizeFileHeader(&fileHeader); + //check that we can load this tga file if(fileHeader.idLength!=0){ throw runtime_error(path + ": id field is not 0"); @@ -182,6 +184,7 @@ fileHeader.height= h; fileHeader.imageDescriptor= components==4? 8: 0; + normalizeFileHeader(&fileHeader); fwrite(&fileHeader, sizeof(TargaFileHeader), 1, file); } @@ -201,6 +204,21 @@ } } +void PixmapIoTga::normalizeFileHeader(struct TargaFileHeader *header){ + +#if WORDS_BIGENDIAN==1 + + swap16(&(header->colourMapOrigin)); + swap16(&(header->colourMapLength)); + swap16(&(header->xOrigin)); + swap16(&(header->yOrigin)); + swap16(&(header->width)); + swap16(&(header->height)); + +#endif // WORDS_BIGENDIAN==1 + +} + // ===================================================== // class PixmapIoBmp // ===================================================== @@ -224,6 +242,7 @@ //read file header BitmapFileHeader fileHeader; fread(&fileHeader, sizeof(BitmapFileHeader), 1, file); + normalizeFileHeader(&fileHeader); if(fileHeader.type1!='B' || fileHeader.type2!='M'){ throw runtime_error(path +" is not a bitmap"); } @@ -231,6 +250,7 @@ //read info header BitmapInfoHeader infoHeader; fread(&infoHeader, sizeof(BitmapInfoHeader), 1, file); + normalizeInfoHeader(&infoHeader); if(infoHeader.bitCount!=24){ throw runtime_error(path+" is not a 24 bit bitmap"); } @@ -281,13 +301,14 @@ } BitmapFileHeader fileHeader; - fileHeader.type1='B'; + fileHeader.type1='B'; fileHeader.type2='M'; fileHeader.offsetBits=sizeof(BitmapFileHeader)+sizeof(BitmapInfoHeader); fileHeader.size=sizeof(BitmapFileHeader)+sizeof(BitmapInfoHeader)+3*h*w; - fwrite(&fileHeader, sizeof(BitmapFileHeader), 1, file); - + normalizeFileHeader(&fileHeader); + fwrite(&fileHeader, sizeof(BitmapFileHeader), 1, file); + //info header BitmapInfoHeader infoHeader; infoHeader.bitCount=24; @@ -302,6 +323,7 @@ infoHeader.xPelsPerMeter= 0; infoHeader.yPelsPerMeter= 0; + normalizeInfoHeader(&infoHeader); fwrite(&infoHeader, sizeof(BitmapInfoHeader), 1, file); } @@ -313,6 +335,39 @@ } } +void PixmapIoBmp::normalizeFileHeader(struct BitmapFileHeader* header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->size)); + swap16(&(header->reserved1)); + swap16(&(header->reserved2)); + swap32(&(header->offsetBits)); + +#endif // WORDS_BIGENDIAN==1 + +} + +void PixmapIoBmp::normalizeInfoHeader(struct BitmapInfoHeader* header){ + +#if WORDS_BIGENDIAN==1 + + swap32(&(header->size)); + swap32(&(header->width)); + swap32(&(header->height)); + swap16(&(header->planes)); + swap16(&(header->bitCount)); + swap32(&(header->compression)); + swap32(&(header->sizeImage)); + swap32(&(header->xPelsPerMeter)); + swap32(&(header->yPelsPerMeter)); + swap32(&(header->clrUsed)); + swap32(&(header->clrImportant)); + +#endif // WORDS_BIGENDIAN==1 + +} + // ===================================================== // class Pixmap1D // ===================================================== diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/sound/sound_file_loader.cpp new-bigendian/glest-cvs/source/shared_lib/sources/sound/sound_file_loader.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/sound/sound_file_loader.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/sources/sound/sound_file_loader.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -16,9 +16,12 @@ #include "sound.h" #include "leak_dumper.h" +#include "agnosticity.h" -using namespace Shared::Platform; -using namespace std; +using Shared::Platform::uint32; +using Shared::Platform::uint16; +using namespace Shared::Util; +using namespace std; namespace Shared{ namespace Sound{ @@ -72,10 +75,16 @@ //first sub-chunk (header) - Data (nChannels) f.read((char*) &size16, 2); + #if WORDS_BIGENDIAN==1 + swap16(&size16); + #endif // WORDS_BIGENDIAN==1 soundInfo->setChannels(size16); //first sub-chunk (header) - Data (nsamplesPerSecond) f.read((char*) &size32, 4); + #if WORDS_BIGENDIAN==1 + swap32(&size32); + #endif // WORDS_BIGENDIAN==1 soundInfo->setsamplesPerSecond(size32); //first sub-chunk (header) - Data (nAvgBytesPerSec) - Ignore @@ -86,6 +95,9 @@ //first sub-chunk (header) - Data (nsamplesPerSecond) f.read((char*) &size16, 2); + #if WORDS_BIGENDIAN==1 + swap16(&size16); + #endif // WORDS_BIGENDIAN==1 soundInfo->setBitsPerSample(size16); if (soundInfo->getBitsPerSample() != 8 && soundInfo->getBitsPerSample()!=16){ @@ -106,6 +118,9 @@ //second sub-chunk (samples) - Size f.read((char*) &size32, 4); + #if WORDS_BIGENDIAN==1 + swap32(&size32); + #endif // WORDS_BIGENDIAN==1 dataSize= size32; soundInfo->setSize(dataSize); } diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/util/agnosticity.cpp new-bigendian/glest-cvs/source/shared_lib/sources/util/agnosticity.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/util/agnosticity.cpp 1970-01-01 02:00:00.000000000 +0200 +++ new-bigendian/glest-cvs/source/shared_lib/sources/util/agnosticity.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -0,0 +1,57 @@ +// ============================================================== +// This file is part of Glest Shared Library (www.glest.org) +// +// Copyright (C) 2006 Eddy Petris,or +// +// You can redistribute this code and/or modify it under +// the terms of the GNU General Public License as published +// by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version +// ============================================================== + +#include "agnosticity.h" + +namespace Shared{ namespace Util{ + +void swap16(uint16 *data){ + *data = (( (*data) & 0x00ffu) << 8) | ( (*data) >> 8 ) ; +} +void swap16(int16 *data){ + *data = (( (*data) & 0x00ffu) << 8) | ( (*data) >> 8 ) ; +} +void swap32(uint32 *data){ + uint32 tmp; + tmp = *data; + *data = ( ( (tmp & (uint32)0x000000ff) << 24 ) | + ( (tmp & (uint32)0x0000ff00) << 8 ) | + ( (tmp & (uint32)0x00ff0000) >> 8 ) | + ( (tmp & (uint32)0xff000000) >> 24 ) ) ; +} +void swap32(int32 *data){ + int32 tmp; + tmp = *data; + *data = ( ( (tmp & (int32)0x000000ff) << 24 ) | + ( (tmp & (int32)0x0000ff00) << 8 ) | + ( (tmp & (int32)0x00ff0000) >> 8 ) | + ( (tmp & (int32)0xff000000) >> 24 ) ) ; +} +void swap32x(uint32 *data, uint8 count){ + for ( uint8 i = 0 ; i < count ; i++ ) swap32(data+i); +} +void swap32x(int32 *data, uint8 count){ + for ( uint8 i = 0 ; i < count ; i++ ) swap32(data+i); +} +void swap(uint8 size, void *data){ + if (size == 2){ + swap16((int16 *)data); + } + else if (size == 4){ + swap32((int32 *)data); + } + else + { + // nothing to do + } +} + +}}//end namespace diff -rN -u old-bigendian/glest-cvs/source/shared_lib/sources/util/util.cpp new-bigendian/glest-cvs/source/shared_lib/sources/util/util.cpp --- old-bigendian/glest-cvs/source/shared_lib/sources/util/util.cpp 2006-09-25 16:18:00.000000000 +0300 +++ new-bigendian/glest-cvs/source/shared_lib/sources/util/util.cpp 2006-09-25 16:18:00.000000000 +0300 @@ -159,4 +159,5 @@ return min+(((max-min)/RAND_MAX)*rand()); } + }}//end namespace