#include <fstream>
#include <stdexcept>
#include <utility>
+#include <SDL_image.h>
using std::make_pair;
using std::map;
LoadArrays(header->ident,
header->ArraysBegin(),
header->ArraysEnd());
+ LoadImages(header->ident,
+ header->ImagesBegin(),
+ header->ImagesEnd());
} catch (...) {
delete[] block;
throw;
}
}
+void Loader::LoadImages(char *src, Image *begin, Image *end) {
+ for (Image *i = begin; i != end; ++i) {
+ const string path(src + i->pathOffset);
+ SDL_Surface **dest = reinterpret_cast<SDL_Surface **>(src + i->destOffset);
+ std::map<string, SDL_Surface *>::const_iterator
+ found(images.find(path));
+ if (found != images.end()) {
+ *dest = found->second;
+ } else {
+ SDL_Surface *loaded = IMG_Load(path.c_str());
+ images.insert(make_pair(path, loaded));
+ *dest = loaded;
+ }
+ }
+}
+
void Loader::LoadObjects(char *src, Object *begin, Object *end) {
for (Object *i = begin; i < end; i = i->Next()) {
const TypeDescription &td =
TypeDescription::Get(i->typeId);
- if (td.NeedsLinking()) {
- LoadObject(src, i->RawObject(), td);
- }
+ LoadObject(src, i->RawObject(), td);
}
}
i(td.FieldsBegin()), end(td.FieldsEnd());
i != end; ++i) {
const FieldDescription &field = i->second;
- if (!field.IsReferenced() && !field.IsAggregate()) {
- continue;
- }
- char **dest(reinterpret_cast<char **>(object + field.Offset()));
- if (*dest) {
- *dest = src + *reinterpret_cast<unsigned int *>(dest);
+ if (field.IsReferenced() || field.IsAggregate()) {
+ char **dest(reinterpret_cast<char **>(object + field.Offset()));
+ if (*dest) {
+ *dest = src + *reinterpret_cast<unsigned int *>(dest);
+ }
+ } else {
+ const TypeDescription &nestedType
+ = TypeDescription::Get(field.TypeId());
+ LoadObject(src, object + field.Offset(), nestedType);
}
}
}
if (i->ref) {
for (char *j = i->Data(), *end = i->Data() + i->size;
j < end; j += sizeof(void *)) {
- *reinterpret_cast<char **>(j) =
- src + *reinterpret_cast<unsigned int *>(j);
+ unsigned int offset = *reinterpret_cast<unsigned int *>(j);
+ if (offset) {
+ *reinterpret_cast<char **>(j) = src + offset;
+ }
}
} else {
const TypeDescription &td = TypeDescription::Get(i->typeId);