bool MacResExtractor::extractResource(int id, CachedCursor *cc) { // Create the MacResManager if not created already if (_resMgr == NULL) { _resMgr = new Common::MacResManager(); if (!_resMgr->open(_vm->generateFilename(-3))) error("Cannot open file %s", _fileName.c_str()); } Common::SeekableReadStream *dataStream = _resMgr->getResource('crsr', id + 1000); if (!dataStream) return false; // If we don't have a cursor palette, force monochrome cursors bool forceMonochrome = !_vm->_system->hasFeature(OSystem::kFeatureCursorPalette); Graphics::MacCursor *macCursor = new Graphics::MacCursor(); if (!macCursor->readFromStream(*dataStream, forceMonochrome)) { delete dataStream; delete macCursor; return false; } cc->bitmap = new byte[macCursor->getWidth() * macCursor->getHeight()]; cc->width = macCursor->getWidth(); cc->height = macCursor->getHeight(); cc->hotspotX = macCursor->getHotspotX(); cc->hotspotY = macCursor->getHotspotY(); if (forceMonochrome) { // Convert to the SCUMM palette const byte *srcBitmap = macCursor->getSurface(); for (int i = 0; i < macCursor->getWidth() * macCursor->getHeight(); i++) { if (srcBitmap[i] == macCursor->getKeyColor()) // Transparent cc->bitmap[i] = 255; else if (srcBitmap[i] == 0) // Black cc->bitmap[i] = 253; else // White cc->bitmap[i] = 254; } } else { // Copy data and palette // Sanity check. This code assumes that the key color is the same assert(macCursor->getKeyColor() == 255); memcpy(cc->bitmap, macCursor->getSurface(), macCursor->getWidth() * macCursor->getHeight()); cc->palette = new byte[256 * 3]; cc->palSize = 256; memcpy(cc->palette, macCursor->getPalette(), 256 * 3); } delete macCursor; delete dataStream; return true; }
void CursorManager::setMacCursor(Common::SeekableReadStream *stream) { assert(stream); Graphics::MacCursor *macCursor = new Graphics::MacCursor(); if (!macCursor->readFromStream(*stream)) error("Could not parse Mac cursor"); CursorMan.replaceCursor(macCursor->getSurface(), macCursor->getWidth(), macCursor->getHeight(), macCursor->getHotspotX(), macCursor->getHotspotY(), macCursor->getKeyColor()); CursorMan.replaceCursorPalette(macCursor->getPalette(), 0, 256); delete macCursor; delete stream; }