Package: simutrans-makeobj
Followup-For: Bug #493409
With the attached series of patches I get identical results on i386,
amd64 and mips.
00_big_endian.patch
This uses the <endian.h> header to detect big-endian systems. This
replaces the hack in the Makefile (seriously, powerpc isn't the only
big-endian arch...). I don't think <endian.h> is portable, so this
probably isn't a suitable solution for upstream.
01_png.patch
Peter Green's PNG reader fix.
02_makeobj_fixes.patch
makeobj writes some data by dumping in-memory object instances to
disk. This is obviously not portable, so this needed to be
rewritten. It looks like Hajo fixed most of this in the past, I did
the rest.
03_makeobj_cleanup.patch
After the last patch the weird logic in obj_node_t isn't needed
anymore, so it can be removed. (This is strictly cleanup, it isn't
necessary for makeobj to run correctly.)
--- a/simtypes.h
+++ b/simtypes.h
@@ -8,6 +8,13 @@
#ifndef SIMTYPES_H
#define SIMTYPES_H
+#include <endian.h>
+#undef LITTLE_ENDIAN //endian.h gives these definitions we don't want
+#undef BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
+ #define BIG_ENDIAN
+#endif
+
#if defined _MSC_VER
# if _MSC_VER <= 1200
# error "Simutrans cannot be compiled with Visual C++ 6.0 or
earlier."
--- a/utils/dr_rdpng.c
+++ b/utils/dr_rdpng.c
@@ -48,11 +48,15 @@
png_read_info(png_ptr, info_ptr);
+ //png_uint_32 is 64 bit on some architectures!
+ png_uint_32 widthpu32,heightpu32;
png_get_IHDR(
png_ptr, info_ptr,
- width, height, &bit_depth, &color_type,
+ &widthpu32, &heightpu32, &bit_depth, &color_type,
&interlace_type, NULL, NULL
);
+ *width = widthpu32;
+ *height = heightpu32;
if (*height % base_img_size != 0 || *width % base_img_size != 0) {
printf("read_png: Invalid image size.\n");
--- a/besch/writer/factory_writer.cc
+++ b/besch/writer/factory_writer.cc
@@ -38,14 +38,19 @@
{
rauch_besch_t besch;
memset(&besch, 0, sizeof(besch));
- obj_node_t node(this, sizeof(besch), &parent, true);
+ obj_node_t node(this, 10, &parent, false);
xref_writer_t::instance()->write_obj(outfp, node, obj_smoke,
obj.get("smoke"), true);
besch.pos_off = obj.get_koord("smoketile", koord(0, 0));
besch.xy_off = obj.get_koord("smokeoffset", koord(0, 0));
besch.zeitmaske = obj.get_int( "smokespeed", 0);
- node.write_data(outfp, &besch);
+ node.write_sint16(outfp, besch.pos_off.x, 0);
+ node.write_sint16(outfp, besch.pos_off.y, 2);
+ node.write_sint16(outfp, besch.xy_off.x, 4);
+ node.write_sint16(outfp, besch.xy_off.x, 6);
+ node.write_sint16(outfp, besch.zeitmaske, 8);
+
node.write(outfp);
}
@@ -72,7 +77,7 @@
{
fabrik_lieferant_besch_t besch;
- obj_node_t node(this, sizeof(besch), &parent, true);
+ obj_node_t node(this, 8, &parent, false);
besch.anzahl = count;
besch.kapazitaet = capacity;
@@ -80,7 +85,11 @@
xref_writer_t::instance()->write_obj(outfp, node, obj_good, warename,
true);
- node.write_data(outfp, &besch);
+ node.write_uint16(outfp, besch.kapazitaet, 0);
+ node.write_uint16(outfp, besch.anzahl, 2);
+ node.write_uint16(outfp, besch.verbrauch, 4);
+ node.write_uint16(outfp, 0, 6); //dummy, unused (and
uninitialized in past versions)
+
node.write(outfp);
}
--- a/besch/writer/ground_writer.cc
+++ b/besch/writer/ground_writer.cc
@@ -10,7 +10,7 @@
{
grund_besch_t besch;
- obj_node_t node(this, sizeof(besch), &parent, true);
+ obj_node_t node(this, 0, &parent, false);
write_head(fp, node, obj);
@@ -37,6 +37,5 @@
}
imagelist2d_writer_t::instance()->write_obj(fp, node, keys);
- node.write_data(fp, &besch);
node.write(fp);
}
--- a/besch/writer/pedestrian_writer.cc
+++ b/besch/writer/pedestrian_writer.cc
@@ -12,7 +12,7 @@
fussgaenger_besch_t besch;
int i;
- obj_node_t node(this, sizeof(besch), &parent, true);
+ obj_node_t node(this, 4, &parent, false);
write_head(fp, node, obj);
@@ -33,6 +33,8 @@
}
imagelist_writer_t::instance()->write_obj(fp, node, keys);
- node.write_data(fp, &besch);
+ node.write_uint16(fp, besch.gewichtung, 0);
+ node.write_uint16(fp, 0, 2); //dummy, unused (and
uninitialized in past versions)
+
node.write(fp);
}
--- a/besch/writer/skin_writer.cc
+++ b/besch/writer/skin_writer.cc
@@ -31,12 +31,11 @@
skin_besch_t besch;
- obj_node_t node(this, sizeof(besch), &parent, true);
+ obj_node_t node(this, 0, &parent, false);
write_head(fp, node, obj);
imagelist_writer_t::instance()->write_obj(fp, node, imagekeys);
- node.write_data(fp, &besch);
node.write(fp);
}
--- a/besch/writer/sound_writer.cc
+++ b/besch/writer/sound_writer.cc
@@ -7,7 +7,7 @@
void sound_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 4, &parent, true);
+ obj_node_t node(this, 4, &parent, false);
write_head(fp, node, obj);
--- a/besch/writer/obj_node.cc
+++ b/besch/writer/obj_node.cc
@@ -8,14 +8,13 @@
uint32 obj_node_t::free_offset; // next free offset in file
-obj_node_t::obj_node_t(obj_writer_t* writer, int size, obj_node_t* parent, bool adjust)
+obj_node_t::obj_node_t(obj_writer_t* writer, int size, obj_node_t* parent)
{
this->parent = parent;
- this->adjust = adjust;
desc.type = writer->get_type();
desc.children = 0;
- desc.size = adjust ? (size - sizeof(obj_besch_t)) : size;
+ desc.size = size;
write_offset = free_offset + sizeof(desc);
free_offset = write_offset + desc.size;
}
@@ -39,21 +38,12 @@
void obj_node_t::write_data(FILE* fp, const void* data)
{
- write_data_at(fp, data, 0, adjust ? desc.size + 4 : desc.size);
+ write_data_at(fp, data, 0, desc.size);
}
void obj_node_t::write_data_at(FILE* fp, const void* data, int offset, int size)
{
- if (adjust) {
- if (offset < sizeof(obj_besch_t)) {
- data = static_cast<const char*>(data) + sizeof(obj_besch_t) - offset;
- size -= sizeof(obj_besch_t) - offset;
- offset = 0;
- } else {
- offset -= sizeof(obj_besch_t);
- }
- }
if (offset < 0 || size < 0 || offset + size > desc.size) {
char reason[1024];
sprintf(reason, "invalid parameters (offset=%d, size=%d, obj_size=%d)", offset, size, desc.size);
--- a/besch/writer/obj_node.h
+++ b/besch/writer/obj_node.h
@@ -16,7 +16,6 @@
uint32 write_offset; // Start of node data in file (after node.desc)
obj_node_t* parent;
- bool adjust; // a normal besch structure start with 4 extra bytes
public:
// set_start_offset() - set offset of first node in file
@@ -27,7 +26,7 @@
// writer object, that writes the node to the file
// size space needed for node data
// parent parent node
- obj_node_t(obj_writer_t* writer, int size, obj_node_t* parent, bool adjust);
+ obj_node_t(obj_writer_t* writer, int size, obj_node_t* parent);
// Write the complete node data to the file
void write_data(FILE* fp, const void* data);
--- a/besch/writer/bridge_writer.cc
+++ b/besch/writer/bridge_writer.cc
@@ -12,7 +12,7 @@
void bridge_writer_t::write_obj(FILE* outfp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 22, &parent, false);
+ obj_node_t node(this, 22, &parent);
uint8 wegtyp = get_waytype(obj.get("waytype"));
uint16 topspeed = obj.get_int("topspeed", 999);
--- a/besch/writer/building_writer.cc
+++ b/besch/writer/building_writer.cc
@@ -18,7 +18,7 @@
{
haus_tile_besch_t besch;
- obj_node_t node(this, 7, &parent, false);
+ obj_node_t node(this, 7, &parent);
besch.phasen = 0;
for (int i = 0; i < seasons; i++) {
@@ -68,7 +68,7 @@
haus_besch_t besch;
// Hajo: take care, hardocded size of node on disc here!
- obj_node_t node(this, 26, &parent, false);
+ obj_node_t node(this, 26, &parent);
write_head(fp, node, obj);
--- a/besch/writer/citycar_writer.cc
+++ b/besch/writer/citycar_writer.cc
@@ -12,7 +12,7 @@
stadtauto_besch_t besch;
int i;
- obj_node_t node(this, 10, &parent, false);
+ obj_node_t node(this, 10, &parent);
besch.gewichtung = obj.get_int("distributionweight", 1);
--- a/besch/writer/crossing_writer.cc
+++ b/besch/writer/crossing_writer.cc
@@ -38,7 +38,7 @@
}
// ok, node can be allocated now
- obj_node_t node(this, total_len, &parent, false);
+ obj_node_t node(this, total_len, &parent);
write_head(fp, node, obj);
// Hajo: version number
--- a/besch/writer/factory_writer.cc
+++ b/besch/writer/factory_writer.cc
@@ -12,7 +12,7 @@
{
field_besch_t besch;
memset(&besch, 0, sizeof(besch));
- obj_node_t node(this, 11, &parent, false);
+ obj_node_t node(this, 11, &parent);
xref_writer_t::instance()->write_obj(outfp, node, obj_field, s, true);
@@ -38,7 +38,7 @@
{
rauch_besch_t besch;
memset(&besch, 0, sizeof(besch));
- obj_node_t node(this, 10, &parent, false);
+ obj_node_t node(this, 10, &parent);
xref_writer_t::instance()->write_obj(outfp, node, obj_smoke, obj.get("smoke"), true);
besch.pos_off = obj.get_koord("smoketile", koord(0, 0));
@@ -57,7 +57,7 @@
void factory_product_writer_t::write_obj(FILE* outfp, obj_node_t& parent, int capacity, int factor, const char* warename)
{
- obj_node_t node(this, sizeof(uint16) * 3, &parent, false);
+ obj_node_t node(this, sizeof(uint16) * 3, &parent);
xref_writer_t::instance()->write_obj(outfp, node, obj_good, warename, true);
@@ -77,7 +77,7 @@
{
fabrik_lieferant_besch_t besch;
- obj_node_t node(this, 8, &parent, false);
+ obj_node_t node(this, 8, &parent);
besch.anzahl = count;
besch.kapazitaet = capacity;
@@ -117,7 +117,7 @@
}
besch.pax_level = obj.get_int("pax_level", 12);
- obj_node_t node(this, 18, &parent, false);
+ obj_node_t node(this, 18, &parent);
obj.put("type", "fac");
--- a/besch/writer/good_writer.cc
+++ b/besch/writer/good_writer.cc
@@ -9,7 +9,7 @@
void good_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 10, &parent, false);
+ obj_node_t node(this, 10, &parent);
write_head(fp, node, obj);
text_writer_t::instance()->write_obj(fp, node, obj.get("metric"));
--- a/besch/writer/ground_writer.cc
+++ b/besch/writer/ground_writer.cc
@@ -10,7 +10,7 @@
{
grund_besch_t besch;
- obj_node_t node(this, 0, &parent, false);
+ obj_node_t node(this, 0, &parent);
write_head(fp, node, obj);
--- a/besch/writer/groundobj_writer.cc
+++ b/besch/writer/groundobj_writer.cc
@@ -11,7 +11,7 @@
void groundobj_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 16, &parent, false); /* false, because we write this ourselves */
+ obj_node_t node(this, 16, &parent);
write_head(fp, node, obj);
// Hajodoc: Preferred height of this tree type
--- a/besch/writer/image_writer.cc
+++ b/besch/writer/image_writer.cc
@@ -324,7 +324,7 @@
#ifdef IMG_VERSION0
// ok, need to be changed to hand mode ...
- obj_node_t node(this, 12 + (bild.len * sizeof(uint16)), &parent, false);
+ obj_node_t node(this, 12 + (bild.len * sizeof(uint16)), &parent);
// to avoid any problems due to structure changes, we write manually the data
node.write_uint8 (outfp, bild.x, 0);
@@ -343,7 +343,7 @@
}
#else
// ok, need to be changed to hand mode ...
- obj_node_t node(this, 10 + (bild.len * sizeof(uint16)), &parent, false);
+ obj_node_t node(this, 10 + (bild.len * sizeof(uint16)), &parent);
// to avoid any problems due to structure changes, we write manually the data
node.write_uint16(outfp, bild.x, 0);
--- a/besch/writer/imagelist2d_writer.cc
+++ b/besch/writer/imagelist2d_writer.cc
@@ -10,7 +10,7 @@
{
bildliste2d_besch_t besch;
- obj_node_t node(this, 4, &parent, false);
+ obj_node_t node(this, 4, &parent);
slist_iterator_tpl<slist_tpl<cstring_t> > iter(keys);
--- a/besch/writer/imagelist_writer.cc
+++ b/besch/writer/imagelist_writer.cc
@@ -11,7 +11,7 @@
{
bildliste_besch_t besch;
- obj_node_t node(this, 4, &parent, false);
+ obj_node_t node(this, 4, &parent);
slist_iterator_tpl<cstring_t> iter(keys);
--- a/besch/writer/pedestrian_writer.cc
+++ b/besch/writer/pedestrian_writer.cc
@@ -12,7 +12,7 @@
fussgaenger_besch_t besch;
int i;
- obj_node_t node(this, 4, &parent, false);
+ obj_node_t node(this, 4, &parent);
write_head(fp, node, obj);
--- a/besch/writer/roadsign_writer.cc
+++ b/besch/writer/roadsign_writer.cc
@@ -11,7 +11,7 @@
void roadsign_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 14, &parent, false); /* false, because we write this ourselves */
+ obj_node_t node(this, 14, &parent);
// Hajodoc: Preferred height of this tree type
// Hajoval: int (useful range: 0-14)
--- a/besch/writer/root_writer.cc
+++ b/besch/writer/root_writer.cc
@@ -48,7 +48,7 @@
printf("writing file %s\n", filename);
write_header(outfp);
- node = new obj_node_t(this, 0, NULL, false);
+ node = new obj_node_t(this, 0, NULL);
}
for( int i=0; i==0 || i<argc; i++ ) {
@@ -86,7 +86,7 @@
printf(" writing file %s\n", (const char*)name);
write_header(outfp);
- node = new obj_node_t(this, 0, NULL, false);
+ node = new obj_node_t(this, 0, NULL);
}
obj_writer_t::write(outfp, *node, obj);
--- a/besch/writer/skin_writer.cc
+++ b/besch/writer/skin_writer.cc
@@ -31,7 +31,7 @@
skin_besch_t besch;
- obj_node_t node(this, 0, &parent, false);
+ obj_node_t node(this, 0, &parent);
write_head(fp, node, obj);
--- a/besch/writer/sound_writer.cc
+++ b/besch/writer/sound_writer.cc
@@ -7,7 +7,7 @@
void sound_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 4, &parent, false);
+ obj_node_t node(this, 4, &parent);
write_head(fp, node, obj);
--- a/besch/writer/text_writer.cc
+++ b/besch/writer/text_writer.cc
@@ -11,7 +11,7 @@
}
int len = strlen(text);
- obj_node_t node(this, len + 1, &parent, false);
+ obj_node_t node(this, len + 1, &parent);
node.write_data(outfp, text);
node.write(outfp);
--- a/besch/writer/tree_writer.cc
+++ b/besch/writer/tree_writer.cc
@@ -11,7 +11,7 @@
void tree_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
- obj_node_t node(this, 6, &parent, false); /* false, because we write this ourselves */
+ obj_node_t node(this, 6, &parent);
write_head(fp, node, obj);
// Hajodoc: Preferred height of this tree type
--- a/besch/writer/tunnel_writer.cc
+++ b/besch/writer/tunnel_writer.cc
@@ -14,7 +14,7 @@
{
int pos, i;
- obj_node_t node(this, 20, &parent, false);
+ obj_node_t node(this, 20, &parent);
uint32 topspeed = obj.get_int("topspeed", 999);
uint32 preis = obj.get_int("cost", 0);
--- a/besch/writer/vehicle_writer.cc
+++ b/besch/writer/vehicle_writer.cc
@@ -76,7 +76,7 @@
}
}
- obj_node_t node(this, total_len, &parent, false);
+ obj_node_t node(this, total_len, &parent);
write_head(fp, node, obj);
--- a/besch/writer/way_obj_writer.cc
+++ b/besch/writer/way_obj_writer.cc
@@ -21,8 +21,7 @@
};
int ribi, hang;
- // Hajo: node size is 24 bytes
- obj_node_t node(this, 20, &parent, false);
+ obj_node_t node(this, 20, &parent);
// Hajo: Version needs high bit set as trigger -> this is required
--- a/besch/writer/way_writer.cc
+++ b/besch/writer/way_writer.cc
@@ -22,7 +22,7 @@
int ribi, hang;
// Hajo: node size is 25 bytes
- obj_node_t node(this, 26, &parent, false);
+ obj_node_t node(this, 26, &parent);
// Hajo: Version needs high bit set as trigger -> this is required
--- a/besch/writer/xref_writer.cc
+++ b/besch/writer/xref_writer.cc
@@ -16,8 +16,7 @@
sizeof(char) + // Fatal-Flag
sizeof(obj_type) + // type of dest node
len + 1, // 0-terminated name of dest node
- &parent,
- false
+ &parent
);
char c = fatal ? 1 : 0;