Skip to content

Commit

Permalink
DIRECTOR: Add initial for support DIB resource
Browse files Browse the repository at this point in the history
  • Loading branch information
Iskrich authored and sev- committed Aug 3, 2016
1 parent 14450b0 commit 2d7d95b
Show file tree
Hide file tree
Showing 5 changed files with 187 additions and 5 deletions.
108 changes: 108 additions & 0 deletions engines/director/dib.cpp
@@ -0,0 +1,108 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/

#include "director/dib.h"

#include "common/stream.h"
#include "common/substream.h"
#include "common/textconsole.h"
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
#include "image/codecs/codec.h"
#include "common/debug.h"

namespace Director {

DIBDecoder::DIBDecoder() {
_surface = 0;
_palette = 0;
_paletteColorCount = 0;
_codec = 0;
}

DIBDecoder::~DIBDecoder() {
destroy();
}

void DIBDecoder::destroy() {
_surface = 0;

delete[] _palette;
_palette = 0;

_paletteColorCount = 0;

delete _codec;
_codec = 0;
}

void DIBDecoder::loadPalette(Common::SeekableReadStream &stream) {
uint16 palentries = 256;
_palette = new byte[1024];

uint16 size = stream.size();
uint16 index = 0;
for (int i = 6; i < stream.size() + 6; i+=6) {
uint16 n = size - i;
if (i >= palentries) {
break;
}
stream.seek(n + 4);
_palette[index] = stream.readByte();
++index;
stream.seek(n + 2);
_palette[index] = stream.readByte();
++index;
stream.seek(n);
_palette[index] = stream.readByte();
++index;
_palette[index] = 0;
++index;
}
while (index < 1024) {
_palette[index] = 0;
++index;
}
}

bool DIBDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
if (stream.readByte() != 40)
return false;
if (stream.readByte() != 0)
return false;

stream.seek(4);
uint16 width = stream.readUint32LE();
uint16 height = stream.readUint32LE();
_paletteColorCount = (stream.readUint32LE() + stream.readUint32LE()) << 8;
_paletteColorCount = (_paletteColorCount == 0) ? 255: _paletteColorCount;
uint16 totalsize = 14 + stream.size() + sizeof(_palette)/sizeof(byte);

debug("%d", _paletteColorCount);
debug("%d", width);
debug("%d", height);
debug("%d", totalsize);
return true;
}

} // End of namespace Director
74 changes: 74 additions & 0 deletions engines/director/dib.h
@@ -0,0 +1,74 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/

/**
* @file
* Image decoder used in engines:
* - hugo
* - mohawk
* - wintermute
*/

#ifndef IMAGE_BMP_H
#define IMAGE_BMP_H

#include "common/scummsys.h"
#include "common/str.h"
#include "image/image_decoder.h"

namespace Common {
class SeekableReadStream;
}

namespace Graphics {
struct Surface;
}

namespace Image {
class Codec;
}

namespace Director {

class DIBDecoder : public Image::ImageDecoder {
public:
DIBDecoder();
virtual ~DIBDecoder();

// ImageDecoder API
void destroy();
virtual bool loadStream(Common::SeekableReadStream &stream);
virtual const Graphics::Surface *getSurface() const { return _surface; }
const byte *getPalette() const { return _palette; }
void loadPalette(Common::SeekableReadStream &stream);
uint16 getPaletteColorCount() const { return _paletteColorCount; }

private:
Image::Codec *_codec;
const Graphics::Surface *_surface;
byte *_palette;
uint8 _paletteColorCount;
};

} // End of namespace Director

#endif
1 change: 1 addition & 0 deletions engines/director/director.cpp
Expand Up @@ -30,6 +30,7 @@
#include "common/stream.h"
#include "common/system.h"
#include "common/textconsole.h"
#include "director/dib.h"

#include "director/director.h"
#include "director/resource.h"
Expand Down
4 changes: 2 additions & 2 deletions engines/director/module.mk
Expand Up @@ -3,8 +3,8 @@ MODULE := engines/director
MODULE_OBJS = \
detection.o \
director.o \
resource.o

resource.o \
dib.o
# This module can be built as a plugin
ifeq ($(ENABLE_DIRECTOR), DYNAMIC_PLUGIN)
PLUGIN := 1
Expand Down
5 changes: 2 additions & 3 deletions engines/director/resource.cpp
Expand Up @@ -235,9 +235,9 @@ bool RIFFArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
uint32 cftcSize = stream->readUint32LE();
uint32 startPos = stream->pos();
stream->readUint32LE(); // unknown (always 0?)

while ((uint32)stream->pos() < startPos + cftcSize) {
uint32 tag = convertTagToUppercase(stream->readUint32BE());

uint32 size = stream->readUint32LE();
uint32 id = stream->readUint32LE();
uint32 offset = stream->readUint32LE();
Expand Down Expand Up @@ -270,8 +270,7 @@ Common::SeekableReadStream *RIFFArchive::getResource(uint32 tag, uint16 id) {

// Adjust to skip the resource header
uint32 offset = res.offset + 12;
uint32 size = res.size - 12;

uint32 size = res.size - 4;
// Skip the Pascal string
_stream->seek(offset);
byte stringSize = _stream->readByte() + 1; // 1 for this byte
Expand Down

0 comments on commit 2d7d95b

Please sign in to comment.