#include #include "img.h" #include "subfile.h" bool SubFile::seek(Handle &handle, quint32 pos) const { if (_file) return _file->seek(pos); else { quint32 blockSize = _img->blockSize(); int blockNum = pos / blockSize; if (handle.blockNum != blockNum) { if (blockNum >= _blocks->size()) return false; if (!_img->readBlock(_blocks->at(blockNum), handle.data)) return false; handle.blockNum = blockNum; } handle.blockPos = pos % blockSize; handle.pos = pos; return true; } } bool SubFile::readByte(Handle &handle, quint8 &val) const { if (_file) return _file->getChar((char*)&val); else { val = handle.data.at(handle.blockPos++); handle.pos++; return (handle.blockPos >= _img->blockSize()) ? seek(handle, handle.pos) : true; } } bool SubFile::readVUInt32(Handle &hdl, quint32 &val) const { quint8 bytes, shift, b; if (!readByte(hdl, b)) return false; if ((b & 1) == 0) { if ((b & 2) == 0) { bytes = ((b >> 2) & 1) ^ 3; shift = 5; } else { shift = 6; bytes = 1; } } else { shift = 7; bytes = 0; } val = b >> (8 - shift); for (int i = 1; i <= bytes; i++) { if (!readByte(hdl, b)) return false; val |= (((quint32)b) << (i * 8)) >> (8 - shift); } return true; } QString SubFile::fileName() const { return _file ? _file->fileName() : _img->fileName(); }