Ticket #1981: smush2.patch

File smush2.patch, 3.3 KB (added by fingolfin, 19 years ago)
  • chunk.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/smush/chunk.cpp,v
    retrieving revision 1.36
    diff -u -d -r1.36 chunk.cpp
     
    8585        return true;
    8686}
    8787
    88 FileChunk::FileChunk(const Common::String &name, int offset)
    89         : _name(name) {
    90         if (!g_scumm->openFile(_data, name.c_str()))
     88FileChunk::FileChunk(ScummFile *data, int offset) {
     89        _data = data;
     90        _deleteData = false;
     91
     92        _data->seek(offset, seek_start);
     93        _type = _data->readUint32BE();
     94        _size = _data->readUint32BE();
     95        _offset = _data->pos();
     96        _curPos = 0;
     97}
     98
     99FileChunk::FileChunk(const Common::String &name, int offset) {
     100        _data = new ScummFile();
     101        _deleteData = true;
     102        if (!g_scumm->openFile(*_data, name.c_str()))
    91103                error("FileChunk: Unable to open file %s", name.c_str());
    92104
    93         _data.seek(offset);
    94         _type = _data.readUint32BE();
    95         _size = _data.readUint32BE();
    96         _offset = _data.pos();
     105        _data->seek(offset, seek_start);
     106        _type = _data->readUint32BE();
     107        _size = _data->readUint32BE();
     108        _offset = _data->pos();
    97109        _curPos = 0;
    98110}
    99111
    100112FileChunk::~FileChunk() {
     113        if (_deleteData)
     114                delete _data;
    101115}
    102116
    103117Chunk *FileChunk::subBlock() {
    104         FileChunk *ptr = new FileChunk(_name, _offset + _curPos);
    105         _data.seek(_offset + _curPos + sizeof(Chunk::type) + sizeof(uint32));
     118        FileChunk *ptr = new FileChunk(_data, _offset + _curPos);
     119        _data->seek(_offset + _curPos + sizeof(Chunk::type) + sizeof(uint32) + ptr->getSize());
    106120        seek(sizeof(Chunk::type) + sizeof(uint32) + ptr->getSize());
    107121        return ptr;
    108122}
     
    111125        if (size <= 0 || (_curPos + size) > _size)
    112126                error("invalid buffer read request");
    113127
    114 //      _data.seek(_offset + _curPos);
    115         _data.read(buffer, size);
     128        _data->seek(_offset + _curPos);
     129        _data->read(buffer, size);
    116130        _curPos += size;
    117131        return true;
    118132}
     
    122136}
    123137
    124138byte FileChunk::getByte() {
    125 //      _data.seek(_offset + _curPos);
     139        _data->seek(_offset + _curPos);
    126140        _curPos++;
    127141
    128142        if (_curPos > _size)
    129143                error("invalid byte read request");
    130144
    131         return _data.readByte();
     145        return _data->readByte();
    132146}
    133147
    134148int16 FileChunk::getShort() {
     
    136150}
    137151
    138152uint16 FileChunk::getWord() {
    139 //      _data.seek(_offset + _curPos);
     153        _data->seek(_offset + _curPos);
    140154        _curPos += 2;
    141155
    142156        if (_curPos > _size)
    143157                error("invalid word read request");
    144158
    145         return _data.readUint16LE();
     159        return _data->readUint16LE();
    146160}
    147161
    148162uint32 FileChunk::getDword() {
    149 //      _data.seek(_offset + _curPos);
     163        _data->seek(_offset + _curPos);
    150164        _curPos += 4;
    151165
    152166        if (_curPos > _size)
    153167                error("invalid dword read request");
    154168
    155         return _data.readUint32LE();
     169        return _data->readUint32LE();
    156170}
    157171
    158172MemoryChunk::MemoryChunk(byte *data) {
  • chunk.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/smush/chunk.h,v
    retrieving revision 1.19
    diff -u -d -r1.19 chunk.h
     
    6969
    7070class FileChunk : public BaseChunk {
    7171private:
    72         Common::String _name;
    73         ScummFile _data;
     72        ScummFile *_data;
     73        bool _deleteData;
    7474        uint32 _offset;
    7575
     76        FileChunk(ScummFile *data, int offset);
    7677public:
    7778        FileChunk(const Common::String &name, int offset = 0);
    7879        virtual ~FileChunk();