From f252c0b67ef74da5376fcf3a08d514fb311c4316 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 14 Aug 2010 04:21:09 +0000 Subject: SCI: Add support for Mac 'crsr' cursors used in SCI2+ games svn-id: r52076 --- engines/sci/graphics/cursor.cpp | 63 ++++++++++++++++++++++++----------------- engines/sci/resource.cpp | 18 ++++++++---- 2 files changed, 49 insertions(+), 32 deletions(-) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index f6e2077cb3..a906899113 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -23,10 +23,11 @@ * */ -#include "graphics/cursorman.h" -#include "common/util.h" #include "common/events.h" +#include "common/macresman.h" #include "common/system.h" +#include "common/util.h" +#include "graphics/cursorman.h" #include "sci/sci.h" #include "sci/event.h" @@ -206,7 +207,7 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu // See http://developer.apple.com/legacy/mac/library/documentation/mac/QuickDraw/QuickDraw-402.html // for more information. - // View 998 seems to be a fake resource used to call for the Mac CURS resources. + // View 998 seems to be a fake resource used to call for Mac cursor resources. // For other resources, they're still in the views, so use them. if (viewNum != 998) { kernelSetView(viewNum, loopNum, celNum, hotspot); @@ -214,43 +215,53 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu } // TODO: What about the 2000 resources? Inventory items? How to handle? - // TODO: What games does this work for? At least it does for KQ6. - // TODO: Stop asking rhetorical questions. - // TODO: It was fred all along! + // TODO: 1000 + celNum won't work for GK1 Resource *resource = _resMan->findResource(ResourceId(kResourceTypeCursor, 1000 + celNum), false); if (!resource) { - warning("CURS %d not found", 1000 + celNum); + warning("Mac cursor %d not found", 1000 + celNum); return; } assert(resource); - byte *cursorBitmap = new byte[16 * 16]; - byte *data = resource->data; + if (resource->size == 32 * 2 + 4) { + // Mac CURS cursor + byte *cursorBitmap = new byte[16 * 16]; + byte *data = resource->data; - // Get B&W data - for (byte i = 0; i < 32; i++) { - byte imageByte = *data++; - for (byte b = 0; b < 8; b++) - cursorBitmap[i * 8 + b] = (byte)((imageByte & (0x80 >> b)) > 0 ? 0x00 : 0xFF); - } + // Get B&W data + for (byte i = 0; i < 32; i++) { + byte imageByte = *data++; + for (byte b = 0; b < 8; b++) + cursorBitmap[i * 8 + b] = (byte)((imageByte & (0x80 >> b)) > 0 ? 0x00 : 0xFF); + } - // Apply mask data - for (byte i = 0; i < 32; i++) { - byte imageByte = *data++; - for (byte b = 0; b < 8; b++) - if ((imageByte & (0x80 >> b)) == 0) - cursorBitmap[i * 8 + b] = SCI_CURSOR_SCI0_TRANSPARENCYCOLOR; // Doesn't matter, just is transparent - } + // Apply mask data + for (byte i = 0; i < 32; i++) { + byte imageByte = *data++; + for (byte b = 0; b < 8; b++) + if ((imageByte & (0x80 >> b)) == 0) + cursorBitmap[i * 8 + b] = SCI_CURSOR_SCI0_TRANSPARENCYCOLOR; // Doesn't matter, just is transparent + } - uint16 hotspotX = READ_BE_UINT16(data); - uint16 hotspotY = READ_BE_UINT16(data + 2); + uint16 hotspotX = READ_BE_UINT16(data); + uint16 hotspotY = READ_BE_UINT16(data + 2); - CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, SCI_CURSOR_SCI0_TRANSPARENCYCOLOR); + CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, SCI_CURSOR_SCI0_TRANSPARENCYCOLOR); - delete[] cursorBitmap; + delete[] cursorBitmap; + } else { + // Mac crsr cursor + byte *cursorBitmap, *palette; + int width, height, hotspotX, hotspotY, palSize, keycolor; + Common::MacResManager::convertCrsrCursor(resource->data, resource->size, &cursorBitmap, &width, &height, &hotspotX, &hotspotY, &keycolor, true, &palette, &palSize); + CursorMan.replaceCursor(cursorBitmap, width, height, hotspotX, hotspotY, keycolor); + CursorMan.replaceCursorPalette(palette, 0, palSize); + free(cursorBitmap); + free(palette); + } kernelShow(); } diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index fe8922b852..00f50714af 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -365,8 +365,6 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc return NULL; } -static uint32 resTypeToMacTag(ResourceType type); - void ResourceManager::loadResource(Resource *res) { res->_source->loadResource(this, res); } @@ -382,8 +380,14 @@ void PatchResourceSource::loadResource(ResourceManager *resMan, Resource *res) { } } +static Common::Array resTypeToMacTags(ResourceType type); + void MacResourceForkResourceSource::loadResource(ResourceManager *resMan, Resource *res) { - Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->getNumber()); + Common::SeekableReadStream *stream = 0; + Common::Array tagArray = resTypeToMacTags(res->getType()); + + for (uint32 i = 0; i < tagArray.size() && !stream; i++) + stream = _macResMan->getResource(tagArray[i], res->getNumber()); if (!stream) error("Could not get Mac resource fork resource: %s %d", getResourceTypeName(res->getType()), res->getNumber()); @@ -1588,12 +1592,14 @@ struct { { MKID_BE('SYN '), kResourceTypeSync } }; -static uint32 resTypeToMacTag(ResourceType type) { +static Common::Array resTypeToMacTags(ResourceType type) { + Common::Array tags; + for (uint32 i = 0; i < ARRAYSIZE(macResTagMap); i++) if (macResTagMap[i].type == type) - return macResTagMap[i].tag; + tags.push_back(macResTagMap[i].tag); - return 0; + return tags; } void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { -- cgit v1.2.3