Remove 2GB limit for XTC files
This commit is contained in:
@@ -12,9 +12,25 @@
|
||||
#include <Logging.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
|
||||
namespace xtc {
|
||||
|
||||
namespace {
|
||||
|
||||
bool canSeekToOffset(const uint64_t offset) {
|
||||
return offset <= static_cast<uint64_t>(std::numeric_limits<size_t>::max());
|
||||
}
|
||||
|
||||
bool seekToOffset(FsFile& file, const uint64_t offset) {
|
||||
if (!canSeekToOffset(offset)) {
|
||||
return false;
|
||||
}
|
||||
return file.seek(static_cast<size_t>(offset));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
XtcParser::XtcParser()
|
||||
: m_isOpen(false),
|
||||
m_defaultWidth(DISPLAY_WIDTH),
|
||||
@@ -186,7 +202,7 @@ XtcError XtcParser::readPageTable() {
|
||||
return XtcError::READ_ERROR;
|
||||
}
|
||||
|
||||
m_pageTable[i].offset = static_cast<uint32_t>(entry.dataOffset);
|
||||
m_pageTable[i].offset = entry.dataOffset;
|
||||
m_pageTable[i].size = entry.dataSize;
|
||||
m_pageTable[i].width = entry.width;
|
||||
m_pageTable[i].height = entry.height;
|
||||
@@ -331,8 +347,8 @@ size_t XtcParser::loadPage(uint32_t pageIndex, uint8_t* buffer, size_t bufferSiz
|
||||
const PageInfo& page = m_pageTable[pageIndex];
|
||||
|
||||
// Seek to page data
|
||||
if (!m_file.seek(page.offset)) {
|
||||
LOG_DBG("XTC", "Failed to seek to page %u at offset %lu", pageIndex, page.offset);
|
||||
if (!seekToOffset(m_file, page.offset)) {
|
||||
LOG_DBG("XTC", "Failed to seek to page %u at offset %llu", pageIndex, static_cast<unsigned long long>(page.offset));
|
||||
m_lastError = XtcError::READ_ERROR;
|
||||
return 0;
|
||||
}
|
||||
@@ -399,7 +415,8 @@ XtcError XtcParser::loadPageStreaming(uint32_t pageIndex,
|
||||
const PageInfo& page = m_pageTable[pageIndex];
|
||||
|
||||
// Seek to page data
|
||||
if (!m_file.seek(page.offset)) {
|
||||
if (!seekToOffset(m_file, page.offset)) {
|
||||
LOG_DBG("XTC", "Failed to seek to page %u at offset %llu", pageIndex, static_cast<unsigned long long>(page.offset));
|
||||
return XtcError::READ_ERROR;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,15 +86,15 @@ struct XtgPageHeader {
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
// Page information (internal use, optimized for memory)
|
||||
// Page information (internal use)
|
||||
struct PageInfo {
|
||||
uint32_t offset; // File offset to page data (max 4GB file size)
|
||||
uint64_t offset; // File offset to page data
|
||||
uint32_t size; // Data size (bytes)
|
||||
uint16_t width; // Page width
|
||||
uint16_t height; // Page height
|
||||
uint8_t bitDepth; // 1 = XTG (1-bit), 2 = XTH (2-bit grayscale)
|
||||
uint8_t padding; // Alignment padding
|
||||
}; // 16 bytes total
|
||||
}; // 20 bytes total
|
||||
|
||||
struct ChapterInfo {
|
||||
std::string name;
|
||||
|
||||
Reference in New Issue
Block a user