From 6143fe965bb5332d8f32709ff1cce3624cd0e51d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 5 Mar 2011 13:36:55 -0500 Subject: GRAPHICS: Add support for PE cursors in WinCursorGroup Only 1bpp still --- graphics/wincursor.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ graphics/wincursor.h | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/graphics/wincursor.cpp b/graphics/wincursor.cpp index 68b4023c0a..8690e1b18f 100644 --- a/graphics/wincursor.cpp +++ b/graphics/wincursor.cpp @@ -29,6 +29,7 @@ #include "common/str.h" #include "common/stream.h" #include "common/winexe_ne.h" +#include "common/winexe_pe.h" #include "graphics/wincursor.h" @@ -232,4 +233,67 @@ WinCursorGroup *WinCursorGroup::createCursorGroup(Common::NEResources &exe, cons return group; } +WinCursorGroup *WinCursorGroup::createCursorGroup(Common::PEResources &exe, const Common::WinResourceID &id) { + Common::SeekableReadStream *stream = exe.getResource(Common::kPEGroupCursor, id); + + if (!stream || stream->size() <= 6) + return 0; + + stream->skip(4); + uint32 cursorCount = stream->readUint16LE(); + if ((uint32)stream->size() < (6 + cursorCount * 16)) + return 0; + + WinCursorGroup *group = new WinCursorGroup(); + group->cursors.reserve(cursorCount); + + for (uint32 i = 0; i < cursorCount; i++) { + stream->readUint16LE(); // width + stream->readUint16LE(); // height + + // Plane count + if (stream->readUint16LE() != 1) { + delete stream; + delete group; + return 0; + } + + // Bit count + if (stream->readUint16LE() != 1) { + delete stream; + delete group; + return 0; + } + + stream->readUint32LE(); // data size + uint32 cursorId = stream->readUint32LE(); + + Common::SeekableReadStream *cursorStream = exe.getResource(Common::kPECursor, cursorId); + if (!cursorStream) { + delete stream; + delete group; + return 0; + } + + WinCursor *cursor = new WinCursor(); + if (!cursor->readFromStream(*cursorStream)) { + delete stream; + delete cursorStream; + delete cursor; + delete group; + return 0; + } + + delete cursorStream; + + CursorItem item; + item.id = cursorId; + item.cursor = cursor; + group->cursors.push_back(item); + } + + delete stream; + return group; +} + } // End of namespace Graphics diff --git a/graphics/wincursor.h b/graphics/wincursor.h index 3e2fc55bb8..b89bda9cd4 100644 --- a/graphics/wincursor.h +++ b/graphics/wincursor.h @@ -86,7 +86,7 @@ struct WinCursorGroup { Common::Array cursors; static WinCursorGroup *createCursorGroup(Common::NEResources &exe, const Common::WinResourceID &id); - //static WinCursorGroup *createCursorGroup(Common::PEResources &exe, const Common::WinResourceID &id); + static WinCursorGroup *createCursorGroup(Common::PEResources &exe, const Common::WinResourceID &id); }; } // End of namespace Graphics -- cgit v1.2.3