X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fdocument.cpp;h=e8556ee367f8b3d5a497b66e7212d016613cc0aa;hp=99e429e9ec862ed44d8a2526f31c66ebb08f1296;hb=901ea3355265e7f413674a62f7c29806ae35a565;hpb=b006386ab52e8a2c47c20bc21591d01c314d4d8e diff --git a/src/document.cpp b/src/document.cpp index 99e429e..e8556ee 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -1,18 +1,95 @@ #include "document.h" +#include + using namespace IPDF; using namespace std; +void Document::Save(const string & filename) +{ + Debug("Saving document to file \"%s\"...", filename.c_str()); + FILE * file = fopen(filename.c_str(), "w"); + if (file == NULL) + Fatal("Couldn't open file \"%s\" - %s", filename.c_str(), strerror(errno)); + + size_t written; + Debug("Number of objects (%u)...", ObjectCount()); + written = fwrite(&m_count, sizeof(m_count), 1, file); + if (written != 1) + Fatal("Failed to write number of objects!"); + + Debug("Object types..."); + written = fwrite(m_objects.types.data(), sizeof(ObjectType), m_objects.types.size(), file); + if (written != ObjectCount()) + Fatal("Only wrote %u objects!", written); + + Debug("Object bounds..."); + written = fwrite(m_objects.bounds.data(), sizeof(Rect), m_objects.bounds.size(), file); + if (written != ObjectCount()) + Fatal("Only wrote %u objects!", written); + + + + int err = fclose(file); + if (err != 0) + Fatal("Failed to close file \"%s\" - %s", filename.c_str(), strerror(err)); + + Debug("Successfully saved %u objects to \"%s\"", ObjectCount(), filename.c_str()); +} + void Document::Load(const string & filename) { m_objects.bounds.clear(); m_count = 0; if (filename == "") + { + Debug("Loaded empty document."); return; + } + Debug("Loading document from file \"%s\"", filename.c_str()); + FILE * file = fopen(filename.c_str(), "r"); + if (file == NULL) + Fatal("Couldn't open file \"%s\"", filename.c_str(), strerror(errno)); + + size_t read; + read = fread(&m_count, sizeof(m_count), 1, file); + if (read != 1) + Fatal("Failed to read number of objects!"); + Debug("Number of objects: %u", ObjectCount()); + + m_objects.types.resize(ObjectCount()); + m_objects.bounds.resize(ObjectCount()); + + Debug("Object types..."); + read = fread(m_objects.types.data(), sizeof(ObjectType), m_objects.types.size(), file); + if (read != ObjectCount()) + Fatal("Only read %u objects!", read); + + Debug("Object bounds..."); + read = fread(m_objects.bounds.data(), sizeof(Rect), m_objects.bounds.size(), file); + if (read != ObjectCount()) + Fatal("Only read %u objects!", read); + + Debug("Successfully loaded %u objects from \"%s\"", ObjectCount(), filename.c_str()); } -void Document::Add(Real x, Real y, Real w, Real h) +void Document::Add(ObjectType type, const Rect & bounds) { - m_objects.bounds.push_back(Rect(x, y, w, h)); + m_objects.types.push_back(type); + m_objects.bounds.push_back(bounds); m_count++; } + +void Document::DebugDumpObjects() +{ + Debug("Objects for Document %p are:", this); + for (unsigned id = 0; id < ObjectCount(); ++id) + { + Debug("%u. \tType: %u\tBounds: %s", id, m_objects.types[id], m_objects.bounds[id].Str().c_str()); + } +} + +bool Document::operator==(const Document & equ) const +{ + return (ObjectCount() == equ.ObjectCount() && memcmp(m_objects.bounds.data(), equ.m_objects.bounds.data(), ObjectCount() * sizeof(Rect)) == 0); +}