aboutsummaryrefslogtreecommitdiff
path: root/common/winexe_ne.cpp
diff options
context:
space:
mode:
authorMatthew Hoops2011-03-04 23:17:57 -0500
committerMatthew Hoops2011-03-04 23:17:57 -0500
commitc66233f83e2d86b72f45aff20fb3198976850e42 (patch)
tree23d5e007641fe950eea3d89fc0b538902699c36f /common/winexe_ne.cpp
parent550cff84f81f016a2b54700e170b4cd9712793f3 (diff)
downloadscummvm-rg350-c66233f83e2d86b72f45aff20fb3198976850e42.tar.gz
scummvm-rg350-c66233f83e2d86b72f45aff20fb3198976850e42.tar.bz2
scummvm-rg350-c66233f83e2d86b72f45aff20fb3198976850e42.zip
GRAPHICS: Split the NE cursor code from the NEResources class
Now the code lies in Graphics and all cursors are not cached upon opening an exe. The engine is now in charge of caching which cursors it wants.
Diffstat (limited to 'common/winexe_ne.cpp')
-rw-r--r--common/winexe_ne.cpp277
1 files changed, 0 insertions, 277 deletions
diff --git a/common/winexe_ne.cpp b/common/winexe_ne.cpp
index 3149528566..eedda1ec66 100644
--- a/common/winexe_ne.cpp
+++ b/common/winexe_ne.cpp
@@ -32,153 +32,6 @@
namespace Common {
-NECursor::NECursor() {
- _width = 0;
- _height = 0;
- _hotspotX = 0;
- _hotspotY = 0;
- _surface = 0;
- _keyColor = 0;
- memset(_palette, 0, 256 * 3);
-}
-
-NECursor::~NECursor() {
- clear();
-}
-
-uint16 NECursor::getWidth() const {
- return _width;
-}
-
-uint16 NECursor::getHeight() const {
- return _height;
-}
-
-uint16 NECursor::getHotspotX() const {
- return _hotspotX;
-}
-
-uint16 NECursor::getHotspotY() const {
- return _hotspotY;
-}
-
-byte NECursor::getKeyColor() const {
- return _keyColor;
-}
-
-void NECursor::setDimensions(uint16 width, uint16 height) {
- _width = width;
- _height = height;
-}
-
-void NECursor::setHotspot(uint16 x, uint16 y) {
- _hotspotX = x;
- _hotspotY = y;
-}
-
-bool NECursor::readCursor(SeekableReadStream &stream, uint32 count) {
- clear();
-
- SeekableReadStream *bitmap = stream.readStream(count);
- _surface = new byte[_width * _height];
-
- uint32 width = _width;
- uint32 height = _height * 2;
-
- // Sanity checks
- assert((width > 0) && (height > 0));
-
- // Check header size
- if (bitmap->readUint32LE() != 40)
- return false;
-
- // Check dimensions
- if (bitmap->readUint32LE() != width)
- return false;
- if (bitmap->readUint32LE() != height)
- return false;
-
- // Color planes
- if (bitmap->readUint16LE() != 1)
- return false;
- // Bits per pixel
- if (bitmap->readUint16LE() != 1)
- return false;
- // Compression
- if (bitmap->readUint32LE() != 0)
- return false;
-
- // Image size + X resolution + Y resolution
- bitmap->skip(12);
-
- uint32 numColors = bitmap->readUint32LE();
-
- if (numColors == 0)
- numColors = 2;
- else if (numColors > 2)
- return false;
-
- // Assert that enough data is there for the whole cursor
- if ((uint32)bitmap->size() < 40 + numColors * 4 + width * height / 8)
- return false;
-
- // Height includes AND-mask and XOR-mask
- height /= 2;
-
- // Standard palette: transparent, black, white
- _palette[6] = 0xff;
- _palette[7] = 0xff;
- _palette[8] = 0xff;
-
- // Reading the palette
- bitmap->seek(40);
- for (uint32 i = 0 ; i < numColors; i++) {
- _palette[(i + 1) * 3 + 2] = bitmap->readByte();
- _palette[(i + 1) * 3 + 1] = bitmap->readByte();
- _palette[(i + 1) * 3 + 0] = bitmap->readByte();
- bitmap->readByte();
- }
-
- // Reading the bitmap data
- uint32 dataSize = bitmap->size() - 40 - numColors * 4;
- byte *initialSource = new byte[dataSize];
- bitmap->read(initialSource, dataSize);
- const byte *srcP = initialSource;
- const byte *srcM = srcP + ((width * height) / 8);
- byte *dest = _surface + width * (height - 1);
-
- for (uint32 i = 0; i < height; i++) {
- byte *rowDest = dest;
-
- for (uint32 j = 0; j < (width / 8); j++) {
- byte p = srcP[j];
- byte m = srcM[j];
-
- for (int k = 0; k < 8; k++, rowDest++, p <<= 1, m <<= 1) {
- if ((m & 0x80) != 0x80) {
- if ((p & 0x80) == 0x80)
- *rowDest = 2;
- else
- *rowDest = 1;
- } else
- *rowDest = _keyColor;
- }
- }
-
- dest -= width;
- srcP += width / 8;
- srcM += width / 8;
- }
-
- delete bitmap;
- delete[] initialSource;
- return true;
-}
-
-void NECursor::clear() {
- delete[] _surface; _surface = 0;
-}
-
NEResources::NEResources() {
_exe = 0;
}
@@ -194,16 +47,6 @@ void NEResources::clear() {
}
_resources.clear();
-
- for (uint32 i = 0; i < _cursors.size(); i++)
- for (uint32 j = 0; j < _cursors[i].cursors.size(); j++)
- delete _cursors[i].cursors[j];
-
- _cursors.clear();
-}
-
-const Array<NECursorGroup> &NEResources::getCursors() const {
- return _cursors;
}
bool NEResources::loadFromEXE(const String &fileName) {
@@ -237,9 +80,6 @@ bool NEResources::loadFromEXE(SeekableReadStream *stream) {
if (!readResourceTable(offsetResourceTable))
return false;
- if (!readCursors())
- return false;
-
return true;
}
@@ -444,121 +284,4 @@ const Array<WinResourceID> NEResources::getIDList(uint16 type) const {
return idArray;
}
-bool NEResources::readCursors() {
- uint32 cursorCount = 0;
-
- for (List<Resource>::const_iterator it = _resources.begin(); it != _resources.end(); ++it)
- if (it->type == kNEGroupCursor)
- cursorCount++;
-
- if (cursorCount == 0) {
- _cursors.clear();
- return true;
- }
-
- _cursors.resize(cursorCount);
-
- Array<NECursorGroup>::iterator cursorGroup = _cursors.begin();
- for (List<Resource>::const_iterator it = _resources.begin(); it != _resources.end(); ++it) {
- if (it->type == kNEGroupCursor) {
- if (!readCursorGroup(*cursorGroup, *it))
- return false;
-
- ++cursorGroup;
- }
- }
-
- return true;
-}
-
-bool NEResources::readCursorGroup(NECursorGroup &group, const Resource &resource) {
- if (!_exe)
- return false;
-
- if (resource.size <= 6)
- return false;
-
- if (!_exe->seek(resource.offset))
- return false;
-
- byte *data = new byte[resource.size];
-
- if (!_exe->read(data, resource.size)) {
- delete[] data;
- return false;
- }
-
- uint32 cursorCount = READ_LE_UINT16(data + 4);
- if (resource.size < (6 + cursorCount * 16)) {
- delete[] data;
- return false;
- }
-
- group.cursors.resize(cursorCount);
-
- uint32 offset = 6;
- for (uint32 i = 0; i < cursorCount; i++) {
- group.cursors[i] = new NECursor();
- NECursor *cursor = group.cursors[i];
-
- // Plane count
- if (READ_LE_UINT16(data + offset + 4) != 1) {
- delete[] data;
- return false;
- }
-
- // Bit count
- if (READ_LE_UINT16(data + offset + 6) != 1) {
- delete[] data;
- return false;
- }
-
- uint32 id = READ_LE_UINT32(data + offset + 12);
- const Resource *cursorResource = findResource(kNECursor, id);
- if (!cursorResource) {
- delete[] data;
- return false;
- }
-
- cursor->setDimensions(READ_LE_UINT16(data + offset), READ_LE_UINT16(data + offset + 2) / 2);
-
- uint32 dataSize = READ_LE_UINT32(data + offset + 8);
- if (!readCursor(*cursor, *cursorResource, dataSize)) {
- delete[] data;
- return false;
- }
-
- offset += 16;
- }
-
- group.id = resource.id;
-
- delete[] data;
- return true;
-}
-
-bool NEResources::readCursor(NECursor &cursor, const Resource &resource, uint32 size) {
- if (!_exe)
- return false;
-
- if (size <= 4)
- return false;
- if (resource.size < size)
- return false;
-
- if (!_exe->seek(resource.offset))
- return false;
-
- uint32 hotspotX = _exe->readUint16LE();
- uint32 hotspotY = _exe->readUint16LE();
- cursor.setHotspot(hotspotX, hotspotY);
-
- size -= 4;
-
- if (!cursor.readCursor(*_exe, size))
- return false;
-
- return true;
-}
-
} // End of namespace Common