(25th of April 2007 : update - make it harder for mail harvesters to find my email)
Changelog is:
Mon Sep 25 00:50:26 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* fix the way variables are referenced so it works; implement normalizeMeshHeader* functions and place them in the proper place; isolate normalizeMapFileHeader in a distinct function
Mon Sep 25 00:43:28 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* every call to swap functions should be conditioned by the fact we are running on a BE machine
Mon Sep 25 00:41:02 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* fix shifting amounts (these are not bytes, are bits!)
Mon Sep 25 00:40:30 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* fix OR expressions - OH MY GOD, too much scripting will inject || in your head
Sun Sep 24 03:12:45 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* try to fix endian issues for reads and writes in the rest of the game
Sun Sep 24 03:11:20 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* add the implementation of the swap functions which are needed in order to achieve endianness independence
Sat Sep 23 21:15:35 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* test program to see how LE and BE machines interpret data from streams
Fri Sep 22 02:31:36 EEST 2006 Eddy Petrișor <eddy.petrisor @ gmail.com>
* added code to swap bytes (if needed) in image headers, when loaded from a file
- only the shared_lib code was touched
- not sure if data placed in the file is correctly read
--- 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<maxPlayers; ++i){
int x, y;
fread(&x, sizeof(int32), 1, f);
+ #if WORDS_BIGENDIAN==1
+ swap32(&x);
+ #endif // WORDS_BIGENDIAN==1
fread(&y, sizeof(int32), 1, f);
+ #if WORDS_BIGENDIAN==1
+ swap32(&y);
+ #endif // WORDS_BIGENDIAN==1
startLocations[i]= Vec2i(x, y)*cellScale;
}
diff -rN -u old-bigendian/glest-cvs/source/glest_game/world/map.h new-bigendian/glest-cvs/source/glest_game/world/map.h
--- old-bigendian/glest-cvs/source/glest_game/world/map.h 2006-09-25 16:18:00.000000000 +0300
+++ new-bigendian/glest-cvs/source/glest_game/world/map.h 2006-09-25 16:18:00.000000000 +0300
@@ -18,6 +18,7 @@
#include "logger.h"
#include "object.h"
#include "game_constants.h"
+#include "maps.h"
#include <cassert>
@@ -229,6 +230,7 @@
void smoothSurface();
void computeNearSubmerged();
void computeCellColors();
+
};
diff -rN -u old-bigendian/glest-cvs/source/glest_map_editor/map.cpp new-bigendian/glest-cvs/source/glest_map_editor/map.cpp
--- old-bigendian/glest-cvs/source/glest_map_editor/map.cpp 2006-09-25 16:18:00.000000000 +0300
+++ new-bigendian/glest-cvs/source/glest_map_editor/map.cpp 2006-09-25 16:18:00.000000000 +0300
@@ -1,4 +1,5 @@
#include "map.h"
+#include "agnosticity.h"
#include <cmath>
#include <stdexcept>
@@ -404,6 +405,7 @@
//read header
MapFileHeader header;
fread(&header, sizeof(MapFileHeader), 1, f1);
+ normalizeMapFileHeader(&header);
altFactor= header.altFactor;
waterLevel= header.waterLevel;
@@ -415,7 +417,13 @@
resetPlayers(header.maxPlayers);
for(int i=0; i<maxPlayers; ++i){
fread(&startLocations[i].x, sizeof(int32), 1, f1);
+ #if WORDS_BIGENDIAN==1
+ swap32(&(startLocations[i].x));
+ #endif // WORDS_BIGENDIAN==1
fread(&startLocations[i].y, sizeof(int32), 1, f1);
+ #if WORDS_BIGENDIAN==1
+ swap32(&(startLocations[i].y));
+ #endif // WORDS_BIGENDIAN==1
}
//read Heights
@@ -473,11 +481,18 @@
strncpy(header.author, author.c_str(), 128);
strncpy(header.description, desc.c_str(), 256);
+ normalizeMapFileHeader(&header);
fwrite(&header, sizeof(MapFileHeader), 1, f1);
//write start locations
for(int i=0; i<maxPlayers; ++i){
+ #if WORDS_BIGENDIAN==1
+ swap32(&(startLocations[i].x));
+ #endif // WORDS_BIGENDIAN==1
fwrite(&startLocations[i].x, sizeof(int32), 1, f1);
+ #if WORDS_BIGENDIAN==1
+ swap32(&(startLocations[i].y));
+ #endif // WORDS_BIGENDIAN==1
fwrite(&startLocations[i].y, sizeof(int32), 1, f1);
}
diff -rN -u old-bigendian/glest-cvs/source/glest_map_editor/map.h new-bigendian/glest-cvs/source/glest_map_editor/map.h
--- old-bigendian/glest-cvs/source/glest_map_editor/map.h 2006-09-25 16:18:00.000000000 +0300
+++ new-bigendian/glest-cvs/source/glest_map_editor/map.h 2006-09-25 16:18:00.000000000 +0300
@@ -3,23 +3,12 @@
#include "util.h"
#include "types.h"
+#include "maps.h"
using Shared::Platform::int8;
using Shared::Platform::int32;
using Shared::Platform::float32;
-struct MapFileHeader{
- int32 version;
- int32 maxPlayers;
- int32 width;
- int32 height;
- int32 altFactor;
- int32 waterLevel;
- int8 title[128];
- int8 author[128];
- int8 description[256];
-};
-
namespace Glest{ namespace MapEditor{
// ===============================================
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; i<meshCount; ++i){
meshes[i].loadV3(dir, f, textureManager);
@@ -478,6 +552,9 @@
else if(fileHeader.version==2){
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; i<meshCount; ++i){
meshes[i].loadV2(dir, f, textureManager);
@@ -512,6 +589,7 @@
string dir= cutLastFile(path);
+ normalizeModelHeader(&modelHeader);
fwrite(&modelHeader, sizeof(ModelHeader), 1, f);
for(int i=0; i<meshCount; ++i){
meshes[i].save(dir, f);
@@ -520,4 +598,14 @@
fclose(f);*/
}
+void Model::normalizeModelHeader(struct ModelHeader*header){
+
+#if WORDS_BIGENDIAN==1
+
+ swap16(&(header->meshCount));
+
+#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 Shared::Util;
+using 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