Common::SeekableReadStream *PEFile::getResource(uint32 index, bool UNUSED(tryNoCopy)) const { // Convert from the PE cursor group/cursor format to the standalone // cursor format. Common::MemoryWriteStreamDynamic out; Common::SeekableReadStream *cursorGroup = _peFile->getResource(Common::kPEGroupCursor, index); if (!cursorGroup) throw Common::Exception("No such PE resource %u", index); // Cursor Group Header out.writeUint16LE(cursorGroup->readUint16LE()); out.writeUint16LE(cursorGroup->readUint16LE()); uint16 cursorCount = cursorGroup->readUint16LE(); out.writeUint16LE(cursorCount); std::vector<Common::SeekableReadStream *> cursorStreams; cursorStreams.resize(cursorCount); uint32 startOffset = 6 + cursorCount * 16; for (uint16 i = 0; i < cursorCount; i++) { out.writeByte(cursorGroup->readUint16LE()); // width out.writeByte(cursorGroup->readUint16LE() / 2); // height cursorGroup->readUint16LE(); // planes out.writeByte(cursorGroup->readUint16LE()); // bits per pixel out.writeByte(0); // reserved cursorGroup->readUint32LE(); // data size uint16 id = cursorGroup->readUint16LE(); Common::SeekableReadStream *cursor = _peFile->getResource(Common::kPECursor, id); if (!cursor) { delete cursorGroup; throw Common::Exception("Could not get cursor resource %d", id); } out.writeUint16LE(cursor->readUint16LE()); // hotspot X out.writeUint16LE(cursor->readUint16LE()); // hotspot Y out.writeUint32LE(cursor->size() - 4); // size out.writeUint32LE(startOffset); // offset startOffset += cursor->size() - 4; cursorStreams[i] = cursor; } for (uint32 i = 0; i < cursorStreams.size(); i++) { byte *data = new byte[cursorStreams[i]->size() - 4]; cursorStreams[i]->read(data, cursorStreams[i]->size() - 4); out.write(data, cursorStreams[i]->size() - 4); delete[] data; delete cursorStreams[i]; } delete cursorGroup; return new Common::MemoryReadStream(out.getData(), out.size(), true); }
void MystScriptParser::o_changeBackgroundSound(uint16 var, const ArgumentsArray &args) { soundWaitStop(); // Used on Stoneship Card 2080 // Used on Channelwood Card 3225 with argc = 8 i.e. Conditional Sound List Common::MemoryWriteStreamDynamic writeStream = Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES); for (uint i = 0; i < args.size(); i++) { writeStream.writeUint16LE(args[i]); } Common::MemoryReadStream readStream = Common::MemoryReadStream(writeStream.getData(), writeStream.size()); MystSoundBlock soundBlock = _vm->readSoundBlock(&readStream); _vm->applySoundBlock(soundBlock); }