From d7dfbd4b78f594cc303ff4c4d18d039e472299df Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 6 Apr 2011 22:12:27 -0400 Subject: [PATCH 001/369] VIDEO: Allow MPEG-4 containers to be parsed --- video/qt_decoder.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index a277d6bbde2c..02c3c1373e9e 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -851,18 +851,16 @@ int QuickTimeDecoder::readHDLR(MOVatom atom) { _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags // component type - uint32 ctype = _fd->readUint32LE(); + uint32 ctype = _fd->readUint32BE(); uint32 type = _fd->readUint32BE(); // component subtype debug(0, "ctype= %s (0x%08lx)", tag2str(ctype), (long)ctype); debug(0, "stype= %s", tag2str(type)); - if(ctype == MKID_BE('mhlr')) // MOV + if (ctype == MKID_BE('mhlr')) // MOV debug(0, "MOV detected"); - else if(ctype == 0) { - warning("MP4 streams are not supported"); - return -1; - } + else if (ctype == 0) + debug(0, "MPEG-4 detected"); if (type == MKID_BE('vide')) st->codec_type = CODEC_TYPE_VIDEO; @@ -1326,7 +1324,10 @@ bool QuickTimeDecoder::checkAudioCodecSupport(uint32 tag) { return true; #endif - warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); + if (tag == MKID_BE('mp4a')) + warning("No MPEG-4 audio (AAC) support"); + else + warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); return false; } From 82a417b40c84416a9c55520ae0e3d5290a1e5553 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 6 Apr 2011 22:21:49 -0400 Subject: [PATCH 002/369] VIDEO: Fix broken for statement --- video/qt_decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 02c3c1373e9e..c9431fdbd8de 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -603,7 +603,7 @@ int QuickTimeDecoder::readDefault(MOVatom atom) { uint32 i = 0; for (; _parseTable[i].type != 0 && _parseTable[i].type != a.type; i++) - // empty; + ; // Empty if (a.size < 8) break; From b71d2038ae84aa7fd0ee0061f7ea504f35fbe23c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 6 Apr 2011 23:06:44 -0400 Subject: [PATCH 003/369] VIDEO: Begin splitting video-specific QuickTime sample description code --- video/qt_decoder.cpp | 68 ++++++++++++++++++++++++++------------------ video/qt_decoder.h | 21 +++++++++----- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index c9431fdbd8de..4c2374f89459 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -186,7 +186,7 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { _audioStartOffset = curVideoTime; // Re-create the audio stream - STSDEntry *entry = &_streams[_audioStreamIndex]->stsdEntries[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); // First, we need to track down what audio sample we need @@ -318,10 +318,10 @@ void QuickTimeDecoder::pauseVideoIntern(bool pause) { } Codec *QuickTimeDecoder::findDefaultVideoCodec() const { - if (_videoStreamIndex < 0 || !_streams[_videoStreamIndex]->stsdEntryCount) + if (_videoStreamIndex < 0 || _streams[_videoStreamIndex]->sampleDescs.empty()) return 0; - return _streams[_videoStreamIndex]->stsdEntries[0].videoCodec; + return ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[0])->videoCodec; } const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { @@ -341,11 +341,11 @@ const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { uint32 descId; Common::SeekableReadStream *frameData = getNextFramePacket(descId); - if (!frameData || !descId || descId > _streams[_videoStreamIndex]->stsdEntryCount) + if (!frameData || !descId || descId > _streams[_videoStreamIndex]->sampleDescs.size()) return 0; // Find which video description entry we want - STSDEntry *entry = &_streams[_videoStreamIndex]->stsdEntries[descId - 1]; + VideoSampleDesc *entry = (VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[descId - 1]; if (!entry->videoCodec) return 0; @@ -500,7 +500,7 @@ void QuickTimeDecoder::init() { // Initialize audio, if present if (_audioStreamIndex >= 0) { - STSDEntry *entry = &_streams[_audioStreamIndex]->stsdEntries[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; if (checkAudioCodecSupport(entry->codecTag)) { _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); @@ -518,8 +518,8 @@ void QuickTimeDecoder::init() { // Initialize video, if present if (_videoStreamIndex >= 0) { - for (uint32 i = 0; i < _streams[_videoStreamIndex]->stsdEntryCount; i++) { - STSDEntry *entry = &_streams[_videoStreamIndex]->stsdEntries[i]; + for (uint32 i = 0; i < _streams[_videoStreamIndex]->sampleDescs.size(); i++) { + VideoSampleDesc *entry = (VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[i]; entry->videoCodec = createCodec(entry->codecTag, entry->bitsPerSample & 0x1F); } @@ -916,12 +916,10 @@ int QuickTimeDecoder::readSTSD(MOVatom atom) { _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->stsdEntryCount = _fd->readUint32BE(); - st->stsdEntries = new STSDEntry[st->stsdEntryCount]; - - for (uint32 i = 0; i < st->stsdEntryCount; i++) { // Parsing Sample description table - STSDEntry *entry = &st->stsdEntries[i]; + uint32 entryCount = _fd->readUint32BE(); + st->sampleDescs.resize(entryCount); + for (uint32 i = 0; i < entryCount; i++) { // Parsing Sample description table MOVatom a = { 0, 0, 0 }; uint32 start_pos = _fd->pos(); int size = _fd->readUint32BE(); // size @@ -933,11 +931,14 @@ int QuickTimeDecoder::readSTSD(MOVatom atom) { debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), st->codec_type); - entry->codecTag = format; - if (st->codec_type == CODEC_TYPE_VIDEO) { debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); + VideoSampleDesc *entry = new VideoSampleDesc(); + st->sampleDescs[i] = entry; + + entry->codecTag = format; + _fd->readUint16BE(); // version _fd->readUint16BE(); // revision level _fd->readUint32BE(); // vendor @@ -1025,6 +1026,11 @@ int QuickTimeDecoder::readSTSD(MOVatom atom) { } else if (st->codec_type == CODEC_TYPE_AUDIO) { debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); + AudioSampleDesc *entry = new AudioSampleDesc(); + st->sampleDescs[i] = entry; + + entry->codecTag = format; + uint16 stsdVersion = _fd->readUint16BE(); _fd->readUint16BE(); // revision level _fd->readUint32BE(); // vendor @@ -1229,7 +1235,7 @@ int QuickTimeDecoder::readWAVE(MOVatom atom) { if (atom.size > (1 << 30)) return -1; - if (st->stsdEntries[0].codecTag == MKID_BE('QDM2')) // Read extradata for QDM2 + if (st->sampleDescs[0]->codecTag == MKID_BE('QDM2')) // Read extradata for QDM2 st->extradata = _fd->readStream(atom.size - 8); else if (atom.size > 8) return readDefault(atom); @@ -1336,7 +1342,7 @@ Audio::AudioStream *QuickTimeDecoder::createAudioStream(Common::SeekableReadStre if (!stream || _audioStreamIndex < 0) return NULL; - STSDEntry *entry = &_streams[_audioStreamIndex]->stsdEntries[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; if (entry->codecTag == MKID_BE('twos') || entry->codecTag == MKID_BE('raw ')) { // Fortunately, most of the audio used in Myst videos is raw... @@ -1381,7 +1387,7 @@ uint32 QuickTimeDecoder::getAudioChunkSampleCount(uint chunk) { } void QuickTimeDecoder::readNextAudioChunk() { - STSDEntry *entry = &_streams[_audioStreamIndex]->stsdEntries[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; Common::MemoryWriteStreamDynamic *wStream = new Common::MemoryWriteStreamDynamic(); _fd->seek(_streams[_audioStreamIndex]->chunk_offsets[_curAudioChunk]); @@ -1430,7 +1436,7 @@ void QuickTimeDecoder::updateAudioBuffer() { // If we're on the last frame, make sure all audio remaining is buffered numberOfChunksNeeded = _streams[_audioStreamIndex]->chunk_count; } else { - STSDEntry *entry = &_streams[_audioStreamIndex]->stsdEntries[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; // Calculate the amount of chunks we need in memory until the next frame uint32 timeToNextFrame = getTimeToNextFrame(); @@ -1453,24 +1459,30 @@ void QuickTimeDecoder::updateAudioBuffer() { readNextAudioChunk(); } -QuickTimeDecoder::STSDEntry::STSDEntry() { +QuickTimeDecoder::SampleDesc::SampleDesc() { codecTag = 0; bitsPerSample = 0; +} + +QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc() : SampleDesc() { memset(codecName, 0, 32); colorTableId = 0; palette = 0; videoCodec = 0; - channels = 0; - sampleRate = 0; - samplesPerFrame = 0; - bytesPerFrame = 0; } -QuickTimeDecoder::STSDEntry::~STSDEntry() { +QuickTimeDecoder::VideoSampleDesc::~VideoSampleDesc() { delete[] palette; delete videoCodec; } +QuickTimeDecoder::AudioSampleDesc::AudioSampleDesc() : SampleDesc() { + channels = 0; + sampleRate = 0; + samplesPerFrame = 0; + bytesPerFrame = 0; +} + QuickTimeDecoder::MOVStreamContext::MOVStreamContext() { chunk_count = 0; chunk_offsets = 0; @@ -1488,8 +1500,6 @@ QuickTimeDecoder::MOVStreamContext::MOVStreamContext() { width = 0; height = 0; codec_type = CODEC_TYPE_MOV_OTHER; - stsdEntryCount = 0; - stsdEntries = 0; editCount = 0; editList = 0; extradata = 0; @@ -1504,9 +1514,11 @@ QuickTimeDecoder::MOVStreamContext::~MOVStreamContext() { delete[] sample_to_chunk; delete[] sample_sizes; delete[] keyframes; - delete[] stsdEntries; delete[] editList; delete extradata; + + for (uint32 i = 0; i < sampleDescs.size(); i++) + delete sampleDescs[i]; } } // End of namespace Video diff --git a/video/qt_decoder.h b/video/qt_decoder.h index f11689e02106..6a0aa61b20f3 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -34,6 +34,7 @@ #ifndef VIDEO_QT_DECODER_H #define VIDEO_QT_DECODER_H +#include "common/array.h" #include "common/scummsys.h" #include "common/queue.h" #include "common/rational.h" @@ -156,20 +157,27 @@ class QuickTimeDecoder : public SeekableVideoDecoder { Common::Rational mediaRate; }; - struct STSDEntry { - STSDEntry(); - ~STSDEntry(); + struct SampleDesc { + SampleDesc(); + virtual ~SampleDesc() {} uint32 codecTag; uint16 bitsPerSample; + }; + + struct VideoSampleDesc : public SampleDesc { + VideoSampleDesc(); + ~VideoSampleDesc(); - // Video char codecName[32]; uint16 colorTableId; byte *palette; Codec *videoCodec; + }; + + struct AudioSampleDesc : public SampleDesc { + AudioSampleDesc(); - // Audio uint16 channels; uint32 sampleRate; uint32 samplesPerFrame; @@ -204,8 +212,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder { uint16 height; CodecType codec_type; - uint32 stsdEntryCount; - STSDEntry *stsdEntries; + Common::Array sampleDescs; uint32 editCount; EditListEntry *editList; From db71efd94f6c5454f6f06458a6b4d968dc61ffbd Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 00:21:48 -0400 Subject: [PATCH 004/369] VIDEO: Split the QuickTime parser from the QuickTime VideoDecoder --- common/module.mk | 1 + common/quicktime.cpp | 774 +++++++++++++++++++++++++++++++++++ common/quicktime.h | 202 +++++++++ video/qt_decoder.cpp | 952 ++++++------------------------------------- video/qt_decoder.h | 139 +------ 5 files changed, 1123 insertions(+), 945 deletions(-) create mode 100644 common/quicktime.cpp create mode 100644 common/quicktime.h diff --git a/common/module.mk b/common/module.mk index a57de6a4b8b5..5f6a52959562 100644 --- a/common/module.mk +++ b/common/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS := \ memorypool.o \ md5.o \ mutex.o \ + quicktime.o \ random.o \ rational.o \ str.o \ diff --git a/common/quicktime.cpp b/common/quicktime.cpp new file mode 100644 index 000000000000..d40f279f1559 --- /dev/null +++ b/common/quicktime.cpp @@ -0,0 +1,774 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// +// Heavily based on ffmpeg code. +// +// Copyright (c) 2001 Fabrice Bellard. +// First version by Francois Revol revol@free.fr +// Seek function by Gael Chardon gael.dev@4now.net +// + +#include "common/debug.h" +#include "common/endian.h" +#include "common/macresman.h" +#include "common/memstream.h" +#include "common/quicktime.h" +#include "common/util.h" +#include "common/zlib.h" + +namespace Common { + +//////////////////////////////////////////// +// QuickTimeParser +//////////////////////////////////////////// + +QuickTimeParser::QuickTimeParser() { + _beginOffset = 0; + _numStreams = 0; + _fd = 0; + _scaleFactorX = 1; + _scaleFactorY = 1; + _resFork = new Common::MacResManager(); + + initParseTable(); +} + +QuickTimeParser::~QuickTimeParser() { + close(); + delete _resFork; +} + +bool QuickTimeParser::loadFile(const Common::String &filename) { + if (!_resFork->open(filename) || !_resFork->hasDataFork()) + return false; + + _foundMOOV = false; + _numStreams = 0; + + MOVatom atom = { 0, 0, 0xffffffff }; + + if (_resFork->hasResFork()) { + // Search for a 'moov' resource + Common::MacResIDArray idArray = _resFork->getResIDArray(MKID_BE('moov')); + + if (!idArray.empty()) + _fd = _resFork->getResource(MKID_BE('moov'), idArray[0]); + + if (_fd) { + atom.size = _fd->size(); + if (readDefault(atom) < 0 || !_foundMOOV) + return false; + } + delete _fd; + + atom.type = 0; + atom.offset = 0; + atom.size = 0xffffffff; + } + + _fd = _resFork->getDataFork(); + + if (readDefault(atom) < 0 || !_foundMOOV) + return false; + + init(); + return true; +} + +bool QuickTimeParser::loadStream(Common::SeekableReadStream *stream) { + _fd = stream; + _foundMOOV = false; + _numStreams = 0; + + MOVatom atom = { 0, 0, 0xffffffff }; + + if (readDefault(atom) < 0 || !_foundMOOV) { + _fd = 0; + return false; + } + + init(); + return true; +} + +void QuickTimeParser::init() { + // Remove unknown/unhandled streams + for (uint32 i = 0; i < _numStreams;) { + if (_streams[i]->codec_type == CODEC_TYPE_MOV_OTHER) { + delete _streams[i]; + for (uint32 j = i + 1; j < _numStreams; j++) + _streams[j - 1] = _streams[j]; + _numStreams--; + } else + i++; + } + + // Adjust time/duration + for (uint32 i = 0; i < _numStreams; i++) { + MOVStreamContext *sc = _streams[i]; + + if (!sc->time_rate) + sc->time_rate = 1; + + if (!sc->time_scale) + sc->time_scale = _timeScale; + + sc->duration /= sc->time_rate; + } +} + +void QuickTimeParser::initParseTable() { + static const ParseTable p[] = { + { &QuickTimeParser::readDefault, MKID_BE('dinf') }, + { &QuickTimeParser::readLeaf, MKID_BE('dref') }, + { &QuickTimeParser::readDefault, MKID_BE('edts') }, + { &QuickTimeParser::readELST, MKID_BE('elst') }, + { &QuickTimeParser::readHDLR, MKID_BE('hdlr') }, + { &QuickTimeParser::readDefault, MKID_BE('mdat') }, + { &QuickTimeParser::readMDHD, MKID_BE('mdhd') }, + { &QuickTimeParser::readDefault, MKID_BE('mdia') }, + { &QuickTimeParser::readDefault, MKID_BE('minf') }, + { &QuickTimeParser::readMOOV, MKID_BE('moov') }, + { &QuickTimeParser::readMVHD, MKID_BE('mvhd') }, + { &QuickTimeParser::readLeaf, MKID_BE('smhd') }, + { &QuickTimeParser::readDefault, MKID_BE('stbl') }, + { &QuickTimeParser::readSTCO, MKID_BE('stco') }, + { &QuickTimeParser::readSTSC, MKID_BE('stsc') }, + { &QuickTimeParser::readSTSD, MKID_BE('stsd') }, + { &QuickTimeParser::readSTSS, MKID_BE('stss') }, + { &QuickTimeParser::readSTSZ, MKID_BE('stsz') }, + { &QuickTimeParser::readSTTS, MKID_BE('stts') }, + { &QuickTimeParser::readTKHD, MKID_BE('tkhd') }, + { &QuickTimeParser::readTRAK, MKID_BE('trak') }, + { &QuickTimeParser::readLeaf, MKID_BE('udta') }, + { &QuickTimeParser::readLeaf, MKID_BE('vmhd') }, + { &QuickTimeParser::readCMOV, MKID_BE('cmov') }, + { &QuickTimeParser::readWAVE, MKID_BE('wave') }, + { 0, 0 } + }; + + _parseTable = p; +} + +int QuickTimeParser::readDefault(MOVatom atom) { + uint32 total_size = 0; + MOVatom a; + int err = 0; + + a.offset = atom.offset; + + while(((total_size + 8) < atom.size) && !_fd->eos() && _fd->pos() < _fd->size() && !err) { + a.size = atom.size; + a.type = 0; + + if (atom.size >= 8) { + a.size = _fd->readUint32BE(); + a.type = _fd->readUint32BE(); + + // Some QuickTime videos with resource forks have mdat chunks + // that are of size 0. Adjust it so it's the correct size. + if (a.type == MKID_BE('mdat') && a.size == 0) + a.size = _fd->size(); + } + + total_size += 8; + a.offset += 8; + debug(4, "type: %08x %.4s sz: %x %x %x", a.type, tag2str(a.type), a.size, atom.size, total_size); + + if (a.size == 1) { // 64 bit extended size + warning("64 bit extended size is not supported in QuickTime"); + return -1; + } + + if (a.size == 0) { + a.size = atom.size - total_size; + if (a.size <= 8) + break; + } + + uint32 i = 0; + + for (; _parseTable[i].type != 0 && _parseTable[i].type != a.type; i++) + ; // Empty + + if (a.size < 8) + break; + + a.size -= 8; + + if (_parseTable[i].type == 0) { // skip leaf atoms data + debug(0, ">>> Skipped [%s]", tag2str(a.type)); + + _fd->seek(a.size, SEEK_CUR); + } else { + uint32 start_pos = _fd->pos(); + err = (this->*_parseTable[i].func)(a); + + uint32 left = a.size - _fd->pos() + start_pos; + + if (left > 0) // skip garbage at atom end + _fd->seek(left, SEEK_CUR); + } + + a.offset += a.size; + total_size += a.size; + } + + if (!err && total_size < atom.size) + _fd->seek(atom.size - total_size, SEEK_SET); + + return err; +} + +int QuickTimeParser::readLeaf(MOVatom atom) { + if (atom.size > 1) + _fd->seek(atom.size, SEEK_SET); + + return 0; +} + +int QuickTimeParser::readMOOV(MOVatom atom) { + if (readDefault(atom) < 0) + return -1; + + // We parsed the 'moov' atom, so we don't need anything else + _foundMOOV = true; + return 1; +} + +int QuickTimeParser::readCMOV(MOVatom atom) { +#ifdef USE_ZLIB + // Read in the dcom atom + _fd->readUint32BE(); + if (_fd->readUint32BE() != MKID_BE('dcom')) + return -1; + if (_fd->readUint32BE() != MKID_BE('zlib')) { + warning("Unknown cmov compression type"); + return -1; + } + + // Read in the cmvd atom + uint32 compressedSize = _fd->readUint32BE() - 12; + if (_fd->readUint32BE() != MKID_BE('cmvd')) + return -1; + uint32 uncompressedSize = _fd->readUint32BE(); + + // Read in data + byte *compressedData = (byte *)malloc(compressedSize); + _fd->read(compressedData, compressedSize); + + // Create uncompressed stream + byte *uncompressedData = (byte *)malloc(uncompressedSize); + + // Uncompress the data + unsigned long dstLen = uncompressedSize; + if (!Common::uncompress(uncompressedData, &dstLen, compressedData, compressedSize)) { + warning ("Could not uncompress cmov chunk"); + free(compressedData); + free(uncompressedData); + return -1; + } + + // Load data into a new MemoryReadStream and assign _fd to be that + Common::SeekableReadStream *oldStream = _fd; + _fd = new Common::MemoryReadStream(uncompressedData, uncompressedSize, DisposeAfterUse::YES); + + // Read the contents of the uncompressed data + MOVatom a = { MKID_BE('moov'), 0, uncompressedSize }; + int err = readDefault(a); + + // Assign the file handle back to the original handle + free(compressedData); + delete _fd; + _fd = oldStream; + + return err; +#else + warning ("zlib not found, cannot read QuickTime cmov atom"); + return -1; +#endif +} + +int QuickTimeParser::readMVHD(MOVatom atom) { + byte version = _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + if (version == 1) { + warning("QuickTime version 1"); + _fd->readUint32BE(); _fd->readUint32BE(); + _fd->readUint32BE(); _fd->readUint32BE(); + } else { + _fd->readUint32BE(); // creation time + _fd->readUint32BE(); // modification time + } + + _timeScale = _fd->readUint32BE(); // time scale + debug(0, "time scale = %i\n", _timeScale); + + // duration + _duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); + _fd->readUint32BE(); // preferred scale + + _fd->readUint16BE(); // preferred volume + + _fd->seek(10, SEEK_CUR); // reserved + + // We only need two values from the movie display matrix. Most of the values are just + // skipped. xMod and yMod are 16:16 fixed point numbers, the last part of the 3x3 matrix + // is 2:30. + uint32 xMod = _fd->readUint32BE(); + _fd->skip(12); + uint32 yMod = _fd->readUint32BE(); + _fd->skip(16); + + _scaleFactorX = Common::Rational(0x10000, xMod); + _scaleFactorY = Common::Rational(0x10000, yMod); + + _scaleFactorX.debugPrint(1, "readMVHD(): scaleFactorX ="); + _scaleFactorY.debugPrint(1, "readMVHD(): scaleFactorY ="); + + _fd->readUint32BE(); // preview time + _fd->readUint32BE(); // preview duration + _fd->readUint32BE(); // poster time + _fd->readUint32BE(); // selection time + _fd->readUint32BE(); // selection duration + _fd->readUint32BE(); // current time + _fd->readUint32BE(); // next track ID + + return 0; +} + +int QuickTimeParser::readTRAK(MOVatom atom) { + MOVStreamContext *sc = new MOVStreamContext(); + + if (!sc) + return -1; + + sc->codec_type = CODEC_TYPE_MOV_OTHER; + sc->start_time = 0; // XXX: check + _streams[_numStreams++] = sc; + + return readDefault(atom); +} + +int QuickTimeParser::readTKHD(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + byte version = _fd->readByte(); + + _fd->readByte(); _fd->readByte(); + _fd->readByte(); // flags + // + //MOV_TRACK_ENABLED 0x0001 + //MOV_TRACK_IN_MOVIE 0x0002 + //MOV_TRACK_IN_PREVIEW 0x0004 + //MOV_TRACK_IN_POSTER 0x0008 + // + + if (version == 1) { + _fd->readUint32BE(); _fd->readUint32BE(); + _fd->readUint32BE(); _fd->readUint32BE(); + } else { + _fd->readUint32BE(); // creation time + _fd->readUint32BE(); // modification time + } + + /* st->id = */_fd->readUint32BE(); // track id (NOT 0 !) + _fd->readUint32BE(); // reserved + //st->start_time = 0; // check + (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // highlevel (considering edits) duration in movie timebase + _fd->readUint32BE(); // reserved + _fd->readUint32BE(); // reserved + + _fd->readUint16BE(); // layer + _fd->readUint16BE(); // alternate group + _fd->readUint16BE(); // volume + _fd->readUint16BE(); // reserved + + // We only need the two values from the displacement matrix for a track. + // See readMVHD() for more information. + uint32 xMod = _fd->readUint32BE(); + _fd->skip(12); + uint32 yMod = _fd->readUint32BE(); + _fd->skip(16); + + st->scaleFactorX = Common::Rational(0x10000, xMod); + st->scaleFactorY = Common::Rational(0x10000, yMod); + + st->scaleFactorX.debugPrint(1, "readTKHD(): scaleFactorX ="); + st->scaleFactorY.debugPrint(1, "readTKHD(): scaleFactorY ="); + + // these are fixed-point, 16:16 + // uint32 tkWidth = _fd->readUint32BE() >> 16; // track width + // uint32 tkHeight = _fd->readUint32BE() >> 16; // track height + + return 0; +} + +// edit list atom +int QuickTimeParser::readELST(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->editCount = _fd->readUint32BE(); + st->editList = new EditListEntry[st->editCount]; + + debug(2, "Track %d edit list count: %d", _numStreams - 1, st->editCount); + + for (uint32 i = 0; i < st->editCount; i++){ + st->editList[i].trackDuration = _fd->readUint32BE(); + st->editList[i].mediaTime = _fd->readSint32BE(); + st->editList[i].mediaRate = Common::Rational(_fd->readUint32BE(), 0x10000); + debugN(3, "\tDuration = %d, Media Time = %d, ", st->editList[i].trackDuration, st->editList[i].mediaTime); + st->editList[i].mediaRate.debugPrint(3, "Media Rate ="); + } + + if (st->editCount != 1) + warning("Multiple edit list entries. Things may go awry"); + + return 0; +} + +int QuickTimeParser::readHDLR(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + // component type + uint32 ctype = _fd->readUint32BE(); + uint32 type = _fd->readUint32BE(); // component subtype + + debug(0, "ctype= %s (0x%08lx)", tag2str(ctype), (long)ctype); + debug(0, "stype= %s", tag2str(type)); + + if (ctype == MKID_BE('mhlr')) // MOV + debug(0, "MOV detected"); + else if (ctype == 0) + debug(0, "MPEG-4 detected"); + + if (type == MKID_BE('vide')) + st->codec_type = CODEC_TYPE_VIDEO; + else if (type == MKID_BE('soun')) + st->codec_type = CODEC_TYPE_AUDIO; + + _fd->readUint32BE(); // component manufacture + _fd->readUint32BE(); // component flags + _fd->readUint32BE(); // component flags mask + + if (atom.size <= 24) + return 0; // nothing left to read + + // .mov: PASCAL string + byte len = _fd->readByte(); + _fd->seek(len, SEEK_CUR); + + _fd->seek(atom.size - (_fd->pos() - atom.offset), SEEK_CUR); + + return 0; +} + +int QuickTimeParser::readMDHD(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + byte version = _fd->readByte(); + + if (version > 1) + return 1; // unsupported + + _fd->readByte(); _fd->readByte(); + _fd->readByte(); // flags + + if (version == 1) { + _fd->readUint32BE(); _fd->readUint32BE(); + _fd->readUint32BE(); _fd->readUint32BE(); + } else { + _fd->readUint32BE(); // creation time + _fd->readUint32BE(); // modification time + } + + st->time_scale = _fd->readUint32BE(); + st->duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // duration + + _fd->readUint16BE(); // language + _fd->readUint16BE(); // quality + + return 0; +} + +int QuickTimeParser::readSTSD(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + uint32 entryCount = _fd->readUint32BE(); + st->sampleDescs.resize(entryCount); + + for (uint32 i = 0; i < entryCount; i++) { // Parsing Sample description table + MOVatom a = { 0, 0, 0 }; + uint32 start_pos = _fd->pos(); + int size = _fd->readUint32BE(); // size + uint32 format = _fd->readUint32BE(); // data format + + _fd->readUint32BE(); // reserved + _fd->readUint16BE(); // reserved + _fd->readUint16BE(); // index + + st->sampleDescs[i] = readSampleDesc(st, format); + + debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), st->codec_type); + + if (!st->sampleDescs[i]) { + // other codec type, just skip (rtp, mp4s, tmcd ...) + _fd->seek(size - (_fd->pos() - start_pos), SEEK_CUR); + } + + // this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) + a.size = size - (_fd->pos() - start_pos); + if (a.size > 8) + readDefault(a); + else if (a.size > 0) + _fd->seek(a.size, SEEK_CUR); + } + + return 0; +} + +int QuickTimeParser::readSTSC(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->sample_to_chunk_sz = _fd->readUint32BE(); + + debug(0, "track[%i].stsc.entries = %i", _numStreams - 1, st->sample_to_chunk_sz); + + st->sample_to_chunk = new MOVstsc[st->sample_to_chunk_sz]; + + if (!st->sample_to_chunk) + return -1; + + for (uint32 i = 0; i < st->sample_to_chunk_sz; i++) { + st->sample_to_chunk[i].first = _fd->readUint32BE() - 1; + st->sample_to_chunk[i].count = _fd->readUint32BE(); + st->sample_to_chunk[i].id = _fd->readUint32BE(); + //warning("Sample to Chunk[%d]: First = %d, Count = %d", i, st->sample_to_chunk[i].first, st->sample_to_chunk[i].count); + } + + return 0; +} + +int QuickTimeParser::readSTSS(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->keyframe_count = _fd->readUint32BE(); + + debug(0, "keyframe_count = %d", st->keyframe_count); + + st->keyframes = new uint32[st->keyframe_count]; + + if (!st->keyframes) + return -1; + + for (uint32 i = 0; i < st->keyframe_count; i++) { + st->keyframes[i] = _fd->readUint32BE() - 1; // Adjust here, the frames are based on 1 + debug(6, "keyframes[%d] = %d", i, st->keyframes[i]); + + } + return 0; +} + +int QuickTimeParser::readSTSZ(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->sample_size = _fd->readUint32BE(); + st->sample_count = _fd->readUint32BE(); + + debug(5, "sample_size = %d sample_count = %d", st->sample_size, st->sample_count); + + if (st->sample_size) + return 0; // there isn't any table following + + st->sample_sizes = new uint32[st->sample_count]; + + if (!st->sample_sizes) + return -1; + + for(uint32 i = 0; i < st->sample_count; i++) { + st->sample_sizes[i] = _fd->readUint32BE(); + debug(6, "sample_sizes[%d] = %d", i, st->sample_sizes[i]); + } + + return 0; +} + +static uint32 ff_gcd(uint32 a, uint32 b) { + return b ? ff_gcd(b, a % b) : a; +} + +int QuickTimeParser::readSTTS(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + uint32 duration = 0; + uint32 total_sample_count = 0; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->stts_count = _fd->readUint32BE(); + st->stts_data = new MOVstts[st->stts_count]; + + debug(0, "track[%i].stts.entries = %i", _numStreams - 1, st->stts_count); + + st->time_rate = 0; + + for (int32 i = 0; i < st->stts_count; i++) { + int sample_duration; + int sample_count; + + sample_count = _fd->readUint32BE(); + sample_duration = _fd->readUint32BE(); + st->stts_data[i].count = sample_count; + st->stts_data[i].duration = sample_duration; + + st->time_rate = ff_gcd(st->time_rate, sample_duration); + + debug(0, "sample_count=%d, sample_duration=%d", sample_count, sample_duration); + + duration += sample_duration * sample_count; + total_sample_count += sample_count; + } + + st->nb_frames = total_sample_count; + + if (duration) + st->duration = duration; + + return 0; +} + +int QuickTimeParser::readSTCO(MOVatom atom) { + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readByte(); // version + _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags + + st->chunk_count = _fd->readUint32BE(); + st->chunk_offsets = new uint32[st->chunk_count]; + + if (!st->chunk_offsets) + return -1; + + for (uint32 i = 0; i < st->chunk_count; i++) { + // WORKAROUND/HACK: The offsets in Riven videos (ones inside the Mohawk archives themselves) + // have offsets relative to the archive and not the video. This is quite nasty. We subtract + // the initial offset of the stream to get the correct value inside of the stream. + st->chunk_offsets[i] = _fd->readUint32BE() - _beginOffset; + } + + return 0; +} + +int QuickTimeParser::readWAVE(MOVatom atom) { + if (_numStreams < 1) + return 0; + + MOVStreamContext *st = _streams[_numStreams - 1]; + + if (atom.size > (1 << 30)) + return -1; + + if (st->sampleDescs[0]->codecTag == MKID_BE('QDM2')) // Read extradata for QDM2 + st->extradata = _fd->readStream(atom.size - 8); + else if (atom.size > 8) + return readDefault(atom); + else + _fd->skip(atom.size); + + return 0; +} + +void QuickTimeParser::close() { + for (uint32 i = 0; i < _numStreams; i++) + delete _streams[i]; + + _numStreams = 0; + + delete _fd; + _fd = 0; +} + +QuickTimeParser::SampleDesc::SampleDesc() { + codecTag = 0; + bitsPerSample = 0; +} + +QuickTimeParser::MOVStreamContext::MOVStreamContext() { + chunk_count = 0; + chunk_offsets = 0; + stts_count = 0; + stts_data = 0; + sample_to_chunk_sz = 0; + sample_to_chunk = 0; + sample_size = 0; + sample_count = 0; + sample_sizes = 0; + keyframe_count = 0; + keyframes = 0; + time_scale = 0; + time_rate = 0; + width = 0; + height = 0; + codec_type = CODEC_TYPE_MOV_OTHER; + editCount = 0; + editList = 0; + extradata = 0; + nb_frames = 0; + duration = 0; + start_time = 0; +} + +QuickTimeParser::MOVStreamContext::~MOVStreamContext() { + delete[] chunk_offsets; + delete[] stts_data; + delete[] sample_to_chunk; + delete[] sample_sizes; + delete[] keyframes; + delete[] editList; + delete extradata; + + for (uint32 i = 0; i < sampleDescs.size(); i++) + delete sampleDescs[i]; +} + +} // End of namespace Video diff --git a/common/quicktime.h b/common/quicktime.h new file mode 100644 index 000000000000..777086050705 --- /dev/null +++ b/common/quicktime.h @@ -0,0 +1,202 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// +// Heavily based on ffmpeg code. +// +// Copyright (c) 2001 Fabrice Bellard. +// First version by Francois Revol revol@free.fr +// Seek function by Gael Chardon gael.dev@4now.net +// + +#ifndef COMMON_QUICKTIME_H +#define COMMON_QUICKTIME_H + +#include "common/array.h" +#include "common/scummsys.h" +#include "common/stream.h" +#include "common/rational.h" + +namespace Common { + class MacResManager; + +/** + * Parser for QuickTime files. + * + * File parser used in engines: + * - mohawk + * - sci + */ +class QuickTimeParser { +public: + QuickTimeParser(); + virtual ~QuickTimeParser(); + + /** + * Load a QuickTime file + * @param filename the filename to load + */ + bool loadFile(const Common::String &filename); + + /** + * Load a QuickTime file from a SeekableReadStream + * @param stream the stream to load + */ + bool loadStream(Common::SeekableReadStream *stream); + + /** + * Close a QuickTime file + */ + void close(); + + /** + * Set the beginning offset of the video so we can modify the offsets in the stco + * atom of videos inside the Mohawk archives + * @param the beginning offset of the video + */ + void setChunkBeginOffset(uint32 offset) { _beginOffset = offset; } + + bool isOpen() const { return _fd != 0; } + +protected: + // This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream. + Common::SeekableReadStream *_fd; + + struct MOVatom { + uint32 type; + uint32 offset; + uint32 size; + }; + + struct ParseTable { + int (QuickTimeParser::*func)(MOVatom atom); + uint32 type; + }; + + struct MOVstts { + int count; + int duration; + }; + + struct MOVstsc { + uint32 first; + uint32 count; + uint32 id; + }; + + struct EditListEntry { + uint32 trackDuration; + int32 mediaTime; + Common::Rational mediaRate; + }; + + struct SampleDesc { + SampleDesc(); + virtual ~SampleDesc() {} + + uint32 codecTag; + uint16 bitsPerSample; + }; + + enum CodecType { + CODEC_TYPE_MOV_OTHER, + CODEC_TYPE_VIDEO, + CODEC_TYPE_AUDIO + }; + + struct MOVStreamContext { + MOVStreamContext(); + ~MOVStreamContext(); + + uint32 chunk_count; + uint32 *chunk_offsets; + int stts_count; + MOVstts *stts_data; + uint32 sample_to_chunk_sz; + MOVstsc *sample_to_chunk; + uint32 sample_size; + uint32 sample_count; + uint32 *sample_sizes; + uint32 keyframe_count; + uint32 *keyframes; + int32 time_scale; + int time_rate; + + uint16 width; + uint16 height; + CodecType codec_type; + + Common::Array sampleDescs; + + uint32 editCount; + EditListEntry *editList; + + Common::SeekableReadStream *extradata; + + uint32 nb_frames; + uint32 duration; + uint32 start_time; + Common::Rational scaleFactorX; + Common::Rational scaleFactorY; + }; + + virtual SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format) = 0; + + const ParseTable *_parseTable; + bool _foundMOOV; + uint32 _timeScale; + uint32 _duration; + uint32 _numStreams; + Common::Rational _scaleFactorX; + Common::Rational _scaleFactorY; + MOVStreamContext *_streams[20]; + uint32 _beginOffset; + Common::MacResManager *_resFork; + + void initParseTable(); + void init(); + + int readDefault(MOVatom atom); + int readLeaf(MOVatom atom); + int readELST(MOVatom atom); + int readHDLR(MOVatom atom); + int readMDHD(MOVatom atom); + int readMOOV(MOVatom atom); + int readMVHD(MOVatom atom); + int readTKHD(MOVatom atom); + int readTRAK(MOVatom atom); + int readSTCO(MOVatom atom); + int readSTSC(MOVatom atom); + int readSTSD(MOVatom atom); + int readSTSS(MOVatom atom); + int readSTSZ(MOVatom atom); + int readSTTS(MOVatom atom); + int readCMOV(MOVatom atom); + int readWAVE(MOVatom atom); +}; + +} // End of namespace Common + +#endif diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 4c2374f89459..fc91fd1f44ce 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -35,10 +35,8 @@ #include "common/debug.h" #include "common/endian.h" -#include "common/macresman.h" #include "common/memstream.h" #include "common/util.h" -#include "common/zlib.h" // Audio codecs #include "audio/decoders/adpcm.h" @@ -61,25 +59,16 @@ namespace Video { QuickTimeDecoder::QuickTimeDecoder() { _audStream = NULL; - _beginOffset = 0; _curFrame = -1; _startTime = _nextFrameStartTime = 0; _audHandle = Audio::SoundHandle(); - _numStreams = 0; - _fd = 0; _scaledSurface = 0; - _scaleFactorX = 1; - _scaleFactorY = 1; _dirtyPalette = false; - _resFork = new Common::MacResManager(); _palette = 0; - - initParseTable(); } QuickTimeDecoder::~QuickTimeDecoder() { close(); - delete _resFork; } uint16 QuickTimeDecoder::getWidth() const { @@ -412,89 +401,35 @@ uint32 QuickTimeDecoder::getTimeToNextFrame() const { } bool QuickTimeDecoder::loadFile(const Common::String &filename) { - if (!_resFork->open(filename) || !_resFork->hasDataFork()) + if (!Common::QuickTimeParser::loadFile(filename)) return false; - _foundMOOV = false; - _numStreams = 0; _videoStreamIndex = _audioStreamIndex = -1; _startTime = 0; - - MOVatom atom = { 0, 0, 0xffffffff }; - - if (_resFork->hasResFork()) { - // Search for a 'moov' resource - Common::MacResIDArray idArray = _resFork->getResIDArray(MKID_BE('moov')); - - if (!idArray.empty()) - _fd = _resFork->getResource(MKID_BE('moov'), idArray[0]); - - if (_fd) { - atom.size = _fd->size(); - if (readDefault(atom) < 0 || !_foundMOOV) - return false; - } - delete _fd; - - atom.type = 0; - atom.offset = 0; - atom.size = 0xffffffff; - } - - _fd = _resFork->getDataFork(); - - if (readDefault(atom) < 0 || !_foundMOOV) - return false; - init(); + return true; } bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { - _fd = stream; - _foundMOOV = false; - _numStreams = 0; - _videoStreamIndex = _audioStreamIndex = -1; - _startTime = 0; - - MOVatom atom = { 0, 0, 0xffffffff }; - - if (readDefault(atom) < 0 || !_foundMOOV) { - _fd = 0; + if (!Common::QuickTimeParser::loadStream(stream)) return false; - } + _videoStreamIndex = _audioStreamIndex = -1; + _startTime = 0; init(); + return true; } void QuickTimeDecoder::init() { - // Remove non-Video/Audio streams - for (uint32 i = 0; i < _numStreams;) { - if (_streams[i]->codec_type == CODEC_TYPE_MOV_OTHER) { - delete _streams[i]; - for (uint32 j = i + 1; j < _numStreams; j++) - _streams[j - 1] = _streams[j]; - _numStreams--; - } else - i++; - } + Common::QuickTimeParser::init(); - // Adjust time/duration + // Find audio/video streams for (uint32 i = 0; i < _numStreams; i++) { - MOVStreamContext *sc = _streams[i]; - - if (!sc->time_rate) - sc->time_rate = 1; - - if (!sc->time_scale) - sc->time_scale = _timeScale; - - sc->duration /= sc->time_rate; - - if (sc->codec_type == CODEC_TYPE_VIDEO && _videoStreamIndex < 0) + if (_streams[i]->codec_type == CODEC_TYPE_VIDEO && _videoStreamIndex < 0) _videoStreamIndex = i; - else if (sc->codec_type == CODEC_TYPE_AUDIO && _audioStreamIndex < 0) + else if (_streams[i]->codec_type == CODEC_TYPE_AUDIO && _audioStreamIndex < 0) _audioStreamIndex = i; } @@ -531,729 +466,154 @@ void QuickTimeDecoder::init() { } } -void QuickTimeDecoder::initParseTable() { - static const ParseTable p[] = { - { &QuickTimeDecoder::readDefault, MKID_BE('dinf') }, - { &QuickTimeDecoder::readLeaf, MKID_BE('dref') }, - { &QuickTimeDecoder::readDefault, MKID_BE('edts') }, - { &QuickTimeDecoder::readELST, MKID_BE('elst') }, - { &QuickTimeDecoder::readHDLR, MKID_BE('hdlr') }, - { &QuickTimeDecoder::readDefault, MKID_BE('mdat') }, - { &QuickTimeDecoder::readMDHD, MKID_BE('mdhd') }, - { &QuickTimeDecoder::readDefault, MKID_BE('mdia') }, - { &QuickTimeDecoder::readDefault, MKID_BE('minf') }, - { &QuickTimeDecoder::readMOOV, MKID_BE('moov') }, - { &QuickTimeDecoder::readMVHD, MKID_BE('mvhd') }, - { &QuickTimeDecoder::readLeaf, MKID_BE('smhd') }, - { &QuickTimeDecoder::readDefault, MKID_BE('stbl') }, - { &QuickTimeDecoder::readSTCO, MKID_BE('stco') }, - { &QuickTimeDecoder::readSTSC, MKID_BE('stsc') }, - { &QuickTimeDecoder::readSTSD, MKID_BE('stsd') }, - { &QuickTimeDecoder::readSTSS, MKID_BE('stss') }, - { &QuickTimeDecoder::readSTSZ, MKID_BE('stsz') }, - { &QuickTimeDecoder::readSTTS, MKID_BE('stts') }, - { &QuickTimeDecoder::readTKHD, MKID_BE('tkhd') }, - { &QuickTimeDecoder::readTRAK, MKID_BE('trak') }, - { &QuickTimeDecoder::readLeaf, MKID_BE('udta') }, - { &QuickTimeDecoder::readLeaf, MKID_BE('vmhd') }, - { &QuickTimeDecoder::readCMOV, MKID_BE('cmov') }, - { &QuickTimeDecoder::readWAVE, MKID_BE('wave') }, - { 0, 0 } - }; - - _parseTable = p; -} - -int QuickTimeDecoder::readDefault(MOVatom atom) { - uint32 total_size = 0; - MOVatom a; - int err = 0; - - a.offset = atom.offset; +Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamContext *st, uint32 format) { + if (st->codec_type == CODEC_TYPE_VIDEO) { + debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); - while(((total_size + 8) < atom.size) && !_fd->eos() && _fd->pos() < _fd->size() && !err) { - a.size = atom.size; - a.type = 0; + VideoSampleDesc *entry = new VideoSampleDesc(); + entry->codecTag = format; - if (atom.size >= 8) { - a.size = _fd->readUint32BE(); - a.type = _fd->readUint32BE(); + _fd->readUint16BE(); // version + _fd->readUint16BE(); // revision level + _fd->readUint32BE(); // vendor + _fd->readUint32BE(); // temporal quality + _fd->readUint32BE(); // spacial quality - // Some QuickTime videos with resource forks have mdat chunks - // that are of size 0. Adjust it so it's the correct size. - if (a.type == MKID_BE('mdat') && a.size == 0) - a.size = _fd->size(); - } - - total_size += 8; - a.offset += 8; - debug(4, "type: %08x %.4s sz: %x %x %x", a.type, tag2str(a.type), a.size, atom.size, total_size); - - if (a.size == 1) { // 64 bit extended size - warning("64 bit extended size is not supported in QuickTime"); - return -1; - } + uint16 width = _fd->readUint16BE(); // width + uint16 height = _fd->readUint16BE(); // height - if (a.size == 0) { - a.size = atom.size - total_size; - if (a.size <= 8) - break; - } + // The width is most likely invalid for entries after the first one + // so only set the overall width if it is not zero here. + if (width) + st->width = width; - uint32 i = 0; + if (height) + st->height = height; - for (; _parseTable[i].type != 0 && _parseTable[i].type != a.type; i++) - ; // Empty - - if (a.size < 8) - break; + _fd->readUint32BE(); // horiz resolution + _fd->readUint32BE(); // vert resolution + _fd->readUint32BE(); // data size, always 0 + _fd->readUint16BE(); // frames per samples - a.size -= 8; - - if (_parseTable[i].type == 0) { // skip leaf atoms data - debug(0, ">>> Skipped [%s]", tag2str(a.type)); - - _fd->seek(a.size, SEEK_CUR); - } else { - uint32 start_pos = _fd->pos(); - err = (this->*_parseTable[i].func)(a); - - uint32 left = a.size - _fd->pos() + start_pos; - - if (left > 0) // skip garbage at atom end - _fd->seek(left, SEEK_CUR); + byte codec_name[32]; + _fd->read(codec_name, 32); // codec name, pascal string (FIXME: true for mp4?) + if (codec_name[0] <= 31) { + memcpy(entry->codecName, &codec_name[1], codec_name[0]); + entry->codecName[codec_name[0]] = 0; } - a.offset += a.size; - total_size += a.size; - } - - if (!err && total_size < atom.size) - _fd->seek(atom.size - total_size, SEEK_SET); - - return err; -} - -int QuickTimeDecoder::readLeaf(MOVatom atom) { - if (atom.size > 1) - _fd->seek(atom.size, SEEK_SET); - - return 0; -} - -int QuickTimeDecoder::readMOOV(MOVatom atom) { - if (readDefault(atom) < 0) - return -1; - - // We parsed the 'moov' atom, so we don't need anything else - _foundMOOV = true; - return 1; -} - -int QuickTimeDecoder::readCMOV(MOVatom atom) { -#ifdef USE_ZLIB - // Read in the dcom atom - _fd->readUint32BE(); - if (_fd->readUint32BE() != MKID_BE('dcom')) - return -1; - if (_fd->readUint32BE() != MKID_BE('zlib')) { - warning("Unknown cmov compression type"); - return -1; - } - - // Read in the cmvd atom - uint32 compressedSize = _fd->readUint32BE() - 12; - if (_fd->readUint32BE() != MKID_BE('cmvd')) - return -1; - uint32 uncompressedSize = _fd->readUint32BE(); - - // Read in data - byte *compressedData = (byte *)malloc(compressedSize); - _fd->read(compressedData, compressedSize); - - // Create uncompressed stream - byte *uncompressedData = (byte *)malloc(uncompressedSize); - - // Uncompress the data - unsigned long dstLen = uncompressedSize; - if (!Common::uncompress(uncompressedData, &dstLen, compressedData, compressedSize)) { - warning ("Could not uncompress cmov chunk"); - free(compressedData); - free(uncompressedData); - return -1; - } - - // Load data into a new MemoryReadStream and assign _fd to be that - Common::SeekableReadStream *oldStream = _fd; - _fd = new Common::MemoryReadStream(uncompressedData, uncompressedSize, DisposeAfterUse::YES); - - // Read the contents of the uncompressed data - MOVatom a = { MKID_BE('moov'), 0, uncompressedSize }; - int err = readDefault(a); - - // Assign the file handle back to the original handle - free(compressedData); - delete _fd; - _fd = oldStream; - - return err; -#else - warning ("zlib not found, cannot read QuickTime cmov atom"); - return -1; -#endif -} - -int QuickTimeDecoder::readMVHD(MOVatom atom) { - byte version = _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - if (version == 1) { - warning("QuickTime version 1"); - _fd->readUint32BE(); _fd->readUint32BE(); - _fd->readUint32BE(); _fd->readUint32BE(); - } else { - _fd->readUint32BE(); // creation time - _fd->readUint32BE(); // modification time - } - - _timeScale = _fd->readUint32BE(); // time scale - debug(0, "time scale = %i\n", _timeScale); - - // duration - _duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); - _fd->readUint32BE(); // preferred scale - - _fd->readUint16BE(); // preferred volume - - _fd->seek(10, SEEK_CUR); // reserved - - // We only need two values from the movie display matrix. Most of the values are just - // skipped. xMod and yMod are 16:16 fixed point numbers, the last part of the 3x3 matrix - // is 2:30. - uint32 xMod = _fd->readUint32BE(); - _fd->skip(12); - uint32 yMod = _fd->readUint32BE(); - _fd->skip(16); - - _scaleFactorX = Common::Rational(0x10000, xMod); - _scaleFactorY = Common::Rational(0x10000, yMod); - - _scaleFactorX.debugPrint(1, "readMVHD(): scaleFactorX ="); - _scaleFactorY.debugPrint(1, "readMVHD(): scaleFactorY ="); - - _fd->readUint32BE(); // preview time - _fd->readUint32BE(); // preview duration - _fd->readUint32BE(); // poster time - _fd->readUint32BE(); // selection time - _fd->readUint32BE(); // selection duration - _fd->readUint32BE(); // current time - _fd->readUint32BE(); // next track ID - - return 0; -} - -int QuickTimeDecoder::readTRAK(MOVatom atom) { - MOVStreamContext *sc = new MOVStreamContext(); - - if (!sc) - return -1; - - sc->codec_type = CODEC_TYPE_MOV_OTHER; - sc->start_time = 0; // XXX: check - _streams[_numStreams++] = sc; - - return readDefault(atom); -} - -int QuickTimeDecoder::readTKHD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - byte version = _fd->readByte(); - - _fd->readByte(); _fd->readByte(); - _fd->readByte(); // flags - // - //MOV_TRACK_ENABLED 0x0001 - //MOV_TRACK_IN_MOVIE 0x0002 - //MOV_TRACK_IN_PREVIEW 0x0004 - //MOV_TRACK_IN_POSTER 0x0008 - // - - if (version == 1) { - _fd->readUint32BE(); _fd->readUint32BE(); - _fd->readUint32BE(); _fd->readUint32BE(); - } else { - _fd->readUint32BE(); // creation time - _fd->readUint32BE(); // modification time - } - - /* st->id = */_fd->readUint32BE(); // track id (NOT 0 !) - _fd->readUint32BE(); // reserved - //st->start_time = 0; // check - (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // highlevel (considering edits) duration in movie timebase - _fd->readUint32BE(); // reserved - _fd->readUint32BE(); // reserved - - _fd->readUint16BE(); // layer - _fd->readUint16BE(); // alternate group - _fd->readUint16BE(); // volume - _fd->readUint16BE(); // reserved - - // We only need the two values from the displacement matrix for a track. - // See readMVHD() for more information. - uint32 xMod = _fd->readUint32BE(); - _fd->skip(12); - uint32 yMod = _fd->readUint32BE(); - _fd->skip(16); - - st->scaleFactorX = Common::Rational(0x10000, xMod); - st->scaleFactorY = Common::Rational(0x10000, yMod); - - st->scaleFactorX.debugPrint(1, "readTKHD(): scaleFactorX ="); - st->scaleFactorY.debugPrint(1, "readTKHD(): scaleFactorY ="); - - // these are fixed-point, 16:16 - // uint32 tkWidth = _fd->readUint32BE() >> 16; // track width - // uint32 tkHeight = _fd->readUint32BE() >> 16; // track height - - return 0; -} - -// edit list atom -int QuickTimeDecoder::readELST(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->editCount = _fd->readUint32BE(); - st->editList = new EditListEntry[st->editCount]; - - debug(2, "Track %d edit list count: %d", _numStreams - 1, st->editCount); - - for (uint32 i = 0; i < st->editCount; i++){ - st->editList[i].trackDuration = _fd->readUint32BE(); - st->editList[i].mediaTime = _fd->readSint32BE(); - st->editList[i].mediaRate = Common::Rational(_fd->readUint32BE(), 0x10000); - debugN(3, "\tDuration = %d, Media Time = %d, ", st->editList[i].trackDuration, st->editList[i].mediaTime); - st->editList[i].mediaRate.debugPrint(3, "Media Rate ="); - } - - if (st->editCount != 1) - warning("Multiple edit list entries. Things may go awry"); - - return 0; -} - -int QuickTimeDecoder::readHDLR(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - // component type - uint32 ctype = _fd->readUint32BE(); - uint32 type = _fd->readUint32BE(); // component subtype - - debug(0, "ctype= %s (0x%08lx)", tag2str(ctype), (long)ctype); - debug(0, "stype= %s", tag2str(type)); - - if (ctype == MKID_BE('mhlr')) // MOV - debug(0, "MOV detected"); - else if (ctype == 0) - debug(0, "MPEG-4 detected"); - - if (type == MKID_BE('vide')) - st->codec_type = CODEC_TYPE_VIDEO; - else if (type == MKID_BE('soun')) - st->codec_type = CODEC_TYPE_AUDIO; - - _fd->readUint32BE(); // component manufacture - _fd->readUint32BE(); // component flags - _fd->readUint32BE(); // component flags mask - - if (atom.size <= 24) - return 0; // nothing left to read - - // .mov: PASCAL string - byte len = _fd->readByte(); - _fd->seek(len, SEEK_CUR); - - _fd->seek(atom.size - (_fd->pos() - atom.offset), SEEK_CUR); - - return 0; -} - -int QuickTimeDecoder::readMDHD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - byte version = _fd->readByte(); - - if (version > 1) - return 1; // unsupported - - _fd->readByte(); _fd->readByte(); - _fd->readByte(); // flags - - if (version == 1) { - _fd->readUint32BE(); _fd->readUint32BE(); - _fd->readUint32BE(); _fd->readUint32BE(); - } else { - _fd->readUint32BE(); // creation time - _fd->readUint32BE(); // modification time - } - - st->time_scale = _fd->readUint32BE(); - st->duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // duration - - _fd->readUint16BE(); // language - _fd->readUint16BE(); // quality - - return 0; -} - -int QuickTimeDecoder::readSTSD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - uint32 entryCount = _fd->readUint32BE(); - st->sampleDescs.resize(entryCount); - - for (uint32 i = 0; i < entryCount; i++) { // Parsing Sample description table - MOVatom a = { 0, 0, 0 }; - uint32 start_pos = _fd->pos(); - int size = _fd->readUint32BE(); // size - uint32 format = _fd->readUint32BE(); // data format - - _fd->readUint32BE(); // reserved - _fd->readUint16BE(); // reserved - _fd->readUint16BE(); // index - - debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), st->codec_type); - - if (st->codec_type == CODEC_TYPE_VIDEO) { - debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); - - VideoSampleDesc *entry = new VideoSampleDesc(); - st->sampleDescs[i] = entry; - - entry->codecTag = format; - - _fd->readUint16BE(); // version - _fd->readUint16BE(); // revision level - _fd->readUint32BE(); // vendor - _fd->readUint32BE(); // temporal quality - _fd->readUint32BE(); // spacial quality - - uint16 width = _fd->readUint16BE(); // width - uint16 height = _fd->readUint16BE(); // height - - // The width is most likely invalid for entries after the first one - // so only set the overall width if it is not zero here. - if (width) - st->width = width; - - if (height) - st->height = height; - - _fd->readUint32BE(); // horiz resolution - _fd->readUint32BE(); // vert resolution - _fd->readUint32BE(); // data size, always 0 - _fd->readUint16BE(); // frames per samples - - byte codec_name[32]; - _fd->read(codec_name, 32); // codec name, pascal string (FIXME: true for mp4?) - if (codec_name[0] <= 31) { - memcpy(entry->codecName, &codec_name[1], codec_name[0]); - entry->codecName[codec_name[0]] = 0; - } - - entry->bitsPerSample = _fd->readUint16BE(); // depth - entry->colorTableId = _fd->readUint16BE(); // colortable id - - // figure out the palette situation - byte colorDepth = entry->bitsPerSample & 0x1F; - bool colorGreyscale = (entry->bitsPerSample & 0x20) != 0; - - debug(0, "color depth: %d", colorDepth); - - // if the depth is 2, 4, or 8 bpp, file is palettized - if (colorDepth == 2 || colorDepth == 4 || colorDepth == 8) { - // Initialize the palette - entry->palette = new byte[256 * 3]; - memset(entry->palette, 0, 256 * 3); - - if (colorGreyscale) { - debug(0, "Greyscale palette"); - - // compute the greyscale palette - uint16 colorCount = 1 << colorDepth; - int16 colorIndex = 255; - byte colorDec = 256 / (colorCount - 1); - for (byte j = 0; j < colorCount; j++) { - entry->palette[j * 3] = entry->palette[j * 3 + 1] = entry->palette[j * 3 + 2] = colorIndex; - colorIndex -= colorDec; - if (colorIndex < 0) - colorIndex = 0; - } - } else if (entry->colorTableId & 0x08) { - // if flag bit 3 is set, use the default palette - //uint16 colorCount = 1 << colorDepth; - - warning("Predefined palette! %dbpp", colorDepth); - } else { - debug(0, "Palette from file"); - - // load the palette from the file - uint32 colorStart = _fd->readUint32BE(); - /* uint16 colorCount = */ _fd->readUint16BE(); - uint16 colorEnd = _fd->readUint16BE(); - for (uint32 j = colorStart; j <= colorEnd; j++) { - // each R, G, or B component is 16 bits; - // only use the top 8 bits; skip alpha bytes - // up front - _fd->readByte(); - _fd->readByte(); - entry->palette[j * 3] = _fd->readByte(); - _fd->readByte(); - entry->palette[j * 3 + 1] = _fd->readByte(); - _fd->readByte(); - entry->palette[j * 3 + 2] = _fd->readByte(); - _fd->readByte(); - } + entry->bitsPerSample = _fd->readUint16BE(); // depth + entry->colorTableId = _fd->readUint16BE(); // colortable id + + // figure out the palette situation + byte colorDepth = entry->bitsPerSample & 0x1F; + bool colorGreyscale = (entry->bitsPerSample & 0x20) != 0; + + debug(0, "color depth: %d", colorDepth); + + // if the depth is 2, 4, or 8 bpp, file is palettized + if (colorDepth == 2 || colorDepth == 4 || colorDepth == 8) { + // Initialize the palette + entry->palette = new byte[256 * 3]; + memset(entry->palette, 0, 256 * 3); + + if (colorGreyscale) { + debug(0, "Greyscale palette"); + + // compute the greyscale palette + uint16 colorCount = 1 << colorDepth; + int16 colorIndex = 255; + byte colorDec = 256 / (colorCount - 1); + for (byte j = 0; j < colorCount; j++) { + entry->palette[j * 3] = entry->palette[j * 3 + 1] = entry->palette[j * 3 + 2] = colorIndex; + colorIndex -= colorDec; + if (colorIndex < 0) + colorIndex = 0; } - } - } else if (st->codec_type == CODEC_TYPE_AUDIO) { - debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); - - AudioSampleDesc *entry = new AudioSampleDesc(); - st->sampleDescs[i] = entry; - - entry->codecTag = format; - - uint16 stsdVersion = _fd->readUint16BE(); - _fd->readUint16BE(); // revision level - _fd->readUint32BE(); // vendor - - entry->channels = _fd->readUint16BE(); // channel count - entry->bitsPerSample = _fd->readUint16BE(); // sample size - - _fd->readUint16BE(); // compression id = 0 - _fd->readUint16BE(); // packet size = 0 - - entry->sampleRate = (_fd->readUint32BE() >> 16); - - debug(0, "stsd version =%d", stsdVersion); - if (stsdVersion == 0) { - // Not used, except in special cases. See below. - entry->samplesPerFrame = entry->bytesPerFrame = 0; - } else if (stsdVersion == 1) { - // Read QT version 1 fields. In version 0 these dont exist. - entry->samplesPerFrame = _fd->readUint32BE(); - debug(0, "stsd samples_per_frame =%d",entry->samplesPerFrame); - _fd->readUint32BE(); // bytes per packet - entry->bytesPerFrame = _fd->readUint32BE(); - debug(0, "stsd bytes_per_frame =%d", entry->bytesPerFrame); - _fd->readUint32BE(); // bytes per sample - } else { - warning("Unsupported QuickTime STSD audio version %d", stsdVersion); - return 1; - } + } else if (entry->colorTableId & 0x08) { + // if flag bit 3 is set, use the default palette + //uint16 colorCount = 1 << colorDepth; - // Version 0 videos (such as the Riven ones) don't have this set, - // but we need it later on. Add it in here. - if (format == MKID_BE('ima4')) { - entry->samplesPerFrame = 64; - entry->bytesPerFrame = 34 * entry->channels; + warning("Predefined palette! %dbpp", colorDepth); + } else { + debug(0, "Palette from file"); + + // load the palette from the file + uint32 colorStart = _fd->readUint32BE(); + /* uint16 colorCount = */ _fd->readUint16BE(); + uint16 colorEnd = _fd->readUint16BE(); + for (uint32 j = colorStart; j <= colorEnd; j++) { + // each R, G, or B component is 16 bits; + // only use the top 8 bits; skip alpha bytes + // up front + _fd->readByte(); + _fd->readByte(); + entry->palette[j * 3] = _fd->readByte(); + _fd->readByte(); + entry->palette[j * 3 + 1] = _fd->readByte(); + _fd->readByte(); + entry->palette[j * 3 + 2] = _fd->readByte(); + _fd->readByte(); + } } + } - if (entry->sampleRate == 0 && st->time_scale > 1) - entry->sampleRate = st->time_scale; + return entry; + } else if (st->codec_type == CODEC_TYPE_AUDIO) { + debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); + + AudioSampleDesc *entry = new AudioSampleDesc(); + entry->codecTag = format; + + uint16 stsdVersion = _fd->readUint16BE(); + _fd->readUint16BE(); // revision level + _fd->readUint32BE(); // vendor + + entry->channels = _fd->readUint16BE(); // channel count + entry->bitsPerSample = _fd->readUint16BE(); // sample size + + _fd->readUint16BE(); // compression id = 0 + _fd->readUint16BE(); // packet size = 0 + + entry->sampleRate = (_fd->readUint32BE() >> 16); + + debug(0, "stsd version =%d", stsdVersion); + if (stsdVersion == 0) { + // Not used, except in special cases. See below. + entry->samplesPerFrame = entry->bytesPerFrame = 0; + } else if (stsdVersion == 1) { + // Read QT version 1 fields. In version 0 these dont exist. + entry->samplesPerFrame = _fd->readUint32BE(); + debug(0, "stsd samples_per_frame =%d",entry->samplesPerFrame); + _fd->readUint32BE(); // bytes per packet + entry->bytesPerFrame = _fd->readUint32BE(); + debug(0, "stsd bytes_per_frame =%d", entry->bytesPerFrame); + _fd->readUint32BE(); // bytes per sample } else { - // other codec type, just skip (rtp, mp4s, tmcd ...) - _fd->seek(size - (_fd->pos() - start_pos), SEEK_CUR); + warning("Unsupported QuickTime STSD audio version %d", stsdVersion); + delete entry; + return 0; } - // this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) - a.size = size - (_fd->pos() - start_pos); - if (a.size > 8) - readDefault(a); - else if (a.size > 0) - _fd->seek(a.size, SEEK_CUR); - } - - return 0; -} - -int QuickTimeDecoder::readSTSC(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->sample_to_chunk_sz = _fd->readUint32BE(); - - debug(0, "track[%i].stsc.entries = %i", _numStreams - 1, st->sample_to_chunk_sz); - - st->sample_to_chunk = new MOVstsc[st->sample_to_chunk_sz]; - - if (!st->sample_to_chunk) - return -1; - - for (uint32 i = 0; i < st->sample_to_chunk_sz; i++) { - st->sample_to_chunk[i].first = _fd->readUint32BE() - 1; - st->sample_to_chunk[i].count = _fd->readUint32BE(); - st->sample_to_chunk[i].id = _fd->readUint32BE(); - //warning("Sample to Chunk[%d]: First = %d, Count = %d", i, st->sample_to_chunk[i].first, st->sample_to_chunk[i].count); - } - - return 0; -} - -int QuickTimeDecoder::readSTSS(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->keyframe_count = _fd->readUint32BE(); - - debug(0, "keyframe_count = %d", st->keyframe_count); - - st->keyframes = new uint32[st->keyframe_count]; - - if (!st->keyframes) - return -1; - - for (uint32 i = 0; i < st->keyframe_count; i++) { - st->keyframes[i] = _fd->readUint32BE() - 1; // Adjust here, the frames are based on 1 - debug(6, "keyframes[%d] = %d", i, st->keyframes[i]); - - } - return 0; -} - -int QuickTimeDecoder::readSTSZ(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->sample_size = _fd->readUint32BE(); - st->sample_count = _fd->readUint32BE(); - - debug(5, "sample_size = %d sample_count = %d", st->sample_size, st->sample_count); - - if (st->sample_size) - return 0; // there isn't any table following - - st->sample_sizes = new uint32[st->sample_count]; - - if (!st->sample_sizes) - return -1; - - for(uint32 i = 0; i < st->sample_count; i++) { - st->sample_sizes[i] = _fd->readUint32BE(); - debug(6, "sample_sizes[%d] = %d", i, st->sample_sizes[i]); - } - - return 0; -} - -static uint32 ff_gcd(uint32 a, uint32 b) { - return b ? ff_gcd(b, a % b) : a; -} - -int QuickTimeDecoder::readSTTS(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - uint32 duration = 0; - uint32 total_sample_count = 0; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->stts_count = _fd->readUint32BE(); - st->stts_data = new MOVstts[st->stts_count]; - - debug(0, "track[%i].stts.entries = %i", _numStreams - 1, st->stts_count); - - st->time_rate = 0; - - for (int32 i = 0; i < st->stts_count; i++) { - int sample_duration; - int sample_count; - - sample_count = _fd->readUint32BE(); - sample_duration = _fd->readUint32BE(); - st->stts_data[i].count = sample_count; - st->stts_data[i].duration = sample_duration; - - st->time_rate = ff_gcd(st->time_rate, sample_duration); - - debug(0, "sample_count=%d, sample_duration=%d", sample_count, sample_duration); - - duration += sample_duration * sample_count; - total_sample_count += sample_count; - } - - st->nb_frames = total_sample_count; - - if (duration) - st->duration = duration; - - return 0; -} - -int QuickTimeDecoder::readSTCO(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; - - _fd->readByte(); // version - _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - - st->chunk_count = _fd->readUint32BE(); - st->chunk_offsets = new uint32[st->chunk_count]; + // Version 0 videos (such as the Riven ones) don't have this set, + // but we need it later on. Add it in here. + if (format == MKID_BE('ima4')) { + entry->samplesPerFrame = 64; + entry->bytesPerFrame = 34 * entry->channels; + } - if (!st->chunk_offsets) - return -1; + if (entry->sampleRate == 0 && st->time_scale > 1) + entry->sampleRate = st->time_scale; - for (uint32 i = 0; i < st->chunk_count; i++) { - // WORKAROUND/HACK: The offsets in Riven videos (ones inside the Mohawk archives themselves) - // have offsets relative to the archive and not the video. This is quite nasty. We subtract - // the initial offset of the stream to get the correct value inside of the stream. - st->chunk_offsets[i] = _fd->readUint32BE() - _beginOffset; + return entry; } return 0; } -int QuickTimeDecoder::readWAVE(MOVatom atom) { - if (_numStreams < 1) - return 0; - - MOVStreamContext *st = _streams[_numStreams - 1]; - - if (atom.size > (1 << 30)) - return -1; - - if (st->sampleDescs[0]->codecTag == MKID_BE('QDM2')) // Read extradata for QDM2 - st->extradata = _fd->readStream(atom.size - 8); - else if (atom.size > 8) - return readDefault(atom); - else - _fd->skip(atom.size); - - return 0; -} - void QuickTimeDecoder::close() { stopAudio(); - for (uint32 i = 0; i < _numStreams; i++) - delete _streams[i]; - - delete _fd; - _fd = 0; - if (_scaledSurface) { _scaledSurface->free(); delete _scaledSurface; @@ -1263,6 +623,7 @@ void QuickTimeDecoder::close() { // The audio stream is deleted automatically _audStream = NULL; + Common::QuickTimeParser::close(); SeekableVideoDecoder::reset(); } @@ -1459,12 +820,7 @@ void QuickTimeDecoder::updateAudioBuffer() { readNextAudioChunk(); } -QuickTimeDecoder::SampleDesc::SampleDesc() { - codecTag = 0; - bitsPerSample = 0; -} - -QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc() : SampleDesc() { +QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc() : Common::QuickTimeParser::SampleDesc() { memset(codecName, 0, 32); colorTableId = 0; palette = 0; @@ -1476,49 +832,11 @@ QuickTimeDecoder::VideoSampleDesc::~VideoSampleDesc() { delete videoCodec; } -QuickTimeDecoder::AudioSampleDesc::AudioSampleDesc() : SampleDesc() { +QuickTimeDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimeParser::SampleDesc() { channels = 0; sampleRate = 0; samplesPerFrame = 0; bytesPerFrame = 0; } -QuickTimeDecoder::MOVStreamContext::MOVStreamContext() { - chunk_count = 0; - chunk_offsets = 0; - stts_count = 0; - stts_data = 0; - sample_to_chunk_sz = 0; - sample_to_chunk = 0; - sample_size = 0; - sample_count = 0; - sample_sizes = 0; - keyframe_count = 0; - keyframes = 0; - time_scale = 0; - time_rate = 0; - width = 0; - height = 0; - codec_type = CODEC_TYPE_MOV_OTHER; - editCount = 0; - editList = 0; - extradata = 0; - nb_frames = 0; - duration = 0; - start_time = 0; -} - -QuickTimeDecoder::MOVStreamContext::~MOVStreamContext() { - delete[] chunk_offsets; - delete[] stts_data; - delete[] sample_to_chunk; - delete[] sample_sizes; - delete[] keyframes; - delete[] editList; - delete extradata; - - for (uint32 i = 0; i < sampleDescs.size(); i++) - delete sampleDescs[i]; -} - } // End of namespace Video diff --git a/video/qt_decoder.h b/video/qt_decoder.h index 6a0aa61b20f3..3da695e55910 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -34,10 +34,8 @@ #ifndef VIDEO_QT_DECODER_H #define VIDEO_QT_DECODER_H -#include "common/array.h" +#include "common/quicktime.h" #include "common/scummsys.h" -#include "common/queue.h" -#include "common/rational.h" #include "video/video_decoder.h" #include "video/codecs/codec.h" @@ -46,7 +44,6 @@ #include "audio/mixer.h" namespace Common { - class File; class MacResManager; } @@ -59,7 +56,7 @@ namespace Video { * - mohawk * - sci */ -class QuickTimeDecoder : public SeekableVideoDecoder { +class QuickTimeDecoder : public SeekableVideoDecoder, public Common::QuickTimeParser { public: QuickTimeDecoder(); virtual ~QuickTimeDecoder(); @@ -106,14 +103,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder { const byte *getPalette() { _dirtyPalette = false; return _palette; } bool hasDirtyPalette() const { return _dirtyPalette; } - /** - * Set the beginning offset of the video so we can modify the offsets in the stco - * atom of videos inside the Mohawk archives - * @param the beginning offset of the video - */ - void setChunkBeginOffset(uint32 offset) { _beginOffset = offset; } - - bool isVideoLoaded() const { return _fd != 0; } + bool isVideoLoaded() const { return isOpen(); } const Graphics::Surface *decodeNextFrame(); bool endOfVideo() const; uint32 getElapsedTime() const; @@ -125,47 +115,8 @@ class QuickTimeDecoder : public SeekableVideoDecoder { void seekToTime(Audio::Timestamp time); uint32 getDuration() const { return _duration * 1000 / _timeScale; } -private: - // This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream. - Common::SeekableReadStream *_fd; - - struct MOVatom { - uint32 type; - uint32 offset; - uint32 size; - }; - - struct ParseTable { - int (QuickTimeDecoder::*func)(MOVatom atom); - uint32 type; - }; - - struct MOVstts { - int count; - int duration; - }; - - struct MOVstsc { - uint32 first; - uint32 count; - uint32 id; - }; - - struct EditListEntry { - uint32 trackDuration; - int32 mediaTime; - Common::Rational mediaRate; - }; - - struct SampleDesc { - SampleDesc(); - virtual ~SampleDesc() {} - - uint32 codecTag; - uint16 bitsPerSample; - }; - - struct VideoSampleDesc : public SampleDesc { +protected: + struct VideoSampleDesc : public Common::QuickTimeParser::SampleDesc { VideoSampleDesc(); ~VideoSampleDesc(); @@ -175,7 +126,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder { Codec *videoCodec; }; - struct AudioSampleDesc : public SampleDesc { + struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { AudioSampleDesc(); uint16 channels; @@ -184,62 +135,9 @@ class QuickTimeDecoder : public SeekableVideoDecoder { uint32 bytesPerFrame; }; - enum CodecType { - CODEC_TYPE_MOV_OTHER, - CODEC_TYPE_VIDEO, - CODEC_TYPE_AUDIO - }; - - struct MOVStreamContext { - MOVStreamContext(); - ~MOVStreamContext(); - - uint32 chunk_count; - uint32 *chunk_offsets; - int stts_count; - MOVstts *stts_data; - uint32 sample_to_chunk_sz; - MOVstsc *sample_to_chunk; - uint32 sample_size; - uint32 sample_count; - uint32 *sample_sizes; - uint32 keyframe_count; - uint32 *keyframes; - int32 time_scale; - int time_rate; - - uint16 width; - uint16 height; - CodecType codec_type; - - Common::Array sampleDescs; - - uint32 editCount; - EditListEntry *editList; - - Common::SeekableReadStream *extradata; - - uint32 nb_frames; - uint32 duration; - uint32 start_time; - Common::Rational scaleFactorX; - Common::Rational scaleFactorY; - }; - - const ParseTable *_parseTable; - bool _foundMOOV; - uint32 _timeScale; - uint32 _duration; - uint32 _numStreams; - Common::Rational _scaleFactorX; - Common::Rational _scaleFactorY; - MOVStreamContext *_streams[20]; - const byte *_palette; - bool _dirtyPalette; - uint32 _beginOffset; - Common::MacResManager *_resFork; + Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); - void initParseTable(); +private: Audio::AudioStream *createAudioStream(Common::SeekableReadStream *stream); bool checkAudioCodecSupport(uint32 tag); Common::SeekableReadStream *getNextFramePacket(uint32 &descId); @@ -263,30 +161,15 @@ class QuickTimeDecoder : public SeekableVideoDecoder { int8 _videoStreamIndex; uint32 findKeyFrame(uint32 frame) const; + bool _dirtyPalette; + const byte *_palette; + Graphics::Surface *_scaledSurface; const Graphics::Surface *scaleSurface(const Graphics::Surface *frame); Common::Rational getScaleFactorX() const; Common::Rational getScaleFactorY() const; void pauseVideoIntern(bool pause); - - int readDefault(MOVatom atom); - int readLeaf(MOVatom atom); - int readELST(MOVatom atom); - int readHDLR(MOVatom atom); - int readMDHD(MOVatom atom); - int readMOOV(MOVatom atom); - int readMVHD(MOVatom atom); - int readTKHD(MOVatom atom); - int readTRAK(MOVatom atom); - int readSTCO(MOVatom atom); - int readSTSC(MOVatom atom); - int readSTSD(MOVatom atom); - int readSTSS(MOVatom atom); - int readSTSZ(MOVatom atom); - int readSTTS(MOVatom atom); - int readCMOV(MOVatom atom); - int readWAVE(MOVatom atom); }; } // End of namespace Video From d718755d73fbacf5ef31159f85a9f822ff7a3f00 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 00:47:29 -0400 Subject: [PATCH 005/369] VIDEO: Cleanup The VideoDecoder interface to the QuickTimeParser uses almost entirely ScummVM code now, with only trace amounts remaining from FFmpeg. --- video/qt_decoder.cpp | 2 +- video/qt_decoder.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index fc91fd1f44ce..c25b76a5f23f 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -24,7 +24,7 @@ */ // -// Heavily based on ffmpeg code. +// Partially based on ffmpeg code. // // Copyright (c) 2001 Fabrice Bellard. // First version by Francois Revol revol@free.fr diff --git a/video/qt_decoder.h b/video/qt_decoder.h index 3da695e55910..65ade40c9335 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -24,7 +24,7 @@ */ // -// Heavily based on ffmpeg code. +// Partially based on ffmpeg code. // // Copyright (c) 2001 Fabrice Bellard. // First version by Francois Revol revol@free.fr From 7c39b844b8f635b8267ce50d22e74090e355ff0e Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Thu, 7 Apr 2011 23:36:17 +0930 Subject: [PATCH 006/369] GROOVIE: Add additional play-speed modes to T7G. These two speed modes enable faster movement throughout the mansion. iOS mode matches the behavior of the official iOS release while tweaked mode additionally uses original framerate for 'teeth' animations. --- engines/groovie/groovie.cpp | 10 ++++++++++ engines/groovie/groovie.h | 8 ++++++++ engines/groovie/player.cpp | 21 +++++++++++++++++---- engines/groovie/player.h | 8 +++++++- engines/groovie/script.cpp | 6 +++++- engines/groovie/script.h | 1 + engines/groovie/vdx.cpp | 10 ++++++++++ 7 files changed, 58 insertions(+), 6 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 67c8f3dbc740..ea9c0a9fb77c 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -55,6 +55,16 @@ GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) : SearchMan.addSubDirectoryMatching(gameDataDir, "media"); SearchMan.addSubDirectoryMatching(gameDataDir, "system"); + _modeSpeed = kGroovieSpeedNormal; + if (ConfMan.hasKey("t7g_speed")) + { + Common::String speed = ConfMan.get("t7g_speed"); + if (speed.equals("im_an_ios")) + _modeSpeed = kGroovieSpeediOS; + else if (speed.equals("tweaked")) + _modeSpeed = kGroovieSpeedTweaked; + } + // Initialize the custom debug levels DebugMan.addDebugChannel(kGroovieDebugAll, "All", "Debug everything"); DebugMan.addDebugChannel(kGroovieDebugVideo, "Video", "Debug video and audio playback"); diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index f8fad8d91ff6..bd376db0d2b8 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -75,6 +75,12 @@ enum DebugLevels { // the current limitation is 32 debug levels (1 << 31 is the last one) }; +enum GameSpeed { + kGroovieSpeedNormal, + kGroovieSpeediOS, + kGroovieSpeedTweaked +}; + struct GroovieGameDescription; class GroovieEngine : public Engine { @@ -113,6 +119,8 @@ class GroovieEngine : public Engine { Common::MacResManager *_macResFork; + GameSpeed _modeSpeed; + private: const GroovieGameDescription *_gameDescription; Debugger *_debugger; diff --git a/engines/groovie/player.cpp b/engines/groovie/player.cpp index 8badd90012cf..4b8ae0083fe3 100644 --- a/engines/groovie/player.cpp +++ b/engines/groovie/player.cpp @@ -29,18 +29,19 @@ namespace Groovie { VideoPlayer::VideoPlayer(GroovieEngine *vm) : - _vm(vm), _syst(vm->_system), _file(NULL), _audioStream(NULL) { + _vm(vm), _syst(vm->_system), _file(NULL), _audioStream(NULL), _fps(0), _overrideSpeed(false) { } bool VideoPlayer::load(Common::SeekableReadStream *file, uint16 flags) { _file = file; _flags = flags; + _overrideSpeed = false; _audioStream = NULL; - uint16 fps = loadInternal(); + _fps = loadInternal(); - if (fps != 0) { - _millisBetweenFrames = 1000 / fps; + if (_fps != 0) { + setOverrideSpeed(_overrideSpeed); _begunPlaying = false; return true; } else { @@ -49,6 +50,18 @@ bool VideoPlayer::load(Common::SeekableReadStream *file, uint16 flags) { } } +void VideoPlayer::setOverrideSpeed(bool isOverride) +{ + _overrideSpeed = isOverride; + if (_fps != 0) + { + if (isOverride) + _millisBetweenFrames = 1000 / 26; + else + _millisBetweenFrames = 1000 / _fps; + } +} + bool VideoPlayer::playFrame() { bool end = true; diff --git a/engines/groovie/player.h b/engines/groovie/player.h index c9f47b810009..e75a5fc3c0dd 100644 --- a/engines/groovie/player.h +++ b/engines/groovie/player.h @@ -48,15 +48,21 @@ class VideoPlayer { virtual uint16 loadInternal() = 0; virtual bool playFrameInternal() = 0; + void setOverrideSpeed(bool isOverride); + bool getOverrideSpeed() const { return _overrideSpeed; } + GroovieEngine *_vm; OSystem *_syst; Common::SeekableReadStream *_file; uint16 _flags; Audio::QueuingAudioStream *_audioStream; - + + private: // Synchronization stuff bool _begunPlaying; + bool _overrideSpeed; + uint16 _fps; uint16 _millisBetweenFrames; uint32 _lastFrameTime; diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 4abfff74f24b..782391dd7879 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -65,7 +65,7 @@ static void debugScript(int level, bool nl, const char *s, ...) { Script::Script(GroovieEngine *vm, EngineVersion version) : _code(NULL), _savedCode(NULL), _stacktop(0), _debugger(NULL), _vm(vm), - _videoFile(NULL), _videoRef(0), _staufsMove(NULL) { + _videoFile(NULL), _videoRef(0), _staufsMove(NULL), _lastCursor(0xff) { // Initialize the opcode set depending on the engine version switch (version) { case kGroovieT7G: @@ -387,6 +387,7 @@ bool Script::hotspot(Common::Rect rect, uint16 address, uint8 cursor) { // If clicked with the mouse, jump to the specified address if (_mouseClicked) { + _lastCursor = cursor; _inputAction = address; } } @@ -579,11 +580,14 @@ bool Script::playvideofromref(uint32 fileref) { if (_videoFile) { _videoRef = fileref; + if (_lastCursor == 7) + _bitflags |= (1 << 15); _vm->_videoPlayer->load(_videoFile, _bitflags); } else { error("Couldn't open file"); return true; } + _lastCursor = 0xff; _bitflags = 0; diff --git a/engines/groovie/script.h b/engines/groovie/script.h index cda87a8917c1..2360d45744fb 100644 --- a/engines/groovie/script.h +++ b/engines/groovie/script.h @@ -75,6 +75,7 @@ class Script { Common::RandomSource _random; bool _firstbit; + uint8 _lastCursor; // Script filename (for debugging purposes) Common::String _scriptFile; diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index 1b4a2b78008c..5569ae92caff 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -86,6 +86,11 @@ uint16 VDXPlayer::loadInternal() { _flagEight = ((_flags & (1 << 8)) != 0); _flagNine = ((_flags & (1 << 9)) != 0); + // Enable highspeed if we're not obeying fps, and not marked as special + // This will be disabled in chunk audio if we're actually an audio vdx + if ( _vm->_modeSpeed == kGroovieSpeediOS || (_vm->_modeSpeed == kGroovieSpeedTweaked && ((_flags & (1 << 15)) == 0))) + setOverrideSpeed(true); + if (_flagOnePrev && !_flagOne && !_flagEight) { _flagSeven = true; } @@ -522,6 +527,11 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth } void VDXPlayer::chunkSound(Common::ReadStream *in) { + if (getOverrideSpeed()) + { + setOverrideSpeed(false); + } + if (!_audioStream) { _audioStream = Audio::makeQueuingAudioStream(22050, false); Audio::SoundHandle sound_handle; From d5ff4781004d1f9b2eebea954933c4b39a4ce227 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Fri, 8 Apr 2011 00:17:59 +0930 Subject: [PATCH 007/369] GROOVIE: Fix brace formatting. --- engines/groovie/groovie.cpp | 3 +-- engines/groovie/player.cpp | 6 ++---- engines/groovie/vdx.cpp | 2 -- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index ea9c0a9fb77c..313a690aeadc 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -56,8 +56,7 @@ GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) : SearchMan.addSubDirectoryMatching(gameDataDir, "system"); _modeSpeed = kGroovieSpeedNormal; - if (ConfMan.hasKey("t7g_speed")) - { + if (ConfMan.hasKey("t7g_speed")) { Common::String speed = ConfMan.get("t7g_speed"); if (speed.equals("im_an_ios")) _modeSpeed = kGroovieSpeediOS; diff --git a/engines/groovie/player.cpp b/engines/groovie/player.cpp index 4b8ae0083fe3..92590d420c4d 100644 --- a/engines/groovie/player.cpp +++ b/engines/groovie/player.cpp @@ -50,11 +50,9 @@ bool VideoPlayer::load(Common::SeekableReadStream *file, uint16 flags) { } } -void VideoPlayer::setOverrideSpeed(bool isOverride) -{ +void VideoPlayer::setOverrideSpeed(bool isOverride) { _overrideSpeed = isOverride; - if (_fps != 0) - { + if (_fps != 0) { if (isOverride) _millisBetweenFrames = 1000 / 26; else diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index 5569ae92caff..61e5e3f6d719 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -528,9 +528,7 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth void VDXPlayer::chunkSound(Common::ReadStream *in) { if (getOverrideSpeed()) - { setOverrideSpeed(false); - } if (!_audioStream) { _audioStream = Audio::makeQueuingAudioStream(22050, false); From 50d25195524aaa11acc5ae08622c52a75d7f08ac Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 10:51:10 -0400 Subject: [PATCH 008/369] COMMON: Add iOS platform type --- common/util.cpp | 1 + common/util.h | 1 + 2 files changed, 2 insertions(+) diff --git a/common/util.cpp b/common/util.cpp index cba921a142dc..06954ac4412c 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -214,6 +214,7 @@ const PlatformDescription g_platforms[] = { { "windows", "win", "win", "Windows", kPlatformWindows }, { "playstation", "psx", "psx", "Sony PlayStation", kPlatformPSX }, { "cdi", "cdi", "cdi", "Phillips CD-i", kPlatformCDi }, + { "ios", "ios", "ios", "Apple iOS", kPlatformIOS }, { 0, 0, 0, "Default", kPlatformUnknown } }; diff --git a/common/util.h b/common/util.h index b3dd6a4f6496..e0bded2f54b2 100644 --- a/common/util.h +++ b/common/util.h @@ -176,6 +176,7 @@ enum Platform { kPlatformWii, kPlatformPSX, kPlatformCDi, + kPlatformIOS, kPlatformUnknown = -1 }; From af59f33b7b7646e299b053b8d46a25e49615f26b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 10:51:39 -0400 Subject: [PATCH 009/369] GROOVIE: Add a stub MPEG4 music player --- engines/groovie/groovie.cpp | 14 ++++++++++++-- engines/groovie/music.cpp | 14 ++++++++++++++ engines/groovie/music.h | 9 +++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 313a690aeadc..47070cc08645 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -151,10 +151,20 @@ Common::Error GroovieEngine::run() { } // Create the music player - if (getPlatform() == Common::kPlatformMacintosh) + switch (getPlatform()) { + case Common::kPlatformMacintosh: + // TODO: The 11th Hour Mac uses QuickTime MIDI files + // Right now, since the XMIDI are present and it is still detected as + // the DOS version, we don't have to do anything here. _musicPlayer = new MusicPlayerMac(this); - else + break; + case Common::kPlatformIOS: + _musicPlayer = new MusicPlayerMPEG4(this); + break; + default: _musicPlayer = new MusicPlayerXMI(this, _gameDescription->version == kGroovieT7G ? "fat" : "sample"); + break; + } // Load volume levels syncSoundSettings(); diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 7529f95bcfe4..bdb080d2042c 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -747,4 +747,18 @@ Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadS return new Common::MemoryReadStream(output, size, DisposeAfterUse::YES); } +MusicPlayerMPEG4::MusicPlayerMPEG4(GroovieEngine *vm) : MusicPlayer(vm) { +} + +void MusicPlayerMPEG4::updateVolume() { + // TODO: Check if anything has to be done here +} + +bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { + // TODO + Common::String filename = Common::String::format("gu%d.m4a", fileref & 0x3FF); + warning("TODO: Play MPEG-4 sound '%s'", filename.c_str()); + return false; +} + } // End of Groovie namespace diff --git a/engines/groovie/music.h b/engines/groovie/music.h index bde0a7a16f39..9855c898fe6b 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -160,6 +160,15 @@ class MusicPlayerMac : public MusicPlayerMidi { Common::SeekableReadStream *decompressMidi(Common::SeekableReadStream *stream); }; +class MusicPlayerMPEG4 : public MusicPlayer { +public: + MusicPlayerMPEG4(GroovieEngine *vm); + +protected: + void updateVolume(); + bool load(uint32 fileref, bool loop); +}; + } // End of Groovie namespace #endif // GROOVIE_MUSIC_H From d40874d6f4bce278b4ab3b0ef6fb34d35466b852 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Fri, 8 Apr 2011 07:21:21 +0930 Subject: [PATCH 010/369] GROOVIE: Add detection for T7G iOS based on m4a files --- engines/groovie/detection.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index cf3a035354dc..00116d6e00bd 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -114,6 +114,20 @@ static const GroovieGameDescription gameDescriptions[] = { kGroovieT7G, 0 }, + { + { + "t7g", "", + { + { "script.grv", 0, "d1b8033b40aa67c076039881eccce90d", 16659}, + { "gu16.m4a", 0, NULL, 2051214 }, + { NULL, 0, NULL, 0} + }, + Common::EN_ANY, Common::kPlatformIOS, ADGF_NO_FLAGS, + Common::GUIO_NOMIDI + }, + kGroovieT7G, 0 + }, + #ifdef ENABLE_GROOVIE2 // The 11th Hour DOS English { From 8cf73e3fb4e44567a7afa527a0705acb90033a78 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 19:29:49 -0400 Subject: [PATCH 011/369] AUDIO: Split QuickTime audio into a new class Standalone QuickTime files can now be played as an AudioStream --- {video/codecs => audio/decoders}/qdm2.cpp | 14 +- {video/codecs => audio/decoders}/qdm2.h | 14 +- {video/codecs => audio/decoders}/qdm2data.h | 8 +- audio/decoders/quicktime.cpp | 311 ++++++++++++++++++++ audio/decoders/quicktime.h | 96 ++++++ audio/module.mk | 2 + video/module.mk | 1 - video/qt_decoder.cpp | 215 +------------- video/qt_decoder.h | 19 +- 9 files changed, 444 insertions(+), 236 deletions(-) rename {video/codecs => audio/decoders}/qdm2.cpp (99%) rename {video/codecs => audio/decoders}/qdm2.h (84%) rename {video/codecs => audio/decoders}/qdm2data.h (99%) create mode 100644 audio/decoders/quicktime.cpp create mode 100644 audio/decoders/quicktime.h diff --git a/video/codecs/qdm2.cpp b/audio/decoders/qdm2.cpp similarity index 99% rename from video/codecs/qdm2.cpp rename to audio/decoders/qdm2.cpp index 762f56b3d73c..2bbb608754c9 100644 --- a/video/codecs/qdm2.cpp +++ b/audio/decoders/qdm2.cpp @@ -26,18 +26,18 @@ // Based off ffmpeg's QDM2 decoder #include "common/scummsys.h" -#include "video/codecs/qdm2.h" +#include "audio/decoders/qdm2.h" -#ifdef VIDEO_CODECS_QDM2_H +#ifdef AUDIO_QDM2_H #include "audio/audiostream.h" -#include "video/codecs/qdm2data.h" +#include "audio/decoders/qdm2data.h" #include "common/array.h" #include "common/stream.h" #include "common/system.h" -namespace Video { +namespace Audio { enum { SOFTCLIP_THRESHOLD = 27600, @@ -152,7 +152,7 @@ struct RDFTContext { FFTContext fft; }; -class QDM2Stream : public Audio::AudioStream { +class QDM2Stream : public AudioStream { public: QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData); ~QDM2Stream(); @@ -3272,10 +3272,10 @@ int QDM2Stream::readBuffer(int16 *buffer, const int numSamples) { return decodedSamples; } -Audio::AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData) { +AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData) { return new QDM2Stream(stream, extraData); } -} // End of namespace Video +} // End of namespace Audio #endif diff --git a/video/codecs/qdm2.h b/audio/decoders/qdm2.h similarity index 84% rename from video/codecs/qdm2.h rename to audio/decoders/qdm2.h index a6acf3a83e71..3d4b542de1a0 100644 --- a/video/codecs/qdm2.h +++ b/audio/decoders/qdm2.h @@ -26,18 +26,16 @@ // Only compile if Mohawk is enabled or if we're building dynamic modules #if defined(ENABLE_MOHAWK) || defined(DYNAMIC_MODULES) -#ifndef VIDEO_CODECS_QDM2_H -#define VIDEO_CODECS_QDM2_H +#ifndef AUDIO_QDM2_H +#define AUDIO_QDM2_H namespace Common { class SeekableReadStream; } namespace Audio { - class AudioStream; -} -namespace Video { +class AudioStream; /** * Create a new AudioStream from the QDM2 data in the given stream. @@ -46,9 +44,9 @@ namespace Video { * @param extraData the QuickTime extra data stream * @return a new AudioStream, or NULL, if an error occurred */ -Audio::AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData); +AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData); -} // End of namespace Video +} // End of namespace Audio -#endif // VIDEO_CODECS_QDM2_H +#endif // AUDIO_QDM2_H #endif // Mohawk/Plugins guard diff --git a/video/codecs/qdm2data.h b/audio/decoders/qdm2data.h similarity index 99% rename from video/codecs/qdm2data.h rename to audio/decoders/qdm2data.h index e1a690bd2b9a..cfe1a3d10eb8 100644 --- a/video/codecs/qdm2data.h +++ b/audio/decoders/qdm2data.h @@ -23,12 +23,12 @@ * */ -#ifndef VIDEO_CODECS_QDM2DATA_H -#define VIDEO_CODECS_QDM2DATA_H +#ifndef AUDIO_QDM2DATA_H +#define AUDIO_QDM2DATA_H #include "common/scummsys.h" -namespace Video { +namespace Audio { /// VLC TABLES @@ -526,6 +526,6 @@ static const float type34_delta[10] = { // FIXME: covers 8 entries.. 0.138071194291115f,0.333333343267441f,0.60947573184967f,1.0f,0.0f, }; -} // End of namespace Video +} // End of namespace Audio #endif diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp new file mode 100644 index 000000000000..af59d8803f5a --- /dev/null +++ b/audio/decoders/quicktime.cpp @@ -0,0 +1,311 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/debug.h" +#include "common/util.h" +#include "common/memstream.h" +#include "common/stream.h" + +#include "audio/audiostream.h" +#include "audio/decoders/quicktime.h" + +// Codecs +#include "audio/decoders/adpcm.h" +#include "audio/decoders/qdm2.h" +#include "audio/decoders/raw.h" + +namespace Audio { + +QuickTimeAudioDecoder::QuickTimeAudioDecoder() : Common::QuickTimeParser() { + _audStream = 0; +} + +QuickTimeAudioDecoder::~QuickTimeAudioDecoder() { +} + +bool QuickTimeAudioDecoder::loadFile(const Common::String &filename) { + if (!Common::QuickTimeParser::loadFile(filename)) + return false; + + init(); + return true; +} + +bool QuickTimeAudioDecoder::loadStream(Common::SeekableReadStream *stream) { + if (!Common::QuickTimeParser::loadStream(stream)) + return false; + + init(); + return true; +} + +void QuickTimeAudioDecoder::init() { + Common::QuickTimeParser::init(); + + _audioStreamIndex = -1; + + // Find an audio stream + for (uint32 i = 0; i < _numStreams; i++) + if (_streams[i]->codec_type == CODEC_TYPE_AUDIO && _audioStreamIndex < 0) + _audioStreamIndex = i; + + // Initialize audio, if present + if (_audioStreamIndex >= 0) { + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + + if (checkAudioCodecSupport(entry->codecTag)) { + _audStream = makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + _curAudioChunk = 0; + + // Make sure the bits per sample transfers to the sample size + if (entry->codecTag == MKID_BE('raw ') || entry->codecTag == MKID_BE('twos')) + _streams[_audioStreamIndex]->sample_size = (entry->bitsPerSample / 8) * entry->channels; + } + } +} + +Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVStreamContext *st, uint32 format) { + if (st->codec_type == CODEC_TYPE_AUDIO) { + debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); + + AudioSampleDesc *entry = new AudioSampleDesc(); + entry->codecTag = format; + + uint16 stsdVersion = _fd->readUint16BE(); + _fd->readUint16BE(); // revision level + _fd->readUint32BE(); // vendor + + entry->channels = _fd->readUint16BE(); // channel count + entry->bitsPerSample = _fd->readUint16BE(); // sample size + + _fd->readUint16BE(); // compression id = 0 + _fd->readUint16BE(); // packet size = 0 + + entry->sampleRate = (_fd->readUint32BE() >> 16); + + debug(0, "stsd version =%d", stsdVersion); + if (stsdVersion == 0) { + // Not used, except in special cases. See below. + entry->samplesPerFrame = entry->bytesPerFrame = 0; + } else if (stsdVersion == 1) { + // Read QT version 1 fields. In version 0 these dont exist. + entry->samplesPerFrame = _fd->readUint32BE(); + debug(0, "stsd samples_per_frame =%d",entry->samplesPerFrame); + _fd->readUint32BE(); // bytes per packet + entry->bytesPerFrame = _fd->readUint32BE(); + debug(0, "stsd bytes_per_frame =%d", entry->bytesPerFrame); + _fd->readUint32BE(); // bytes per sample + } else { + warning("Unsupported QuickTime STSD audio version %d", stsdVersion); + delete entry; + return 0; + } + + // Version 0 videos (such as the Riven ones) don't have this set, + // but we need it later on. Add it in here. + if (format == MKID_BE('ima4')) { + entry->samplesPerFrame = 64; + entry->bytesPerFrame = 34 * entry->channels; + } + + if (entry->sampleRate == 0 && st->time_scale > 1) + entry->sampleRate = st->time_scale; + + return entry; + } + + return 0; +} + +bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag) { + // Check if the codec is a supported codec + if (tag == MKID_BE('twos') || tag == MKID_BE('raw ') || tag == MKID_BE('ima4')) + return true; + +#ifdef AUDIO_QDM2_H + if (tag == MKID_BE('QDM2')) + return true; +#endif + + if (tag == MKID_BE('mp4a')) + warning("No MPEG-4 audio (AAC) support"); + else + warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); + + return false; +} + +AudioStream *QuickTimeAudioDecoder::createAudioStream(Common::SeekableReadStream *stream) { + if (!stream || _audioStreamIndex < 0) + return NULL; + + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + + if (entry->codecTag == MKID_BE('twos') || entry->codecTag == MKID_BE('raw ')) { + // Fortunately, most of the audio used in Myst videos is raw... + uint16 flags = 0; + if (entry->codecTag == MKID_BE('raw ')) + flags |= FLAG_UNSIGNED; + if (entry->channels == 2) + flags |= FLAG_STEREO; + if (entry->bitsPerSample == 16) + flags |= FLAG_16BITS; + uint32 dataSize = stream->size(); + byte *data = (byte *)malloc(dataSize); + stream->read(data, dataSize); + delete stream; + return makeRawStream(data, dataSize, entry->sampleRate, flags); + } else if (entry->codecTag == MKID_BE('ima4')) { + // Riven uses this codec (as do some Myst ME videos) + return makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), kADPCMApple, entry->sampleRate, entry->channels, 34); +#ifdef AUDIO_QDM2_H + } else if (entry->codecTag == MKID_BE('QDM2')) { + // Myst ME uses this codec for many videos + return makeQDM2Stream(stream, _streams[_audioStreamIndex]->extradata); +#endif + } + + error("Unsupported audio codec"); + + return NULL; +} + +uint32 QuickTimeAudioDecoder::getAudioChunkSampleCount(uint chunk) { + if (_audioStreamIndex < 0) + return 0; + + uint32 sampleCount = 0; + + for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) + if (chunk >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) + sampleCount = _streams[_audioStreamIndex]->sample_to_chunk[j].count; + + return sampleCount; +} + +void QuickTimeAudioDecoder::queueNextAudioChunk() { + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + Common::MemoryWriteStreamDynamic *wStream = new Common::MemoryWriteStreamDynamic(); + + _fd->seek(_streams[_audioStreamIndex]->chunk_offsets[_curAudioChunk]); + + // First, we have to get the sample count + uint32 sampleCount = getAudioChunkSampleCount(_curAudioChunk); + assert(sampleCount); + + // Then calculate the right sizes + while (sampleCount > 0) { + uint32 samples = 0, size = 0; + + if (entry->samplesPerFrame >= 160) { + samples = entry->samplesPerFrame; + size = entry->bytesPerFrame; + } else if (entry->samplesPerFrame > 1) { + samples = MIN((1024 / entry->samplesPerFrame) * entry->samplesPerFrame, sampleCount); + size = (samples / entry->samplesPerFrame) * entry->bytesPerFrame; + } else { + samples = MIN(1024, sampleCount); + size = samples * _streams[_audioStreamIndex]->sample_size; + } + + // Now, we read in the data for this data and output it + byte *data = (byte *)malloc(size); + _fd->read(data, size); + wStream->write(data, size); + free(data); + sampleCount -= samples; + } + + // Now queue the buffer + _audStream->queueAudioStream(createAudioStream(new Common::MemoryReadStream(wStream->getData(), wStream->size(), DisposeAfterUse::YES))); + delete wStream; + + _curAudioChunk++; +} + +QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimeParser::SampleDesc() { + channels = 0; + sampleRate = 0; + samplesPerFrame = 0; + bytesPerFrame = 0; +} + +/** + * A wrapper around QuickTimeAudioDecoder that implements the RewindableAudioStream API + */ +class QuickTimeAudioStream : public RewindableAudioStream, public QuickTimeAudioDecoder { +public: + QuickTimeAudioStream() {} + + ~QuickTimeAudioStream() { + delete _audStream; + } + + bool loadFile(const Common::String &filename) { + return QuickTimeAudioDecoder::loadFile(filename) && _audioStreamIndex >= 0 && _audStream; + } + + // AudioStream API + int readBuffer(int16 *buffer, const int numSamples) { + int samples = 0; + + while (samples < numSamples && !endOfData()) { + if (_audStream->numQueuedStreams() == 0) + queueNextAudioChunk(); + + samples += _audStream->readBuffer(buffer + samples, numSamples - samples); + } + + return samples; + } + + bool isStereo() const { return _audStream->isStereo(); } + int getRate() const { return _audStream->getRate(); } + bool endOfData() const { return _curAudioChunk >= _streams[_audioStreamIndex]->chunk_count && _audStream->endOfData(); } + + // RewindableAudioStream API + bool rewind() { + // Reset our parent stream + _curAudioChunk = 0; + delete _audStream; + + AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + _audStream = makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + return true; + } +}; + +RewindableAudioStream *makeQuickTimeStream(const Common::String &filename) { + QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); + + if (!audioStream->loadFile(filename)) { + delete audioStream; + return 0; + } + + return audioStream; +} + +} // End of namespace Audio diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h new file mode 100644 index 000000000000..eb0f79174861 --- /dev/null +++ b/audio/decoders/quicktime.h @@ -0,0 +1,96 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef AUDIO_QUICKTIME_H +#define AUDIO_QUICKTIME_H + +#include "common/quicktime.h" +#include "common/scummsys.h" +#include "common/types.h" + +namespace Common { + class SeekableReadStream; + class String; +} + +namespace Audio { + +class AudioStream; +class RewindableAudioStream; +class QueuingAudioStream; + +class QuickTimeAudioDecoder : public Common::QuickTimeParser { +public: + QuickTimeAudioDecoder(); + virtual ~QuickTimeAudioDecoder(); + + /** + * Load a QuickTime audio file + * @param filename the filename to load + */ + bool loadFile(const Common::String &filename); + + /** + * Load a QuickTime audio file from a SeekableReadStream + * @param stream the stream to load + */ + bool loadStream(Common::SeekableReadStream *stream); + +protected: + struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { + AudioSampleDesc(); + + uint16 channels; + uint32 sampleRate; + uint32 samplesPerFrame; + uint32 bytesPerFrame; + }; + + // Common::QuickTimeParser API + virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); + + AudioStream *createAudioStream(Common::SeekableReadStream *stream); + bool checkAudioCodecSupport(uint32 tag); + void init(); + + void queueNextAudioChunk(); + uint32 getAudioChunkSampleCount(uint chunk); + int8 _audioStreamIndex; + uint _curAudioChunk; + QueuingAudioStream *_audStream; +}; + +/** + * Try to load a QuickTime sound file from the given file name and create a RewindableAudioStream + * from that data. + * + * @param filename the filename of the file from which to read the data + * @return a new RewindableAudioStream, or NULL, if an error occurred + */ +RewindableAudioStream *makeQuickTimeStream(const Common::String &filename); + +} // End of namespace Audio + +#endif diff --git a/audio/module.mk b/audio/module.mk index a9d9bfc869fd..a13eb49bb182 100644 --- a/audio/module.mk +++ b/audio/module.mk @@ -19,6 +19,8 @@ MODULE_OBJS := \ decoders/iff_sound.o \ decoders/mac_snd.o \ decoders/mp3.o \ + decoders/qdm2.o \ + decoders/quicktime.o \ decoders/raw.o \ decoders/vag.o \ decoders/voc.o \ diff --git a/video/module.mk b/video/module.mk index 0172482dfa77..308b344a7502 100644 --- a/video/module.mk +++ b/video/module.mk @@ -15,7 +15,6 @@ MODULE_OBJS := \ codecs/mjpeg.o \ codecs/msrle.o \ codecs/msvideo1.o \ - codecs/qdm2.o \ codecs/qtrle.o \ codecs/rpza.o \ codecs/smc.o \ diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index c25b76a5f23f..71f31d641571 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -38,11 +38,6 @@ #include "common/memstream.h" #include "common/util.h" -// Audio codecs -#include "audio/decoders/adpcm.h" -#include "audio/decoders/raw.h" -#include "video/codecs/qdm2.h" - // Video codecs #include "video/codecs/cinepak.h" #include "video/codecs/mjpeg.h" @@ -58,7 +53,6 @@ namespace Video { //////////////////////////////////////////// QuickTimeDecoder::QuickTimeDecoder() { - _audStream = NULL; _curFrame = -1; _startTime = _nextFrameStartTime = 0; _audHandle = Audio::SoundHandle(); @@ -175,7 +169,7 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { _audioStartOffset = curVideoTime; // Re-create the audio stream - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); // First, we need to track down what audio sample we need @@ -216,7 +210,7 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { } // Reposition the audio stream - readNextAudioChunk(); + queueNextAudioChunk(); if (sample != totalSamples) { // HACK: Skip a certain amount of samples from the stream // (There's got to be a better way to do this!) @@ -232,7 +226,7 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { } void QuickTimeDecoder::seekToTime(Audio::Timestamp time) { - // TODO: Audio-only seeking (or really, have QuickTime sounds) + // Use makeQuickTimeStream() instead if (_videoStreamIndex < 0) error("Audio-only seeking not supported"); @@ -404,10 +398,7 @@ bool QuickTimeDecoder::loadFile(const Common::String &filename) { if (!Common::QuickTimeParser::loadFile(filename)) return false; - _videoStreamIndex = _audioStreamIndex = -1; - _startTime = 0; init(); - return true; } @@ -415,39 +406,24 @@ bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { if (!Common::QuickTimeParser::loadStream(stream)) return false; - _videoStreamIndex = _audioStreamIndex = -1; - _startTime = 0; init(); - return true; } void QuickTimeDecoder::init() { - Common::QuickTimeParser::init(); + Audio::QuickTimeAudioDecoder::init(); + + _videoStreamIndex = -1; + _startTime = 0; - // Find audio/video streams - for (uint32 i = 0; i < _numStreams; i++) { + // Find video streams + for (uint32 i = 0; i < _numStreams; i++) if (_streams[i]->codec_type == CODEC_TYPE_VIDEO && _videoStreamIndex < 0) _videoStreamIndex = i; - else if (_streams[i]->codec_type == CODEC_TYPE_AUDIO && _audioStreamIndex < 0) - _audioStreamIndex = i; - } - - // Initialize audio, if present - if (_audioStreamIndex >= 0) { - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - - if (checkAudioCodecSupport(entry->codecTag)) { - _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); - _curAudioChunk = 0; - - // Make sure the bits per sample transfers to the sample size - if (entry->codecTag == MKID_BE('raw ') || entry->codecTag == MKID_BE('twos')) - _streams[_audioStreamIndex]->sample_size = (entry->bitsPerSample / 8) * entry->channels; - - startAudio(); - } + // Start the audio codec if we've got one that we can handle + if (_audStream) { + startAudio(); _audioStartOffset = Audio::Timestamp(0); } @@ -558,57 +534,11 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC } } - return entry; - } else if (st->codec_type == CODEC_TYPE_AUDIO) { - debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); - - AudioSampleDesc *entry = new AudioSampleDesc(); - entry->codecTag = format; - - uint16 stsdVersion = _fd->readUint16BE(); - _fd->readUint16BE(); // revision level - _fd->readUint32BE(); // vendor - - entry->channels = _fd->readUint16BE(); // channel count - entry->bitsPerSample = _fd->readUint16BE(); // sample size - - _fd->readUint16BE(); // compression id = 0 - _fd->readUint16BE(); // packet size = 0 - - entry->sampleRate = (_fd->readUint32BE() >> 16); - - debug(0, "stsd version =%d", stsdVersion); - if (stsdVersion == 0) { - // Not used, except in special cases. See below. - entry->samplesPerFrame = entry->bytesPerFrame = 0; - } else if (stsdVersion == 1) { - // Read QT version 1 fields. In version 0 these dont exist. - entry->samplesPerFrame = _fd->readUint32BE(); - debug(0, "stsd samples_per_frame =%d",entry->samplesPerFrame); - _fd->readUint32BE(); // bytes per packet - entry->bytesPerFrame = _fd->readUint32BE(); - debug(0, "stsd bytes_per_frame =%d", entry->bytesPerFrame); - _fd->readUint32BE(); // bytes per sample - } else { - warning("Unsupported QuickTime STSD audio version %d", stsdVersion); - delete entry; - return 0; - } - - // Version 0 videos (such as the Riven ones) don't have this set, - // but we need it later on. Add it in here. - if (format == MKID_BE('ima4')) { - entry->samplesPerFrame = 64; - entry->bytesPerFrame = 34 * entry->channels; - } - - if (entry->sampleRate == 0 && st->time_scale > 1) - entry->sampleRate = st->time_scale; - return entry; } - return 0; + // Pass it on up + return Audio::QuickTimeAudioDecoder::readSampleDesc(st, format); } void QuickTimeDecoder::close() { @@ -681,112 +611,6 @@ Common::SeekableReadStream *QuickTimeDecoder::getNextFramePacket(uint32 &descId) return _fd->readStream(_streams[_videoStreamIndex]->sample_sizes[getCurFrame()]); } -bool QuickTimeDecoder::checkAudioCodecSupport(uint32 tag) { - // Check if the codec is a supported codec - if (tag == MKID_BE('twos') || tag == MKID_BE('raw ') || tag == MKID_BE('ima4')) - return true; - -#ifdef VIDEO_CODECS_QDM2_H - if (tag == MKID_BE('QDM2')) - return true; -#endif - - if (tag == MKID_BE('mp4a')) - warning("No MPEG-4 audio (AAC) support"); - else - warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); - - return false; -} - -Audio::AudioStream *QuickTimeDecoder::createAudioStream(Common::SeekableReadStream *stream) { - if (!stream || _audioStreamIndex < 0) - return NULL; - - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - - if (entry->codecTag == MKID_BE('twos') || entry->codecTag == MKID_BE('raw ')) { - // Fortunately, most of the audio used in Myst videos is raw... - uint16 flags = 0; - if (entry->codecTag == MKID_BE('raw ')) - flags |= Audio::FLAG_UNSIGNED; - if (entry->channels == 2) - flags |= Audio::FLAG_STEREO; - if (entry->bitsPerSample == 16) - flags |= Audio::FLAG_16BITS; - uint32 dataSize = stream->size(); - byte *data = (byte *)malloc(dataSize); - stream->read(data, dataSize); - delete stream; - return Audio::makeRawStream(data, dataSize, entry->sampleRate, flags); - } else if (entry->codecTag == MKID_BE('ima4')) { - // Riven uses this codec (as do some Myst ME videos) - return Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMApple, entry->sampleRate, entry->channels, 34); -#ifdef VIDEO_CODECS_QDM2_H - } else if (entry->codecTag == MKID_BE('QDM2')) { - // Several Myst ME videos use this codec - return makeQDM2Stream(stream, _streams[_audioStreamIndex]->extradata); -#endif - } - - error("Unsupported audio codec"); - - return NULL; -} - -uint32 QuickTimeDecoder::getAudioChunkSampleCount(uint chunk) { - if (_audioStreamIndex < 0) - return 0; - - uint32 sampleCount = 0; - - for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) - if (chunk >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) - sampleCount = _streams[_audioStreamIndex]->sample_to_chunk[j].count; - - return sampleCount; -} - -void QuickTimeDecoder::readNextAudioChunk() { - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - Common::MemoryWriteStreamDynamic *wStream = new Common::MemoryWriteStreamDynamic(); - - _fd->seek(_streams[_audioStreamIndex]->chunk_offsets[_curAudioChunk]); - - // First, we have to get the sample count - uint32 sampleCount = getAudioChunkSampleCount(_curAudioChunk); - assert(sampleCount); - - // Then calculate the right sizes - while (sampleCount > 0) { - uint32 samples = 0, size = 0; - - if (entry->samplesPerFrame >= 160) { - samples = entry->samplesPerFrame; - size = entry->bytesPerFrame; - } else if (entry->samplesPerFrame > 1) { - samples = MIN((1024 / entry->samplesPerFrame) * entry->samplesPerFrame, sampleCount); - size = (samples / entry->samplesPerFrame) * entry->bytesPerFrame; - } else { - samples = MIN(1024, sampleCount); - size = samples * _streams[_audioStreamIndex]->sample_size; - } - - // Now, we read in the data for this data and output it - byte *data = (byte *)malloc(size); - _fd->read(data, size); - wStream->write(data, size); - free(data); - sampleCount -= samples; - } - - // Now queue the buffer - _audStream->queueAudioStream(createAudioStream(new Common::MemoryReadStream(wStream->getData(), wStream->size(), DisposeAfterUse::YES))); - delete wStream; - - _curAudioChunk++; -} - void QuickTimeDecoder::updateAudioBuffer() { if (!_audStream) return; @@ -797,7 +621,7 @@ void QuickTimeDecoder::updateAudioBuffer() { // If we're on the last frame, make sure all audio remaining is buffered numberOfChunksNeeded = _streams[_audioStreamIndex]->chunk_count; } else { - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; // Calculate the amount of chunks we need in memory until the next frame uint32 timeToNextFrame = getTimeToNextFrame(); @@ -817,7 +641,7 @@ void QuickTimeDecoder::updateAudioBuffer() { // Keep three streams in buffer so that if/when the first two end, it goes right into the next while (_audStream->numQueuedStreams() < numberOfChunksNeeded && _curAudioChunk < _streams[_audioStreamIndex]->chunk_count) - readNextAudioChunk(); + queueNextAudioChunk(); } QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc() : Common::QuickTimeParser::SampleDesc() { @@ -832,11 +656,4 @@ QuickTimeDecoder::VideoSampleDesc::~VideoSampleDesc() { delete videoCodec; } -QuickTimeDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimeParser::SampleDesc() { - channels = 0; - sampleRate = 0; - samplesPerFrame = 0; - bytesPerFrame = 0; -} - } // End of namespace Video diff --git a/video/qt_decoder.h b/video/qt_decoder.h index 65ade40c9335..b9c4b9b41da8 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -34,7 +34,6 @@ #ifndef VIDEO_QT_DECODER_H #define VIDEO_QT_DECODER_H -#include "common/quicktime.h" #include "common/scummsys.h" #include "video/video_decoder.h" @@ -42,6 +41,7 @@ #include "audio/audiostream.h" #include "audio/mixer.h" +#include "audio/decoders/quicktime.h" namespace Common { class MacResManager; @@ -56,7 +56,7 @@ namespace Video { * - mohawk * - sci */ -class QuickTimeDecoder : public SeekableVideoDecoder, public Common::QuickTimeParser { +class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAudioDecoder { public: QuickTimeDecoder(); virtual ~QuickTimeDecoder(); @@ -126,32 +126,17 @@ class QuickTimeDecoder : public SeekableVideoDecoder, public Common::QuickTimePa Codec *videoCodec; }; - struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { - AudioSampleDesc(); - - uint16 channels; - uint32 sampleRate; - uint32 samplesPerFrame; - uint32 bytesPerFrame; - }; - Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); private: - Audio::AudioStream *createAudioStream(Common::SeekableReadStream *stream); - bool checkAudioCodecSupport(uint32 tag); Common::SeekableReadStream *getNextFramePacket(uint32 &descId); uint32 getFrameDuration(); void init(); - Audio::QueuingAudioStream *_audStream; void startAudio(); void stopAudio(); void updateAudioBuffer(); void readNextAudioChunk(); - uint32 getAudioChunkSampleCount(uint chunk); - int8 _audioStreamIndex; - uint _curAudioChunk; Audio::SoundHandle _audHandle; Audio::Timestamp _audioStartOffset; From 9c2fc6721d1719193b465a5bdc8a8308e15832d6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 19:39:22 -0400 Subject: [PATCH 012/369] GROOVIE: Hook into the new QuickTimeAudioStream code --- engines/groovie/music.cpp | 24 +++++++++++++++++++++--- engines/groovie/music.h | 4 ++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index bdb080d2042c..0d0d8770b347 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -31,7 +31,9 @@ #include "common/config-manager.h" #include "common/macresman.h" #include "common/memstream.h" +#include "audio/audiostream.h" #include "audio/midiparser.h" +#include "audio/decoders/quicktime.h" namespace Groovie { @@ -755,10 +757,26 @@ void MusicPlayerMPEG4::updateVolume() { } bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { - // TODO + // Stop any old sound + _vm->_system->getMixer()->stopHandle(_handle); + + // Create the audio stream Common::String filename = Common::String::format("gu%d.m4a", fileref & 0x3FF); - warning("TODO: Play MPEG-4 sound '%s'", filename.c_str()); - return false; + Audio::AudioStream *audStream = Audio::makeQuickTimeStream(filename); + + if (!audStream) { + // MPEG-4 sounds aren't handled yet, so nothing should play here yet + warning("Could not play MPEG-4 sound '%s'", filename.c_str()); + return false; + } + + // Loop if requested + if (loop) + audStream = Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audStream, 0); + + // Play! + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_handle, audStream); + return true; } } // End of Groovie namespace diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 9855c898fe6b..8f8aabb0db9c 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -29,6 +29,7 @@ #include "common/array.h" #include "common/mutex.h" #include "audio/mididrv.h" +#include "audio/mixer.h" class MidiParser; @@ -167,6 +168,9 @@ class MusicPlayerMPEG4 : public MusicPlayer { protected: void updateVolume(); bool load(uint32 fileref, bool loop); + +private: + Audio::SoundHandle _handle; }; } // End of Groovie namespace From 25236ebde1f1a24c6661c1de74fd28cdd46fdafc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 7 Apr 2011 20:34:54 -0400 Subject: [PATCH 013/369] GROOVIE: Implement MusicPlayerMPEG4::updateVolume() --- engines/groovie/music.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 0d0d8770b347..e02125c192c1 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -753,7 +753,8 @@ MusicPlayerMPEG4::MusicPlayerMPEG4(GroovieEngine *vm) : MusicPlayer(vm) { } void MusicPlayerMPEG4::updateVolume() { - // TODO: Check if anything has to be done here + // Just set the mixer volume for the music sound type + _vm->_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, _userVolume * _gameVolume / 100); } bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { From c44b509b053ddd8a9d1cd63056058adc8b54b1cf Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Fri, 8 Apr 2011 21:00:59 +0930 Subject: [PATCH 014/369] GROOVIE: Store resource name in ResInfo struct --- engines/groovie/resource.cpp | 2 ++ engines/groovie/resource.h | 1 + 2 files changed, 3 insertions(+) diff --git a/engines/groovie/resource.cpp b/engines/groovie/resource.cpp index 5d4ccf7d91d2..2cb571b4cc78 100644 --- a/engines/groovie/resource.cpp +++ b/engines/groovie/resource.cpp @@ -173,6 +173,7 @@ bool ResMan_t7g::getResInfo(uint32 fileRef, ResInfo &resInfo) { char resname[12]; rlFile->read(resname, 12); debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %12s", resname); + resInfo.filename = resname; // Read the resource information resInfo.offset = rlFile->readUint32LE(); @@ -247,6 +248,7 @@ bool ResMan_v2::getResInfo(uint32 fileRef, ResInfo &resInfo) { char resname[12]; rlFile.read(resname, 12); debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %12s", resname); + resInfo.filename = resname; // 6 padding bytes? (it looks like they're always 0) diff --git a/engines/groovie/resource.h b/engines/groovie/resource.h index ca2ea177cb20..798bbf4b5b4f 100644 --- a/engines/groovie/resource.h +++ b/engines/groovie/resource.h @@ -36,6 +36,7 @@ struct ResInfo { uint16 gjd; uint32 offset; uint32 size; + Common::String filename; }; class ResMan { From 5c4d7baa06530cb17d7fdf91eb1c93d62274827a Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Fri, 8 Apr 2011 21:04:51 +0930 Subject: [PATCH 015/369] GROOVIE: Determine correct MPEG4 resource to load for based on fileref --- engines/groovie/music.cpp | 17 ++++++++++++++--- engines/groovie/resource.h | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index e02125c192c1..bc8131379bec 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -761,13 +761,24 @@ bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { // Stop any old sound _vm->_system->getMixer()->stopHandle(_handle); + // Find the filename + ResInfo info; + _vm->_resMan->getResInfo(fileref, info); + uint len = info.filename.size(); + if (len < 4) + return false; // This shouldn't actually occur + + // RL still says xmi, but we're after external m4a + info.filename.setChar('m', len-3); + info.filename.setChar('4', len-2); + info.filename.setChar('a', len-1); + // Create the audio stream - Common::String filename = Common::String::format("gu%d.m4a", fileref & 0x3FF); - Audio::AudioStream *audStream = Audio::makeQuickTimeStream(filename); + Audio::AudioStream *audStream = Audio::makeQuickTimeStream(info.filename); if (!audStream) { // MPEG-4 sounds aren't handled yet, so nothing should play here yet - warning("Could not play MPEG-4 sound '%s'", filename.c_str()); + warning("Could not play MPEG-4 sound '%s'", info.filename.c_str()); return false; } diff --git a/engines/groovie/resource.h b/engines/groovie/resource.h index 798bbf4b5b4f..c87658999abc 100644 --- a/engines/groovie/resource.h +++ b/engines/groovie/resource.h @@ -45,10 +45,10 @@ class ResMan { Common::SeekableReadStream *open(uint32 fileRef); virtual uint16 getRef(Common::String name, Common::String scriptname = "") = 0; + virtual bool getResInfo(uint32 fileRef, ResInfo &resInfo) = 0; protected: Common::Array _gjds; - virtual bool getResInfo(uint32 fileRef, ResInfo &resInfo) = 0; uint16 _lastGjd; }; From 88ebf13077a072ac0b3100e54f2949db46960e5e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 8 Apr 2011 10:50:16 -0400 Subject: [PATCH 016/369] AUDIO: Allow for seeking in a QuickTimeAudioStream --- audio/decoders/quicktime.cpp | 84 ++++++++++++++++++++++++++++++------ audio/decoders/quicktime.h | 8 ++-- video/qt_decoder.cpp | 66 +++------------------------- 3 files changed, 82 insertions(+), 76 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index af59d8803f5a..53cce3012543 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -43,6 +43,7 @@ QuickTimeAudioDecoder::QuickTimeAudioDecoder() : Common::QuickTimeParser() { } QuickTimeAudioDecoder::~QuickTimeAudioDecoder() { + delete _audStream; } bool QuickTimeAudioDecoder::loadFile(const Common::String &filename) { @@ -245,6 +246,64 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { _curAudioChunk++; } +void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { + if (!_audStream) + return; + + // Re-create the audio stream + delete _audStream; + Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + + // First, we need to track down what audio sample we need + Audio::Timestamp curAudioTime(0, _streams[_audioStreamIndex]->time_scale); + uint sample = 0; + bool done = false; + for (int32 i = 0; i < _streams[_audioStreamIndex]->stts_count && !done; i++) { + for (int32 j = 0; j < _streams[_audioStreamIndex]->stts_data[i].count; j++) { + curAudioTime = curAudioTime.addFrames(_streams[_audioStreamIndex]->stts_data[i].duration); + + if (curAudioTime > where) { + done = true; + break; + } + + sample++; + } + } + + // Now to track down what chunk it's in + _curAudioChunk = 0; + uint32 totalSamples = 0; + for (uint32 i = 0; i < _streams[_audioStreamIndex]->chunk_count; i++, _curAudioChunk++) { + int sampleToChunkIndex = -1; + + for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) + if (i >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) + sampleToChunkIndex = j; + + assert(sampleToChunkIndex >= 0); + + totalSamples += _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; + + if (sample < totalSamples) { + totalSamples -= _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; + break; + } + } + + // Reposition the audio stream + queueNextAudioChunk(); + if (sample != totalSamples) { + // HACK: Skip a certain amount of samples from the stream + // (There's got to be a better way to do this!) + int16 *tempBuffer = new int16[sample - totalSamples]; + _audStream->readBuffer(tempBuffer, sample - totalSamples); + delete[] tempBuffer; + debug(3, "Skipping %d audio samples", sample - totalSamples); + } +} + QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimeParser::SampleDesc() { channels = 0; sampleRate = 0; @@ -255,13 +314,10 @@ QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimePar /** * A wrapper around QuickTimeAudioDecoder that implements the RewindableAudioStream API */ -class QuickTimeAudioStream : public RewindableAudioStream, public QuickTimeAudioDecoder { +class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDecoder { public: QuickTimeAudioStream() {} - - ~QuickTimeAudioStream() { - delete _audStream; - } + ~QuickTimeAudioStream() {} bool loadFile(const Common::String &filename) { return QuickTimeAudioDecoder::loadFile(filename) && _audioStreamIndex >= 0 && _audStream; @@ -285,19 +341,21 @@ class QuickTimeAudioStream : public RewindableAudioStream, public QuickTimeAudio int getRate() const { return _audStream->getRate(); } bool endOfData() const { return _curAudioChunk >= _streams[_audioStreamIndex]->chunk_count && _audStream->endOfData(); } - // RewindableAudioStream API - bool rewind() { - // Reset our parent stream - _curAudioChunk = 0; - delete _audStream; + // SeekableAudioStream API + bool seek(const Timestamp &where) { + if (where > getLength()) + return false; - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - _audStream = makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + setAudioStreamPos(where); return true; } + + Timestamp getLength() const { + return Timestamp(0, _streams[_audioStreamIndex]->duration, _streams[_audioStreamIndex]->time_scale); + } }; -RewindableAudioStream *makeQuickTimeStream(const Common::String &filename) { +SeekableAudioStream *makeQuickTimeStream(const Common::String &filename) { QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); if (!audioStream->loadFile(filename)) { diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index eb0f79174861..9e2e95b7054e 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -80,16 +80,18 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { int8 _audioStreamIndex; uint _curAudioChunk; QueuingAudioStream *_audStream; + + void setAudioStreamPos(const Timestamp &where); }; /** - * Try to load a QuickTime sound file from the given file name and create a RewindableAudioStream + * Try to load a QuickTime sound file from the given file name and create a SeekableAudioStream * from that data. * * @param filename the filename of the file from which to read the data - * @return a new RewindableAudioStream, or NULL, if an error occurred + * @return a new SeekableAudioStream, or NULL, if an error occurred */ -RewindableAudioStream *makeQuickTimeStream(const Common::String &filename); +SeekableAudioStream *makeQuickTimeStream(const Common::String &filename); } // End of namespace Audio diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 71f31d641571..de4a284ec9d7 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -168,58 +168,9 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { if (_audioStreamIndex >= 0) { _audioStartOffset = curVideoTime; - // Re-create the audio stream - Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); - - // First, we need to track down what audio sample we need - Audio::Timestamp curAudioTime(0, _streams[_audioStreamIndex]->time_scale); - uint sample = 0; - bool done = false; - for (int32 i = 0; i < _streams[_audioStreamIndex]->stts_count && !done; i++) { - for (int32 j = 0; j < _streams[_audioStreamIndex]->stts_data[i].count; j++) { - curAudioTime = curAudioTime.addFrames(_streams[_audioStreamIndex]->stts_data[i].duration); - - if (curAudioTime > curVideoTime) { - done = true; - break; - } - - sample++; - } - } + // Seek to the new audio location + setAudioStreamPos(_audioStartOffset); - // Now to track down what chunk it's in - _curAudioChunk = 0; - uint32 totalSamples = 0; - for (uint32 i = 0; i < _streams[_audioStreamIndex]->chunk_count; i++, _curAudioChunk++) { - int sampleToChunkIndex = -1; - - for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) - if (i >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) - sampleToChunkIndex = j; - - assert(sampleToChunkIndex >= 0); - - totalSamples += _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; - - if (sample < totalSamples) { - totalSamples -= _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; - break; - } - } - - // Reposition the audio stream - queueNextAudioChunk(); - if (sample != totalSamples) { - // HACK: Skip a certain amount of samples from the stream - // (There's got to be a better way to do this!) - int16 *tempBuffer = new int16[sample - totalSamples]; - _audStream->readBuffer(tempBuffer, sample - totalSamples); - delete[] tempBuffer; - debug(3, "Skipping %d audio samples", sample - totalSamples); - } - // Restart the audio startAudio(); } @@ -282,17 +233,15 @@ Codec *QuickTimeDecoder::createCodec(uint32 codecTag, byte bitsPerPixel) { } void QuickTimeDecoder::startAudio() { - if (_audStream) { // No audio/audio not supported + if (_audStream) { updateAudioBuffer(); - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audHandle, _audStream); - } + g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audHandle, _audStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO); + } // else no audio or the audio compression is not supported } void QuickTimeDecoder::stopAudio() { - if (_audStream) { + if (_audStream) g_system->getMixer()->stopHandle(_audHandle); - _audStream = NULL; // the mixer automatically frees the stream - } } void QuickTimeDecoder::pauseVideoIntern(bool pause) { @@ -550,9 +499,6 @@ void QuickTimeDecoder::close() { _scaledSurface = 0; } - // The audio stream is deleted automatically - _audStream = NULL; - Common::QuickTimeParser::close(); SeekableVideoDecoder::reset(); } From faee277978c54ccb3dcccfedc75ddb31f44e630f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 8 Apr 2011 17:04:29 -0400 Subject: [PATCH 017/369] COMMON: Add a DisposeAfterUse flag to QuickTimeParser --- audio/decoders/quicktime.cpp | 29 ++++++++++++++++++++++------- audio/decoders/quicktime.h | 14 ++++++++++++-- common/quicktime.cpp | 13 +++++++++---- common/quicktime.h | 7 +++++-- video/qt_decoder.cpp | 4 ++-- 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 53cce3012543..62a6f6e40479 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -46,16 +46,16 @@ QuickTimeAudioDecoder::~QuickTimeAudioDecoder() { delete _audStream; } -bool QuickTimeAudioDecoder::loadFile(const Common::String &filename) { - if (!Common::QuickTimeParser::loadFile(filename)) +bool QuickTimeAudioDecoder::loadAudioFile(const Common::String &filename) { + if (!Common::QuickTimeParser::parseFile(filename)) return false; init(); return true; } -bool QuickTimeAudioDecoder::loadStream(Common::SeekableReadStream *stream) { - if (!Common::QuickTimeParser::loadStream(stream)) +bool QuickTimeAudioDecoder::loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { + if (!Common::QuickTimeParser::parseStream(stream, disposeFileHandle)) return false; init(); @@ -319,8 +319,12 @@ class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDe QuickTimeAudioStream() {} ~QuickTimeAudioStream() {} - bool loadFile(const Common::String &filename) { - return QuickTimeAudioDecoder::loadFile(filename) && _audioStreamIndex >= 0 && _audStream; + bool openFromFile(const Common::String &filename) { + return QuickTimeAudioDecoder::loadAudioFile(filename) && _audioStreamIndex >= 0 && _audStream; + } + + bool openFromStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { + return QuickTimeAudioDecoder::loadAudioStream(stream, disposeFileHandle) && _audioStreamIndex >= 0 && _audStream; } // AudioStream API @@ -358,7 +362,18 @@ class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDe SeekableAudioStream *makeQuickTimeStream(const Common::String &filename) { QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); - if (!audioStream->loadFile(filename)) { + if (!audioStream->openFromFile(filename)) { + delete audioStream; + return 0; + } + + return audioStream; +} + +SeekableAudioStream *makeQuickTimeStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { + QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); + + if (!audioStream->openFromStream(stream, disposeAfterUse)) { delete audioStream; return 0; } diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 9e2e95b7054e..be4d1097da61 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -50,13 +50,13 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { * Load a QuickTime audio file * @param filename the filename to load */ - bool loadFile(const Common::String &filename); + bool loadAudioFile(const Common::String &filename); /** * Load a QuickTime audio file from a SeekableReadStream * @param stream the stream to load */ - bool loadStream(Common::SeekableReadStream *stream); + bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle); protected: struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { @@ -93,6 +93,16 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { */ SeekableAudioStream *makeQuickTimeStream(const Common::String &filename); +/** + * Try to load a QuickTime sound file from the given seekable stream and create a SeekableAudioStream + * from that data. + * + * @param stream the SeekableReadStream from which to read the data + * @param disposeAfterUse whether to delete the stream after use + * @return a new SeekableAudioStream, or NULL, if an error occurred + */ +SeekableAudioStream *makeQuickTimeStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + } // End of namespace Audio #endif diff --git a/common/quicktime.cpp b/common/quicktime.cpp index d40f279f1559..fe48cfdcb17d 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -52,6 +52,7 @@ QuickTimeParser::QuickTimeParser() { _scaleFactorX = 1; _scaleFactorY = 1; _resFork = new Common::MacResManager(); + _disposeFileHandle = DisposeAfterUse::YES; initParseTable(); } @@ -61,12 +62,13 @@ QuickTimeParser::~QuickTimeParser() { delete _resFork; } -bool QuickTimeParser::loadFile(const Common::String &filename) { +bool QuickTimeParser::parseFile(const Common::String &filename) { if (!_resFork->open(filename) || !_resFork->hasDataFork()) return false; _foundMOOV = false; _numStreams = 0; + _disposeFileHandle = DisposeAfterUse::YES; MOVatom atom = { 0, 0, 0xffffffff }; @@ -98,15 +100,16 @@ bool QuickTimeParser::loadFile(const Common::String &filename) { return true; } -bool QuickTimeParser::loadStream(Common::SeekableReadStream *stream) { +bool QuickTimeParser::parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { _fd = stream; _foundMOOV = false; _numStreams = 0; + _disposeFileHandle = disposeFileHandle; MOVatom atom = { 0, 0, 0xffffffff }; if (readDefault(atom) < 0 || !_foundMOOV) { - _fd = 0; + close(); return false; } @@ -724,7 +727,9 @@ void QuickTimeParser::close() { _numStreams = 0; - delete _fd; + if (_disposeFileHandle == DisposeAfterUse::YES) + delete _fd; + _fd = 0; } diff --git a/common/quicktime.h b/common/quicktime.h index 777086050705..42b48bbb9401 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -58,13 +58,14 @@ class QuickTimeParser { * Load a QuickTime file * @param filename the filename to load */ - bool loadFile(const Common::String &filename); + bool parseFile(const Common::String &filename); /** * Load a QuickTime file from a SeekableReadStream * @param stream the stream to load + * @param disposeFileHandle whether to delete the stream after use */ - bool loadStream(Common::SeekableReadStream *stream); + bool parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle = DisposeAfterUse::YES); /** * Close a QuickTime file @@ -84,6 +85,8 @@ class QuickTimeParser { // This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream. Common::SeekableReadStream *_fd; + DisposeAfterUse::Flag _disposeFileHandle; + struct MOVatom { uint32 type; uint32 offset; diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index de4a284ec9d7..414073bccc35 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -344,7 +344,7 @@ uint32 QuickTimeDecoder::getTimeToNextFrame() const { } bool QuickTimeDecoder::loadFile(const Common::String &filename) { - if (!Common::QuickTimeParser::loadFile(filename)) + if (!Common::QuickTimeParser::parseFile(filename)) return false; init(); @@ -352,7 +352,7 @@ bool QuickTimeDecoder::loadFile(const Common::String &filename) { } bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { - if (!Common::QuickTimeParser::loadStream(stream)) + if (!Common::QuickTimeParser::parseStream(stream)) return false; init(); From d660b7f78d260444fdd82fe88d306138bdeaf8f7 Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Sat, 9 Apr 2011 00:48:26 +0300 Subject: [PATCH 018/369] AGI: Refactor and fix Apple IIGS sound generator Make the player be centered on a fixed number of "generators" instead of MIDI channels that arbitrarily allocate generators for notes. Make the audio stream to be stereo and for sample rate use _sampleRate. Rewrite the synthesis core: * Make generators use both oscillators * Implement swap mode for oscillators * Fix envelope update frequency --- engines/agi/sound_2gs.cpp | 950 ++++++++++++++++---------------------- engines/agi/sound_2gs.h | 327 +++++-------- 2 files changed, 519 insertions(+), 758 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 11bf5a9034db..239290716a05 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -25,6 +25,7 @@ #include "common/config-manager.h" #include "common/fs.h" +#include "common/archive.h" #include "common/md5.h" #include "common/memstream.h" #include "common/str-array.h" @@ -35,47 +36,91 @@ namespace Agi { SoundGen2GS::SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) { - _disabledMidi = !loadInstruments(); + // Allocate memory for the wavetable + _wavetable = new int8[SIERRASTANDARD_SIZE]; + // Apple IIGS AGI MIDI player advances 60 ticks per second. Strategy + // here is to first generate audio for a 1/60th of a second and then + // advance the MIDI player by one tick. Thus, make the output buffer + // to be a 1/60th of a second in length. + _outSize = _sampleRate/60; + _out = new int16[2*_outSize]; // stereo + + // Initialize player variables + _nextGen = 0; + _ticks = 0; + + // Not playing anything yet _playingSound = -1; _playing = false; - _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE); - - _midiChannels.resize(16); // Set the amount of available MIDI channels + // Load instruments + _disableMidi = !loadInstruments(); _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); } SoundGen2GS::~SoundGen2GS() { _mixer->stopHandle(_soundHandle); - - free(_sndBuffer); + delete _wavetable; + delete _out; } int SoundGen2GS::readBuffer(int16 *buffer, const int numSamples) { - fillAudio(buffer, numSamples / 2); - + static uint data_available = 0; + static uint data_offset = 0; + uint n = numSamples << 1; + uint8 *p = (uint8*)buffer; + + while (n > data_available) { + memcpy(p, (uint8*)_out + data_offset, data_available); + p += data_available; + n -= data_available; + + advancePlayer(); + + data_available = generateOutput() << 1; + data_offset = 0; + } + + memcpy(p, (uint8*)_out + data_offset, n); + data_offset += n; + data_available -= n; + return numSamples; } +/** + * Initiate the playing of a sound resource. + * @param resnum Resource number + */ void SoundGen2GS::play(int resnum) { AgiSoundEmuType type; _playingSound = resnum; type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); - assert (type == AGI_SOUND_SAMPLE || type == AGI_SOUND_MIDI); + if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { + warning("Trying to play sample or MIDI resource but not using Apple IIGS sound emulation mode"); + return; + } + + haltGenerators(); + switch (type) { case AGI_SOUND_SAMPLE: { IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[_playingSound]; - playSampleSound(sampleRes->getHeader(), sampleRes->getSample()); + const IIgsSampleHeader &header = sampleRes->getHeader(); + _channels[kSfxMidiChannel].setInstrument(&header.instrument); + _channels[kSfxMidiChannel].setVolume(header.volume); + midiNoteOn(kSfxMidiChannel, header.pitch, 127); break; } case AGI_SOUND_MIDI: ((IIgsMidi *) _vm->_game.sounds[_playingSound])->rewind(); + _ticks = 0; break; default: break; @@ -83,213 +128,168 @@ void SoundGen2GS::play(int resnum) { } void SoundGen2GS::stop() { + haltGenerators(); _playingSound = -1; - - // Stops all sounds on all MIDI channels - for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->stopSounds(); + _playing = 0; } -void SoundGen2GS::playSound() { - if (_playingSound == -1) - return; - - if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_MIDI) { - playMidiSound(); - //warning("playSound: Trying to play an Apple IIGS MIDI sound. Not yet implemented"); - } else if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_SAMPLE) { - //debugC(3, kDebugLevelSound, "playSound: Trying to play an Apple IIGS sample"); - playSampleSound(); - } - - if (!_playing) { - _vm->_sound->soundIsFinished(); - - _playingSound = -1; - } -} - -uint32 SoundGen2GS::mixSound() { - int i, b; - - memset(_sndBuffer, 0, BUFFER_SIZE << 1); +/** + * Fill output buffer by advancing the generators for a 1/60th of a second. + * @return Number of generated samples + */ +uint32 SoundGen2GS::generateOutput() { + memset(_out, 0, _outSize*2*2); if (!_playing || _playingSound == -1) - return BUFFER_SIZE; - - // Handle Apple IIGS sound mixing here - // TODO: Implement playing both waves in an oscillator - // TODO: Implement swap-mode in an oscillator - for (uint midiChan = 0; midiChan < _midiChannels.size(); midiChan++) { - for (uint gsChan = 0; gsChan < _midiChannels[midiChan]._gsChannels.size(); gsChan++) { - IIgsChannelInfo &channel = _midiChannels[midiChan]._gsChannels[gsChan]; - if (channel.playing()) { // Only mix in actively playing channels - // Frequency multiplier was 1076.0 based on tests made with MESS 0.117. - // Tests made with KEGS32 averaged the multiplier to around 1045. - // So this is a guess but maybe it's 1046.5... i.e. C6's frequency? - double hertz = C6_FREQ * pow(SEMITONE, fracToDouble(channel.note)); - channel.posAdd = doubleToFrac(hertz / getRate()); - channel.vol = doubleToFrac(fracToDouble(channel.envVol) * fracToDouble(channel.chanVol) / 127.0); - double tempVol = fracToDouble(channel.vol)/127.0; - for (i = 0; i < IIGS_BUFFER_SIZE; i++) { - b = channel.relocatedSample[fracToInt(channel.pos)]; - // TODO: Find out what volume/amplification setting is loud enough - // but still doesn't clip when playing many channels on it. - _sndBuffer[i] += (int16) (b * tempVol * 256/4); - channel.pos += channel.posAdd; - - if (channel.pos >= intToFrac(channel.size)) { - if (channel.loop) { - // Don't divide by zero on zero length samples - channel.pos %= intToFrac(channel.size + (channel.size == 0)); - // Probably we should loop the envelope too - channel.envSeg = 0; - channel.envVol = channel.startEnvVol; - } else { - channel.pos = channel.chanVol = 0; - channel.end = true; - break; - } + return _outSize*2; + + int16 *p = _out; + int n = _outSize; + while (n--) { + int outl = 0; + int outr = 0; + for (int k = 0; k < MAX_GENERATORS; k++) { + IIgsGenerator *g = &_generators[k]; + if (!g->ins) + continue; + const IIgsInstrumentHeader *i = g->ins; + + // Advance envelope + int vol = fracToInt(g->a); + if (g->a <= i->env[g->seg].bp) { + g->a += i->env[g->seg].inc * ENVELOPE_COEF; + if (g->a > i->env[g->seg].bp) { + g->a = i->env[g->seg].bp; + g->seg++; + } + } else { + g->a -= i->env[g->seg].inc * ENVELOPE_COEF; + if (g->a < i->env[g->seg].bp) { + g->a = i->env[g->seg].bp; + g->seg++; + } + } + + // TODO: Advance vibrato here. Apple IIGS uses a LFO with + // a triangle wave for vibrato. None of the instruments in the + // current mappings from MIDI program number to instrument use + // vibrato, but some of the choices are possibly still wrong. + + // Advance oscillators + int s0 = 0; + int s1 = 0; + if (!g->osc[0].halt) { + s0 = g->osc[0].base[fracToInt(g->osc[0].p)]; + g->osc[0].p += g->osc[0].pd; + if ((uint)fracToInt(g->osc[0].p) >= g->osc[0].size) { + g->osc[0].p -= intToFrac(g->osc[0].size); + if (!g->osc[0].loop) + g->osc[0].halt = 1; + if (g->osc[0].swap) { + g->osc[0].halt = 1; + g->osc[1].halt = 0; } } - - if (channel.envSeg < ENVELOPE_SEGMENT_COUNT) { - const IIgsEnvelopeSegment &seg = channel.ins->env.seg[channel.envSeg]; - // I currently assume enveloping works with the same speed as the MIDI - // (i.e. with 1/60ths of a second ticks). - // TODO: Check if enveloping really works with the same speed as MIDI - frac_t envVolDelta = doubleToFrac(seg.inc/256.0); - if (intToFrac(seg.bp) >= channel.envVol) { - channel.envVol += envVolDelta; - if (channel.envVol >= intToFrac(seg.bp)) { - channel.envVol = intToFrac(seg.bp); - channel.envSeg += 1; - } - } else { - channel.envVol -= envVolDelta; - if (channel.envVol <= intToFrac(seg.bp)) { - channel.envVol = intToFrac(seg.bp); - channel.envSeg += 1; - } + } + if (!g->osc[1].halt) { + s1 = g->osc[1].base[fracToInt(g->osc[1].p)]; + g->osc[1].p += g->osc[1].pd; + if ((uint)fracToInt(g->osc[1].p) >= g->osc[1].size) { + g->osc[1].p -= intToFrac(g->osc[1].size); + if (!g->osc[1].loop) + g->osc[1].halt = 1; + if (g->osc[1].swap) { + g->osc[0].halt = 0; + g->osc[1].halt = 1; } } } + + // Multiply sample with envelope and MIDI volume information. + // Also amplify. + s0 *= vol * g->vel/127 * 80/256; + s1 *= vol * g->vel/127 * 80/256; + + if (g->osc[0].chn) outl += s0; + else outr += s0; + if (g->osc[1].chn) outl += s1; + else outr += s1; } - } - - removeStoppedSounds(); - return IIGS_BUFFER_SIZE; -} - -void SoundGen2GS::fillAudio(int16 *stream, uint len) { - uint32 p = 0; - - // current number of audio bytes in _sndBuffer - static uint32 data_available = 0; - // offset of start of audio bytes in _sndBuffer - static uint32 data_offset = 0; - - len <<= 2; - - debugC(5, kDebugLevelSound, "(%p, %d)", (void *)stream, len); - - while (len > data_available) { - memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, data_available); - p += data_available; - len -= data_available; + if (outl > 32768) outl = 32768; + if (outl <-32767) outl =-32767; + if (outr > 32768) outr = 32768; + if (outr <-32767) outr =-32767; - playSound(); - data_available = mixSound() << 1; - data_offset = 0; + *p++ = outl; + *p++ = outr; } - memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, len); - data_offset += len; - data_available -= len; + return _outSize*2; } -void SoundGen2GS::playSampleSound() { - if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { - warning("Trying to play a sample but not using Apple IIGS sound emulation mode"); +void SoundGen2GS::advancePlayer() { + if (_playingSound == -1) return; - } - if (_playingSound != -1) - _playing = activeSounds() > 0; -} - -void SoundGen2GS::stopSounds() { - // Stops all sounds on all MIDI channels - for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->stopSounds(); -} - -bool SoundGen2GS::playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample) { - stopSounds(); - IIgsMidiChannel &channel = _midiChannels[kSfxMidiChannel]; - - channel.setInstrument(&sampleHeader.instrument, sample); - channel.setVolume(sampleHeader.volume); - channel.noteOn(sampleHeader.pitch, 64); // Use default velocity (i.e. 64) + if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_MIDI) { + advanceMidiPlayer(); + } else if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_SAMPLE) { + _playing = activeGenerators() > 0; + } - return true; + if (!_playing) { + _vm->_sound->soundIsFinished(); + _playingSound = -1; + } } -void SoundGen2GS::playMidiSound() { - if (_disabledMidi) +void SoundGen2GS::advanceMidiPlayer() { + if (_disableMidi) return; const uint8 *p; uint8 parm1, parm2; - static uint8 cmd, ch; + static uint8 cmd, chn; if (_playingSound == -1 || _vm->_game.sounds[_playingSound] == NULL) { warning("Error playing Apple IIGS MIDI sound resource"); _playing = false; - return; } IIgsMidi *midiObj = (IIgsMidi *) _vm->_game.sounds[_playingSound]; + _ticks++; _playing = true; p = midiObj->getPtr(); - midiObj->_soundBufTicks++; - while (true) { - uint8 readByte = *p; - // Check for end of MIDI sequence marker (Can also be here before delta-time) - if (readByte == MIDI_BYTE_STOP_SEQUENCE) { + if (*p == MIDI_STOP_SEQUENCE) { debugC(3, kDebugLevelSound, "End of MIDI sequence (Before reading delta-time)"); _playing = false; - midiObj->rewind(); - return; - } else if (readByte == MIDI_BYTE_TIMER_SYNC) { + } + if (*p == MIDI_TIMER_SYNC) { debugC(3, kDebugLevelSound, "Timer sync"); p++; // Jump over the timer sync byte as it's not needed - continue; } - uint8 deltaTime = readByte; - if (midiObj->_midiTicks + deltaTime > midiObj->_soundBufTicks) { + // Check for delta time + uint8 delta = *p; + if (midiObj->_ticks + delta > _ticks) break; - } - midiObj->_midiTicks += deltaTime; - p++; // Jump over the delta-time byte as it was already taken care of + midiObj->_ticks += delta; + p++; // Check for end of MIDI sequence marker (This time it after reading delta-time) - if (*p == MIDI_BYTE_STOP_SEQUENCE) { + if (*p == MIDI_STOP_SEQUENCE) { debugC(3, kDebugLevelSound, "End of MIDI sequence (After reading delta-time)"); _playing = false; - midiObj->rewind(); - return; } @@ -297,36 +297,51 @@ void SoundGen2GS::playMidiSound() { // Otherwise use running status (i.e. previously set command and channel). if (*p & 0x80) { cmd = *p++; - ch = cmd & 0x0f; + chn = cmd & 0x0f; cmd >>= 4; } switch (cmd) { - case MIDI_CMD_NOTE_OFF: + case MIDI_NOTE_OFF: parm1 = *p++; parm2 = *p++; - midiNoteOff(ch, parm1, parm2); + debugC(3, kDebugLevelSound, "channel %X: note off (key = %d, velocity = %d)", chn, parm1, parm2); + midiNoteOff(chn, parm1, parm2); break; - case MIDI_CMD_NOTE_ON: + case MIDI_NOTE_ON: parm1 = *p++; parm2 = *p++; - midiNoteOn(ch, parm1, parm2); + debugC(3, kDebugLevelSound, "channel %X: note on (key = %d, velocity = %d)", chn, parm1, parm2); + midiNoteOn(chn, parm1, parm2); break; - case MIDI_CMD_CONTROLLER: + case MIDI_CONTROLLER: parm1 = *p++; parm2 = *p++; - midiController(ch, parm1, parm2); + debugC(3, kDebugLevelSound, "channel %X: controller %02X = %02X", chn, parm1, parm2); + // The tested Apple IIGS AGI MIDI resources only used + // controllers 0 (Bank select?), 7 (Volume) and 64 (Sustain On/Off). + // Controller 0's parameter was in range 94-127, + // controller 7's parameter was in range 0-127 and + // controller 64's parameter was always 0 (i.e. sustain off). + switch (parm1) { + case 7: + _channels[chn].setVolume(parm2); + break; + } break; - case MIDI_CMD_PROGRAM_CHANGE: + case MIDI_PROGRAM_CHANGE: parm1 = *p++; - midiProgramChange(ch, parm1); + debugC(3, kDebugLevelSound, "channel %X: program change %02X", chn, parm1); + _channels[chn].setInstrument(getInstrument(parm1)); break; - case MIDI_CMD_PITCH_WHEEL: + case MIDI_PITCH_WHEEL: parm1 = *p++; parm2 = *p++; + debugC(3, kDebugLevelSound, "channel %X: pitch wheel (unimplemented)", chn); + break; - uint16 wheelPos = ((parm2 & 0x7F) << 7) | (parm1 & 0x7F); // 14-bit value - midiPitchWheel(wheelPos); + default: + debugC(3, kDebugLevelSound, "channel %X: unimplemented command %02X", chn, cmd); break; } } @@ -334,70 +349,88 @@ void SoundGen2GS::playMidiSound() { midiObj->setPtr(p); } -void SoundGen2GS::midiNoteOff(uint8 channel, uint8 note, uint8 velocity) { - _midiChannels[channel].noteOff(note, velocity); - debugC(3, kDebugLevelSound, "note off, channel %02x, note %02x, velocity %02x", channel, note, velocity); -} - -void SoundGen2GS::midiNoteOn(uint8 channel, uint8 note, uint8 velocity) { - _midiChannels[channel].noteOn(note, velocity); - debugC(3, kDebugLevelSound, "note on, channel %02x, note %02x, velocity %02x", channel, note, velocity); -} - -// TODO: Check if controllers behave differently on different MIDI channels -// TODO: Doublecheck what other controllers than the volume controller do -void SoundGen2GS::midiController(uint8 channel, uint8 controller, uint8 value) { - IIgsMidiChannel &midiChannel = _midiChannels[channel]; - - // The tested Apple IIGS AGI MIDI resources only used - // controllers 0 (Bank select?), 7 (Volume) and 64 (Sustain On/Off). - // Controller 0's parameter was in range 94-127, - // controller 7's parameter was in range 0-127 and - // controller 64's parameter was always 0 (i.e. sustain off). - bool unimplemented = false; - switch (controller) { - case 7: // Volume - midiChannel.setVolume(value); - break; - default: - unimplemented = true; - break; +void SoundGen2GS::midiNoteOff(int channel, int note, int velocity) { + // Release keys within the given MIDI channel + for (int i = 0; i < MAX_GENERATORS; i++) { + if (_generators[i].chn == channel && _generators[i].key == note) + _generators[i].seg = _generators[i].ins->seg; } - debugC(3, kDebugLevelSound, "controller %02x, ch %02x, val %02x%s", controller, channel, value, unimplemented ? " (Unimplemented)" : ""); -} - -void SoundGen2GS::midiProgramChange(uint8 channel, uint8 program) { - _midiChannels[channel].setInstrument(getInstrument(program), _wave.begin()); - debugC(3, kDebugLevelSound, "program change %02x, channel %02x", program, channel); } -void SoundGen2GS::midiPitchWheel(uint8 wheelPos) { - // In all the tested Apple IIGS AGI MIDI resources - // pitch wheel commands always used 0x2000 (Center position). - // Therefore it should be quite safe to ignore this command. - debugC(3, kDebugLevelSound, "pitch wheel position %04x (Unimplemented)", wheelPos); -} - -const IIgsInstrumentHeader* SoundGen2GS::getInstrument(uint8 program) const { - return &_instruments[_midiProgToInst->map(program)]; -} +void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { + if (!_channels[channel].getInstrument()) { + debugC(3, kDebugLevelSound, "midiNoteOn(): no instrument specified for channel %d", channel); + return; + } -void SoundGen2GS::setProgramChangeMapping(const MidiProgramChangeMapping *mapping) { - _midiProgToInst = mapping; + // Allocate a generator for the note. + IIgsGenerator* g = allocateGenerator(); + g->ins = _channels[channel].getInstrument(); + const IIgsInstrumentHeader* i = g->ins; + + // Pass information from the MIDI channel to the generator. Take + // velocity into account, although simplistically. + velocity *= 5 / 3; + if (velocity > 127) + velocity = 127; + + g->key = note; + g->vel = velocity * _channels[channel].getVolume() / 127; + g->chn = channel; + + // Instruments can define different samples to be used based on + // what the key is. Find the correct sample for our key. + int wa = 0; + int wb = 0; + while (wa < i->waveCount[0] - 1 && note > i->wave[0][wa].key) + wa++; + while (wb < i->waveCount[1] - 1 && note > i->wave[1][wb].key) + wb++; + + // Prepare the generator. + g->osc[0].base = i->wave[0][wa].base; + g->osc[0].size = i->wave[0][wa].size; + g->osc[0].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[0][wa].tune / 256.0) / (double)_sampleRate); + g->osc[0].p = 0; + g->osc[0].halt = i->wave[0][wa].halt; + g->osc[0].loop = i->wave[0][wa].loop; + g->osc[0].swap = i->wave[0][wa].swap; + g->osc[0].chn = i->wave[0][wa].chn; + + g->osc[1].base = i->wave[1][wb].base; + g->osc[1].size = i->wave[1][wb].size; + g->osc[1].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[1][wb].tune / 256.0) / (double)_sampleRate); + g->osc[1].p = 0; + g->osc[1].halt = i->wave[1][wb].halt; + g->osc[1].loop = i->wave[1][wb].loop; + g->osc[1].swap = i->wave[1][wb].swap; + g->osc[1].chn = i->wave[1][wb].chn; + + g->seg = 0; + g->a = 0; +} + +double SoundGen2GS::midiKeyToFreq(int key, double finetune) { + return 440.0 * pow(2.0, (15.0 + (double)key + finetune) / 12.0); +} + +void SoundGen2GS::haltGenerators() { + for (int i = 0; i < MAX_GENERATORS; i++) { + _generators[i].osc[0].halt = true; + _generators[i].osc[1].halt = true; + } } -void SoundGen2GS::removeStoppedSounds() { - for (Common::Array::iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->removeStoppedSounds(); +uint SoundGen2GS::activeGenerators() { + int n = 0; + for (int i = 0; i < MAX_GENERATORS; i++) + if (!_generators[i].osc[0].halt || !_generators[i].osc[1].halt) + n++; + return n; } -uint SoundGen2GS::activeSounds() const { - uint result = 0; - - for (Common::Array::const_iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - result += iter->activeSounds(); - - return result; +void SoundGen2GS::setProgramChangeMapping(const IIgsMidiProgramMapping *mapping) { + _progToInst = mapping; } IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { @@ -405,7 +438,7 @@ IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : Agi _ptr = _data + 2; // Set current position to just after the header _len = len; // Save the resource's length _type = READ_LE_UINT16(data); // Read sound resource's type - _midiTicks = _soundBufTicks = 0; + _ticks = 0; _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); if (!_isValid) // Check for errors @@ -421,7 +454,7 @@ IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : Agi static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint length) { // Convert the wave from 8-bit unsigned to 8-bit signed format for (uint i = 0; i < length; i++) - dest[i] = (int8) ((int) source.readByte() - 128); + dest[i] = (int8) ((int) source.readByte() - ZERO_OFFSET); return !(source.eos() || source.err()); } @@ -448,121 +481,82 @@ IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : _header.pitch &= 0x7F; // Apple IIGS AGI probably did it this way too } - // Finalize the header info using the 8-bit unsigned sample data - _header.finalize(stream); - // Convert sample data from 8-bit unsigned to 8-bit signed format stream.seek(sampleStartPos); _sample = new int8[_header.sampleSize]; - if (_sample != NULL) + if (_sample != NULL) { _isValid = convertWave(stream, _sample, _header.sampleSize); + // Finalize header info using sample data + _header.finalize(_sample); + } } if (!_isValid) // Check for errors warning("Error creating Apple IIGS sample from resource %d (Type %d, length %d)", resnum, _header.type, len); } -/** Reads an Apple IIGS envelope from then given stream. */ -bool IIgsEnvelope::read(Common::SeekableReadStream &stream) { - for (int segNum = 0; segNum < ENVELOPE_SEGMENT_COUNT; segNum++) { - seg[segNum].bp = stream.readByte(); - seg[segNum].inc = stream.readUint16LE(); - } - return !(stream.eos() || stream.err()); -} - -/** Reads an Apple IIGS wave information structure from the given stream. */ -bool IIgsWaveInfo::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - top = stream.readByte(); - addr = stream.readByte() * 256; - size = (1 << (stream.readByte() & 7)) * 256; - - // Read packed mode byte and parse it into parts - byte packedModeByte = stream.readByte(); - channel = (packedModeByte >> 4) & 1; // Bit 4 - mode = (packedModeByte >> 1) & 3; // Bits 1-2 - halt = (packedModeByte & 1) != 0; // Bit 0 (Converted to boolean) - - relPitch = stream.readSint16LE(); - - // Zero the wave address if we want to ignore the wave address info - if (ignoreAddr) - addr = 0; - - return !(stream.eos() || stream.err()); -} - -bool IIgsWaveInfo::finalize(Common::SeekableReadStream &uint8Wave) { - uint32 startPos = uint8Wave.pos(); // Save stream's starting position - uint8Wave.seek(addr, SEEK_CUR); // Seek to wave's address - - // Calculate the true sample size (A zero ends the sample prematurely) - uint trueSize = size; // Set a default value for the result - for (uint i = 0; i < size; i++) { - if (uint8Wave.readByte() == 0) { - trueSize = i; - // A zero in the sample stream turns off looping - // (At least that's what MESS 0.117 and KEGS32 0.91 seem to do) - if (mode == OSC_MODE_LOOP) - mode = OSC_MODE_ONESHOT; - break; - } +bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { + for (int i = 0; i < ENVELOPE_SEGMENT_COUNT; i++) { + env[i].bp = intToFrac(stream.readByte()); + env[i].inc = intToFrac(stream.readUint16LE()) >> 8; } - size = trueSize; // Set the true sample size - - uint8Wave.seek(startPos); // Seek back to the stream's starting position - - return true; -} + seg = stream.readByte(); + /*priority =*/ stream.readByte(); // Not needed. 32 in all tested data. + bend = stream.readByte(); + vibDepth = stream.readByte(); + vibSpeed = stream.readByte(); + stream.readByte(); // Not needed? 0 in all tested data. + + waveCount[0] = stream.readByte(); + waveCount[1] = stream.readByte(); + for (int i = 0; i < 2; i++) + for (int k = 0; k < waveCount[i]; k++) { + wave[i][k].key = stream.readByte(); + wave[i][k].base = (int8*)(stream.readByte() << 8); + wave[i][k].size = 0x100 << (stream.readByte() & 7); + uint8 b = stream.readByte(); + wave[i][k].tune = stream.readUint16LE(); + + // For sample resources we ignore the address. + if (ignoreAddr) + wave[i][k].base = 0; + + // Check for samples that extend out of the wavetable. + if ((int)wave[i][k].base + wave[i][k].size >= SIERRASTANDARD_SIZE) { + warning("Invalid data detected in the instrument set of Apple IIGS AGI. Continuing anyway..."); + wave[i][k].size = SIERRASTANDARD_SIZE - (int)wave[i][k].base; + } -bool IIgsOscillator::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < WAVES_PER_OSCILLATOR; i++) - if (!waves[i].finalize(uint8Wave)) - return false; + // Parse the generator mode byte to separate fields. + wave[i][k].halt = b & 0x1; // Bit 0 = HALT + wave[i][k].loop = !(b & 0x2); // Bit 1 = LOOP + wave[i][k].swap = (b & 0x3) == 0x3; // HALT|LOOP = SWAP + wave[k][k].chn = (b >> 4) > 0; // Output channel (left or right) + } - return true; + return !(stream.eos() || stream.err()); } -bool IIgsOscillatorList::read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr) { - // First read the A waves and then the B waves for the oscillators - for (uint waveNum = 0; waveNum < WAVES_PER_OSCILLATOR; waveNum++) - for (uint oscNum = 0; oscNum < oscillatorCount; oscNum++) - if (!osc[oscNum].waves[waveNum].read(stream, ignoreAddr)) - return false; - - count = oscillatorCount; // Set the oscillator count - - return true; -} +bool IIgsInstrumentHeader::finalize(int8 *wavetable) { + // Calculate final pointers to sample data and detect true sample size + // in case the sample ends prematurely. + for (int i = 0; i < 2; i++) + for (int k = 0; k < waveCount[i]; k++) { + wave[i][k].base += (uint)wavetable; -bool IIgsOscillatorList::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < count; i++) - if (!osc[i].finalize(uint8Wave)) - return false; + int8 *p = wave[i][k].base; + uint trueSize; + for (trueSize = 0; trueSize < wave[i][k].size; trueSize++) + if (p[trueSize] == -ZERO_OFFSET) + break; + wave[i][k].size = trueSize; + } return true; } -bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - env.read(stream); - relseg = stream.readByte(); - /*byte priority =*/ stream.readByte(); // Not needed? 32 in all tested data. - bendrange = stream.readByte(); - vibdepth = stream.readByte(); - vibspeed = stream.readByte(); - /*byte spare =*/ stream.readByte(); // Not needed? 0 in all tested data. - byte wac = stream.readByte(); // Read A wave count - byte wbc = stream.readByte(); // Read B wave count - oscList.read(stream, wac, ignoreAddr); // Read the oscillators - return (wac == wbc) && !(stream.eos() || stream.err()); // A and B wave counts must match -} - -bool IIgsInstrumentHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return oscList.finalize(uint8Wave); -} - bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { type = stream.readUint16LE(); pitch = stream.readByte(); @@ -572,206 +566,52 @@ bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { instrumentSize = stream.readUint16LE(); sampleSize = stream.readUint16LE(); // Read the instrument header *ignoring* its wave address info - return instrument.read(stream, true); } -bool IIgsSampleHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return instrument.finalize(uint8Wave); -} - -void IIgsMidiChannel::stopSounds() { - // Stops all sounds on this single MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->stop(); - - _gsChannels.clear(); -} - -void IIgsMidiChannel::removeStoppedSounds() { - for (int i = _gsChannels.size() - 1; i >= 0; i--) - if (!_gsChannels[i].playing()) - _gsChannels.remove_at(i); -} - -uint IIgsMidiChannel::activeSounds() const { - uint result = 0; - - for (const_iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - if (!iter->end) - result++; - - return result; -} - -void IIgsMidiChannel::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { - _instrument = instrument; - _sample = sample; - - // Set program on each Apple IIGS channel playing on this MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->setInstrument(instrument, sample); -} - -void IIgsMidiChannel::setVolume(uint8 volume) { - _volume = volume; - - // Set volume on each Apple IIGS channel playing on this MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->setChannelVolume(volume); -} - -void IIgsMidiChannel::noteOff(uint8 note, uint8 velocity) { - // Go through all the notes playing on this MIDI channel - // and turn off the ones that are playing the given note - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - if (iter->origNote == note) - iter->noteOff(velocity); -} - -void IIgsMidiChannel::noteOn(uint8 note, uint8 velocity) { - IIgsChannelInfo channel; - - // Use the default channel volume and instrument - channel.setChannelVolume(_volume); - channel.setInstrument(_instrument, _sample); - - // Set the note on and save the channel - channel.noteOn(note, velocity); - _gsChannels.push_back(channel); -} - -void IIgsChannelInfo::rewind() { - this->envVol = this->startEnvVol; - this->envSeg = 0; - this->pos = intToFrac(0); -} - -void IIgsChannelInfo::setChannelVolume(uint8 volume) { - this->chanVol = intToFrac(volume); -} - -void IIgsChannelInfo::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { - assert(instrument != NULL && sample != NULL); - this->ins = instrument; - this->unrelocatedSample = sample; -} - -// TODO/FIXME: Implement correctly and fully (Take velocity into account etc) -void IIgsChannelInfo::noteOn(uint8 noteParam, uint8 velocity) { - this->origNote = noteParam; - this->startEnvVol = intToFrac(0); - rewind(); - - const IIgsWaveInfo *waveInfo = NULL; - - for (uint i = 0; i < ins->oscList.count; i++) - if (ins->oscList(i).waves[0].top >= noteParam) - waveInfo = &ins->oscList(i).waves[0]; - - assert(waveInfo != NULL); - - this->relocatedSample = this->unrelocatedSample + waveInfo->addr; - this->posAdd = intToFrac(0); - this->note = intToFrac(noteParam) + doubleToFrac(waveInfo->relPitch/256.0); - this->vol = doubleToFrac(fracToDouble(this->envVol) * fracToDouble(this->chanVol) / 127.0); - this->loop = (waveInfo->mode == OSC_MODE_LOOP); - this->size = waveInfo->size - waveInfo->addr; - this->end = waveInfo->halt; -} - -// TODO/FIXME: Implement correctly and fully (Take release time and velocity into account etc) -void IIgsChannelInfo::noteOff(uint8 velocity) { - this->loop = false; - this->envSeg = ins->relseg; +bool IIgsSampleHeader::finalize(int8 *sample) { + return instrument.finalize(sample); } -void IIgsChannelInfo::stop() { - this->end = true; -} - -bool IIgsChannelInfo::playing() { - return !this->end; -} - -/** - * A function object (i.e. a functor) for testing if a Common::FSNode - * object's name is equal (Ignoring case) to a string or to at least - * one of the strings in a list of strings. Can be used e.g. with find_if(). - */ -struct fsnodeNameEqualsIgnoreCase : public Common::UnaryFunction { -// FIXME: This should be replaced; use SearchMan instead - fsnodeNameEqualsIgnoreCase(const Common::StringArray &str) : _str(str) {} - fsnodeNameEqualsIgnoreCase(const Common::String str) { _str.push_back(str); } - bool operator()(const Common::FSNode ¶m) const { - for (Common::StringArray::const_iterator iter = _str.begin(); iter != _str.end(); ++iter) - if (param.getName().equalsIgnoreCase(*iter)) - return true; - return false; - } -private: - Common::StringArray _str; -}; +//### +//### LOADER METHODS +//### bool SoundGen2GS::loadInstruments() { - // Check that the platform is Apple IIGS, as only it uses custom instruments - if (_vm->getPlatform() != Common::kPlatformApple2GS) { - debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); - return true; - } - // Get info on the particular Apple IIGS AGI game's executable - const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID) _vm->getGameID()); + const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID)_vm->getGameID()); if (exeInfo == NULL) { warning("Unsupported Apple IIGS game, not loading instruments"); return false; } - // List files in the game path - Common::FSList fslist; - Common::FSNode dir(ConfMan.get("path")); - if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly)) { - warning("Invalid game path (\"%s\"), not loading Apple IIGS instruments", dir.getPath().c_str()); - return false; - } - - // Populate executable filenames list (Long filename and short filename) for searching - Common::StringArray exeNames; - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS16"); - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS"); + // Find the executable file and the wavetable file + Common::ArchiveMemberList exeNames, waveNames; + SearchMan.listMatchingMembers(exeNames, "*.SYS16"); + SearchMan.listMatchingMembers(exeNames, "*.SYS"); + SearchMan.listMatchingMembers(waveNames, "SIERRASTANDARD"); + SearchMan.listMatchingMembers(waveNames, "SIERRAST"); - // Populate wave filenames list (Long filename and short filename) for searching - Common::StringArray waveNames; - waveNames.push_back("SIERRASTANDARD"); - waveNames.push_back("SIERRAST"); - - // Search for the executable file and the wave file (i.e. check if any of the filenames match) - Common::FSList::const_iterator exeFsnode, waveFsnode; - exeFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(exeNames)); - waveFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(waveNames)); - - // Make sure that we found the executable file - if (exeFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS game executable (%s), not loading instruments", exeNames.begin()->c_str()); + if (exeNames.empty()) { + warning("Couldn't find Apple IIGS game executable (*.SYS16 or *.SYS), not loading instruments"); return false; } - - // Make sure that we found the wave file - if (waveFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS wave file (%s), not loading instruments", waveNames.begin()->c_str()); + if (waveNames.empty()) { + warning("Couldn't find Apple IIGS wave file (SIERRASTANDARD or SIERRAST), not loading instruments"); return false; } + Common::String exeName = exeNames.front()->getName(); + Common::String waveName = waveNames.front()->getName(); + // Set the MIDI program change to instrument number mapping and // load the instrument headers and their sample data. - // None of the tested SIERRASTANDARD-files have zeroes in them so - // there's no need to check for prematurely ending samples here. setProgramChangeMapping(exeInfo->instSet->progToInst); - return loadWaveFile(*waveFsnode, *exeInfo) && loadInstrumentHeaders(*exeFsnode, *exeInfo); + return loadWaveFile(waveName, *exeInfo) && loadInstrumentHeaders(exeName, *exeInfo); } /** Older Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV1 = { +static const IIgsMidiProgramMapping progToInstMappingV1 = { {19, 20, 22, 23, 21, 24, 5, 5, 5, 5, 6, 7, 10, 9, 11, 9, 15, 8, 5, 5, 17, 16, 18, 12, 14, 5, 5, 5, 5, 5, @@ -780,8 +620,9 @@ static const MidiProgramChangeMapping progToInstMappingV1 = { 5 }; -/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV2 = { +/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. + FIXME: Some instrument choices sound wrong. */ +static const IIgsMidiProgramMapping progToInstMappingV2 = { {21, 22, 24, 25, 23, 26, 6, 6, 6, 6, 7, 9, 12, 8, 13, 11, 17, 10, 6, 6, 19, 18, 20, 14, 16, 6, 6, 6, 6, 6, @@ -791,12 +632,12 @@ static const MidiProgramChangeMapping progToInstMappingV2 = { }; /** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ -static const InstrumentSetInfo instSetV1 = { +static const IIgsInstrumentSetInfo instSetV1 = { 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", &progToInstMappingV1 }; /** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ -static const InstrumentSetInfo instSetV2 = { +static const IIgsInstrumentSetInfo instSetV2 = { 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", &progToInstMappingV2 }; @@ -828,15 +669,14 @@ const IIgsExeInfo *SoundGen2GS::getIIgsExeInfo(enum AgiGameID gameid) const { return NULL; } -bool SoundGen2GS::loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo) { - bool loadedOk = false; // Was loading successful? +bool SoundGen2GS::loadInstrumentHeaders(Common::String &exePath, const IIgsExeInfo &exeInfo) { Common::File file; // Open the executable file and check that it has correct size file.open(exePath); if (file.size() != (int32)exeInfo.exeSize) { debugC(3, kDebugLevelSound, "Apple IIGS executable (%s) has wrong size (Is %d, should be %d)", - exePath.getPath().c_str(), file.size(), exeInfo.exeSize); + exePath.c_str(), file.size(), exeInfo.exeSize); } // Read the whole executable file into memory @@ -844,50 +684,49 @@ bool SoundGen2GS::loadInstrumentHeaders(const Common::FSNode &exePath, const IIg file.close(); // Check that we got enough data to be able to parse the instruments - if (data && data->size() >= (int32)(exeInfo.instSetStart + exeInfo.instSet->byteCount)) { - // Check instrument set's length (The info's saved in the executable) - data->seek(exeInfo.instSetStart - 4); - uint16 instSetByteCount = data->readUint16LE(); - if (instSetByteCount != exeInfo.instSet->byteCount) { - debugC(3, kDebugLevelSound, "Wrong instrument set size (Is %d, should be %d) in Apple IIGS executable (%s)", - instSetByteCount, exeInfo.instSet->byteCount, exePath.getPath().c_str()); - } + if (!data || data->size() < (int32)(exeInfo.instSetStart + exeInfo.instSet->byteCount)) { + warning("Error loading instruments from Apple IIGS executable (%s)", exePath.c_str()); + return false; + } - // Check instrument set's md5sum - data->seek(exeInfo.instSetStart); + // Check instrument set's length (The info's saved in the executable) + data->seek(exeInfo.instSetStart - 4); + uint16 instSetByteCount = data->readUint16LE(); + if (instSetByteCount != exeInfo.instSet->byteCount) { + debugC(3, kDebugLevelSound, "Wrong instrument set size (Is %d, should be %d) in Apple IIGS executable (%s)", + instSetByteCount, exeInfo.instSet->byteCount, exePath.c_str()); + } - Common::String md5str = Common::computeStreamMD5AsString(*data, exeInfo.instSet->byteCount); - if (md5str != exeInfo.instSet->md5) { - warning("Unknown Apple IIGS instrument set (md5: %s) in %s, trying to use it nonetheless", - md5str.c_str(), exePath.getPath().c_str()); - } + // Check instrument set's md5sum + data->seek(exeInfo.instSetStart); + Common::String md5str = Common::computeStreamMD5AsString(*data, exeInfo.instSet->byteCount); + if (md5str != exeInfo.instSet->md5) { + warning("Unknown Apple IIGS instrument set (md5: %s) in %s, trying to use it nonetheless", + md5str.c_str(), exePath.c_str()); + } - // Read in the instrument set one instrument at a time - data->seek(exeInfo.instSetStart); + // Read in the instrument set one instrument at a time + data->seek(exeInfo.instSetStart); - // Load the instruments - _instruments.clear(); - _instruments.reserve(exeInfo.instSet->instCount); + _instruments.clear(); + _instruments.reserve(exeInfo.instSet->instCount); - IIgsInstrumentHeader instrument; - for (uint i = 0; i < exeInfo.instSet->instCount; i++) { - if (!instrument.read(*data)) { - warning("Error loading Apple IIGS instrument (%d. of %d) from %s, not loading more instruments", - i + 1, exeInfo.instSet->instCount, exePath.getPath().c_str()); - break; - } - _instruments.push_back(instrument); // Add the successfully loaded instrument to the instruments array + IIgsInstrumentHeader instrument; + for (uint i = 0; i < exeInfo.instSet->instCount; i++) { + if (!instrument.read(*data)) { + warning("Error loading Apple IIGS instrument (%d. of %d) from %s, not loading more instruments", + i + 1, exeInfo.instSet->instCount, exePath.c_str()); + break; } + instrument.finalize(_wavetable); + _instruments.push_back(instrument); + } - // Loading was successful only if all instruments were loaded successfully - loadedOk = (_instruments.size() == exeInfo.instSet->instCount); - } else // Couldn't read enough data from the executable file - warning("Error loading instruments from Apple IIGS executable (%s)", exePath.getPath().c_str()); - - return loadedOk; + // Loading was successful only if all instruments were loaded successfully + return (_instruments.size() == exeInfo.instSet->instCount); } -bool SoundGen2GS::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo) { +bool SoundGen2GS::loadWaveFile(Common::String &wavePath, const IIgsExeInfo &exeInfo) { Common::File file; // Open the wave file and read it into memory @@ -896,23 +735,22 @@ bool SoundGen2GS::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo file.close(); // Check that we got the whole wave file - if (uint8Wave && uint8Wave->size() == SIERRASTANDARD_SIZE) { - // Check wave file's md5sum - Common::String md5str = Common::computeStreamMD5AsString(*uint8Wave, SIERRASTANDARD_SIZE); - if (md5str != exeInfo.instSet->waveFileMd5) { - warning("Unknown Apple IIGS wave file (md5: %s, game: %s).\n" \ + if (!uint8Wave || (uint8Wave->size() != SIERRASTANDARD_SIZE)) { + warning("Error loading Apple IIGS wave file (%s), not loading instruments", wavePath.c_str()); + return false; + } + + // Check wave file's md5sum + Common::String md5str = Common::computeStreamMD5AsString(*uint8Wave, SIERRASTANDARD_SIZE); + if (md5str != exeInfo.instSet->waveFileMd5) { + warning("Unknown Apple IIGS wave file (md5: %s, game: %s).\n" \ "Please report the information on the previous line to the ScummVM team.\n" \ "Using the wave file as it is - music may sound weird", md5str.c_str(), exeInfo.exePrefix); - } - - uint8Wave->seek(0); // Seek wave to its start - // Convert the wave file from 8-bit unsigned to 8-bit signed and save the result - _wave.resize(uint8Wave->size()); - return convertWave(*uint8Wave, _wave.begin(), uint8Wave->size()); - } else { // Couldn't read the wave file or it had incorrect size - warning("Error loading Apple IIGS wave file (%s), not loading instruments", wavePath.getPath().c_str()); - return false; } + + // Convert the wave file to 8-bit signed and save the result + uint8Wave->seek(0); + return convertWave(*uint8Wave, _wavetable, SIERRASTANDARD_SIZE); } } // End of namespace Agi diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 76f0642b7bcf..e729699bae14 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -31,45 +31,30 @@ namespace Agi { -#define BUFFER_SIZE 410 - -// Apple IIGS MIDI uses 60 ticks per second (Based on tests with Apple IIGS -// KQ1 and SQ1 under MESS 0.124a). So we make the audio buffer size to be a -// 1/60th of a second in length. That should be getSampleRate() / 60 samples -// in length but as getSampleRate() is always 22050 at the moment we just use -// the hardcoded value of 368 (22050/60 = 367.5 which rounds up to 368). -// FIXME: Use getSampleRate() / 60 rather than a hardcoded value -#define IIGS_BUFFER_SIZE 368 - -// MIDI command values (Shifted right by 4 so they're in the lower nibble) -#define MIDI_CMD_NOTE_OFF 0x08 -#define MIDI_CMD_NOTE_ON 0x09 -#define MIDI_CMD_CONTROLLER 0x0B -#define MIDI_CMD_PROGRAM_CHANGE 0x0C -#define MIDI_CMD_PITCH_WHEEL 0x0E -// Whole MIDI byte values (Command and channel info together) -#define MIDI_BYTE_STOP_SEQUENCE 0xFC -#define MIDI_BYTE_TIMER_SYNC 0xF8 - -struct IIgsEnvelopeSegment { - uint8 bp; - uint16 inc; ///< 8b.8b fixed point, very probably little endian -}; - -#define ENVELOPE_SEGMENT_COUNT 8 -struct IIgsEnvelope { - IIgsEnvelopeSegment seg[ENVELOPE_SEGMENT_COUNT]; - - /** Reads an Apple IIGS envelope from then given stream. */ - bool read(Common::SeekableReadStream &stream); -}; - -// 2**(1/12) i.e. the 12th root of 2 -#define SEMITONE 1.059463094359295 - -// C6's frequency is A4's (440 Hz) frequency but one full octave and three semitones higher -// i.e. C6_FREQ = 440 * pow(2.0, 15/12.0) -#define C6_FREQ 1046.502261202395 +// Sample data in SIERRASTANDARD files is in unsigned 8-bit format. A zero +// occurring in the sample data causes the ES5503 wavetable sound chip in +// Apple IIGS to halt the corresponding oscillator immediately. We preprocess +// the sample data by converting it to signed values and the instruments by +// detecting prematurely stopping samples beforehand. +// +// Note: None of the tested SIERRASTANDARD files have zeroes in them. So in +// practice there is no need to check for them. However, they still do exist +// in the sample resources. +#define ZERO_OFFSET 0x80 + +// Apple IIGS envelope update frequency defaults to 100Hz. It can be changed, +// so there might be differences per game, for example. +#define ENVELOPE_COEF 100 / _sampleRate + +// MIDI player commands +#define MIDI_NOTE_OFF 0x8 +#define MIDI_NOTE_ON 0x9 +#define MIDI_CONTROLLER 0xB +#define MIDI_PROGRAM_CHANGE 0xC +#define MIDI_PITCH_WHEEL 0xE + +#define MIDI_STOP_SEQUENCE 0xFC +#define MIDI_TIMER_SYNC 0xF8 // Size of the SIERRASTANDARD file (i.e. the wave file i.e. the sample data used by the instruments). #define SIERRASTANDARD_SIZE 65536 @@ -78,63 +63,34 @@ struct IIgsEnvelope { // Chosen empirically based on Apple IIGS AGI game data, increase if needed. #define MAX_INSTRUMENTS 28 -struct IIgsWaveInfo { - uint8 top; - uint addr; - uint size; -// Oscillator channel -#define OSC_CHANNEL_RIGHT 0 -#define OSC_CHANNEL_LEFT 1 - uint channel; -// Oscillator mode -#define OSC_MODE_LOOP 0 -#define OSC_MODE_ONESHOT 1 -#define OSC_MODE_SYNC_AM 2 -#define OSC_MODE_SWAP 3 - uint mode; - bool halt; - int16 relPitch; ///< Relative pitch in semitones (Signed 8b.8b fixed point) - - /** Reads an Apple IIGS wave information structure from the given stream. */ - bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -// Number of waves per Apple IIGS sound oscillator -#define WAVES_PER_OSCILLATOR 2 - -/** An Apple IIGS sound oscillator. Consists always of two waves. */ -struct IIgsOscillator { - IIgsWaveInfo waves[WAVES_PER_OSCILLATOR]; - - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -// Maximum number of oscillators in an Apple IIGS instrument. -// Chosen empirically based on Apple IIGS AGI game data, increase if needed. -#define MAX_OSCILLATORS 4 - -/** An Apple IIGS sound oscillator list. */ -struct IIgsOscillatorList { - uint count; ///< Oscillator count - IIgsOscillator osc[MAX_OSCILLATORS]; ///< The oscillators - - /** Indexing operators for easier access to the oscillators. */ - const IIgsOscillator &operator()(uint index) const { return osc[index]; } - IIgsOscillator &operator()(uint index) { return osc[index]; } +// The MIDI player allocates one generator for each note it starts to play. +// Here the maximum number of generators is defined. Feel free to increase +// this if it does not seem to be enough. +#define MAX_GENERATORS 16 - /** Reads an Apple IIGS oscillator list from the given stream. */ - bool read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; +#define ENVELOPE_SEGMENT_COUNT 8 +#define MAX_OSCILLATOR_WAVES 127 // Maximum is one for every MIDI key struct IIgsInstrumentHeader { - IIgsEnvelope env; - uint8 relseg; - uint8 bendrange; - uint8 vibdepth; - uint8 vibspeed; - IIgsOscillatorList oscList; + struct { + frac_t bp; // Envelope segment breakpoint + frac_t inc; // Envelope segment velocity + } env[ENVELOPE_SEGMENT_COUNT]; + uint8 seg; // Envelope release segment + uint8 bend; // Maximum range for pitch bend + uint8 vibDepth; // Vibrato depth + uint8 vibSpeed; // Vibrato speed + uint8 waveCount[2]; // Wave count for both generators + struct { + uint8 key; // Highest MIDI key to use this wave + int8* base; // Pointer to wave data + uint size; // Wave size + bool halt; // Oscillator halted? + bool loop; // Loop mode? + bool swap; // Swap mode? + bool chn; // Output channel (left / right) + int16 tune; // Fine tune in semitones (8.8 fixed point) + } wave[2][MAX_OSCILLATOR_WAVES]; /** * Read an Apple IIGS instrument header from the given stream. @@ -143,7 +99,7 @@ struct IIgsInstrumentHeader { * @return True if successful, false otherwise. */ bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); + bool finalize(int8 *); }; struct IIgsSampleHeader { @@ -162,33 +118,32 @@ struct IIgsSampleHeader { * @return True if successful, false otherwise. */ bool read(Common::SeekableReadStream &stream); - bool finalize(Common::SeekableReadStream &uint8Wave); + bool finalize(int8 *sample); }; -struct IIgsChannelInfo { - const IIgsInstrumentHeader *ins; ///< Instrument info - const int8 *relocatedSample; ///< Source sample data (8-bit signed format) using relocation - const int8 *unrelocatedSample; ///< Source sample data (8-bit signed format) without relocation - frac_t pos; ///< Current sample position - frac_t posAdd; ///< Current sample position adder (Calculated using note, vibrato etc) - uint8 origNote; ///< The original note without the added relative pitch - frac_t note; ///< Note (With the added relative pitch) - frac_t vol; ///< Current volume (Takes both channel volume and enveloping into account) - frac_t chanVol; ///< Channel volume - frac_t startEnvVol; ///< Starting envelope volume - frac_t envVol; ///< Current envelope volume - uint envSeg; ///< Current envelope segment - uint size; ///< Sample size - bool loop; ///< Should we loop the sample? - bool end; ///< Has the playing ended? - - void rewind(); ///< Rewinds the sound playing on this channel to its start - void setChannelVolume(uint8 volume); ///< Sets the channel volume - void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); ///< Sets the instrument to be used on this channel - void noteOn(uint8 noteParam, uint8 velocity); ///< Starts playing a note on this channel - void noteOff(uint8 velocity); ///< Releases the note on this channel - void stop(); ///< Stops the note playing on this channel instantly - bool playing(); ///< Is there a note playing on this channel? +class IIgsGenerator { +public: + IIgsGenerator() : ins(NULL), key(-1), chn(-1) {} + void setInstrument(IIgsInstrumentHeader *ins); + void noteOn(uint8 key, uint8 velocity); + void noteOff(); + + const IIgsInstrumentHeader *ins; ///< Currently used instrument + int key; ///< MIDI key + int vel; ///< MIDI velocity (& channel volume) + int chn; ///< MIDI channel + struct { + int8 *base; ///< Sample base pointer + uint size; ///< Sample size + frac_t p; ///< Sample pointer + frac_t pd; ///< Sample pointer delta + bool halt; ///< Is oscillator halted? + bool loop; ///< Is looping enabled? + bool swap; ///< Is swapping enabled? + bool chn; ///< Output channel (left / right) + } osc[2]; + int seg; ///< Current envelope segment + frac_t a; ///< Current envelope amplitude }; class IIgsMidi : public AgiSound { @@ -198,15 +153,14 @@ class IIgsMidi : public AgiSound { virtual uint16 type() { return _type; } virtual const uint8 *getPtr() { return _ptr; } virtual void setPtr(const uint8 *ptr) { _ptr = ptr; } - virtual void rewind() { _ptr = _data + 2; _midiTicks = _soundBufTicks = 0; } + virtual void rewind() { _ptr = _data + 2; _ticks = 0; } protected: uint8 *_data; ///< Raw sound resource data const uint8 *_ptr; ///< Pointer to the current position in the MIDI data uint32 _len; ///< Length of the raw sound resource uint16 _type; ///< Sound resource type public: - uint _midiTicks; ///< MIDI song position in ticks (1/60ths of a second) - uint _soundBufTicks; ///< Sound buffer position in ticks (1/60ths of a second) + uint _ticks; ///< MIDI song position in ticks (1/60ths of a second) }; class IIgsSample : public AgiSound { @@ -222,7 +176,7 @@ class IIgsSample : public AgiSound { }; /** Apple IIGS MIDI program change to instrument number mapping. */ -struct MidiProgramChangeMapping { +struct IIgsMidiProgramMapping { byte midiProgToInst[44]; ///< Lookup table for the MIDI program number to instrument number mapping byte undefinedInst; ///< The undefined instrument number @@ -233,12 +187,12 @@ struct MidiProgramChangeMapping { }; /** Apple IIGS AGI instrument set information. */ -struct InstrumentSetInfo { +struct IIgsInstrumentSetInfo { uint byteCount; ///< Length of the whole instrument set in bytes uint instCount; ///< Amount of instrument in the set const char *md5; ///< MD5 hex digest of the whole instrument set const char *waveFileMd5; ///< MD5 hex digest of the wave file (i.e. the sample data used by the instruments) - const MidiProgramChangeMapping *progToInst; ///< Program change to instrument number mapping + const IIgsMidiProgramMapping *progToInst; ///< Program change to instrument number mapping }; /** Apple IIGS AGI executable file information. */ @@ -248,27 +202,19 @@ struct IIgsExeInfo { uint agiVer; ///< Apple IIGS AGI version number, not strictly needed uint exeSize; ///< Size of the Apple IIGS AGI executable file in bytes uint instSetStart; ///< Starting offset of the instrument set inside the executable file - const InstrumentSetInfo *instSet; ///< Information about the used instrument set + const IIgsInstrumentSetInfo *instSet; ///< Information about the used instrument set }; class IIgsMidiChannel { public: - IIgsMidiChannel() : _instrument(0), _sample(0), _volume(0) {} - uint activeSounds() const; ///< How many active sounds are playing? - void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); - void setVolume(uint8 volume); - void noteOff(uint8 note, uint8 velocity); - void noteOn(uint8 note, uint8 velocity); - void stopSounds(); ///< Clears the channel of any sounds - void removeStoppedSounds(); ///< Removes all stopped sounds from this MIDI channel -public: - typedef Common::Array::const_iterator const_iterator; - typedef Common::Array::iterator iterator; - Common::Array _gsChannels; ///< Apple IIGS channels playing on this MIDI channel -protected: + IIgsMidiChannel() : _instrument(NULL), _volume(127) {} + void setInstrument(const IIgsInstrumentHeader *instrument) { _instrument = instrument; } + const IIgsInstrumentHeader* getInstrument() { return _instrument; } + void setVolume(int volume) { _volume = volume; } + int getVolume() { return _volume; } +private: const IIgsInstrumentHeader *_instrument; ///< Instrument used on this MIDI channel - const int8 *_sample; ///< Sample data used on this MIDI channel - uint8 _volume; ///< MIDI controller number 7 (Volume) + int _volume; ///< MIDI controller number 7 (Volume) }; class SoundGen2GS : public SoundGen, public Audio::AudioStream { @@ -279,73 +225,50 @@ class SoundGen2GS : public SoundGen, public Audio::AudioStream { void play(int resnum); void stop(void); - // AudioStream API int readBuffer(int16 *buffer, const int numSamples); - bool isStereo() const { - return false; - } - - bool endOfData() const { - return false; - } - - int getRate() const { - // FIXME: Ideally, we should use _sampleRate. - return 22050; - } + bool isStereo() const { return true; } + bool endOfData() const { return false; } + int getRate() const { return _sampleRate; } private: - bool _disabledMidi; - int _playingSound; - bool _playing; - - int16 *_sndBuffer; - -/** - * Class for managing Apple IIGS sound channels. - * TODO: Check what instruments are used by default on the MIDI channels - * FIXME: Some instrument choices sound wrong - */ -private: - typedef Common::Array::const_iterator const_iterator; - typedef Common::Array::iterator iterator; - static const uint kSfxMidiChannel = 0; ///< The MIDI channel used for playing sound effects - + // Loader methods bool loadInstruments(); - const IIgsExeInfo *getIIgsExeInfo(enum AgiGameID gameid) const; + bool loadInstrumentHeaders(Common::String &exePath, const IIgsExeInfo &exeInfo); + bool loadWaveFile(Common::String &wavePath, const IIgsExeInfo &exeInfo); - void setProgramChangeMapping(const MidiProgramChangeMapping *mapping); - bool loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo); - bool loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo); - - // Miscellaneous methods - void fillAudio(int16 *stream, uint len); - uint32 mixSound(); - void playSound(); - uint activeSounds() const; ///< How many active sounds are playing? - void stopSounds(); ///< Stops all sounds - void removeStoppedSounds(); ///< Removes all stopped sounds from the MIDI channels - - // For playing Apple IIGS AGI samples (Sound effects etc) - bool playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample); - void playMidiSound(); - void playSampleSound(); - - // MIDI commands - void midiNoteOff(uint8 channel, uint8 note, uint8 velocity); - void midiNoteOn(uint8 channel, uint8 note, uint8 velocity); - void midiController(uint8 channel, uint8 controller, uint8 value); - void midiProgramChange(uint8 channel, uint8 program); - void midiPitchWheel(uint8 wheelPos); - //protected: - const IIgsInstrumentHeader* getInstrument(uint8 program) const; - //public: - Common::Array _midiChannels; ///< Information about each MIDI channel - //protected: - Common::Array _wave; ///< Sample data used by the Apple IIGS MIDI instruments - const MidiProgramChangeMapping *_midiProgToInst; ///< MIDI program change to instrument number mapping - Common::Array _instruments; ///< Instruments used by the Apple IIGS AGI + const IIgsExeInfo *getIIgsExeInfo(enum AgiGameID gameid) const; + void setProgramChangeMapping(const IIgsMidiProgramMapping *mapping); + + // Player methods + void advancePlayer(); ///< Advance the player + void advanceMidiPlayer(); ///< Advance MIDI player + uint generateOutput(); ///< Fill the output buffer + + void haltGenerators(); ///< Halt all generators + uint activeGenerators(); ///< How many generators are active? + + void midiNoteOff(int channel, int note, int velocity); + void midiNoteOn(int channel, int note, int velocity); + double midiKeyToFreq(int key, double finetune); + IIgsInstrumentHeader* getInstrument(uint8 program) { return &_instruments[_progToInst->map(program)]; }; + IIgsGenerator* allocateGenerator() { IIgsGenerator* g = &_generators[_nextGen++]; _nextGen %= 16; return g; } + + bool _disableMidi; ///< Disable MIDI if loading instruments fail + int _playingSound; ///< Resource number for the currently playing sound + bool _playing; ///< True when the resource is still playing + + IIgsGenerator _generators[MAX_GENERATORS]; ///< IIGS sound generators that are used to play single notes + uint _nextGen; ///< Next generator available for allocation + IIgsMidiChannel _channels[16]; ///< MIDI channels + Common::Array _instruments; ///< Instrument data + const IIgsMidiProgramMapping *_progToInst; ///< MIDI program number to instrument mapping + int8 *_wavetable; ///< Sample data used by the instruments + uint _ticks; ///< MIDI ticks (60Hz) + int16 *_out; ///< Output buffer + uint _outSize; ///< Output buffer size + + static const int kSfxMidiChannel = 15; ///< MIDI channel used for playing sample resources }; } // End of namespace Agi From 7c5dfaa04c2d02a22b301823bedb2940c3e590aa Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 8 Apr 2011 22:46:19 -0400 Subject: [PATCH 019/369] COMMON: Parse the MPEG-4 esds atom --- audio/decoders/quicktime.cpp | 19 +++++++--- audio/decoders/quicktime.h | 2 +- common/quicktime.cpp | 67 ++++++++++++++++++++++++++++++++++++ common/quicktime.h | 3 ++ 4 files changed, 85 insertions(+), 6 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 62a6f6e40479..e18ba7c480a7 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -76,7 +76,7 @@ void QuickTimeAudioDecoder::init() { if (_audioStreamIndex >= 0) { AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - if (checkAudioCodecSupport(entry->codecTag)) { + if (checkAudioCodecSupport(entry->codecTag, _streams[_audioStreamIndex]->objectTypeMP4)) { _audStream = makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); _curAudioChunk = 0; @@ -140,7 +140,7 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt return 0; } -bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag) { +bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag, byte objectTypeMP4) { // Check if the codec is a supported codec if (tag == MKID_BE('twos') || tag == MKID_BE('raw ') || tag == MKID_BE('ima4')) return true; @@ -150,9 +150,18 @@ bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag) { return true; #endif - if (tag == MKID_BE('mp4a')) - warning("No MPEG-4 audio (AAC) support"); - else + if (tag == MKID_BE('mp4a')) { + Common::String audioType; + switch (objectTypeMP4) { + case 0x40: + audioType = "AAC"; + break; + default: + audioType = "Unknown"; + break; + } + warning("No MPEG-4 audio (%s) support", audioType.c_str()); + } else warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); return false; diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index be4d1097da61..6e9f5b2c4ea7 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -72,7 +72,7 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); AudioStream *createAudioStream(Common::SeekableReadStream *stream); - bool checkAudioCodecSupport(uint32 tag); + bool checkAudioCodecSupport(uint32 tag, byte objectTypeMP4); void init(); void queueNextAudioChunk(); diff --git a/common/quicktime.cpp b/common/quicktime.cpp index fe48cfdcb17d..a28f8180cf43 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -170,6 +170,7 @@ void QuickTimeParser::initParseTable() { { &QuickTimeParser::readLeaf, MKID_BE('vmhd') }, { &QuickTimeParser::readCMOV, MKID_BE('cmov') }, { &QuickTimeParser::readWAVE, MKID_BE('wave') }, + { &QuickTimeParser::readESDS, MKID_BE('esds') }, { 0, 0 } }; @@ -721,6 +722,71 @@ int QuickTimeParser::readWAVE(MOVatom atom) { return 0; } +enum { + kMP4IODescTag = 2, + kMP4ESDescTag = 3, + kMP4DecConfigDescTag = 4, + kMP4DecSpecificDescTag = 5 +}; + +static int readMP4DescLength(Common::SeekableReadStream *stream) { + int length = 0; + int count = 4; + + while (count--) { + byte c = stream->readByte(); + length = (length << 7) | (c & 0x7f); + + if (!(c & 0x80)) + break; + } + + return length; +} + +static void readMP4Desc(Common::SeekableReadStream *stream, byte &tag, int &length) { + tag = stream->readByte(); + length = readMP4DescLength(stream); +} + +int QuickTimeParser::readESDS(MOVatom atom) { + if (_numStreams < 1) + return 0; + + MOVStreamContext *st = _streams[_numStreams - 1]; + + _fd->readUint32BE(); // version + flags + + byte tag; + int length; + + readMP4Desc(_fd, tag, length); + _fd->readUint16BE(); // id + if (tag == kMP4ESDescTag) + _fd->readByte(); // priority + + // Check if we've got the Config MPEG-4 header + readMP4Desc(_fd, tag, length); + if (tag != kMP4DecConfigDescTag) + return 0; + + st->objectTypeMP4 = _fd->readByte(); + _fd->readByte(); // stream type + _fd->readUint16BE(); _fd->readByte(); // buffer size + _fd->readUint32BE(); // max bitrate + _fd->readUint32BE(); // avg bitrate + + // Check if we've got the Specific MPEG-4 header + readMP4Desc(_fd, tag, length); + if (tag != kMP4DecSpecificDescTag) + return 0; + + st->extradata = _fd->readStream(length); + + debug(0, "MPEG-4 object type = %02x", st->objectTypeMP4); + return 0; +} + void QuickTimeParser::close() { for (uint32 i = 0; i < _numStreams; i++) delete _streams[i]; @@ -761,6 +827,7 @@ QuickTimeParser::MOVStreamContext::MOVStreamContext() { nb_frames = 0; duration = 0; start_time = 0; + objectTypeMP4 = 0; } QuickTimeParser::MOVStreamContext::~MOVStreamContext() { diff --git a/common/quicktime.h b/common/quicktime.h index 42b48bbb9401..8e6b0ec64c0a 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -163,6 +163,8 @@ class QuickTimeParser { uint32 start_time; Common::Rational scaleFactorX; Common::Rational scaleFactorY; + + byte objectTypeMP4; }; virtual SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format) = 0; @@ -198,6 +200,7 @@ class QuickTimeParser { int readSTTS(MOVatom atom); int readCMOV(MOVatom atom); int readWAVE(MOVatom atom); + int readESDS(MOVatom atom); }; } // End of namespace Common From fbb2d4d6ccb26b419c1d854fbbfa8b7b0b7ef53a Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Sat, 9 Apr 2011 19:09:29 +0300 Subject: [PATCH 020/369] AGI: Let games start playing a new sound even if another one is still playing. --- engines/agi/sound.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index b215822917a0..d05b5bfbb6e9 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -100,51 +100,53 @@ void SoundMgr::unloadSound(int resnum) { } } +/** + * Start playing a sound resource. The logic here is that when the sound is + * finished we set the given flag to be true. This way the condition can be + * detected by the game. On the other hand, if the game wishes to start + * playing a new sound before the current one is finished, we also let it + * do that. + * @param resnum the sound resource number + * @param flag the flag that is wished to be set true when finished + */ void SoundMgr::startSound(int resnum, int flag) { - AgiSoundEmuType type; - - if (_vm->_game.sounds[resnum] != NULL && _vm->_game.sounds[resnum]->isPlaying()) - return; - - stopSound(); + debugC(3, kDebugLevelSound, "startSound(resnum = %d, flag = %d)", resnum, flag); if (_vm->_game.sounds[resnum] == NULL) // Is this needed at all? return; - type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); + stopSound(); + AgiSoundEmuType type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); if (type != AGI_SOUND_SAMPLE && type != AGI_SOUND_MIDI && type != AGI_SOUND_4CHN) return; + debugC(3, kDebugLevelSound, " type = %d", type); _vm->_game.sounds[resnum]->play(); _playingSound = resnum; - - debugC(3, kDebugLevelSound, "startSound(resnum = %d, flag = %d) type = %d", resnum, flag, type); - _soundGen->play(resnum); + // Reset the flag _endflag = flag; - - // Nat Budin reports that the flag should be reset when sound starts _vm->setflag(_endflag, false); } void SoundMgr::stopSound() { debugC(3, kDebugLevelSound, "stopSound() --> %d", _playingSound); - _endflag = -1; - if (_playingSound != -1) { if (_vm->_game.sounds[_playingSound]) // sanity checking _vm->_game.sounds[_playingSound]->stop(); - _soundGen->stop(); - _playingSound = -1; } + // This is probably not needed most of the time, but there also should + // not be any harm doing it, so do it anyway. if (_endflag != -1) _vm->setflag(_endflag, true); + + _endflag = -1; } int SoundMgr::initSound() { From 4b3f081ee01cb3ed269a99065f35aff7982956dc Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Sat, 9 Apr 2011 19:11:25 +0300 Subject: [PATCH 021/369] AGI: Cleanup sound_2gs.* --- engines/agi/sound_2gs.cpp | 15 +++++++++------ engines/agi/sound_2gs.h | 3 --- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 239290716a05..65d60d392b64 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -170,10 +170,13 @@ uint32 SoundGen2GS::generateOutput() { } } - // TODO: Advance vibrato here. Apple IIGS uses a LFO with - // a triangle wave for vibrato. None of the instruments in the - // current mappings from MIDI program number to instrument use - // vibrato, but some of the choices are possibly still wrong. + // TODO: Advance vibrato here. The Apple IIGS uses a LFO with + // triangle wave to modulate the frequency of both oscillators. + // In Apple IIGS the vibrato and the envelope are updated at the + // same time, so the vibrato speed depends on ENVELOPE_COEF. + // Note: None of the instruments in the current mappings from + // MIDI program number to instrument use vibrato, but some of + // the choices are possibly still wrong. // Advance oscillators int s0 = 0; @@ -205,7 +208,7 @@ uint32 SoundGen2GS::generateOutput() { } } - // Multiply sample with envelope and MIDI volume information. + // Take envelope and MIDI volume information into account. // Also amplify. s0 *= vol * g->vel/127 * 80/256; s1 *= vol * g->vel/127 * 80/256; @@ -379,7 +382,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->chn = channel; // Instruments can define different samples to be used based on - // what the key is. Find the correct sample for our key. + // what the key is. Find the correct samples for our key. int wa = 0; int wb = 0; while (wa < i->waveCount[0] - 1 && note > i->wave[0][wa].key) diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index e729699bae14..d60ea16d1436 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -124,9 +124,6 @@ struct IIgsSampleHeader { class IIgsGenerator { public: IIgsGenerator() : ins(NULL), key(-1), chn(-1) {} - void setInstrument(IIgsInstrumentHeader *ins); - void noteOn(uint8 key, uint8 velocity); - void noteOff(); const IIgsInstrumentHeader *ins; ///< Currently used instrument int key; ///< MIDI key From 13a6f40dbba1ae389b967b97b9c1cf83685af5e6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 9 Apr 2011 15:27:23 -0400 Subject: [PATCH 022/369] ALL: Add optional dependency on libfaad --- configure | 30 ++++++++++++++++++++++++++++++ ports.mk | 4 ++++ 2 files changed, 34 insertions(+) diff --git a/configure b/configure index be1220cc8ad3..0ec1292afd34 100755 --- a/configure +++ b/configure @@ -133,6 +133,7 @@ _zlib=auto _mpeg2=no _png=auto _theoradec=auto +_faad=auto _fluidsynth=auto _16bit=auto _opengl=auto @@ -756,6 +757,9 @@ Optional Libraries: --with-theoradec-prefix=DIR Prefix where libtheoradec is installed (optional) --disable-theoradec disable Theora decoder [autodetect] + --with-faad-prefix=DIR Prefix where libfaad is installed (optional) + --disable-faad disable AAC decoder [autodetect] + --with-fluidsynth-prefix=DIR Prefix where libfluidsynth is installed (optional) --disable-fluidsynth disable fluidsynth MIDI driver [autodetect] @@ -814,6 +818,8 @@ for ac_option in $@; do --enable-png) _png=yes ;; --disable-theoradec) _theoradec=no ;; --enable-theoradec) _theoradec=yes ;; + --disable-faad) _faad=no ;; + --enable-faad) _faad=yes ;; --disable-fluidsynth) _fluidsynth=no ;; --enable-readline) _readline=yes ;; --disable-readline) _readline=no ;; @@ -882,6 +888,11 @@ for ac_option in $@; do THEORADEC_CFLAGS="-I$arg/include" THEORADEC_LIBS="-L$arg/lib" ;; + --with-faad-prefix=*) + arg=`echo $ac_option | cut -d '=' -f 2` + FAAD_CFLAGS="-I$arg/include" + FAAD_LIBS="-L$arg/lib" + ;; --with-zlib-prefix=*) arg=`echo $ac_option | cut -d '=' -f 2` ZLIB_CFLAGS="-I$arg/include" @@ -2572,6 +2583,25 @@ if test ! "$_theoradec" = notsupported ; then echo "$_theoradec" fi +# +# Check for the AAC decoder +# +echocheck "libfaad" +if test "$_faad" = auto ; then + _faad=no + cat > $TMPC << EOF +#include +int main(void) { NeAACDecGetCapabilities(); return 0; } +EOF + cc_check $FAAD_CFLAGS $FAAD_LIBS -lfaad && _faad=yes +fi +if test "$_faad" = yes ; then + LIBS="$LIBS $FAAD_LIBS -lfaad" + INCLUDES="$INCLUDES $FAAD_CFLAGS" +fi +define_in_config_if_yes "$_faad" 'USE_FAAD' +echo "$_faad" + # # Check for SEQ MIDI # diff --git a/ports.mk b/ports.mk index c56031ef111a..efad75edc5ea 100644 --- a/ports.mk +++ b/ports.mk @@ -106,6 +106,10 @@ ifdef USE_THEORADEC OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libtheoradec.a endif +ifdef USE_FAAD +OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libfaad.a +endif + ifdef USE_ZLIB OSX_ZLIB ?= -lz endif From d099ad3a48a15472b634317ac9acf3438e684850 Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Sun, 10 Apr 2011 17:27:07 +0300 Subject: [PATCH 023/369] AGI: Detect swap mode correctly for Apple IIGS instruments. Also add comments describing which instruments use swap mode or vibrato, plus print debug messages when those instruments are actually being played. --- engines/agi/sound_2gs.cpp | 43 ++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 65d60d392b64..7d33f963bd0b 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -174,9 +174,6 @@ uint32 SoundGen2GS::generateOutput() { // triangle wave to modulate the frequency of both oscillators. // In Apple IIGS the vibrato and the envelope are updated at the // same time, so the vibrato speed depends on ENVELOPE_COEF. - // Note: None of the instruments in the current mappings from - // MIDI program number to instrument use vibrato, but some of - // the choices are possibly still wrong. // Advance oscillators int s0 = 0; @@ -411,6 +408,12 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->seg = 0; g->a = 0; + + // Print debug messages for instruments with swap mode or vibrato enabled + if (g->osc[0].swap || g->osc[1].swap) + debugC(2, kDebugLevelSound, "Detected swap mode in a playing instrument. This is rare and is not tested well..."); + if (i->vibDepth > 0) + debugC(2, kDebugLevelSound, "Detected vibrato in a playing instrument. Vibrato is not implemented, playing without..."); } double SoundGen2GS::midiKeyToFreq(int key, double finetune) { @@ -534,8 +537,8 @@ bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreA // Parse the generator mode byte to separate fields. wave[i][k].halt = b & 0x1; // Bit 0 = HALT - wave[i][k].loop = !(b & 0x2); // Bit 1 = LOOP - wave[i][k].swap = (b & 0x3) == 0x3; // HALT|LOOP = SWAP + wave[i][k].loop = !(b & 0x2); // Bit 1 =!LOOP + wave[i][k].swap = (b & 0x6) == 0x6; // Bit 1&2 = SWAP wave[k][k].chn = (b >> 4) > 0; // Output channel (left or right) } @@ -634,12 +637,38 @@ static const IIgsMidiProgramMapping progToInstMappingV2 = { 6 }; -/** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ +// Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). +// +// Instrument 0 uses vibrato. +// Instrument 1 uses vibrato. +// Instrument 3 uses vibrato. +// Instrument 5 has swap mode enabled for the first oscillator. +// Instruemnt 9 uses vibrato. +// Instrument 10 uses vibrato. +// Instrument 12 uses vibrato. +// Instrument 15 uses vibrato. +// Instrument 16 uses vibrato. +// Instrument 18 uses vibrato. static const IIgsInstrumentSetInfo instSetV1 = { 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", &progToInstMappingV1 }; -/** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ +// Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. +// +// Instrument 0 uses vibrato. +// Instrument 1 uses vibrato. +// Instrument 3 uses vibrato. +// Instrument 6 has swap mode enabled for the first oscillator. +// Instrument 11 uses vibrato. +// Instrument 12 uses vibrato. +// Instrument 14 uses vibrato. +// Instrument 17 uses vibrato. +// Instrument 18 uses vibrato. +// Instrument 20 uses vibrato. +// +// In KQ1 intro and in LSL intro one (and the same, or at least similar) +// instrument is using vibrato. In PQ intro there is also one instrument +// using vibrato. static const IIgsInstrumentSetInfo instSetV2 = { 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", &progToInstMappingV2 }; From f9413e4dc26081f59247fa7eae62f50258e92fa4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 10 Apr 2011 14:51:24 -0400 Subject: [PATCH 024/369] AUDIO: Add support for AAC audio --- audio/decoders/aac.cpp | 178 +++++++++++++++++++++++++++++++++++ audio/decoders/aac.h | 66 +++++++++++++ audio/decoders/quicktime.cpp | 72 ++++++++++---- audio/module.mk | 1 + 4 files changed, 297 insertions(+), 20 deletions(-) create mode 100644 audio/decoders/aac.cpp create mode 100644 audio/decoders/aac.h diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp new file mode 100644 index 000000000000..fb867250b701 --- /dev/null +++ b/audio/decoders/aac.cpp @@ -0,0 +1,178 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "audio/decoders/aac.h" + +#ifdef USE_FAAD + +#include "common/debug.h" +#include "common/stream.h" +#include "common/util.h" + +#include "audio/audiostream.h" + +#include + +namespace Audio { + +class AACStream : public AudioStream { +public: + AACStream(Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeStream, + Common::SeekableReadStream *extraData, + DisposeAfterUse::Flag disposeExtraData); + ~AACStream(); + + int readBuffer(int16 *buffer, const int numSamples); + + bool endOfData() const { return _inBufferPos >= _inBufferSize; } + bool isStereo() const { return _channels == 2; } + int getRate() const { return _rate; } + +private: + Common::SeekableReadStream *_stream; + DisposeAfterUse::Flag _disposeAfterUse; + + NeAACDecHandle _handle; + byte _channels; + unsigned long _rate; + + byte *_inBuffer; + uint32 _inBufferSize; + uint32 _inBufferPos; + + int16 *_remainingSamples; + uint32 _remainingSamplesSize; + uint32 _remainingSamplesPos; + + void init(Common::SeekableReadStream *extraData); +}; + +AACStream::AACStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeStream, + Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) { + + _stream = stream; + _disposeAfterUse = disposeStream; + _remainingSamples = 0; + _inBufferPos = 0; + + init(extraData); + + // Copy all the data to a pointer so it can be passed through + // (At least MPEG-4 chunks shouldn't be large) + _inBufferSize = stream->size(); + _inBuffer = new byte[_inBufferSize]; + stream->read(_inBuffer, _inBufferSize); + + if (disposeStream == DisposeAfterUse::YES) + delete stream; + + if (disposeExtraData == DisposeAfterUse::YES) + delete extraData; +} + +AACStream::~AACStream() { + NeAACDecClose(_handle); + delete[] _inBuffer; + delete[] _remainingSamples; +} + +void AACStream::init(Common::SeekableReadStream *extraData) { + // Open the library + _handle = NeAACDecOpen(); + + // Configure the library to our needs + NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(_handle); + conf->outputFormat = FAAD_FMT_16BIT; // We only support 16bit audio + conf->downMatrix = 1; // Convert from 5.1 to stereo if required + NeAACDecSetConfiguration(_handle, conf); + + // Copy the extra data to a buffer + extraData->seek(0); + byte *extraDataBuf = new byte[extraData->size()]; + extraData->read(extraDataBuf, extraData->size()); + + // Initialize with our extra data + // NOTE: This code assumes the extra data is coming from an MPEG-4 file! + int err = NeAACDecInit2(_handle, extraDataBuf, extraData->size(), &_rate, &_channels); + delete[] extraDataBuf; + + if (err < 0) + error("Could not initialize AAC decoder: %s", NeAACDecGetErrorMessage(err)); +} + +int AACStream::readBuffer(int16 *buffer, const int numSamples) { + int samples = 0; + + assert((numSamples % _channels) == 0); + + if (_remainingSamples) { + samples = MIN(numSamples, _remainingSamplesSize - _remainingSamplesPos); + + memcpy(buffer, _remainingSamples + _remainingSamplesPos, samples * 2); + _remainingSamplesPos += samples; + + if (_remainingSamplesPos == _remainingSamplesSize) { + delete[] _remainingSamples; + _remainingSamples = 0; + } + } + + while (samples < numSamples && !endOfData()) { + NeAACDecFrameInfo frameInfo; + uint16 *decodedSamples = (uint16 *)NeAACDecDecode(_handle, &frameInfo, _inBuffer + _inBufferPos, _inBufferSize - _inBufferPos); + + if (frameInfo.error != 0) + error("Failed to decode AAC frame: %s", NeAACDecGetErrorMessage(frameInfo.error)); + + int decodedSampleSize = frameInfo.samples; + int copySamples = (decodedSampleSize > (numSamples - samples)) ? (numSamples - samples) : decodedSampleSize; + + memcpy(buffer + samples, decodedSamples, copySamples * 2); + samples += copySamples; + + if (copySamples != decodedSampleSize) { + _remainingSamplesSize = decodedSampleSize - copySamples; + _remainingSamples = new int16[_remainingSamplesSize]; + _remainingSamplesPos = 0; + memcpy(_remainingSamples, decodedSamples + copySamples, _remainingSamplesSize * 2); + } + + _inBufferPos += frameInfo.bytesconsumed; + } + + return samples; +} + +// Factory function +AudioStream *makeAACStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeStream, + Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) { + + return new AACStream(stream, disposeStream, extraData, disposeExtraData); +} + +} // End of namespace Audio + +#endif // #ifdef USE_FAAD diff --git a/audio/decoders/aac.h b/audio/decoders/aac.h new file mode 100644 index 000000000000..f14fa9488b83 --- /dev/null +++ b/audio/decoders/aac.h @@ -0,0 +1,66 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/** + * @file + * Sound decoder used in engines: + * - groovie + */ + +#ifndef SOUND_AAC_H +#define SOUND_AAC_H + +#include "common/scummsys.h" +#include "common/types.h" + +#ifdef USE_FAAD + +namespace Common { + class SeekableReadStream; +} + +namespace Audio { + +class AudioStream; + +/** + * Create a new AudioStream from the AAC data in the given stream. + * + * @param stream the SeekableReadStream from which to read the AAC data + * @param disposeStream whether to delete the stream after use + * @param extraData the SeekableReadStream from which to read the AAC extra data + * @param disposeExtraData whether to delete the extra data stream after use + * @return a new AudioStream, or NULL, if an error occurred + */ +AudioStream *makeAACStream( + Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeStream, + Common::SeekableReadStream *extraData, + DisposeAfterUse::Flag disposeExtraData = DisposeAfterUse::NO); + +} // End of namespace Audio + +#endif // #ifdef USE_FAAD +#endif // #ifndef SOUND_AAC_H diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index e18ba7c480a7..9b69012c7af2 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -32,6 +32,7 @@ #include "audio/decoders/quicktime.h" // Codecs +#include "audio/decoders/aac.h" #include "audio/decoders/adpcm.h" #include "audio/decoders/qdm2.h" #include "audio/decoders/raw.h" @@ -153,9 +154,13 @@ bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag, byte objectTypeMP if (tag == MKID_BE('mp4a')) { Common::String audioType; switch (objectTypeMP4) { - case 0x40: + case 0x40: // AAC +#ifdef USE_FAAD + return true; +#else audioType = "AAC"; break; +#endif default: audioType = "Unknown"; break; @@ -190,6 +195,12 @@ AudioStream *QuickTimeAudioDecoder::createAudioStream(Common::SeekableReadStream } else if (entry->codecTag == MKID_BE('ima4')) { // Riven uses this codec (as do some Myst ME videos) return makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), kADPCMApple, entry->sampleRate, entry->channels, 34); + } else if (entry->codecTag == MKID_BE('mp4a')) { + // The 7th Guest iOS uses an MPEG-4 codec +#ifdef USE_FAAD + if (_streams[_audioStreamIndex]->objectTypeMP4 == 0x40) + return makeAACStream(stream, DisposeAfterUse::YES, _streams[_audioStreamIndex]->extradata); +#endif #ifdef AUDIO_QDM2_H } else if (entry->codecTag == MKID_BE('QDM2')) { // Myst ME uses this codec for many videos @@ -225,27 +236,48 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { uint32 sampleCount = getAudioChunkSampleCount(_curAudioChunk); assert(sampleCount); - // Then calculate the right sizes - while (sampleCount > 0) { - uint32 samples = 0, size = 0; + if (_streams[_audioStreamIndex]->stts_count == 1 && _streams[_audioStreamIndex]->stts_data[0].duration == 1) { + // Old-style audio demuxing + + // Then calculate the right sizes + while (sampleCount > 0) { + uint32 samples = 0, size = 0; + + if (entry->samplesPerFrame >= 160) { + samples = entry->samplesPerFrame; + size = entry->bytesPerFrame; + } else if (entry->samplesPerFrame > 1) { + samples = MIN((1024 / entry->samplesPerFrame) * entry->samplesPerFrame, sampleCount); + size = (samples / entry->samplesPerFrame) * entry->bytesPerFrame; + } else { + samples = MIN(1024, sampleCount); + size = samples * _streams[_audioStreamIndex]->sample_size; + } - if (entry->samplesPerFrame >= 160) { - samples = entry->samplesPerFrame; - size = entry->bytesPerFrame; - } else if (entry->samplesPerFrame > 1) { - samples = MIN((1024 / entry->samplesPerFrame) * entry->samplesPerFrame, sampleCount); - size = (samples / entry->samplesPerFrame) * entry->bytesPerFrame; - } else { - samples = MIN(1024, sampleCount); - size = samples * _streams[_audioStreamIndex]->sample_size; + // Now, we read in the data for this data and output it + byte *data = (byte *)malloc(size); + _fd->read(data, size); + wStream->write(data, size); + free(data); + sampleCount -= samples; + } + } else { + // New-style audio demuxing + + // Find our starting sample + uint32 startSample = 0; + for (uint32 i = 0; i < _curAudioChunk; i++) + startSample += getAudioChunkSampleCount(i); + + for (uint32 i = 0; i < sampleCount; i++) { + uint32 size = (_streams[_audioStreamIndex]->sample_size != 0) ? _streams[_audioStreamIndex]->sample_size : _streams[_audioStreamIndex]->sample_sizes[i + startSample]; + + // Now, we read in the data for this data and output it + byte *data = (byte *)malloc(size); + _fd->read(data, size); + wStream->write(data, size); + free(data); } - - // Now, we read in the data for this data and output it - byte *data = (byte *)malloc(size); - _fd->read(data, size); - wStream->write(data, size); - free(data); - sampleCount -= samples; } // Now queue the buffer diff --git a/audio/module.mk b/audio/module.mk index a13eb49bb182..545a55c23bcb 100644 --- a/audio/module.mk +++ b/audio/module.mk @@ -13,6 +13,7 @@ MODULE_OBJS := \ musicplugin.o \ null.o \ timestamp.o \ + decoders/aac.o \ decoders/adpcm.o \ decoders/aiff.o \ decoders/flac.o \ From 9d0e5a7132341b1f9d31fa775cb4f98fa95b73a6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 10 Apr 2011 15:11:03 -0400 Subject: [PATCH 025/369] ALL: Add/update some comments --- audio/decoders/aac.cpp | 3 +++ audio/decoders/quicktime.h | 8 ++++++++ common/quicktime.h | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp index fb867250b701..b38d4e03b435 100644 --- a/audio/decoders/aac.cpp +++ b/audio/decoders/aac.cpp @@ -128,6 +128,7 @@ int AACStream::readBuffer(int16 *buffer, const int numSamples) { assert((numSamples % _channels) == 0); + // Dip into our remaining samples pool if it's available if (_remainingSamples) { samples = MIN(numSamples, _remainingSamplesSize - _remainingSamplesPos); @@ -140,6 +141,7 @@ int AACStream::readBuffer(int16 *buffer, const int numSamples) { } } + // Decode until we have enough samples (or there's no more left) while (samples < numSamples && !endOfData()) { NeAACDecFrameInfo frameInfo; uint16 *decodedSamples = (uint16 *)NeAACDecDecode(_handle, &frameInfo, _inBuffer + _inBufferPos, _inBufferSize - _inBufferPos); @@ -153,6 +155,7 @@ int AACStream::readBuffer(int16 *buffer, const int numSamples) { memcpy(buffer + samples, decodedSamples, copySamples * 2); samples += copySamples; + // Copy leftover samples for use in a later readBuffer() call if (copySamples != decodedSampleSize) { _remainingSamplesSize = decodedSampleSize - copySamples; _remainingSamples = new int16[_remainingSamplesSize]; diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 6e9f5b2c4ea7..2fca5d694421 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -23,6 +23,14 @@ * */ +/** + * @file + * Sound decoder used in engines: + * - groovie + * - mohawk + * - sci + */ + #ifndef AUDIO_QUICKTIME_H #define AUDIO_QUICKTIME_H diff --git a/common/quicktime.h b/common/quicktime.h index 8e6b0ec64c0a..c54d7f158e3e 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -43,9 +43,10 @@ namespace Common { class MacResManager; /** - * Parser for QuickTime files. + * Parser for QuickTime/MPEG-4 files. * * File parser used in engines: + * - groovie * - mohawk * - sci */ From 368e0e47b525609410f7152136a98d399b5dcf52 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 10 Apr 2011 18:20:53 -0400 Subject: [PATCH 026/369] AUDIO: Remove unused variables --- audio/decoders/aac.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp index b38d4e03b435..75f3a93cf6fd 100644 --- a/audio/decoders/aac.cpp +++ b/audio/decoders/aac.cpp @@ -52,9 +52,6 @@ class AACStream : public AudioStream { int getRate() const { return _rate; } private: - Common::SeekableReadStream *_stream; - DisposeAfterUse::Flag _disposeAfterUse; - NeAACDecHandle _handle; byte _channels; unsigned long _rate; @@ -73,8 +70,6 @@ class AACStream : public AudioStream { AACStream::AACStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *extraData, DisposeAfterUse::Flag disposeExtraData) { - _stream = stream; - _disposeAfterUse = disposeStream; _remainingSamples = 0; _inBufferPos = 0; From 4a39baa095ae0df93234577084237e3702aa546d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 10 Apr 2011 21:11:02 -0400 Subject: [PATCH 027/369] COMMON: Fix QuickTime track duration --- common/quicktime.cpp | 30 ++++-------------------------- common/quicktime.h | 1 - 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/common/quicktime.cpp b/common/quicktime.cpp index a28f8180cf43..176fdef8e7ef 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -129,18 +129,10 @@ void QuickTimeParser::init() { i++; } - // Adjust time/duration - for (uint32 i = 0; i < _numStreams; i++) { - MOVStreamContext *sc = _streams[i]; - - if (!sc->time_rate) - sc->time_rate = 1; - - if (!sc->time_scale) - sc->time_scale = _timeScale; - - sc->duration /= sc->time_rate; - } + // Adjust time scale + for (uint32 i = 0; i < _numStreams; i++) + if (!_streams[i]->time_scale) + _streams[i]->time_scale = _timeScale; } void QuickTimeParser::initParseTable() { @@ -637,13 +629,8 @@ int QuickTimeParser::readSTSZ(MOVatom atom) { return 0; } -static uint32 ff_gcd(uint32 a, uint32 b) { - return b ? ff_gcd(b, a % b) : a; -} - int QuickTimeParser::readSTTS(MOVatom atom) { MOVStreamContext *st = _streams[_numStreams - 1]; - uint32 duration = 0; uint32 total_sample_count = 0; _fd->readByte(); // version @@ -654,8 +641,6 @@ int QuickTimeParser::readSTTS(MOVatom atom) { debug(0, "track[%i].stts.entries = %i", _numStreams - 1, st->stts_count); - st->time_rate = 0; - for (int32 i = 0; i < st->stts_count; i++) { int sample_duration; int sample_count; @@ -665,19 +650,13 @@ int QuickTimeParser::readSTTS(MOVatom atom) { st->stts_data[i].count = sample_count; st->stts_data[i].duration = sample_duration; - st->time_rate = ff_gcd(st->time_rate, sample_duration); - debug(0, "sample_count=%d, sample_duration=%d", sample_count, sample_duration); - duration += sample_duration * sample_count; total_sample_count += sample_count; } st->nb_frames = total_sample_count; - if (duration) - st->duration = duration; - return 0; } @@ -817,7 +796,6 @@ QuickTimeParser::MOVStreamContext::MOVStreamContext() { keyframe_count = 0; keyframes = 0; time_scale = 0; - time_rate = 0; width = 0; height = 0; codec_type = CODEC_TYPE_MOV_OTHER; diff --git a/common/quicktime.h b/common/quicktime.h index c54d7f158e3e..a5903bc0f642 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -146,7 +146,6 @@ class QuickTimeParser { uint32 keyframe_count; uint32 *keyframes; int32 time_scale; - int time_rate; uint16 width; uint16 height; From 412a152e6bd64e70d82a9a8820face2e7204f127 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Mon, 11 Apr 2011 19:27:28 +0930 Subject: [PATCH 028/369] GROOVIE: T7G iOS patches in 7/11 soundtrack files during intro sequence --- engines/groovie/music.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index bc8131379bec..3bbac2a570c0 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -768,10 +768,17 @@ bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { if (len < 4) return false; // This shouldn't actually occur - // RL still says xmi, but we're after external m4a - info.filename.setChar('m', len-3); - info.filename.setChar('4', len-2); - info.filename.setChar('a', len-1); + // iOS port provides alternative intro sequence music + if (info.filename == "gu39.xmi") { + info.filename = "intro.m4a"; + } else if (info.filename == "gu32.xmi") { + info.filename = "foyer.m4a"; + } else { + // RL still says xmi, but we're after external m4a + info.filename.setChar('m', len-3); + info.filename.setChar('4', len-2); + info.filename.setChar('a', len-1); + } // Create the audio stream Audio::AudioStream *audStream = Audio::makeQuickTimeStream(info.filename); From 2e59957471e8ee0fa541811c3a50c68715d8798a Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Mon, 11 Apr 2011 19:33:01 +0930 Subject: [PATCH 029/369] GROOVIE: T7G iOS isn't a CD game - don't check or prompt user --- engines/groovie/groovie.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 47070cc08645..552aec6128a7 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -227,17 +227,19 @@ Common::Error GroovieEngine::run() { _script->directGameLoad(slot); } - // Check that the game files and the audio tracks aren't together run from - // the same cd - checkCD(); - // Game timer counter uint16 tmr = 0; - // Initialize the CD - int cd_num = ConfMan.getInt("cdrom"); - if (cd_num >= 0) - _system->getAudioCDManager()->openCD(cd_num); + // Check that the game files and the audio tracks aren't together run from + // the same cd + if (getPlatform() != Common::kPlatformIOS) { + checkCD(); + + // Initialize the CD + int cd_num = ConfMan.getInt("cdrom"); + if (cd_num >= 0) + _system->getAudioCDManager()->openCD(cd_num); + } while (!shouldQuit()) { // Give the debugger a chance to act From 78f17f290a01ffb96693e5892bfcb6d4a1319b67 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 11 Apr 2011 21:37:44 -0400 Subject: [PATCH 030/369] BASE: Add AAC to the version string when compiled in --- base/version.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/version.cpp b/base/version.cpp index 6967263f5c4c..a1f6d60fa0e6 100644 --- a/base/version.cpp +++ b/base/version.cpp @@ -115,5 +115,9 @@ const char *gScummVMFeatures = "" #ifdef USE_THEORADEC "Theora " #endif + +#ifdef USE_FAAD + "AAC " +#endif ; From 506f3bdc101b301e93a99fc4626701b32b4f66b3 Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Tue, 12 Apr 2011 18:07:35 +0300 Subject: [PATCH 031/369] AGI: Formatting --- engines/agi/sound_2gs.cpp | 114 ++++++++++++++++++--------------- engines/agi/sound_2gs.h | 130 +++++++++++++++++++------------------- 2 files changed, 127 insertions(+), 117 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 7d33f963bd0b..71cc2d418396 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -138,10 +138,10 @@ void SoundGen2GS::stop() { * @return Number of generated samples */ uint32 SoundGen2GS::generateOutput() { - memset(_out, 0, _outSize*2*2); + memset(_out, 0, _outSize * 2 * 2); if (!_playing || _playingSound == -1) - return _outSize*2; + return _outSize * 2; int16 *p = _out; int n = _outSize; @@ -207,25 +207,35 @@ uint32 SoundGen2GS::generateOutput() { // Take envelope and MIDI volume information into account. // Also amplify. - s0 *= vol * g->vel/127 * 80/256; - s1 *= vol * g->vel/127 * 80/256; + s0 *= vol * g->vel / 127 * 80 / 256; + s1 *= vol * g->vel / 127 * 80 / 256; - if (g->osc[0].chn) outl += s0; - else outr += s0; - if (g->osc[1].chn) outl += s1; - else outr += s1; + // Select output channel. + if (g->osc[0].chn) + outl += s0; + else + outr += s0; + + if (g->osc[1].chn) + outl += s1; + else + outr += s1; } - if (outl > 32768) outl = 32768; - if (outl <-32767) outl =-32767; - if (outr > 32768) outr = 32768; - if (outr <-32767) outr =-32767; + if (outl > 32768) + outl = 32768; + if (outl < -32767) + outl = -32767; + if (outr > 32768) + outr = 32768; + if (outr < -32767) + outr = -32767; *p++ = outl; *p++ = outr; } - return _outSize*2; + return _outSize * 2; } void SoundGen2GS::advancePlayer() { @@ -388,26 +398,26 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { wb++; // Prepare the generator. - g->osc[0].base = i->wave[0][wa].base; - g->osc[0].size = i->wave[0][wa].size; - g->osc[0].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[0][wa].tune / 256.0) / (double)_sampleRate); - g->osc[0].p = 0; - g->osc[0].halt = i->wave[0][wa].halt; - g->osc[0].loop = i->wave[0][wa].loop; - g->osc[0].swap = i->wave[0][wa].swap; - g->osc[0].chn = i->wave[0][wa].chn; - - g->osc[1].base = i->wave[1][wb].base; - g->osc[1].size = i->wave[1][wb].size; - g->osc[1].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[1][wb].tune / 256.0) / (double)_sampleRate); - g->osc[1].p = 0; - g->osc[1].halt = i->wave[1][wb].halt; - g->osc[1].loop = i->wave[1][wb].loop; - g->osc[1].swap = i->wave[1][wb].swap; - g->osc[1].chn = i->wave[1][wb].chn; - - g->seg = 0; - g->a = 0; + g->osc[0].base = i->wave[0][wa].base; + g->osc[0].size = i->wave[0][wa].size; + g->osc[0].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[0][wa].tune / 256.0) / (double)_sampleRate); + g->osc[0].p = 0; + g->osc[0].halt = i->wave[0][wa].halt; + g->osc[0].loop = i->wave[0][wa].loop; + g->osc[0].swap = i->wave[0][wa].swap; + g->osc[0].chn = i->wave[0][wa].chn; + + g->osc[1].base = i->wave[1][wb].base; + g->osc[1].size = i->wave[1][wb].size; + g->osc[1].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[1][wb].tune / 256.0) / (double)_sampleRate); + g->osc[1].p = 0; + g->osc[1].halt = i->wave[1][wb].halt; + g->osc[1].loop = i->wave[1][wb].loop; + g->osc[1].swap = i->wave[1][wb].swap; + g->osc[1].chn = i->wave[1][wb].chn; + + g->seg = 0; + g->a = 0; // Print debug messages for instruments with swap mode or vibrato enabled if (g->osc[0].swap || g->osc[1].swap) @@ -442,7 +452,7 @@ void SoundGen2GS::setProgramChangeMapping(const IIgsMidiProgramMapping *mapping) IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { _data = data; // Save the resource pointer _ptr = _data + 2; // Set current position to just after the header - _len = len; // Save the resource's length + _len = len; // Save the resource's length _type = READ_LE_UINT16(data); // Read sound resource's type _ticks = 0; _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); @@ -505,21 +515,21 @@ IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { for (int i = 0; i < ENVELOPE_SEGMENT_COUNT; i++) { - env[i].bp = intToFrac(stream.readByte()); + env[i].bp = intToFrac(stream.readByte()); env[i].inc = intToFrac(stream.readUint16LE()) >> 8; } - seg = stream.readByte(); - /*priority =*/ stream.readByte(); // Not needed. 32 in all tested data. - bend = stream.readByte(); - vibDepth = stream.readByte(); - vibSpeed = stream.readByte(); + seg = stream.readByte(); + /*priority =*/ stream.readByte(); // Not needed. 32 in all tested data. + bend = stream.readByte(); + vibDepth = stream.readByte(); + vibSpeed = stream.readByte(); stream.readByte(); // Not needed? 0 in all tested data. waveCount[0] = stream.readByte(); waveCount[1] = stream.readByte(); for (int i = 0; i < 2; i++) for (int k = 0; k < waveCount[i]; k++) { - wave[i][k].key = stream.readByte(); + wave[i][k].key = stream.readByte(); wave[i][k].base = (int8*)(stream.readByte() << 8); wave[i][k].size = 0x100 << (stream.readByte() & 7); uint8 b = stream.readByte(); @@ -536,10 +546,10 @@ bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreA } // Parse the generator mode byte to separate fields. - wave[i][k].halt = b & 0x1; // Bit 0 = HALT - wave[i][k].loop = !(b & 0x2); // Bit 1 =!LOOP - wave[i][k].swap = (b & 0x6) == 0x6; // Bit 1&2 = SWAP - wave[k][k].chn = (b >> 4) > 0; // Output channel (left or right) + wave[i][k].halt = b & 0x1; // Bit 0 = HALT + wave[i][k].loop = !(b & 0x2); // Bit 1 =!LOOP + wave[i][k].swap = (b & 0x6) == 0x6; // Bit 1&2 = SWAP + wave[k][k].chn = (b >> 4) > 0; // Output channel (left or right) } return !(stream.eos() || stream.err()); @@ -564,13 +574,13 @@ bool IIgsInstrumentHeader::finalize(int8 *wavetable) { } bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { - type = stream.readUint16LE(); - pitch = stream.readByte(); - unknownByte_Ofs3 = stream.readByte(); - volume = stream.readByte(); - unknownByte_Ofs5 = stream.readByte(); - instrumentSize = stream.readUint16LE(); - sampleSize = stream.readUint16LE(); + type = stream.readUint16LE(); + pitch = stream.readByte(); + unknownByte_Ofs3 = stream.readByte(); + volume = stream.readByte(); + unknownByte_Ofs5 = stream.readByte(); + instrumentSize = stream.readUint16LE(); + sampleSize = stream.readUint16LE(); // Read the instrument header *ignoring* its wave address info return instrument.read(stream, true); } diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index d60ea16d1436..2d08ef101c09 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -47,14 +47,14 @@ namespace Agi { #define ENVELOPE_COEF 100 / _sampleRate // MIDI player commands -#define MIDI_NOTE_OFF 0x8 -#define MIDI_NOTE_ON 0x9 -#define MIDI_CONTROLLER 0xB -#define MIDI_PROGRAM_CHANGE 0xC -#define MIDI_PITCH_WHEEL 0xE +#define MIDI_NOTE_OFF 0x8 +#define MIDI_NOTE_ON 0x9 +#define MIDI_CONTROLLER 0xB +#define MIDI_PROGRAM_CHANGE 0xC +#define MIDI_PITCH_WHEEL 0xE -#define MIDI_STOP_SEQUENCE 0xFC -#define MIDI_TIMER_SYNC 0xF8 +#define MIDI_STOP_SEQUENCE 0xFC +#define MIDI_TIMER_SYNC 0xF8 // Size of the SIERRASTANDARD file (i.e. the wave file i.e. the sample data used by the instruments). #define SIERRASTANDARD_SIZE 65536 @@ -73,23 +73,23 @@ namespace Agi { struct IIgsInstrumentHeader { struct { - frac_t bp; // Envelope segment breakpoint - frac_t inc; // Envelope segment velocity + frac_t bp; ///< Envelope segment breakpoint + frac_t inc; ///< Envelope segment velocity } env[ENVELOPE_SEGMENT_COUNT]; - uint8 seg; // Envelope release segment - uint8 bend; // Maximum range for pitch bend - uint8 vibDepth; // Vibrato depth - uint8 vibSpeed; // Vibrato speed - uint8 waveCount[2]; // Wave count for both generators + uint8 seg; ///< Envelope release segment + uint8 bend; ///< Maximum range for pitch bend + uint8 vibDepth; ///< Vibrato depth + uint8 vibSpeed; ///< Vibrato speed + uint8 waveCount[2]; ///< Wave count for both generators struct { - uint8 key; // Highest MIDI key to use this wave - int8* base; // Pointer to wave data - uint size; // Wave size - bool halt; // Oscillator halted? - bool loop; // Loop mode? - bool swap; // Swap mode? - bool chn; // Output channel (left / right) - int16 tune; // Fine tune in semitones (8.8 fixed point) + uint8 key; ///< Highest MIDI key to use this wave + int8* base; ///< Pointer to wave data + uint size; ///< Wave size + bool halt; ///< Oscillator halted? + bool loop; ///< Loop mode? + bool swap; ///< Swap mode? + bool chn; ///< Output channel (left / right) + int16 tune; ///< Fine tune in semitones (8.8 fixed point) } wave[2][MAX_OSCILLATOR_WAVES]; /** @@ -126,21 +126,21 @@ class IIgsGenerator { IIgsGenerator() : ins(NULL), key(-1), chn(-1) {} const IIgsInstrumentHeader *ins; ///< Currently used instrument - int key; ///< MIDI key - int vel; ///< MIDI velocity (& channel volume) - int chn; ///< MIDI channel + int key; ///< MIDI key + int vel; ///< MIDI velocity (& channel volume) + int chn; ///< MIDI channel struct { - int8 *base; ///< Sample base pointer - uint size; ///< Sample size - frac_t p; ///< Sample pointer - frac_t pd; ///< Sample pointer delta - bool halt; ///< Is oscillator halted? - bool loop; ///< Is looping enabled? - bool swap; ///< Is swapping enabled? - bool chn; ///< Output channel (left / right) + int8 *base; ///< Sample base pointer + uint size; ///< Sample size + frac_t p; ///< Sample pointer + frac_t pd; ///< Sample pointer delta + bool halt; ///< Is oscillator halted? + bool loop; ///< Is looping enabled? + bool swap; ///< Is swapping enabled? + bool chn; ///< Output channel (left / right) } osc[2]; - int seg; ///< Current envelope segment - frac_t a; ///< Current envelope amplitude + int seg; ///< Current envelope segment + frac_t a; ///< Current envelope amplitude }; class IIgsMidi : public AgiSound { @@ -168,8 +168,8 @@ class IIgsSample : public AgiSound { const IIgsSampleHeader &getHeader() const { return _header; } const int8 *getSample() const { return _sample; } protected: - IIgsSampleHeader _header; ///< Apple IIGS AGI sample header - int8 *_sample; ///< Sample data (8-bit signed format) + IIgsSampleHeader _header; ///< Apple IIGS AGI sample header + int8 *_sample; ///< Sample data (8-bit signed format) }; /** Apple IIGS MIDI program change to instrument number mapping. */ @@ -185,21 +185,21 @@ struct IIgsMidiProgramMapping { /** Apple IIGS AGI instrument set information. */ struct IIgsInstrumentSetInfo { - uint byteCount; ///< Length of the whole instrument set in bytes - uint instCount; ///< Amount of instrument in the set - const char *md5; ///< MD5 hex digest of the whole instrument set + uint byteCount; ///< Length of the whole instrument set in bytes + uint instCount; ///< Amount of instrument in the set + const char *md5; ///< MD5 hex digest of the whole instrument set const char *waveFileMd5; ///< MD5 hex digest of the wave file (i.e. the sample data used by the instruments) const IIgsMidiProgramMapping *progToInst; ///< Program change to instrument number mapping }; /** Apple IIGS AGI executable file information. */ struct IIgsExeInfo { - enum AgiGameID gameid; ///< Game ID - const char *exePrefix; ///< Prefix of the Apple IIGS AGI executable (e.g. "SQ", "PQ", "KQ4" etc) - uint agiVer; ///< Apple IIGS AGI version number, not strictly needed - uint exeSize; ///< Size of the Apple IIGS AGI executable file in bytes - uint instSetStart; ///< Starting offset of the instrument set inside the executable file - const IIgsInstrumentSetInfo *instSet; ///< Information about the used instrument set + enum AgiGameID gameid; ///< Game ID + const char *exePrefix; ///< Prefix of the Apple IIGS AGI executable (e.g. "SQ", "PQ", "KQ4" etc) + uint agiVer; ///< Apple IIGS AGI version number, not strictly needed + uint exeSize; ///< Size of the Apple IIGS AGI executable file in bytes + uint instSetStart; ///< Starting offset of the instrument set inside the executable file + const IIgsInstrumentSetInfo *instSet; ///< Information about the used instrument set }; class IIgsMidiChannel { @@ -238,12 +238,12 @@ class SoundGen2GS : public SoundGen, public Audio::AudioStream { void setProgramChangeMapping(const IIgsMidiProgramMapping *mapping); // Player methods - void advancePlayer(); ///< Advance the player - void advanceMidiPlayer(); ///< Advance MIDI player - uint generateOutput(); ///< Fill the output buffer + void advancePlayer(); ///< Advance the player + void advanceMidiPlayer(); ///< Advance MIDI player + uint generateOutput(); ///< Fill the output buffer - void haltGenerators(); ///< Halt all generators - uint activeGenerators(); ///< How many generators are active? + void haltGenerators(); ///< Halt all generators + uint activeGenerators(); ///< How many generators are active? void midiNoteOff(int channel, int note, int velocity); void midiNoteOn(int channel, int note, int velocity); @@ -251,21 +251,21 @@ class SoundGen2GS : public SoundGen, public Audio::AudioStream { IIgsInstrumentHeader* getInstrument(uint8 program) { return &_instruments[_progToInst->map(program)]; }; IIgsGenerator* allocateGenerator() { IIgsGenerator* g = &_generators[_nextGen++]; _nextGen %= 16; return g; } - bool _disableMidi; ///< Disable MIDI if loading instruments fail - int _playingSound; ///< Resource number for the currently playing sound - bool _playing; ///< True when the resource is still playing - - IIgsGenerator _generators[MAX_GENERATORS]; ///< IIGS sound generators that are used to play single notes - uint _nextGen; ///< Next generator available for allocation - IIgsMidiChannel _channels[16]; ///< MIDI channels - Common::Array _instruments; ///< Instrument data - const IIgsMidiProgramMapping *_progToInst; ///< MIDI program number to instrument mapping - int8 *_wavetable; ///< Sample data used by the instruments - uint _ticks; ///< MIDI ticks (60Hz) - int16 *_out; ///< Output buffer - uint _outSize; ///< Output buffer size + bool _disableMidi; ///< Disable MIDI if loading instruments fail + int _playingSound; ///< Resource number for the currently playing sound + bool _playing; ///< True when the resource is still playing + + IIgsGenerator _generators[MAX_GENERATORS]; ///< IIGS sound generators that are used to play single notes + uint _nextGen; ///< Next generator available for allocation + IIgsMidiChannel _channels[16]; ///< MIDI channels + Common::Array _instruments; ///< Instrument data + const IIgsMidiProgramMapping *_progToInst; ///< MIDI program number to instrument mapping + int8 *_wavetable; ///< Sample data used by the instruments + uint _ticks; ///< MIDI ticks (60Hz) + int16 *_out; ///< Output buffer + uint _outSize; ///< Output buffer size - static const int kSfxMidiChannel = 15; ///< MIDI channel used for playing sample resources + static const int kSfxMidiChannel = 15; ///< MIDI channel used for playing sample resources }; } // End of namespace Agi From 40394431dc57d0852e4c3ad618538f242f263edc Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Tue, 12 Apr 2011 18:22:24 +0300 Subject: [PATCH 032/369] AGI: Use delete[] instead of delete for arrays --- engines/agi/sound_2gs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 71cc2d418396..f725b273d4b5 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -62,8 +62,8 @@ SoundGen2GS::SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMi SoundGen2GS::~SoundGen2GS() { _mixer->stopHandle(_soundHandle); - delete _wavetable; - delete _out; + delete[] _wavetable; + delete[] _out; } int SoundGen2GS::readBuffer(int16 *buffer, const int numSamples) { From 40b0d468e3112518d5a83d2360c978e72b92f01c Mon Sep 17 00:00:00 2001 From: Jussi Pitkanen Date: Tue, 12 Apr 2011 18:40:43 +0300 Subject: [PATCH 033/369] AGI: More formatting changes... --- engines/agi/sound_2gs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index f725b273d4b5..fd7b9b09318e 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -43,8 +43,8 @@ SoundGen2GS::SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMi // here is to first generate audio for a 1/60th of a second and then // advance the MIDI player by one tick. Thus, make the output buffer // to be a 1/60th of a second in length. - _outSize = _sampleRate/60; - _out = new int16[2*_outSize]; // stereo + _outSize = _sampleRate / 60; + _out = new int16[2 * _outSize]; // stereo // Initialize player variables _nextGen = 0; From 4366f3632c1e89c026d8b28732e561062d168f82 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 12 Apr 2011 14:01:42 -0400 Subject: [PATCH 034/369] COMMON: Cleanup QuickTime's readSTTS() --- common/quicktime.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/common/quicktime.cpp b/common/quicktime.cpp index 176fdef8e7ef..32662d77f23c 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -631,7 +631,7 @@ int QuickTimeParser::readSTSZ(MOVatom atom) { int QuickTimeParser::readSTTS(MOVatom atom) { MOVStreamContext *st = _streams[_numStreams - 1]; - uint32 total_sample_count = 0; + uint32 totalSampleCount = 0; _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags @@ -639,24 +639,18 @@ int QuickTimeParser::readSTTS(MOVatom atom) { st->stts_count = _fd->readUint32BE(); st->stts_data = new MOVstts[st->stts_count]; - debug(0, "track[%i].stts.entries = %i", _numStreams - 1, st->stts_count); + debug(0, "track[%d].stts.entries = %d", _numStreams - 1, st->stts_count); for (int32 i = 0; i < st->stts_count; i++) { - int sample_duration; - int sample_count; + st->stts_data[i].count = _fd->readUint32BE(); + st->stts_data[i].duration = _fd->readUint32BE(); - sample_count = _fd->readUint32BE(); - sample_duration = _fd->readUint32BE(); - st->stts_data[i].count = sample_count; - st->stts_data[i].duration = sample_duration; + debug(1, "\tCount = %d, Duration = %d", st->stts_data[i].count, st->stts_data[i].duration); - debug(0, "sample_count=%d, sample_duration=%d", sample_count, sample_duration); - - total_sample_count += sample_count; + totalSampleCount += st->stts_data[i].count; } - st->nb_frames = total_sample_count; - + st->nb_frames = totalSampleCount; return 0; } From 08b70fa1a737f325a0114632b3cef8cbf028fd3a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 12 Apr 2011 14:23:23 -0400 Subject: [PATCH 035/369] AUDIO: Fix QuickTime/MPEG-4 seeking MPEG-4 seeking was broken while QuickTime seeking was extremely slow. All is fixed now --- audio/decoders/quicktime.cpp | 58 +++++++++++++++++------------------- audio/decoders/quicktime.h | 1 + 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 9b69012c7af2..0888041cfccf 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -226,6 +226,11 @@ uint32 QuickTimeAudioDecoder::getAudioChunkSampleCount(uint chunk) { return sampleCount; } +bool QuickTimeAudioDecoder::isOldDemuxing() const { + assert(_audioStreamIndex >= 0); + return _streams[_audioStreamIndex]->stts_count == 1 && _streams[_audioStreamIndex]->stts_data[0].duration == 1; +} + void QuickTimeAudioDecoder::queueNextAudioChunk() { AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; Common::MemoryWriteStreamDynamic *wStream = new Common::MemoryWriteStreamDynamic(); @@ -236,7 +241,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { uint32 sampleCount = getAudioChunkSampleCount(_curAudioChunk); assert(sampleCount); - if (_streams[_audioStreamIndex]->stts_count == 1 && _streams[_audioStreamIndex]->stts_data[0].duration == 1) { + if (isOldDemuxing()) { // Old-style audio demuxing // Then calculate the right sizes @@ -297,40 +302,32 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); // First, we need to track down what audio sample we need - Audio::Timestamp curAudioTime(0, _streams[_audioStreamIndex]->time_scale); - uint sample = 0; - bool done = false; - for (int32 i = 0; i < _streams[_audioStreamIndex]->stts_count && !done; i++) { - for (int32 j = 0; j < _streams[_audioStreamIndex]->stts_data[i].count; j++) { - curAudioTime = curAudioTime.addFrames(_streams[_audioStreamIndex]->stts_data[i].duration); - - if (curAudioTime > where) { - done = true; - break; - } - - sample++; + Audio::Timestamp curAudioTime = where; + curAudioTime.convertToFramerate(_streams[_audioStreamIndex]->time_scale); + uint32 sample = curAudioTime.totalNumberOfFrames() / entry->channels; + uint32 seekSample = sample; + + if (!isOldDemuxing()) { + // We shouldn't have audio samples that are a different duration + // That would be quite bad! + if (_streams[_audioStreamIndex]->stts_count != 1) { + warning("Failed seeking"); + return; } + + seekSample /= _streams[_audioStreamIndex]->stts_data[0].duration; } // Now to track down what chunk it's in - _curAudioChunk = 0; uint32 totalSamples = 0; + _curAudioChunk = 0; for (uint32 i = 0; i < _streams[_audioStreamIndex]->chunk_count; i++, _curAudioChunk++) { - int sampleToChunkIndex = -1; + uint32 chunkSampleCount = getAudioChunkSampleCount(i); - for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) - if (i >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) - sampleToChunkIndex = j; - - assert(sampleToChunkIndex >= 0); - - totalSamples += _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; - - if (sample < totalSamples) { - totalSamples -= _streams[_audioStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; + if (seekSample < totalSamples + chunkSampleCount) break; - } + + totalSamples += chunkSampleCount; } // Reposition the audio stream @@ -338,10 +335,11 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { if (sample != totalSamples) { // HACK: Skip a certain amount of samples from the stream // (There's got to be a better way to do this!) - int16 *tempBuffer = new int16[sample - totalSamples]; - _audStream->readBuffer(tempBuffer, sample - totalSamples); + int skipSamples = (sample - totalSamples) * ((AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0])->channels; + + int16 *tempBuffer = new int16[skipSamples]; + _audStream->readBuffer(tempBuffer, skipSamples); delete[] tempBuffer; - debug(3, "Skipping %d audio samples", sample - totalSamples); } } diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 2fca5d694421..8a779d45a660 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -90,6 +90,7 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { QueuingAudioStream *_audStream; void setAudioStreamPos(const Timestamp &where); + bool isOldDemuxing() const; }; /** From 499753cbb86eb6d1506a4cca287443a6768fb5a1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 12 Apr 2011 16:23:34 -0400 Subject: [PATCH 036/369] AUDIO: Don't end the AAC stream if we still have buffered samples --- audio/decoders/aac.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp index 75f3a93cf6fd..fd9c4a075c4c 100644 --- a/audio/decoders/aac.cpp +++ b/audio/decoders/aac.cpp @@ -47,7 +47,7 @@ class AACStream : public AudioStream { int readBuffer(int16 *buffer, const int numSamples); - bool endOfData() const { return _inBufferPos >= _inBufferSize; } + bool endOfData() const { return _inBufferPos >= _inBufferSize && !_remainingSamples; } bool isStereo() const { return _channels == 2; } int getRate() const { return _rate; } From f54769f9878f32564498bc7c47dfa8db498f52ca Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 13 Apr 2011 22:19:21 +0930 Subject: [PATCH 037/369] GROOVIE: Use provided OCReMix song for T7G iOS credits --- engines/groovie/music.cpp | 20 ++++++++++++++++++++ engines/groovie/music.h | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 3bbac2a570c0..79b7fe130055 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -33,6 +33,7 @@ #include "common/memstream.h" #include "audio/audiostream.h" #include "audio/midiparser.h" +#include "audio/decoders/mp3.h" #include "audio/decoders/quicktime.h" namespace Groovie { @@ -94,6 +95,7 @@ void MusicPlayer::playCD(uint8 track) { } else if ((track == 98) && (_prevCDtrack == 3)) { // Track 98 is used as a hack to stop the credits song g_system->getAudioCDManager()->stop(); + stopCreditsIOS(); return; } @@ -126,6 +128,8 @@ void MusicPlayer::playCD(uint8 track) { playSong((19 << 10) | 36); // XMI.GJD, file 36 } else if (track == 3) { // TODO: Credits MIDI fallback + if (_vm->getPlatform() == Common::kPlatformIOS) + playCreditsIOS(); } } } @@ -226,6 +230,22 @@ void MusicPlayer::unload() { _isPlaying = false; } +void MusicPlayer::playCreditsIOS() { +#ifdef USE_MAD + Common::File *f = new Common::File(); + f->open("7th_Guest_Dolls_from_Hell_OC_ReMix.mp3"); + Audio::AudioStream *stream = Audio::makeMP3Stream(f, DisposeAfterUse::YES); + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_handleCreditsIOS, stream); +#else + warning("MAD library required for credits music"); +#endif +} + +void MusicPlayer::stopCreditsIOS() { +#ifdef USE_MAD + _vm->_system->getMixer()->stopHandle(_handleCreditsIOS); +#endif +} // MusicPlayerMidi diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 8f8aabb0db9c..2b91cb11eb52 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -63,6 +63,11 @@ class MusicPlayer { uint16 _backgroundDelay; + // T7G iOS credits mp3 stream + void playCreditsIOS(); + void stopCreditsIOS(); + Audio::SoundHandle _handleCreditsIOS; + // Volume fading uint32 _fadingStartTime; uint16 _fadingStartVolume; From 47c2a9adbe8d9e6640a819386f0f34e929937672 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 13 Apr 2011 22:22:19 +0930 Subject: [PATCH 038/369] GROOVIE: MPEG4 player should override unload so scripts can stop music --- engines/groovie/music.cpp | 10 ++++++---- engines/groovie/music.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 79b7fe130055..7195198a6c5b 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -777,11 +777,14 @@ void MusicPlayerMPEG4::updateVolume() { _vm->_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, _userVolume * _gameVolume / 100); } -bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { - // Stop any old sound +void MusicPlayerMPEG4::unload() { + MusicPlayer::unload(); + _vm->_system->getMixer()->stopHandle(_handle); +} - // Find the filename +bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { + // Find correct filename ResInfo info; _vm->_resMan->getResInfo(fileref, info); uint len = info.filename.size(); @@ -804,7 +807,6 @@ bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { Audio::AudioStream *audStream = Audio::makeQuickTimeStream(info.filename); if (!audStream) { - // MPEG-4 sounds aren't handled yet, so nothing should play here yet warning("Could not play MPEG-4 sound '%s'", info.filename.c_str()); return false; } diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 2b91cb11eb52..cdf67cab44af 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -173,6 +173,7 @@ class MusicPlayerMPEG4 : public MusicPlayer { protected: void updateVolume(); bool load(uint32 fileref, bool loop); + void unload(); private: Audio::SoundHandle _handle; From 76105b29b7f885ed873f6af7321d8e48a5b0a41e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 14 Apr 2011 10:25:02 -0400 Subject: [PATCH 039/369] AUDIO: Split the QuickTimeAudioDecoder into a new header file (Mirroring the new adpcm_intern.h file) --- audio/decoders/quicktime.cpp | 1 + audio/decoders/quicktime.h | 49 +--------------- audio/decoders/quicktime_intern.h | 96 +++++++++++++++++++++++++++++++ video/qt_decoder.h | 2 +- 4 files changed, 99 insertions(+), 49 deletions(-) create mode 100644 audio/decoders/quicktime_intern.h diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index d4cd3a62f286..5115a20218ea 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -30,6 +30,7 @@ #include "audio/audiostream.h" #include "audio/decoders/quicktime.h" +#include "audio/decoders/quicktime_intern.h" // Codecs #include "audio/decoders/aac.h" diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 8a779d45a660..ff81ec93902a 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -34,7 +34,6 @@ #ifndef AUDIO_QUICKTIME_H #define AUDIO_QUICKTIME_H -#include "common/quicktime.h" #include "common/scummsys.h" #include "common/types.h" @@ -45,53 +44,7 @@ namespace Common { namespace Audio { -class AudioStream; -class RewindableAudioStream; -class QueuingAudioStream; - -class QuickTimeAudioDecoder : public Common::QuickTimeParser { -public: - QuickTimeAudioDecoder(); - virtual ~QuickTimeAudioDecoder(); - - /** - * Load a QuickTime audio file - * @param filename the filename to load - */ - bool loadAudioFile(const Common::String &filename); - - /** - * Load a QuickTime audio file from a SeekableReadStream - * @param stream the stream to load - */ - bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle); - -protected: - struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { - AudioSampleDesc(); - - uint16 channels; - uint32 sampleRate; - uint32 samplesPerFrame; - uint32 bytesPerFrame; - }; - - // Common::QuickTimeParser API - virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); - - AudioStream *createAudioStream(Common::SeekableReadStream *stream); - bool checkAudioCodecSupport(uint32 tag, byte objectTypeMP4); - void init(); - - void queueNextAudioChunk(); - uint32 getAudioChunkSampleCount(uint chunk); - int8 _audioStreamIndex; - uint _curAudioChunk; - QueuingAudioStream *_audStream; - - void setAudioStreamPos(const Timestamp &where); - bool isOldDemuxing() const; -}; +class SeekableAudioStream; /** * Try to load a QuickTime sound file from the given file name and create a SeekableAudioStream diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h new file mode 100644 index 000000000000..691ef7b58c2b --- /dev/null +++ b/audio/decoders/quicktime_intern.h @@ -0,0 +1,96 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/** + * Internal interface to the QuickTime audio decoder. + * + * This is available so that the QuickTimeVideoDecoder can use + * this directly. + */ + +#ifndef AUDIO_QUICKTIME_INTERN_H +#define AUDIO_QUICKTIME_INTERN_H + +#include "common/quicktime.h" +#include "common/scummsys.h" +#include "common/types.h" + +namespace Common { + class SeekableReadStream; + class String; +} + +namespace Audio { + +class AudioStream; +class QueuingAudioStream; + +class QuickTimeAudioDecoder : public Common::QuickTimeParser { +public: + QuickTimeAudioDecoder(); + virtual ~QuickTimeAudioDecoder(); + + /** + * Load a QuickTime audio file + * @param filename the filename to load + */ + bool loadAudioFile(const Common::String &filename); + + /** + * Load a QuickTime audio file from a SeekableReadStream + * @param stream the stream to load + */ + bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle); + +protected: + struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { + AudioSampleDesc(); + + uint16 channels; + uint32 sampleRate; + uint32 samplesPerFrame; + uint32 bytesPerFrame; + }; + + // Common::QuickTimeParser API + virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); + + AudioStream *createAudioStream(Common::SeekableReadStream *stream); + bool checkAudioCodecSupport(uint32 tag, byte objectTypeMP4); + void init(); + + void queueNextAudioChunk(); + uint32 getAudioChunkSampleCount(uint chunk); + int8 _audioStreamIndex; + uint _curAudioChunk; + QueuingAudioStream *_audStream; + + void setAudioStreamPos(const Timestamp &where); + bool isOldDemuxing() const; +}; + +} // End of namespace Audio + +#endif diff --git a/video/qt_decoder.h b/video/qt_decoder.h index b9c4b9b41da8..7167c8b9a2aa 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -41,7 +41,7 @@ #include "audio/audiostream.h" #include "audio/mixer.h" -#include "audio/decoders/quicktime.h" +#include "audio/decoders/quicktime_intern.h" namespace Common { class MacResManager; From 3f124ae6bb77865a24dd84110a2d8008741b1d73 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 14 Apr 2011 10:31:20 -0400 Subject: [PATCH 040/369] VIDEO: Fix QuickTime videos without a video stream Just in case anyone uses just that instead of Audio::makeQuickTimeStream()... --- video/qt_decoder.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 8ff7c8a7a4ab..1ed99a701ac7 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -563,7 +563,10 @@ void QuickTimeDecoder::updateAudioBuffer() { uint32 numberOfChunksNeeded = 0; - if (_curFrame == (int32)_streams[_videoStreamIndex]->nb_frames - 1) { + if (_videoStreamIndex < 0 || _curFrame == (int32)_streams[_videoStreamIndex]->nb_frames - 1) { + // If we have no video, there's nothing to base our buffer against + // However, one must ask why a QuickTimeDecoder is being used instead of the nice makeQuickTimeStream() function + // If we're on the last frame, make sure all audio remaining is buffered numberOfChunksNeeded = _streams[_audioStreamIndex]->chunk_count; } else { From 2cc7b80b34d4e8fe9108a785dd940b1cd22910c4 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 20 Apr 2011 22:22:13 +0930 Subject: [PATCH 041/369] GROOVIE: Set some T7G iOS m4a files to loop based on DOS XMI looping --- engines/groovie/music.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 24306c8bfd24..03e17d567fe6 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -790,6 +790,34 @@ bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { uint len = info.filename.size(); if (len < 4) return false; // This shouldn't actually occur + /* + 19462 door + 19463 ?? + 19464 ?? + 19465 puzzle? + 19466 cake + 19467 maze + 19468 ambient (but not 69, amb b. odd) + 19470 puzzle + 19471 + 19473 + 19475 coffins or blood pump + 19476 blood pump or coffins + 19493 + 19499 chapel + 19509 downstair ambient + 19510 bedroom 'skip 3 and 5' puzzle (should loop from partway?) + 19514 + 19515 bathroom drain teeth + */ + if ((fileref >= 19462 && fileref <= 19468) || + fileref == 19470 || fileref == 19471 || + fileref == 19473 || fileref == 19475 || + fileref == 19476 || fileref == 19493 || + fileref == 19499 || fileref == 19509 || + fileref == 19510 || fileref == 19514 || + fileref == 19515) + loop = true; // XMIs for these refs self-loop // iOS port provides alternative intro sequence music if (info.filename == "gu39.xmi") { From daede376e1a7878e8b5b87350c2296c324b6d3bc Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 20 Apr 2011 22:58:19 +0930 Subject: [PATCH 042/369] GROOVIE: Tweak supernatural teeth detection (for VDX playback speed) --- engines/groovie/script.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 782391dd7879..e68003f72eea 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -580,14 +580,15 @@ bool Script::playvideofromref(uint32 fileref) { if (_videoFile) { _videoRef = fileref; - if (_lastCursor == 7) + // If teeth cursor, and in main script, mark video prefer low-speed + // filename check as sometimes teeth used for puzzle movements (bishops) + if (_version == kGroovieT7G && _lastCursor == 7 && _scriptFile == "script.grv") _bitflags |= (1 << 15); _vm->_videoPlayer->load(_videoFile, _bitflags); } else { error("Couldn't open file"); return true; } - _lastCursor = 0xff; _bitflags = 0; From accb0c2a5d0c9e7b353cda4b74f511a498ed8073 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 20 Apr 2011 23:33:55 +0930 Subject: [PATCH 043/369] GROOVIE: Add timer for MusicPlayerMPEG4 (required for music fade in/out) --- engines/groovie/music.cpp | 5 +++++ engines/groovie/music.h | 1 + 2 files changed, 6 insertions(+) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 03e17d567fe6..b6ef5d277ce5 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -770,6 +770,11 @@ Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadS } MusicPlayerMPEG4::MusicPlayerMPEG4(GroovieEngine *vm) : MusicPlayer(vm) { + vm->getTimerManager()->installTimerProc(&onTimer, 50 * 1000, this); +} + +MusicPlayerMPEG4::~MusicPlayerMPEG4() { + _vm->getTimerManager()->removeTimerProc(&onTimer); } void MusicPlayerMPEG4::updateVolume() { diff --git a/engines/groovie/music.h b/engines/groovie/music.h index cdf67cab44af..107e52a67c3f 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -169,6 +169,7 @@ class MusicPlayerMac : public MusicPlayerMidi { class MusicPlayerMPEG4 : public MusicPlayer { public: MusicPlayerMPEG4(GroovieEngine *vm); + ~MusicPlayerMPEG4(); protected: void updateVolume(); From 40df14a7558728019e9755bce57ddd7fd0ab877e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 May 2011 14:43:36 +0300 Subject: [PATCH 044/369] RELEASE: Tag branch-1-3-0 and set version --- backends/platform/psp/README.PSP | 2 +- base/internal_version.h | 2 +- dists/android/AndroidManifest.xml | 2 +- dists/android/plugin-manifest.xml | 2 +- dists/iphone/Info.plist | 4 ++-- dists/irix/scummvm.spec | 2 +- dists/macosx/Info.plist | 6 +++--- dists/redhat/scummvm-tools.spec | 2 +- dists/redhat/scummvm.spec | 2 +- dists/scummvm.rc | 4 ++-- dists/slackware/scummvm.SlackBuild | 2 +- dists/wii/meta.xml | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backends/platform/psp/README.PSP b/backends/platform/psp/README.PSP index b520022033fe..1146f2d3f3fd 100644 --- a/backends/platform/psp/README.PSP +++ b/backends/platform/psp/README.PSP @@ -1,4 +1,4 @@ -ScummVM-PSP 1.3.0git README +ScummVM-PSP 1.3.0pre README ============================================================================== Installation diff --git a/base/internal_version.h b/base/internal_version.h index 36cdcdeb395d..f7b42529cba1 100644 --- a/base/internal_version.h +++ b/base/internal_version.h @@ -16,4 +16,4 @@ #define SCUMMVM_REVISION #endif -#define SCUMMVM_VERSION "1.3.0git" SCUMMVM_REVISION +#define SCUMMVM_VERSION "1.3.0pre" SCUMMVM_REVISION diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml index cae1f369e70a..2fece7a4e9af 100644 --- a/dists/android/AndroidManifest.xml +++ b/dists/android/AndroidManifest.xml @@ -4,7 +4,7 @@ BUG! Infinite loop + 0 }; const uint16 qfg3PatchDialogCrash[] = { From bc7ff278281f46a77ba955d6f5fa20dab611bd90 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 13 May 2011 02:22:11 -0400 Subject: [PATCH 087/369] AUDIO: Fix QuickTime stereo audio seeking --- audio/decoders/quicktime.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index e80c2b592c3e..bdde9db8831f 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -305,7 +305,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { // First, we need to track down what audio sample we need Audio::Timestamp curAudioTime = where.convertToFramerate(_streams[_audioStreamIndex]->time_scale); - uint32 sample = curAudioTime.totalNumberOfFrames() / entry->channels; + uint32 sample = curAudioTime.totalNumberOfFrames(); uint32 seekSample = sample; if (!isOldDemuxing()) { @@ -316,6 +316,8 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { return; } + // Note that duration is in terms of *one* channel + // This eases calculation a bit seekSample /= _streams[_audioStreamIndex]->stts_data[0].duration; } @@ -336,7 +338,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { if (sample != totalSamples) { // HACK: Skip a certain amount of samples from the stream // (There's got to be a better way to do this!) - int skipSamples = (sample - totalSamples) * ((AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0])->channels; + int skipSamples = (sample - totalSamples) * entry->channels; int16 *tempBuffer = new int16[skipSamples]; _audStream->readBuffer(tempBuffer, skipSamples); From be5d448dde04a04e8f2b3c199388394f8be7f08b Mon Sep 17 00:00:00 2001 From: md5 Date: Thu, 12 May 2011 12:52:12 +0300 Subject: [PATCH 088/369] SCI: Fixed bugs #3299458 and #3295849 --- engines/sci/engine/gc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index e395eeab9476..68b80544793c 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -90,7 +90,8 @@ static void processWorkList(SegManager *segMan, WorklistManager &wm, const Commo wm._worklist.pop_back(); if (reg.segment != stackSegment) { // No need to repeat this one debugC(kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); - if (reg.segment < heap.size() && heap[reg.segment]) { + // We only check for valid offsets here. Fixes bugs #3299458 and #3295849. + if (reg.segment < heap.size() && heap[reg.segment] && heap[reg.segment]->isValidOffset(reg.offset)) { // Valid heap object? Find its outgoing references! wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg)); } From d352c5969a2cb51fb9c786a5570727b2f6764d6b Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 13 May 2011 00:15:41 +0300 Subject: [PATCH 089/369] SCI: Marked the sanity check inside processWorkList() as a workaround The sanity check added in rev #35086fe17c fixes the crashes with that code when an invalid reference is about to be processed, but these references shouldn't be in the stack at all in the first place, so the root cause seems to be somewhere else. --- engines/sci/engine/gc.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 68b80544793c..b1d461c5614f 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -90,7 +90,13 @@ static void processWorkList(SegManager *segMan, WorklistManager &wm, const Commo wm._worklist.pop_back(); if (reg.segment != stackSegment) { // No need to repeat this one debugC(kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); - // We only check for valid offsets here. Fixes bugs #3299458 and #3295849. + // WORKAROUND: We only check for valid offsets here. Fixes bugs + // #3299458 and #3295849. + // FIXME: Where are these invalid offsets coming from? The check + // below avoids a crash when examining invalid references, but the + // root of the problem lies elsewhere. These shouldn't be in the + // stack at all (unless these really are script bugs, in which case + // we should just keep the sanity check). if (reg.segment < heap.size() && heap[reg.segment] && heap[reg.segment]->isValidOffset(reg.offset)) { // Valid heap object? Find its outgoing references! wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg)); From 40b63320e5898f4634a794ea35005b77591ca420 Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 13 May 2011 00:10:44 +0300 Subject: [PATCH 090/369] SCI: Added workarounds for bug #3292251, instead of patching the script This fixes bug #3295853 --- engines/sci/engine/script_patches.cpp | 41 --------------------------- engines/sci/engine/workarounds.cpp | 4 ++- 2 files changed, 3 insertions(+), 42 deletions(-) diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 82e8130a40f7..2e4eb552f2af 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -875,50 +875,9 @@ const uint16 qfg3PatchDialogCrash[] = { PATCH_END }; -// Part of script 47 that handles the barter icon checks for the wrong local. -// The local is supposed to contain the value returned by a previous kDisplay -// call, but since the wrong one is checked, it contains junk instead. We -// remove that check here (this doesn't affect the game at all). This occurs -// when attempting to purchase something from a vendor and the barter button is -// available (e.g. when buying the robe or meat from the associated vendors). -// Fixes bug #3292251. -const byte qfg3BarterCrash[] = { - 22, - 0x83, 0x10, // lal 10 ---> BUG! Wrong local - 0x30, 0x11, 0x00, // bnt 0011 ---> the accumulator will now contain garbage, so this check fails - 0x35, 0x00, // ldi 00 - 0xa5, 0x00, // sat 00 - 0x39, 0x03, // pushi 03 - 0x5b, 0x04, 0x00, // lea 04 00 - 0x36, // push - 0x39, 0x6c, // pushi 6c - 0x8b, 0x10, // lsl 10 ---> local 10 contains garbage, so the call below will fail - 0x43, 0x1b, 0x06 // callk Display[1b] 06 -}; - -// Same as above, but for local 0x11 -const byte qfg3BarterCrash2[] = { - 18, - 0x83, 0x11, // lal 11 ---> BUG! Wrong local - 0x30, 0x0d, 0x00, // bnt 000d ---> the accumulator will now contain garbage, so this check fails - 0x39, 0x03, // pushi 03 - 0x5b, 0x04, 0x00, // lea 04 00 - 0x36, // push - 0x39, 0x6c, // pushi 6c - 0x8b, 0x11, // lsl 11 ---> local 11 contains garbage, so the call below will fail - 0x43, 0x1b, 0x06 // callk Display[1b] 06 -}; - -const uint16 qfg3PatchBarterCrash[] = { - 0x35, 0x00, // ldi 00 ---> the accumulator will always be zero, so the problematic code won't run - PATCH_END -}; - // script, description, magic DWORD, adjust const SciScriptSignature qfg3Signatures[] = { { 23, "dialog crash", 1, PATCH_MAGICDWORD(0xe7, 0x03, 0x22, 0x33), -1, qfg3DialogCrash, qfg3PatchDialogCrash }, - { 47, "barter crash", 1, PATCH_MAGICDWORD(0x83, 0x10, 0x30, 0x11), 0, qfg3BarterCrash, qfg3PatchBarterCrash }, - { 47, "barter crash 2", 1, PATCH_MAGICDWORD(0x83, 0x11, 0x30, 0x0d), 0, qfg3BarterCrash2, qfg3PatchBarterCrash }, { 944, "import dialog continuous calls", 1, PATCH_MAGICDWORD(0x2a, 0x31, 0x0b, 0x7a), -1, qfg3SignatureImportDialog, qfg3PatchImportDialog }, SCI_SIGNATUREENTRY_TERMINATOR }; diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 20d6cd0dd0ce..e8eb78f292ae 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -213,6 +213,8 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4c1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id (another pq2 version, bug #3043904) { GID_QFG1, 11, 11, 0, "battle", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When entering battle, 0x75 as id + { GID_QFG3, -1, 47, 0, "barterWin", "open", 0x1426, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251 + { GID_QFG3, -1, 47, 0, "barterIcon", "show", 0x135c, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251 { GID_SQ1, -1, 700, 0, "arcadaRegion", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restoring in some rooms of the arcada (right at the start) { GID_SQ4, 397, 0, 0, "", "export 12", -1, 0, { WORKAROUND_IGNORE, 0 } }, // FLOPPY: when going into the computer store (bug #3044044) { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // CD: clicking on catalog in roboter sale - a parameter is an object @@ -230,7 +232,7 @@ const SciWorkaroundEntry kDirLoop_workarounds[] = { const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907 { GID_QFG1, -1, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object - { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object + { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with Vohaul, parameter 0 is an object { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; From cb8460e92669da540eb54b80c249a7ba1f7df45a Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 13 May 2011 16:12:52 +0300 Subject: [PATCH 091/369] SCI: Don't include several debug tables when REDUCE_MEMORY_USAGE is defined --- engines/sci/engine/scriptdebug.cpp | 7 +++++++ engines/sci/engine/vm.cpp | 2 ++ engines/sci/sound/drivers/gm_names.h | 7 +++++++ engines/sci/sound/drivers/midi.cpp | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 596494d61b83..8182a0096c1c 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -34,6 +34,10 @@ namespace Sci { +// This table is only used for debugging. Don't include it for devices +// with not enough available memory (e.g. phones), where REDUCE_MEMORY_USAGE +// is defined +#ifndef REDUCE_MEMORY_USAGE const char *opcodeNames[] = { "bnot", "add", "sub", "mul", "div", "mod", "shr", "shl", "xor", "and", @@ -62,6 +66,7 @@ const char *opcodeNames[] = { "-agi", "-ali", "-ati", "-api", "-sgi", "-sli", "-sti", "-spi" }; +#endif // REDUCE_MEMORY_USAGE // Disassembles one command from the heap, returns address of next command or 0 if a ret was encountered. reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode) { @@ -113,7 +118,9 @@ reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode if (printBWTag) debugN("[%c] ", opsize ? 'B' : 'W'); +#ifndef REDUCE_MEMORY_USAGE debugN("%s", opcodeNames[opcode]); +#endif i = 0; while (g_opcode_formats[opcode][i]) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b44181501479..e678887e69b6 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -117,7 +117,9 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in return true; } +#ifndef REDUCE_MEMORY_USAGE extern const char *opcodeNames[]; // from scriptdebug.cpp +#endif static reg_t read_var(EngineState *s, int type, int index) { if (validate_variable(s->variables[type], s->stack_base, type, s->variablesMax[type], index)) { diff --git a/engines/sci/sound/drivers/gm_names.h b/engines/sci/sound/drivers/gm_names.h index b7883494f6e4..d9e782d70b98 100644 --- a/engines/sci/sound/drivers/gm_names.h +++ b/engines/sci/sound/drivers/gm_names.h @@ -28,6 +28,11 @@ namespace Sci { +// These tables are only used for debugging. Don't include them for devices +// with not enough available memory (e.g. phones), where REDUCE_MEMORY_USAGE +// is defined +#ifndef REDUCE_MEMORY_USAGE + static const char *GmInstrumentNames[] = { /*000*/ "Acoustic Grand Piano", /*001*/ "Bright Acoustic Piano", @@ -215,6 +220,8 @@ static const char *GmPercussionNames[] = { /*81*/ "Open Triangle" }; +#endif // REDUCE_MEMORY_USAGE + } // End of namespace Sci #endif // SCI_SOUND_DRIVERS_GM_NAMES_H diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index f36aac3a2a02..e1bc23cec905 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -819,11 +819,13 @@ void MidiPlayer_Midi::mapMt32ToGm(byte *data, size_t size) { if (_patchMap[i] == MIDI_UNMAPPED) { debugC(kDebugLevelSound, "[Unmapped]"); } else { +#ifndef REDUCE_MEMORY_USAGE if (_patchMap[i] >= 128) { debugC(kDebugLevelSound, "%s [Rhythm]", GmPercussionNames[_patchMap[i] - 128]); } else { debugC(kDebugLevelSound, "%s", GmInstrumentNames[_patchMap[i]]); } +#endif } _keyShift[i] = CLIP(keyshift, 0, 48) - 24; @@ -855,10 +857,12 @@ void MidiPlayer_Midi::mapMt32ToGm(byte *data, size_t size) { } } +#ifndef REDUCE_MEMORY_USAGE if (_percussionMap[ins] == MIDI_UNMAPPED) debugC(kDebugLevelSound, "[Unmapped]"); else debugC(kDebugLevelSound, "%s", GmPercussionNames[_percussionMap[ins]]); +#endif _percussionVelocityScale[ins] = *(data + pos + 4 * i + 3) * 127 / 100; } From 7b2792328153024ef8ffd23050393ddb3098f6b0 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 13 May 2011 23:01:02 +0200 Subject: [PATCH 092/369] SCI: Avoid incrementing lockers of deleted script Having a deleted script with non-zero lockers had the side effect of making the deleted script re-appear in the GC's work list, including any (deleted) objects in the script. This should be the root cause of bugs #3299458 and #3295849, so also delete the workaround added for that in be5d448d. (cherry picked from commit c01fed7159c313680e55458efb6529d332ebc8b0) --- engines/sci/engine/gc.cpp | 9 +-------- engines/sci/engine/kscripts.cpp | 2 +- engines/sci/engine/script.cpp | 2 ++ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index b1d461c5614f..e395eeab9476 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -90,14 +90,7 @@ static void processWorkList(SegManager *segMan, WorklistManager &wm, const Commo wm._worklist.pop_back(); if (reg.segment != stackSegment) { // No need to repeat this one debugC(kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); - // WORKAROUND: We only check for valid offsets here. Fixes bugs - // #3299458 and #3295849. - // FIXME: Where are these invalid offsets coming from? The check - // below avoids a crash when examining invalid references, but the - // root of the problem lies elsewhere. These shouldn't be in the - // stack at all (unless these really are script bugs, in which case - // we should just keep the sanity check). - if (reg.segment < heap.size() && heap[reg.segment] && heap[reg.segment]->isValidOffset(reg.offset)) { + if (reg.segment < heap.size() && heap[reg.segment]) { // Valid heap object? Find its outgoing references! wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg)); } diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index b9baa3540ae8..605998c8747e 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -262,7 +262,7 @@ reg_t kDisposeScript(EngineState *s, int argc, reg_t *argv) { SegmentId id = s->_segMan->getScriptSegment(script); Script *scr = s->_segMan->getScriptIfLoaded(id); - if (scr) { + if (scr && !scr->isMarkedAsDeleted()) { if (s->_executionStack.back().addr.pc.segment != id) scr->setLockers(1); } diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 25bf91c3ad15..0592940559b8 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -383,6 +383,7 @@ void Script::relocateSci3(reg_t block) { } void Script::incrementLockers() { + assert(!_markedAsDeleted); _lockers++; } @@ -396,6 +397,7 @@ int Script::getLockers() const { } void Script::setLockers(int lockers) { + assert(lockers == 0 || !_markedAsDeleted); _lockers = lockers; } From 47e7850b91a12a69ff4a65e9f0cf899d6f280049 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 13 May 2011 23:23:15 +0200 Subject: [PATCH 093/369] SCI: Fix crash in vo with unloaded superclass (cherry picked from commit 5fc5265b0d777744e8ff65305ddf0cf2da043204) --- engines/sci/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 60bd129efc96..7f0b641d8330 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3775,7 +3775,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" -- member variables:\n"); for (i = 0; (uint)i < obj->getVarCount(); i++) { DebugPrintf(" "); - if (i < var_container->getVarCount()) { + if (var_container && i < var_container->getVarCount()) { uint16 varSelector = var_container->getVarSelector(i); DebugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str()); } else From e7a006f21865dcb15b05b3fc27903dd03a1dd8b2 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 14 May 2011 00:48:57 +0200 Subject: [PATCH 094/369] SCI: Hardcode parser output in one case in QfG2 to fix #3288328 This is a stopgap measure to make this work in the release. --- engines/sci/parser/grammar.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/engines/sci/parser/grammar.cpp b/engines/sci/parser/grammar.cpp index b330a432e3a3..8d99100fa73a 100644 --- a/engines/sci/parser/grammar.cpp +++ b/engines/sci/parser/grammar.cpp @@ -603,6 +603,28 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) { results = work; + if (g_sci->getGameId() == GID_QFG2 && words.size() == 3 && results->next) { + // WORKAROUND: + // This is a serious hack to temporarily fix bug #3288328. + // The groups below spell out "buy healing pills" in QfG2. + // It results in four valid expansions, but only the second one + // matches the said spec in the apothecary script, so we force + // that one. + + bool ok = true; + words_iter = words.begin(); + if (words_iter->size() != 1 || words_iter->begin()->_group != 0x3f4) + ok = false; + words_iter++; + if (words_iter->size() != 2 || words_iter->begin()->_group != 0xa88) + ok = false; + words_iter++; + if (words_iter->size() != 1 || words_iter->begin()->_group != 0xad3) + ok = false; + if (ok) + results = results->next; + } + if (verbose) { con->DebugPrintf("All results (excluding the surrounding '(141 %03x' and ')'):\n", _parserBranches[0].id); results->print(); From ea1ef4386a4c76b9910d72aaacd035240005ee46 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Wed, 4 May 2011 14:35:25 +0100 Subject: [PATCH 095/369] CONFIGURE: Add missing SDL_BACKEND define for the OpenPandora backend. * Not really sure when/how it got lost but as it's lack spectacularly breaks the backend it is a really good idea to put it back ;) Thanks to Max for the heads up. (cherry picked from commit bd60a289c7748ad6a03299e4fc9d161f31495b43) --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index fa2f962e793b..624d49fccbea 100755 --- a/configure +++ b/configure @@ -3110,6 +3110,7 @@ case $_backend in INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" LDFLAGS="$LDFLAGS" + DEFINES="$DEFINES -DSDL_BACKEND" ;; ps2) # TODO ps2 From 8fb0d27f957893d3b399ff954b4d4be93b060e3e Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 14 May 2011 18:04:10 +0200 Subject: [PATCH 096/369] SCI: Replace QfG2 parser hack with simpler variant This replaces the workaround for bug #3288328 from e7a006f2 with a bug-specific case of the more general patch committed to master in eb46c72b. --- engines/sci/parser/grammar.cpp | 22 ---------------------- engines/sci/parser/vocabulary.cpp | 6 ++++++ 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/engines/sci/parser/grammar.cpp b/engines/sci/parser/grammar.cpp index 8d99100fa73a..b330a432e3a3 100644 --- a/engines/sci/parser/grammar.cpp +++ b/engines/sci/parser/grammar.cpp @@ -603,28 +603,6 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) { results = work; - if (g_sci->getGameId() == GID_QFG2 && words.size() == 3 && results->next) { - // WORKAROUND: - // This is a serious hack to temporarily fix bug #3288328. - // The groups below spell out "buy healing pills" in QfG2. - // It results in four valid expansions, but only the second one - // matches the said spec in the apothecary script, so we force - // that one. - - bool ok = true; - words_iter = words.begin(); - if (words_iter->size() != 1 || words_iter->begin()->_group != 0x3f4) - ok = false; - words_iter++; - if (words_iter->size() != 2 || words_iter->begin()->_group != 0xa88) - ok = false; - words_iter++; - if (words_iter->size() != 1 || words_iter->begin()->_group != 0xad3) - ok = false; - if (ok) - results = results->next; - } - if (verbose) { con->DebugPrintf("All results (excluding the surrounding '(141 %03x' and ')'):\n", _parserBranches[0].id); results->print(); diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 25043401cccb..11d214b28d24 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -398,6 +398,12 @@ void Vocabulary::lookupWord(ResultWordList& retval, const char *word, int word_l if (getSciVersion() < SCI_VERSION_01) return; + // WORKAROUND: + // This is a hack to temporarily fix bug #3288328. + // On the master branch this return is unconditional. + if (g_sci->getGameId() == GID_QFG2 && strcmp(word, "healing") == 0) + return; + } // Now try all suffixes From b23dfd72f123c7d98c5076d813e522834888588a Mon Sep 17 00:00:00 2001 From: Oystein Eftevaag Date: Sat, 14 May 2011 23:01:08 -0400 Subject: [PATCH 097/369] IPHONE: Changed the iOS queued event handling to fix mouseclicks in Gob We now delay the mouseup events for 50ms, rather than just delaying them for an additional couple of pollEvent (which doesn't work anymore due to changes in the eventhandling code elsewhere). This fixes #3018512. --- backends/platform/iphone/osys_events.cpp | 22 ++++++++-------------- backends/platform/iphone/osys_main.cpp | 6 +++--- backends/platform/iphone/osys_main.h | 2 +- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/backends/platform/iphone/osys_events.cpp b/backends/platform/iphone/osys_events.cpp index c30e34dd0589..965334873e63 100644 --- a/backends/platform/iphone/osys_events.cpp +++ b/backends/platform/iphone/osys_events.cpp @@ -31,6 +31,7 @@ #include "osys_main.h" +static const int kQueuedInputEventDelay = 50; bool OSystem_IPHONE::pollEvent(Common::Event &event) { //printf("pollEvent()\n"); @@ -42,14 +43,7 @@ bool OSystem_IPHONE::pollEvent(Common::Event &event) { _timerCallbackNext = curTime + _timerCallbackTimer; } - if (_needEventRestPeriod) { - // Workaround: Some engines can't handle mouse-down and mouse-up events - // appearing right after each other, without a call returning no input in between. - _needEventRestPeriod = false; - return false; - } - - if (_queuedInputEvent.type != (Common::EventType)0) { + if (_queuedInputEvent.type != (Common::EventType)0 && curTime >= _queuedEventTime) { event = _queuedInputEvent; _queuedInputEvent.type = (Common::EventType)0; return true; @@ -194,7 +188,7 @@ bool OSystem_IPHONE::handleEvent_mouseUp(Common::Event &event, int x, int y) { _queuedInputEvent.mouse.x = _mouseX; _queuedInputEvent.mouse.y = _mouseY; _lastMouseTap = getMillis(); - _needEventRestPeriod = true; + _queuedEventTime = _lastMouseTap + kQueuedInputEventDelay; } else return false; } @@ -235,7 +229,7 @@ bool OSystem_IPHONE::handleEvent_secondMouseUp(Common::Event &event, int x, int event.kbd.flags = _queuedInputEvent.kbd.flags = 0; event.kbd.keycode = _queuedInputEvent.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = _queuedInputEvent.kbd.ascii = Common::ASCII_ESCAPE; - _needEventRestPeriod = true; + _queuedEventTime = curTime + kQueuedInputEventDelay; _lastSecondaryTap = 0; } else if (!_mouseClickAndDragEnabled) { //printf("Rightclick!\n"); @@ -246,7 +240,7 @@ bool OSystem_IPHONE::handleEvent_secondMouseUp(Common::Event &event, int x, int _queuedInputEvent.mouse.x = _mouseX; _queuedInputEvent.mouse.y = _mouseY; _lastSecondaryTap = curTime; - _needEventRestPeriod = true; + _queuedEventTime = curTime + kQueuedInputEventDelay; } else { //printf("Right nothing!\n"); return false; @@ -334,7 +328,7 @@ bool OSystem_IPHONE::handleEvent_mouseSecondDragged(Common::Event &event, int x, event.kbd.flags = _queuedInputEvent.kbd.flags = 0; event.kbd.keycode = _queuedInputEvent.kbd.keycode = Common::KEYCODE_F5; event.kbd.ascii = _queuedInputEvent.kbd.ascii = Common::ASCII_F5; - _needEventRestPeriod = true; + _queuedEventTime = getMillis() + kQueuedInputEventDelay; return true; } @@ -463,7 +457,7 @@ void OSystem_IPHONE::handleEvent_keyPressed(Common::Event &event, int keyPresse event.kbd.flags = _queuedInputEvent.kbd.flags = 0; event.kbd.keycode = _queuedInputEvent.kbd.keycode = (Common::KeyCode)keyPressed; event.kbd.ascii = _queuedInputEvent.kbd.ascii = ascii; - _needEventRestPeriod = true; + _queuedEventTime = getMillis() + kQueuedInputEventDelay; } bool OSystem_IPHONE::handleEvent_swipe(Common::Event &event, int direction) { @@ -530,7 +524,7 @@ bool OSystem_IPHONE::handleEvent_swipe(Common::Event &event, int direction) { event.type = Common::EVENT_KEYDOWN; _queuedInputEvent.type = Common::EVENT_KEYUP; event.kbd.flags = _queuedInputEvent.kbd.flags = 0; - _needEventRestPeriod = true; + _queuedEventTime = getMillis() + kQueuedInputEventDelay; return true; } diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp index 813adfbc4378..d14d44cacac0 100644 --- a/backends/platform/iphone/osys_main.cpp +++ b/backends/platform/iphone/osys_main.cpp @@ -58,9 +58,9 @@ void *OSystem_IPHONE::s_soundParam = NULL; OSystem_IPHONE::OSystem_IPHONE() : _savefile(NULL), _mixer(NULL), _timer(NULL), _offscreen(NULL), _overlayVisible(false), _fullscreen(NULL), - _mouseHeight(0), _mouseWidth(0), _mouseBuf(NULL), _lastMouseTap(0), - _secondaryTapped(false), _lastSecondaryTap(0), _screenOrientation(kScreenOrientationFlippedLandscape), - _needEventRestPeriod(false), _mouseClickAndDragEnabled(false), + _mouseHeight(0), _mouseWidth(0), _mouseBuf(NULL), _lastMouseTap(0), _queuedEventTime(0), + _secondaryTapped(false), _lastSecondaryTap(0), + _screenOrientation(kScreenOrientationFlippedLandscape), _mouseClickAndDragEnabled(false), _gestureStartX(-1), _gestureStartY(-1), _fullScreenIsDirty(false), _fullScreenOverlayIsDirty(false), _mouseDirty(false), _timeSuspended(0), _lastDragPosX(-1), _lastDragPosY(-1), _screenChangeCount(0), _overlayHeight(0), _overlayWidth(0), _overlayBuffer(0) diff --git a/backends/platform/iphone/osys_main.h b/backends/platform/iphone/osys_main.h index 79f596632ffa..077cb51c1c5e 100644 --- a/backends/platform/iphone/osys_main.h +++ b/backends/platform/iphone/osys_main.h @@ -89,9 +89,9 @@ class OSystem_IPHONE : public BaseBackend, public PaletteManager { bool _mouseDirty; long _lastMouseDown; long _lastMouseTap; + long _queuedEventTime; Common::Rect _lastDrawnMouseRect; Common::Event _queuedInputEvent; - bool _needEventRestPeriod; bool _secondaryTapped; long _lastSecondaryDown; long _lastSecondaryTap; From 26f8321fc986213ec3fdc1dd656c9f9a83f85b11 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 14 May 2011 16:29:28 +0200 Subject: [PATCH 098/369] SCUMM: Workaround bug #1463598 (INDY3VGA: giant Henry Jones sr.) (cherry picked from commit 47a7b65dc149149ff00baacf9fa76ce0fcaedfd2) --- engines/scumm/actor.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index 13581c4b45a0..9ea66807f0d6 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -177,9 +177,21 @@ void Actor::setBox(int box) { } void Actor_v3::setupActorScale() { - // TODO: The following could probably be removed - _scalex = 0xFF; - _scaley = 0xFF; + // WORKAROUND bug #1463598: Under certain circumstances, it is possible + // for Henry Sr. to reach the front side of Castle Brunwald (following + // Indy there). But it seems the game has no small costume for Henry, + // hence he is shown as a giant, triple in size compared to Indy. + // To workaround this, we override the scale of Henry. Since V3 games + // like Indy3 don't use the costume scale otherwise, this works fine. + // The scale factor 0x50 was determined by some guess work. + if (_number == 2 && _costume == 7 && _vm->_game.id == GID_INDY3 && _vm->_currentRoom == 12) { + _scalex = 0x50; + _scaley = 0x50; + } else { + // TODO: The following could probably be removed + _scalex = 0xFF; + _scaley = 0xFF; + } } void Actor::setupActorScale() { From 136d687dd30b4721127ae359837c8470c95306ec Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 16 May 2011 00:31:53 +0200 Subject: [PATCH 099/369] VKEYBD: Update vkeybd_default.zip Specifically, in vkeybd_default.xml, 'centre' changed to 'center'. (cherry picked from commit db068cf8588a2058d49ae5af3d5d247a3353ef8c) --- backends/vkeybd/packs/vkeybd_default.zip | Bin 184936 -> 179277 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/backends/vkeybd/packs/vkeybd_default.zip b/backends/vkeybd/packs/vkeybd_default.zip index 94c46497684cbe284fbe01c39170b9a1273cc055..960e9431523365ed64c9c5ed71627fafa49b6726 100644 GIT binary patch literal 179277 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

%HhwX2itd%}9bSN2l1AlYIU}xB+ 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 tTbRFQ_3xbiA<} Date: Sun, 15 May 2011 21:43:27 -0400 Subject: [PATCH 100/369] IPHONE: Fixed mouse position when the overlay is visible --- backends/platform/iphone/iphone_video.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backends/platform/iphone/iphone_video.m b/backends/platform/iphone/iphone_video.m index 821d3de63404..4fdb820f70ee 100644 --- a/backends/platform/iphone/iphone_video.m +++ b/backends/platform/iphone/iphone_video.m @@ -178,13 +178,18 @@ uint getSizeNextPOT(uint size) { } bool getLocalMouseCoords(CGPoint *point) { - if (point->x < _screenRect.origin.x || point->x >= _screenRect.origin.x + _screenRect.size.width || - point->y < _screenRect.origin.y || point->y >= _screenRect.origin.y + _screenRect.size.height) { - return false; - } + if (_overlayIsEnabled) { + point->x = point->x / _overlayHeight; + point->y = point->y / _overlayWidth; + } else { + if (point->x < _screenRect.origin.x || point->x >= _screenRect.origin.x + _screenRect.size.width || + point->y < _screenRect.origin.y || point->y >= _screenRect.origin.y + _screenRect.size.height) { + return false; + } - point->x = (point->x - _screenRect.origin.x) / _screenRect.size.width; - point->y = (point->y - _screenRect.origin.y) / _screenRect.size.height; + point->x = (point->x - _screenRect.origin.x) / _screenRect.size.width; + point->y = (point->y - _screenRect.origin.y) / _screenRect.size.height; + } return true; } From 5fbc9c92537f0569b316cecaa72b6e01c8b7c39f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Thu, 19 May 2011 00:29:52 +0300 Subject: [PATCH 101/369] I18N: Update Russian translation --- po/ru_RU.po | 320 ++++++++++++++++++++++++---------------------------- 1 file changed, 148 insertions(+), 172 deletions(-) mode change 100644 => 100755 po/ru_RU.po diff --git a/po/ru_RU.po b/po/ru_RU.po old mode 100644 new mode 100755 index c6adbe964543..fdc7bd8fa253 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -261,12 +261,12 @@ msgstr " #: gui/launcher.cpp:295 msgid "Game Path:" -msgstr "¿ãâì Ú ØÓàÕ: " +msgstr "¿ãâì Ú ØÓàÕ:" #: gui/launcher.cpp:297 msgctxt "lowres" msgid "Game Path:" -msgstr "³ÔÕ ØÓàÐ: " +msgstr "³ÔÕ ØÓàÐ:" #: gui/launcher.cpp:302 gui/options.cpp:1037 msgid "Extra Path:" @@ -283,7 +283,7 @@ msgstr " #: gui/launcher.cpp:309 gui/options.cpp:1025 msgid "Save Path:" -msgstr "ÁÞåàÐÝÕÝØï ØÓà: " +msgstr "ÁÞåàÐÝÕÝØï ØÓà:" #: gui/launcher.cpp:309 gui/launcher.cpp:311 gui/launcher.cpp:312 #: gui/options.cpp:1025 gui/options.cpp:1027 gui/options.cpp:1028 @@ -470,7 +470,7 @@ msgstr " #: gui/launcher.cpp:881 msgid "Do you really want to remove this game configuration?" -msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ãáâÐÝÞÒÚØ ÔÛï íâÞÙ ØÓàë?" +msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ÝÐáâàÞÙÚØ ÔÛï íâÞÙ ØÓàë?" #: gui/launcher.cpp:945 msgid "This game does not support loading games from the launcher." @@ -593,11 +593,12 @@ msgstr " #: gui/options.cpp:676 msgid "EGA undithering" -msgstr "" +msgstr "EGA ÑÕ× àÐáâàÐ" #: gui/options.cpp:676 msgid "Enable undithering in EGA games that support it" msgstr "" +"²ÚÛîçÐÕâ àÕÖØÜ ÑÕ× àÐáâàØàÞÒÐÝØï Ò EGA ØÓàÐå, ÚÞâÞàëÕ ßÞÔÔÕàÖØÒÐîâ âÐÚÞÙ àÕÖØÜ" #: gui/options.cpp:684 msgid "Preferred Device:" @@ -656,11 +657,11 @@ msgstr " #: gui/options.cpp:745 msgid "Don't use General MIDI music" -msgstr "" +msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï General MIDI" #: gui/options.cpp:756 gui/options.cpp:817 msgid "Use first available device" -msgstr "" +msgstr "¸áßÞÛì×ÞÒÐâì ßÕàÒÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ" #: gui/options.cpp:768 msgid "SoundFont:" @@ -726,9 +727,8 @@ msgstr "" "²ëÚÛîçÐÕâ ÜÐßßØÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32" #: gui/options.cpp:807 -#, fuzzy msgid "Don't use Roland MT-32 music" -msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì GM)" +msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï MT-32" #: gui/options.cpp:834 msgid "Text and Speech:" @@ -744,7 +744,7 @@ msgstr " #: gui/options.cpp:840 msgid "Both" -msgstr "²áñ" +msgstr "¾ÑÐ" #: gui/options.cpp:842 msgid "Subtitle speed:" @@ -766,7 +766,7 @@ msgstr " #: gui/options.cpp:850 msgctxt "lowres" msgid "Both" -msgstr "²áñ" +msgstr "¾ÑÐ" #: gui/options.cpp:850 msgid "Show subtitles and play speech" @@ -1005,20 +1005,17 @@ msgstr " #: common/error.cpp:42 msgid "No error" -msgstr "" +msgstr "½Õâ ÞèØÑÚØ" #: common/error.cpp:44 -#, fuzzy msgid "Game data not found" msgstr "½Õâ äÐÙÛÞÒ ØÓàë" #: common/error.cpp:46 -#, fuzzy msgid "Game id not supported" -msgstr "Game Id ÝÕ ßÞÔÔÕàÖØÒÐÕâáï" +msgstr "Game id ÝÕ ßÞÔÔÕàÖØÒÐÕâáï" #: common/error.cpp:48 -#, fuzzy msgid "Unsupported color mode" msgstr "½ÕßÞÔÔÕàÖØÒÐÕÜëÙ àÕÖØÜ æÒÕâÐ" @@ -1031,7 +1028,6 @@ msgid "Write permission denied" msgstr "½ÕÔÞáâÐâÞçÝÞ ßàÐÒ ÔÛï ×ÐßØáØ" #: common/error.cpp:56 -#, fuzzy msgid "Path does not exist" msgstr "¿ãâì ÝÕ ÝÐÙÔÕÝ" @@ -1048,9 +1044,8 @@ msgid "Cannot create file" msgstr "½Õ ÜÞÓã áÞ×ÔÐâì äÐÙÛ" #: common/error.cpp:65 -#, fuzzy msgid "Reading data failed" -msgstr "¾èØÑÚÐ çâÕÝØï" +msgstr "¾èØÑÚÐ çâÕÝØï ÔÐÝÝëå" #: common/error.cpp:67 msgid "Writing data failed" @@ -1058,25 +1053,23 @@ msgstr " #: common/error.cpp:70 msgid "Could not find suitable engine plugin" -msgstr "" +msgstr "½Õ ÜÞÓã ÝÐÙâØ ßÞÔåÞÔïéØÙ ßÛÐÓØÝ ÔÛï ÔÒØÖÚÐ" #: common/error.cpp:72 -#, fuzzy msgid "Engine plugin does not support save states" -msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ãàÞÒÕÝì ÞâÛÐÔÚØ '%s'" +msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ áÞåàÐÝÕÝØï" #: common/error.cpp:75 msgid "Command line argument not processed" -msgstr "" +msgstr "¿ÐàÐÜÕâàë ÚÞÜÐÝÔÝÞÙ áâàÞÚØ ÝÕ ÞÑàÐÑÞâÐÝë" #: common/error.cpp:79 -#, fuzzy msgid "Unknown error" msgstr "½ÕØ×ÒÕáâÝÐï ÞèØÑÚÐ" #: common/util.cpp:276 msgid "Hercules Green" -msgstr "Hercules ·ÕÛÕÝëÙ" +msgstr "Hercules ·ÕÛñÝëÙ" #: common/util.cpp:277 msgid "Hercules Amber" @@ -1085,7 +1078,7 @@ msgstr "Hercules #: common/util.cpp:284 msgctxt "lowres" msgid "Hercules Green" -msgstr "Hercules ·ÕÛÕÝëÙ" +msgstr "Hercules ·ÕÛñÝëÙ" #: common/util.cpp:285 msgctxt "lowres" @@ -1128,7 +1121,7 @@ msgstr "~ #: engines/dialogs.cpp:119 engines/cruise/menu.cpp:216 #: engines/sci/engine/kfile.cpp:577 msgid "Save game:" -msgstr "ÁÞåàÐÝØâì ØÓàã: " +msgstr "ÁÞåàÐÝØâì ØÓàã:" #: engines/dialogs.cpp:119 engines/cruise/menu.cpp:216 #: engines/sci/engine/kfile.cpp:577 @@ -1138,7 +1131,7 @@ msgstr " #: backends/platform/wince/CEActionsSmartphone.cpp:48 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Save" -msgstr "·ÐßØáÐâì" +msgstr "ÁÞåàÐÝØâì" #: engines/dialogs.cpp:315 engines/mohawk/dialogs.cpp:92 #: engines/mohawk/dialogs.cpp:130 @@ -1169,35 +1162,31 @@ msgstr "~ #: engines/scumm/help.cpp:76 msgid "Common keyboard commands:" -msgstr "" +msgstr "¾ÑéØÕ ÚÛÐÒØÐâãàÝëÕ ÚÞÜÐÝÔë:" #: engines/scumm/help.cpp:77 msgid "Save / Load dialog" -msgstr "" +msgstr "´ØÐÛÞÓ ×ÐßØáØ / çâÕÝØï" #: engines/scumm/help.cpp:79 -#, fuzzy msgid "Skip line of text" msgstr "¿àÞßãáâØâì áâàÞÚã" #: engines/scumm/help.cpp:80 msgid "Esc" -msgstr "" +msgstr "Esc" #: engines/scumm/help.cpp:80 -#, fuzzy msgid "Skip cutscene" -msgstr "¿àÞßãáâØâì áâàÞÚã" +msgstr "¿àÞßãáâØâì ×ÐáâÐÒÚã" #: engines/scumm/help.cpp:81 -#, fuzzy msgid "Space" -msgstr "¾×Ò" +msgstr "¿àÞÑÕÛ" #: engines/scumm/help.cpp:81 -#, fuzzy msgid "Pause game" -msgstr "ÁÞåàÐÝØâì ØÓàã: " +msgstr "¿Ðã×Ð ØÓàë" #: engines/scumm/help.cpp:82 engines/scumm/help.cpp:87 #: engines/scumm/help.cpp:98 engines/scumm/help.cpp:99 @@ -1205,23 +1194,21 @@ msgstr " #: engines/scumm/help.cpp:102 engines/scumm/help.cpp:103 #: engines/scumm/help.cpp:104 engines/scumm/help.cpp:105 msgid "Ctrl" -msgstr "" +msgstr "Ctrl" #: engines/scumm/help.cpp:82 -#, fuzzy msgid "Load game state 1-10" -msgstr "·ÐÓàã×Øâì ØÓàã:" +msgstr "·ÐÓàã×Øâì ØÓàã 1-10" #: engines/scumm/help.cpp:83 engines/scumm/help.cpp:87 #: engines/scumm/help.cpp:89 engines/scumm/help.cpp:103 #: engines/scumm/help.cpp:104 engines/scumm/help.cpp:105 msgid "Alt" -msgstr "" +msgstr "Alt" #: engines/scumm/help.cpp:83 -#, fuzzy msgid "Save game state 1-10" -msgstr "ÁÞåàÐÝØâì ØÓàã: " +msgstr "ÁÞåàÐÝØâì ØÓàã 1-10" #: engines/scumm/help.cpp:85 engines/scumm/help.cpp:87 #: backends/platform/symbian/src/SymbianActions.cpp:55 @@ -1232,478 +1219,464 @@ msgstr " #: engines/scumm/help.cpp:89 engines/scumm/help.cpp:92 msgid "Enter" -msgstr "" +msgstr "²ÒÞÔ" #: engines/scumm/help.cpp:89 msgid "Toggle fullscreen" -msgstr "" +msgstr "¿ÕàÕÚÛîçØâì ÝÐ ÒÕáì íÚàÐÝ" #: engines/scumm/help.cpp:90 -#, fuzzy msgid "Music volume up / down" -msgstr "³àÞÜÚ. Üã×ëÚØ:" +msgstr "³àÞÜÚÞáâì Üã×ëÚØ ãÒÕÛØçØâì/ãÜÕÝìèØâì" #: engines/scumm/help.cpp:91 msgid "Text speed slower / faster" -msgstr "" +msgstr "ÁÚÞàÞáâì âÕÚáâÐ ÑëáâàÕÕ/ÜÕÔÛÕÝÝÕÕ" #: engines/scumm/help.cpp:92 msgid "Simulate left mouse button" -msgstr "" +msgstr "ÍÜãÛïæØï ÝÐÖÐâØï ÛÕÒÞÙ ÚÛÐÒØèØ ÜëèØ" #: engines/scumm/help.cpp:93 msgid "Tab" -msgstr "" +msgstr "Tab" #: engines/scumm/help.cpp:93 msgid "Simulate right mouse button" -msgstr "" +msgstr "ÍÜãÛïæØï ßàÐÒÞÙ ÚÛÐÒØèØ ÜëèØ" #: engines/scumm/help.cpp:96 msgid "Special keyboard commands:" -msgstr "" +msgstr "ÁßÕæØÐÛìÝÒÕ ÚÛÐÒØÐâãàÝëÕ ÚÞÜÐÝÔë:" #: engines/scumm/help.cpp:97 -#, fuzzy msgid "Show / Hide console" -msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚãàáÞà" +msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚÞÝáÞÛì" #: engines/scumm/help.cpp:98 msgid "Start the debugger" -msgstr "" +msgstr "·ÐßãáÚ ÞâÛÐÔçØÚÐ" #: engines/scumm/help.cpp:99 msgid "Show memory consumption" -msgstr "" +msgstr "¿ÞÚÐ×Ðâì ßÞâàÕÑÛÕÝØÕ ßÐÜïâØ" #: engines/scumm/help.cpp:100 msgid "Run in fast mode (*)" -msgstr "" +msgstr "·ÐßãáâØâì ÑëáâàëÙ àÕÖØÜ (*)" #: engines/scumm/help.cpp:101 msgid "Run in really fast mode (*)" -msgstr "" +msgstr "·ÐßãáâØâì ÞçÕÝì ÑëáâàëÙ àÕÖØÜ (*)" #: engines/scumm/help.cpp:102 msgid "Toggle mouse capture" -msgstr "" +msgstr "¿ÕàÕÚÛîçÕÝØÕ ßÕàÕåÒÐâÐ ÜëèØ" #: engines/scumm/help.cpp:103 msgid "Switch between graphics filters" -msgstr "" +msgstr "¿ÕàÕÚÛîçÕÝØÕ ÜÕÖÔã ÓàÐäØçÕáÚØÜØ äØÛìâàÐÜØ" #: engines/scumm/help.cpp:104 msgid "Increase / Decrease scale factor" -msgstr "" +msgstr "ÃÒÕÛØçØâì/ãÜÕÝìèØâì ÜÐáèâÐÑ" #: engines/scumm/help.cpp:105 -#, fuzzy msgid "Toggle aspect-ratio correction" -msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" +msgstr "¿ÕàÕÚÛîçÕÝØÕ ÚÞààÕÚæØØ áÞÞâÝÞèÕÝØï áâÞàÞÝ" #: engines/scumm/help.cpp:110 msgid "* Note that using ctrl-f and" -msgstr "" +msgstr "* ¸áßÞÛì×ÞÒÐÝØÕ ctrl-f Ø" #: engines/scumm/help.cpp:111 msgid " ctrl-g are not recommended" -msgstr "" +msgstr " ctrl-g ÝÕ àÕÚÞÜÕÝÔãÕâáï" #: engines/scumm/help.cpp:112 msgid " since they may cause crashes" -msgstr "" +msgstr " âÐÚ ÚÐÚ ÞÝØ ÜÞÓãâ ßàØÒÕáâØ Ú" #: engines/scumm/help.cpp:113 msgid " or incorrect game behaviour." -msgstr "" +msgstr " ÝÕÒÕàÝÞÙ àÐÑÞâÕ ØÓàë." #: engines/scumm/help.cpp:117 msgid "Spinning drafts on the keyboard:" -msgstr "" +msgstr "¸×ÜÕÝïÕÜëÕ çÕàÝÞÒØÚØ ÝÐ ÚÛÐÒØÐâãàÕ:" #: engines/scumm/help.cpp:119 -#, fuzzy msgid "Main game controls:" -msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë" +msgstr "¾áÝÞÒÝÞÕ ãßàÐÒÛÕÝØÕ ØÓàÞÙ:" #: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 #: engines/scumm/help.cpp:164 -#, fuzzy msgid "Push" -msgstr "¿Ðã×Ð" +msgstr "ÂÞÛÚÐâì" #: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140 #: engines/scumm/help.cpp:165 msgid "Pull" -msgstr "" +msgstr "ÂïÝãâì" #: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141 #: engines/scumm/help.cpp:166 engines/scumm/help.cpp:199 #: engines/scumm/help.cpp:209 msgid "Give" -msgstr "" +msgstr "´Ðâì" #: engines/scumm/help.cpp:127 engines/scumm/help.cpp:142 #: engines/scumm/help.cpp:167 engines/scumm/help.cpp:192 #: engines/scumm/help.cpp:210 msgid "Open" -msgstr "" +msgstr "¾âÚàëâì" #: engines/scumm/help.cpp:129 -#, fuzzy msgid "Go to" -msgstr "²ÒÕàå" +msgstr "¸ÔâØ" #: engines/scumm/help.cpp:130 msgid "Get" -msgstr "" +msgstr "²×ïâì" #: engines/scumm/help.cpp:131 engines/scumm/help.cpp:155 #: engines/scumm/help.cpp:173 engines/scumm/help.cpp:200 #: engines/scumm/help.cpp:215 engines/scumm/help.cpp:226 #: engines/scumm/help.cpp:251 msgid "Use" -msgstr "" +msgstr "¸áßÞÛì×ÞÒÐâì" #: engines/scumm/help.cpp:132 engines/scumm/help.cpp:144 msgid "Read" -msgstr "" +msgstr "ÇØâÐâì" #: engines/scumm/help.cpp:133 engines/scumm/help.cpp:150 msgid "New kid" -msgstr "" +msgstr "½ÞÒëÙ ßÕàá" #: engines/scumm/help.cpp:134 engines/scumm/help.cpp:156 #: engines/scumm/help.cpp:174 msgid "Turn on" -msgstr "" +msgstr "²ÚÛîçØâì" #: engines/scumm/help.cpp:135 engines/scumm/help.cpp:157 #: engines/scumm/help.cpp:175 -#, fuzzy msgid "Turn off" -msgstr "·ÒãÚ ÒÚÛ/ÒëÚÛ" +msgstr "²ëÚÛîçØâì" #: engines/scumm/help.cpp:145 engines/scumm/help.cpp:170 #: engines/scumm/help.cpp:196 msgid "Walk to" -msgstr "" +msgstr "¸ÔâØ Ú" #: engines/scumm/help.cpp:146 engines/scumm/help.cpp:171 #: engines/scumm/help.cpp:197 engines/scumm/help.cpp:212 #: engines/scumm/help.cpp:229 msgid "Pick up" -msgstr "" +msgstr "¿ÞÔÝïâì" #: engines/scumm/help.cpp:147 engines/scumm/help.cpp:172 msgid "What is" -msgstr "" +msgstr "ÇâÞ âÐÚÞÕ" #: engines/scumm/help.cpp:149 msgid "Unlock" -msgstr "" +msgstr "¾âÚàëâì" #: engines/scumm/help.cpp:152 msgid "Put on" -msgstr "" +msgstr "¿ÞÛÞÖØâì" #: engines/scumm/help.cpp:153 msgid "Take off" -msgstr "" +msgstr "¿ÞÔÝïâì" #: engines/scumm/help.cpp:159 msgid "Fix" -msgstr "" +msgstr "¸áßàÐÒØâì" #: engines/scumm/help.cpp:161 -#, fuzzy msgid "Switch" -msgstr "¾×Ò" +msgstr "¿ÕàÕÚÛîçØâì" #: engines/scumm/help.cpp:169 engines/scumm/help.cpp:230 msgid "Look" -msgstr "" +msgstr "ÁÜÞâàÕâì" #: engines/scumm/help.cpp:176 engines/scumm/help.cpp:225 msgid "Talk" -msgstr "" +msgstr "³ÞÒÞàØâì" #: engines/scumm/help.cpp:177 -#, fuzzy msgid "Travel" -msgstr "·ÐßØáÐâì" +msgstr "¿ãâÕèÕáâÒÞÒÐâì" #: engines/scumm/help.cpp:178 msgid "To Henry / To Indy" -msgstr "" +msgstr "³ÕÝàØ/¸ÝÔØ" #: engines/scumm/help.cpp:181 msgid "play C minor on distaff" -msgstr "" +msgstr "ØÓàÐâì ÔÞ ÜØÝÞà ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:182 msgid "play D on distaff" -msgstr "" +msgstr "ØÓàÐâì àÕ ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:183 msgid "play E on distaff" -msgstr "" +msgstr "ØÓàÐâì ÜØ ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:184 msgid "play F on distaff" -msgstr "" +msgstr "ØÓàÐâì äÐ ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:185 msgid "play G on distaff" -msgstr "" +msgstr "ØÓàÐâì áÞÛì ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:186 msgid "play A on distaff" -msgstr "" +msgstr "ØÓàÐâì Ûï ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:187 msgid "play B on distaff" -msgstr "" +msgstr "ØÓàÐâì áØ ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:188 msgid "play C major on distaff" -msgstr "" +msgstr "ØÓàÐâì ÔÞ ÜÐÖÞà ÝÐ ßàïÛÚÕ" #: engines/scumm/help.cpp:194 engines/scumm/help.cpp:216 msgid "puSh" -msgstr "" +msgstr "âÞÛÚÐâì" #: engines/scumm/help.cpp:195 engines/scumm/help.cpp:217 msgid "pull (Yank)" -msgstr "" +msgstr "âïÝãâì (æÕßÛïâì)" #: engines/scumm/help.cpp:198 engines/scumm/help.cpp:214 #: engines/scumm/help.cpp:249 msgid "Talk to" -msgstr "" +msgstr "³ÞÒÞàØâì á" #: engines/scumm/help.cpp:201 engines/scumm/help.cpp:213 msgid "Look at" -msgstr "" +msgstr "ÁÜÞâàÕâì ÝÐ" #: engines/scumm/help.cpp:202 msgid "turn oN" -msgstr "" +msgstr "ÒÚÛîçØâì" #: engines/scumm/help.cpp:203 msgid "turn oFf" -msgstr "" +msgstr "ÒëÚÛîçØâì" #: engines/scumm/help.cpp:219 -#, fuzzy msgid "KeyUp" -msgstr "ºÛÐÒØèØ" +msgstr "²ÒÕàå" #: engines/scumm/help.cpp:219 msgid "Highlight prev dialogue" -msgstr "" +msgstr "¿ÞÔáÒÕâØâì ßàÕÔëÔãéØÙ ÔØÐÛÞÓ" #: engines/scumm/help.cpp:220 -#, fuzzy msgid "KeyDown" msgstr "²ÝØ×" #: engines/scumm/help.cpp:220 msgid "Highlight next dialogue" -msgstr "" +msgstr "¿ÞÔáÒÕâØâì áÛÕÔãîéØÙ ÔØÐÛÞÓ" #: engines/scumm/help.cpp:224 msgid "Walk" -msgstr "" +msgstr "¸ÔâØ" #: engines/scumm/help.cpp:227 engines/scumm/help.cpp:236 #: engines/scumm/help.cpp:243 engines/scumm/help.cpp:250 msgid "Inventory" -msgstr "" +msgstr "¸ÝÒÕÝâÐàì" #: engines/scumm/help.cpp:228 msgid "Object" -msgstr "" +msgstr "¾ÑêÕÚâ" #: engines/scumm/help.cpp:231 msgid "Black and White / Color" -msgstr "" +msgstr "ÇÕàÝÞ-ÑÕÛëÙ/ÆÒÕâÝÞÙ" #: engines/scumm/help.cpp:234 msgid "Eyes" -msgstr "" +msgstr "³ÛÐ×Ð" #: engines/scumm/help.cpp:235 -#, fuzzy msgid "Tongue" -msgstr "·ÞÝÐ" +msgstr "Ï×ëÚ" #: engines/scumm/help.cpp:237 msgid "Punch" -msgstr "" +msgstr "ÃÔÐà" #: engines/scumm/help.cpp:238 msgid "Kick" -msgstr "" +msgstr "½ÞÓÞÙ" #: engines/scumm/help.cpp:241 engines/scumm/help.cpp:248 msgid "Examine" -msgstr "" +msgstr "¿àÞÒÕàØâì" #: engines/scumm/help.cpp:242 msgid "Regular cursor" -msgstr "" +msgstr "¾ÑëçÝëÙ ÚãàáÞà" #: engines/scumm/help.cpp:244 msgid "Comm" -msgstr "" +msgstr "ºÞÜÜ" #: engines/scumm/help.cpp:247 msgid "Save / Load / Options" -msgstr "" +msgstr "·ÐÓàã×Øâì/ÁÞåàÐÝØâì/½ÐáâàÞÙÚØ" #: engines/scumm/help.cpp:256 -#, fuzzy msgid "Other game controls:" -msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë" +msgstr "¾áâÐÛìÝÞÕ ãßàÐÒÛÕÝØÕ ØÓàÞÙ:" #: engines/scumm/help.cpp:258 engines/scumm/help.cpp:268 msgid "Inventory:" -msgstr "" +msgstr "¸ÝÒÕÝâÐàì:" #: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 msgid "Scroll list up" -msgstr "" +msgstr "¿àÞÚàãâØâì áßØáÞÚ ÒÒÕàå" #: engines/scumm/help.cpp:260 engines/scumm/help.cpp:276 msgid "Scroll list down" -msgstr "" +msgstr "¿àÞÚàãâØâì áßØáÞÚ ÒÝØ×" #: engines/scumm/help.cpp:261 engines/scumm/help.cpp:269 msgid "Upper left item" -msgstr "" +msgstr "²ÕàåÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 msgid "Lower left item" -msgstr "" +msgstr "½ØÖÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:263 engines/scumm/help.cpp:272 msgid "Upper right item" -msgstr "" +msgstr "²ÕàåÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:264 engines/scumm/help.cpp:274 msgid "Lower right item" -msgstr "" +msgstr "½ØÖÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:270 msgid "Middle left item" -msgstr "" +msgstr "ÁàÕÔÝØÙ ÛÕÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:273 msgid "Middle right item" -msgstr "" +msgstr "ÁàÕÔÝØÙ ßàÐÒëÙ ßàÕÔÜÕâ" #: engines/scumm/help.cpp:280 engines/scumm/help.cpp:285 -#, fuzzy msgid "Switching characters:" -msgstr "ÁÜÕÝØâì ÓÕàÞï" +msgstr "ÁÜÕÝÐ ÓÕàÞï:" #: engines/scumm/help.cpp:282 msgid "Second kid" -msgstr "" +msgstr "²âÞàÞÙ ÓÕàÞÙ" #: engines/scumm/help.cpp:283 msgid "Third kid" -msgstr "" +msgstr "ÂàÕâØÙ ÓÕàÞÙ" #: engines/scumm/help.cpp:295 msgid "Fighting controls (numpad):" -msgstr "" +msgstr "ÃßàÐÒÛÕÝØÕ ÑÞÕÜ (æØäàÞÒëÕ ÚÛÐÒØèØ)" #: engines/scumm/help.cpp:296 engines/scumm/help.cpp:297 #: engines/scumm/help.cpp:298 msgid "Step back" -msgstr "" +msgstr "ÈÐÓ ÝÐ×ÐÔ" #: engines/scumm/help.cpp:299 msgid "Block high" -msgstr "" +msgstr "·ÐéØâÐ áÒÕàåã" #: engines/scumm/help.cpp:300 msgid "Block middle" -msgstr "" +msgstr "·ÐéØâÐ ßÞáÕàÕÔØÝÕ" #: engines/scumm/help.cpp:301 msgid "Block low" -msgstr "" +msgstr "·ÐéØâÐ áÝØ×ã" #: engines/scumm/help.cpp:302 msgid "Punch high" -msgstr "" +msgstr "ÃÔÐà áÒÕàåã" #: engines/scumm/help.cpp:303 msgid "Punch middle" -msgstr "" +msgstr "ÃÔÐà ßÞáÕàÕÔØÝÕ" #: engines/scumm/help.cpp:304 msgid "Punch low" -msgstr "" +msgstr "ÃÔÐà áÝØ×ã" #: engines/scumm/help.cpp:307 msgid "These are for Indy on left." -msgstr "" +msgstr "ÍâÞ ÚÞÓÔÐ ¸ÝÔØ áÛÕÒÐ." #: engines/scumm/help.cpp:308 msgid "When Indy is on the right," -msgstr "" +msgstr "ºÞÓÔÐ ¸ÝÔØ áßàÐÒÐ," #: engines/scumm/help.cpp:309 msgid "7, 4, and 1 are switched with" -msgstr "" +msgstr "7, 4 Ø 1 ÜÕÝïîâáï á" #: engines/scumm/help.cpp:310 msgid "9, 6, and 3, respectively." -msgstr "" +msgstr "9, 6 Ø 3 áÞÞâÒÕâáâÒÕÝÝÞ." #: engines/scumm/help.cpp:317 msgid "Biplane controls (numpad):" -msgstr "" +msgstr "ÃßàÐÒÛÕÝØÕ áÐÜÞÛñâÞÜ (æØäàÞÒëÕ ÚÛÐÒØèØ)" #: engines/scumm/help.cpp:318 msgid "Fly to upper left" -msgstr "" +msgstr "»ÕâÕâì ÒÛÕÒÞ-ÒÒÕàå" #: engines/scumm/help.cpp:319 msgid "Fly to left" -msgstr "" +msgstr "»ÕâÕâì ÒÛÕÒÞ" #: engines/scumm/help.cpp:320 msgid "Fly to lower left" -msgstr "" +msgstr "»ÕâÕâì ÒÛÕÒÞ-ÒÝØ×" #: engines/scumm/help.cpp:321 msgid "Fly upwards" -msgstr "" +msgstr "»ÕâÕâì ÒÒÕàå" #: engines/scumm/help.cpp:322 msgid "Fly straight" -msgstr "" +msgstr "»ÕâÕâì ßàïÜÞ" #: engines/scumm/help.cpp:323 msgid "Fly down" -msgstr "" +msgstr "»ÕâÕâì ÒÝØ×" #: engines/scumm/help.cpp:324 msgid "Fly to upper right" -msgstr "" +msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÒÕàå" #: engines/scumm/help.cpp:325 msgid "Fly to right" -msgstr "" +msgstr "»ÕâÕâì ÒßàÐÒÞ" #: engines/scumm/help.cpp:326 msgid "Fly to lower right" -msgstr "" +msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÝØ×" #: engines/scumm/scumm.cpp:2255 engines/agos/saveload.cpp:192 #, c-format @@ -1723,7 +1696,7 @@ msgid "" "\n" "%s" msgstr "" -"½Õ ãÔÐÛÞáì ×ÐÓàã×Øâì ØÓàã Ø× äÐÙÛÒÐ:\n" +"½Õ ãÔÐÛÞáì ×ÐÓàã×Øâì ØÓàã Ø× äÐÙÛÐ:\n" "\n" "%s" @@ -1744,6 +1717,9 @@ msgid "" "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " "directory inside the Tentacle game directory." msgstr "" +"ÁÕÙçÐá ÔÞÛÖÝÐ ×ÐßãáâØâìáï ØÓàÐ Maniax Mansion. ½Þ ScummVM ßÞÚÐ íâÞ ÝÕ ãÜÕÕâ. " +"ÇâÞÑë áëÓàÐâì, ÝÐÖÜØâÕ '½ÞÒÐï ØÓàÐ' Ò áâÐàâÞÒÞÜ ÜÕÝî ScummVM, Ð ×ÐâÕÜ ÒëÑÕàØâÕ " +"ÔØàÕÚâÞàØî Maniac ÒÝãâàØ ÔØàÕÚâÞàØØ á ØÓàÞÙ Tentacle." #: engines/mohawk/dialogs.cpp:89 engines/mohawk/dialogs.cpp:127 msgid "~Z~ip Mode Activated" @@ -1924,15 +1900,15 @@ msgstr " #: backends/graphics/opengl/opengl-graphics.cpp:133 msgid "OpenGL Normal" -msgstr "" +msgstr "OpenGL ÑÕ× ãÒÕÛØçÕÝØï" #: backends/graphics/opengl/opengl-graphics.cpp:134 msgid "OpenGL Conserve" -msgstr "" +msgstr "OpenGL á áÞåàÐÝÕÝØÕÜ" #: backends/graphics/opengl/opengl-graphics.cpp:135 msgid "OpenGL Original" -msgstr "" +msgstr "OpenGL Ø×ÝÐçÐÛìÝëÙ" #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:42 From ce69c2e22e2a4efa4b18e92308a123bfd872fba3 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Thu, 19 May 2011 00:30:16 +0300 Subject: [PATCH 102/369] I18N: Fixed errors and smoothness of Ukrainian translation --- po/uk_UA.po | 186 +++++++++++++++++++++++++--------------------------- 1 file changed, 91 insertions(+), 95 deletions(-) diff --git a/po/uk_UA.po b/po/uk_UA.po index 03822b83d05d..8903d18541ad 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -154,7 +154,7 @@ msgid "" "Language of the game. This will not turn your Spanish game version into " "English" msgstr "" -"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÝÐ ÐÝÓÛöÙáìÚöÙ Ò " +"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÐÝÓÛöÙáìÚÞî Ò " "ãÚàÐ÷ÝáìÚã" #: gui/launcher.cpp:191 gui/launcher.cpp:205 gui/options.cpp:80 @@ -302,7 +302,7 @@ msgstr " #: gui/options.cpp:1202 gui/options.cpp:1209 gui/options.cpp:1308 msgctxt "path" msgid "None" -msgstr "½Õ ×ÐÔÐÝØÙ" +msgstr "½Õ ×ÐÒÔÐÝØÙ" #: gui/launcher.cpp:333 gui/launcher.cpp:415 #: backends/platform/wii/options.cpp:56 @@ -391,7 +391,7 @@ msgstr "~ #: gui/launcher.cpp:578 gui/launcher.cpp:585 msgid "Remove game from the list. The game data files stay intact" -msgstr "²ØÔÐÛØâØ Óàã ×ö áßØáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚÐ" +msgstr "²ØÔÐÛØâØ Óàã ×ö áßØáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚã" #: gui/launcher.cpp:581 msgctxt "lowres" @@ -410,7 +410,7 @@ msgstr "~ #: gui/launcher.cpp:593 msgid "Search in game list" -msgstr "¿ÞèãÚ Ò áßØáÚã öÓÞà" +msgstr "¿ÞèãÚ ã áßØáÚã öÓÞà" #: gui/launcher.cpp:597 gui/launcher.cpp:1111 msgid "Search:" @@ -437,7 +437,7 @@ msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." msgstr "" -"²Ø ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ " +"ÇØ ÒØ ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ " "ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà." #: gui/launcher.cpp:732 gui/launcher.cpp:881 @@ -504,7 +504,7 @@ msgstr "... #: gui/massadd.cpp:244 msgid "Scan complete!" -msgstr "¿ÞèãÚ ×ÐÚöÝçÕÝØÙ!" +msgstr "¿ÞèãÚ ×ÐÚöÝçÕÝÞ!" #: gui/massadd.cpp:247 #, c-format @@ -577,7 +577,7 @@ msgstr " #: gui/options.cpp:662 gui/options.cpp:663 msgid "Special dithering modes supported by some games" -msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÕÝÔÕàØÝÓã, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ" +msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÐáâàãÒÐÝÝï, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ" #: gui/options.cpp:672 msgid "Fullscreen mode" @@ -593,11 +593,11 @@ msgstr " #: gui/options.cpp:676 msgid "EGA undithering" -msgstr "EGA ÑÕ× ×ÓÛÐÔÖãÒÐÝÝï" +msgstr "EGA ÑÕ× àÐáâàãÒÐÝÝï" #: gui/options.cpp:676 msgid "Enable undithering in EGA games that support it" -msgstr "²öÜÚÝãâØ ÑÕ× ×ÓÛÐÔÖãÒÐÝÝï Ò EGA öÓàÐå ïÚö ßöÔâàØÜãîâì æÕ." +msgstr "²öÜÚÝãâØ ÑÕ× àÐáâàãÒÐÝÝï Ò EGA öÓàÐå ïÚö ßöÔâàØÜãîâì æÕ" #: gui/options.cpp:684 msgid "Preferred Device:" @@ -605,7 +605,7 @@ msgstr " #: gui/options.cpp:684 msgid "Music Device:" -msgstr "¼ã×Øç. ¿àØáâàöÙ:" +msgstr "¼ã×Øç. ßàØáâàöÙ:" #: gui/options.cpp:684 gui/options.cpp:686 msgid "Specifies preferred sound device or sound card emulator" @@ -623,7 +623,7 @@ msgstr " #: gui/options.cpp:686 msgctxt "lowres" msgid "Music Device:" -msgstr "¼ã×ØçÝØÙ ¿àØáâàöÙ:" +msgstr "¼ã×ØçÝØÙ ßàØáâàöÙ:" #: gui/options.cpp:712 msgid "AdLib emulator:" @@ -655,7 +655,7 @@ msgstr " #: gui/options.cpp:745 msgid "Don't use General MIDI music" -msgstr "ÝÕ ÒØÚÞàØáâÞÒãÒÐâØ General MIDI Üã×ØÚã" +msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ General MIDI Üã×ØÚã" #: gui/options.cpp:756 gui/options.cpp:817 msgid "Use first available device" @@ -721,7 +721,7 @@ msgstr " #: gui/options.cpp:798 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -"²ØÜØÚÐô ÜÐßßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32" +"²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32" #: gui/options.cpp:807 msgid "Don't use Roland MT-32 music" @@ -821,17 +821,17 @@ msgstr " #: gui/options.cpp:1037 gui/options.cpp:1039 gui/options.cpp:1040 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ, ÐÑÞ " +"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ ÐÑÞ " "ScummVM" #: gui/options.cpp:1044 msgid "Plugins Path:" -msgstr "ÈÛïå ÔÞ ßÛÐÓöÝöÒ:" +msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:" #: gui/options.cpp:1046 msgctxt "lowres" msgid "Plugins Path:" -msgstr "ÈÛïå ÔÞ ßÛÐÓöÝöÒ:" +msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:" #: gui/options.cpp:1055 msgid "Misc" @@ -893,15 +893,15 @@ msgstr " #: gui/options.cpp:1291 msgid "Select directory for plugins" -msgstr "²ØÑÕàöâì ßÐßÚã × ßÛÐÓØÝÐÜØ" +msgstr "²ØÑÕàöâì ßÐßÚã ×ö ÒâãÛÚÐÜØ" #: gui/options.cpp:1335 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." msgstr "" -"²ØÑàÐÝã âÕÜã ÝÕ ßöÔâàØÜãô ßÞâÞçÝÐ ÜÞÒÐ. ÏÚéÞ ÒØ åÞçÕâÕ ÒØÚÞàØáâÞÒãÒÐâØ æî " -"âÕÜã ßÞâàöÑÝÞ Ò ßÕàèã çÕàÓã ×ÜöÝØâØ ÜÞÒã." +"²ØÑàÐÝÐ âÕÜÐ ÝÕ ßöÔâàØÜãô ßÞâÞçÝã ÜÞÒã. ÏÚéÞ ÒØ åÞçÕâÕ ÒØÚÞàØáâÞÒãÒÐâØ æî " +"âÕÜã, ßÞâàöÑÝÞ Ò ßÕàèã çÕàÓã ×ÜöÝØâØ ÜÞÒã." #: gui/saveload.cpp:61 gui/saveload.cpp:242 msgid "No date saved" @@ -1002,22 +1002,19 @@ msgstr " #: common/error.cpp:42 msgid "No error" -msgstr "" +msgstr "½ÕÜÐô ßÞÜØÛÚØ" #: common/error.cpp:44 -#, fuzzy msgid "Game data not found" msgstr "½ÕÜÐô äÐÙÛöÒ ÓàØ" #: common/error.cpp:46 -#, fuzzy msgid "Game id not supported" msgstr "Game Id ÝÕ ßöÔâàØÜãôâìáï" #: common/error.cpp:48 -#, fuzzy msgid "Unsupported color mode" -msgstr "ÀÕÖØÜ ºÞÛìÞàã ÝÕ ßöÔâàØÜãôâìáï" +msgstr "ÀÕÖØÜ ÚÞÛìÞàã ÝÕ ßöÔâàØÜãôâìáï" #: common/error.cpp:51 msgid "Read permission denied" @@ -1028,9 +1025,8 @@ msgid "Write permission denied" msgstr "½ÕÔÞáâÐâÝìÞ ßàÐÒ ÔÛï ×ÐßØáã" #: common/error.cpp:56 -#, fuzzy msgid "Path does not exist" -msgstr "ÈÛïå ÝÕ ×ÝÐÙÔÕÝØÙ" +msgstr "ÈÛïå ÝÕ ×ÝÐÙÔÕÝÞ" #: common/error.cpp:58 msgid "Path not a directory" @@ -1045,7 +1041,6 @@ msgid "Cannot create file" msgstr "½Õ ÜÞÖã áâÒÞàØâØ äÐÙÛ" #: common/error.cpp:65 -#, fuzzy msgid "Reading data failed" msgstr "¿ÞÜØÛÚÐ çØâÐÝÝï" @@ -1055,19 +1050,17 @@ msgstr " #: common/error.cpp:70 msgid "Could not find suitable engine plugin" -msgstr "" +msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÝÕÞÑåöÔÕÞÓÞ ÒâãÛÚÐ ÔÛï ÔÒØÖÚÐ." #: common/error.cpp:72 -#, fuzzy msgid "Engine plugin does not support save states" msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'" #: common/error.cpp:75 msgid "Command line argument not processed" -msgstr "" +msgstr "°àÓãÜÕÝâØ ÚÞÜÐÝÔÝÞÓÞ àïÔÚã ÝÕ ÞÑàÞÑÛÕÝö" #: common/error.cpp:79 -#, fuzzy msgid "Unknown error" msgstr "½ÕÒöÔÞÜÐ ßÞÜØÛÚÐ" @@ -1170,7 +1163,7 @@ msgstr " #: engines/scumm/help.cpp:77 msgid "Save / Load dialog" -msgstr "·ÑÕàÕÓâØ / ·ÐÒÐÝâÐÖØâØ ÔöÐÛÞÓ" +msgstr "´öÐÛÞÓ ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï" #: engines/scumm/help.cpp:79 msgid "Skip line of text" @@ -1231,11 +1224,11 @@ msgstr " #: engines/scumm/help.cpp:90 msgid "Music volume up / down" -msgstr "³ãçÝöáâì Üã×ØÚØ ÒÒÕàå/ÒÝØ×" +msgstr "³ãçÝöáâì Üã×ØÚØ ÒØéÕ/ÝØÖçÕ" #: engines/scumm/help.cpp:91 msgid "Text speed slower / faster" -msgstr "ÈÒØÔÚöáâì âÕÚáâã ßÞÒöÛìÝöèÕ / èÒØÔèÕ" +msgstr "ÈÒØÔÚöáâì âÕÚáâã ßÞÒöÛìÝöèÕ/èÒØÔèÕ" #: engines/scumm/help.cpp:92 msgid "Simulate left mouse button" @@ -1255,7 +1248,7 @@ msgstr " #: engines/scumm/help.cpp:97 msgid "Show / Hide console" -msgstr "¿ÞÚÐ×ÐâØ / ÁåÞÒÐâØ ÚÞÝáÞÛì" +msgstr "¿ÞÚÐ×ÐâØ/cåÞÒÐâØ ÚÞÝáÞÛì" #: engines/scumm/help.cpp:98 msgid "Start the debugger" @@ -1283,7 +1276,7 @@ msgstr " #: engines/scumm/help.cpp:104 msgid "Increase / Decrease scale factor" -msgstr "·ÑöÛìèÕÝÝï / ×ÜÕÝèÕÝÝï ÜÐáèâÐÑã" +msgstr "·ÑöÛìèÕÝÝï/×ÜÕÝèÕÝÝï ÜÐáèâÐÑã" #: engines/scumm/help.cpp:105 msgid "Toggle aspect-ratio correction" @@ -1291,11 +1284,11 @@ msgstr " #: engines/scumm/help.cpp:110 msgid "* Note that using ctrl-f and" -msgstr "* ·ÐãÒÐÖØÜÞ, éÞ ÒØÚÞàØáâÐÝÝï Ctrl-F ö" +msgstr "* ·ÐãÒÐÖØÜÞ, éÞ ÒØÚÞàØáâÐÝÝï ctrl-f ö" #: engines/scumm/help.cpp:111 msgid " ctrl-g are not recommended" -msgstr " ctrl-G ÝÕ àÕÚÞÜÕÝÔãôâìáï" +msgstr " ctrl-g ÝÕ àÕÚÞÜÕÝÔãôâìáï" #: engines/scumm/help.cpp:112 msgid " since they may cause crashes" @@ -1307,7 +1300,7 @@ msgstr " #: engines/scumm/help.cpp:117 msgid "Spinning drafts on the keyboard:" -msgstr "ÁßöÝöÝÓ ßàÞÕÚâØ ÝÐ ÚÛÐÒöÐâãàö:" +msgstr "·ÜöÝÝö çÞàÝÞÒØÚØ ÝÐ ÚÛÐÒöÐâãàö:" #: engines/scumm/help.cpp:119 msgid "Main game controls:" @@ -1381,7 +1374,7 @@ msgstr " #: engines/scumm/help.cpp:147 engines/scumm/help.cpp:172 msgid "What is" -msgstr "ÉÞ æÕ" +msgstr "ÉÞ ô" #: engines/scumm/help.cpp:149 msgid "Unlock" @@ -1397,7 +1390,7 @@ msgstr " #: engines/scumm/help.cpp:159 msgid "Fix" -msgstr "·ÐäöÚáãÒÐâØ" +msgstr "½ÐÛÐÓÞÔØâØ" #: engines/scumm/help.cpp:161 msgid "Switch" @@ -1417,39 +1410,39 @@ msgstr " #: engines/scumm/help.cpp:178 msgid "To Henry / To Indy" -msgstr "´Þ ³ÕÝàö / ´¾ ¦ÝÔö" +msgstr "à ³ÕÝàö / à ¦ÝÔö" #: engines/scumm/help.cpp:181 msgid "play C minor on distaff" -msgstr "ÓàÐâØ C ÝÕ×ÝÐçÝØÙ ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ ÔÞ ÜöÝÞà ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:182 msgid "play D on distaff" -msgstr "ÓàÐâØ D ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ àÕ ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:183 msgid "play E on distaff" -msgstr "ÓàÐâØ E ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ Üö ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:184 msgid "play F on distaff" -msgstr "ÓàÐâØ F ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ äÐ ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:185 msgid "play G on distaff" -msgstr "ÓàÐâØ G ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ áÞÛì ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:186 msgid "play A on distaff" -msgstr "ÓàÐâØ A ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ Ûï ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:187 msgid "play B on distaff" -msgstr "ÓàÐâØ B ÝÐ ßàïÔæö" +msgstr "ÓàÐâØ áö ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:188 msgid "play C major on distaff" -msgstr "ÓàÐâØ C ×ÝÐçÝØÙ yf ghzlws" +msgstr "ÓàÐâØ ÔÞ ÜÐÖÞà ÝÐ ßàïÔæö" #: engines/scumm/help.cpp:194 engines/scumm/help.cpp:216 msgid "puSh" @@ -1507,7 +1500,7 @@ msgstr " #: engines/scumm/help.cpp:231 msgid "Black and White / Color" -msgstr "ÇÞàÝØÙ ö ±öÛØÙ / ºÞÛöà" +msgstr "ÇÞàÝÞÑöÛØÙ/ºÞÛìÞàÞÒØÙ" #: engines/scumm/help.cpp:234 msgid "Eyes" @@ -1531,7 +1524,7 @@ msgstr " #: engines/scumm/help.cpp:242 msgid "Regular cursor" -msgstr "ÀÕÓãÛïàÝØÙ ÚãàáÞà" +msgstr "·ÒØçÐÙÝØÙ ÚãàáÞà" #: engines/scumm/help.cpp:244 msgid "Comm" @@ -1551,11 +1544,11 @@ msgstr " #: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 msgid "Scroll list up" -msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÒÒÕàå" +msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÔÞÓÞàØ" #: engines/scumm/help.cpp:260 engines/scumm/help.cpp:276 msgid "Scroll list down" -msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÒÝØ×" +msgstr "¿àÞÚàãçÕÝÝï áßØáÚã ÔÞÝØ×ã" #: engines/scumm/help.cpp:261 engines/scumm/help.cpp:269 msgid "Upper left item" @@ -1612,7 +1605,7 @@ msgstr " #: engines/scumm/help.cpp:301 msgid "Block low" -msgstr "±ÛÞÚãÒÐâØ ÝØéÕ" +msgstr "±ÛÞÚãÒÐâØ ÝØÖçÕ" #: engines/scumm/help.cpp:302 msgid "Punch high" @@ -1624,7 +1617,7 @@ msgstr " #: engines/scumm/help.cpp:304 msgid "Punch low" -msgstr "±ØâØ ÝØéÕ" +msgstr "±ØâØ ÝØÖçÕ" #: engines/scumm/help.cpp:307 msgid "These are for Indy on left." @@ -1636,7 +1629,7 @@ msgstr " #: engines/scumm/help.cpp:309 msgid "7, 4, and 1 are switched with" -msgstr "7, 4, ö 1 ßÕàÕÜØÚÐîâìáï ×" +msgstr "7, 4, ö 1 ßÕàÕÜØÚÐîâìáï ÝÐ" #: engines/scumm/help.cpp:310 msgid "9, 6, and 3, respectively." @@ -1648,11 +1641,11 @@ msgstr " #: engines/scumm/help.cpp:318 msgid "Fly to upper left" -msgstr "»ÕâöâØ ÒØéÕ ÒÛöÒÞ" +msgstr "»ÕâöâØ ÔÞÓÞàØ ÝÐÛöÒÞ" #: engines/scumm/help.cpp:319 msgid "Fly to left" -msgstr "»ÕâöâØ ÒÛöÒÞ" +msgstr "»ÕâöâØ ÝÐÛöÒÞ" #: engines/scumm/help.cpp:320 msgid "Fly to lower left" @@ -1660,7 +1653,7 @@ msgstr " #: engines/scumm/help.cpp:321 msgid "Fly upwards" -msgstr "»ÕâöâØ ÒÓÞàã" +msgstr "»ÕâöâØ ÔÞÓÞàØ" #: engines/scumm/help.cpp:322 msgid "Fly straight" @@ -1668,11 +1661,11 @@ msgstr " #: engines/scumm/help.cpp:323 msgid "Fly down" -msgstr "»ÕâöâØ ÒÝØ×" +msgstr "»ÕâöâØ ÔÞÝØ×ã" #: engines/scumm/help.cpp:324 msgid "Fly to upper right" -msgstr "»ÕâöâØ ÒØéÕ ÒßàÐÒÞ" +msgstr "»ÕâöâØ ÔÞÓÞàØ ÝÐßàÐÒÞ" #: engines/scumm/help.cpp:325 msgid "Fly to right" @@ -1680,7 +1673,7 @@ msgstr " #: engines/scumm/help.cpp:326 msgid "Fly to lower right" -msgstr "»ÕâöâØ ÝØÖçÕ ÒßàÐÒÞ" +msgstr "»ÕâöâØ ÔÞÝØ×ã ÝÐßàÐÒÞ" #: engines/scumm/scumm.cpp:2255 engines/agos/saveload.cpp:192 #, c-format @@ -1689,7 +1682,7 @@ msgid "" "\n" "%s" msgstr "" -"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ Ò äÐÙÛ:\n" +"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n" "\n" "%s" @@ -1721,18 +1714,21 @@ msgid "" "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " "directory inside the Tentacle game directory." msgstr "" +"·Ð×ÒØçÐÙ, ×ÐàÐ× ÑØ ×ÐßãáâØÒáï Maniac Mansion. ¿àÞâÕ ScummVM éÕ æìÞÓÞ ÝÕ ÒÜöô. " +"ÉÞÑ ÓàÐâØ ã ÝìÞÓÞ, ÞÑÕàöâì '´ÞÔÐâØ Óàã' ã ßÞçÐâÚÞÒÞÜã ÜÕÝî ScummVM, ö ÒØÑÕàöâì " +"ßÐßÚã Maniac ÒáÕàÕÔÕÝö ßÒßÚØ × ÓàÞî Tentacle." #: engines/mohawk/dialogs.cpp:89 engines/mohawk/dialogs.cpp:127 msgid "~Z~ip Mode Activated" -msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝØÙ" +msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝÞ" #: engines/mohawk/dialogs.cpp:90 msgid "~T~ransitions Enabled" -msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝö" +msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝÞ" #: engines/mohawk/dialogs.cpp:128 msgid "~W~ater Effect Enabled" -msgstr "µäÕÚâØ ÒÞÔØ ÒÚÛîçÕÝö" +msgstr "µäÕÚâØ ÒÞÔØ ÒÚÛîçÕÝÞ" #: engines/sci/engine/kfile.cpp:680 msgid "Restore game:" @@ -1832,11 +1828,11 @@ msgstr " #: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" -msgstr "·ÜöéÕÝÝï âÞàÚÐÝì ßÞ Þáö X" +msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö X" #: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" -msgstr "·ÜöéÕÝÝï âÞàÚÐÝì ßÞ Þáö Y" +msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö Y" #: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" @@ -1860,7 +1856,7 @@ msgstr " #: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" -msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑãÒÐÝÝï (èÒØÔÚÞ, ÐÛÕ ÝØ×ìÚÞ÷ ïÚÞáâö)" +msgstr "ÅÐàÔÒÐàÝÕ ÜÐáèâÐÑãÒÐÝÝï (èÒØÔÚÞ, ÐÛÕ ÝØ×ìÚÞ÷ ïÚÞáâö)" #: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" @@ -1884,11 +1880,11 @@ msgstr " #: backends/platform/iphone/osys_events.cpp:360 msgid "Touchpad mode enabled." -msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝØÙ." +msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝÞ." #: backends/platform/iphone/osys_events.cpp:362 msgid "Touchpad mode disabled." -msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝØÙ." +msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝÞ." #: backends/graphics/sdl/sdl-graphics.cpp:47 msgid "Normal (no scaling)" @@ -1905,7 +1901,7 @@ msgstr "OpenGL #: backends/graphics/opengl/opengl-graphics.cpp:134 msgid "OpenGL Conserve" -msgstr "OpenGL ÚÞÝáÕàÒÞÒÐÝØÙ" +msgstr "OpenGL ×ÑÕàÕÖÕÝØÙ #: backends/graphics/opengl/opengl-graphics.cpp:135 msgid "OpenGL Original" @@ -1914,22 +1910,22 @@ msgstr "OpenGL #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:42 msgid "Up" -msgstr "²ÒÕàå" +msgstr "´ÞÓÞàØ" #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsSmartphone.cpp:43 msgid "Down" -msgstr "²ÝØ×" +msgstr "´ÞÝØ×ã" #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 msgid "Left" -msgstr "²ÛöÒÞ" +msgstr "½ÐÛöÒÞ" #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Right" -msgstr "²ßàÐÒÞ" +msgstr "½ÐßàÐÒÞ" #: backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:63 @@ -1951,7 +1947,7 @@ msgstr " #: backends/platform/wince/CEActionsPocket.cpp:57 #: backends/platform/wince/CEActionsSmartphone.cpp:51 msgid "Multi Function" -msgstr "¼ãÛìâöäãÝÚæöï" +msgstr "¼ãÛìâØäãÝÚæöï" #: backends/platform/symbian/src/SymbianActions.cpp:51 msgid "Swap character" @@ -1983,7 +1979,7 @@ msgstr " #: backends/events/symbiansdl/symbiansdl-events.cpp:187 msgid "Do you want to quit ?" -msgstr "²Ø åÞçØâÕ ÒØÙâØ?" +msgstr "²Ø åÞçÕâÕ ÒØÙâØ?" #: backends/platform/wii/options.cpp:51 msgid "Video" @@ -1991,7 +1987,7 @@ msgstr " #: backends/platform/wii/options.cpp:54 msgid "Current video mode:" -msgstr "ÂÕÚãçØÙ ÒöÔÕÞàÕÖØÜ:" +msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ:" #: backends/platform/wii/options.cpp:56 msgid "Double-strike" @@ -2071,7 +2067,7 @@ msgstr " #: backends/platform/wii/options.cpp:143 msgid "DVD Mounted successfully" -msgstr "DVD ßöÔÚÛîçÕÝØÙ ãáßöèÝÞ" +msgstr "DVD ßöÔÚÛîçÕÝÞ ãáßöèÝÞ" #: backends/platform/wii/options.cpp:146 msgid "Error while mounting the DVD" @@ -2079,11 +2075,11 @@ msgstr " #: backends/platform/wii/options.cpp:148 msgid "DVD not mounted" -msgstr "DVD ÝÕ ßöÔÚÛîçÕÝØÙ" +msgstr "DVD ÝÕ ßöÔÚÛîçÕÝÞ" #: backends/platform/wii/options.cpp:161 msgid "Network up, share mounted" -msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚÐ ßöÔÚÛîçÕÝÐ" +msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚã ßöÔÚÛîçÕÝÞ" #: backends/platform/wii/options.cpp:163 msgid "Network up" @@ -2095,11 +2091,11 @@ msgstr ", #: backends/platform/wii/options.cpp:168 msgid ", share not mounted" -msgstr ", ßÐßÚÐ ÝÕ ßöÔÚÛîçÕÝÐ" +msgstr ", ßÐßÚã ÝÕ ßöÔÚÛîçÕÝÞ" #: backends/platform/wii/options.cpp:174 msgid "Network down" -msgstr "¼ÕàÕÖÐ ÒØÜÚÝÕÝÐ" +msgstr "¼ÕàÕÖã ÒØÜÚÝÕÝÞ" #: backends/platform/wii/options.cpp:178 msgid "Initialising network" @@ -2107,12 +2103,12 @@ msgstr " #: backends/platform/wii/options.cpp:182 msgid "Timeout while initialising network" -msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØâöÚ" +msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØÙèÞÒ" #: backends/platform/wii/options.cpp:186 #, c-format msgid "Network not initialised (%d)" -msgstr "¼ÕàÕÖÐ ÝÕ ÝÐÛÐÓÞÔÖÕÝÐ (%d)" +msgstr "¼ÕàÕÖã ÝÕ ÝÐÛÐÓÞÔÖÕÝÞ (%d)" #: backends/platform/wince/CEActionsPocket.cpp:49 msgid "Hide Toolbar" @@ -2132,7 +2128,7 @@ msgstr " #: backends/platform/wince/CEActionsPocket.cpp:53 msgid "Show/Hide Cursor" -msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ ÚãàáÞà" +msgstr "¿ÞÚÐ×ÐâØ/áåÞÒÐâØ ÚãàáÞà" #: backends/platform/wince/CEActionsPocket.cpp:54 msgid "Free look" @@ -2149,23 +2145,23 @@ msgstr " #: backends/platform/wince/CEActionsPocket.cpp:58 #: backends/platform/wince/CEActionsSmartphone.cpp:52 msgid "Bind Keys" -msgstr "ßàØ×ÝÐçØâØ ÚÛÐÒöèö" +msgstr "¿àØ×ÝÐçØâØ ÚÛÐÒöèö" #: backends/platform/wince/CEActionsPocket.cpp:59 msgid "Cursor Up" -msgstr "ºãàáÞà ÒÒÕàå" +msgstr "ºãàáÞà ÔÞÓÞàØ" #: backends/platform/wince/CEActionsPocket.cpp:60 msgid "Cursor Down" -msgstr "ºãàáÞà ÒÝØ×" +msgstr "ºãàáÞà ÔÞÝØ×ã" #: backends/platform/wince/CEActionsPocket.cpp:61 msgid "Cursor Left" -msgstr "ºãàáÞà ÒÛöÒÞ" +msgstr "ºãàáÞà ÝÐÛöÒÞ" #: backends/platform/wince/CEActionsPocket.cpp:62 msgid "Cursor Right" -msgstr "ºãàáÞà ÒßàÐÒÞ" +msgstr "ºãàáÞà ÝÐßàÐÒÞ" #: backends/platform/wince/CEActionsPocket.cpp:268 #: backends/platform/wince/CEActionsSmartphone.cpp:231 @@ -2203,7 +2199,7 @@ msgstr " #: backends/platform/wince/wince-sdl.cpp:490 msgid "You must map a key to the 'Right Click' action to play this game" -msgstr "²Ø ßÞÒØÝÝö ßÕàÕ" +msgstr "²Ø ßÞÒØÝÝö ßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÞ Ôö÷ '¿àÐÒØÙ ÚÛöÚ', éÞÑ ÓàÐâØ ã æî Óàã" #: backends/platform/wince/wince-sdl.cpp:499 msgid "Map hide toolbar action" @@ -2212,7 +2208,7 @@ msgstr " #: backends/platform/wince/wince-sdl.cpp:503 msgid "You must map a key to the 'Hide toolbar' action to play this game" msgstr "" -"²Ø ßÞÒØÝÝö ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.', éÞÑ ÓàÐâØ " +"²Ø ßÞÒØÝÝö ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.', éÞÑ ÓàÐâØ " "Ò æî Óàã" #: backends/platform/wince/wince-sdl.cpp:512 From 410be8bb793e089cf0ef178a77ef28e001c877f3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 18 May 2011 21:58:52 -0400 Subject: [PATCH 103/369] GRAPHICS: Update links to info on PICT+JPEG --- graphics/pict.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphics/pict.cpp b/graphics/pict.cpp index 9779d3231ce4..80bcb7a71e99 100644 --- a/graphics/pict.cpp +++ b/graphics/pict.cpp @@ -324,8 +324,8 @@ void PictDecoder::outputPixelBuffer(byte *&out, byte value, byte bitsPerPixel) { } // Compressed QuickTime details can be found here: -// http://developer.apple.com/documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/B-Chapter/2TheImageCompression.html -// http://developer.apple.com/documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/F-Chapter/6WorkingwiththeImage.html +// http://developer.apple.com/legacy/mac/library/#documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/B-Chapter/2TheImageCompression.html +// http://developer.apple.com/legacy/mac/library/#documentation/QuickTime/Rm/CompressDecompress/ImageComprMgr/F-Chapter/6WorkingwiththeImage.html // I'm just ignoring that because Myst ME uses none of that extra stuff. The offset is always the same. void PictDecoder::decodeCompressedQuickTime(Common::SeekableReadStream *stream) { From fcae7bb497b51baa6d55099e86092adbc9e44ef1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 19 May 2011 21:52:45 +1000 Subject: [PATCH 104/369] SWORD25: Fix to properly signal when movie playback has ended --- engines/sword25/fmv/movieplayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/fmv/movieplayer.cpp b/engines/sword25/fmv/movieplayer.cpp index d267506ae205..d0ad41de22e3 100644 --- a/engines/sword25/fmv/movieplayer.cpp +++ b/engines/sword25/fmv/movieplayer.cpp @@ -145,7 +145,7 @@ bool MoviePlayer::isMovieLoaded() { } bool MoviePlayer::isPaused() { - return _decoder.isPaused(); + return _decoder.isPaused() || _decoder.endOfVideo(); } float MoviePlayer::getScaleFactor() { From da3f6708984043322bd8e97535dd461977376417 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Thu, 19 May 2011 22:05:57 +0200 Subject: [PATCH 105/369] MOHAWK: Compensate movie encoding difference between Myst ME and Myst original, to fix a crash in the clock tower. --- engines/mohawk/myst_stacks/myst.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index f77ae753d9f6..70abf0ccd37f 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -2839,11 +2839,17 @@ void Myst::clockGearForwardOneStep(uint16 gear) { } void Myst::clockWeightDownOneStep() { + // The Myst ME version of this video is encoded faster than the original + // The weight goes on the floor one step too early. Original ME engine also has this behavior. + bool updateVideo = !(_vm->getFeatures() & GF_ME) || _clockWeightPosition < (2214 - 246); + // Set video bounds - _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); - _vm->_video->setVideoBounds(_clockWeightVideo, - Audio::Timestamp(0, _clockWeightPosition, 600), - Audio::Timestamp(0, _clockWeightPosition + 246, 600)); + if (updateVideo) { + _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); + _vm->_video->setVideoBounds(_clockWeightVideo, + Audio::Timestamp(0, _clockWeightPosition, 600), + Audio::Timestamp(0, _clockWeightPosition + 246, 600)); + } // Increment value by one step _clockWeightPosition += 246; From e27dd8ac4ea487d388c59db53d7d7ee1ce24e9c9 Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Fri, 20 May 2011 06:20:52 +0800 Subject: [PATCH 106/369] WINCE: Change plugin extensions from .dll to .plugin - fixes erroneous loading of runtime-dlls --- backends/plugins/win32/win32-provider.cpp | 20 ++++++++------------ configure | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/backends/plugins/win32/win32-provider.cpp b/backends/plugins/win32/win32-provider.cpp index bcbc6bde9e46..0a08e48e6f78 100644 --- a/backends/plugins/win32/win32-provider.cpp +++ b/backends/plugins/win32/win32-provider.cpp @@ -67,19 +67,11 @@ class Win32Plugin : public DynamicPlugin { bool loadPlugin() { assert(!_dlHandle); - #ifndef _WIN32_WCE +#ifndef _WIN32_WCE _dlHandle = LoadLibrary(_filename.c_str()); - #else - if (!_filename.hasSuffix("scummvm.dll") && - !_filename.hasSuffix("libstdc++-6.dll") && - !_filename.hasSuffix("libgcc_s_sjlj-1.dll")) { - // skip loading the core scummvm module and runtime dlls - _dlHandle = LoadLibrary(toUnicode(_filename.c_str())); - } else { - // do not generate misleading error message - return false; - } - #endif +#else + _dlHandle = LoadLibrary(toUnicode(_filename.c_str())); +#endif if (!_dlHandle) { debug("Failed loading plugin '%s' (error code %d)", _filename.c_str(), (int32) GetLastError()); @@ -111,7 +103,11 @@ Plugin* Win32PluginProvider::createPlugin(const Common::FSNode &node) const { bool Win32PluginProvider::isPluginFilename(const Common::FSNode &node) const { // Check the plugin suffix Common::String filename = node.getName(); +#ifndef _WIN32_WCE if (!filename.hasSuffix(".dll")) +#else + if (!filename.hasSuffix(".plugin")) +#endif return false; return true; diff --git a/configure b/configure index bdbda1a8c994..c4243e17842c 100755 --- a/configure +++ b/configure @@ -2324,12 +2324,12 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im HOSTEXEEXT=".dll" _def_plugin=' #define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".dll" +#define PLUGIN_SUFFIX ".plugin" ' _mak_plugins=' DYNAMIC_MODULES := 1 PLUGIN_PREFIX := -PLUGIN_SUFFIX := .dll +PLUGIN_SUFFIX := .plugin PLUGIN_EXTRA_DEPS = $(EXECUTABLE) CXXFLAGS += -DDYNAMIC_MODULES PLUGIN_LDFLAGS := -shared -lscummvm -L. From 1ee5ef9c6fd335ca00901e32dc3e05ba8474403b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 19 May 2011 18:33:00 -0400 Subject: [PATCH 107/369] GRAPHICS: Allow auxiliary surface functions to be used for 32bpp surfaces --- graphics/surface.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/graphics/surface.cpp b/graphics/surface.cpp index 3f53ce56f4dd..772ec12e54c5 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -42,8 +42,10 @@ void Surface::drawLine(int x0, int y0, int x1, int y1, uint32 color) { Graphics::drawLine(x0, y0, x1, y1, color, plotPoint, this); else if (format.bytesPerPixel == 2) Graphics::drawLine(x0, y0, x1, y1, color, plotPoint, this); + else if (format.bytesPerPixel == 4) + Graphics::drawLine(x0, y0, x1, y1, color, plotPoint, this); else - error("Surface::drawLine: bytesPerPixel must be 1 or 2"); + error("Surface::drawLine: bytesPerPixel must be 1, 2, or 4"); } void Surface::create(uint16 width, uint16 height, const PixelFormat &f) { @@ -92,8 +94,11 @@ void Surface::hLine(int x, int y, int x2, uint32 color) { } else if (format.bytesPerPixel == 2) { uint16 *ptr = (uint16 *)getBasePtr(x, y); Common::set_to(ptr, ptr + (x2-x+1), (uint16)color); + } else if (format.bytesPerPixel == 4) { + uint32 *ptr = (uint32 *)getBasePtr(x, y); + Common::set_to(ptr, ptr + (x2-x+1), color); } else { - error("Surface::hLine: bytesPerPixel must be 1 or 2"); + error("Surface::hLine: bytesPerPixel must be 1, 2, or 4"); } } @@ -122,8 +127,15 @@ void Surface::vLine(int x, int y, int y2, uint32 color) { *ptr = (uint16)color; ptr += pitch/2; } + + } else if (format.bytesPerPixel == 4) { + uint32 *ptr = (uint32 *)getBasePtr(x, y); + while (y++ <= y2) { + *ptr = color; + ptr += pitch / 4; + } } else { - error("Surface::vLine: bytesPerPixel must be 1 or 2"); + error("Surface::vLine: bytesPerPixel must be 1, 2, or 4"); } } @@ -183,8 +195,8 @@ void Surface::move(int dx, int dy, int height) { if ((dx == 0 && dy == 0) || height <= 0) return; - if (format.bytesPerPixel != 1 && format.bytesPerPixel != 2) - error("Surface::move: bytesPerPixel must be 1 or 2"); + if (format.bytesPerPixel != 1 && format.bytesPerPixel != 2 && format.bytesPerPixel != 4) + error("Surface::move: bytesPerPixel must be 1, 2, or 4"); byte *src, *dst; int x, y; @@ -223,6 +235,10 @@ void Surface::move(int dx, int dy, int height) { *(uint16 *)dst = *(const uint16 *)src; src -= 2; dst -= 2; + } else if (format.bytesPerPixel == 4) { + *(uint32 *)dst = *(const uint32 *)src; + src -= 4; + dst -= 4; } } src += pitch + (pitch - dx * format.bytesPerPixel); @@ -240,6 +256,10 @@ void Surface::move(int dx, int dy, int height) { *(uint16 *)dst = *(const uint16 *)src; src += 2; dst += 2; + } else if (format.bytesPerPixel == 4) { + *(uint32 *)dst = *(const uint32 *)src; + src += 4; + dst += 4; } } src += pitch - (pitch + dx * format.bytesPerPixel); From 5fdf2796d6542db5ae05774bbbe792923c67b68b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 19 May 2011 18:37:24 -0400 Subject: [PATCH 108/369] GRAPHICS: Cleanup formatting --- graphics/surface.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/graphics/surface.cpp b/graphics/surface.cpp index 772ec12e54c5..cee8e614381b 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -90,13 +90,13 @@ void Surface::hLine(int x, int y, int x2, uint32 color) { if (format.bytesPerPixel == 1) { byte *ptr = (byte *)getBasePtr(x, y); - memset(ptr, (byte)color, x2-x+1); + memset(ptr, (byte)color, x2 - x + 1); } else if (format.bytesPerPixel == 2) { uint16 *ptr = (uint16 *)getBasePtr(x, y); - Common::set_to(ptr, ptr + (x2-x+1), (uint16)color); + Common::set_to(ptr, ptr + (x2 - x + 1), (uint16)color); } else if (format.bytesPerPixel == 4) { uint32 *ptr = (uint32 *)getBasePtr(x, y); - Common::set_to(ptr, ptr + (x2-x+1), color); + Common::set_to(ptr, ptr + (x2 - x + 1), color); } else { error("Surface::hLine: bytesPerPixel must be 1, 2, or 4"); } @@ -125,7 +125,7 @@ void Surface::vLine(int x, int y, int y2, uint32 color) { uint16 *ptr = (uint16 *)getBasePtr(x, y); while (y++ <= y2) { *ptr = (uint16)color; - ptr += pitch/2; + ptr += pitch / 2; } } else if (format.bytesPerPixel == 4) { @@ -157,7 +157,7 @@ void Surface::fillRect(Common::Rect r, uint32 color) { } else if (format.bytesPerPixel == 4) { useMemset = false; } else if (format.bytesPerPixel != 1) { - error("Surface::fillRect: bytesPerPixel must be 1, 2 or 4"); + error("Surface::fillRect: bytesPerPixel must be 1, 2, or 4"); } if (useMemset) { @@ -171,7 +171,7 @@ void Surface::fillRect(Common::Rect r, uint32 color) { uint16 *ptr = (uint16 *)getBasePtr(r.left, r.top); while (height--) { Common::set_to(ptr, ptr + width, (uint16)color); - ptr += pitch/2; + ptr += pitch / 2; } } else { uint32 *ptr = (uint32 *)getBasePtr(r.left, r.top); @@ -184,10 +184,10 @@ void Surface::fillRect(Common::Rect r, uint32 color) { } void Surface::frameRect(const Common::Rect &r, uint32 color) { - hLine(r.left, r.top, r.right-1, color); - hLine(r.left, r.bottom-1, r.right-1, color); - vLine(r.left, r.top, r.bottom-1, color); - vLine(r.right-1, r.top, r.bottom-1, color); + hLine(r.left, r.top, r.right - 1, color); + hLine(r.left, r.bottom - 1, r.right - 1, color); + vLine(r.left, r.top, r.bottom - 1, color); + vLine(r.right - 1, r.top, r.bottom - 1, color); } void Surface::move(int dx, int dy, int height) { From cbf7f740e4d61d3807308baf8af9adf8c6223ee6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 20 May 2011 18:45:33 +1000 Subject: [PATCH 109/369] SWORD25: Re-implement two LUA library I/O functions necessary for detecting and creating the config.lua configuration file --- engines/sword25/util/lua/lauxlib.cpp | 6 +++++- engines/sword25/util/lua/liolib.cpp | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/engines/sword25/util/lua/lauxlib.cpp b/engines/sword25/util/lua/lauxlib.cpp index 526b1c84abb6..ce61827e0f93 100644 --- a/engines/sword25/util/lua/lauxlib.cpp +++ b/engines/sword25/util/lua/lauxlib.cpp @@ -540,7 +540,11 @@ static const char *getF (lua_State *L, void *ud, size_t *size) { static int errfile (lua_State *L, const char *what, int fnameindex) { - return luaL_error(L, "LUA function errfile has been removed in ScummVM"); + const char *serr = "General error"; + const char *filename = lua_tostring(L, fnameindex) + 1; + lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); + lua_remove(L, fnameindex); + return LUA_ERRFILE; } diff --git a/engines/sword25/util/lua/liolib.cpp b/engines/sword25/util/lua/liolib.cpp index f9bad30aed2b..aea6c328d8a4 100644 --- a/engines/sword25/util/lua/liolib.cpp +++ b/engines/sword25/util/lua/liolib.cpp @@ -27,7 +27,20 @@ static const char *const fnames[] = {"input", "output"}; static int pushresult (lua_State *L, int i, const char *filename) { - return luaL_error(L, "LUA file I/O functions have been removed in ScummVM"); + int en = 0; /*errno;*/ // Currently hardcoded for ScumMVM, this may need to be changed + if (i) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (filename) + lua_pushfstring(L, "%s: %s", filename, "General error" /*strerror(en)*/); + else + lua_pushfstring(L, "%s", "General error" /*strerror(en)*/); + lua_pushinteger(L, en); + return 3; + } } From f6b3b72eae246479d730bb8f61a4169a7da8b6d1 Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Fri, 20 May 2011 18:34:42 +0200 Subject: [PATCH 110/369] SWORD25: Don't assume that all locales use decimal point The trydecpoint() function *is* used, though probably only in countries which don't use a decimal point. We can't use the ISO C locale functions here because they're not fully implemented on some platforms, e.g. Android. Hopefully this method will work. --- engines/sword25/util/lua/llex.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/engines/sword25/util/lua/llex.cpp b/engines/sword25/util/lua/llex.cpp index 87eafea45a43..4d73a6a6003a 100644 --- a/engines/sword25/util/lua/llex.cpp +++ b/engines/sword25/util/lua/llex.cpp @@ -6,6 +6,7 @@ #include +#include #include #define llex_c @@ -175,11 +176,23 @@ static void buffreplace (LexState *ls, char from, char to) { static void trydecpoint (LexState *ls, SemInfo *seminfo) { /* format error: try to update decimal point separator */ - // Non-portable call to update the decimal point separator. - // It has been simplified in ScummVM to not use any system locale - // information, as it's not used in sword25. + // Normally we'd use localeconv() to get the decimal point separator, but + // annoyingly that is not available on some platforms, e.g. Android. Figure + // it out by formatting a known value and extract the separator from that + // instead. The result could be cached, but considering the game I doubt + // this will ever be a bottleneck. Note that the separator is assumed to fit + // in a char, but that was a limitation in the original code as well. char old = ls->decpoint; + char buf[5]; + int i; + sprintf(buf, "%.1f", 1.0); ls->decpoint = '.'; + for (i = 0; buf[i]; i++) { + if (!isspace(buf[i]) && !isdigit(buf[i])) { + ls->decpoint = buf[i]; + break; + } + } buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { /* format error with correct decimal point: no more options */ From ffc2a93daa8d0dd4fed97427ae7f00e4194b26c4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 20 May 2011 19:30:22 +0200 Subject: [PATCH 111/369] AUDIO: Remove leftover "forward" declaration after real declaration in the TOWNS midi code. --- audio/softsynth/fmtowns_pc98/towns_midi.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp index e67a78e9dc8b..3c7ce7d0e43e 100644 --- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp @@ -25,8 +25,6 @@ #include "common/textconsole.h" #include "common/system.h" -enum EnvelopeState; - class TownsMidiOutputChannel { friend class TownsMidiInputChannel; public: From 2d1fa6c3f8bdc635d49978ad48f72619707d6893 Mon Sep 17 00:00:00 2001 From: athrxx Date: Fri, 20 May 2011 16:06:14 +0200 Subject: [PATCH 112/369] FM-TOWNS AUDIO: fix thread lockups and cleanup - fixed lockup situation in imuse destructor (only concerning the fm-towns driver) - fixed lockup situation when AudioCDManager functions get called (in both cases both the main thread and the mixer thread would get locked in different mutex belonging to the other thread) --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 228 ++++++++++-------- audio/softsynth/fmtowns_pc98/towns_audio.h | 11 +- audio/softsynth/fmtowns_pc98/towns_midi.cpp | 68 +++--- .../fmtowns_pc98/towns_pc98_driver.cpp | 104 ++++---- .../fmtowns_pc98/towns_pc98_driver.h | 34 +-- .../fmtowns_pc98/towns_pc98_fmsynth.cpp | 60 +++-- .../fmtowns_pc98/towns_pc98_fmsynth.h | 23 +- engines/scumm/player_towns.cpp | 9 +- 8 files changed, 290 insertions(+), 247 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 719bc981ee05..635f9354cc64 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -30,7 +30,7 @@ class TownsAudio_PcmChannel { -friend class TownsAudioInterfaceIntern; +friend class TownsAudioInterfaceInternal; public: TownsAudio_PcmChannel(); ~TownsAudio_PcmChannel(); @@ -80,7 +80,7 @@ friend class TownsAudioInterfaceIntern; }; class TownsAudio_WaveTable { -friend class TownsAudioInterfaceIntern; +friend class TownsAudioInterfaceInternal; public: TownsAudio_WaveTable(); ~TownsAudio_WaveTable(); @@ -101,12 +101,12 @@ friend class TownsAudioInterfaceIntern; int8 *data; }; -class TownsAudioInterfaceIntern : public TownsPC98_FmSynth { +class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { public: - TownsAudioInterfaceIntern(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); - ~TownsAudioInterfaceIntern(); + TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + ~TownsAudioInterfaceInternal(); - static TownsAudioInterfaceIntern *addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + static TownsAudioInterfaceInternal *addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); static void releaseRef(); bool checkPluginDriver(TownsAudioInterfacePluginDriver *driver); @@ -127,7 +127,7 @@ class TownsAudioInterfaceIntern : public TownsPC98_FmSynth { void timerCallbackA(); void timerCallbackB(); - typedef int (TownsAudioInterfaceIntern::*TownsAudioIntfCallback)(va_list &); + typedef int (TownsAudioInterfaceInternal::*TownsAudioIntfCallback)(va_list &); const TownsAudioIntfCallback *_intfOpcodes; int intf_reset(va_list &args); @@ -223,9 +223,11 @@ class TownsAudioInterfaceIntern : public TownsPC98_FmSynth { void pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w); void updateOutputVolume(); + void updateOutputVolumeInternal(); uint8 _outputVolumeFlags; uint8 _outputLevel[16]; uint8 _outputMute[16]; + bool _updateOutputVol; const float _baserate; uint32 _timerBase; @@ -239,7 +241,7 @@ class TownsAudioInterfaceIntern : public TownsPC98_FmSynth { TownsAudioInterfacePluginDriver *_drv; bool _ready; - static TownsAudioInterfaceIntern *_refInstance; + static TownsAudioInterfaceInternal *_refInstance; static int _refCount; static const uint8 _chanFlags[]; @@ -250,15 +252,15 @@ class TownsAudioInterfaceIntern : public TownsPC98_FmSynth { static const uint16 _pcmPhase2[]; }; -TownsAudioInterfaceIntern::TownsAudioInterfaceIntern(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), +TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), _outputVolumeFlags(0), _pcmChanOut(0), _pcmChanReserved(0), _pcmChanKeyPressed(0), _pcmChanEffectPlaying(0), _pcmChanKeyPlaying(0), _fmChanPlaying(0), - _numReservedChannels(0), _numWaveTables(0), _ready(false) { + _numReservedChannels(0), _numWaveTables(0), _updateOutputVol(false), _ready(false) { -#define INTCB(x) &TownsAudioInterfaceIntern::intf_##x +#define INTCB(x) &TownsAudioInterfaceInternal::intf_##x static const TownsAudioIntfCallback intfCb[] = { // 0 INTCB(reset), @@ -381,7 +383,7 @@ TownsAudioInterfaceIntern::TownsAudioInterfaceIntern(Audio::Mixer *mixer, TownsA _tickLength = 2 * _timerBase; } -TownsAudioInterfaceIntern::~TownsAudioInterfaceIntern() { +TownsAudioInterfaceInternal::~TownsAudioInterfaceInternal() { _ready = false; deinit(); @@ -393,19 +395,19 @@ TownsAudioInterfaceIntern::~TownsAudioInterfaceIntern() { delete[] _pcmChan; } -TownsAudioInterfaceIntern *TownsAudioInterfaceIntern::addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) { +TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) { _refCount++; if (_refCount == 1 && _refInstance == 0) - _refInstance = new TownsAudioInterfaceIntern(mixer, driver); + _refInstance = new TownsAudioInterfaceInternal(mixer, driver); else if (_refCount < 2 || _refInstance == 0) - error("TownsAudioInterfaceIntern::addNewRef(): Internal reference management failure"); + error("TownsAudioInterfaceInternal::addNewRef(): Internal reference management failure"); else if (!_refInstance->checkPluginDriver(driver)) - error("TownsAudioInterfaceIntern::addNewRef(): Plugin driver conflict"); + error("TownsAudioInterfaceInternal::addNewRef(): Plugin driver conflict"); return _refInstance; } -void TownsAudioInterfaceIntern::releaseRef() { +void TownsAudioInterfaceInternal::releaseRef() { if (!_refCount) return; @@ -417,7 +419,7 @@ void TownsAudioInterfaceIntern::releaseRef() { } } -bool TownsAudioInterfaceIntern::checkPluginDriver(TownsAudioInterfacePluginDriver *driver) { +bool TownsAudioInterfaceInternal::checkPluginDriver(TownsAudioInterfacePluginDriver *driver) { if (_refCount <= 1) return true; @@ -425,15 +427,13 @@ bool TownsAudioInterfaceIntern::checkPluginDriver(TownsAudioInterfacePluginDrive if (driver && driver != _drv) return false; } else { - lock(); _drv = driver; - unlock(); } return true; } -bool TownsAudioInterfaceIntern::init() { +bool TownsAudioInterfaceInternal::init() { if (_ready) return true; @@ -457,7 +457,7 @@ bool TownsAudioInterfaceIntern::init() { return true; } -int TownsAudioInterfaceIntern::callback(int command, ...) { +int TownsAudioInterfaceInternal::callback(int command, ...) { if (!_ready) return 1; @@ -470,40 +470,42 @@ int TownsAudioInterfaceIntern::callback(int command, ...) { return res; } -int TownsAudioInterfaceIntern::processCommand(int command, va_list &args) { +int TownsAudioInterfaceInternal::processCommand(int command, va_list &args) { if (!_ready) return 1; if (command < 0 || command > 81) return 4; - lock(); + Common::StackLock lock(_mutex); int res = (this->*_intfOpcodes[command])(args); - unlock(); return res; } -void TownsAudioInterfaceIntern::setMusicVolume(int volume) { +void TownsAudioInterfaceInternal::setMusicVolume(int volume) { _musicVolume = CLIP(volume, 0, Audio::Mixer::kMaxMixerVolume); setVolumeIntern(_musicVolume, _sfxVolume); } -void TownsAudioInterfaceIntern::setSoundEffectVolume(int volume) { +void TownsAudioInterfaceInternal::setSoundEffectVolume(int volume) { _sfxVolume = CLIP(volume, 0, Audio::Mixer::kMaxMixerVolume); setVolumeIntern(_musicVolume, _sfxVolume); } -void TownsAudioInterfaceIntern::setSoundEffectChanMask(int mask) { +void TownsAudioInterfaceInternal::setSoundEffectChanMask(int mask) { _pcmSfxChanMask = mask >> 6; mask &= 0x3f; setVolumeChannelMasks(~mask, mask); } -void TownsAudioInterfaceIntern::nextTickEx(int32 *buffer, uint32 bufferSize) { +void TownsAudioInterfaceInternal::nextTickEx(int32 *buffer, uint32 bufferSize) { if (!_ready) return; + if (_updateOutputVol) + updateOutputVolumeInternal(); + for (uint32 i = 0; i < bufferSize; i++) { _timer += _tickLength; while (_timer > 0x514767) { @@ -551,12 +553,12 @@ void TownsAudioInterfaceIntern::nextTickEx(int32 *buffer, uint32 bufferSize) { } } -void TownsAudioInterfaceIntern::timerCallbackA() { +void TownsAudioInterfaceInternal::timerCallbackA() { if (_drv && _ready) _drv->timerCallback(0); } -void TownsAudioInterfaceIntern::timerCallbackB() { +void TownsAudioInterfaceInternal::timerCallbackB() { if (_ready) { if (_drv) _drv->timerCallback(1); @@ -564,62 +566,62 @@ void TownsAudioInterfaceIntern::timerCallbackB() { } } -int TownsAudioInterfaceIntern::intf_reset(va_list &args) { +int TownsAudioInterfaceInternal::intf_reset(va_list &args) { fmReset(); pcmReset(); callback(68); return 0; } -int TownsAudioInterfaceIntern::intf_keyOn(va_list &args) { +int TownsAudioInterfaceInternal::intf_keyOn(va_list &args) { int chan = va_arg(args, int); int note = va_arg(args, int); int velo = va_arg(args, int); return (chan & 0x40) ? pcmKeyOn(chan, note, velo) : fmKeyOn(chan, note, velo); } -int TownsAudioInterfaceIntern::intf_keyOff(va_list &args) { +int TownsAudioInterfaceInternal::intf_keyOff(va_list &args) { int chan = va_arg(args, int); return (chan & 0x40) ? pcmKeyOff(chan) : fmKeyOff(chan); } -int TownsAudioInterfaceIntern::intf_setPanPos(va_list &args) { +int TownsAudioInterfaceInternal::intf_setPanPos(va_list &args) { int chan = va_arg(args, int); int mode = va_arg(args, int); return (chan & 0x40) ? pcmSetPanPos(chan, mode) : fmSetPanPos(chan, mode); } -int TownsAudioInterfaceIntern::intf_setInstrument(va_list &args) { +int TownsAudioInterfaceInternal::intf_setInstrument(va_list &args) { int chan = va_arg(args, int); int instrId = va_arg(args, int); return (chan & 0x40) ? pcmSetInstrument(chan, instrId) : fmSetInstrument(chan, instrId); } -int TownsAudioInterfaceIntern::intf_loadInstrument(va_list &args) { +int TownsAudioInterfaceInternal::intf_loadInstrument(va_list &args) { int chanType = va_arg(args, int); int instrId = va_arg(args, int); uint8 *instrData = va_arg(args, uint8 *); return (chanType & 0x40) ? pcmLoadInstrument(instrId, instrData) : fmLoadInstrument(instrId, instrData); } -int TownsAudioInterfaceIntern::intf_setPitch(va_list &args) { +int TownsAudioInterfaceInternal::intf_setPitch(va_list &args) { int chan = va_arg(args, int); int16 pitch = (int16)(va_arg(args, int) & 0xffff); return (chan & 0x40) ? pcmSetPitch(chan, pitch) : fmSetPitch(chan, pitch); } -int TownsAudioInterfaceIntern::intf_setLevel(va_list &args) { +int TownsAudioInterfaceInternal::intf_setLevel(va_list &args) { int chan = va_arg(args, int); int lvl = va_arg(args, int); return (chan & 0x40) ? pcmSetLevel(chan, lvl) : fmSetLevel(chan, lvl); } -int TownsAudioInterfaceIntern::intf_chanOff(va_list &args) { +int TownsAudioInterfaceInternal::intf_chanOff(va_list &args) { int chan = va_arg(args, int); return (chan & 0x40) ? pcmChanOff(chan) : fmChanOff(chan); } -int TownsAudioInterfaceIntern::intf_writeReg(va_list &args) { +int TownsAudioInterfaceInternal::intf_writeReg(va_list &args) { int part = va_arg(args, int) ? 1 : 0; int reg = va_arg(args, int); int val = va_arg(args, int); @@ -630,7 +632,7 @@ int TownsAudioInterfaceIntern::intf_writeReg(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_writeRegBuffer(va_list &args) { +int TownsAudioInterfaceInternal::intf_writeRegBuffer(va_list &args) { int part = va_arg(args, int) ? 1 : 0; int reg = va_arg(args, int); int val = va_arg(args, int); @@ -642,7 +644,7 @@ int TownsAudioInterfaceIntern::intf_writeRegBuffer(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_readRegBuffer(va_list &args) { +int TownsAudioInterfaceInternal::intf_readRegBuffer(va_list &args) { int part = va_arg(args, int) ? 1 : 0; int reg = va_arg(args, int); uint8 *dst = va_arg(args, uint8 *); @@ -655,7 +657,7 @@ int TownsAudioInterfaceIntern::intf_readRegBuffer(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_setTimerA(va_list &args) { +int TownsAudioInterfaceInternal::intf_setTimerA(va_list &args) { int enable = va_arg(args, int); int tempo = va_arg(args, int); @@ -670,7 +672,7 @@ int TownsAudioInterfaceIntern::intf_setTimerA(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_setTimerB(va_list &args) { +int TownsAudioInterfaceInternal::intf_setTimerB(va_list &args) { int enable = va_arg(args, int); int tempo = va_arg(args, int); @@ -684,17 +686,17 @@ int TownsAudioInterfaceIntern::intf_setTimerB(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_enableTimerA(va_list &args) { +int TownsAudioInterfaceInternal::intf_enableTimerA(va_list &args) { bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x15); return 0; } -int TownsAudioInterfaceIntern::intf_enableTimerB(va_list &args) { +int TownsAudioInterfaceInternal::intf_enableTimerB(va_list &args) { bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x2a); return 0; } -int TownsAudioInterfaceIntern::intf_loadSamples(va_list &args) { +int TownsAudioInterfaceInternal::intf_loadSamples(va_list &args) { uint32 dest = va_arg(args, uint32); int size = va_arg(args, int); uint8 *src = va_arg(args, uint8*); @@ -717,7 +719,7 @@ int TownsAudioInterfaceIntern::intf_loadSamples(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_reserveEffectChannels(va_list &args) { +int TownsAudioInterfaceInternal::intf_reserveEffectChannels(va_list &args) { int numChan = va_arg(args, int); if (numChan > 8) return 3; @@ -749,7 +751,7 @@ int TownsAudioInterfaceIntern::intf_reserveEffectChannels(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_loadWaveTable(va_list &args) { +int TownsAudioInterfaceInternal::intf_loadWaveTable(va_list &args) { uint8 *data = va_arg(args, uint8 *); if (_numWaveTables > 127) return 3; @@ -776,7 +778,7 @@ int TownsAudioInterfaceIntern::intf_loadWaveTable(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_unloadWaveTable(va_list &args) { +int TownsAudioInterfaceInternal::intf_unloadWaveTable(va_list &args) { int id = va_arg(args, int); if (id == -1) { @@ -803,7 +805,7 @@ int TownsAudioInterfaceIntern::intf_unloadWaveTable(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_pcmPlayEffect(va_list &args) { +int TownsAudioInterfaceInternal::intf_pcmPlayEffect(va_list &args) { int chan = va_arg(args, int); int note = va_arg(args, int); int velo = va_arg(args, int); @@ -853,13 +855,13 @@ int TownsAudioInterfaceIntern::intf_pcmPlayEffect(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_pcmChanOff(va_list &args) { +int TownsAudioInterfaceInternal::intf_pcmChanOff(va_list &args) { int chan = va_arg(args, int); pcmChanOff(chan); return 0; } -int TownsAudioInterfaceIntern::intf_pcmEffectPlaying(va_list &args) { +int TownsAudioInterfaceInternal::intf_pcmEffectPlaying(va_list &args) { int chan = va_arg(args, int); if (chan < 0x40 || chan > 0x47) return 1; @@ -867,54 +869,54 @@ int TownsAudioInterfaceIntern::intf_pcmEffectPlaying(va_list &args) { return (_pcmChanEffectPlaying & _chanFlags[chan]) ? 1 : 0; } -int TownsAudioInterfaceIntern::intf_fmKeyOn(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmKeyOn(va_list &args) { int chan = va_arg(args, int); int note = va_arg(args, int); int velo = va_arg(args, int); return fmKeyOn(chan, note, velo); } -int TownsAudioInterfaceIntern::intf_fmKeyOff(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmKeyOff(va_list &args) { int chan = va_arg(args, int); return fmKeyOff(chan); } -int TownsAudioInterfaceIntern::intf_fmSetPanPos(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmSetPanPos(va_list &args) { int chan = va_arg(args, int); int mode = va_arg(args, int); return fmSetPanPos(chan, mode); } -int TownsAudioInterfaceIntern::intf_fmSetInstrument(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmSetInstrument(va_list &args) { int chan = va_arg(args, int); int instrId = va_arg(args, int); return fmSetInstrument(chan, instrId); } -int TownsAudioInterfaceIntern::intf_fmLoadInstrument(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmLoadInstrument(va_list &args) { int instrId = va_arg(args, int); uint8 *instrData = va_arg(args, uint8 *); return fmLoadInstrument(instrId, instrData); } -int TownsAudioInterfaceIntern::intf_fmSetPitch(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmSetPitch(va_list &args) { int chan = va_arg(args, int); uint16 freq = va_arg(args, int) & 0xffff; return fmSetPitch(chan, freq); } -int TownsAudioInterfaceIntern::intf_fmSetLevel(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmSetLevel(va_list &args) { int chan = va_arg(args, int); int lvl = va_arg(args, int); return fmSetLevel(chan, lvl); } -int TownsAudioInterfaceIntern::intf_fmReset(va_list &args) { +int TownsAudioInterfaceInternal::intf_fmReset(va_list &args) { fmReset(); return 0; } -int TownsAudioInterfaceIntern::intf_setOutputVolume(va_list &args) { +int TownsAudioInterfaceInternal::intf_setOutputVolume(va_list &args) { int chanType = va_arg(args, int); int left = va_arg(args, int); int right = va_arg(args, int); @@ -951,14 +953,14 @@ int TownsAudioInterfaceIntern::intf_setOutputVolume(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_resetOutputVolume(va_list &args) { +int TownsAudioInterfaceInternal::intf_resetOutputVolume(va_list &args) { memset(_outputLevel, 0, sizeof(_outputLevel)); _outputVolumeFlags = 0; updateOutputVolume(); return 0; } -int TownsAudioInterfaceIntern::intf_getOutputVolume(va_list &args) { +int TownsAudioInterfaceInternal::intf_getOutputVolume(va_list &args) { int chanType = va_arg(args, int); int *left = va_arg(args, int*); int *right = va_arg(args, int*); @@ -978,7 +980,7 @@ int TownsAudioInterfaceIntern::intf_getOutputVolume(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_setOutputMute(va_list &args) { +int TownsAudioInterfaceInternal::intf_setOutputMute(va_list &args) { int flags = va_arg(args, int); _outputVolumeFlags = flags; uint8 mute = flags & 3; @@ -1007,31 +1009,31 @@ int TownsAudioInterfaceIntern::intf_setOutputMute(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_cdaToggle(va_list &args) { +int TownsAudioInterfaceInternal::intf_cdaToggle(va_list &args) { //int mode = va_arg(args, int); //_unkMask = mode ? 0x7f : 0x3f; return 0; } -int TownsAudioInterfaceIntern::intf_getOutputVolume2(va_list &args) { +int TownsAudioInterfaceInternal::intf_getOutputVolume2(va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_getOutputMute (va_list &args) { +int TownsAudioInterfaceInternal::intf_getOutputMute (va_list &args) { return 0; } -int TownsAudioInterfaceIntern::intf_pcmUpdateEnvelopeGenerator(va_list &args) { +int TownsAudioInterfaceInternal::intf_pcmUpdateEnvelopeGenerator(va_list &args) { for (int i = 0; i < 8; i++) pcmUpdateEnvelopeGenerator(i); return 0; } -int TownsAudioInterfaceIntern::intf_notImpl(va_list &args) { +int TownsAudioInterfaceInternal::intf_notImpl(va_list &args) { return 4; } -void TownsAudioInterfaceIntern::fmReset() { +void TownsAudioInterfaceInternal::fmReset() { TownsPC98_FmSynth::reset(); _fmChanPlaying = 0; @@ -1059,7 +1061,7 @@ void TownsAudioInterfaceIntern::fmReset() { } } -int TownsAudioInterfaceIntern::fmKeyOn(int chan, int note, int velo) { +int TownsAudioInterfaceInternal::fmKeyOn(int chan, int note, int velo) { if (chan > 5) return 1; if (note < 12 || note > 107 || (velo & 0x80)) @@ -1139,7 +1141,7 @@ int TownsAudioInterfaceIntern::fmKeyOn(int chan, int note, int velo) { return 0; } -int TownsAudioInterfaceIntern::fmKeyOff(int chan) { +int TownsAudioInterfaceInternal::fmKeyOff(int chan) { if (chan > 5) return 1; _fmChanPlaying &= ~_chanFlags[chan]; @@ -1149,7 +1151,7 @@ int TownsAudioInterfaceIntern::fmKeyOff(int chan) { return 0; } -int TownsAudioInterfaceIntern::fmChanOff(int chan) { +int TownsAudioInterfaceInternal::fmChanOff(int chan) { if (chan > 5) return 1; _fmChanPlaying &= ~_chanFlags[chan]; @@ -1167,7 +1169,7 @@ int TownsAudioInterfaceIntern::fmChanOff(int chan) { return 0; } -int TownsAudioInterfaceIntern::fmSetPanPos(int chan, int value) { +int TownsAudioInterfaceInternal::fmSetPanPos(int chan, int value) { if (chan > 5) return 1; @@ -1186,7 +1188,7 @@ int TownsAudioInterfaceIntern::fmSetPanPos(int chan, int value) { return 0; } -int TownsAudioInterfaceIntern::fmSetInstrument(int chan, int instrId) { +int TownsAudioInterfaceInternal::fmSetInstrument(int chan, int instrId) { if (chan > 5) return 1; if (instrId > 127) @@ -1230,7 +1232,7 @@ int TownsAudioInterfaceIntern::fmSetInstrument(int chan, int instrId) { return 0; } -int TownsAudioInterfaceIntern::fmLoadInstrument(int instrId, const uint8 *data) { +int TownsAudioInterfaceInternal::fmLoadInstrument(int instrId, const uint8 *data) { if (instrId > 127) return 3; assert(data); @@ -1238,7 +1240,7 @@ int TownsAudioInterfaceIntern::fmLoadInstrument(int instrId, const uint8 *data) return 0; } -int TownsAudioInterfaceIntern::fmSetPitch(int chan, int pitch) { +int TownsAudioInterfaceInternal::fmSetPitch(int chan, int pitch) { if (chan > 5) return 1; @@ -1325,7 +1327,7 @@ int TownsAudioInterfaceIntern::fmSetPitch(int chan, int pitch) { return 0; } -int TownsAudioInterfaceIntern::fmSetLevel(int chan, int lvl) { +int TownsAudioInterfaceInternal::fmSetLevel(int chan, int lvl) { if (chan > 5) return 1; if (lvl > 127) @@ -1348,12 +1350,12 @@ int TownsAudioInterfaceIntern::fmSetLevel(int chan, int lvl) { return 0; } -void TownsAudioInterfaceIntern::bufferedWriteReg(uint8 part, uint8 regAddress, uint8 value) { +void TownsAudioInterfaceInternal::bufferedWriteReg(uint8 part, uint8 regAddress, uint8 value) { _fmSaveReg[part][regAddress] = value; writeReg(part, regAddress, value); } -void TownsAudioInterfaceIntern::pcmReset() { +void TownsAudioInterfaceInternal::pcmReset() { _pcmChanOut = 0; _pcmChanReserved = _pcmChanKeyPressed = _pcmChanEffectPlaying = _pcmChanKeyPlaying = 0; _numReservedChannels = 0; @@ -1381,7 +1383,7 @@ void TownsAudioInterfaceIntern::pcmReset() { } } -int TownsAudioInterfaceIntern::pcmKeyOn(int chan, int note, int velo) { +int TownsAudioInterfaceInternal::pcmKeyOn(int chan, int note, int velo) { if (chan < 0x40 || chan > 0x47) return 1; @@ -1452,7 +1454,7 @@ int TownsAudioInterfaceIntern::pcmKeyOn(int chan, int note, int velo) { return 0; } -int TownsAudioInterfaceIntern::pcmKeyOff(int chan) { +int TownsAudioInterfaceInternal::pcmKeyOff(int chan) { if (chan < 0x40 || chan > 0x47) return 1; @@ -1462,7 +1464,7 @@ int TownsAudioInterfaceIntern::pcmKeyOff(int chan) { return 0; } -int TownsAudioInterfaceIntern::pcmChanOff(int chan) { +int TownsAudioInterfaceInternal::pcmChanOff(int chan) { if (chan < 0x40 || chan > 0x47) return 1; @@ -1476,7 +1478,7 @@ int TownsAudioInterfaceIntern::pcmChanOff(int chan) { return 0; } -int TownsAudioInterfaceIntern::pcmSetPanPos(int chan, int mode) { +int TownsAudioInterfaceInternal::pcmSetPanPos(int chan, int mode) { if (chan > 0x47) return 1; if (mode & 0x80) @@ -1499,7 +1501,7 @@ int TownsAudioInterfaceIntern::pcmSetPanPos(int chan, int mode) { return 0; } -int TownsAudioInterfaceIntern::pcmSetInstrument(int chan, int instrId) { +int TownsAudioInterfaceInternal::pcmSetInstrument(int chan, int instrId) { if (chan > 0x47) return 1; if (instrId > 31) @@ -1509,7 +1511,7 @@ int TownsAudioInterfaceIntern::pcmSetInstrument(int chan, int instrId) { return 0; } -int TownsAudioInterfaceIntern::pcmLoadInstrument(int instrId, const uint8 *data) { +int TownsAudioInterfaceInternal::pcmLoadInstrument(int instrId, const uint8 *data) { if (instrId > 31) return 3; assert(data); @@ -1517,7 +1519,7 @@ int TownsAudioInterfaceIntern::pcmLoadInstrument(int instrId, const uint8 *data) return 0; } -int TownsAudioInterfaceIntern::pcmSetPitch(int chan, int pitch) { +int TownsAudioInterfaceInternal::pcmSetPitch(int chan, int pitch) { if (chan > 0x47) return 1; @@ -1547,7 +1549,7 @@ int TownsAudioInterfaceIntern::pcmSetPitch(int chan, int pitch) { return 0; } -int TownsAudioInterfaceIntern::pcmSetLevel(int chan, int lvl) { +int TownsAudioInterfaceInternal::pcmSetLevel(int chan, int lvl) { if (chan > 0x47) return 1; @@ -1576,7 +1578,7 @@ int TownsAudioInterfaceIntern::pcmSetLevel(int chan, int lvl) { return 0; } -void TownsAudioInterfaceIntern::pcmUpdateEnvelopeGenerator(int chan) { +void TownsAudioInterfaceInternal::pcmUpdateEnvelopeGenerator(int chan) { TownsAudio_PcmChannel *p = &_pcmChan[chan]; if (!p->envCurrentLevel) { _pcmChanKeyPlaying &= ~_chanFlags[chan]; @@ -1618,7 +1620,7 @@ void TownsAudioInterfaceIntern::pcmUpdateEnvelopeGenerator(int chan) { p->velo = (p->envCurrentLevel >> 8) << 1; } -void TownsAudioInterfaceIntern::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w) { +void TownsAudioInterfaceInternal::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w) { int8 diff = p->note - w->baseNote; uint16 r = w->rate + w->rateOffs; uint16 bl = 0; @@ -1647,7 +1649,16 @@ void TownsAudioInterfaceIntern::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, Towns p->step = (s * p->stepPitch) >> 14; } -void TownsAudioInterfaceIntern::updateOutputVolume() { +void TownsAudioInterfaceInternal::updateOutputVolume() { + // Avoid calls to g_system->getAudioCDManager() functions from the main thread + // since this can cause mutex lockups. + _updateOutputVol = true; +} + +void TownsAudioInterfaceInternal::updateOutputVolumeInternal() { + if (!_ready) + return; + // FM Towns seems to support volumes of 0 - 63 for each channel. // We recalculate sane values for our 0 to 255 volume range and // balance values for our -128 to 127 volume range @@ -1658,38 +1669,41 @@ void TownsAudioInterfaceIntern::updateOutputVolume() { int volume = (int)(((float)(maxVol * 255) / 63.0f)); int balance = maxVol ? (int)( ( ((int)_outputLevel[13] * (_outputMute[13] ^ 1) - _outputLevel[12] * (_outputMute[12] ^ 1)) * 127) / (float)maxVol) : 0; + Common::StackLock lock(_mutex); g_system->getAudioCDManager()->setVolume(volume); g_system->getAudioCDManager()->setBalance(balance); + + _updateOutputVol = false; } -TownsAudioInterfaceIntern *TownsAudioInterfaceIntern::_refInstance = 0; +TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::_refInstance = 0; -int TownsAudioInterfaceIntern::_refCount = 0; +int TownsAudioInterfaceInternal::_refCount = 0; -const uint8 TownsAudioInterfaceIntern::_chanFlags[] = { +const uint8 TownsAudioInterfaceInternal::_chanFlags[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; -const uint16 TownsAudioInterfaceIntern::_frequency[] = { +const uint16 TownsAudioInterfaceInternal::_frequency[] = { 0x028C, 0x02B4, 0x02DC, 0x030A, 0x0338, 0x0368, 0x039C, 0x03D4, 0x040E, 0x044A, 0x048C, 0x04D0 }; -const uint8 TownsAudioInterfaceIntern::_carrier[] = { +const uint8 TownsAudioInterfaceInternal::_carrier[] = { 0x10, 0x10, 0x10, 0x10, 0x30, 0x70, 0x70, 0xF0 }; -const uint8 TownsAudioInterfaceIntern::_fmDefaultInstrument[] = { +const uint8 TownsAudioInterfaceInternal::_fmDefaultInstrument[] = { 0x45, 0x4C, 0x45, 0x50, 0x49, 0x41, 0x4E, 0x4F, 0x01, 0x0A, 0x02, 0x01, 0x1E, 0x32, 0x05, 0x00, 0x9C, 0xDC, 0x9C, 0xDC, 0x07, 0x03, 0x14, 0x08, 0x00, 0x03, 0x05, 0x05, 0x55, 0x45, 0x27, 0xA7, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const uint16 TownsAudioInterfaceIntern::_pcmPhase1[] = { +const uint16 TownsAudioInterfaceInternal::_pcmPhase1[] = { 0x879B, 0x0F37, 0x1F58, 0x306E, 0x4288, 0x55B6, 0x6A08, 0x7F8F, 0x965E, 0xAE88, 0xC882, 0xE341 }; -const uint16 TownsAudioInterfaceIntern::_pcmPhase2[] = { +const uint16 TownsAudioInterfaceInternal::_pcmPhase2[] = { 0xFEFE, 0xF1A0, 0xE411, 0xD744, 0xCB2F, 0xBFC7, 0xB504, 0xAAE2, 0xA144, 0x9827, 0x8FAC }; @@ -1841,11 +1855,11 @@ void TownsAudio_WaveTable::clear() { } TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) { - _intf = TownsAudioInterfaceIntern::addNewRef(mixer, driver); + _intf = TownsAudioInterfaceInternal::addNewRef(mixer, driver); } TownsAudioInterface::~TownsAudioInterface() { - TownsAudioInterfaceIntern::releaseRef(); + TownsAudioInterfaceInternal::releaseRef(); _intf = 0; } @@ -1874,3 +1888,11 @@ void TownsAudioInterface::setSoundEffectVolume(int volume) { void TownsAudioInterface::setSoundEffectChanMask(int mask) { _intf->setSoundEffectChanMask(mask); } + +void TownsAudioInterface::lockInternal() { + _intf->lock(); +} + +void TownsAudioInterface::unlockInternal() { + _intf->unlock(); +} diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.h b/audio/softsynth/fmtowns_pc98/towns_audio.h index 2c58d46d0625..b00243f610a4 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.h +++ b/audio/softsynth/fmtowns_pc98/towns_audio.h @@ -25,7 +25,7 @@ #include "audio/mixer.h" -class TownsAudioInterfaceIntern; +class TownsAudioInterfaceInternal; class TownsAudioInterfacePluginDriver { public: @@ -48,8 +48,15 @@ class TownsAudioInterface { // The first 6 bits are the 6 fm channels. The next 8 bits are pcm channels. void setSoundEffectChanMask(int mask); + // These methods should not be needed in standard situations, since the mutex + // is handled internally. However, they may be required to avoid lockup situations + // if the code using this class has a mutex of its own (example for a lockup + // situation: imuse.cpp, line 78). + void lockInternal(); + void unlockInternal(); + private: - TownsAudioInterfaceIntern *_intf; + TownsAudioInterfaceInternal *_intf; }; #endif diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp index 3c7ce7d0e43e..00f0d43b980a 100644 --- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp @@ -835,19 +835,6 @@ const uint8 TownsMidiInputChannel::_programAdjustLevel[] = { MidiDriver_TOWNS::MidiDriver_TOWNS(Audio::Mixer *mixer) : _timerProc(0), _timerProcPara(0), _channels(0), _out(0), _chanState(0), _operatorLevelTable(0), _tickCounter1(0), _tickCounter2(0), _rand(1), _allocCurPos(0), _isOpen(false) { _intf = new TownsAudioInterface(mixer, this); -} - -MidiDriver_TOWNS::~MidiDriver_TOWNS() { - close(); - delete _intf; -} - -int MidiDriver_TOWNS::open() { - if (_isOpen) - return MERR_ALREADY_OPEN; - - if (!_intf->init()) - return MERR_CANNOT_CONNECT; _channels = new TownsMidiInputChannel*[32]; for (int i = 0; i < 32; i++) @@ -866,6 +853,38 @@ int MidiDriver_TOWNS::open() { } for (int i = 0; i < 64; i++) _operatorLevelTable[i << 5] = 0; +} + +MidiDriver_TOWNS::~MidiDriver_TOWNS() { + close(); + delete _intf; + + if (_channels) { + for (int i = 0; i < 32; i++) + delete _channels[i]; + delete[] _channels; + } + _channels = 0; + + if (_out) { + for (int i = 0; i < 6; i++) + delete _out[i]; + delete[] _out; + } + _out = 0; + + delete[] _chanState; + _chanState = 0; + delete[] _operatorLevelTable; + _operatorLevelTable = 0; +} + +int MidiDriver_TOWNS::open() { + if (_isOpen) + return MERR_ALREADY_OPEN; + + if (!_intf->init()) + return MERR_CANNOT_CONNECT; _intf->callback(0); @@ -876,9 +895,7 @@ int MidiDriver_TOWNS::open() { _intf->callback(33, 8); _intf->setSoundEffectChanMask(~0x3f); - _tickCounter1 = _tickCounter2 = 0; - _allocCurPos = 0; - _rand = 1; + _allocCurPos = 0; _isOpen = true; @@ -893,25 +910,6 @@ void MidiDriver_TOWNS::close() { setTimerCallback(0, 0); g_system->delayMillis(20); - - if (_channels) { - for (int i = 0; i < 32; i++) - delete _channels[i]; - delete[] _channels; - } - _channels = 0; - - if (_out) { - for (int i = 0; i < 6; i++) - delete _out[i]; - delete[] _out; - } - _out = 0; - - delete[] _chanState; - _chanState = 0; - delete[] _operatorLevelTable; - _operatorLevelTable = 0; } void MidiDriver_TOWNS::send(uint32 b) { diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index e35da91cbb0b..ee20068e7459 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -1145,7 +1145,7 @@ void TownsPC98_AudioDriver::loadMusicData(uint8 *data, bool loadPaused) { reset(); - lock(); + Common::StackLock lock(_mutex); uint8 *src_a = _trackPtr = _musicBuffer = data; for (uint8 i = 0; i < 3; i++) { @@ -1176,7 +1176,6 @@ void TownsPC98_AudioDriver::loadMusicData(uint8 *data, bool loadPaused) { _finishedChannelsFlag = _finishedSSGFlag = _finishedRhythmFlag = 0; _musicPlaying = (loadPaused ? false : true); - unlock(); } void TownsPC98_AudioDriver::loadSoundEffectData(uint8 *data, uint8 trackNum) { @@ -1195,17 +1194,16 @@ void TownsPC98_AudioDriver::loadSoundEffectData(uint8 *data, uint8 trackNum) { return; } - lock(); + Common::StackLock lock(_mutex); _sfxData = _sfxBuffer = data; _sfxOffsets[0] = READ_LE_UINT16(&_sfxData[(trackNum << 2)]); _sfxOffsets[1] = READ_LE_UINT16(&_sfxData[(trackNum << 2) + 2]); _sfxPlaying = true; _finishedSfxFlag = 0; - unlock(); } void TownsPC98_AudioDriver::reset() { - lock(); + Common::StackLock lock(_mutex); _musicPlaying = false; _sfxPlaying = false; @@ -1232,7 +1230,6 @@ void TownsPC98_AudioDriver::reset() { if (_rhythmChannel) _rhythmChannel->reset(); #endif - unlock(); } void TownsPC98_AudioDriver::fadeStep() { @@ -1263,37 +1260,30 @@ void TownsPC98_AudioDriver::fadeStep() { } } -void TownsPC98_AudioDriver::timerCallbackB() { - _sfxOffs = 0; - - if (_musicPlaying) { - _musicTickCounter++; - - for (int i = 0; i < _numChan; i++) { - if (_updateChannelsFlag & _channels[i]->_idFlag) { - _channels[i]->processEvents(); - _channels[i]->processFrequency(); - } - } +void TownsPC98_AudioDriver::pause() { + _musicPlaying = false; +} + +void TownsPC98_AudioDriver::cont() { + _musicPlaying = true; +} - for (int i = 0; i < _numSSG; i++) { - if (_updateSSGFlag & _ssgChannels[i]->_idFlag) { - _ssgChannels[i]->processEvents(); - _ssgChannels[i]->processFrequency(); - } - } +bool TownsPC98_AudioDriver::looping() { + return _looping == _updateChannelsFlag ? true : false; +} -#ifndef DISABLE_PC98_RHYTHM_CHANNEL - if (_hasPercussion) - if (_updateRhythmFlag & _rhythmChannel->_idFlag) - _rhythmChannel->processEvents(); -#endif - } +bool TownsPC98_AudioDriver::musicPlaying() { + return _musicPlaying; +} - toggleRegProtection(false); +void TownsPC98_AudioDriver::setMusicVolume(int volume) { + _musicVolume = volume; + setVolumeIntern(_musicVolume, _sfxVolume); +} - if (_finishedChannelsFlag == _updateChannelsFlag && _finishedSSGFlag == _updateSSGFlag && _finishedRhythmFlag == _updateRhythmFlag) - _musicPlaying = false; +void TownsPC98_AudioDriver::setSoundEffectVolume(int volume) { + _sfxVolume = volume; + setVolumeIntern(_musicVolume, _sfxVolume); } void TownsPC98_AudioDriver::timerCallbackA() { @@ -1321,15 +1311,37 @@ void TownsPC98_AudioDriver::timerCallbackA() { } } -void TownsPC98_AudioDriver::setMusicTempo(uint8 tempo) { - writeReg(0, 0x26, tempo); - writeReg(0, 0x27, 0x33); -} +void TownsPC98_AudioDriver::timerCallbackB() { + _sfxOffs = 0; -void TownsPC98_AudioDriver::setSfxTempo(uint16 tempo) { - writeReg(0, 0x24, tempo & 0xff); - writeReg(0, 0x25, tempo >> 8); - writeReg(0, 0x27, 0x33); + if (_musicPlaying) { + _musicTickCounter++; + + for (int i = 0; i < _numChan; i++) { + if (_updateChannelsFlag & _channels[i]->_idFlag) { + _channels[i]->processEvents(); + _channels[i]->processFrequency(); + } + } + + for (int i = 0; i < _numSSG; i++) { + if (_updateSSGFlag & _ssgChannels[i]->_idFlag) { + _ssgChannels[i]->processEvents(); + _ssgChannels[i]->processFrequency(); + } + } + +#ifndef DISABLE_PC98_RHYTHM_CHANNEL + if (_hasPercussion) + if (_updateRhythmFlag & _rhythmChannel->_idFlag) + _rhythmChannel->processEvents(); +#endif + } + + toggleRegProtection(false); + + if (_finishedChannelsFlag == _updateChannelsFlag && _finishedSSGFlag == _updateSSGFlag && _finishedRhythmFlag == _updateRhythmFlag) + _musicPlaying = false; } void TownsPC98_AudioDriver::startSoundEffect() { @@ -1352,6 +1364,16 @@ void TownsPC98_AudioDriver::startSoundEffect() { _sfxData = 0; } +void TownsPC98_AudioDriver::setMusicTempo(uint8 tempo) { + writeReg(0, 0x26, tempo); + writeReg(0, 0x27, 0x33); +} + +void TownsPC98_AudioDriver::setSfxTempo(uint16 tempo) { + writeReg(0, 0x24, tempo & 0xff); + writeReg(0, 0x25, tempo >> 8); + writeReg(0, 0x27, 0x33); +} const uint8 TownsPC98_AudioDriver::_drvTables[] = { // channel presets 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h index 46ee23895bcf..ff58482227d9 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h @@ -50,33 +50,19 @@ friend class TownsPC98_MusicChannelPCM; void fadeStep(); - void pause() { - _musicPlaying = false; - } - void cont() { - _musicPlaying = true; - } + void pause(); + void cont(); - void timerCallbackB(); + bool looping(); + bool musicPlaying(); + + void setMusicVolume(int volume); + void setSoundEffectVolume(int volume); + +private: void timerCallbackA(); + void timerCallbackB(); - bool looping() { - return _looping == _updateChannelsFlag ? true : false; - } - bool musicPlaying() { - return _musicPlaying; - } - - void setMusicVolume(int volume) { - _musicVolume = volume; - setVolumeIntern(_musicVolume, _sfxVolume); - } - void setSoundEffectVolume(int volume) { - _sfxVolume = volume; - setVolumeIntern(_musicVolume, _sfxVolume); - } - -protected: void startSoundEffect(); void setMusicTempo(uint8 tempo); diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index bc5aa32823e7..b09a9f65d197 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -861,7 +861,7 @@ TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) : _hasPercussion(type == kType86 ? true : false), _oprRates(0), _oprRateshift(0), _oprAttackDecay(0), _oprFrq(0), _oprSinTbl(0), _oprLevelOut(0), _oprDetune(0), _rtt(type == kTypeTowns ? 0x514767 : 0x5B8D80), _baserate(55125.0f / (float)mixer->getOutputRate()), - _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), _regProtectionFlag(false), _lock(0), _ready(false) { + _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), _regProtectionFlag(false), _ready(false) { memset(&_timers[0], 0, sizeof(ChipTimer)); memset(&_timers[1], 0, sizeof(ChipTimer)); @@ -928,7 +928,7 @@ bool TownsPC98_FmSynth::init() { } void TownsPC98_FmSynth::reset() { - lock(); + Common::StackLock lock(_mutex); for (int i = 0; i < _numChan; i++) { for (int ii = 0; ii < 4; ii++) _chanInternal[i].opr[ii]->reset(); @@ -948,14 +948,13 @@ void TownsPC98_FmSynth::reset() { if (_prc) _prc->reset(); #endif - unlock(); } void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { if (_regProtectionFlag || !_ready) return; - lock(); + Common::StackLock lock(_mutex); static const uint8 oprOrdr[] = { 0, 2, 1, 3 }; @@ -1137,7 +1136,6 @@ void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { default: warning("TownsPC98_FmSynth: UNKNOWN ADDRESS %d", regAddress); } - unlock(); } int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { @@ -1146,9 +1144,14 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { int32 *tmpStart = tmp; memset(tmp, 0, sizeof(int32) * numSamples); int32 samplesLeft = numSamples >> 1; - _lock |= 0x10000; - while (_ready && !(_lock & 0xffff) && samplesLeft) { + bool locked = false; + if (_ready) { + lock(); + locked = true; + } + + while (_ready && samplesLeft) { int32 render = samplesLeft; for (int i = 0; i < 2; i++) { @@ -1197,17 +1200,38 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { tmp += (render << 1); } - _lock &= ~0x10000; + if (locked) + unlock(); + delete[] tmpStart; return numSamples; } +bool TownsPC98_FmSynth::isStereo() const { + return true; +} + +bool TownsPC98_FmSynth::endOfData() const { + return false; +} + +int TownsPC98_FmSynth::getRate() const { + return _mixer->getOutputRate(); +} + +void TownsPC98_FmSynth::lock() { + _mutex.lock(); +} + +void TownsPC98_FmSynth::unlock() { + _mutex.unlock(); +} + void TownsPC98_FmSynth::deinit() { _ready = false; - while (_lock) - g_system->delayMillis(20); _mixer->stopHandle(_soundHandle); + Common::StackLock lock(_mutex); _timers[0].cb = _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback; } @@ -1216,7 +1240,7 @@ uint8 TownsPC98_FmSynth::readSSGStatus() { } void TownsPC98_FmSynth::setVolumeIntern(int volA, int volB) { - lock(); + Common::StackLock lock(_mutex); _volumeA = CLIP(volA, 0, Audio::Mixer::kMaxMixerVolume); _volumeB = CLIP(volB, 0, Audio::Mixer::kMaxMixerVolume); if (_ssg) @@ -1225,11 +1249,10 @@ void TownsPC98_FmSynth::setVolumeIntern(int volA, int volB) { if (_prc) _prc->setVolumeIntern(_volumeA, _volumeB); #endif - unlock(); } void TownsPC98_FmSynth::setVolumeChannelMasks(int channelMaskA, int channelMaskB) { - lock(); + Common::StackLock lock(_mutex); _volMaskA = channelMaskA; _volMaskB = channelMaskB; if (_ssg) @@ -1238,17 +1261,6 @@ void TownsPC98_FmSynth::setVolumeChannelMasks(int channelMaskA, int channelMaskB if (_prc) _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); #endif - unlock(); -} - -void TownsPC98_FmSynth::lock() { - _mutex.lock(); - _lock++; -} - -void TownsPC98_FmSynth::unlock() { - _mutex.unlock(); - _lock--; } void TownsPC98_FmSynth::generateTables() { diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index f7bcc9058509..a1b09abd3a99 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -69,15 +69,12 @@ class TownsPC98_FmSynth : public Audio::AudioStream { // AudioStream interface int readBuffer(int16 *buffer, const int numSamples); - bool isStereo() const { - return true; - } - bool endOfData() const { - return false; - } - int getRate() const { - return _mixer->getOutputRate(); - } + bool isStereo() const; + bool endOfData() const; + int getRate() const; + + void lock(); + void unlock(); protected: void deinit(); @@ -102,13 +99,12 @@ class TownsPC98_FmSynth : public Audio::AudioStream { void setVolumeIntern(int volA, int volB); void setVolumeChannelMasks(int channelMaskA, int channelMaskB); - void lock(); - void unlock(); - const int _numChan; const int _numSSG; const bool _hasPercussion; + Common::Mutex _mutex; + private: void generateTables(); void nextTick(int32 *buffer, uint32 bufferSize); @@ -182,9 +178,6 @@ class TownsPC98_FmSynth : public Audio::AudioStream { Audio::Mixer *_mixer; Audio::SoundHandle _soundHandle; - int _lock; - Common::Mutex _mutex; - #ifndef DISABLE_PC98_RHYTHM_CHANNEL static const uint8 _percussionData[]; #endif diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp index 5d49478cb078..15b2f657973f 100644 --- a/engines/scumm/player_towns.cpp +++ b/engines/scumm/player_towns.cpp @@ -581,11 +581,14 @@ Player_Towns_v2::Player_Towns_v2(ScummEngine *vm, Audio::Mixer *mixer, IMuse *im } Player_Towns_v2::~Player_Towns_v2() { - delete _intf; - _intf = 0; - + // Avoid lockup in imuse.cpp, line 78 + _intf->lockInternal(); if (_imuseDispose) delete _imuse; + _intf->unlockInternal(); + + delete _intf; + _intf = 0; delete[] _sblData; delete[] _soundOverride; From 2ef8e9a2025fb522825cd8b39af331a2faae2f1f Mon Sep 17 00:00:00 2001 From: athrxx Date: Fri, 20 May 2011 16:21:39 +0200 Subject: [PATCH 113/369] FM-TOWNS AUDIO: fix gcc warnings --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 4 ++-- audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 8 ++++---- audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 635f9354cc64..5161871601a3 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -1890,9 +1890,9 @@ void TownsAudioInterface::setSoundEffectChanMask(int mask) { } void TownsAudioInterface::lockInternal() { - _intf->lock(); + _intf->mutexLock(); } void TownsAudioInterface::unlockInternal() { - _intf->unlock(); + _intf->mutexUnlock(); } diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index b09a9f65d197..4336de9bdbf0 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -1147,7 +1147,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { bool locked = false; if (_ready) { - lock(); + mutexLock(); locked = true; } @@ -1201,7 +1201,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { } if (locked) - unlock(); + mutexUnlock(); delete[] tmpStart; @@ -1220,11 +1220,11 @@ int TownsPC98_FmSynth::getRate() const { return _mixer->getOutputRate(); } -void TownsPC98_FmSynth::lock() { +void TownsPC98_FmSynth::mutexLock() { _mutex.lock(); } -void TownsPC98_FmSynth::unlock() { +void TownsPC98_FmSynth::mutexUnlock() { _mutex.unlock(); } diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index a1b09abd3a99..6ea9815a7297 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -73,8 +73,8 @@ class TownsPC98_FmSynth : public Audio::AudioStream { bool endOfData() const; int getRate() const; - void lock(); - void unlock(); + void mutexLock(); + void mutexUnlock(); protected: void deinit(); From 0da3f8d8a5ecfef54d3580ae5db6a80f6ca2b77a Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 21 May 2011 16:01:44 +0200 Subject: [PATCH 114/369] SCI: Fix probable alt/shift mixup A check for alt was changed into this check for shift in the cleanup commit 906f0248317e1a4167190a666fe308a09334bfac. --- engines/sci/event.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index b015a6df7f35..74879f6c63d3 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -250,7 +250,7 @@ SciEvent EventManager::getScummVMEvent() { // When Ctrl AND Alt are pressed together with a regular key, Linux will give us control-key, Windows will give // us the actual key. My opinion is that windows is right, because under DOS the keys worked the same, anyway // we support the other case as well - if ((modifiers & Common::KBD_SHIFT) && input.character > 0 && input.character < 27) + if ((modifiers & Common::KBD_ALT) && input.character > 0 && input.character < 27) input.character += 96; // 0x01 -> 'a' if (getSciVersion() <= SCI_VERSION_1_MIDDLE) { From dd6b5698b181532b37cba41b1475b01813aadddc Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 21 May 2011 16:01:44 +0200 Subject: [PATCH 115/369] SCI: Fix probable alt/shift mixup A check for alt was changed into this check for shift in the cleanup commit 906f0248317e1a4167190a666fe308a09334bfac. (cherry picked from commit 0da3f8d8a5ecfef54d3580ae5db6a80f6ca2b77a) --- engines/sci/event.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 6b5ea64fc442..e8097e4e76c5 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -253,7 +253,7 @@ SciEvent EventManager::getScummVMEvent() { // When Ctrl AND Alt are pressed together with a regular key, Linux will give us control-key, Windows will give // us the actual key. My opinion is that windows is right, because under DOS the keys worked the same, anyway // we support the other case as well - if ((modifiers & Common::KBD_SHIFT) && input.character > 0 && input.character < 27) + if ((modifiers & Common::KBD_ALT) && input.character > 0 && input.character < 27) input.character += 96; // 0x01 -> 'a' if (getSciVersion() <= SCI_VERSION_1_MIDDLE) { From 92a71f7452b83b5491ba0862d8da9f23055fd5bd Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:45:51 +0100 Subject: [PATCH 116/369] DS: Port of changes from branch-1-2-0 that I should really have moved into the trunk. "DS: Prevent the command line help string from being included in the binary." 5f3a90a5f6911188b8d1ded08dbdf6d233e9eb7b "GUI: Allow disabling of Mass Add dialog. Saves a few Kb of binary size on the DS, and is not particularly useful on that platform." 240ff87cf4472538d25a1c5628c8d15f1791ab1c "GUI: Don't search for theme zip files on startup when running on the DS. Themes aren't supported anyway, and the search severely delays startup." fe3b18ce0df03117081e83d99f4a2cbd864d3286 --- base/commandLine.cpp | 6 +++--- gui/gui-manager.cpp | 9 +++++++++ gui/launcher.cpp | 3 +++ gui/massadd.cpp | 5 ++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index b74370df4c79..0808f87fb3d4 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -50,7 +50,7 @@ static const char USAGE_STRING[] = ; // DONT FIXME: DO NOT ORDER ALPHABETICALLY, THIS IS ORDERED BY IMPORTANCE/CATEGORY! :) -#if defined(__SYMBIAN32__) || defined(__GP32__) || defined(ANDROID) +#if defined(__SYMBIAN32__) || defined(__GP32__) || defined(ANDROID) || defined(__DS__) static const char HELP_STRING[] = "NoUsageString"; // save more data segment space #else static const char HELP_STRING[] = @@ -144,7 +144,7 @@ static void usage(const char *s, ...) { vsnprintf(buf, STRINGBUFLEN, s, va); va_end(va); -#if !(defined(__GP32__) || defined (__SYMBIAN32__)) +#if !(defined(__GP32__) || defined (__SYMBIAN32__) || defined(__DS__)) printf(USAGE_STRING, s_appName, buf, s_appName, s_appName); #endif exit(1); @@ -962,7 +962,7 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin // environment variable. This is weaker than a --savepath on the // command line, but overrides the default savepath, hence it is // handled here, just before the command line gets parsed. -#if !defined(_WIN32_WCE) && !defined(__GP32__) && !defined(ANDROID) +#if !defined(_WIN32_WCE) && !defined(__GP32__) && !defined(ANDROID) && !defined(__DS__) if (!settings.contains("savepath")) { const char *dir = getenv("SCUMMVM_SAVEPATH"); if (dir && *dir && strlen(dir) < MAXPATHLEN) { diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp index 19ca66b7b1d6..edab31dfaa18 100644 --- a/gui/gui-manager.cpp +++ b/gui/gui-manager.cpp @@ -77,6 +77,14 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), _stateIsSaved(false), ConfMan.registerDefault("gui_renderer", ThemeEngine::findModeConfigName(ThemeEngine::_defaultRendererMode)); ThemeEngine::GraphicsMode gfxMode = (ThemeEngine::GraphicsMode)ThemeEngine::findMode(ConfMan.get("gui_renderer")); +#ifdef __DS__ + // Searching for the theme file takes ~10 seconds on the DS. + // Disable this search here because external themes are not supported. + if (!loadNewTheme("builtin", gfxMode)) { + // Loading the built-in theme failed as well. Bail out + error("Failed to load any GUI theme, aborting"); + } +#else // Try to load the theme if (!loadNewTheme(themefile, gfxMode)) { // Loading the theme failed, try to load the built-in theme @@ -85,6 +93,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), _stateIsSaved(false), error("Failed to load any GUI theme, aborting"); } } +#endif } GuiManager::~GuiManager() { diff --git a/gui/launcher.cpp b/gui/launcher.cpp index aed57decd3c9..c80852c77bda 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -721,6 +721,8 @@ void LauncherDialog::updateListing() { void LauncherDialog::addGame() { int modifiers = g_system->getEventManager()->getModifierState(); + +#ifndef DISABLE_MASS_ADD const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0; if (massAdd) { @@ -749,6 +751,7 @@ void LauncherDialog::addGame() { updateButtons(); return; } +#endif // Allow user to add a new game to the list. // 1) show a dir selection dialog which lets the user pick the directory diff --git a/gui/massadd.cpp b/gui/massadd.cpp index c5af6c6bb4e4..ba841158a4b3 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -34,7 +34,7 @@ #include "gui/widget.h" #include "gui/widgets/list.h" - +#ifndef DISABLE_MASS_ADD namespace GUI { /* @@ -264,3 +264,6 @@ void MassAddDialog::handleTickle() { } // End of namespace GUI +#endif // DISABLE_MASS_ADD + + From a9b5d5e2bb2109b4ae08971421623c60df67a223 Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:46:59 +0100 Subject: [PATCH 117/369] DS: Fix some OPL data which was incorrectly freed from the main heap on the DS port --- audio/softsynth/opl/mame.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp index 5d790f924f14..e47529aad491 100644 --- a/audio/softsynth/opl/mame.cpp +++ b/audio/softsynth/opl/mame.cpp @@ -757,8 +757,10 @@ static int OPLOpenTable(void) { } static void OPLCloseTable(void) { +#ifndef __DS__ free(TL_TABLE); free(SIN_TABLE); +#endif free(AMS_TABLE); free(VIB_TABLE); free(ENV_CURVE); From 987d966acc72083d1c63926e719ee3198e24ec83 Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:48:44 +0100 Subject: [PATCH 118/369] DS: Prevent arrays from growing by 32 elements inside 'operator='. I'm concerned that this could increase memory usage on the DS, but too scared to make the change for all builds of ScummVM. --- common/array.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/array.h b/common/array.h index e3aab66dc699..383ecfcec616 100644 --- a/common/array.h +++ b/common/array.h @@ -182,7 +182,11 @@ class Array { delete[] _storage; _size = array._size; +#ifdef __DS__ + _capacity = _size; +#else _capacity = _size + 32; +#endif _storage = new T[_capacity]; assert(_storage); copy(array._storage, array._storage + _size, _storage); From 6fdec4dfac164fd131c4e36a67a789b4b17878a7 Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:51:13 +0100 Subject: [PATCH 119/369] DS: Various changes - Enable libmad - Remove forced include of scummsys.h, it caused problems in the forbidden symbols code. --- backends/platform/ds/arm9/makefile | 6 +++--- backends/platform/ds/arm9/source/dsmain.cpp | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 781738265cff..62473bca6cf5 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -75,7 +75,7 @@ else ifdef DS_BUILD_K else - # USE_MAD = 1 + USE_MAD = 1 endif endif endif @@ -245,7 +245,7 @@ ifdef USE_MAD DEFINES += -DUSE_MAD endif -DEFINES += -DREDUCE_MEMORY_USAGE -DDISABLE_DEBUGGER -DUSE_TEXT_CONSOLE -DDISABLE_MASS_ADD -DDISABLE_NES_APU +DEFINES += -DREDUCE_MEMORY_USAGE -DDISABLE_DEBUGGER -DUSE_TEXT_CONSOLE -DDISABLE_MASS_ADD -DDISABLE_NES_APU -DNDEBUG LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections @@ -259,7 +259,7 @@ BACKEND := ds INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \ -I$(portdir)/data -I$(portdir)/../commoninclude \ -I$(portdir)/source -I$(portdir)/source/mad \ - -I$(libndsdir)/include -include $(srcdir)/common/scummsys.h + -I$(libndsdir)/include -include $(portdir)/source/portdefs.h LIBS = -lm -L$(libndsdir)/lib -L$(portdir)/lib -lnds9 diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 303e5048739d..b94b43337344 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -579,7 +579,7 @@ void initGame() { for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) { if (!stricmp(gameName, gameList[r].gameId)) { s_currentGame = &gameList[r]; - // consolePrintf("Game list num: %d\n", s_currentGame); + // consolePrintf("Game list num: %d\n", r); } } } @@ -1672,8 +1672,7 @@ void addEventsToQueue() { if (!keyboardEnable) { - - if ((isScrollingWithDPad() || (indyFightState)) && (displayModeIs8Bit)) { + if ((!isScrollingWithDPad() || (indyFightState)) && (displayModeIs8Bit)) { // Controls specific to the control method if (s_currentGame->control == CONT_SKY) { From 3ce4b76b0db10fe878305ed1c8b84c6bb1ad4883 Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:54:20 +0100 Subject: [PATCH 120/369] DS/SAGA: Due to what looks like a compiler bug, having one Common::Array template inside another causes the DS build to crash during Common::Array::resize(). The only fix I can find is to make the internal byte array a normal malloc'ed() buffer. This way, the code runs fine. Need to dig into the assembly output for this to find out what's truly going on with the original code. --- engines/saga/font.cpp | 36 +++++++++++++++++++++++++++++++++++- engines/saga/font.h | 4 ++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp index 2434f7aad875..60e7c98e7ae0 100644 --- a/engines/saga/font.cpp +++ b/engines/saga/font.cpp @@ -43,14 +43,32 @@ Font::Font(SagaEngine *vm) : _vm(vm) { _fonts.resize(_vm->getFontsCount()); for (i = 0; i < _vm->getFontsCount(); i++) { +#ifdef __DS__ + _fonts[i].outline.font = NULL; + _fonts[i].normal.font = NULL; +#endif loadFont(&_fonts[i], _vm->getFontDescription(i)->fontResourceId); } + + _fontMapping = 0; } Font::~Font() { debug(8, "Font::~Font(): Freeing fonts."); + +#ifdef __DS__ + for (int i = 0; i < _vm->getFontsCount(); i++) { + if (_fonts[i].outline.font) { + free(_fonts[i].outline.font); + } + + if (_fonts[i].normal.font) { + free(_fonts[i].normal.font); + } + } +#endif } @@ -107,9 +125,17 @@ void Font::loadFont(FontData *font, uint32 fontResourceId) { error("Invalid font resource size"); } +#ifndef __DS__ font->normal.font.resize(fontResourceData.size() - FONT_DESCSIZE); memcpy(font->normal.font.getBuffer(), fontResourceData.getBuffer() + FONT_DESCSIZE, fontResourceData.size() - FONT_DESCSIZE); - +#else + if (font->normal.font) { + free(font->normal.font); + } + + font->normal.font = (byte *) malloc(fontResourceData.size() - FONT_DESCSIZE); + memcpy(font->normal.font, fontResourceData.getBuffer() + FONT_DESCSIZE, fontResourceData.size() - FONT_DESCSIZE); +#endif // Create outline font style createOutline(font); @@ -153,7 +179,15 @@ void Font::createOutline(FontData *font) { font->outline.header.rowLength = newRowLength; // Allocate new font representation storage +#ifdef __DS__ + if (font->outline.font) { + free(font->outline.font); + } + + font->outline.font = (byte *) calloc(newRowLength * font->outline.header.charHeight, 1); +#else font->outline.font.resize(newRowLength * font->outline.header.charHeight); +#endif // Generate outline font representation diff --git a/engines/saga/font.h b/engines/saga/font.h index 6f66545756a9..57e8278c467e 100644 --- a/engines/saga/font.h +++ b/engines/saga/font.h @@ -120,7 +120,11 @@ struct FontCharEntry { struct FontStyle { FontHeader header; FontCharEntry fontCharEntry[256]; +#ifndef __DS__ ByteArray font; +#else + byte* font; +#endif }; struct FontData { From f1903004c06de13e15d3b338986dc0212485f09f Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:55:36 +0100 Subject: [PATCH 121/369] GUI: Prevent the GUI code from incorrectly reloading the theme when the builtin theme is used. --- gui/options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 547ab0f3c62c..d2369b9764d8 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -141,8 +141,8 @@ void OptionsDialog::init() { _subSpeedDesc = 0; _subSpeedSlider = 0; _subSpeedLabel = 0; - _oldTheme = ConfMan.get("gui_theme"); - + _oldTheme = g_gui.theme()->getThemeId(); + // Retrieve game GUI options _guioptions = 0; if (ConfMan.hasKey("guioptions", _domain)) { From 4076a0466d67d42f093e3e73a30ea48e1e1d59e9 Mon Sep 17 00:00:00 2001 From: agent-q Date: Sat, 21 May 2011 15:56:42 +0100 Subject: [PATCH 122/369] GUI/DS: Make 99 the maximum number of save slots displayed on the GMM load/save screens on the DS port. --- gui/saveload.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 41b6018e3bec..9e3c9231f2ae 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -362,8 +362,19 @@ void SaveLoadChooser::updateSaveList() { } // Fill the rest of the save slots with empty saves + + int maximumSaveSlots = (*_plugin)->getMaximumSaveSlot(); + +#ifdef __DS__ + // Low memory on the DS means too many save slots are impractical, so limit + // the maximum here. + if (maximumSaveSlots > 99) { + maximumSaveSlots = 99; + } +#endif + Common::String emptyDesc; - for (int i = curSlot; i <= (*_plugin)->getMaximumSaveSlot(); i++) { + for (int i = curSlot; i <= maximumSaveSlots; i++) { saveNames.push_back(emptyDesc); SaveStateDescriptor dummySave(i, ""); _saveList.push_back(dummySave); From 5838ef6719f5658dfcb381fbec1ddb7625db58cc Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 13 May 2011 21:09:31 +0300 Subject: [PATCH 123/369] SWORD25: Fix compilation when libvorbis is not present (cherry picked from commit 2d3ad096ab92a6ddcd2b14436937649bbabcd12f) --- audio/decoders/vorbis.h | 1 + engines/sword25/sfx/soundengine.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/audio/decoders/vorbis.h b/audio/decoders/vorbis.h index 51d0b82d5fac..8f02b6e43a11 100644 --- a/audio/decoders/vorbis.h +++ b/audio/decoders/vorbis.h @@ -36,6 +36,7 @@ * - scumm * - sword1 * - sword2 + * - sword25 * - touche * - tucker */ diff --git a/engines/sword25/sfx/soundengine.cpp b/engines/sword25/sfx/soundengine.cpp index 08f0f5b4ae57..80bc5bce3bc8 100644 --- a/engines/sword25/sfx/soundengine.cpp +++ b/engines/sword25/sfx/soundengine.cpp @@ -154,13 +154,17 @@ bool SoundEngine::playSound(const Common::String &fileName, SOUND_TYPES type, fl uint SoundEngine::playSoundEx(const Common::String &fileName, SOUND_TYPES type, float volume, float pan, bool loop, int loopStart, int loopEnd, uint layer) { Common::SeekableReadStream *in = Kernel::getInstance()->getPackage()->getStream(fileName); +#ifdef USE_VORBIS Audio::SeekableAudioStream *stream = Audio::makeVorbisStream(in, DisposeAfterUse::YES); +#endif uint id; SndHandle *handle = getHandle(&id); debugC(1, kDebugSound, "SoundEngine::playSoundEx(%s, %d, %f, %f, %d, %d, %d, %d)", fileName.c_str(), type, volume, pan, loop, loopStart, loopEnd, layer); +#ifdef USE_VORBIS _mixer->playStream(getType(type), &(handle->handle), stream, -1, (byte)(volume * 255), (int8)(pan * 127)); +#endif return id; } From 9cbc36069358359724a7ecc7bdb3d553b32ee86d Mon Sep 17 00:00:00 2001 From: strangerke Date: Sun, 22 May 2011 02:31:08 +0200 Subject: [PATCH 124/369] TSAGE: Fix bug "Scene 2100: Examining the middle console triggers an assertion: "./engines/tsage/globals.h:84: bool tSage::Globals::getFlag(int) const: Assertion `(flagNum > 0) && (flagNum < 256)' failed."" --- engines/tsage/globals.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index bec05a3c9a45..6b3df587b685 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -73,15 +73,15 @@ class Globals : public SavedObject { void reset(); void setFlag(int flagNum) { - assert((flagNum > 0) && (flagNum < MAX_FLAGS)); + assert((flagNum >= 0) && (flagNum < MAX_FLAGS)); _flags[flagNum] = true; } void clearFlag(int flagNum) { - assert((flagNum > 0) && (flagNum < MAX_FLAGS)); + assert((flagNum >= 0) && (flagNum < MAX_FLAGS)); _flags[flagNum] = false; } bool getFlag(int flagNum) const { - assert((flagNum > 0) && (flagNum < MAX_FLAGS)); + assert((flagNum >= 0) && (flagNum < MAX_FLAGS)); return _flags[flagNum]; } From 041a08b7c04d64858c35baabefa6c0a133ea11d2 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sun, 22 May 2011 09:08:33 +0200 Subject: [PATCH 125/369] TSAGE: Fix bug "Scene 4150: Using the duck produces the message, "You don't need to use your stunner,[...]" --- engines/tsage/ringworld_scenes5.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index cda69b859f80..fc7362c38076 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -2978,7 +2978,7 @@ Scene4150::Scene4150() : _hotspot11(0, CURSOR_LOOK, 4150, 6, CURSOR_USE, 4150, 29, LIST_END), _hotspot12(0, CURSOR_LOOK, 4150, 7, CURSOR_USE, 4150, 29, LIST_END), _hotspot17(0, CURSOR_LOOK, 4150, 10, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), - _hotspot18(0, CURSOR_LOOK, 4150, 11, CURSOR_USE, 4150, 32, OBJECT_STUNNER, 4150, 27, LIST_END), + _hotspot18(0, CURSOR_LOOK, 4150, 11, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), _hotspot19(0, CURSOR_LOOK, 4150, 12, CURSOR_USE, 4150, 29, LIST_END), _hotspot20(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), _hotspot21(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), From d2a55b42c938ef7a3ae19ff9fd8d6d2d5a727756 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 22 May 2011 12:46:57 +0100 Subject: [PATCH 126/369] ENGINES: Further unify engine names --- AUTHORS | 66 ++++++++++++------------- devtools/credits.pl | 76 ++++++++++++++-------------- engines/cine/detection.cpp | 2 +- engines/cruise/detection.cpp | 2 +- engines/draci/detection.cpp | 2 +- engines/lastexpress/detection.cpp | 2 +- engines/lure/detection.cpp | 2 +- engines/queen/queen.cpp | 2 +- engines/sky/detection.cpp | 2 +- engines/sword1/detection.cpp | 2 +- engines/sword2/sword2.cpp | 2 +- engines/sword25/detection.cpp | 2 +- engines/teenagent/detection.cpp | 2 +- gui/credits.h | 82 +++++++++++++++---------------- 14 files changed, 123 insertions(+), 123 deletions(-) diff --git a/AUTHORS b/AUTHORS index 6bb85454a5bd..d2991127d325 100644 --- a/AUTHORS +++ b/AUTHORS @@ -49,40 +49,18 @@ ScummVM Team Oliver Kiehl - (retired) Ludvig Strigeus - (retired) - Beneath a Steel Sky: - Robert Goeffringmann - (retired) - Oliver Kiehl - (retired) - Joost Peters - - Broken Sword: - Fabio Battaglia - PSX version support - Thierry Crozat - Mac version support - Robert Goeffringmann - (retired) - - Broken Sword II: - Torbjorn Andersson - Fabio Battaglia - PSX version support - Jonathan Gray - (retired) - - Broken Sword 2.5: - Eugene Sandulenko - Filippos Karapetis - Max Horn - Paul Gilbert - Torbjorn Andersson - - Cinematique evo 1: + Cine: Vincent Hamm - (retired) Pawel Kolodziejski Gregory Montoir Kari Salminen Eugene Sandulenko - Cinematique evo 2: + CruisE: Paul Gilbert Vincent Hamm - (retired) - Draci Historie: + Draci: Denis Kasak Robert Spalek @@ -90,11 +68,6 @@ ScummVM Team Filippos Karapetis Pawel Kolodziejski - Flight of the Amazon Queen: - David Eriksson - (retired) - Gregory Montoir - Joost Peters - Gob: Torbjorn Andersson Arnaud Boutonne @@ -118,12 +91,12 @@ ScummVM Team Gregory Montoir Johannes Schickel - Last Express: + Lastexpress: Matthew Hoops Jordi Vilalta Prat Julien Templier - Lure of the Temptress: + Lure: Paul Gilbert M4: @@ -147,6 +120,11 @@ ScummVM Team Parallaction: peres + Queen: + David Eriksson - (retired) + Gregory Montoir + Joost Peters + SAGA: Torbjorn Andersson Filippos Karapetis @@ -164,7 +142,29 @@ ScummVM Team Jordi Vilalta Prat Lars Skovlund - Teen Agent: + Sky: + Robert Goeffringmann - (retired) + Oliver Kiehl - (retired) + Joost Peters + + Sword1: + Fabio Battaglia - PSX version support + Thierry Crozat - Mac version support + Robert Goeffringmann - (retired) + + Sword2: + Torbjorn Andersson + Fabio Battaglia - PSX version support + Jonathan Gray - (retired) + + Sword25: + Eugene Sandulenko + Filippos Karapetis + Max Horn + Paul Gilbert + Torbjorn Andersson + + TeenAgent: Robert Megone - Help with callback rewriting Vladimir Menshakov diff --git a/devtools/credits.pl b/devtools/credits.pl index f515844e4d40..0f07641aaee6 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -500,33 +500,7 @@ sub add_paragraph { add_person("Ludvig Strigeus", "ludde", "(retired)"); end_section(); - begin_section("Beneath a Steel Sky"); - add_person("Robert Göffringmann", "lavosspawn", "(retired)"); - add_person("Oliver Kiehl", "olki", "(retired)"); - add_person("Joost Peters", "joostp", ""); - end_section(); - - begin_section("Broken Sword"); - add_person("Fabio Battaglia", "Hkz", "PSX version support"); - add_person("Thierry Crozat", "criezy", "Mac version support"); - add_person("Robert Göffringmann", "lavosspawn", "(retired)"); - end_section(); - - begin_section("Broken Sword II"); - add_person("Torbjörn Andersson", "eriktorbjorn", ""); - add_person("Fabio Battaglia", "Hkz", "PSX version support"); - add_person("Jonathan Gray", "khalek", "(retired)"); - end_section(); - - begin_section("Broken Sword 2.5"); - add_person("Eugene Sandulenko", "sev", ""); - add_person("Filippos Karapetis", "[md5]", ""); - add_person("Max Horn", "Fingolfin", ""); - add_person("Paul Gilbert", "dreammaster", ""); - add_person("Torbjörn Andersson", "eriktorbjorn", ""); - end_section(); - - begin_section("Cinematique evo 1"); + begin_section("Cine"); add_person("Vincent Hamm", "yaz0r", "(retired)"); add_person("Paweł Kołodziejski", "aquadran", ""); add_person("Gregory Montoir", "cyx", ""); @@ -534,12 +508,12 @@ sub add_paragraph { add_person("Eugene Sandulenko", "sev", ""); end_section(); - begin_section("Cinematique evo 2"); + begin_section("CruisE"); add_person("Paul Gilbert", "dreammaster", ""); add_person("Vincent Hamm", "yaz0r", "(retired)"); end_section(); - begin_section("Draci Historie"); + begin_section("Draci"); add_person("Denis Kasak", "dkasak13", ""); add_person("Robert Špalek", "spalek", ""); end_section(); @@ -549,12 +523,6 @@ sub add_paragraph { add_person("Paweł Kołodziejski", "aquadran", ""); end_section(); - begin_section("Flight of the Amazon Queen"); - add_person("David Eriksson", "twogood", "(retired)"); - add_person("Gregory Montoir", "cyx", ""); - add_person("Joost Peters", "joostp", ""); - end_section(); - begin_section("Gob"); add_person("Torbjörn Andersson", "eriktorbjorn", ""); add_person("Arnaud Boutonné", "Strangerke", ""); @@ -582,13 +550,13 @@ sub add_paragraph { add_person("Johannes Schickel", "LordHoto", ""); end_section(); - begin_section("Last Express"); + begin_section("Lastexpress"); add_person("Matthew Hoops", "clone2727", ""); add_person("Jordi Vilalta Prat", "jvprat", ""); add_person("Julien Templier", "littleboy", ""); end_section(); - begin_section("Lure of the Temptress"); + begin_section("Lure"); add_person("Paul Gilbert", "dreammaster", ""); end_section(); @@ -617,6 +585,12 @@ sub add_paragraph { add_person("", "peres", ""); end_section(); + begin_section("Queen"); + add_person("David Eriksson", "twogood", "(retired)"); + add_person("Gregory Montoir", "cyx", ""); + add_person("Joost Peters", "joostp", ""); + end_section(); + begin_section("SAGA"); add_person("Torbjörn Andersson", "eriktorbjorn", ""); add_person("Filippos Karapetis", "[md5]", ""); @@ -636,7 +610,33 @@ sub add_paragraph { add_person("Lars Skovlund", "lskovlun", ""); end_section(); - begin_section("Teen Agent"); + begin_section("Sky"); + add_person("Robert Göffringmann", "lavosspawn", "(retired)"); + add_person("Oliver Kiehl", "olki", "(retired)"); + add_person("Joost Peters", "joostp", ""); + end_section(); + + begin_section("Sword1"); + add_person("Fabio Battaglia", "Hkz", "PSX version support"); + add_person("Thierry Crozat", "criezy", "Mac version support"); + add_person("Robert Göffringmann", "lavosspawn", "(retired)"); + end_section(); + + begin_section("Sword2"); + add_person("Torbjörn Andersson", "eriktorbjorn", ""); + add_person("Fabio Battaglia", "Hkz", "PSX version support"); + add_person("Jonathan Gray", "khalek", "(retired)"); + end_section(); + + begin_section("Sword25"); + add_person("Eugene Sandulenko", "sev", ""); + add_person("Filippos Karapetis", "[md5]", ""); + add_person("Max Horn", "Fingolfin", ""); + add_person("Paul Gilbert", "dreammaster", ""); + add_person("Torbjörn Andersson", "eriktorbjorn", ""); + end_section(); + + begin_section("TeenAgent"); add_person("Robert Megone", "sanguine", "Help with callback rewriting"); add_person("Vladimir Menshakov", "whoozle", ""); end_section(); diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index 262798a34e95..0ef2c87288d2 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -90,7 +90,7 @@ class CineMetaEngine : public AdvancedMetaEngine { CineMetaEngine() : AdvancedMetaEngine(detectionParams) {} virtual const char *getName() const { - return "Cinematique evo 1"; + return "Cine"; } virtual const char *getOriginalCopyright() const { diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index 4aaaf03e2912..3bd0c1f76f90 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -247,7 +247,7 @@ class CruiseMetaEngine : public AdvancedMetaEngine { CruiseMetaEngine() : AdvancedMetaEngine(detectionParams) {} virtual const char *getName() const { - return "Cinematique evo 2"; + return "CruisE"; } virtual const char *getOriginalCopyright() const { diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index 572ecce77ba3..d3483eb5a4ec 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -113,7 +113,7 @@ class DraciMetaEngine : public AdvancedMetaEngine { DraciMetaEngine() : AdvancedMetaEngine(detectionParams) {} virtual const char *getName() const { - return "Draci Historie"; + return "Draci"; } virtual const char *getOriginalCopyright() const { diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp index bfcb415da114..7c7c6b0a3619 100644 --- a/engines/lastexpress/detection.cpp +++ b/engines/lastexpress/detection.cpp @@ -207,7 +207,7 @@ class LastExpressMetaEngine : public AdvancedMetaEngine { LastExpressMetaEngine() : AdvancedMetaEngine(detectionParams) {} const char *getName() const { - return "Last Express"; + return "Lastexpress"; } const char *getOriginalCopyright() const { diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp index a69300ee2f37..4d03148e310c 100644 --- a/engines/lure/detection.cpp +++ b/engines/lure/detection.cpp @@ -205,7 +205,7 @@ class LureMetaEngine : public AdvancedMetaEngine { LureMetaEngine() : AdvancedMetaEngine(detectionParams) {} virtual const char *getName() const { - return "Lure of the Temptress"; + return "Lure"; } virtual const char *getOriginalCopyright() const { diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 97f757c418a0..3c1826cd69ee 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -69,7 +69,7 @@ class QueenMetaEngine : public MetaEngine { }; const char *QueenMetaEngine::getName() const { - return "Flight of the Amazon Queen"; + return "Queen"; } const char *QueenMetaEngine::getOriginalCopyright() const { diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp index 21921f21543c..6844d2eacb09 100644 --- a/engines/sky/detection.cpp +++ b/engines/sky/detection.cpp @@ -79,7 +79,7 @@ class SkyMetaEngine : public MetaEngine { }; const char *SkyMetaEngine::getName() const { - return "Beneath a Steel Sky"; + return "Sky"; } const char *SkyMetaEngine::getOriginalCopyright() const { diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp index 9fb6cbb76e99..8ffd96d30817 100644 --- a/engines/sword1/detection.cpp +++ b/engines/sword1/detection.cpp @@ -79,7 +79,7 @@ static const char *g_filesToCheck[NUM_FILES_TO_CHECK] = { // these files have to class SwordMetaEngine : public MetaEngine { public: virtual const char *getName() const { - return "Broken Sword"; + return "Sword1"; } virtual const char *getOriginalCopyright() const { return "Broken Sword Games (C) Revolution"; diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 47c9b1616e07..bc34e1523694 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -76,7 +76,7 @@ static const GameSettings sword2_settings[] = { class Sword2MetaEngine : public MetaEngine { public: virtual const char *getName() const { - return "Broken Sword II"; + return "Sword2"; } virtual const char *getOriginalCopyright() const { return "Broken Sword Games (C) Revolution"; diff --git a/engines/sword25/detection.cpp b/engines/sword25/detection.cpp index caa1cf51ac31..fd5820d508a5 100644 --- a/engines/sword25/detection.cpp +++ b/engines/sword25/detection.cpp @@ -102,7 +102,7 @@ class Sword25MetaEngine : public AdvancedMetaEngine { Sword25MetaEngine() : AdvancedMetaEngine(detectionParams) {} virtual const char *getName() const { - return "Broken Sword 2.5"; + return "Sword25"; } virtual const char *getOriginalCopyright() const { diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp index 4784e2fb7e80..5012e6af65c2 100644 --- a/engines/teenagent/detection.cpp +++ b/engines/teenagent/detection.cpp @@ -113,7 +113,7 @@ class TeenAgentMetaEngine : public AdvancedMetaEngine { } virtual const char *getName() const { - return "Teen Agent"; + return "TeenAgent"; } virtual const char *getOriginalCopyright() const { diff --git a/gui/credits.h b/gui/credits.h index a22c0b09419b..a98fddd33933 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -62,36 +62,7 @@ static const char *credits[] = { "C0""Ludvig Strigeus", "C2""(retired)", "", -"C1""Beneath a Steel Sky", -"C0""Robert G\366ffringmann", -"C2""(retired)", -"C0""Oliver Kiehl", -"C2""(retired)", -"C0""Joost Peters", -"", -"C1""Broken Sword", -"C0""Fabio Battaglia", -"C2""PSX version support", -"C0""Thierry Crozat", -"C2""Mac version support", -"C0""Robert G\366ffringmann", -"C2""(retired)", -"", -"C1""Broken Sword II", -"C0""Torbj\366rn Andersson", -"C0""Fabio Battaglia", -"C2""PSX version support", -"C0""Jonathan Gray", -"C2""(retired)", -"", -"C1""Broken Sword 2.5", -"C0""Eugene Sandulenko", -"C0""Filippos Karapetis", -"C0""Max Horn", -"C0""Paul Gilbert", -"C0""Torbj\366rn Andersson", -"", -"C1""Cinematique evo 1", +"C1""Cine", "C0""Vincent Hamm", "C2""(retired)", "C0""Pawel Kolodziejski", @@ -99,12 +70,12 @@ static const char *credits[] = { "C0""Kari Salminen", "C0""Eugene Sandulenko", "", -"C1""Cinematique evo 2", +"C1""CruisE", "C0""Paul Gilbert", "C0""Vincent Hamm", "C2""(retired)", "", -"C1""Draci Historie", +"C1""Draci", "C0""Denis Kasak", "C0""Robert Spalek", "", @@ -112,12 +83,6 @@ static const char *credits[] = { "C0""Filippos Karapetis", "C0""Pawel Kolodziejski", "", -"C1""Flight of the Amazon Queen", -"C0""David Eriksson", -"C2""(retired)", -"C0""Gregory Montoir", -"C0""Joost Peters", -"", "C1""Gob", "C0""Torbj\366rn Andersson", "C0""Arnaud Boutonn\351", @@ -142,12 +107,12 @@ static const char *credits[] = { "C0""Gregory Montoir", "C0""Johannes Schickel", "", -"C1""Last Express", +"C1""Lastexpress", "C0""Matthew Hoops", "C0""Jordi Vilalta Prat", "C0""Julien Templier", "", -"C1""Lure of the Temptress", +"C1""Lure", "C0""Paul Gilbert", "", "C1""M4", @@ -171,6 +136,12 @@ static const char *credits[] = { "C1""Parallaction", "C0""peres", "", +"C1""Queen", +"C0""David Eriksson", +"C2""(retired)", +"C0""Gregory Montoir", +"C0""Joost Peters", +"", "C1""SAGA", "C0""Torbj\366rn Andersson", "C0""Filippos Karapetis", @@ -188,7 +159,36 @@ static const char *credits[] = { "C0""Jordi Vilalta Prat", "C0""Lars Skovlund", "", -"C1""Teen Agent", +"C1""Sky", +"C0""Robert G\366ffringmann", +"C2""(retired)", +"C0""Oliver Kiehl", +"C2""(retired)", +"C0""Joost Peters", +"", +"C1""Sword1", +"C0""Fabio Battaglia", +"C2""PSX version support", +"C0""Thierry Crozat", +"C2""Mac version support", +"C0""Robert G\366ffringmann", +"C2""(retired)", +"", +"C1""Sword2", +"C0""Torbj\366rn Andersson", +"C0""Fabio Battaglia", +"C2""PSX version support", +"C0""Jonathan Gray", +"C2""(retired)", +"", +"C1""Sword25", +"C0""Eugene Sandulenko", +"C0""Filippos Karapetis", +"C0""Max Horn", +"C0""Paul Gilbert", +"C0""Torbj\366rn Andersson", +"", +"C1""TeenAgent", "C0""Robert Megone", "C2""Help with callback rewriting", "C0""Vladimir Menshakov", From 3556875c4922e9172c1eff6c4d929f1f80aa1254 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 22 May 2011 21:59:16 +1000 Subject: [PATCH 127/369] SWORD25: Created proxy class that presents ScumMVM settings as a valid config.lua file --- engines/sword25/util/lua/lauxlib.cpp | 39 ++++++---- engines/sword25/util/lua/scummvm_file.cpp | 93 +++++++++++++++++++++++ engines/sword25/util/lua/scummvm_file.h | 49 ++++++++++++ 3 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 engines/sword25/util/lua/scummvm_file.cpp create mode 100644 engines/sword25/util/lua/scummvm_file.h diff --git a/engines/sword25/util/lua/lauxlib.cpp b/engines/sword25/util/lua/lauxlib.cpp index ce61827e0f93..3b54cf98f1e8 100644 --- a/engines/sword25/util/lua/lauxlib.cpp +++ b/engines/sword25/util/lua/lauxlib.cpp @@ -22,7 +22,8 @@ #include "lua.h" #include "lauxlib.h" - +#include "scummvm_file.h" +#include "common\textconsole.h" #define FREELIST_REF 0 /* free list of references */ @@ -520,7 +521,7 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { typedef struct LoadF { int extraline; - FILE *f; + Sword25::Sword25FileProxy *f; char buff[LUAL_BUFFERSIZE]; } LoadF; @@ -533,8 +534,8 @@ static const char *getF (lua_State *L, void *ud, size_t *size) { *size = 1; return "\n"; } - if (feof(lf->f)) return NULL; - *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); + if (lf->f->eof()) return NULL; + *size = lf->f->read(lf->buff, 1, sizeof(lf->buff)); return (*size > 0) ? lf->buff : NULL; } @@ -551,9 +552,13 @@ static int errfile (lua_State *L, const char *what, int fnameindex) { LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { LoadF lf; int status, readstatus; - int c; +// int c; int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; + + lua_pushfstring(L, "@%s", filename); + lf.f = new Sword25::Sword25FileProxy(filename, "r"); +/* if (filename == NULL) { lua_pushliteral(L, "=stdin"); lf.f = stdin; @@ -563,23 +568,25 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { lf.f = fopen(filename, "r"); if (lf.f == NULL) return errfile(L, "open", fnameindex); } - c = getc(lf.f); - if (c == '#') { /* Unix exec. file? */ + + c = lf.f->getc(); + if (c == '#') { // Unix exec. file? lf.extraline = 1; - while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ - if (c == '\n') c = getc(lf.f); + while ((c = lf.f->getc()) != EOF && c != '\n') ; // skip first line + if (c == '\n') c = lf.f->getc(); } - if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ - lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (c == LUA_SIGNATURE[0] && filename) { // binary file? + lf.f = freopen(filename, "rb", lf.f); // reopen in binary mode if (lf.f == NULL) return errfile(L, "reopen", fnameindex); - /* skip eventual `#!...' */ - while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; + // skip eventual `#!...' + while ((c = lf.f->getc()) != EOF && c != LUA_SIGNATURE[0]) ; lf.extraline = 0; } ungetc(c, lf.f); +*/ status = lua_load(L, getF, &lf, lua_tostring(L, -1)); - readstatus = ferror(lf.f); - if (filename) fclose(lf.f); /* close file (even in case of errors) */ + readstatus = 0; //ferror(lf.f); + if (filename) delete lf.f; // close file (even in case of errors) if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex); @@ -637,7 +644,7 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { static int panic (lua_State *L) { (void)L; /* to avoid warnings */ - fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", + warning("PANIC: unprotected error in call to Lua API (%s)\n", lua_tostring(L, -1)); return 0; } diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp new file mode 100644 index 000000000000..bb0da64bab0f --- /dev/null +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -0,0 +1,93 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "sword25/util/lua/scummvm_file.h" +#include "common/config-manager.h" +#include "common/util.h" + +namespace Sword25 { + +Sword25FileProxy::Sword25FileProxy(const Common::String &filename, const Common::String &mode) { + assert(filename.contains("config.lua")); + if (mode == "r") + setupConfigFile(); +} + +void Sword25FileProxy::setupConfigFile() { + float sfxVolume = ConfMan.hasKey("sfx_volume") ? 1.0 : 1.0 * ConfMan.getInt("sfx_volume") / 255.0; + float musicVolume = ConfMan.hasKey("music_volume") ? 0.5 : 1.0 * ConfMan.getInt("music_volume") / 255.0; + float speechVolume = ConfMan.hasKey("speech_volume") ? 1.0 : 1.0 * ConfMan.getInt("speech_volume") / 255.0; + bool subtitles = ConfMan.hasKey("subtitles") ? true : ConfMan.getBool("subtitles"); + + _readData = Common::String::format( +"GAME_LANGUAGE = \"%s\"\r\n\ +GAME_SUBTITLES = %s\r\n\ +MAX_MEMORY_USAGE = 256000000\r\n\ +GFX_VSYNC_ACTIVE = true\r\n\ +SFX_SAMPLING_RATE = 44100\r\n\ +SFX_CHANNEL_COUNT = 32\r\n\ +SFX_SOUND_VOLUME = %f\r\n\ +SFX_MUSIC_VOLUME = %f\r\n\ +SFX_SPEECH_VOLUME = %f\r\n", + getLanguage().c_str(), subtitles ? "true" : "false", sfxVolume, musicVolume, speechVolume); + + _readPos = 0; +} + +/** + * Get the language code used by the game for each language it supports + */ +Common::String Sword25FileProxy::getLanguage() { + Common::Language lang = Common::parseLanguage(ConfMan.get("language")); + switch (lang) { + case Common::EN_ANY: + return "en"; + case Common::DE_DEU: + return "de"; + case Common::ES_ESP: + return "es"; + case Common::FR_FRA: + return "fr"; + case Common::HU_HUN: + return "hr"; + case Common::IT_ITA: + return "it"; + case Common::PL_POL: + return "pl"; + case Common::PT_BRA: + return "pt"; + case Common::RU_RUS: + return "ru"; + default: + error("Unknown language '%s' encountered", ConfMan.get("language")); + break; + } +} + +size_t Sword25FileProxy::read(void *ptr, size_t size, size_t count) { + size_t bytesRead = MIN(_readData.size() - _readPos, size * count); + memmove(ptr, &_readData.c_str()[_readPos], bytesRead); + _readPos += bytesRead; + return bytesRead / size; +} + +} // End of namespace Sword25 diff --git a/engines/sword25/util/lua/scummvm_file.h b/engines/sword25/util/lua/scummvm_file.h new file mode 100644 index 000000000000..8ecfd3449809 --- /dev/null +++ b/engines/sword25/util/lua/scummvm_file.h @@ -0,0 +1,49 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef SWORD25_SCUMMVM_FILE_H +#define SWORD25_SCUMMVM_FILE_H + +#include "common/str.h" + +namespace Sword25 { + +/** + * The following class acts as a proxy interface to the I/O code, pretending that the ScummVM + * settings are a properly formatted 'config.lua' file + */ +class Sword25FileProxy { +private: + Common::String _readData; + uint _readPos; + + void setupConfigFile(); + Common::String getLanguage(); +public: + Sword25FileProxy(const Common::String &filename, const Common::String &mode); + bool eof() const { return _readPos >= _readData.size(); } + size_t read(void *ptr, size_t size, size_t count); +}; + +} // End of namespace Sword25 + +#endif From b5609eb4a162264c7b3bc02ff31ca2f7dcbdecc8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 23 May 2011 00:31:50 +1000 Subject: [PATCH 128/369] SWORD25: Added proxy code for converting writing config.lua to update the ScummVM game settings --- engines/sword25/module.mk | 1 + engines/sword25/util/lua/liolib.cpp | 211 +++++++++++++--------- engines/sword25/util/lua/scummvm_file.cpp | 122 ++++++++++++- engines/sword25/util/lua/scummvm_file.h | 7 + 4 files changed, 251 insertions(+), 90 deletions(-) diff --git a/engines/sword25/module.mk b/engines/sword25/module.mk index da91c848b586..968f21cff5a7 100644 --- a/engines/sword25/module.mk +++ b/engines/sword25/module.mk @@ -83,6 +83,7 @@ MODULE_OBJS := \ util/lua/lvm.o \ util/lua/lzio.o \ util/lua/print.o \ + util/lua/scummvm_file.o \ util/pluto/pdep.o \ util/pluto/pluto.o \ util/pluto/plzio.o diff --git a/engines/sword25/util/lua/liolib.cpp b/engines/sword25/util/lua/liolib.cpp index aea6c328d8a4..b505d1e4df01 100644 --- a/engines/sword25/util/lua/liolib.cpp +++ b/engines/sword25/util/lua/liolib.cpp @@ -16,7 +16,8 @@ #include "lauxlib.h" #include "lualib.h" - +#include "common/textconsole.h" +#include "scummvm_file.h" #define IO_INPUT 1 @@ -43,47 +44,48 @@ static int pushresult (lua_State *L, int i, const char *filename) { } } - +/* static void fileerror (lua_State *L, int arg, const char *filename) { lua_pushfstring(L, "%s: %s", filename, "LUA I/O error descriptions have been removed in ScummVM"); luaL_argerror(L, arg, lua_tostring(L, -1)); } - +*/ #define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) - +#define tofileProxy(L) ((Sword25::Sword25FileProxy **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) static int io_type (lua_State *L) { + return luaL_error(L, "%s", "LUA I/O has been removed in ScummVM"); +/* void *ud; luaL_checkany(L, 1); ud = lua_touserdata(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) - lua_pushnil(L); /* not a file */ + lua_pushnil(L); // not a file else if (*((FILE **)ud) == NULL) lua_pushliteral(L, "closed file"); else lua_pushliteral(L, "file"); return 1; +*/ } - -static FILE *tofile (lua_State *L) { - FILE **f = tofilep(L); +static Sword25::Sword25FileProxy *tofile (lua_State *L) { + Sword25::Sword25FileProxy **f = tofileProxy(L); if (*f == NULL) luaL_error(L, "attempt to use a closed file"); return *f; } - /* ** When creating file handles, always creates a `closed' file handle ** before opening the actual file; so, if there is a memory error, the ** file is not left opened. */ -static FILE **newfile (lua_State *L) { - FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); +static Sword25::Sword25FileProxy **newfile (lua_State *L) { + Sword25::Sword25FileProxy **pf = (Sword25::Sword25FileProxy **)lua_newuserdata(L, sizeof(Sword25::Sword25FileProxy *)); *pf = NULL; /* file handle is currently `closed' */ luaL_getmetatable(L, LUA_FILEHANDLE); lua_setmetatable(L, -2); @@ -105,10 +107,13 @@ static int io_noclose (lua_State *L) { ** function to close 'popen' files */ static int io_pclose (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); +/* FILE **p = tofilep(L); int ok = lua_pclose(L, *p); *p = NULL; return pushresult(L, ok, NULL); + */ } @@ -116,52 +121,63 @@ static int io_pclose (lua_State *L) { ** function to close regular files */ static int io_fclose (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); + /* FILE **p = tofilep(L); int ok = (fclose(*p) == 0); *p = NULL; return pushresult(L, ok, NULL); + */ } - +/* static int aux_close (lua_State *L) { lua_getfenv(L, 1); lua_getfield(L, -1, "__close"); return (lua_tocfunction(L, -1))(L); } - +*/ static int io_close (lua_State *L) { if (lua_isnone(L, 1)) lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT); - tofile(L); /* make sure argument is a file */ - return aux_close(L); + + Sword25::Sword25FileProxy **f = tofileProxy(L); + delete *f; + *f = NULL; + + return 0; } static int io_gc (lua_State *L) { - FILE *f = *tofilep(L); - /* ignore closed files */ - if (f != NULL) - aux_close(L); + Sword25::Sword25FileProxy **f = tofileProxy(L); + // ignore closed files + if (*f != NULL) + delete *f; + return 0; } static int io_tostring (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); + /* FILE *f = *tofilep(L); if (f == NULL) lua_pushliteral(L, "file (closed)"); else lua_pushfstring(L, "file (%p)", f); return 1; + */ } static int io_open (lua_State *L) { const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = fopen(filename, mode); + Sword25::Sword25FileProxy **pf = newfile(L); + *pf = new Sword25::Sword25FileProxy(filename, mode); return (*pf == NULL) ? pushresult(L, 0, filename) : 1; } @@ -171,21 +187,22 @@ static int io_open (lua_State *L) { ** correct __close for 'popen' files */ static int io_popen (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); +/* const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); FILE **pf = newfile(L); *pf = lua_popen(L, filename, mode); return (*pf == NULL) ? pushresult(L, 0, filename) : 1; + */ } static int io_tmpfile (lua_State *L) { - FILE **pf = newfile(L); - *pf = tmpfile(); - return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; + return luaL_error(L, "%s", "LUA I/O error descriptions have been removed in ScummVM"); } - +/* static FILE *getiofile (lua_State *L, int findex) { FILE *f; lua_rawgeti(L, LUA_ENVIRONINDEX, findex); @@ -194,8 +211,8 @@ static FILE *getiofile (lua_State *L, int findex) { luaL_error(L, "standard %s file is closed", fnames[findex - 1]); return f; } - - +*/ +/* static int g_iofile (lua_State *L, int f, const char *mode) { if (!lua_isnoneornil(L, 1)) { const char *filename = lua_tostring(L, 1); @@ -206,24 +223,26 @@ static int g_iofile (lua_State *L, int f, const char *mode) { fileerror(L, 1, filename); } else { - tofile(L); /* check that it's a valid file handle */ + tofile(L); // check that it's a valid file handle lua_pushvalue(L, 1); } lua_rawseti(L, LUA_ENVIRONINDEX, f); } - /* return current value */ + // return current value lua_rawgeti(L, LUA_ENVIRONINDEX, f); return 1; } - +*/ static int io_input (lua_State *L) { - return g_iofile(L, IO_INPUT, "r"); + error("LUA I/O has been removed in ScummVM"); +// return g_iofile(L, IO_INPUT, "r"); } static int io_output (lua_State *L) { - return g_iofile(L, IO_OUTPUT, "w"); + error("LUA I/O has been removed in ScummVM"); +// return g_iofile(L, IO_OUTPUT, "w"); } @@ -245,8 +264,10 @@ static int f_lines (lua_State *L) { static int io_lines (lua_State *L) { - if (lua_isnoneornil(L, 1)) { /* no arguments? */ - /* will iterate over default input */ + error("LUA I/O has been removed in ScummVM"); +/* + if (lua_isnoneornil(L, 1)) { // no arguments? + // will iterate over default input lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT); return f_lines(L); } @@ -259,6 +280,7 @@ static int io_lines (lua_State *L) { aux_lines(L, lua_gettop(L), 1); return 1; } + */ } @@ -268,18 +290,18 @@ static int io_lines (lua_State *L) { ** ======================================================= */ - -static int read_number (lua_State *L, FILE *f) { +/* +static int read_number (lua_State *L, Sword25::Sword25FileProxy *f) { lua_Number d; if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { lua_pushnumber(L, d); return 1; } - else return 0; /* read fails */ + else return 0; // read fails } -static int test_eof (lua_State *L, FILE *f) { +static int test_eof (lua_State *L, Sword25::Sword25FileProxy *f) { int c = getc(f); ungetc(c, f); lua_pushlstring(L, NULL, 0); @@ -287,56 +309,56 @@ static int test_eof (lua_State *L, FILE *f) { } -static int read_line (lua_State *L, FILE *f) { +static int read_line (lua_State *L, Sword25::Sword25FileProxy *f) { luaL_Buffer b; luaL_buffinit(L, &b); for (;;) { size_t l; char *p = luaL_prepbuffer(&b); - if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ - luaL_pushresult(&b); /* close buffer */ - return (lua_objlen(L, -1) > 0); /* check whether read something */ + if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { // eof? + luaL_pushresult(&b); // close buffer + return (lua_objlen(L, -1) > 0); // check whether read something } l = strlen(p); if (l == 0 || p[l-1] != '\n') luaL_addsize(&b, l); else { - luaL_addsize(&b, l - 1); /* do not include `eol' */ - luaL_pushresult(&b); /* close buffer */ - return 1; /* read at least an `eol' */ + luaL_addsize(&b, l - 1); // do not include `eol' + luaL_pushresult(&b); // close buffer + return 1; // read at least an `eol' } } } -static int read_chars (lua_State *L, FILE *f, size_t n) { - size_t rlen; /* how much to read */ - size_t nr; /* number of chars actually read */ +static int read_chars (lua_State *L, Sword25::Sword25FileProxy *f, size_t n) { + size_t rlen; // how much to read + size_t nr; // number of chars actually read luaL_Buffer b; luaL_buffinit(L, &b); - rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ + rlen = LUAL_BUFFERSIZE; // try to read that much each time do { char *p = luaL_prepbuffer(&b); - if (rlen > n) rlen = n; /* cannot read more than asked */ + if (rlen > n) rlen = n; // cannot read more than asked nr = fread(p, sizeof(char), rlen, f); luaL_addsize(&b, nr); - n -= nr; /* still have to read `n' chars */ - } while (n > 0 && nr == rlen); /* until end of count or eof */ - luaL_pushresult(&b); /* close buffer */ + n -= nr; // still have to read `n' chars + } while (n > 0 && nr == rlen); // until end of count or eof + luaL_pushresult(&b); // close buffer return (n == 0 || lua_objlen(L, -1) > 0); } -static int g_read (lua_State *L, FILE *f, int first) { +static int g_read (lua_State *L, Sword25::Sword25FileProxy *f, int first) { int nargs = lua_gettop(L) - 1; int success; int n; clearerr(f); - if (nargs == 0) { /* no arguments? */ + if (nargs == 0) { // no arguments? success = read_line(L, f); - n = first+1; /* to return 1 result */ + n = first+1; // to return 1 result } - else { /* ensure stack space for all results and for auxlib's buffer */ + else { // ensure stack space for all results and for auxlib's buffer luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); success = 1; for (n = first; nargs-- && success; n++) { @@ -348,15 +370,15 @@ static int g_read (lua_State *L, FILE *f, int first) { const char *p = lua_tostring(L, n); luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); switch (p[1]) { - case 'n': /* number */ + case 'n': // number success = read_number(L, f); break; - case 'l': /* line */ + case 'l': // line success = read_line(L, f); break; - case 'a': /* file */ - read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ - success = 1; /* always success */ + case 'a': // file + read_chars(L, f, ~((size_t)0)); // read MAX_SIZE_T chars + success = 1; // always success break; default: return luaL_argerror(L, n, "invalid format"); @@ -367,58 +389,66 @@ static int g_read (lua_State *L, FILE *f, int first) { if (ferror(f)) return pushresult(L, 0, NULL); if (!success) { - lua_pop(L, 1); /* remove last result */ - lua_pushnil(L); /* push nil instead */ + lua_pop(L, 1); // remove last result + lua_pushnil(L); // push nil instead } return n - first; } - +*/ static int io_read (lua_State *L) { - return g_read(L, getiofile(L, IO_INPUT), 1); + error("LUA I/O has been removed in ScummVM"); +// return g_read(L, getiofile(L, IO_INPUT), 1); } static int f_read (lua_State *L) { - return g_read(L, tofile(L), 2); + error("LUA I/O has been removed in ScummVM"); +// return g_read(L, tofile(L), 2); } static int io_readline (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); +/* FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); int sucess; - if (f == NULL) /* file is already closed? */ + if (f == NULL) // file is already closed? luaL_error(L, "file is already closed"); sucess = read_line(L, f); if (ferror(f)) return luaL_error(L, "%s", "LUA I/O error descriptions have been removed in ScummVM"); if (sucess) return 1; - else { /* EOF */ - if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ + else { // EOF + if (lua_toboolean(L, lua_upvalueindex(2))) { // generator created file? lua_settop(L, 0); lua_pushvalue(L, lua_upvalueindex(1)); - aux_close(L); /* close it */ + aux_close(L); // close it } return 0; } +*/ } /* }====================================================== */ -static int g_write (lua_State *L, FILE *f, int arg) { +static int g_write (lua_State *L, Sword25::Sword25FileProxy *f, int arg) { int nargs = lua_gettop(L) - 1; int status = 1; for (; nargs--; arg++) { if (lua_type(L, arg) == LUA_TNUMBER) { - /* optimization: could be done exactly as for strings */ - status = status && - fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; - } + // optimization: could be done exactly as for strings + if (status) { + char buffer[20]; + sprintf(buffer, LUA_NUMBER_FMT, lua_tonumber(L, arg)); + status = f->write(buffer, strlen(buffer)) == strlen(buffer); + } + } else { size_t l; const char *s = luaL_checklstring(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); + status = status && (f->write(s, l) == l); } } return pushresult(L, status, NULL); @@ -426,7 +456,8 @@ static int g_write (lua_State *L, FILE *f, int arg) { static int io_write (lua_State *L) { - return g_write(L, getiofile(L, IO_OUTPUT), 1); + error("LUA I/O has been removed in ScummVM"); +// return g_write(L, getiofile(L, IO_OUTPUT), 1); } @@ -436,6 +467,8 @@ static int f_write (lua_State *L) { static int f_seek (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); + /* static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; static const char *const modenames[] = {"set", "cur", "end", NULL}; FILE *f = tofile(L); @@ -443,15 +476,18 @@ static int f_seek (lua_State *L) { long offset = luaL_optlong(L, 3, 0); op = fseek(f, offset, mode[op]); if (op) - return pushresult(L, 0, NULL); /* error */ + return pushresult(L, 0, NULL); // error else { lua_pushinteger(L, ftell(f)); return 1; } +*/ } static int f_setvbuf (lua_State *L) { + error("LUA I/O has been removed in ScummVM"); + /* static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; static const char *const modenames[] = {"no", "full", "line", NULL}; FILE *f = tofile(L); @@ -459,17 +495,20 @@ static int f_setvbuf (lua_State *L) { lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); int res = setvbuf(f, NULL, mode[op], sz); return pushresult(L, res == 0, NULL); + */ } static int io_flush (lua_State *L) { - return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); + error("LUA I/O has been removed in ScummVM"); +// return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); } static int f_flush (lua_State *L) { - return pushresult(L, fflush(tofile(L)) == 0, NULL); + error("LUA I/O has been removed in ScummVM"); +// return pushresult(L, fflush(tofile(L)) == 0, NULL); } @@ -510,18 +549,18 @@ static void createmeta (lua_State *L) { luaL_register(L, NULL, flib); /* file methods */ } - +/* static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) { *newfile(L) = f; if (k > 0) { lua_pushvalue(L, -1); lua_rawseti(L, LUA_ENVIRONINDEX, k); } - lua_pushvalue(L, -2); /* copy environment */ - lua_setfenv(L, -2); /* set it */ + lua_pushvalue(L, -2); // copy environment + lua_setfenv(L, -2); // set it lua_setfield(L, -3, fname); } - +*/ static void newfenv (lua_State *L, lua_CFunction cls) { lua_createtable(L, 0, 1); @@ -539,9 +578,11 @@ LUALIB_API int luaopen_io (lua_State *L) { luaL_register(L, LUA_IOLIBNAME, iolib); /* create (and set) default files */ newfenv(L, io_noclose); /* close function for default files */ +/* createstdfile(L, stdin, IO_INPUT, "stdin"); createstdfile(L, stdout, IO_OUTPUT, "stdout"); createstdfile(L, stderr, 0, "stderr"); +*/ lua_pop(L, 1); /* pop environment for default files */ lua_getfield(L, -1, "popen"); newfenv(L, io_pclose); /* create environment for 'popen' */ diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp index bb0da64bab0f..2b7ac6d942d1 100644 --- a/engines/sword25/util/lua/scummvm_file.cpp +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -53,6 +53,99 @@ SFX_SPEECH_VOLUME = %f\r\n", _readPos = 0; } +Sword25FileProxy::~Sword25FileProxy() { + if (!_settings.empty()) + writeSettings(); +} + +size_t Sword25FileProxy::read(void *ptr, size_t size, size_t count) { + size_t bytesRead = MIN(_readData.size() - _readPos, size * count); + memmove(ptr, &_readData.c_str()[_readPos], bytesRead); + _readPos += bytesRead; + return bytesRead / size; +} + +size_t Sword25FileProxy::write(const char *ptr, size_t count) { + // Loop through the provided line(s) + while (*ptr) { + if ((*ptr == '-') && (*(ptr + 1) == '-')) { + // Comment line to skip over + while ((*ptr != '\r') && (*ptr != '\n')) + ++ptr; + } else { + // Legitimate data + const char *p = strchr(ptr, '\n'); + if (!p) p = ptr + strlen(ptr); + while ((*p == '\r') || (*p == '\n')) + ++p; + + _settings += Common::String(ptr, p - ptr); + ptr = p; + } + + while ((*ptr == '\r') || (*ptr == '\n')) + ++ptr; + } + + return count; +} + +void Sword25FileProxy::writeSettings() { + // Loop through the setting lines + const char *pSrc = _settings.c_str(); + while (*pSrc) { + if ((*pSrc != '\r') && (*pSrc != '\n')) { + const char *p = strchr(pSrc, '='); + assert(p); + + // Get the setting name + const char *pEnd = p - 1; + while (*pEnd == ' ') + --pEnd; + Common::String settingName(pSrc, pEnd - pSrc + 1); + + // Get the setting value + const char *pStart = p + 1; + while (*pStart == ' ') + ++pStart; + + pEnd = pStart + 1; + while ((*pEnd != '\r') && (*pEnd != '\n') && (*pEnd != '\0')) + ++pEnd; + Common::String value(pStart + (*pStart == '"' ? 1 : 0), pEnd - pStart - (*pStart == '"' ? 2 : 0)); + + // Update the setting + updateSetting(settingName, value); + pSrc = pEnd; + } + + // Move to next line + while ((*pSrc == '\r') || (*pSrc == '\n')) + ++pSrc; + } + + ConfMan.flushToDisk(); +} + +void Sword25FileProxy::updateSetting(const Common::String &setting, const Common::String &value) { + if (setting == "GAME_LANGUAGE") + setLanguage(value); + else if (setting == "GAME_SUBTITLES") + ConfMan.setBool("subtitles", value == "true"); + else if (setting == "SFX_SOUND_VOLUME") { + double v = strtod(value.c_str(), NULL); + ConfMan.setInt("sfx_volume", (int)(v * 255)); + } else if (setting == "SFX_MUSIC_VOLUME") { + double v = strtod(value.c_str(), NULL); + ConfMan.setInt("music_volume", (int)(v * 255)); + } else if (setting == "SFX_SPEECH_VOLUME") { + double v = strtod(value.c_str(), NULL); + ConfMan.setInt("speech_volume", (int)(v * 255)); + } else { + // All other settings are ignored + } +} + /** * Get the language code used by the game for each language it supports */ @@ -83,11 +176,30 @@ Common::String Sword25FileProxy::getLanguage() { } } -size_t Sword25FileProxy::read(void *ptr, size_t size, size_t count) { - size_t bytesRead = MIN(_readData.size() - _readPos, size * count); - memmove(ptr, &_readData.c_str()[_readPos], bytesRead); - _readPos += bytesRead; - return bytesRead / size; +/** + * Set the language code fro the game + */ +void Sword25FileProxy::setLanguage(const Common::String &lang) { + if (lang == "en") + ConfMan.set("language", Common::getLanguageCode(Common::EN_ANY)); + else if (lang == "de") + ConfMan.set("language", Common::getLanguageCode(Common::DE_DEU)); + else if (lang == "es") + ConfMan.set("language", Common::getLanguageCode(Common::ES_ESP)); + else if (lang == "fr") + ConfMan.set("language", Common::getLanguageCode(Common::FR_FRA)); + else if (lang == "hr") + ConfMan.set("language", Common::getLanguageCode(Common::HU_HUN)); + else if (lang == "it") + ConfMan.set("language", Common::getLanguageCode(Common::IT_ITA)); + else if (lang == "pl") + ConfMan.set("language", Common::getLanguageCode(Common::PL_POL)); + else if (lang == "pt") + ConfMan.set("language", Common::getLanguageCode(Common::PT_BRA)); + else if (lang == "ru") + ConfMan.set("language", Common::getLanguageCode(Common::RU_RUS)); + else + error("Unknown language encountered"); } } // End of namespace Sword25 diff --git a/engines/sword25/util/lua/scummvm_file.h b/engines/sword25/util/lua/scummvm_file.h index 8ecfd3449809..a4cbd2a6cf4c 100644 --- a/engines/sword25/util/lua/scummvm_file.h +++ b/engines/sword25/util/lua/scummvm_file.h @@ -35,13 +35,20 @@ class Sword25FileProxy { private: Common::String _readData; uint _readPos; + Common::String _settings; void setupConfigFile(); Common::String getLanguage(); + void setLanguage(const Common::String &lang); + void writeSettings(); + void updateSetting(const Common::String &setting, const Common::String &value); public: Sword25FileProxy(const Common::String &filename, const Common::String &mode); + ~Sword25FileProxy(); + bool eof() const { return _readPos >= _readData.size(); } size_t read(void *ptr, size_t size, size_t count); + size_t write(const char *ptr, size_t count); }; } // End of namespace Sword25 From 27a6d9b910d5f434f1b75c2c42bbd1675fa10e37 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 23 May 2011 08:48:21 +1000 Subject: [PATCH 129/369] SWORD25: Added detection entries for other languages This is needed now, since changing the language in-game updates the ScummVM language setting, and there must be a matching detection entry for each language. --- engines/sword25/detection.cpp | 78 +++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/engines/sword25/detection.cpp b/engines/sword25/detection.cpp index fd5820d508a5..62c7f81c00d0 100644 --- a/engines/sword25/detection.cpp +++ b/engines/sword25/detection.cpp @@ -37,10 +37,8 @@ static const PlainGameDescriptor Sword25Game[] = { namespace Sword25 { -// TODO: Need to decide whether we're going to implement code to detect all the various languages allowed, -// both by the core data package, as well as the extra languages added by the patch file; also, I don't -// think that all the languages supported by the game currently have constants in ScummVM static const ADGameDescription gameDescriptions[] = { + // These two versions represent the default languages available in the data file { "sword25", "", @@ -50,6 +48,80 @@ static const ADGameDescription gameDescriptions[] = { ADGF_NO_FLAGS, Common::GUIO_NONE }, + { + "sword25", + "", + AD_ENTRY1s("lang_fr.b25c", "690caf157387e06d2c3d1ca53c43f428", 1006043), + Common::FR_FRA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), + Common::DE_DEU, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_hr.b25c", "e881054d1f8ec1e527422fc521c25405", 1273217), + Common::HU_HUN, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_it.b25c", "f3325666da0515cc2b42062e953c0889", 996197), + Common::IT_ITA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_pl.b25c", "49dc1a20f95391a808e475c49be2bac0", 1281799), + Common::PL_POL, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_pt.b25c", "1df701432f9e13dcefe1adeb890b9c69", 993812), + Common::PT_BRA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_ru.b25c", "deb33dd2f90a71ff60181918a8ce5063", 1235378), + Common::RU_RUS, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_es.b25c", "384c19072d83725f351bb9ecb4d3f02b", 987965), + Common::ES_ESP, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + + // Extracted version { "sword25", "Extracted", From 2ebacc64be623cf4c4e8bff9df9c363523660939 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 23 May 2011 18:40:01 +1000 Subject: [PATCH 130/369] SWORD25: Moved detection entries into detection_tables.h --- engines/sword25/detection.cpp | 105 +---------------------- engines/sword25/detection_tables.h | 129 +++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 104 deletions(-) create mode 100644 engines/sword25/detection_tables.h diff --git a/engines/sword25/detection.cpp b/engines/sword25/detection.cpp index 62c7f81c00d0..edb8c305455a 100644 --- a/engines/sword25/detection.cpp +++ b/engines/sword25/detection.cpp @@ -24,6 +24,7 @@ #include "engines/advancedDetector.h" #include "sword25/sword25.h" +#include "sword25/detection_tables.h" #include "sword25/kernel/persistenceservice.h" namespace Sword25 { @@ -35,110 +36,6 @@ static const PlainGameDescriptor Sword25Game[] = { {0, 0} }; -namespace Sword25 { - -static const ADGameDescription gameDescriptions[] = { - // These two versions represent the default languages available in the data file - { - "sword25", - "", - AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), - Common::EN_ANY, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_fr.b25c", "690caf157387e06d2c3d1ca53c43f428", 1006043), - Common::FR_FRA, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), - Common::DE_DEU, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_hr.b25c", "e881054d1f8ec1e527422fc521c25405", 1273217), - Common::HU_HUN, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_it.b25c", "f3325666da0515cc2b42062e953c0889", 996197), - Common::IT_ITA, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_pl.b25c", "49dc1a20f95391a808e475c49be2bac0", 1281799), - Common::PL_POL, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_pt.b25c", "1df701432f9e13dcefe1adeb890b9c69", 993812), - Common::PT_BRA, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_ru.b25c", "deb33dd2f90a71ff60181918a8ce5063", 1235378), - Common::RU_RUS, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - { - "sword25", - "", - AD_ENTRY1s("lang_es.b25c", "384c19072d83725f351bb9ecb4d3f02b", 987965), - Common::ES_ESP, - Common::kPlatformUnknown, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - - // Extracted version - { - "sword25", - "Extracted", - {{"_includes.lua", 0, 0, -1}, - {"boot.lua", 0, 0, -1}, - {"kernel.lua", 0, 0, -1}, - AD_LISTEND}, - Common::EN_ANY, - Common::kPlatformUnknown, - GF_EXTRACTED, - Common::GUIO_NONE - }, - AD_TABLE_END_MARKER -}; - -} // End of namespace Sword25 - static const char *directoryGlobs[] = { "system", // Used by extracted dats 0 diff --git a/engines/sword25/detection_tables.h b/engines/sword25/detection_tables.h new file mode 100644 index 000000000000..ca586b4f0161 --- /dev/null +++ b/engines/sword25/detection_tables.h @@ -0,0 +1,129 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +namespace Sword25 { + +using Common::GUIO_NONE; +using Common::GUIO_NOSPEECH; +using Common::GUIO_NOSFX; +using Common::GUIO_NOMUSIC; + +static const ADGameDescription gameDescriptions[] = { + { + "sword25", + "", + AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), + Common::EN_ANY, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_fr.b25c", "690caf157387e06d2c3d1ca53c43f428", 1006043), + Common::FR_FRA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), + Common::DE_DEU, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_hr.b25c", "e881054d1f8ec1e527422fc521c25405", 1273217), + Common::HU_HUN, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_it.b25c", "f3325666da0515cc2b42062e953c0889", 996197), + Common::IT_ITA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_pl.b25c", "49dc1a20f95391a808e475c49be2bac0", 1281799), + Common::PL_POL, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_pt.b25c", "1df701432f9e13dcefe1adeb890b9c69", 993812), + Common::PT_BRA, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_ru.b25c", "deb33dd2f90a71ff60181918a8ce5063", 1235378), + Common::RU_RUS, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + { + "sword25", + "", + AD_ENTRY1s("lang_es.b25c", "384c19072d83725f351bb9ecb4d3f02b", 987965), + Common::ES_ESP, + Common::kPlatformUnknown, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + + // Extracted version + { + "sword25", + "Extracted", + {{"_includes.lua", 0, 0, -1}, + {"boot.lua", 0, 0, -1}, + {"kernel.lua", 0, 0, -1}, + AD_LISTEND}, + Common::EN_ANY, + Common::kPlatformUnknown, + GF_EXTRACTED, + Common::GUIO_NONE + }, + AD_TABLE_END_MARKER +}; + +} // End of namespace Sword25 From c13275e6572b6ecd5d2d1ffa1b4ca07dc1fcbb76 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 23 May 2011 18:50:57 +1000 Subject: [PATCH 131/369] SWORD25: Replaced accidental backslash in include filename --- engines/sword25/util/lua/lauxlib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/util/lua/lauxlib.cpp b/engines/sword25/util/lua/lauxlib.cpp index 3b54cf98f1e8..8978cd5613e4 100644 --- a/engines/sword25/util/lua/lauxlib.cpp +++ b/engines/sword25/util/lua/lauxlib.cpp @@ -23,7 +23,7 @@ #include "lauxlib.h" #include "scummvm_file.h" -#include "common\textconsole.h" +#include "common/textconsole.h" #define FREELIST_REF 0 /* free list of references */ From 9b43822a424606f9ba4e8c924ed831bc1bdd6aae Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 23 May 2011 10:52:53 +0200 Subject: [PATCH 132/369] SWORD25: Fix error string parameter --- engines/sword25/util/lua/scummvm_file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp index 2b7ac6d942d1..98fc1276a780 100644 --- a/engines/sword25/util/lua/scummvm_file.cpp +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -171,7 +171,7 @@ Common::String Sword25FileProxy::getLanguage() { case Common::RU_RUS: return "ru"; default: - error("Unknown language '%s' encountered", ConfMan.get("language")); + error("Unknown language '%s' encountered", ConfMan.get("language").c_str()); break; } } From 998323129420ebde730074585d7aab9f093368a8 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 23 May 2011 11:50:38 +0200 Subject: [PATCH 133/369] SWORD25: De-hardcode target name in thumbnail code This just uses the provided filename rather than trying to recreate it with a hard-coded target (causing crashes with other targets). (Also, add an error check rather then crashing there, just in case.) --- engines/sword25/gfx/image/renderedimage.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index 23bf2623ad4a..395d29d81ac1 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -42,14 +42,6 @@ namespace Sword25 { -// Duplicated from kernel/persistenceservice.cpp -static Common::String generateSavegameFilename(uint slotID) { - char buffer[100]; - // NOTE: This is hardcoded to sword25 - snprintf(buffer, 100, "%s.%.3d", "sword25", slotID); - return Common::String(buffer); -} - // ----------------------------------------------------------------------------- // CONSTRUCTION / DESTRUCTION // ----------------------------------------------------------------------------- @@ -74,8 +66,9 @@ static Common::String loadString(Common::SeekableReadStream &in, uint maxSize = static byte *readSavegameThumbnail(const Common::String &filename, uint &fileSize, bool &isPNG) { byte *pFileData; Common::SaveFileManager *sfm = g_system->getSavefileManager(); - int slotNum = atoi(filename.c_str() + filename.size() - 3); - Common::InSaveFile *file = sfm->openForLoading(generateSavegameFilename(slotNum)); + Common::InSaveFile *file = sfm->openForLoading(lastPathComponent(filename, '/')); + if (!file) + error("Save file \"%s\" could not be loaded.", filename.c_str()); // Seek to the actual PNG image loadString(*file); // Marker (BS25SAVEGAME) From f1a7ec711772d5582fc06c7f8209b406e5fb3717 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 23 May 2011 12:12:26 +0200 Subject: [PATCH 134/369] SWORD25: Fix screenshot endianism issue --- engines/sword25/gfx/screenshot.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sword25/gfx/screenshot.cpp b/engines/sword25/gfx/screenshot.cpp index 8306d9ce6fe4..11b79020fd9c 100644 --- a/engines/sword25/gfx/screenshot.cpp +++ b/engines/sword25/gfx/screenshot.cpp @@ -53,6 +53,8 @@ bool Screenshot::saveToFile(Graphics::Surface *data, Common::WriteStream *stream for (uint y = 0; y < data->h; y++) { for (uint x = 0; x < data->w; x++) { + // This is only called by createThumbnail below, which + // provides a fake 'surface' with LE data in it. uint32 srcPixel = READ_LE_UINT32(pSrc); pSrc += sizeof(uint32); stream->writeByte((srcPixel >> 16) & 0xff); // R @@ -93,7 +95,7 @@ Common::SeekableReadStream *Screenshot::createThumbnail(Graphics::Surface *data) for (int j = 0; j < 4; ++j) { const uint32 *srcP = (const uint32 *)data->getBasePtr(x * 4, y * 4 + j + 50); for (int i = 0; i < 4; ++i) { - uint32 pixel = READ_LE_UINT32(srcP + i); + uint32 pixel = READ_UINT32(srcP + i); alpha += (pixel >> 24); red += (pixel >> 16) & 0xff; green += (pixel >> 8) & 0xff; From e7c642b010c47d2520d21ea5b3c041d861bc1532 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 21 May 2011 19:03:22 +0200 Subject: [PATCH 135/369] AUDIO: Explicitly instantiate & name RandomSource used by MAME OPL --- audio/fmopl.h | 5 ++++- audio/softsynth/opl/mame.cpp | 14 ++++++++++++-- audio/softsynth/opl/mame.h | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/audio/fmopl.h b/audio/fmopl.h index fbce36f077a1..b88325a52eae 100644 --- a/audio/fmopl.h +++ b/audio/fmopl.h @@ -23,7 +23,10 @@ #define SOUND_FMOPL_H #include "common/scummsys.h" -#include "common/str.h" + +namespace Common { +class String; +} namespace OPL { diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp index b380a1534502..9cc35971eb2d 100644 --- a/audio/softsynth/opl/mame.cpp +++ b/audio/softsynth/opl/mame.cpp @@ -546,7 +546,7 @@ inline void OPL_CALC_RH(FM_OPL *OPL, OPL_CH *CH) { // but EG_STEP = 96.0/EG_ENT, and WHITE_NOISE_db=6.0. So, that's equivalent to // int(OPL->rnd.getRandomBit() * EG_ENT/16). We know that EG_ENT is 4096, or 1024, // or 128, so we can safely avoid any FP ops. - int whitenoise = OPL->rnd.getRandomBit() * (EG_ENT>>4); + int whitenoise = OPL->rnd->getRandomBit() * (EG_ENT>>4); int tone8; @@ -1126,6 +1126,15 @@ FM_OPL *OPLCreate(int type, int clock, int rate) { OPL->rate = rate; OPL->max_ch = max_ch; + // Init the random source. Note: We use a fixed name for it here. + // So if multiple FM_OPL objects exist in parallel, then their + // random sources will have an equal name. At least in the + // current EventRecorder implementation, this causes no problems; + // but this is probably not guaranteed. + // Alas, it does not seem worthwhile to bother much with this + // at the time, so I am leaving it as it is. + OPL->rnd = new Common::RandomSource("mame"); + /* init grobal tables */ OPL_initalize(OPL); @@ -1134,9 +1143,10 @@ FM_OPL *OPLCreate(int type, int clock, int rate) { return OPL; } -/* ---------- Destroy one of vietual YM3812 ---------- */ +/* ---------- Destroy one of virtual YM3812 ---------- */ void OPLDestroy(FM_OPL *OPL) { OPL_UnLockTable(); + delete OPL->rnd; free(OPL); } diff --git a/audio/softsynth/opl/mame.h b/audio/softsynth/opl/mame.h index 4c409494832b..803ca897e7be 100644 --- a/audio/softsynth/opl/mame.h +++ b/audio/softsynth/opl/mame.h @@ -147,7 +147,7 @@ typedef struct fm_opl_f { OPL_UPDATEHANDLER UpdateHandler; /* stream update handler */ int UpdateParam; /* stream update parameter */ - Common::RandomSource rnd; + Common::RandomSource *rnd; } FM_OPL; /* ---------- Generic interface section ---------- */ From 90d3fc9f5be7bdfc789c9739db017e9e464e3943 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 21 May 2011 19:47:57 +0200 Subject: [PATCH 136/369] GRAPHICS: Rename some members of NewFont --- graphics/font.cpp | 100 +++++++++++++++++++++++----------------------- graphics/font.h | 10 ++--- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/graphics/font.cpp b/graphics/font.cpp index 5f5a9b2fcaf7..cdf909062525 100644 --- a/graphics/font.cpp +++ b/graphics/font.cpp @@ -30,23 +30,23 @@ namespace Graphics { -void free_font(NewFontData* pf); +void free_font(NewFontData *pf); NewFont::~NewFont() { - if (font) { - free_font(font); + if (_font) { + free_font(_font); } } int NewFont::getCharWidth(byte chr) const { // If no width table is specified, return the maximum width - if (!desc.width) - return desc.maxwidth; + if (!_desc.width) + return _desc.maxwidth; // If this character is not included in the font, use the default char. - if (chr < desc.firstchar || desc.firstchar + desc.size < chr) { - chr = desc.defaultchar; + if (chr < _desc.firstchar || _desc.firstchar + _desc.size < chr) { + chr = _desc.defaultchar; } - return desc.width[chr - desc.firstchar]; + return _desc.width[chr - _desc.firstchar]; } @@ -74,38 +74,38 @@ void drawCharIntern(byte *ptr, uint pitch, const bitmap_t *src, int h, int minX, void NewFont::drawChar(Surface *dst, byte chr, const int tx, const int ty, const uint32 color) const { assert(dst != 0); - assert(desc.bits != 0 && desc.maxwidth <= 16); + assert(_desc.bits != 0 && _desc.maxwidth <= 16); assert(dst->format.bytesPerPixel == 1 || dst->format.bytesPerPixel == 2); // If this character is not included in the font, use the default char. - if (chr < desc.firstchar || chr >= desc.firstchar + desc.size) { - chr = desc.defaultchar; + if (chr < _desc.firstchar || chr >= _desc.firstchar + _desc.size) { + chr = _desc.defaultchar; } - chr -= desc.firstchar; + chr -= _desc.firstchar; int bbw, bbh, bbx, bby; // Get the bounding box of the character - if (!desc.bbx) { - bbw = desc.fbbw; - bbh = desc.fbbh; - bbx = desc.fbbx; - bby = desc.fbby; + if (!_desc.bbx) { + bbw = _desc.fbbw; + bbh = _desc.fbbh; + bbx = _desc.fbbx; + bby = _desc.fbby; } else { - bbw = desc.bbx[chr].w; - bbh = desc.bbx[chr].h; - bbx = desc.bbx[chr].x; - bby = desc.bbx[chr].y; + bbw = _desc.bbx[chr].w; + bbh = _desc.bbx[chr].h; + bbx = _desc.bbx[chr].x; + bby = _desc.bbx[chr].y; } - byte *ptr = (byte *)dst->getBasePtr(tx + bbx, ty + desc.ascent - bby - bbh); + byte *ptr = (byte *)dst->getBasePtr(tx + bbx, ty + _desc.ascent - bby - bbh); - const bitmap_t *tmp = desc.bits + (desc.offset ? desc.offset[chr] : (chr * desc.fbbh)); + const bitmap_t *tmp = _desc.bits + (_desc.offset ? _desc.offset[chr] : (chr * _desc.fbbh)); - int y = MIN(bbh, ty + desc.ascent - bby); + int y = MIN(bbh, ty + _desc.ascent - bby); tmp += bbh - y; - y -= MAX(0, ty + desc.ascent - bby - dst->h); + y -= MAX(0, ty + _desc.ascent - bby - dst->h); if (dst->format.bytesPerPixel == 1) drawCharIntern(ptr, dst->pitch, tmp, y, MAX(0, -(tx + bbx)), MIN(bbw, dst->w - tx - bbx), color); @@ -615,47 +615,47 @@ bool NewFont::cacheFontData(const NewFont &font, const Common::String &filename) return false; } - cacheFile.writeUint16BE(font.desc.maxwidth); - cacheFile.writeUint16BE(font.desc.height); - cacheFile.writeUint16BE(font.desc.fbbw); - cacheFile.writeUint16BE(font.desc.fbbh); - cacheFile.writeSint16BE(font.desc.fbbx); - cacheFile.writeSint16BE(font.desc.fbby); - cacheFile.writeUint16BE(font.desc.ascent); - cacheFile.writeUint16BE(font.desc.firstchar); - cacheFile.writeUint16BE(font.desc.size); - cacheFile.writeUint16BE(font.desc.defaultchar); - cacheFile.writeUint32BE(font.desc.bits_size); + cacheFile.writeUint16BE(font._desc.maxwidth); + cacheFile.writeUint16BE(font._desc.height); + cacheFile.writeUint16BE(font._desc.fbbw); + cacheFile.writeUint16BE(font._desc.fbbh); + cacheFile.writeSint16BE(font._desc.fbbx); + cacheFile.writeSint16BE(font._desc.fbby); + cacheFile.writeUint16BE(font._desc.ascent); + cacheFile.writeUint16BE(font._desc.firstchar); + cacheFile.writeUint16BE(font._desc.size); + cacheFile.writeUint16BE(font._desc.defaultchar); + cacheFile.writeUint32BE(font._desc.bits_size); - for (long i = 0; i < font.desc.bits_size; ++i) { - cacheFile.writeUint16BE(font.desc.bits[i]); + for (long i = 0; i < font._desc.bits_size; ++i) { + cacheFile.writeUint16BE(font._desc.bits[i]); } - if (font.desc.offset) { + if (font._desc.offset) { cacheFile.writeByte(1); - for (int i = 0; i < font.desc.size; ++i) { - cacheFile.writeUint32BE(font.desc.offset[i]); + for (int i = 0; i < font._desc.size; ++i) { + cacheFile.writeUint32BE(font._desc.offset[i]); } } else { cacheFile.writeByte(0); } - if (font.desc.width) { + if (font._desc.width) { cacheFile.writeByte(1); - for (int i = 0; i < font.desc.size; ++i) { - cacheFile.writeByte(font.desc.width[i]); + for (int i = 0; i < font._desc.size; ++i) { + cacheFile.writeByte(font._desc.width[i]); } } else { cacheFile.writeByte(0); } - if (font.desc.bbx) { + if (font._desc.bbx) { cacheFile.writeByte(1); - for (int i = 0; i < font.desc.size; ++i) { - cacheFile.writeByte(font.desc.bbx[i].w); - cacheFile.writeByte(font.desc.bbx[i].h); - cacheFile.writeByte(font.desc.bbx[i].x); - cacheFile.writeByte(font.desc.bbx[i].y); + for (int i = 0; i < font._desc.size; ++i) { + cacheFile.writeByte(font._desc.bbx[i].w); + cacheFile.writeByte(font._desc.bbx[i].h); + cacheFile.writeByte(font._desc.bbx[i].x); + cacheFile.writeByte(font._desc.bbx[i].y); } } else { cacheFile.writeByte(0); diff --git a/graphics/font.h b/graphics/font.h index f68f49175f97..7a992674d2a5 100644 --- a/graphics/font.h +++ b/graphics/font.h @@ -157,15 +157,15 @@ struct NewFontData; class NewFont : public Font { protected: - FontDesc desc; - NewFontData *font; + FontDesc _desc; + NewFontData *_font; public: - NewFont(const FontDesc &d, NewFontData *font_ = 0) : desc(d), font(font_) {} + NewFont(const FontDesc &desc, NewFontData *font = 0) : _desc(desc), _font(font) {} ~NewFont(); - virtual int getFontHeight() const { return desc.height; } - virtual int getMaxCharWidth() const { return desc.maxwidth; } + virtual int getFontHeight() const { return _desc.height; } + virtual int getMaxCharWidth() const { return _desc.maxwidth; } virtual int getCharWidth(byte chr) const; virtual void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const; From 0bca049ce84cf3f1285cd6da580b547afd3cb686 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 21 May 2011 20:01:06 +0200 Subject: [PATCH 137/369] TEEN: Change Inventory members to comple with CFG --- engines/teenagent/inventory.cpp | 160 ++++++++++++++++---------------- engines/teenagent/inventory.h | 35 +++---- 2 files changed, 99 insertions(+), 96 deletions(-) diff --git a/engines/teenagent/inventory.cpp b/engines/teenagent/inventory.cpp index 0f9766d2ca3d..8430f42c610e 100644 --- a/engines/teenagent/inventory.cpp +++ b/engines/teenagent/inventory.cpp @@ -43,22 +43,22 @@ Inventory::Inventory(TeenAgentEngine *engine) { if (!s) error("no inventory background"); debug(0, "loading inventory background..."); - background.load(s, Surface::kTypeOns); + _background.load(s, Surface::kTypeOns); } uint32 items_size = varia.getSize(4); if (items_size == 0) error("invalid inventory items size"); debug(0, "loading items, size: %u", items_size); - items = new byte[items_size]; - varia.read(4, items, items_size); + _items = new byte[items_size]; + varia.read(4, _items, items_size); - byte offsets = items[0]; + byte offsets = _items[0]; assert(offsets == 92); for (byte i = 0; i < offsets; ++i) { - offset[i] = READ_LE_UINT16(items + i * 2 + 1); + _offset[i] = READ_LE_UINT16(_items + i * 2 + 1); } - offset[92] = items_size; + _offset[92] = items_size; Resources *res = Resources::instance(); for (byte i = 0; i <= 92; ++i) { @@ -66,31 +66,31 @@ Inventory::Inventory(TeenAgentEngine *engine) { uint16 obj_addr = res->dseg.get_word(0xc4a4 + i * 2); if (obj_addr != 0) io.load(res->dseg.ptr(obj_addr)); - objects.push_back(io); + _objects.push_back(io); } - inventory = res->dseg.ptr(0xc48d); + _inventory = res->dseg.ptr(0xc48d); for (int y = 0; y < 4; ++y) for (int x = 0; x < 6; ++x) { int i = y * 6 + x; - graphics[i].rect.left = 28 + 45 * x - 1; - graphics[i].rect.top = 23 + 31 * y - 1; - graphics[i].rect.right = graphics[i].rect.left + 40; - graphics[i].rect.bottom = graphics[i].rect.top + 26; + _graphics[i]._rect.left = 28 + 45 * x - 1; + _graphics[i]._rect.top = 23 + 31 * y - 1; + _graphics[i]._rect.right = _graphics[i]._rect.left + 40; + _graphics[i]._rect.bottom = _graphics[i]._rect.top + 26; } varia.close(); - hovered_obj = selected_obj = NULL; + _hoveredObj = _selectedObj = NULL; } Inventory::~Inventory() { - delete[] items; + delete[] _items; } bool Inventory::has(byte item) const { for (int i = 0; i < 24; ++i) { - if (inventory[i] == item) + if (_inventory[i] == item) return true; } return false; @@ -100,32 +100,32 @@ void Inventory::remove(byte item) { debug(0, "removing %u from inventory", item); int i; for (i = 0; i < 24; ++i) { - if (inventory[i] == item) { + if (_inventory[i] == item) { break; } } for (; i < 23; ++i) { - inventory[i] = inventory[i + 1]; - graphics[i].free(); + _inventory[i] = _inventory[i + 1]; + _graphics[i].free(); } - inventory[23] = 0; - graphics[23].free(); + _inventory[23] = 0; + _graphics[23].free(); } void Inventory::clear() { debug(0, "clearing inventory"); for (int i = 0; i < 24; ++i) { - inventory[i] = 0; - graphics[i].free(); + _inventory[i] = 0; + _graphics[i].free(); } } void Inventory::reload() { for (int i = 0; i < 24; ++i) { - graphics[i].free(); - uint item = inventory[i]; + _graphics[i].free(); + uint item = _inventory[i]; if (item != 0) - graphics[i].load(this, item); + _graphics[i].load(this, item); } } @@ -134,8 +134,8 @@ void Inventory::add(byte item) { return; debug(0, "adding %u to inventory", item); for (int i = 0; i < 24; ++i) { - if (inventory[i] == 0) { - inventory[i] = item; + if (_inventory[i] == 0) { + _inventory[i] = item; return; } } @@ -165,27 +165,27 @@ bool Inventory::processEvent(const Common::Event &event) { if (!_active) { if (event.mouse.y < 5) activate(true); - mouse = event.mouse; + _mouse = event.mouse; return false; } - if (event.mouse.x < 17 || event.mouse.x >= 303 || (event.mouse.y - mouse.y > 0 && event.mouse.y >= 153)) { + if (event.mouse.x < 17 || event.mouse.x >= 303 || (event.mouse.y - _mouse.y > 0 && event.mouse.y >= 153)) { activate(false); - mouse = event.mouse; + _mouse = event.mouse; return false; } - mouse = event.mouse; - hovered_obj = NULL; + _mouse = event.mouse; + _hoveredObj = NULL; for (int i = 0; i < 24; ++i) { - byte item = inventory[i]; + byte item = _inventory[i]; if (item == 0) continue; - graphics[i].hovered = graphics[i].rect.in(mouse); - if (graphics[i].hovered) - hovered_obj = &objects[item]; + _graphics[i]._hovered = _graphics[i]._rect.in(_mouse); + if (_graphics[i]._hovered) + _hoveredObj = &_objects[item]; } return true; @@ -194,22 +194,22 @@ bool Inventory::processEvent(const Common::Event &event) { if (!_active) return false; - if (hovered_obj == NULL) + if (_hoveredObj == NULL) return true; - debug(0, "lclick on %u:%s", hovered_obj->id, hovered_obj->name.c_str()); + debug(0, "lclick on %u:%s", _hoveredObj->id, _hoveredObj->name.c_str()); - if (selected_obj == NULL) { - if (tryObjectCallback(hovered_obj)) + if (_selectedObj == NULL) { + if (tryObjectCallback(_hoveredObj)) return true; //activate(false); - int w = res->font7.render(NULL, 0, 0, hovered_obj->description, 0xd1); - _engine->scene->displayMessage(hovered_obj->description, 0xd1, Common::Point((320 - w) / 2, 162)); + int w = res->font7.render(NULL, 0, 0, _hoveredObj->description, 0xd1); + _engine->scene->displayMessage(_hoveredObj->description, 0xd1, Common::Point((320 - w) / 2, 162)); return true; } - int id1 = selected_obj->id; - int id2 = hovered_obj->id; + int id1 = _selectedObj->id; + int id2 = _hoveredObj->id; if (id1 == id2) return true; @@ -246,15 +246,15 @@ bool Inventory::processEvent(const Common::Event &event) { if (!_active) return false; - if (hovered_obj != NULL) { - debug(0, "rclick object %u:%s", hovered_obj->id, hovered_obj->name.c_str()); - if (hovered_obj->id != 51 && tryObjectCallback(hovered_obj)) //do not process callback for banknote on r-click + if (_hoveredObj != NULL) { + debug(0, "rclick object %u:%s", _hoveredObj->id, _hoveredObj->name.c_str()); + if (_hoveredObj->id != 51 && tryObjectCallback(_hoveredObj)) //do not process callback for banknote on r-click return true; } - selected_obj = hovered_obj; - if (selected_obj) - debug(0, "selected object %s", selected_obj->name.c_str()); + _selectedObj = _hoveredObj; + if (_selectedObj) + debug(0, "selected object %s", _selectedObj->name.c_str()); return true; case Common::EVENT_KEYDOWN: @@ -279,13 +279,13 @@ bool Inventory::processEvent(const Common::Event &event) { void Inventory::Item::free() { - animation.free(); - surface.free(); + _animation.free(); + _surface.free(); } void Inventory::Item::backgroundEffect(Graphics::Surface *s) { - uint w = rect.right - rect.left, h = rect.bottom - rect.top; - byte *line = (byte *)s->getBasePtr(rect.left, rect.top); + uint w = _rect.right - _rect.left, h = _rect.bottom - _rect.top; + byte *line = (byte *)s->getBasePtr(_rect.left, _rect.top); for(uint y = 0; y < h; ++y, line += s->pitch) { byte *dst = line; for(uint x = 0; x < w; ++x, ++dst) { @@ -295,54 +295,54 @@ void Inventory::Item::backgroundEffect(Graphics::Surface *s) { } void Inventory::Item::load(Inventory *inventory, uint item_id) { - InventoryObject *obj = &inventory->objects[item_id]; + InventoryObject *obj = &inventory->_objects[item_id]; if (obj->animated) { - if (animation.empty()) { - debug(0, "loading item %d from offset %x", obj->id, inventory->offset[obj->id - 1]); - Common::MemoryReadStream s(inventory->items + inventory->offset[obj->id - 1], inventory->offset[obj->id] - inventory->offset[obj->id - 1]); - animation.load(&s, Animation::kTypeInventory); + if (_animation.empty()) { + debug(0, "loading item %d from offset %x", obj->id, inventory->_offset[obj->id - 1]); + Common::MemoryReadStream s(inventory->_items + inventory->_offset[obj->id - 1], inventory->_offset[obj->id] - inventory->_offset[obj->id - 1]); + _animation.load(&s, Animation::kTypeInventory); } } else { - if (surface.empty()) { - debug(0, "loading item %d from offset %x", obj->id, inventory->offset[obj->id - 1]); - Common::MemoryReadStream s(inventory->items + inventory->offset[obj->id - 1], inventory->offset[obj->id] - inventory->offset[obj->id - 1]); - surface.load(&s, Surface::kTypeOns); + if (_surface.empty()) { + debug(0, "loading item %d from offset %x", obj->id, inventory->_offset[obj->id - 1]); + Common::MemoryReadStream s(inventory->_items + inventory->_offset[obj->id - 1], inventory->_offset[obj->id] - inventory->_offset[obj->id - 1]); + _surface.load(&s, Surface::kTypeOns); } } } void Inventory::Item::render(Inventory *inventory, uint item_id, Graphics::Surface *dst, int delta) { - InventoryObject *obj = &inventory->objects[item_id]; + InventoryObject *obj = &inventory->_objects[item_id]; Resources *res = Resources::instance(); backgroundEffect(dst); - rect.render(dst, hovered ? 233 : 234); + _rect.render(dst, _hovered ? 233 : 234); load(inventory, item_id); if (obj->animated) { - if (hovered) { - Surface *s = animation.currentFrame(delta); - if (animation.currentIndex() == 0) - s = animation.currentFrame(1); //force index to be 1 here + if (_hovered) { + Surface *s = _animation.currentFrame(delta); + if (_animation.currentIndex() == 0) + s = _animation.currentFrame(1); //force index to be 1 here if (s != NULL) - s->render(dst, rect.left + 1, rect.top + 1); + s->render(dst, _rect.left + 1, _rect.top + 1); } else { - Surface *s = animation.firstFrame(); + Surface *s = _animation.firstFrame(); if (s != NULL) - s->render(dst, rect.left + 1, rect.top + 1); + s->render(dst, _rect.left + 1, _rect.top + 1); } } else { - surface.render(dst, rect.left + 1, rect.top + 1); + _surface.render(dst, _rect.left + 1, _rect.top + 1); } Common::String name; - if (inventory->selected_obj) { - name = inventory->selected_obj->name; + if (inventory->_selectedObj) { + name = inventory->_selectedObj->name; name += " & "; } - if (inventory->selected_obj != inventory->hovered_obj) + if (inventory->_selectedObj != inventory->_hoveredObj) name += obj->name; - if (hovered && inventory->_engine->scene->getMessage().empty()) { + if (_hovered && inventory->_engine->scene->getMessage().empty()) { int w = res->font7.render(NULL, 0, 0, name, 0xd1, true); res->font7.render(dst, (320 - w) / 2, 180, name, 0xd1, true); } @@ -352,17 +352,17 @@ void Inventory::render(Graphics::Surface *surface, int delta) { if (!_active) return; - background.render(surface); + _background.render(surface); for (int y = 0; y < 4; y++) { for (int x = 0; x < 6; x++) { int idx = x + 6 * y; - byte item = inventory[idx]; + byte item = _inventory[idx]; if (item == 0) continue; //debug(0, "%d,%d -> %u", x0, y0, item); - graphics[idx].render(this, item, surface, delta); + _graphics[idx].render(this, item, surface, delta); } } } diff --git a/engines/teenagent/inventory.h b/engines/teenagent/inventory.h index 23a2e8daaa9b..55c58a1c22c2 100644 --- a/engines/teenagent/inventory.h +++ b/engines/teenagent/inventory.h @@ -51,37 +51,40 @@ class Inventory { bool processEvent(const Common::Event &event); - InventoryObject *selectedObject() { return selected_obj; } - void resetSelectedObject() { selected_obj = NULL; } + InventoryObject *selectedObject() { return _selectedObj; } + void resetSelectedObject() { _selectedObj = NULL; } private: TeenAgentEngine *_engine; - Surface background; - byte *items; - uint offset[93]; + Surface _background; + byte *_items; + uint _offset[93]; + + Common::Array _objects; + byte *_inventory; - Common::Array objects; - byte *inventory; struct Item { - Animation animation; - Surface surface; - Rect rect; - bool hovered; + Animation _animation; + Surface _surface; + Rect _rect; + bool _hovered; - Item() : hovered(false) {} + Item() : _hovered(false) {} void free(); void load(Inventory *inventory, uint item_id); void backgroundEffect(Graphics::Surface *s); void render(Inventory *inventory, uint item_id, Graphics::Surface *surface, int delta); - } graphics[24]; + }; + + Item _graphics[24]; bool _active; - Common::Point mouse; - int hovered; + Common::Point _mouse; bool tryObjectCallback(InventoryObject *obj); - InventoryObject *hovered_obj, *selected_obj; + InventoryObject *_hoveredObj; + InventoryObject *_selectedObj; }; } // End of namespace TeenAgent From 808221a36fd8a3eff2172174e8998a9e068629c9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 11:04:08 +0200 Subject: [PATCH 138/369] TSAGE: Remove redundant semicolons --- engines/tsage/graphics.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index c90833a95f8f..b26952003975 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -40,8 +40,8 @@ class Region; */ class Rect : public Common::Rect, public Serialisable { public: - Rect() : Common::Rect() {}; - Rect(int16 x1, int16 y1, int16 x2, int16 y2) : Common::Rect(x1, y1, x2, y2) {}; + Rect() : Common::Rect() {} + Rect(int16 x1, int16 y1, int16 x2, int16 y2) : Common::Rect(x1, y1, x2, y2) {} void set(int16 x1, int16 y1, int16 x2, int16 y2); void collapse(int dx, int dy); @@ -60,7 +60,7 @@ class GfxColors { uint8 foreground; uint8 background; - GfxColors() : foreground(0), background(0) {}; + GfxColors() : foreground(0), background(0) {} }; class LineSlice { @@ -92,8 +92,8 @@ class GfxSurface { Graphics::Surface lockSurface(); void unlockSurface(); void create(int width, int height); - void setBounds(const Rect &bounds) { _bounds = bounds; }; - const Rect &getBounds() const { return _bounds; }; + void setBounds(const Rect &bounds) { _bounds = bounds; } + const Rect &getBounds() const { return _bounds; } void copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Region *priorityRegion = NULL); void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) { @@ -187,8 +187,8 @@ class GfxElement { virtual void setDefaults(); virtual void remove() { _owner = NULL; } virtual void highlight(); - virtual void draw() {}; - virtual bool process(Event &event) { return false; }; + virtual void draw() {} + virtual bool process(Event &event) { return false; } virtual bool focusedEvent(Event &event); }; @@ -229,7 +229,7 @@ class GfxButton : public GfxElement { public: Common::String _message; public: - GfxButton() : GfxElement() {}; + GfxButton() : GfxElement() {} virtual ~GfxButton() {} void setText(const Common::String &s) { @@ -271,7 +271,7 @@ class GfxManager { _surface.setBounds(_bounds); return _surface.lockSurface(); } - void unlockSurface() { _surface.unlockSurface(); }; + void unlockSurface() { _surface.unlockSurface(); } void fillArea(int xp, int yp, int color); void fillRect(const Rect &bounds, int color); void fillRect2(int xs, int ys, int width, int height, int color); From d25363c6758f4a6bc787621e75385e74a556c9e3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 13:04:51 +0200 Subject: [PATCH 139/369] BASE: Sync COPYING with latest version of the GPL 2.1 text --- COPYING | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/COPYING b/COPYING index b6f92f3dbfa5..75a1ad8761e0 100644 --- a/COPYING +++ b/COPYING @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names: This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file From 252e7a1ec323fc6cccb91dbdcae92db7efd851a6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 13:05:35 +0200 Subject: [PATCH 140/369] SWORD25: Fix ambiguous typing --- engines/sword25/util/lua/scummvm_file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp index 98fc1276a780..659f5a36c22c 100644 --- a/engines/sword25/util/lua/scummvm_file.cpp +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -59,7 +59,7 @@ Sword25FileProxy::~Sword25FileProxy() { } size_t Sword25FileProxy::read(void *ptr, size_t size, size_t count) { - size_t bytesRead = MIN(_readData.size() - _readPos, size * count); + size_t bytesRead = MIN(_readData.size() - _readPos, size * count); memmove(ptr, &_readData.c_str()[_readPos], bytesRead); _readPos += bytesRead; return bytesRead / size; From 45f9720f7c9f9b2b189ee74c2b167794a8a613f8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 23 May 2011 10:03:59 -0400 Subject: [PATCH 141/369] SWORD25: Properly use Theora picture offset/dimensions --- engines/sword25/fmv/theora_decoder.cpp | 21 +++++++++++++-------- engines/sword25/fmv/theora_decoder.h | 9 +++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/engines/sword25/fmv/theora_decoder.cpp b/engines/sword25/fmv/theora_decoder.cpp index 07cb56356d11..18f12607a51f 100644 --- a/engines/sword25/fmv/theora_decoder.cpp +++ b/engines/sword25/fmv/theora_decoder.cpp @@ -54,7 +54,6 @@ static double rint(double v) { TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) { _fileStream = 0; - _surface = 0; _theoraPacket = 0; _vorbisPacket = 0; @@ -298,8 +297,14 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { _endOfAudio = true; } - _surface = new Graphics::Surface(); - _surface->create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); + _surface.create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); + + // Set up a display surface + _displaySurface.pixels = _surface.getBasePtr(_theoraInfo.pic_x, _theoraInfo.pic_y); + _displaySurface.w = _theoraInfo.pic_width; + _displaySurface.h = _theoraInfo.pic_height; + _displaySurface.format = _surface.format; + _displaySurface.pitch = _surface.pitch; // Set the frame rate _frameRate = Common::Rational(_theoraInfo.fps_numerator, _theoraInfo.fps_denominator); @@ -337,9 +342,9 @@ void TheoraDecoder::close() { delete _fileStream; _fileStream = 0; - _surface->free(); - delete _surface; - _surface = 0; + _surface.free(); + _displaySurface.pixels = 0; + _displaySurface.free(); reset(); } @@ -412,7 +417,7 @@ const Graphics::Surface *TheoraDecoder::decodeNextFrame() { } } - return _surface; + return &_displaySurface; } bool TheoraDecoder::queueAudio() { @@ -533,7 +538,7 @@ void TheoraDecoder::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); - Graphics::convertYUV420ToRGB(_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); + Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); } } // End of namespace Sword25 diff --git a/engines/sword25/fmv/theora_decoder.h b/engines/sword25/fmv/theora_decoder.h index 10a05647c368..e8cc5ab8b90c 100644 --- a/engines/sword25/fmv/theora_decoder.h +++ b/engines/sword25/fmv/theora_decoder.h @@ -70,8 +70,8 @@ class TheoraDecoder : public Video::VideoDecoder { const Graphics::Surface *decodeNextFrame(); bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _surface->w; } - uint16 getHeight() const { return _surface->h; } + uint16 getWidth() const { return _displaySurface.w; } + uint16 getHeight() const { return _displaySurface.h; } uint32 getFrameCount() const { // It is not possible to get frame count easily @@ -80,7 +80,7 @@ class TheoraDecoder : public Video::VideoDecoder { return 0; } - Graphics::PixelFormat getPixelFormat() const { return _surface->format; } + Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } uint32 getElapsedTime() const; uint32 getTimeToNextFrame() const; @@ -96,7 +96,8 @@ class TheoraDecoder : public Video::VideoDecoder { void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); Common::SeekableReadStream *_fileStream; - Graphics::Surface *_surface; + Graphics::Surface _surface; + Graphics::Surface _displaySurface; Common::Rational _frameRate; double _nextFrameStartTime; bool _endOfVideo; From 76b8afc33607718da0955b6bd782dab15ef049dd Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 23 May 2011 16:48:39 +0200 Subject: [PATCH 142/369] SWORD25: Fix Theora audio endianism --- engines/sword25/fmv/theora_decoder.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sword25/fmv/theora_decoder.cpp b/engines/sword25/fmv/theora_decoder.cpp index 18f12607a51f..be6d940d2324 100644 --- a/engines/sword25/fmv/theora_decoder.cpp +++ b/engines/sword25/fmv/theora_decoder.cpp @@ -445,7 +445,11 @@ bool TheoraDecoder::queueAudio() { _audiobufFill += (i * _vorbisInfo.channels) << 1; if (_audiobufFill == AUDIOFD_FRAGSIZE) { - _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_STEREO); + byte flags = Audio::FLAG_16BITS | Audio::FLAG_STEREO; +#ifdef SCUMM_LITTLE_ENDIAN + flags |= Audio::FLAG_LITTLE_ENDIAN; +#endif + _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags); // The audio mixer is now responsible for the old audio buffer. // We need to create a new one. From 944e0be209f5ab47c3b903f258d2d41b990d80cb Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Mon, 23 May 2011 18:11:40 +0200 Subject: [PATCH 143/369] SAMSUNGTV: update port --- backends/base-backend.cpp | 4 -- .../samsungtvsdl/samsungtvsdl-graphics.cpp | 58 +++++++++++++++++++ .../samsungtvsdl/samsungtvsdl-graphics.h | 41 +++++++++++++ backends/module.mk | 3 +- backends/platform/samsungtv/main.cpp | 4 +- backends/platform/samsungtv/samsungtv.cpp | 36 +++++------- backends/platform/samsungtv/samsungtv.h | 10 ++-- backends/platform/sdl/main.cpp | 1 + backends/platform/sdl/posix/posix.cpp | 3 + backends/saves/posix/posix-saves.cpp | 2 +- 10 files changed, 127 insertions(+), 35 deletions(-) create mode 100644 backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp create mode 100644 backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index 68ec5efe62e1..f3935b5893f3 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -58,12 +58,8 @@ void BaseBackend::fillScreen(uint32 col) { #if defined(UNIX) -#if defined(SAMSUNGTV) -#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" -#else #define DEFAULT_CONFIG_FILE ".scummvmrc" #endif -#endif #if !defined(UNIX) #define DEFAULT_CONFIG_FILE "scummvm.ini" diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp new file mode 100644 index 000000000000..b929b5fe279c --- /dev/null +++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp @@ -0,0 +1,58 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "backends/platform/samsungtv/samsungtv.h" +#include "backends/events/samsungtvsdl/samsungtvsdl-events.h" +#include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" + +#if defined(SAMSUNGTV) + +SamsungTVSdlGraphicsManager::SamsungTVSdlGraphicsManager(SdlEventSource *sdlEventSource) + : SdlGraphicsManager(sdlEventSource) { +} + +bool SamsungTVSdlGraphicsManager::hasFeature(OSystem::Feature f) { + return + (f == OSystem::kFeatureAspectRatioCorrection) || + (f == OSystem::kFeatureCursorHasPalette); +} + +void SamsungTVSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { + switch (f) { + case OSystem::kFeatureAspectRatioCorrection: + SdlGraphicsManager::setFeatureState(f, enable); + break; + default: + break; + } +} + +bool SamsungTVSdlGraphicsManager::getFeatureState(OSystem::Feature f) { + switch (f) { + case OSystem::kFeatureAspectRatioCorrection: + return SdlGraphicsManager::getFeatureState(f); + default: + return false; + } +} + +#endif diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h new file mode 100644 index 000000000000..dc65c3a69635 --- /dev/null +++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h @@ -0,0 +1,41 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BACKENDS_GRAPHICS_SAMSUNGTV_H +#define BACKENDS_GRAPHICS_SAMSUNGTV_H + +#if defined(SAMSUNGTV) + +#include "backends/graphics/sdl/sdl-graphics.h" + +class SamsungTVSdlGraphicsManager : public SdlGraphicsManager { +public: + SamsungTVSdlGraphicsManager(SdlEventSource *sdlEventSource); + + bool hasFeature(OSystem::Feature f); + void setFeatureState(OSystem::Feature f, bool enable); + bool getFeatureState(OSystem::Feature f); +}; + +#endif + +#endif diff --git a/backends/module.mk b/backends/module.mk index 15af3ab763c4..adef8a2c0ace 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -149,7 +149,8 @@ endif ifeq ($(BACKEND),samsungstv) MODULE_OBJS += \ - events/samsungtvsdl/samsungtvsdl-events.o + events/samsungtvsdl/samsungtvsdl-events.o \ + graphics/samsungtvsdl/samsungtvsdl-graphics.o endif ifeq ($(BACKEND),webos) diff --git a/backends/platform/samsungtv/main.cpp b/backends/platform/samsungtv/main.cpp index a3253c12f16e..4f3291613d49 100644 --- a/backends/platform/samsungtv/main.cpp +++ b/backends/platform/samsungtv/main.cpp @@ -38,7 +38,7 @@ extern "C" int Game_Main(char *path, char *) { assert(g_system); // Pre initialize the backend - ((OSystem_SDL_SamsungTV *)g_system)->init(); + ((OSystem_POSIX *)g_system)->init(); #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new SDLPluginProvider()); @@ -48,7 +48,7 @@ extern "C" int Game_Main(char *path, char *) { int res = scummvm_main(0, 0); // Free OSystem - delete g_system; + delete (OSystem_SDL_SamsungTV *)g_system; return res; } diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp index 2cc520e6fa8f..cb657a0a221d 100644 --- a/backends/platform/samsungtv/samsungtv.cpp +++ b/backends/platform/samsungtv/samsungtv.cpp @@ -22,18 +22,13 @@ #include "backends/platform/samsungtv/samsungtv.h" #include "backends/events/samsungtvsdl/samsungtvsdl-events.h" +#include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" #if defined(SAMSUNGTV) OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : - OSystem_POSIX("/dtv/usb/sda1/.scummvmrc") { -} - -bool OSystem_SDL_SamsungTV::hasFeature(Feature f) { - return - (f == OSystem::kFeatureAspectRatioCorrection) || - (f == OSystem::kFeatureCursorHasPalette); + OSystem_POSIX("/mtd_rwarea/scummvm/.scummvmrc") { } void OSystem_SDL_SamsungTV::initBackend() { @@ -41,27 +36,22 @@ void OSystem_SDL_SamsungTV::initBackend() { if (_eventSource == 0) _eventSource = new SamsungTVSdlEventSource(); + if (_graphicsManager == 0) + _graphicsManager = new SamsungTVSdlGraphicsManager(_eventSource); + // Call parent implementation of this method - OSystem_SDL::initBackend(); + OSystem_POSIX::initBackend(); } -void OSystem_SDL_SamsungTV::setFeatureState(Feature f, bool enable) { - switch (f) { - case OSystem::kFeatureAspectRatioCorrection: - _graphicsManager->setFeatureState(f, enable); - break; - default: - break; - } +void OSystem_SDL_SamsungTV::quit() { + delete this; } -bool OSystem_SDL_SamsungTV::getFeatureState(Feature f) { - switch (f) { - case OSystem::kFeatureAspectRatioCorrection: - return _graphicsManager->getFeatureState(f); - default: - return false; - } +void OSystem_SDL_SamsungTV::fatalError() { + delete this; + // FIXME + warning("fatal error"); + for (;;) {} } #endif diff --git a/backends/platform/samsungtv/samsungtv.h b/backends/platform/samsungtv/samsungtv.h index 22a96495b732..b7a78a96cd16 100644 --- a/backends/platform/samsungtv/samsungtv.h +++ b/backends/platform/samsungtv/samsungtv.h @@ -23,6 +23,8 @@ #ifndef PLATFORM_SDL_SAMSUNGTV_H #define PLATFORM_SDL_SAMSUNGTV_H +#if defined(SAMSUNGTV) + #include "backends/platform/sdl/posix/posix.h" class OSystem_SDL_SamsungTV : public OSystem_POSIX { @@ -30,10 +32,10 @@ class OSystem_SDL_SamsungTV : public OSystem_POSIX { OSystem_SDL_SamsungTV(); virtual void initBackend(); - - virtual bool hasFeature(Feature f); - virtual void setFeatureState(Feature f, bool enable); - virtual bool getFeatureState(Feature f); + virtual void quit(); + virtual void fatalError(); }; #endif + +#endif diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index e8bb9210c381..a0a64e115532 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -33,6 +33,7 @@ !defined(DINGUX) && \ !defined(CAANOO) && \ !defined(LINUXMOTO) && \ + !defined(SAMSUNGTV) && \ !defined(OPENPANDORA) #include "backends/platform/sdl/sdl.h" diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 1122e9b20ac9..84bbf55a9215 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -82,6 +82,9 @@ Common::WriteStream *OSystem_POSIX::createLogFile() { #else logFile += "/.scummvm"; #endif +#ifdef SAMSUNGTV + logFile = "/mtd_ram"; +#endif struct stat sb; diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index 5145a03c1145..d82f8a1845a3 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -50,7 +50,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() { // Register default savepath based on HOME #if defined(SAMSUNGTV) - ConfMan.registerDefault("savepath", "/dtv/usb/sda1/.scummvm"); + ConfMan.registerDefault("savepath", "/mtd_rwarea/scummvm/savegames"); #else Common::String savePath; const char *home = getenv("HOME"); From fa2c268d6a813a2fdfc4475607b1ebb5d878a624 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 14:21:00 +0200 Subject: [PATCH 144/369] SWORD25: Replace some non-portable calls, add FIXMEs --- engines/sword25/util/lua/loslib.cpp | 42 ++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/engines/sword25/util/lua/loslib.cpp b/engines/sword25/util/lua/loslib.cpp index 578a7cb09a1f..ac634db5588c 100644 --- a/engines/sword25/util/lua/loslib.cpp +++ b/engines/sword25/util/lua/loslib.cpp @@ -4,9 +4,6 @@ ** See Copyright Notice in lua.h */ - -#include -#include #include #define loslib_c @@ -17,9 +14,16 @@ #include "lauxlib.h" #include "lualib.h" +// FIXME: Get rid of all time.h stuff +#define FORBIDDEN_SYMBOL_EXCEPTION_time_h + +#include "common/system.h" + static int os_execute (lua_State *L) { - lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); + // Non-portable call, removed in ScummVM. + // FIXME: Is this ever invoked? If so, investigate that code further. + lua_pushinteger(L, -1); // signal that an error occurred return 1; } @@ -35,24 +39,30 @@ static int os_remove (lua_State *L) { static int os_rename (lua_State *L) { - // Removed in ScummVM, does nothing. + // Non-portable call, removed in ScummVM. return 1; } static int os_tmpname (lua_State *L) { + // Non-portable call, removed in ScummVM. + // FIXME: Why do we return an error in tmpname, but for other + // removed methods we just do nothing? return luaL_error(L, "unable to generate a unique filename"); } static int os_getenv (lua_State *L) { - lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + // Non-portable call, removed in ScummVM. + // FIXME: Is this ever invoked? If so, investigate that code further. + lua_pushstring(L, NULL); return 1; } static int os_clock (lua_State *L) { - lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + // Non-portable call to clock() replaced by invocation of OSystem::getMillis. + lua_pushnumber(L, ((lua_Number)g_system->getMillis())/(lua_Number)1000); return 1; } @@ -103,6 +113,12 @@ static int getfield (lua_State *L, const char *key, int d) { static int os_date (lua_State *L) { const char *s = luaL_optstring(L, 1, "%c"); + // FIXME: Rewrite the code below to use OSystem::getTimeAndDate + // Alternatively, remove it, if sword25 does not use it. + // + // The former would mean sacrificing the ability to choose the timezone, *or* + // we would have to drive an effort to add time zone support to OSystem (is it + // worth that, though???) time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); struct tm *stm; if (*s == '!') { /* UTC? */ @@ -148,6 +164,8 @@ static int os_date (lua_State *L) { static int os_time (lua_State *L) { + // FIXME: Rewrite the code below to use OSystem::getTimeAndDate. + // Alternatively, remove it, if sword25 does not use it. time_t t; if (lua_isnoneornil(L, 1)) /* called without args? */ t = time(NULL); /* get current time */ @@ -173,6 +191,9 @@ static int os_time (lua_State *L) { static int os_difftime (lua_State *L) { + // FIXME: difftime is not portable, unfortunately. + // So we either have to replace this code, or just remove it, + // depending on whether sword25 actually uses it. lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), (time_t)(luaL_optnumber(L, 2, 0)))); return 1; @@ -189,6 +210,13 @@ static int os_setlocale (lua_State *L) { static int os_exit (lua_State *L) { + // FIXME: Using exit is not portable! + // Using OSystem::quit() isn't really a great idea, either. + // We really would prefer to let the main run loop exit, so that + // our main() can perform cleanup. + g_system->quit(); + // leave the exit call in there for now, in case some of our + // OSystem::quit applications are incorrect... *sigh* exit(luaL_optint(L, 1, EXIT_SUCCESS)); } From 3931e1dc50ad773aa3f9d95b2810857a3e7ce943 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 17:43:58 +0200 Subject: [PATCH 145/369] SWORD25: Avoid including lua headers in other headers --- engines/sword25/math/vertex.h | 3 ++- engines/sword25/script/luascript.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sword25/math/vertex.h b/engines/sword25/math/vertex.h index 817f48e76094..4cb0eaca300d 100644 --- a/engines/sword25/math/vertex.h +++ b/engines/sword25/math/vertex.h @@ -43,7 +43,8 @@ #include #include "common/rect.h" #include "sword25/kernel/common.h" -#include "sword25/util/lua/lua.h" + +struct lua_State; #if defined(MACOSX) || defined(SOLARIS) || defined(__MINGW32__) #define sqrtf(x) ((float)sqrt(x)) diff --git a/engines/sword25/script/luascript.h b/engines/sword25/script/luascript.h index f3530d68ed38..cd6d0e887857 100644 --- a/engines/sword25/script/luascript.h +++ b/engines/sword25/script/luascript.h @@ -36,7 +36,8 @@ #include "common/str-array.h" #include "sword25/kernel/common.h" #include "sword25/script/script.h" -#include "sword25/util/lua/lua.h" + +struct lua_State; namespace Sword25 { From 8e3aafd30d14bcd586cc06a525e2dc2a8298c7b2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 18:32:42 +0200 Subject: [PATCH 146/369] COMMON: Provide our own implementations for scumm_str(n)icmp This takes up a tiny little bit of extra binary size, but gets rid of some awful #ifdef hackery. --- backends/platform/wince/missing/io.h | 1 - backends/platform/wince/portdefs.h | 4 ---- common/scummsys.h | 24 ++++++++------------ common/str.cpp | 33 ++++++++++++++++++++++++++++ test/common/str.h | 17 ++++++++++++++ 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/backends/platform/wince/missing/io.h b/backends/platform/wince/missing/io.h index 96bc6a9ea16e..de492cac6846 100644 --- a/backends/platform/wince/missing/io.h +++ b/backends/platform/wince/missing/io.h @@ -1,7 +1,6 @@ /* Header is not present in Windows CE SDK */ /* This stuff will live here until port configuration file is in place */ -#define stricmp _stricmp #define strdup _strdup #ifndef _FILE_DEFINED diff --git a/backends/platform/wince/portdefs.h b/backends/platform/wince/portdefs.h index 1f8b9bb3ca29..64aa80abf26f 100644 --- a/backends/platform/wince/portdefs.h +++ b/backends/platform/wince/portdefs.h @@ -31,8 +31,6 @@ int isprint(int c); int isspace(int c); char *strrchr(const char *s, int c); char *strdup(const char *s); -int _stricmp(const char *string1, const char *string2); -int stricmp(const char *string1, const char *string2); void assert(void *expression); void assert(int expression); long int strtol(const char *nptr, char **endptr, int base); @@ -53,8 +51,6 @@ void GetCurrentDirectory(int len, char *buf); #include #undef GetCurrentDirectory extern "C" void GetCurrentDirectory(int len, char *buf); -#define stricmp _stricmp -#define strnicmp _strnicmp #define snprintf _snprintf #define strdup _strdup #define fopen wce_fopen diff --git a/common/scummsys.h b/common/scummsys.h index 2420349245fa..5cf3ba4dadab 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -107,21 +107,6 @@ #include "config.h" #endif -// -// Define scumm_stricmp and scumm_strnicmp -// -#if defined(_WIN32_WCE) || defined(_MSC_VER) - #define scumm_stricmp stricmp - #define scumm_strnicmp _strnicmp - #define snprintf _snprintf -#elif defined(__MINGW32__) || defined(__GP32__) || defined(__DS__) - #define scumm_stricmp stricmp - #define scumm_strnicmp strnicmp -#else - #define scumm_stricmp strcasecmp - #define scumm_strnicmp strncasecmp -#endif - // In the following we configure various targets, in particular those // which can't use our "configure" tool and hence don't use config.h. @@ -404,6 +389,15 @@ #endif +// +// Define scumm_stricmp and scumm_strnicmp +// +extern int scumm_stricmp(const char *s1, const char *s2); +extern int scumm_strnicmp(const char *s1, const char *s2, uint n); +#if defined(_WIN32_WCE) || defined(_MSC_VER) + // FIXME: Why is this necessary? + #define snprintf _snprintf +#endif // diff --git a/common/str.cpp b/common/str.cpp index 08a6cb6822f3..740e7b6a0671 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -833,3 +833,36 @@ size_t strlcat(char *dst, const char *src, size_t size) { } } // End of namespace Common + +// Portable implementation of stricmp / strcasecmp / strcmpi. +// TODO: Rename this to Common::strcasecmp +int scumm_stricmp(const char *s1, const char *s2) { + byte l1, l2; + do { + // Don't use ++ inside tolower, in case the macro uses its + // arguments more than once. + l1 = (byte)*s1++; + l1 = tolower(l1); + l2 = (byte)*s2++; + l2 = tolower(l2); + } while (l1 == l2 && l1 != 0); + return l1 - l2; +} + +// Portable implementation of strnicmp / strncasecmp / strncmpi. +// TODO: Rename this to Common::strncasecmp +int scumm_strnicmp(const char *s1, const char *s2, uint n) { + byte l1, l2; + do { + if (n-- == 0) + return 0; // no difference found so far -> signal equality + + // Don't use ++ inside tolower, in case the macro uses its + // arguments more than once. + l1 = (byte)*s1++; + l1 = tolower(l1); + l2 = (byte)*s2++; + l2 = tolower(l2); + } while (l1 == l2 && l1 != 0); + return l1 - l2; +} diff --git a/test/common/str.h b/test/common/str.h index 5d9fe29af9d9..0dee16a493c5 100644 --- a/test/common/str.h +++ b/test/common/str.h @@ -378,4 +378,21 @@ class StringTestSuite : public CxxTest::TestSuite TS_ASSERT_EQUALS(Common::strlcat(test4, appendString, 11), strlen(resultString)); TS_ASSERT_EQUALS(strcmp(test4, resultString), 0); } + + void test_scumm_stricmp() { + TS_ASSERT_EQUALS(scumm_stricmp("abCd", "abCd"), 0); + TS_ASSERT_EQUALS(scumm_stricmp("abCd", "ABCd"), 0); + TS_ASSERT_LESS_THAN(scumm_stricmp("abCd", "ABCe"), 0); + TS_ASSERT_LESS_THAN(scumm_stricmp("abCd", "ABCde"), 0); + } + + void test_scumm_strnicmp() { + TS_ASSERT_EQUALS(scumm_strnicmp("abCd", "abCd", 3), 0); + TS_ASSERT_EQUALS(scumm_strnicmp("abCd", "ABCd", 4), 0); + TS_ASSERT_EQUALS(scumm_strnicmp("abCd", "ABCd", 5), 0); + TS_ASSERT_EQUALS(scumm_strnicmp("abCd", "ABCe", 3), 0); + TS_ASSERT_LESS_THAN(scumm_strnicmp("abCd", "ABCe", 4), 0); + TS_ASSERT_EQUALS(scumm_strnicmp("abCd", "ABCde", 4), 0); + TS_ASSERT_LESS_THAN(scumm_strnicmp("abCd", "ABCde", 5), 0); + } }; From e6c78b4f469729726561af44aa1df8259f0fdf27 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 18:59:37 +0200 Subject: [PATCH 147/369] SWORD25: Include scummsys.h from lua.h, partially deal with the consequences This should help mark the spots that are still non-portable, just follow the FIXMEs. --- engines/sword25/util/lua/ldo.cpp | 18 ++++++++ engines/sword25/util/lua/lmathlib.cpp | 4 ++ engines/sword25/util/lua/loadlib.cpp | 65 +++++++-------------------- engines/sword25/util/lua/loslib.cpp | 6 +-- engines/sword25/util/lua/lua.h | 2 + engines/sword25/util/lua/print.cpp | 3 ++ 6 files changed, 46 insertions(+), 52 deletions(-) diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp index 07508fbb141d..b03992385a6d 100644 --- a/engines/sword25/util/lua/ldo.cpp +++ b/engines/sword25/util/lua/ldo.cpp @@ -5,6 +5,14 @@ */ +// FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. +// Neither of these is supported in ScummVM. So we need to come up +// with a replacement. The most simple, direct and crude approach: +// Replace "throw" with an "error()" call. Of course we only +// would want to do that if this actually never happens... +#define FORBIDDEN_SYMBOL_EXCEPTION_setjmp +#define FORBIDDEN_SYMBOL_EXCEPTION_longjmp + #include #include #include @@ -94,6 +102,11 @@ static void resetstack (lua_State *L, int status) { void luaD_throw (lua_State *L, int errcode) { if (L->errorJmp) { L->errorJmp->status = errcode; + // FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. + // Neither of these is supported in ScummVM. So we need to come up + // with a replacement. The most simple, direct and crude approach: + // Replace "throw" with an "error()" call. Of course we only + // would want to do that if this actually never happens... LUAI_THROW(L, L->errorJmp); } else { @@ -113,6 +126,11 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { lj.status = 0; lj.previous = L->errorJmp; /* chain new error handler */ L->errorJmp = &lj; + // FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. + // Neither of these is supported in ScummVM. So we need to come up + // with a replacement. The most simple, direct and crude approach: + // Replace "throw" with an "error()" call. Of course we only + // would want to do that if this actually never happens... LUAI_TRY(L, &lj, (*f)(L, ud); ); diff --git a/engines/sword25/util/lua/lmathlib.cpp b/engines/sword25/util/lua/lmathlib.cpp index 7e64d7578923..6c36bbcf4e2b 100644 --- a/engines/sword25/util/lua/lmathlib.cpp +++ b/engines/sword25/util/lua/lmathlib.cpp @@ -5,6 +5,10 @@ */ +// FIXME: rand and srand should be replaced by a RandomSource +#define FORBIDDEN_SYMBOL_EXCEPTION_rand +#define FORBIDDEN_SYMBOL_EXCEPTION_srand + #include // MSVC does not define M_PI, M_SQRT2 and other math defines by default. // _USE_MATH_DEFINES must be defined in order to have these defined, thus diff --git a/engines/sword25/util/lua/loadlib.cpp b/engines/sword25/util/lua/loadlib.cpp index 2549e2bdb11c..2fa831ac2a5a 100644 --- a/engines/sword25/util/lua/loadlib.cpp +++ b/engines/sword25/util/lua/loadlib.cpp @@ -8,6 +8,15 @@ ** implementation for Windows, and a stub for other systems. */ +// FIXME: Avoid using these APIs. +// Actually, this could be achieved by removing 80% of the remaining +// code in this file. Most of it is an elaborate way of expressing +// something like "return ERROR;" anyway, as we don't support loading +// dynamic libs +#define FORBIDDEN_SYMBOL_EXCEPTION_FILE +#define FORBIDDEN_SYMBOL_EXCEPTION_fopen +#define FORBIDDEN_SYMBOL_EXCEPTION_fclose + #include #include @@ -39,13 +48,6 @@ #define ERRLIB 1 #define ERRFUNC 2 -#define setprogdir(L) ((void)0) - - -static void ll_unloadlib (void *lib); -static void *ll_load (lua_State *L, const char *path); -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); - /* ** {====================================================== @@ -60,24 +62,6 @@ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); #define DLMSG "dynamic libraries not enabled; check your Lua installation" -static void ll_unloadlib (void *lib) { - (void)lib; /* to avoid warnings */ -} - - -static void *ll_load (lua_State *L, const char *path) { - (void)path; /* to avoid warnings */ - lua_pushliteral(L, DLMSG); - return NULL; -} - - -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { - (void)lib; (void)sym; /* to avoid warnings */ - lua_pushliteral(L, DLMSG); - return NULL; -} - /* }====================================================== */ @@ -108,7 +92,6 @@ static void **ll_register (lua_State *L, const char *path) { */ static int gctm (lua_State *L) { void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); - if (*lib) ll_unloadlib(*lib); *lib = NULL; /* mark library as closed */ return 0; } @@ -116,15 +99,11 @@ static int gctm (lua_State *L) { static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { void **reg = ll_register(L, path); - if (*reg == NULL) *reg = ll_load(L, path); - if (*reg == NULL) + if (*reg == NULL) { + lua_pushliteral(L, DLMSG); // loading not supported, just push an error msg return ERRLIB; /* unable to load library */ - else { - lua_CFunction f = ll_sym(L, *reg, sym); - if (f == NULL) - return ERRFUNC; /* unable to find function */ - lua_pushcfunction(L, f); - return 0; /* return function */ + } else { + return ERRFUNC; /* unable to find function */ } } @@ -407,23 +386,11 @@ static int ll_seeall (lua_State *L) { -/* auxiliary mark (for internal use) */ -#define AUXMARK "\1" - static void setpath (lua_State *L, const char *fieldname, const char *envname, const char *def) { - const char *path = getenv(envname); - if (path == NULL) /* no environment variable? */ - lua_pushstring(L, def); /* use default */ - else { - /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ - path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, - LUA_PATHSEP AUXMARK LUA_PATHSEP); - luaL_gsub(L, path, AUXMARK, def); - lua_remove(L, -2); - } - setprogdir(L); - lua_setfield(L, -2, fieldname); + // no environment variable -> use default + lua_pushstring(L, def); + lua_setfield(L, -2, fieldname); } diff --git a/engines/sword25/util/lua/loslib.cpp b/engines/sword25/util/lua/loslib.cpp index ac634db5588c..c46aea59bda4 100644 --- a/engines/sword25/util/lua/loslib.cpp +++ b/engines/sword25/util/lua/loslib.cpp @@ -4,6 +4,9 @@ ** See Copyright Notice in lua.h */ +// FIXME: Get rid of all time.h stuff +#define FORBIDDEN_SYMBOL_EXCEPTION_time_h + #include #define loslib_c @@ -14,9 +17,6 @@ #include "lauxlib.h" #include "lualib.h" -// FIXME: Get rid of all time.h stuff -#define FORBIDDEN_SYMBOL_EXCEPTION_time_h - #include "common/system.h" diff --git a/engines/sword25/util/lua/lua.h b/engines/sword25/util/lua/lua.h index 088a511cf964..417cdadf8bf5 100644 --- a/engines/sword25/util/lua/lua.h +++ b/engines/sword25/util/lua/lua.h @@ -9,6 +9,8 @@ #ifndef lua_h #define lua_h +#include "common/scummsys.h" + #include #include diff --git a/engines/sword25/util/lua/print.cpp b/engines/sword25/util/lua/print.cpp index 22039c986141..70c6081b818e 100644 --- a/engines/sword25/util/lua/print.cpp +++ b/engines/sword25/util/lua/print.cpp @@ -4,6 +4,9 @@ ** See Copyright Notice in lua.h */ +// FIXME +#define FORBIDDEN_SYMBOL_EXCEPTION_printf + #include #include From 590c6ede63d9fa61d2b05ce74596b043f5c79bc8 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 19:09:34 +0200 Subject: [PATCH 148/369] BACKENDS: Move SCUMMVM_SAVEPATH env var handling to POSIX savefile manager --- backends/saves/posix/posix-saves.cpp | 24 +++++++++++++++++++++++- base/commandLine.cpp | 20 -------------------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index d82f8a1845a3..37545c77c292 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -21,7 +21,8 @@ */ -// Enable mkdir +// Enable getenv, mkdir and time.h stuff +#define FORBIDDEN_SYMBOL_EXCEPTION_getenv #define FORBIDDEN_SYMBOL_EXCEPTION_mkdir #define FORBIDDEN_SYMBOL_EXCEPTION_time_h //On IRIX, sys/stat.h includes sys/time.h @@ -59,6 +60,27 @@ POSIXSaveFileManager::POSIXSaveFileManager() { savePath += "/" DEFAULT_SAVE_PATH; ConfMan.registerDefault("savepath", savePath); } + + // The user can override the savepath with the SCUMMVM_SAVEPATH + // environment variable. This is weaker than a --savepath on the + // command line, but overrides the default savepath. + // + // To ensure that the command line option (if given) has precedence, + // we only set the value in the transient domain if it is not + // yet present there. + if (!ConfMan.hasKey("savepath", Common::ConfigManager::kTransientDomain)) { + const char *dir = getenv("SCUMMVM_SAVEPATH"); + if (dir && *dir && strlen(dir) < MAXPATHLEN) { + Common::FSNode saveDir(dir); + if (!saveDir.exists()) { + warning("Ignoring non-existent SCUMMVM_SAVEPATH '%s'", dir); + } else if (!saveDir.isWritable()) { + warning("Ignoring non-writable SCUMMVM_SAVEPATH '%s'", dir); + } else { + ConfMan.set("savepath", dir, Common::ConfigManager::kTransientDomain); + } + } + } #endif } /* diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 1ca4a642c823..f819b0365848 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -958,26 +958,6 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin } - // The user can override the savepath with the SCUMMVM_SAVEPATH - // environment variable. This is weaker than a --savepath on the - // command line, but overrides the default savepath, hence it is - // handled here, just before the command line gets parsed. -#if !defined(_WIN32_WCE) && !defined(__GP32__) && !defined(ANDROID) - if (!settings.contains("savepath")) { - const char *dir = getenv("SCUMMVM_SAVEPATH"); - if (dir && *dir && strlen(dir) < MAXPATHLEN) { - Common::FSNode saveDir(dir); - if (!saveDir.exists()) { - warning("Non-existent SCUMMVM_SAVEPATH save path. It will be ignored"); - } else if (!saveDir.isWritable()) { - warning("Non-writable SCUMMVM_SAVEPATH save path. It will be ignored"); - } else { - settings["savepath"] = dir; - } - } - } -#endif - // Finally, store the command line settings into the config manager. for (Common::StringMap::const_iterator x = settings.begin(); x != settings.end(); ++x) { Common::String key(x->_key); From 6f6051a9e1da4d4debc1bf851b101c7a40d8b531 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 19:11:19 +0200 Subject: [PATCH 149/369] COMMON: Mark more symbols as forbidden --- backends/fs/posix/posix-fs.cpp | 1 + backends/platform/sdl/posix/posix.cpp | 1 + common/forbidden.h | 41 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 4d69a51a03b6..7f2ca695c56e 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -26,6 +26,7 @@ #define FORBIDDEN_SYMBOL_EXCEPTION_time_h #define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h #define FORBIDDEN_SYMBOL_EXCEPTION_mkdir +#define FORBIDDEN_SYMBOL_EXCEPTION_getenv #include "backends/fs/posix/posix-fs.h" #include "backends/fs/stdiostream.h" diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 84bbf55a9215..4dd0039c1ecf 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -20,6 +20,7 @@ * */ +#define FORBIDDEN_SYMBOL_EXCEPTION_getenv #define FORBIDDEN_SYMBOL_EXCEPTION_mkdir #define FORBIDDEN_SYMBOL_EXCEPTION_time_h //On IRIX, sys/stat.h includes sys/time.h diff --git a/common/forbidden.h b/common/forbidden.h index d769ff38bef4..d9282b78856e 100644 --- a/common/forbidden.h +++ b/common/forbidden.h @@ -140,6 +140,26 @@ #define system(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_getenv +#undef getenv +#define getenv(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_putenv +#undef putenv +#define putenv(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_setenv +#undef setenv +#define setenv(a,b,c) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_unsetenv +#undef unsetenv +#define unsetenv(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + // // Disable various symbols from time.h @@ -281,6 +301,27 @@ #endif +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_stricmp +#undef stricmp +#define stricmp(a,b) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_strnicmp +#undef strnicmp +#define strnicmp(a,b,c) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_strcasecmp +#undef strcasecmp +#define strcasecmp(a,b) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_strncasecmp +#undef strncasecmp +#define strncasecmp(a,b,c) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + + /* * We also would like to disable the following symbols; * however, these are also frequently used in regular code, From 20cad6e8b6fe9ae843245697e872256c4ca1e545 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 19:36:45 +0200 Subject: [PATCH 150/369] COMMON: Modify Base::processSettings, get rid of Common::kArgumentNotProcessed Instead of defining a hacked up Common::Error code, split the return value of processSettings into two parts: An error code, and a value which indicates whether the specified command was completely handled by processSettings or not. --- base/commandLine.cpp | 24 ++++++++++++++---------- base/commandLine.h | 21 ++++++++++++++++++++- base/main.cpp | 3 +-- common/error.cpp | 3 --- common/error.h | 3 --- common/forbidden.h | 5 +++++ common/textconsole.cpp | 2 ++ 7 files changed, 42 insertions(+), 19 deletions(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index f819b0365848..78eea500829a 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -23,6 +23,8 @@ // FIXME: Avoid using printf #define FORBIDDEN_SYMBOL_EXCEPTION_printf +#define FORBIDDEN_SYMBOL_EXCEPTION_exit + #include "engines/metaengine.h" #include "base/commandLine.h" #include "base/plugins.h" @@ -885,7 +887,8 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha #endif // DISABLE_COMMAND_LINE -Common::Error processSettings(Common::String &command, Common::StringMap &settings) { +bool processSettings(Common::String &command, Common::StringMap &settings, Common::Error &err) { + err = Common::kNoError; #ifndef DISABLE_COMMAND_LINE @@ -894,33 +897,34 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin // have been loaded. if (command == "list-targets") { listTargets(); - return Common::kNoError; + return true; } else if (command == "list-games") { listGames(); - return Common::kNoError; + return true; } else if (command == "list-saves") { - return listSaves(settings["list-saves"].c_str()); + err = listSaves(settings["list-saves"].c_str()); + return true; } else if (command == "list-themes") { listThemes(); - return Common::kNoError; + return true; } else if (command == "version") { printf("%s\n", gScummVMFullVersion); printf("Features compiled in: %s\n", gScummVMFeatures); - return Common::kNoError; + return true; } else if (command == "help") { printf(HELP_STRING, s_appName); - return Common::kNoError; + return true; } #ifdef DETECTOR_TESTING_HACK else if (command == "test-detector") { runDetectorTest(); - return Common::kNoError; + return true; } #endif #ifdef UPGRADE_ALL_TARGETS_HACK else if (command == "upgrade-targets") { upgradeTargets(); - return Common::kNoError; + return true; } #endif @@ -972,7 +976,7 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin ConfMan.set(key, value, Common::ConfigManager::kTransientDomain); } - return Common::kArgumentNotProcessed; + return false; } } // End of namespace Base diff --git a/base/commandLine.h b/base/commandLine.h index 4e611d97bfa9..2798ab09349c 100644 --- a/base/commandLine.h +++ b/base/commandLine.h @@ -32,9 +32,28 @@ class String; namespace Base { +/** + * Register various defaults with the ConfigManager. + */ void registerDefaults(); + +/** + * Parse the command line for options and a command; the options + * are stored in the map 'settings, the command (if any) is returned. + */ Common::String parseCommandLine(Common::StringMap &settings, int argc, const char * const *argv); -Common::Error processSettings(Common::String &command, Common::StringMap &settings); + +/** + * Process the command line options and arguments. + * Returns true if everything was handled and ScummVM should quit + * (e.g. because "--help" was specified, and handled). + * + * @param[in] command the command as returned by parseCommandLine + * @param[in] settings the settings as returned by parseCommandLine + * @param[out] err indicates whether any error occurred, and which + * @return true if the command was completely processed and ScummVM should quit, false otherwise + */ +bool processSettings(Common::String &command, Common::StringMap &settings, Common::Error &err); } // End of namespace Base diff --git a/base/main.cpp b/base/main.cpp index 4ed70a5587c6..906f4c92428f 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -349,8 +349,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { Common::Error res; // TODO: deal with settings that require plugins to be loaded - res = Base::processSettings(command, settings); - if (res.getCode() != Common::kArgumentNotProcessed) { + if (Base::processSettings(command, settings, res)) { if (res.getCode() != Common::kNoError) warning("%s", res.getDesc().c_str()); return res.getCode(); diff --git a/common/error.cpp b/common/error.cpp index f150f268c085..a6c52a0ce953 100644 --- a/common/error.cpp +++ b/common/error.cpp @@ -67,9 +67,6 @@ static String errorToString(ErrorCode errorCode) { case kEnginePluginNotSupportSaves: return _s("Engine plugin does not support save states"); - case kArgumentNotProcessed: - return _s("Command line argument not processed"); - case kUnknownError: default: return _s("Unknown error"); diff --git a/common/error.h b/common/error.h index c06cec4a0b25..23c12b67e4cd 100644 --- a/common/error.h +++ b/common/error.h @@ -47,7 +47,6 @@ enum ErrorCode { kUnsupportedGameidError, ///< Engine initialization: Gameid not supported by this (Meta)Engine kUnsupportedColorMode, ///< Engine initialization: Engine does not support backend's color mode - kReadPermissionDenied, ///< Unable to read data due to missing read permission kWritePermissionDenied, ///< Unable to write data due to missing write permission @@ -63,8 +62,6 @@ enum ErrorCode { kEnginePluginNotFound, ///< Failed to find plugin to handle target kEnginePluginNotSupportSaves, ///< Failed if plugin does not support listing save states - kArgumentNotProcessed, ///< Used in command line parsing - kUnknownError ///< Catch-all error, used if no other error code matches }; diff --git a/common/forbidden.h b/common/forbidden.h index d9282b78856e..f127983006b2 100644 --- a/common/forbidden.h +++ b/common/forbidden.h @@ -140,6 +140,11 @@ #define system(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_exit +#undef exit +#define exit(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_getenv #undef getenv #define getenv(a) FORBIDDEN_SYMBOL_REPLACEMENT diff --git a/common/textconsole.cpp b/common/textconsole.cpp index 0bd233d206e1..f2325ac9ad98 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#define FORBIDDEN_SYMBOL_EXCEPTION_exit + #include "common/textconsole.h" #include "common/system.h" #include "common/str.h" From 6c5f50c246062bcb50a20efe7951be7e23449ca0 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 19:20:56 +0200 Subject: [PATCH 151/369] COMMON: Add exit() to list of forbidden symbols --- backends/modular-backend.cpp | 6 ++++++ backends/modular-backend.h | 3 +-- backends/platform/sdl/sdl.cpp | 1 + engines/agi/loader_v2.cpp | 4 ++-- engines/sci/console.cpp | 2 +- engines/sword25/util/lua/ldo.cpp | 4 +++- engines/sword25/util/lua/loslib.cpp | 8 ++++---- 7 files changed, 18 insertions(+), 10 deletions(-) diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp index fe3991af655f..c5f147ffe172 100644 --- a/backends/modular-backend.cpp +++ b/backends/modular-backend.cpp @@ -20,6 +20,8 @@ * */ +#define FORBIDDEN_SYMBOL_EXCEPTION_exit + #include "backends/modular-backend.h" #include "backends/fs/fs-factory.h" @@ -277,3 +279,7 @@ FilesystemFactory *ModularBackend::getFilesystemFactory() { assert(_fsFactory); return _fsFactory; } + +void ModularBackend::quit() { + exit(0); +} diff --git a/backends/modular-backend.h b/backends/modular-backend.h index 43148b6e4a95..e46fbfdd214a 100644 --- a/backends/modular-backend.h +++ b/backends/modular-backend.h @@ -148,8 +148,7 @@ class ModularBackend : public OSystem { virtual Common::SaveFileManager *getSavefileManager(); virtual FilesystemFactory *getFilesystemFactory(); - virtual void quit() { exit(0); } - virtual void setWindowCaption(const char *caption) {} + virtual void quit(); virtual void displayMessageOnOSD(const char *msg); //@} diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 5cb409794bfb..a3fb719ca4d5 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -21,6 +21,7 @@ */ #define FORBIDDEN_SYMBOL_EXCEPTION_time_h +#define FORBIDDEN_SYMBOL_EXCEPTION_exit #ifdef WIN32 #define WIN32_LEAN_AND_MEAN diff --git a/engines/agi/loader_v2.cpp b/engines/agi/loader_v2.cpp index f5f8830b4305..a2ac6f011174 100644 --- a/engines/agi/loader_v2.cpp +++ b/engines/agi/loader_v2.cpp @@ -149,11 +149,11 @@ uint8 *AgiLoader_v2::loadVolRes(struct AgiDir *agid) { fp.read(&x, 5); if ((sig = READ_BE_UINT16((uint8 *) x)) == 0x1234) { agid->len = READ_LE_UINT16((uint8 *) x + 3); - data = (uint8 *) calloc(1, agid->len + 32); + data = (uint8 *)calloc(1, agid->len + 32); if (data != NULL) { fp.read(data, agid->len); } else { - exit(1); + error("AgiLoader_v2::loadVolRes out of memory"); } } else { warning("AgiLoader_v2::loadVolRes: bad signature %04x", sig); diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 5f5af195b538..e6b5c3c1d41b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3372,7 +3372,7 @@ bool Console::cmdQuit(int argc, const char **argv) { } else if (!scumm_stricmp(argv[1], "now")) { // Quit ungracefully - exit(0); + g_system->quit(); } return Cmd_Exit(0, 0); diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp index b03992385a6d..b699c5d8a758 100644 --- a/engines/sword25/util/lua/ldo.cpp +++ b/engines/sword25/util/lua/ldo.cpp @@ -13,6 +13,8 @@ #define FORBIDDEN_SYMBOL_EXCEPTION_setjmp #define FORBIDDEN_SYMBOL_EXCEPTION_longjmp +#include "common/textconsole.h" + #include #include #include @@ -116,7 +118,7 @@ void luaD_throw (lua_State *L, int errcode) { lua_unlock(L); G(L)->panic(L); } - exit(EXIT_FAILURE); + error("luaD_throw failure"); } } diff --git a/engines/sword25/util/lua/loslib.cpp b/engines/sword25/util/lua/loslib.cpp index c46aea59bda4..b61f8c65e102 100644 --- a/engines/sword25/util/lua/loslib.cpp +++ b/engines/sword25/util/lua/loslib.cpp @@ -18,6 +18,7 @@ #include "lualib.h" #include "common/system.h" +#include "common/textconsole.h" static int os_execute (lua_State *L) { @@ -214,10 +215,9 @@ static int os_exit (lua_State *L) { // Using OSystem::quit() isn't really a great idea, either. // We really would prefer to let the main run loop exit, so that // our main() can perform cleanup. - g_system->quit(); - // leave the exit call in there for now, in case some of our - // OSystem::quit applications are incorrect... *sigh* - exit(luaL_optint(L, 1, EXIT_SUCCESS)); + if (0 == luaL_optint(L, 1, EXIT_SUCCESS)) + g_system->quit(); + error("LUA os_exit invokes with non-zero exit value"); } static const luaL_Reg syslib[] = { From 55e7ef1e0841e37c05ddeaff4370e21a4437eaf9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 19:47:55 +0200 Subject: [PATCH 152/369] SWORD25: Remove obsolete FORBIDDEN_SYMBOL_ALLOW_ALL defines --- engines/sword25/gfx/screenshot.cpp | 3 --- engines/sword25/kernel/persistenceservice.cpp | 3 --- 2 files changed, 6 deletions(-) diff --git a/engines/sword25/gfx/screenshot.cpp b/engines/sword25/gfx/screenshot.cpp index 11b79020fd9c..4f9ba1d3c547 100644 --- a/engines/sword25/gfx/screenshot.cpp +++ b/engines/sword25/gfx/screenshot.cpp @@ -29,9 +29,6 @@ * */ -// Disable symbol overrides so that we can use png.h -#define FORBIDDEN_SYMBOL_ALLOW_ALL - #include "common/memstream.h" #include "common/textconsole.h" #include "sword25/gfx/screenshot.h" diff --git a/engines/sword25/kernel/persistenceservice.cpp b/engines/sword25/kernel/persistenceservice.cpp index a6c71433a797..432950271077 100644 --- a/engines/sword25/kernel/persistenceservice.cpp +++ b/engines/sword25/kernel/persistenceservice.cpp @@ -29,9 +29,6 @@ * */ -// Disable symbol overrides so that we can use zlib.h -#define FORBIDDEN_SYMBOL_ALLOW_ALL - #include "common/fs.h" #include "common/savefile.h" #include "common/zlib.h" From b3b523fddf8c44b3b024462f959f8c4198988d9b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 21:20:59 +0200 Subject: [PATCH 153/369] DC: Fix compilation --- backends/platform/dc/input.cpp | 2 ++ backends/platform/dc/selector.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/platform/dc/input.cpp b/backends/platform/dc/input.cpp index 17bc3174074f..7054ad196e00 100644 --- a/backends/platform/dc/input.cpp +++ b/backends/platform/dc/input.cpp @@ -20,6 +20,8 @@ * */ +#define FORBIDDEN_SYMBOL_ALLOW_ALL + #define RONIN_TIMER_ACCESS #include diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp index 5c349923fc0e..859f2a40edb0 100644 --- a/backends/platform/dc/selector.cpp +++ b/backends/platform/dc/selector.cpp @@ -20,7 +20,7 @@ * */ -#define FORBIDDEN_SYMBOL_EXCEPTION_chdir +#define FORBIDDEN_SYMBOL_ALLOW_ALL #include #include From 6a635f69419a71931137879a1d9b431300faa8ff Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 May 2011 21:21:08 +0200 Subject: [PATCH 154/369] DS: Fix compilation --- backends/platform/ds/arm9/source/dsmain.cpp | 3 +-- backends/platform/ds/arm9/source/zipreader.cpp | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 3fa4a0283a2a..b3146cc16f3a 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -68,8 +68,7 @@ // - Try discworld? -// Disable symbol overrides for FILE -#define FORBIDDEN_SYMBOL_EXCEPTION_FILE +#define FORBIDDEN_SYMBOL_ALLOW_ALL diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index 392a186e79fa..49552a86b2be 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -20,6 +20,7 @@ * */ +#define FORBIDDEN_SYMBOL_ALLOW_ALL #include "common/scummsys.h" #include "zipreader.h" From 793849c97480da2e2f9b0b08e004d33205984bc2 Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Mon, 23 May 2011 23:19:44 +0200 Subject: [PATCH 155/369] TINSEL: Fix bug #3306020, DW2: Crash On Entering Sewers This is the cowardly fix that reintroduces one of the variables that was removed by a cleanup on April 10. --- engines/tinsel/handle.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp index 6f5f92c9692d..c0daa1869a0a 100644 --- a/engines/tinsel/handle.cpp +++ b/engines/tinsel/handle.cpp @@ -79,6 +79,7 @@ static uint numHandles = 0; static uint32 cdPlayHandle = (uint32)-1; +static int cdPlaySceneNum; static SCNHANDLE cdBaseHandle = 0, cdTopHandle = 0; static Common::File *cdGraphStream = 0; @@ -246,7 +247,9 @@ void LoadCDGraphData(MEMHANDLE *pH) { * @param next Handle of end of range + 1 */ void LoadExtraGraphData(SCNHANDLE start, SCNHANDLE next) { - if (start == cdBaseHandle) + // It's not clear that this can ever be true. See bug #3306020, DW2: + // Crash On Entering Sewers, for some background information. + if (cdPlaySceneNum == 0 && start == cdBaseHandle) return; OpenCDGraphFile(); @@ -262,6 +265,7 @@ void LoadExtraGraphData(SCNHANDLE start, SCNHANDLE next) { } void SetCdPlaySceneDetails(int fileNum, const char *fileName) { + cdPlaySceneNum = fileNum; strcpy(szCdPlayFile, fileName); } From 9205b8eb0567c29f6f9518874a14d2de7833d79e Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Mon, 23 May 2011 23:36:54 +0200 Subject: [PATCH 156/369] TINSEL: Fix bug #3306020, DW2: Crash On Entering Sewers This is a simpler fix than the one I committed to the 1.3 branch, but since it carries a theoretical risk of regressions it's so much more macho. --- engines/tinsel/handle.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp index 092d282b012e..eeb83b1f9863 100644 --- a/engines/tinsel/handle.cpp +++ b/engines/tinsel/handle.cpp @@ -243,9 +243,6 @@ void LoadCDGraphData(MEMHANDLE *pH) { * @param next Handle of end of range + 1 */ void LoadExtraGraphData(SCNHANDLE start, SCNHANDLE next) { - if (start == cdBaseHandle) - return; - OpenCDGraphFile(); MemoryDiscard((handleTable + cdPlayHandle)->_node); // Free it From 94122f7afbcd1226cf4286bf322568d7f2426fc4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 24 May 2011 00:17:23 +0200 Subject: [PATCH 157/369] SWORD25: Remove unused Lua print stuff --- engines/sword25/module.mk | 1 - engines/sword25/util/lua/lundump.h | 5 - engines/sword25/util/lua/print.cpp | 230 ----------------------------- 3 files changed, 236 deletions(-) delete mode 100644 engines/sword25/util/lua/print.cpp diff --git a/engines/sword25/module.mk b/engines/sword25/module.mk index 968f21cff5a7..e87707d5a2cb 100644 --- a/engines/sword25/module.mk +++ b/engines/sword25/module.mk @@ -82,7 +82,6 @@ MODULE_OBJS := \ util/lua/lundump.o \ util/lua/lvm.o \ util/lua/lzio.o \ - util/lua/print.o \ util/lua/scummvm_file.o \ util/pluto/pdep.o \ util/pluto/pluto.o \ diff --git a/engines/sword25/util/lua/lundump.h b/engines/sword25/util/lua/lundump.h index f791a4f17363..c293c56ce92e 100644 --- a/engines/sword25/util/lua/lundump.h +++ b/engines/sword25/util/lua/lundump.h @@ -19,11 +19,6 @@ LUAI_FUNC void luaU_header (char* h); /* dump one chunk; from ldump.c */ LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); -#ifdef luac_c -/* print one chunk; from print.c */ -LUAI_FUNC void luaU_print (const Proto* f, int full); -#endif - /* for header of binary files -- this is Lua 5.1 */ #define LUAC_VERSION 0x51 diff --git a/engines/sword25/util/lua/print.cpp b/engines/sword25/util/lua/print.cpp deleted file mode 100644 index 70c6081b818e..000000000000 --- a/engines/sword25/util/lua/print.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* -** $Id$ -** print bytecodes -** See Copyright Notice in lua.h -*/ - -// FIXME -#define FORBIDDEN_SYMBOL_EXCEPTION_printf - -#include -#include - -#define luac_c -#define LUA_CORE - -#include "ldebug.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lundump.h" - -#define PrintFunction luaU_print - -#define Sizeof(x) ((int)sizeof(x)) -#define VOID(p) ((const void*)(p)) - -static void PrintString(const TString* ts) -{ - const char* s=getstr(ts); - size_t i,n=ts->tsv.len; - putchar('"'); - for (i=0; ik[i]; - switch (ttype(o)) - { - case LUA_TNIL: - printf("nil"); - break; - case LUA_TBOOLEAN: - printf(bvalue(o) ? "true" : "false"); - break; - case LUA_TNUMBER: - printf(LUA_NUMBER_FMT,nvalue(o)); - break; - case LUA_TSTRING: - PrintString(rawtsvalue(o)); - break; - default: /* cannot happen */ - printf("? type=%d",ttype(o)); - break; - } -} - -static void PrintCode(const Proto* f) -{ - const Instruction* code=f->code; - int pc,n=f->sizecode; - for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); - printf("%-9s\t",luaP_opnames[o]); - switch (getOpMode(o)) - { - case iABC: - printf("%d",a); - if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); - if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); - break; - case iABx: - if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); - break; - case iAsBx: - if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); - break; - } - switch (o) - { - case OP_LOADK: - printf("\t; "); PrintConstant(f,bx); - break; - case OP_GETUPVAL: - case OP_SETUPVAL: - printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); - break; - case OP_GETGLOBAL: - case OP_SETGLOBAL: - printf("\t; %s",svalue(&f->k[bx])); - break; - case OP_GETTABLE: - case OP_SELF: - if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } - break; - case OP_SETTABLE: - case OP_ADD: - case OP_SUB: - case OP_MUL: - case OP_DIV: - case OP_POW: - case OP_EQ: - case OP_LT: - case OP_LE: - if (ISK(b) || ISK(c)) - { - printf("\t; "); - if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); - printf(" "); - if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); - } - break; - case OP_JMP: - case OP_FORLOOP: - case OP_FORPREP: - printf("\t; to %d",sbx+pc+2); - break; - case OP_CLOSURE: - printf("\t; %p",VOID(f->p[bx])); - break; - case OP_SETLIST: - if (c==0) printf("\t; %d",(int)code[++pc]); - else printf("\t; %d",c); - break; - default: - break; - } - printf("\n"); - } -} - -#define SS(x) (x==1)?"":"s" -#define S(x) x,SS(x) - -static void PrintHeader(const Proto* f) -{ - const char* s=getstr(f->source); - if (*s=='@' || *s=='=') - s++; - else if (*s==LUA_SIGNATURE[0]) - s="(bstring)"; - else - s="(string)"; - printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", - (f->linedefined==0)?"main":"function",s, - f->linedefined,f->lastlinedefined, - S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); - printf("%d%s param%s, %d slot%s, %d upvalue%s, ", - f->numparams,f->is_vararg?"+":"",SS(f->numparams), - S(f->maxstacksize),S(f->nups)); - printf("%d local%s, %d constant%s, %d function%s\n", - S(f->sizelocvars),S(f->sizek),S(f->sizep)); -} - -static void PrintConstants(const Proto* f) -{ - int i,n=f->sizek; - printf("constants (%d) for %p:\n",n,VOID(f)); - for (i=0; isizelocvars; - printf("locals (%d) for %p:\n",n,VOID(f)); - for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); - } -} - -static void PrintUpvalues(const Proto* f) -{ - int i,n=f->sizeupvalues; - printf("upvalues (%d) for %p:\n",n,VOID(f)); - if (f->upvalues==NULL) return; - for (i=0; iupvalues[i])); - } -} - -void PrintFunction(const Proto* f, int full) -{ - int i,n=f->sizep; - PrintHeader(f); - PrintCode(f); - if (full) - { - PrintConstants(f); - PrintLocals(f); - PrintUpvalues(f); - } - for (i=0; ip[i],full); -} From c82f1174886b0182683856bef6066da05d2e1715 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 24 May 2011 00:19:08 +0200 Subject: [PATCH 158/369] COMMON: Add putc(har) and getc(har) to forbidden symbols Sorry, buildbot... --- common/forbidden.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/common/forbidden.h b/common/forbidden.h index f127983006b2..c551110d0e06 100644 --- a/common/forbidden.h +++ b/common/forbidden.h @@ -125,6 +125,27 @@ #endif +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_getc +#undef getc +#define getc(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_getchar +#undef getchar +#define getchar() FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_putc +#undef putc +#define putc(a,b) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + +#ifndef FORBIDDEN_SYMBOL_EXCEPTION_putchar +#undef putchar +#define putchar(a) FORBIDDEN_SYMBOL_REPLACEMENT +#endif + + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_setjmp #undef setjmp #define setjmp(a) FORBIDDEN_SYMBOL_REPLACEMENT From c5045f6a8481421937ca905b67899c671d02e53a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 24 May 2011 00:22:36 +0200 Subject: [PATCH 159/369] N64: Fix compilation --- backends/platform/n64/osys_n64_base.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp index fb3b1dbd930a..094bb839d30f 100644 --- a/backends/platform/n64/osys_n64_base.cpp +++ b/backends/platform/n64/osys_n64_base.cpp @@ -20,6 +20,8 @@ * */ +#define FORBIDDEN_SYMBOL_ALLOW_ALL + #include #include // Required for memalign From e5725fa0f514f8f3ef23a205750aa607d5c9038c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 24 May 2011 00:23:42 +0200 Subject: [PATCH 160/369] PSP: Fix compilation --- backends/platform/psp/display_manager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index d6e982cd8ffb..899b79727f1c 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -20,6 +20,8 @@ * */ +#define FORBIDDEN_SYMBOL_ALLOW_ALL + #include #include #include From 488759c8b6582c7349e5bb8e4982eed6d3742a98 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 20 May 2011 00:47:43 -0400 Subject: [PATCH 161/369] LASTEXPRESS: Add a separate sound cache list for entries with a sound data buffer --- engines/lastexpress/game/sound.cpp | 54 ++++++++++++++++-------------- engines/lastexpress/game/sound.h | 5 +-- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/engines/lastexpress/game/sound.cpp b/engines/lastexpress/game/sound.cpp index d5e111810547..81ed97481cec 100644 --- a/engines/lastexpress/game/sound.cpp +++ b/engines/lastexpress/game/sound.cpp @@ -120,9 +120,12 @@ SoundManager::SoundManager(LastExpressEngine *engine) : _engine(engine), _state( } SoundManager::~SoundManager() { - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) SAFE_DELETE(*i); - _cache.clear(); + _soundList.clear(); + + // Entries in the cache are just pointers to sound list entries + _soundCache.clear(); for (Common::List::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) SAFE_DELETE(*i); @@ -142,11 +145,11 @@ SoundManager::~SoundManager() { void SoundManager::handleTimer() { Common::StackLock locker(_mutex); - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { SoundEntry *entry = (*i); if (entry->stream == NULL) { SAFE_DELETE(*i); - i = _cache.reverse_erase(i); + i = _soundList.reverse_erase(i); continue; } else if (!entry->soundStream) { entry->soundStream = new StreamedSound(); @@ -171,7 +174,7 @@ void SoundManager::resetQueue(SoundType type1, SoundType type2) { Common::StackLock locker(_mutex); - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { if ((*i)->type != type1 && (*i)->type != type2) resetEntry(*i); } @@ -205,14 +208,14 @@ void SoundManager::clearQueue() { Common::StackLock locker(_mutex); - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { SoundEntry *entry = (*i); // Delete entry removeEntry(entry); SAFE_DELETE(entry); - i = _cache.reverse_erase(i); + i = _soundList.reverse_erase(i); } updateSubtitles(); @@ -246,10 +249,11 @@ void SoundManager::setupEntry(SoundEntry *entry, Common::String name, FlagType f setEntryType(entry, flag); setEntryStatus(entry, flag); - // Add entry to cache - _cache.push_back(entry); + // Add entry to sound list + _soundList.push_back(entry); - setupCache(entry); + // TODO Add entry to cache and load sound data + //setupCache(entry); loadSoundData(entry, name); } @@ -344,12 +348,12 @@ bool SoundManager::setupCache(SoundEntry *entry) { if (entry->soundData) return true; - if (_cache.size() >= SOUNDCACHE_MAX_SIZE) { + if (_soundCache.size() >= SOUNDCACHE_MAX_SIZE) { SoundEntry *cacheEntry = NULL; uint32 size = 1000; - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) { if (!((*i)->status.status & kSoundStatus_180)) { uint32 newSize = (*i)->field_4C + ((*i)->status.status & kSoundStatusClear1); @@ -373,24 +377,24 @@ bool SoundManager::setupCache(SoundEntry *entry) { if (cacheEntry->soundData) removeFromCache(cacheEntry); - _cache.push_back(entry); - entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_cache.size() - 1); + _soundCache.push_back(entry); + entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1); } else { - _cache.push_back(entry); - entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_cache.size() - 1); + _soundCache.push_back(entry); + entry->soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1); } return true; } void SoundManager::removeFromCache(SoundEntry *entry) { - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) { if ((*i) == entry) { // Remove sound buffer entry->soundData = NULL; // Remove entry from sound cache - i = _cache.reverse_erase(i); + i = _soundCache.reverse_erase(i); } } } @@ -398,7 +402,7 @@ void SoundManager::removeFromCache(SoundEntry *entry) { void SoundManager::clearStatus() { Common::StackLock locker(_mutex); - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->status.status |= kSoundStatusClear3; } @@ -561,7 +565,7 @@ void SoundManager::unknownFunction4() { // Entry search ////////////////////////////////////////////////////////////////////////// SoundManager::SoundEntry *SoundManager::getEntry(EntityIndex index) { - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { if ((*i)->entity == index) return *i; } @@ -573,7 +577,7 @@ SoundManager::SoundEntry *SoundManager::getEntry(Common::String name) { if (!name.contains('.')) name += ".SND"; - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { if ((*i)->name2 == name) return *i; } @@ -582,7 +586,7 @@ SoundManager::SoundEntry *SoundManager::getEntry(Common::String name) { } SoundManager::SoundEntry *SoundManager::getEntry(SoundType type) { - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { if ((*i)->type == type) return *i; } @@ -605,7 +609,7 @@ void SoundManager::saveLoadWithSerializer(Common::Serializer &s) { // Save or load each entry data if (s.isSaving()) { - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) { + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { SoundEntry *entry = *i; if (entry->name2.matchString("NISSND?") && (entry->status.status & kFlagType7) != kFlag3) { s.syncAsUint32LE(entry->status.status); // status; @@ -646,7 +650,7 @@ uint32 SoundManager::count() { Common::StackLock locker(_mutex); uint32 numEntries = 0; - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) if ((*i)->name2.matchString("NISSND?")) ++numEntries; @@ -1948,7 +1952,7 @@ void SoundManager::playLoopingSound() { void SoundManager::stopAllSound() { Common::StackLock locker(_mutex); - for (Common::List::iterator i = _cache.begin(); i != _cache.end(); ++i) + for (Common::List::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->soundStream->stop(); } diff --git a/engines/lastexpress/game/sound.h b/engines/lastexpress/game/sound.h index 08ec76702263..ddafc2182958 100644 --- a/engines/lastexpress/game/sound.h +++ b/engines/lastexpress/game/sound.h @@ -347,8 +347,9 @@ class SoundManager : Common::Serializable { // Looping sound void playLoopingSound(); - // Sound cache - Common::List _cache; + // Sound entries + Common::List _soundList; ///< List of all sound entries + Common::List _soundCache; ///< List of entries with a data buffer void *_soundCacheData; SoundEntry *getEntry(EntityIndex index); From 89e954c65362b593101786e8c220a95279481645 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 20 May 2011 05:02:53 -0400 Subject: [PATCH 162/369] COMMON: Silence MSVC warning for Common::gcd calls with an unsigned type --- common/algorithm.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/algorithm.h b/common/algorithm.h index be810d6e9df7..fa9d08b3808b 100644 --- a/common/algorithm.h +++ b/common/algorithm.h @@ -234,6 +234,11 @@ void sort(T first, T last) { sort(first, last, Common::Less()); } +// MSVC is complaining about the minus operator being applied to an unsigned type +// We disable this warning for the affected section of code +#pragma warning(push) +#pragma warning(disable: 4146) + /** * Euclid's algorithm to compute the greatest common divisor. */ @@ -256,6 +261,8 @@ T gcd(T a, T b) { return b; } +#pragma warning(pop) + } // End of namespace Common #endif From abd973ee37a8ef07120832c875b19f07cda5c981 Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Tue, 24 May 2011 13:24:37 +0200 Subject: [PATCH 163/369] SAMSUNGTV: fix typo --- backends/module.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/module.mk b/backends/module.mk index adef8a2c0ace..04db3138eb39 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -147,7 +147,7 @@ MODULE_OBJS += \ timer/psp/timer.o endif -ifeq ($(BACKEND),samsungstv) +ifeq ($(BACKEND),samsungtv) MODULE_OBJS += \ events/samsungtvsdl/samsungtvsdl-events.o \ graphics/samsungtvsdl/samsungtvsdl-graphics.o From dc1d07774fc8ab0554047115d319ef8c0a2c3f63 Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Tue, 24 May 2011 13:31:28 +0200 Subject: [PATCH 164/369] SAMSUNGTV: changed paths --- backends/platform/samsungtv/samsungtv.cpp | 2 +- backends/saves/posix/posix-saves.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp index cb657a0a221d..1b978d012123 100644 --- a/backends/platform/samsungtv/samsungtv.cpp +++ b/backends/platform/samsungtv/samsungtv.cpp @@ -28,7 +28,7 @@ OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : - OSystem_POSIX("/mtd_rwarea/scummvm/.scummvmrc") { + OSystem_POSIX("/mtd_rwarea/.scummvmrc") { } void OSystem_SDL_SamsungTV::initBackend() { diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index 37545c77c292..fc75abf86e63 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -51,7 +51,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() { // Register default savepath based on HOME #if defined(SAMSUNGTV) - ConfMan.registerDefault("savepath", "/mtd_rwarea/scummvm/savegames"); + ConfMan.registerDefault("savepath", "/mtd_wiselink/scummvm/savegames"); #else Common::String savePath; const char *home = getenv("HOME"); From 7a9fe3f855e9d9a53253cec4dde6bb30dce24e41 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 May 2011 14:04:05 +0200 Subject: [PATCH 165/369] BUILD: Add msvc8/9/10 build files. --- dists/msvc10/ScummVM_Analysis.props | 28 + dists/msvc10/ScummVM_Analysis64.props | 28 + dists/msvc10/ScummVM_Debug.props | 28 + dists/msvc10/ScummVM_Debug64.props | 28 + dists/msvc10/ScummVM_Global.props | 34 + dists/msvc10/ScummVM_Global64.props | 34 + dists/msvc10/ScummVM_Release.props | 26 + dists/msvc10/ScummVM_Release64.props | 26 + dists/msvc10/agi.vcxproj | 185 +++ dists/msvc10/agos.vcxproj | 182 +++ dists/msvc10/cine.vcxproj | 132 ++ dists/msvc10/cruise.vcxproj | 150 ++ dists/msvc10/draci.vcxproj | 122 ++ dists/msvc10/drascula.vcxproj | 108 ++ dists/msvc10/gob.vcxproj | 226 +++ dists/msvc10/gob.vcxproj.filters | 246 +++ dists/msvc10/groovie.vcxproj | 121 ++ dists/msvc10/hugo.vcxproj | 136 ++ dists/msvc10/kyra.vcxproj | 226 +++ dists/msvc10/lure.vcxproj | 165 ++ dists/msvc10/made.vcxproj | 118 ++ dists/msvc10/mohawk.vcxproj | 119 ++ dists/msvc10/parallaction.vcxproj | 136 ++ dists/msvc10/queen.vcxproj | 132 ++ dists/msvc10/saga.vcxproj | 151 ++ dists/msvc10/sci.vcxproj | 218 +++ dists/msvc10/sci.vcxproj.filters | 377 +++++ dists/msvc10/scumm.vcxproj | 265 ++++ dists/msvc10/scumm.vcxproj.filters | 341 +++++ dists/msvc10/scummvm.sln | 395 +++++ dists/msvc10/scummvm.vcxproj | 816 ++++++++++ dists/msvc10/scummvm.vcxproj.filters | 1909 ++++++++++++++++++++++++ dists/msvc10/sky.vcxproj | 135 ++ dists/msvc10/sky.vcxproj.filters | 83 ++ dists/msvc10/sword1.vcxproj | 131 ++ dists/msvc10/sword2.vcxproj | 141 ++ dists/msvc10/teenagent.vcxproj | 123 ++ dists/msvc10/tinsel.vcxproj | 211 +++ dists/msvc10/toon.vcxproj | 130 ++ dists/msvc10/touche.vcxproj | 105 ++ dists/msvc10/tucker.vcxproj | 103 ++ dists/msvc8/ScummVM_Analysis.vsprops | 26 + dists/msvc8/ScummVM_Analysis64.vsprops | 26 + dists/msvc8/ScummVM_Debug.vsprops | 26 + dists/msvc8/ScummVM_Debug64.vsprops | 26 + dists/msvc8/ScummVM_Global.vsprops | 38 + dists/msvc8/ScummVM_Global64.vsprops | 38 + dists/msvc8/ScummVM_Release.vsprops | 24 + dists/msvc8/ScummVM_Release64.vsprops | 24 + dists/msvc8/agi.vcproj | 101 ++ dists/msvc8/agos.vcproj | 98 ++ dists/msvc8/cine.vcproj | 78 + dists/msvc8/cruise.vcproj | 96 ++ dists/msvc8/draci.vcproj | 68 + dists/msvc8/drascula.vcproj | 54 + dists/msvc8/gob.vcproj | 178 +++ dists/msvc8/groovie.vcproj | 67 + dists/msvc8/hugo.vcproj | 82 + dists/msvc8/kyra.vcproj | 142 ++ dists/msvc8/lure.vcproj | 81 + dists/msvc8/made.vcproj | 64 + dists/msvc8/mohawk.vcproj | 65 + dists/msvc8/parallaction.vcproj | 82 + dists/msvc8/queen.vcproj | 78 + dists/msvc8/saga.vcproj | 97 ++ dists/msvc8/sci.vcproj | 176 +++ dists/msvc8/scumm.vcproj | 221 +++ dists/msvc8/scummvm.sln | 423 ++++++ dists/msvc8/scummvm.vcproj | 900 +++++++++++ dists/msvc8/sky.vcproj | 83 ++ dists/msvc8/sword1.vcproj | 77 + dists/msvc8/sword2.vcproj | 87 ++ dists/msvc8/teenagent.vcproj | 69 + dists/msvc8/tinsel.vcproj | 129 ++ dists/msvc8/toon.vcproj | 76 + dists/msvc8/touche.vcproj | 51 + dists/msvc8/tucker.vcproj | 49 + dists/msvc9/ScummVM_Analysis.vsprops | 26 + dists/msvc9/ScummVM_Analysis64.vsprops | 26 + dists/msvc9/ScummVM_Debug.vsprops | 26 + dists/msvc9/ScummVM_Debug64.vsprops | 26 + dists/msvc9/ScummVM_Global.vsprops | 38 + dists/msvc9/ScummVM_Global64.vsprops | 38 + dists/msvc9/ScummVM_Release.vsprops | 24 + dists/msvc9/ScummVM_Release64.vsprops | 24 + dists/msvc9/agi.vcproj | 102 ++ dists/msvc9/agos.vcproj | 99 ++ dists/msvc9/cine.vcproj | 79 + dists/msvc9/cruise.vcproj | 97 ++ dists/msvc9/draci.vcproj | 69 + dists/msvc9/drascula.vcproj | 55 + dists/msvc9/gob.vcproj | 179 +++ dists/msvc9/groovie.vcproj | 68 + dists/msvc9/hugo.vcproj | 83 ++ dists/msvc9/kyra.vcproj | 143 ++ dists/msvc9/lure.vcproj | 82 + dists/msvc9/made.vcproj | 65 + dists/msvc9/mohawk.vcproj | 66 + dists/msvc9/parallaction.vcproj | 83 ++ dists/msvc9/queen.vcproj | 79 + dists/msvc9/saga.vcproj | 98 ++ dists/msvc9/sci.vcproj | 177 +++ dists/msvc9/scumm.vcproj | 222 +++ dists/msvc9/scummvm.sln | 423 ++++++ dists/msvc9/scummvm.vcproj | 901 +++++++++++ dists/msvc9/sky.vcproj | 84 ++ dists/msvc9/sword1.vcproj | 78 + dists/msvc9/sword2.vcproj | 88 ++ dists/msvc9/teenagent.vcproj | 70 + dists/msvc9/tinsel.vcproj | 130 ++ dists/msvc9/toon.vcproj | 77 + dists/msvc9/touche.vcproj | 52 + dists/msvc9/tucker.vcproj | 50 + 113 files changed, 16397 insertions(+) create mode 100644 dists/msvc10/ScummVM_Analysis.props create mode 100644 dists/msvc10/ScummVM_Analysis64.props create mode 100644 dists/msvc10/ScummVM_Debug.props create mode 100644 dists/msvc10/ScummVM_Debug64.props create mode 100644 dists/msvc10/ScummVM_Global.props create mode 100644 dists/msvc10/ScummVM_Global64.props create mode 100644 dists/msvc10/ScummVM_Release.props create mode 100644 dists/msvc10/ScummVM_Release64.props create mode 100644 dists/msvc10/agi.vcxproj create mode 100644 dists/msvc10/agos.vcxproj create mode 100644 dists/msvc10/cine.vcxproj create mode 100644 dists/msvc10/cruise.vcxproj create mode 100644 dists/msvc10/draci.vcxproj create mode 100644 dists/msvc10/drascula.vcxproj create mode 100644 dists/msvc10/gob.vcxproj create mode 100644 dists/msvc10/gob.vcxproj.filters create mode 100644 dists/msvc10/groovie.vcxproj create mode 100644 dists/msvc10/hugo.vcxproj create mode 100644 dists/msvc10/kyra.vcxproj create mode 100644 dists/msvc10/lure.vcxproj create mode 100644 dists/msvc10/made.vcxproj create mode 100644 dists/msvc10/mohawk.vcxproj create mode 100644 dists/msvc10/parallaction.vcxproj create mode 100644 dists/msvc10/queen.vcxproj create mode 100644 dists/msvc10/saga.vcxproj create mode 100644 dists/msvc10/sci.vcxproj create mode 100644 dists/msvc10/sci.vcxproj.filters create mode 100644 dists/msvc10/scumm.vcxproj create mode 100644 dists/msvc10/scumm.vcxproj.filters create mode 100644 dists/msvc10/scummvm.sln create mode 100644 dists/msvc10/scummvm.vcxproj create mode 100644 dists/msvc10/scummvm.vcxproj.filters create mode 100644 dists/msvc10/sky.vcxproj create mode 100644 dists/msvc10/sky.vcxproj.filters create mode 100644 dists/msvc10/sword1.vcxproj create mode 100644 dists/msvc10/sword2.vcxproj create mode 100644 dists/msvc10/teenagent.vcxproj create mode 100644 dists/msvc10/tinsel.vcxproj create mode 100644 dists/msvc10/toon.vcxproj create mode 100644 dists/msvc10/touche.vcxproj create mode 100644 dists/msvc10/tucker.vcxproj create mode 100644 dists/msvc8/ScummVM_Analysis.vsprops create mode 100644 dists/msvc8/ScummVM_Analysis64.vsprops create mode 100644 dists/msvc8/ScummVM_Debug.vsprops create mode 100644 dists/msvc8/ScummVM_Debug64.vsprops create mode 100644 dists/msvc8/ScummVM_Global.vsprops create mode 100644 dists/msvc8/ScummVM_Global64.vsprops create mode 100644 dists/msvc8/ScummVM_Release.vsprops create mode 100644 dists/msvc8/ScummVM_Release64.vsprops create mode 100644 dists/msvc8/agi.vcproj create mode 100644 dists/msvc8/agos.vcproj create mode 100644 dists/msvc8/cine.vcproj create mode 100644 dists/msvc8/cruise.vcproj create mode 100644 dists/msvc8/draci.vcproj create mode 100644 dists/msvc8/drascula.vcproj create mode 100644 dists/msvc8/gob.vcproj create mode 100644 dists/msvc8/groovie.vcproj create mode 100644 dists/msvc8/hugo.vcproj create mode 100644 dists/msvc8/kyra.vcproj create mode 100644 dists/msvc8/lure.vcproj create mode 100644 dists/msvc8/made.vcproj create mode 100644 dists/msvc8/mohawk.vcproj create mode 100644 dists/msvc8/parallaction.vcproj create mode 100644 dists/msvc8/queen.vcproj create mode 100644 dists/msvc8/saga.vcproj create mode 100644 dists/msvc8/sci.vcproj create mode 100644 dists/msvc8/scumm.vcproj create mode 100644 dists/msvc8/scummvm.sln create mode 100644 dists/msvc8/scummvm.vcproj create mode 100644 dists/msvc8/sky.vcproj create mode 100644 dists/msvc8/sword1.vcproj create mode 100644 dists/msvc8/sword2.vcproj create mode 100644 dists/msvc8/teenagent.vcproj create mode 100644 dists/msvc8/tinsel.vcproj create mode 100644 dists/msvc8/toon.vcproj create mode 100644 dists/msvc8/touche.vcproj create mode 100644 dists/msvc8/tucker.vcproj create mode 100644 dists/msvc9/ScummVM_Analysis.vsprops create mode 100644 dists/msvc9/ScummVM_Analysis64.vsprops create mode 100644 dists/msvc9/ScummVM_Debug.vsprops create mode 100644 dists/msvc9/ScummVM_Debug64.vsprops create mode 100644 dists/msvc9/ScummVM_Global.vsprops create mode 100644 dists/msvc9/ScummVM_Global64.vsprops create mode 100644 dists/msvc9/ScummVM_Release.vsprops create mode 100644 dists/msvc9/ScummVM_Release64.vsprops create mode 100644 dists/msvc9/agi.vcproj create mode 100644 dists/msvc9/agos.vcproj create mode 100644 dists/msvc9/cine.vcproj create mode 100644 dists/msvc9/cruise.vcproj create mode 100644 dists/msvc9/draci.vcproj create mode 100644 dists/msvc9/drascula.vcproj create mode 100644 dists/msvc9/gob.vcproj create mode 100644 dists/msvc9/groovie.vcproj create mode 100644 dists/msvc9/hugo.vcproj create mode 100644 dists/msvc9/kyra.vcproj create mode 100644 dists/msvc9/lure.vcproj create mode 100644 dists/msvc9/made.vcproj create mode 100644 dists/msvc9/mohawk.vcproj create mode 100644 dists/msvc9/parallaction.vcproj create mode 100644 dists/msvc9/queen.vcproj create mode 100644 dists/msvc9/saga.vcproj create mode 100644 dists/msvc9/sci.vcproj create mode 100644 dists/msvc9/scumm.vcproj create mode 100644 dists/msvc9/scummvm.sln create mode 100644 dists/msvc9/scummvm.vcproj create mode 100644 dists/msvc9/sky.vcproj create mode 100644 dists/msvc9/sword1.vcproj create mode 100644 dists/msvc9/sword2.vcproj create mode 100644 dists/msvc9/teenagent.vcproj create mode 100644 dists/msvc9/tinsel.vcproj create mode 100644 dists/msvc9/toon.vcproj create mode 100644 dists/msvc9/touche.vcproj create mode 100644 dists/msvc9/tucker.vcproj diff --git a/dists/msvc10/ScummVM_Analysis.props b/dists/msvc10/ScummVM_Analysis.props new file mode 100644 index 000000000000..cebff46f2173 --- /dev/null +++ b/dists/msvc10/ScummVM_Analysis.props @@ -0,0 +1,28 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Analysis32 + true + + + + Disabled + WIN32;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + false + EditAndContinue + true + + + true + libcmt.lib;%(IgnoreSpecificDefaultLibraries) + + + diff --git a/dists/msvc10/ScummVM_Analysis64.props b/dists/msvc10/ScummVM_Analysis64.props new file mode 100644 index 000000000000..e03e6eb663e8 --- /dev/null +++ b/dists/msvc10/ScummVM_Analysis64.props @@ -0,0 +1,28 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Analysis64 + true + + + + Disabled + WIN32;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + false + ProgramDatabase + true + + + true + libcmt.lib;%(IgnoreSpecificDefaultLibraries) + + + diff --git a/dists/msvc10/ScummVM_Debug.props b/dists/msvc10/ScummVM_Debug.props new file mode 100644 index 000000000000..9a0cad4f6847 --- /dev/null +++ b/dists/msvc10/ScummVM_Debug.props @@ -0,0 +1,28 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Debug32 + true + + + + Disabled + WIN32;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + false + EditAndContinue + false + + + true + libcmt.lib;%(IgnoreSpecificDefaultLibraries) + + + diff --git a/dists/msvc10/ScummVM_Debug64.props b/dists/msvc10/ScummVM_Debug64.props new file mode 100644 index 000000000000..91da9519f48d --- /dev/null +++ b/dists/msvc10/ScummVM_Debug64.props @@ -0,0 +1,28 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Debug64 + true + + + + Disabled + WIN32;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + false + ProgramDatabase + false + + + true + libcmt.lib;%(IgnoreSpecificDefaultLibraries) + + + diff --git a/dists/msvc10/ScummVM_Global.props b/dists/msvc10/ScummVM_Global.props new file mode 100644 index 000000000000..cb9ca4e7adbe --- /dev/null +++ b/dists/msvc10/ScummVM_Global.props @@ -0,0 +1,34 @@ + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Global + $(SCUMMVM_LIBS)\bin;$(ExecutablePath) + $(SCUMMVM_LIBS)\lib\x86;$(LibraryPath) + $(SCUMMVM_LIBS)\include;$(IncludePath) + $(Configuration)32\ + $(Configuration)32/$(ProjectName)\ + + + + true + 4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;;%(DisableSpecificWarnings) + $(SCUMMVM_LIBS)\include;..\..;..\..\engines;$(TargetDir);%(AdditionalIncludeDirectories) + USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) + + false + Level4 + false + Default + + + %(IgnoreSpecificDefaultLibraries) + Console + WinMainCRTStartup + + + HAS_INCLUDE_SET;%(PreprocessorDefinitions) + ..\..;%(AdditionalIncludeDirectories) + + + diff --git a/dists/msvc10/ScummVM_Global64.props b/dists/msvc10/ScummVM_Global64.props new file mode 100644 index 000000000000..62d85beb30b5 --- /dev/null +++ b/dists/msvc10/ScummVM_Global64.props @@ -0,0 +1,34 @@ + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Global + $(SCUMMVM_LIBS)\bin;$(ExecutablePath) + $(SCUMMVM_LIBS)\lib\x64;$(LibraryPath) + $(SCUMMVM_LIBS)\include;$(IncludePath) + $(Configuration)64\ + $(Configuration)64/$(ProjectName)\ + + + + true + 4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;;%(DisableSpecificWarnings) + $(SCUMMVM_LIBS)\include;..\..;..\..\engines;$(TargetDir);%(AdditionalIncludeDirectories) + USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) + + false + Level4 + false + Default + + + %(IgnoreSpecificDefaultLibraries) + Console + WinMainCRTStartup + + + HAS_INCLUDE_SET;%(PreprocessorDefinitions) + ..\..;%(AdditionalIncludeDirectories) + + + diff --git a/dists/msvc10/ScummVM_Release.props b/dists/msvc10/ScummVM_Release.props new file mode 100644 index 000000000000..857817386c46 --- /dev/null +++ b/dists/msvc10/ScummVM_Release.props @@ -0,0 +1,26 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Release32 + false + + + + true + true + WIN32;RELEASE_BUILD;%(PreprocessorDefinitions) + true + false + + false + + + %(IgnoreSpecificDefaultLibraries) + true + + + diff --git a/dists/msvc10/ScummVM_Release64.props b/dists/msvc10/ScummVM_Release64.props new file mode 100644 index 000000000000..e192ce1cfa62 --- /dev/null +++ b/dists/msvc10/ScummVM_Release64.props @@ -0,0 +1,26 @@ + + + + + + + <_ProjectFileVersion>10.0.40219.1 + <_PropertySheetDisplayName>ScummVM_Release64 + false + + + + true + true + WIN32;RELEASE_BUILD;%(PreprocessorDefinitions) + true + false + + false + + + %(IgnoreSpecificDefaultLibraries) + true + + + diff --git a/dists/msvc10/agi.vcxproj b/dists/msvc10/agi.vcxproj new file mode 100644 index 000000000000..adb3a84fe54a --- /dev/null +++ b/dists/msvc10/agi.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {67B3DF8E-A6B4-472E-897A-9576BC05219D} + agi + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + 4510;4610;;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/agos.vcxproj b/dists/msvc10/agos.vcxproj new file mode 100644 index 000000000000..68e6b134d040 --- /dev/null +++ b/dists/msvc10/agos.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B} + agos + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4511;;%(DisableSpecificWarnings) + + + + + 4511;;%(DisableSpecificWarnings) + + + + + 4511;;%(DisableSpecificWarnings) + + + + + 4511;;%(DisableSpecificWarnings) + + + + + 4511;;%(DisableSpecificWarnings) + + + + + 4511;;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/cine.vcxproj b/dists/msvc10/cine.vcxproj new file mode 100644 index 000000000000..e42c9149923f --- /dev/null +++ b/dists/msvc10/cine.vcxproj @@ -0,0 +1,132 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802} + cine + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/cruise.vcxproj b/dists/msvc10/cruise.vcxproj new file mode 100644 index 000000000000..a081143a8aa7 --- /dev/null +++ b/dists/msvc10/cruise.vcxproj @@ -0,0 +1,150 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {3551D32B-CDF0-49AF-B923-C07DD42BA93A} + cruise + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/draci.vcxproj b/dists/msvc10/draci.vcxproj new file mode 100644 index 000000000000..587b648fe46f --- /dev/null +++ b/dists/msvc10/draci.vcxproj @@ -0,0 +1,122 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {75644675-1781-4F45-9381-302AE3B82C19} + draci + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/drascula.vcxproj b/dists/msvc10/drascula.vcxproj new file mode 100644 index 000000000000..c3461d6ce711 --- /dev/null +++ b/dists/msvc10/drascula.vcxproj @@ -0,0 +1,108 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {0A0144D7-F1DE-48AB-8349-2AD774D413EA} + drascula + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/gob.vcxproj b/dists/msvc10/gob.vcxproj new file mode 100644 index 000000000000..d5bc119301f7 --- /dev/null +++ b/dists/msvc10/gob.vcxproj @@ -0,0 +1,226 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {39596151-DBA1-472F-A3C7-5A078087218A} + gob + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/gob.vcxproj.filters b/dists/msvc10/gob.vcxproj.filters new file mode 100644 index 000000000000..a6ee443148ec --- /dev/null +++ b/dists/msvc10/gob.vcxproj.filters @@ -0,0 +1,246 @@ + + + + + 5B050C70-1D92-4080-8935-60BC267102B1 + + + BC8C131E-2F01-492A-B407-47271C533677 + + + 5942E876-D55A-475F-9059-1DB6CA206988 + + + + + + + + + demos + + + demos + + + demos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + save + + + + + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + + + + + + + + + + + + + + + + demos + + + demos + + + demos + + + + + + + + + + + + + + + + + + save + + + save + + + save + + + save + + + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + sound + + + + + + + + + + + + \ No newline at end of file diff --git a/dists/msvc10/groovie.vcxproj b/dists/msvc10/groovie.vcxproj new file mode 100644 index 000000000000..d6a3585e8389 --- /dev/null +++ b/dists/msvc10/groovie.vcxproj @@ -0,0 +1,121 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {8866637A-46EB-4749-B652-22AB27359661} + groovie + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/hugo.vcxproj b/dists/msvc10/hugo.vcxproj new file mode 100644 index 000000000000..2c4eba1fa9bd --- /dev/null +++ b/dists/msvc10/hugo.vcxproj @@ -0,0 +1,136 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008} + hugo + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/kyra.vcxproj b/dists/msvc10/kyra.vcxproj new file mode 100644 index 000000000000..5f8ab4ef6eaa --- /dev/null +++ b/dists/msvc10/kyra.vcxproj @@ -0,0 +1,226 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {4E838394-6FAB-4EA5-BD02-522637E888C7} + kyra + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4355;;%(DisableSpecificWarnings) + + + + + 4355;;%(DisableSpecificWarnings) + + + + + 4355;;%(DisableSpecificWarnings) + + + + + 4355;;%(DisableSpecificWarnings) + + + + + 4355;;%(DisableSpecificWarnings) + + + + + 4355;;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/lure.vcxproj b/dists/msvc10/lure.vcxproj new file mode 100644 index 000000000000..803789ba6b3c --- /dev/null +++ b/dists/msvc10/lure.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {E13D357C-89D1-4B9D-8901-3249E8525138} + lure + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + 4189;4355;;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/made.vcxproj b/dists/msvc10/made.vcxproj new file mode 100644 index 000000000000..4f21c48921ae --- /dev/null +++ b/dists/msvc10/made.vcxproj @@ -0,0 +1,118 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B} + made + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/mohawk.vcxproj b/dists/msvc10/mohawk.vcxproj new file mode 100644 index 000000000000..39953307367f --- /dev/null +++ b/dists/msvc10/mohawk.vcxproj @@ -0,0 +1,119 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0} + mohawk + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/parallaction.vcxproj b/dists/msvc10/parallaction.vcxproj new file mode 100644 index 000000000000..0d3b04d9f7ce --- /dev/null +++ b/dists/msvc10/parallaction.vcxproj @@ -0,0 +1,136 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {F2B53874-6226-4411-A59B-F88FCCA89A3A} + parallaction + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/queen.vcxproj b/dists/msvc10/queen.vcxproj new file mode 100644 index 000000000000..c6ccb2b12116 --- /dev/null +++ b/dists/msvc10/queen.vcxproj @@ -0,0 +1,132 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2} + queen + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/saga.vcxproj b/dists/msvc10/saga.vcxproj new file mode 100644 index 000000000000..8bb0e341d52a --- /dev/null +++ b/dists/msvc10/saga.vcxproj @@ -0,0 +1,151 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {FCD4175F-FA0C-4161-A86B-F075148CB0A2} + saga + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/sci.vcxproj b/dists/msvc10/sci.vcxproj new file mode 100644 index 000000000000..82c1b129a8c3 --- /dev/null +++ b/dists/msvc10/sci.vcxproj @@ -0,0 +1,218 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE} + sci + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/sci.vcxproj.filters b/dists/msvc10/sci.vcxproj.filters new file mode 100644 index 000000000000..2f5b1cb5b42c --- /dev/null +++ b/dists/msvc10/sci.vcxproj.filters @@ -0,0 +1,377 @@ + + + + + AC7DA6DC-7E51-4874-984F-9B75A3D2EDFC + + + 16D774EB-326C-4CC2-8669-7A9189E41A37 + + + 62C114E1-141C-466C-ACF2-E210C6D00EDC + + + A982C9DB-EF16-4FB6-801B-490B00644263 + + + 2757453B-739C-48E0-908B-F0575DFE3507 + + + 81FEE372-1683-4A96-9F73-A19FD8E40400 + + + + + + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + parser + + + parser + + + parser + + + + + + sound + + + sound\drivers + + + sound\drivers + + + sound\drivers + + + sound\drivers + + + sound\drivers + + + sound\drivers + + + sound + + + sound + + + sound + + + + video + + + + + + + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + engine + + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + parser + + + + + + sound + + + sound\drivers + + + sound\drivers + + + sound\drivers + + + sound + + + sound + + + sound + + + + video + + + + + + \ No newline at end of file diff --git a/dists/msvc10/scumm.vcxproj b/dists/msvc10/scumm.vcxproj new file mode 100644 index 000000000000..4e346b2ae210 --- /dev/null +++ b/dists/msvc10/scumm.vcxproj @@ -0,0 +1,265 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {E024B02A-A622-424B-B865-AA192EFB2859} + scumm + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/scumm.vcxproj.filters b/dists/msvc10/scumm.vcxproj.filters new file mode 100644 index 000000000000..2612c3810e48 --- /dev/null +++ b/dists/msvc10/scumm.vcxproj.filters @@ -0,0 +1,341 @@ + + + + + 3C493CB0-E6E4-4177-B182-CFCE8105D604 + + + 05BA771B-3FA1-41DF-9654-7FEE3984EF75 + + + CE2D26B5-12B7-4E84-BBFD-54BD042BC10A + + + E6392527-DBD7-47F1-AD87-E1660CD2DCDA + + + 00049112-BCBF-47F7-BEEB-B5C31778CDFE + + + + + + + + + + + + + + + + + + + + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + + imuse + + + imuse + + + imuse + + + imuse + + + imuse + + + imuse + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + + insane + + + insane + + + insane + + + insane + + + insane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + smush + + + smush + + + smush + + + smush + + + smush + + + smush + + + smush + + + smush + + + smush + + + + + + + + + + + + + + + + + + + + + + + + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + he + + + + imuse + + + imuse + + + imuse + + + imuse + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + imuse_digi + + + insane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + smush + + + smush + + + smush + + + smush + + + smush + + + smush + + + + + + + + + + \ No newline at end of file diff --git a/dists/msvc10/scummvm.sln b/dists/msvc10/scummvm.sln new file mode 100644 index 000000000000..e43527ca313d --- /dev/null +++ b/dists/msvc10/scummvm.sln @@ -0,0 +1,395 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "scummvm", "scummvm.vcxproj", "{DC45F7FB-1517-4600-A3F5-C4DE33EF1044}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "agi", "agi.vcxproj", "{67B3DF8E-A6B4-472E-897A-9576BC05219D}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "agos", "agos.vcxproj", "{2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "cine", "cine.vcxproj", "{644ABA0C-00B2-4AC9-ADD0-41E9D6628802}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "cruise", "cruise.vcxproj", "{3551D32B-CDF0-49AF-B923-C07DD42BA93A}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "draci", "draci.vcxproj", "{75644675-1781-4F45-9381-302AE3B82C19}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "drascula", "drascula.vcxproj", "{0A0144D7-F1DE-48AB-8349-2AD774D413EA}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "gob", "gob.vcxproj", "{39596151-DBA1-472F-A3C7-5A078087218A}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "groovie", "groovie.vcxproj", "{8866637A-46EB-4749-B652-22AB27359661}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "hugo", "hugo.vcxproj", "{8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "kyra", "kyra.vcxproj", "{4E838394-6FAB-4EA5-BD02-522637E888C7}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "lure", "lure.vcxproj", "{E13D357C-89D1-4B9D-8901-3249E8525138}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "made", "made.vcxproj", "{D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "mohawk", "mohawk.vcxproj", "{6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "parallaction", "parallaction.vcxproj", "{F2B53874-6226-4411-A59B-F88FCCA89A3A}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "queen", "queen.vcxproj", "{8D243245-E8C7-46AE-8F92-5FAAAF479CA2}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "saga", "saga.vcxproj", "{FCD4175F-FA0C-4161-A86B-F075148CB0A2}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "sci", "sci.vcxproj", "{B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "scumm", "scumm.vcxproj", "{E024B02A-A622-424B-B865-AA192EFB2859}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "sky", "sky.vcxproj", "{5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "sword1", "sword1.vcxproj", "{6FCC841C-7CCE-49BF-B841-B26AC6485922}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "sword2", "sword2.vcxproj", "{F4A879AF-6A32-4397-9DEC-D91678BE01E8}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "teenagent", "teenagent.vcxproj", "{8B850509-555F-48CE-A07B-3968C4938BB9}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "tinsel", "tinsel.vcxproj", "{3D056AA7-387D-4016-AB1B-2DE3D92ECD66}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "toon", "toon.vcxproj", "{B4D36F0A-3339-49D4-B514-3D7AA7C835E4}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "touche", "touche.vcxproj", "{CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}" +EndProject +Project("{8B4B8961-61A2-4C8A-B9F3-5D1C31150C0F}") = "tucker", "tucker.vcxproj", "{119A3B44-D415-498B-A957-07D1213CB7EF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Analysis|Win32 = Analysis|Win32 + Release|Win32 = Release|Win32 + Debug|x64 = Debug|x64 + Analysis|x64 = Analysis|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Debug|Win32.ActiveCfg = Debug|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Debug|Win32.Build.0 = Debug|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Analysis|Win32.Build.0 = Analysis|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Release|Win32.ActiveCfg = Release|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Release|Win32.Build.0 = Release|Win32 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Debug|x64.ActiveCfg = Debug|x64 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Debug|x64.Build.0 = Debug|x64 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Analysis|x64.ActiveCfg = Analysis|x64 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Analysis|x64.Build.0 = Analysis|x64 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Release|x64.ActiveCfg = Release|x64 + {67B3DF8E-A6B4-472E-897A-9576BC05219D}.Release|x64.Build.0 = Release|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Debug|Win32.ActiveCfg = Debug|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Debug|Win32.Build.0 = Debug|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Analysis|Win32.Build.0 = Analysis|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Release|Win32.ActiveCfg = Release|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Release|Win32.Build.0 = Release|Win32 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Debug|x64.ActiveCfg = Debug|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Debug|x64.Build.0 = Debug|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Analysis|x64.ActiveCfg = Analysis|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Analysis|x64.Build.0 = Analysis|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Release|x64.ActiveCfg = Release|x64 + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B}.Release|x64.Build.0 = Release|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Debug|Win32.ActiveCfg = Debug|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Debug|Win32.Build.0 = Debug|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Analysis|Win32.Build.0 = Analysis|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Release|Win32.ActiveCfg = Release|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Release|Win32.Build.0 = Release|Win32 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Debug|x64.ActiveCfg = Debug|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Debug|x64.Build.0 = Debug|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Analysis|x64.ActiveCfg = Analysis|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Analysis|x64.Build.0 = Analysis|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Release|x64.ActiveCfg = Release|x64 + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802}.Release|x64.Build.0 = Release|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Debug|Win32.ActiveCfg = Debug|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Debug|Win32.Build.0 = Debug|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Analysis|Win32.Build.0 = Analysis|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Release|Win32.ActiveCfg = Release|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Release|Win32.Build.0 = Release|Win32 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Debug|x64.ActiveCfg = Debug|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Debug|x64.Build.0 = Debug|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Analysis|x64.ActiveCfg = Analysis|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Analysis|x64.Build.0 = Analysis|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Release|x64.ActiveCfg = Release|x64 + {3551D32B-CDF0-49AF-B923-C07DD42BA93A}.Release|x64.Build.0 = Release|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Debug|Win32.ActiveCfg = Debug|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Debug|Win32.Build.0 = Debug|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Analysis|Win32.Build.0 = Analysis|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Release|Win32.ActiveCfg = Release|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Release|Win32.Build.0 = Release|Win32 + {75644675-1781-4F45-9381-302AE3B82C19}.Debug|x64.ActiveCfg = Debug|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Debug|x64.Build.0 = Debug|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Analysis|x64.ActiveCfg = Analysis|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Analysis|x64.Build.0 = Analysis|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Release|x64.ActiveCfg = Release|x64 + {75644675-1781-4F45-9381-302AE3B82C19}.Release|x64.Build.0 = Release|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Debug|Win32.Build.0 = Debug|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Analysis|Win32.Build.0 = Analysis|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Release|Win32.ActiveCfg = Release|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Release|Win32.Build.0 = Release|Win32 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Debug|x64.ActiveCfg = Debug|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Debug|x64.Build.0 = Debug|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Analysis|x64.ActiveCfg = Analysis|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Analysis|x64.Build.0 = Analysis|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Release|x64.ActiveCfg = Release|x64 + {0A0144D7-F1DE-48AB-8349-2AD774D413EA}.Release|x64.Build.0 = Release|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Debug|Win32.ActiveCfg = Debug|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Debug|Win32.Build.0 = Debug|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Analysis|Win32.Build.0 = Analysis|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Release|Win32.ActiveCfg = Release|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Release|Win32.Build.0 = Release|Win32 + {39596151-DBA1-472F-A3C7-5A078087218A}.Debug|x64.ActiveCfg = Debug|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Debug|x64.Build.0 = Debug|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Analysis|x64.ActiveCfg = Analysis|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Analysis|x64.Build.0 = Analysis|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Release|x64.ActiveCfg = Release|x64 + {39596151-DBA1-472F-A3C7-5A078087218A}.Release|x64.Build.0 = Release|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Debug|Win32.ActiveCfg = Debug|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Debug|Win32.Build.0 = Debug|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Analysis|Win32.Build.0 = Analysis|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Release|Win32.ActiveCfg = Release|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Release|Win32.Build.0 = Release|Win32 + {8866637A-46EB-4749-B652-22AB27359661}.Debug|x64.ActiveCfg = Debug|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Debug|x64.Build.0 = Debug|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Analysis|x64.ActiveCfg = Analysis|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Analysis|x64.Build.0 = Analysis|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Release|x64.ActiveCfg = Release|x64 + {8866637A-46EB-4749-B652-22AB27359661}.Release|x64.Build.0 = Release|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Debug|Win32.Build.0 = Debug|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Analysis|Win32.Build.0 = Analysis|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Release|Win32.ActiveCfg = Release|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Release|Win32.Build.0 = Release|Win32 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Debug|x64.ActiveCfg = Debug|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Debug|x64.Build.0 = Debug|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Analysis|x64.ActiveCfg = Analysis|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Analysis|x64.Build.0 = Analysis|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Release|x64.ActiveCfg = Release|x64 + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008}.Release|x64.Build.0 = Release|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Debug|Win32.ActiveCfg = Debug|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Debug|Win32.Build.0 = Debug|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Analysis|Win32.Build.0 = Analysis|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Release|Win32.ActiveCfg = Release|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Release|Win32.Build.0 = Release|Win32 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Debug|x64.ActiveCfg = Debug|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Debug|x64.Build.0 = Debug|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Analysis|x64.ActiveCfg = Analysis|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Analysis|x64.Build.0 = Analysis|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Release|x64.ActiveCfg = Release|x64 + {4E838394-6FAB-4EA5-BD02-522637E888C7}.Release|x64.Build.0 = Release|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Debug|Win32.ActiveCfg = Debug|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Debug|Win32.Build.0 = Debug|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Analysis|Win32.Build.0 = Analysis|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Release|Win32.ActiveCfg = Release|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Release|Win32.Build.0 = Release|Win32 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Debug|x64.ActiveCfg = Debug|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Debug|x64.Build.0 = Debug|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Analysis|x64.ActiveCfg = Analysis|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Analysis|x64.Build.0 = Analysis|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Release|x64.ActiveCfg = Release|x64 + {E13D357C-89D1-4B9D-8901-3249E8525138}.Release|x64.Build.0 = Release|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Debug|Win32.ActiveCfg = Debug|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Debug|Win32.Build.0 = Debug|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Analysis|Win32.Build.0 = Analysis|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Release|Win32.ActiveCfg = Release|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Release|Win32.Build.0 = Release|Win32 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Debug|x64.ActiveCfg = Debug|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Debug|x64.Build.0 = Debug|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Analysis|x64.ActiveCfg = Analysis|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Analysis|x64.Build.0 = Analysis|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Release|x64.ActiveCfg = Release|x64 + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B}.Release|x64.Build.0 = Release|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Debug|Win32.ActiveCfg = Debug|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Debug|Win32.Build.0 = Debug|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Analysis|Win32.Build.0 = Analysis|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Release|Win32.ActiveCfg = Release|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Release|Win32.Build.0 = Release|Win32 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Debug|x64.ActiveCfg = Debug|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Debug|x64.Build.0 = Debug|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Analysis|x64.ActiveCfg = Analysis|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Analysis|x64.Build.0 = Analysis|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Release|x64.ActiveCfg = Release|x64 + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0}.Release|x64.Build.0 = Release|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Debug|Win32.Build.0 = Debug|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Analysis|Win32.Build.0 = Analysis|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Release|Win32.ActiveCfg = Release|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Release|Win32.Build.0 = Release|Win32 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Debug|x64.ActiveCfg = Debug|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Debug|x64.Build.0 = Debug|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Analysis|x64.ActiveCfg = Analysis|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Analysis|x64.Build.0 = Analysis|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Release|x64.ActiveCfg = Release|x64 + {F2B53874-6226-4411-A59B-F88FCCA89A3A}.Release|x64.Build.0 = Release|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Debug|Win32.ActiveCfg = Debug|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Debug|Win32.Build.0 = Debug|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Analysis|Win32.Build.0 = Analysis|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Release|Win32.ActiveCfg = Release|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Release|Win32.Build.0 = Release|Win32 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Debug|x64.ActiveCfg = Debug|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Debug|x64.Build.0 = Debug|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Analysis|x64.ActiveCfg = Analysis|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Analysis|x64.Build.0 = Analysis|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Release|x64.ActiveCfg = Release|x64 + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2}.Release|x64.Build.0 = Release|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Debug|Win32.Build.0 = Debug|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Analysis|Win32.Build.0 = Analysis|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Release|Win32.ActiveCfg = Release|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Release|Win32.Build.0 = Release|Win32 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Debug|x64.ActiveCfg = Debug|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Debug|x64.Build.0 = Debug|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Analysis|x64.ActiveCfg = Analysis|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Analysis|x64.Build.0 = Analysis|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Release|x64.ActiveCfg = Release|x64 + {FCD4175F-FA0C-4161-A86B-F075148CB0A2}.Release|x64.Build.0 = Release|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Debug|Win32.Build.0 = Debug|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Analysis|Win32.Build.0 = Analysis|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Release|Win32.ActiveCfg = Release|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Release|Win32.Build.0 = Release|Win32 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Debug|x64.ActiveCfg = Debug|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Debug|x64.Build.0 = Debug|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Analysis|x64.ActiveCfg = Analysis|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Analysis|x64.Build.0 = Analysis|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Release|x64.ActiveCfg = Release|x64 + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE}.Release|x64.Build.0 = Release|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Debug|Win32.ActiveCfg = Debug|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Debug|Win32.Build.0 = Debug|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Analysis|Win32.Build.0 = Analysis|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Release|Win32.ActiveCfg = Release|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Release|Win32.Build.0 = Release|Win32 + {E024B02A-A622-424B-B865-AA192EFB2859}.Debug|x64.ActiveCfg = Debug|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Debug|x64.Build.0 = Debug|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Analysis|x64.ActiveCfg = Analysis|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Analysis|x64.Build.0 = Analysis|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Release|x64.ActiveCfg = Release|x64 + {E024B02A-A622-424B-B865-AA192EFB2859}.Release|x64.Build.0 = Release|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Debug|Win32.Build.0 = Debug|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Analysis|Win32.Build.0 = Analysis|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Release|Win32.ActiveCfg = Release|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Release|Win32.Build.0 = Release|Win32 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Debug|x64.ActiveCfg = Debug|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Debug|x64.Build.0 = Debug|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Analysis|x64.ActiveCfg = Analysis|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Analysis|x64.Build.0 = Analysis|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Release|x64.ActiveCfg = Release|x64 + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044}.Release|x64.Build.0 = Release|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Debug|Win32.Build.0 = Debug|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Analysis|Win32.Build.0 = Analysis|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Release|Win32.ActiveCfg = Release|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Release|Win32.Build.0 = Release|Win32 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Debug|x64.ActiveCfg = Debug|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Debug|x64.Build.0 = Debug|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Analysis|x64.ActiveCfg = Analysis|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Analysis|x64.Build.0 = Analysis|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Release|x64.ActiveCfg = Release|x64 + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9}.Release|x64.Build.0 = Release|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Debug|Win32.ActiveCfg = Debug|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Debug|Win32.Build.0 = Debug|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Analysis|Win32.Build.0 = Analysis|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Release|Win32.ActiveCfg = Release|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Release|Win32.Build.0 = Release|Win32 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Debug|x64.ActiveCfg = Debug|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Debug|x64.Build.0 = Debug|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Analysis|x64.ActiveCfg = Analysis|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Analysis|x64.Build.0 = Analysis|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Release|x64.ActiveCfg = Release|x64 + {6FCC841C-7CCE-49BF-B841-B26AC6485922}.Release|x64.Build.0 = Release|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Debug|Win32.Build.0 = Debug|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Analysis|Win32.Build.0 = Analysis|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Release|Win32.ActiveCfg = Release|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Release|Win32.Build.0 = Release|Win32 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Debug|x64.ActiveCfg = Debug|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Debug|x64.Build.0 = Debug|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Analysis|x64.ActiveCfg = Analysis|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Analysis|x64.Build.0 = Analysis|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Release|x64.ActiveCfg = Release|x64 + {F4A879AF-6A32-4397-9DEC-D91678BE01E8}.Release|x64.Build.0 = Release|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Debug|Win32.Build.0 = Debug|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Analysis|Win32.Build.0 = Analysis|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Release|Win32.ActiveCfg = Release|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Release|Win32.Build.0 = Release|Win32 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Debug|x64.ActiveCfg = Debug|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Debug|x64.Build.0 = Debug|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Analysis|x64.ActiveCfg = Analysis|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Analysis|x64.Build.0 = Analysis|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Release|x64.ActiveCfg = Release|x64 + {8B850509-555F-48CE-A07B-3968C4938BB9}.Release|x64.Build.0 = Release|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Debug|Win32.ActiveCfg = Debug|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Debug|Win32.Build.0 = Debug|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Analysis|Win32.Build.0 = Analysis|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Release|Win32.ActiveCfg = Release|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Release|Win32.Build.0 = Release|Win32 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Debug|x64.ActiveCfg = Debug|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Debug|x64.Build.0 = Debug|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Analysis|x64.ActiveCfg = Analysis|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Analysis|x64.Build.0 = Analysis|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Release|x64.ActiveCfg = Release|x64 + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66}.Release|x64.Build.0 = Release|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Debug|Win32.Build.0 = Debug|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Analysis|Win32.Build.0 = Analysis|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Release|Win32.ActiveCfg = Release|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Release|Win32.Build.0 = Release|Win32 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Debug|x64.ActiveCfg = Debug|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Debug|x64.Build.0 = Debug|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Analysis|x64.ActiveCfg = Analysis|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Analysis|x64.Build.0 = Analysis|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Release|x64.ActiveCfg = Release|x64 + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4}.Release|x64.Build.0 = Release|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Debug|Win32.ActiveCfg = Debug|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Debug|Win32.Build.0 = Debug|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Analysis|Win32.Build.0 = Analysis|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Release|Win32.ActiveCfg = Release|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Release|Win32.Build.0 = Release|Win32 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Debug|x64.ActiveCfg = Debug|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Debug|x64.Build.0 = Debug|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Analysis|x64.ActiveCfg = Analysis|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Analysis|x64.Build.0 = Analysis|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Release|x64.ActiveCfg = Release|x64 + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30}.Release|x64.Build.0 = Release|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Debug|Win32.ActiveCfg = Debug|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Debug|Win32.Build.0 = Debug|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Analysis|Win32.Build.0 = Analysis|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Release|Win32.ActiveCfg = Release|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Release|Win32.Build.0 = Release|Win32 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Debug|x64.ActiveCfg = Debug|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Debug|x64.Build.0 = Debug|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Analysis|x64.ActiveCfg = Analysis|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Analysis|x64.Build.0 = Analysis|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Release|x64.ActiveCfg = Release|x64 + {119A3B44-D415-498B-A957-07D1213CB7EF}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dists/msvc10/scummvm.vcxproj b/dists/msvc10/scummvm.vcxproj new file mode 100644 index 000000000000..0d59e6b8328f --- /dev/null +++ b/dists/msvc10/scummvm.vcxproj @@ -0,0 +1,816 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {DC45F7FB-1517-4600-A3F5-C4DE33EF1044} + scummvm + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + false + + + $(OutDir)scummvm.exe + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IntDir)backends_platform_sdl_%(Filename).obj + + + + + + + + + + + $(IntDir)backends_plugins_elf_%(Filename).obj + + + + + + + + + + + + + + + + + + + $(IntDir)base_%(Filename).obj + + + + $(IntDir)base_%(Filename).obj + + + + + + + + + + $(IntDir)common_%(Filename).obj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IntDir)gui_%(Filename).obj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + + + Document + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + nasm.exe -f win32 -g -o "$(IntDir)%(Filename).obj" "%(FullPath)" + $(IntDir)%(Filename).obj;%(Outputs) + + + + + {67B3DF8E-A6B4-472E-897A-9576BC05219D} + + + {2AD2C8D1-F47B-4D6E-A1C7-8810C3B0692B} + + + {644ABA0C-00B2-4AC9-ADD0-41E9D6628802} + + + {3551D32B-CDF0-49AF-B923-C07DD42BA93A} + + + {75644675-1781-4F45-9381-302AE3B82C19} + + + {0A0144D7-F1DE-48AB-8349-2AD774D413EA} + + + {39596151-DBA1-472F-A3C7-5A078087218A} + + + {8866637A-46EB-4749-B652-22AB27359661} + + + {8FF7B36C-9A4B-4CBD-94F6-C5947FE62008} + + + {4E838394-6FAB-4EA5-BD02-522637E888C7} + + + {E13D357C-89D1-4B9D-8901-3249E8525138} + + + {D5D4CC46-81AC-4C7F-AE3F-A6E62930AF0B} + + + {6DE488F6-B6C3-4481-85C7-CAAF1A1DE7F0} + + + {F2B53874-6226-4411-A59B-F88FCCA89A3A} + + + {8D243245-E8C7-46AE-8F92-5FAAAF479CA2} + + + {FCD4175F-FA0C-4161-A86B-F075148CB0A2} + + + {B1E3E79A-ABAF-4A3C-82A9-E7F1F08495EE} + + + {E024B02A-A622-424B-B865-AA192EFB2859} + + + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9} + + + {6FCC841C-7CCE-49BF-B841-B26AC6485922} + + + {F4A879AF-6A32-4397-9DEC-D91678BE01E8} + + + {8B850509-555F-48CE-A07B-3968C4938BB9} + + + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66} + + + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4} + + + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30} + + + {119A3B44-D415-498B-A957-07D1213CB7EF} + + + + + + diff --git a/dists/msvc10/scummvm.vcxproj.filters b/dists/msvc10/scummvm.vcxproj.filters new file mode 100644 index 000000000000..57bce1230bab --- /dev/null +++ b/dists/msvc10/scummvm.vcxproj.filters @@ -0,0 +1,1909 @@ + + + + + 43314900-F1E0-48B1-8CAE-75E42844E4DA + + + 390C6A07-3AEB-42F1-8F64-B586A355BDE7 + + + 8607E778-E8E1-4BB6-91A1-9BB9E5819520 + + + 8D0027C7-EB29-493C-8D6F-C232C5801A4C + + + 8803C571-E4F0-4976-92C5-317947C69AD4 + + + C6C19DB2-EB58-4F7A-88B3-AC8E34C6DABD + + + CAA130AF-9359-4727-9F58-A0671F3B3CE5 + + + FDD999E9-3289-45FA-BD12-8972D96531A4 + + + 0861559B-BA7C-42DA-9464-43F3A07FDA9E + + + 5A75898D-00EE-483E-8213-B0DB79E28182 + + + 44D61E00-53E1-4B28-861F-1DE79EF886F9 + + + 6E10876E-0011-4C02-A55E-DE9F42602286 + + + 3741868B-2363-436A-82D1-5222CBD91C3B + + + EAA3A9EB-B557-4DDA-B6CD-7AF82E9D8066 + + + DE08F103-6BA6-4EED-B9C1-10459B2D8087 + + + D12B7387-8362-433B-B0DE-345F7CB5C55C + + + BDB75F29-5ECE-48D8-9029-1E2D569FB428 + + + CA28B04E-8B15-49BB-B4BE-1B7274E1CE32 + + + 992F5CF8-FD74-418F-9DF0-BCF390711D5B + + + 9ACEAA27-E434-42D9-B3FE-4C68E01C9B7B + + + 4BF7744A-6C47-490B-B897-00C90A1E25A5 + + + ECCFCCD2-05AF-4CF8-AFF9-629016FD0C62 + + + F681AD64-C888-4F02-A06F-CB2A8EF1CF7B + + + C29D4FC8-4EFC-42FD-B625-8F0E249B701B + + + 1E1E80E7-A6EF-4AC7-A0B6-F2EEA9C36B6C + + + 61BA36AF-B7F8-4EAF-9F3E-BD43DA2E5FF8 + + + 4DDFE0F4-D0CB-4C32-83B0-212E748D9BD5 + + + 49D18602-CA35-41EA-B36F-2E4F9E8E48EC + + + 6F2AE141-F69F-437B-9195-A9C523459C6D + + + 17236FE2-5821-4DCC-91FC-1C318C651EFB + + + 8F013D87-A1B1-43F2-87AC-B86AF255D80A + + + 7948EDD2-6ABC-4FFB-BABC-2D47234C44B3 + + + 4E813BEF-333F-437B-AB9D-E6DEF3BFE96D + + + 08D84072-95E0-4F50-9E9C-97C1E9DB7538 + + + 5EB12892-F00C-4EDD-A9F4-BD9EB4A70CBD + + + 814D3017-2E9F-48CD-BD00-9027DC065F3C + + + B888CEA9-95DD-4840-9246-DE88EEEA4670 + + + 39778868-17F0-4655-B1C6-7CCFCDDC0C87 + + + 66DB31FB-B9B9-4C8D-811C-16EF085D6041 + + + D4E8A9EC-DAE0-42CC-A8BF-9C779CA8FE03 + + + 8431003F-EB3D-4CEC-99E2-DC61413EA316 + + + 284E0303-2F46-4FD7-866D-50A3164FA69B + + + 80A7DA6D-E4A7-4A3E-8B38-A0CC7744E39F + + + 92E7A3C2-2E74-4B35-A1EB-D8F83B8094BC + + + 28702A0D-1885-4CA4-BDED-72353356D5C5 + + + 3E79896D-EE25-42D0-927B-C94DFC5F0B25 + + + CF3533E8-BA80-4E79-AE01-AEA157856896 + + + 00F104EE-18A7-4F2A-A48A-7821E98346BA + + + B97AA374-FA32-4E69-B49E-0C8B24742324 + + + 6728147F-CFD3-49F4-9F22-164AA65D0560 + + + D7A9D5D3-DCC4-4E11-A34A-9D88BFC0AC27 + + + E9C0A6BA-9551-4FF5-B4C5-401B24467CFC + + + EF52D0CD-1710-4E7B-9A7C-041A3EB14228 + + + 73E8E209-3B93-40AF-9A40-CB7E87487B78 + + + 9B4D46B2-5D25-4FB8-A233-D3E0E4160A58 + + + 00EC623B-8062-4BDB-A3B8-5A2C02D6A49D + + + 24EA5182-1180-4BB3-B40F-959A269FF226 + + + 8D56620F-B94F-4A5E-8845-8A0B1C30A841 + + + 1CF9C32D-7BFE-4130-8F77-CB3518BF5CA5 + + + 16BFB4D0-0F9F-4F18-A5BA-2302EACC4407 + + + C7083544-0818-4518-8F41-4DA701AA4E17 + + + 6A03E77A-A318-4389-92B6-8CBE84D0C64C + + + D9FC91E1-1507-49A5-8848-4E49F39C615E + + + 9F4AD943-626D-4C36-A55A-F5A92BBCF605 + + + BA88E7CF-8FE1-45D8-ABC3-221F60837E01 + + + CE584531-C612-48EB-AD5E-96981C8E9ED6 + + + 1886A6A7-691D-4194-A1A3-B443283344F7 + + + 8C892954-9C92-400A-B0D7-A30D6642E47E + + + C88C2732-A9A8-478B-8D7C-CF76B0146E3E + + + 9E98923C-2BD3-471D-ACEA-2B132E1092F6 + + + 9CB92A47-63F2-43B1-B0A3-2922B7986157 + + + 31F4935D-C9DA-4B76-86A6-89F4B71DEC54 + + + D6189B3B-0C6F-4D7C-9317-9FCBAF0124E1 + + + F6B840C0-93BB-475B-A3C1-511BDE3E6FB6 + + + 570CF163-7CDF-4090-B680-5DA782818979 + + + 3AC93ACE-8671-4BE9-B47C-0513BB75C913 + + + + + audio + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio + + + audio + + + audio + + + audio + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\opl + + + audio\softsynth\opl + + + audio\softsynth\opl + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio + + + backends\audiocd\default + + + backends\audiocd\sdl + + + backends + + + backends\events\default + + + backends\events\dinguxsdl + + + backends\events\gp2xsdl + + + backends\events\gph + + + backends\events\linuxmotosdl + + + backends\events\openpandora + + + backends\events\samsungtvsdl + + + backends\events\sdl + + + backends\events\symbiansdl + + + backends\events\webossdl + + + backends\events\wincesdl + + + backends\fs + + + backends\fs\amigaos4 + + + backends\fs\posix + + + backends\fs + + + backends\fs\symbian + + + backends\fs\windows + + + backends\graphics\dinguxsdl + + + backends\graphics\gp2xsdl + + + backends\graphics\gph + + + backends\graphics\linuxmotosdl + + + backends\graphics\opengl + + + backends\graphics\opengl + + + backends\graphics\opengl + + + backends\graphics\openglsdl + + + backends\graphics\openpandora + + + backends\graphics\sdl + + + backends\graphics\symbiansdl + + + backends\graphics\wincesdl + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\log + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\midi + + + backends\mixer\doublebuffersdl + + + backends\mixer\sdl + + + backends\mixer\symbiansdl + + + backends\mixer\wincesdl + + + backends + + + backends\mutex\sdl + + + backends\platform\sdl + + + backends\platform\sdl + + + backends\platform\sdl + + + backends\platform\sdl\win32 + + + backends\platform\sdl\win32 + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\posix + + + backends\plugins\sdl + + + backends\plugins\win32 + + + backends\saves\default + + + backends\saves\posix + + + backends\saves + + + backends\timer\default + + + backends\timer\sdl + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + base + + + base + + + base + + + base + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + engines + + + engines + + + engines + + + engines + + + engines + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics\fonts + + + graphics\fonts + + + graphics\fonts + + + graphics\fonts + + + graphics\fonts + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics + + + graphics + + + graphics + + + graphics + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + video + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + + + audio + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio\decoders + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio\mods + + + audio + + + audio + + + audio + + + audio + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\fmtowns_pc98 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\mt32 + + + audio\softsynth\opl + + + audio\softsynth\opl + + + audio\softsynth\opl + + + audio\softsynth + + + audio\softsynth + + + audio\softsynth + + + audio + + + backends\audiocd + + + backends\audiocd\default + + + backends\audiocd\sdl + + + backends + + + backends\events\default + + + backends\events\dinguxsdl + + + backends\events\gp2xsdl + + + backends\events\gph + + + backends\events\linuxmotosdl + + + backends\events\openpandora + + + backends\events\samsungtvsdl + + + backends\events\sdl + + + backends\events\symbiansdl + + + backends\events\webossdl + + + backends\events\wincesdl + + + backends\fs + + + backends\fs\amigaos4 + + + backends\fs + + + backends\fs\posix + + + backends\fs\posix + + + backends\fs + + + backends\fs\symbian + + + backends\fs\symbian + + + backends\fs\windows + + + backends\graphics + + + backends\graphics\dinguxsdl + + + backends\graphics\gp2xsdl + + + backends\graphics\gph + + + backends\graphics + + + backends\graphics\linuxmotosdl + + + backends\graphics\opengl + + + backends\graphics\opengl + + + backends\graphics\opengl + + + backends\graphics\openglsdl + + + backends\graphics\openpandora + + + backends\graphics\sdl + + + backends\graphics\symbiansdl + + + backends\graphics\wincesdl + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\keymapper + + + backends\log + + + backends\mixer\doublebuffersdl + + + backends\mixer\sdl + + + backends\mixer\symbiansdl + + + backends\mixer\wincesdl + + + backends + + + backends\mutex + + + backends\mutex\sdl + + + backends\platform\sdl + + + backends\platform\sdl + + + backends\platform\sdl\win32 + + + backends\plugins + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\elf + + + backends\plugins\posix + + + backends\plugins\sdl + + + backends\plugins\win32 + + + backends\saves\default + + + backends\saves\posix + + + backends\timer\default + + + backends\timer\sdl + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + backends\vkeybd + + + base + + + base + + + base + + + base + + + base + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + engines + + + engines + + + engines + + + engines + + + engines + + + engines + + + engines + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics\fonts + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics\scaler + + + graphics + + + graphics + + + graphics + + + graphics + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + gui\widgets + + + video + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video\codecs + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + + + + + + + + + + audio + + + audio\softsynth\mt32 + + + backends + + + backends\platform\sdl + + + base + + + common + + + engines + + + graphics + + + gui + + + icons + + + video + + + + + dists + + + + + graphics\scaler + + + graphics\scaler + + + \ No newline at end of file diff --git a/dists/msvc10/sky.vcxproj b/dists/msvc10/sky.vcxproj new file mode 100644 index 000000000000..a0a3d917d2a4 --- /dev/null +++ b/dists/msvc10/sky.vcxproj @@ -0,0 +1,135 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {5AAC4F56-B9C0-4863-ADAA-D941388BE3E9} + sky + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/sky.vcxproj.filters b/dists/msvc10/sky.vcxproj.filters new file mode 100644 index 000000000000..cbe7c8eb9533 --- /dev/null +++ b/dists/msvc10/sky.vcxproj.filters @@ -0,0 +1,83 @@ + + + + + B2F3268E-CC2E-41F9-B663-61C3363F9E36 + + + + + + + + + + + + + + + + music + + + music + + + music + + + music + + + music + + + music + + + + + + + + + + + + + + + + + + + music + + + music + + + music + + + music + + + music + + + music + + + + + + + + + + + + + \ No newline at end of file diff --git a/dists/msvc10/sword1.vcxproj b/dists/msvc10/sword1.vcxproj new file mode 100644 index 000000000000..ed821ea8b38e --- /dev/null +++ b/dists/msvc10/sword1.vcxproj @@ -0,0 +1,131 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {6FCC841C-7CCE-49BF-B841-B26AC6485922} + sword1 + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/sword2.vcxproj b/dists/msvc10/sword2.vcxproj new file mode 100644 index 000000000000..f3a01ebb7b12 --- /dev/null +++ b/dists/msvc10/sword2.vcxproj @@ -0,0 +1,141 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {F4A879AF-6A32-4397-9DEC-D91678BE01E8} + sword2 + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/teenagent.vcxproj b/dists/msvc10/teenagent.vcxproj new file mode 100644 index 000000000000..9a8f5ed30274 --- /dev/null +++ b/dists/msvc10/teenagent.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {8B850509-555F-48CE-A07B-3968C4938BB9} + teenagent + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/tinsel.vcxproj b/dists/msvc10/tinsel.vcxproj new file mode 100644 index 000000000000..bf21d7034887 --- /dev/null +++ b/dists/msvc10/tinsel.vcxproj @@ -0,0 +1,211 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {3D056AA7-387D-4016-AB1B-2DE3D92ECD66} + tinsel + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ProgramDatabase + + + + + ProgramDatabase + + + + + + + + + ProgramDatabase + + + + + ProgramDatabase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/toon.vcxproj b/dists/msvc10/toon.vcxproj new file mode 100644 index 000000000000..d390bd16502e --- /dev/null +++ b/dists/msvc10/toon.vcxproj @@ -0,0 +1,130 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {B4D36F0A-3339-49D4-B514-3D7AA7C835E4} + toon + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/touche.vcxproj b/dists/msvc10/touche.vcxproj new file mode 100644 index 000000000000..07aa360cc3c4 --- /dev/null +++ b/dists/msvc10/touche.vcxproj @@ -0,0 +1,105 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {CE9F8D07-1ECE-4E89-A94C-6EC47B3D2B30} + touche + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc10/tucker.vcxproj b/dists/msvc10/tucker.vcxproj new file mode 100644 index 000000000000..682534ec0a57 --- /dev/null +++ b/dists/msvc10/tucker.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Analysis + Win32 + + + Analysis + x64 + + + Release + Win32 + + + Release + x64 + + + + {119A3B44-D415-498B-A957-07D1213CB7EF} + tucker + Win32Proj + + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + StaticLibrary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/ScummVM_Analysis.vsprops b/dists/msvc8/ScummVM_Analysis.vsprops new file mode 100644 index 000000000000..a9bca19f0e80 --- /dev/null +++ b/dists/msvc8/ScummVM_Analysis.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc8/ScummVM_Analysis64.vsprops b/dists/msvc8/ScummVM_Analysis64.vsprops new file mode 100644 index 000000000000..3e3d824738d3 --- /dev/null +++ b/dists/msvc8/ScummVM_Analysis64.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc8/ScummVM_Debug.vsprops b/dists/msvc8/ScummVM_Debug.vsprops new file mode 100644 index 000000000000..5ecedf2368b8 --- /dev/null +++ b/dists/msvc8/ScummVM_Debug.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc8/ScummVM_Debug64.vsprops b/dists/msvc8/ScummVM_Debug64.vsprops new file mode 100644 index 000000000000..7f7171b29290 --- /dev/null +++ b/dists/msvc8/ScummVM_Debug64.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc8/ScummVM_Global.vsprops b/dists/msvc8/ScummVM_Global.vsprops new file mode 100644 index 000000000000..ef9d02b3e5e6 --- /dev/null +++ b/dists/msvc8/ScummVM_Global.vsprops @@ -0,0 +1,38 @@ + + + + + + + diff --git a/dists/msvc8/ScummVM_Global64.vsprops b/dists/msvc8/ScummVM_Global64.vsprops new file mode 100644 index 000000000000..c0c8376e9915 --- /dev/null +++ b/dists/msvc8/ScummVM_Global64.vsprops @@ -0,0 +1,38 @@ + + + + + + + diff --git a/dists/msvc8/ScummVM_Release.vsprops b/dists/msvc8/ScummVM_Release.vsprops new file mode 100644 index 000000000000..a837a9bac967 --- /dev/null +++ b/dists/msvc8/ScummVM_Release.vsprops @@ -0,0 +1,24 @@ + + + + + diff --git a/dists/msvc8/ScummVM_Release64.vsprops b/dists/msvc8/ScummVM_Release64.vsprops new file mode 100644 index 000000000000..9e3bc30bc236 --- /dev/null +++ b/dists/msvc8/ScummVM_Release64.vsprops @@ -0,0 +1,24 @@ + + + + + diff --git a/dists/msvc8/agi.vcproj b/dists/msvc8/agi.vcproj new file mode 100644 index 000000000000..2f903eb5c1c3 --- /dev/null +++ b/dists/msvc8/agi.vcproj @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/agos.vcproj b/dists/msvc8/agos.vcproj new file mode 100644 index 000000000000..3d04281dd59f --- /dev/null +++ b/dists/msvc8/agos.vcproj @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/cine.vcproj b/dists/msvc8/cine.vcproj new file mode 100644 index 000000000000..becae8c25697 --- /dev/null +++ b/dists/msvc8/cine.vcproj @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/cruise.vcproj b/dists/msvc8/cruise.vcproj new file mode 100644 index 000000000000..f8401bb80923 --- /dev/null +++ b/dists/msvc8/cruise.vcproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/draci.vcproj b/dists/msvc8/draci.vcproj new file mode 100644 index 000000000000..bf5b698b9844 --- /dev/null +++ b/dists/msvc8/draci.vcproj @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/drascula.vcproj b/dists/msvc8/drascula.vcproj new file mode 100644 index 000000000000..218b4cd4313f --- /dev/null +++ b/dists/msvc8/drascula.vcproj @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/gob.vcproj b/dists/msvc8/gob.vcproj new file mode 100644 index 000000000000..00e32e9fe156 --- /dev/null +++ b/dists/msvc8/gob.vcproj @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/groovie.vcproj b/dists/msvc8/groovie.vcproj new file mode 100644 index 000000000000..57d0b5acf8fe --- /dev/null +++ b/dists/msvc8/groovie.vcproj @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/hugo.vcproj b/dists/msvc8/hugo.vcproj new file mode 100644 index 000000000000..b01e4d8844c0 --- /dev/null +++ b/dists/msvc8/hugo.vcproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/kyra.vcproj b/dists/msvc8/kyra.vcproj new file mode 100644 index 000000000000..ed7728ae528e --- /dev/null +++ b/dists/msvc8/kyra.vcproj @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/lure.vcproj b/dists/msvc8/lure.vcproj new file mode 100644 index 000000000000..02eadd031f3d --- /dev/null +++ b/dists/msvc8/lure.vcproj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/made.vcproj b/dists/msvc8/made.vcproj new file mode 100644 index 000000000000..bf473b6d72f5 --- /dev/null +++ b/dists/msvc8/made.vcproj @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/mohawk.vcproj b/dists/msvc8/mohawk.vcproj new file mode 100644 index 000000000000..7dc904d17856 --- /dev/null +++ b/dists/msvc8/mohawk.vcproj @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/parallaction.vcproj b/dists/msvc8/parallaction.vcproj new file mode 100644 index 000000000000..b58ec62873ba --- /dev/null +++ b/dists/msvc8/parallaction.vcproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/queen.vcproj b/dists/msvc8/queen.vcproj new file mode 100644 index 000000000000..cce97faaac8d --- /dev/null +++ b/dists/msvc8/queen.vcproj @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/saga.vcproj b/dists/msvc8/saga.vcproj new file mode 100644 index 000000000000..587c407530e2 --- /dev/null +++ b/dists/msvc8/saga.vcproj @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/sci.vcproj b/dists/msvc8/sci.vcproj new file mode 100644 index 000000000000..81d9164db92b --- /dev/null +++ b/dists/msvc8/sci.vcproj @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/scumm.vcproj b/dists/msvc8/scumm.vcproj new file mode 100644 index 000000000000..e153038d8212 --- /dev/null +++ b/dists/msvc8/scumm.vcproj @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/scummvm.sln b/dists/msvc8/scummvm.sln new file mode 100644 index 000000000000..af3fb282f627 --- /dev/null +++ b/dists/msvc8/scummvm.sln @@ -0,0 +1,423 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "scummvm", "scummvm.vcproj", "{101AE23B-72F0-4214-9286-037EFABDC303}" + ProjectSection(ProjectDependencies) = postProject + {3E984E6F-84FA-463E-A118-3C38050F1572} = {3E984E6F-84FA-463E-A118-3C38050F1572} + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3} = {7C2DA6C9-97B2-433F-BE81-3A61750C62B3} + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32} = {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32} + {8904FC22-B610-4136-929B-9709A7F9BC4D} = {8904FC22-B610-4136-929B-9709A7F9BC4D} + {ACE17859-ACE1-4891-89AF-7B3F0DD87297} = {ACE17859-ACE1-4891-89AF-7B3F0DD87297} + {DC6FB994-801C-4B14-B763-1D605EDAAE0B} = {DC6FB994-801C-4B14-B763-1D605EDAAE0B} + {BC286569-0ACE-4A94-BE77-D38C5047242D} = {BC286569-0ACE-4A94-BE77-D38C5047242D} + {B7DEC238-FA8E-4DB3-B26A-155245C45D02} = {B7DEC238-FA8E-4DB3-B26A-155245C45D02} + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60} = {ECC36CF7-9268-4C12-9F61-9E31A8C35E60} + {A222999E-B1E6-43A4-9268-F7972D559A1A} = {A222999E-B1E6-43A4-9268-F7972D559A1A} + {1A0812AC-719F-4E52-815E-83A922E20AC5} = {1A0812AC-719F-4E52-815E-83A922E20AC5} + {05A464B7-8BB7-4DDD-A155-764FAB1269C5} = {05A464B7-8BB7-4DDD-A155-764FAB1269C5} + {1A7C728C-1C32-4E1D-9062-C7B246D2794B} = {1A7C728C-1C32-4E1D-9062-C7B246D2794B} + {77DD0404-9661-42B8-B65A-08626C722987} = {77DD0404-9661-42B8-B65A-08626C722987} + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E} = {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E} + {6AED4202-4F26-4A07-80C3-6AED36937526} = {6AED4202-4F26-4A07-80C3-6AED36937526} + {308A33FE-7F5E-4ED6-9171-7418FE5E566A} = {308A33FE-7F5E-4ED6-9171-7418FE5E566A} + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101} = {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101} + {4D996C9D-C028-4441-AC10-2F23A4A54AD4} = {4D996C9D-C028-4441-AC10-2F23A4A54AD4} + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9} = {317DD4B0-DC33-472E-A5FC-47A55C9D10A9} + {387C47F8-A5EC-4B92-BC6B-B6A111017742} = {387C47F8-A5EC-4B92-BC6B-B6A111017742} + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA} = {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA} + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB} = {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB} + {17932998-10B4-4E89-888B-5FFA69DEA5C2} = {17932998-10B4-4E89-888B-5FFA69DEA5C2} + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44} = {A64AC35B-2B57-4D76-A160-D3ED2C73BA44} + {08E3DC18-999C-4122-A902-1E92E0C45687} = {08E3DC18-999C-4122-A902-1E92E0C45687} + EndProjectSection +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "agi", "agi.vcproj", "{3E984E6F-84FA-463E-A118-3C38050F1572}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "agos", "agos.vcproj", "{7C2DA6C9-97B2-433F-BE81-3A61750C62B3}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "cine", "cine.vcproj", "{A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "cruise", "cruise.vcproj", "{8904FC22-B610-4136-929B-9709A7F9BC4D}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "draci", "draci.vcproj", "{ACE17859-ACE1-4891-89AF-7B3F0DD87297}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "drascula", "drascula.vcproj", "{DC6FB994-801C-4B14-B763-1D605EDAAE0B}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "gob", "gob.vcproj", "{BC286569-0ACE-4A94-BE77-D38C5047242D}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "groovie", "groovie.vcproj", "{B7DEC238-FA8E-4DB3-B26A-155245C45D02}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "hugo", "hugo.vcproj", "{ECC36CF7-9268-4C12-9F61-9E31A8C35E60}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "kyra", "kyra.vcproj", "{A222999E-B1E6-43A4-9268-F7972D559A1A}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "lure", "lure.vcproj", "{1A0812AC-719F-4E52-815E-83A922E20AC5}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "made", "made.vcproj", "{05A464B7-8BB7-4DDD-A155-764FAB1269C5}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "mohawk", "mohawk.vcproj", "{1A7C728C-1C32-4E1D-9062-C7B246D2794B}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "parallaction", "parallaction.vcproj", "{77DD0404-9661-42B8-B65A-08626C722987}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "queen", "queen.vcproj", "{EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "saga", "saga.vcproj", "{6AED4202-4F26-4A07-80C3-6AED36937526}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "sci", "sci.vcproj", "{308A33FE-7F5E-4ED6-9171-7418FE5E566A}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "scumm", "scumm.vcproj", "{6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "sky", "sky.vcproj", "{4D996C9D-C028-4441-AC10-2F23A4A54AD4}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "sword1", "sword1.vcproj", "{317DD4B0-DC33-472E-A5FC-47A55C9D10A9}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "sword2", "sword2.vcproj", "{387C47F8-A5EC-4B92-BC6B-B6A111017742}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "teenagent", "teenagent.vcproj", "{7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "tinsel", "tinsel.vcproj", "{59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "toon", "toon.vcproj", "{17932998-10B4-4E89-888B-5FFA69DEA5C2}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "touche", "touche.vcproj", "{A64AC35B-2B57-4D76-A160-D3ED2C73BA44}" +EndProject +Project("{A2A01C3C-3EBE-4F67-807D-FAA242512B53}") = "tucker", "tucker.vcproj", "{08E3DC18-999C-4122-A902-1E92E0C45687}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Analysis|Win32 = Analysis|Win32 + Release|Win32 = Release|Win32 + Debug|x64 = Debug|x64 + Analysis|x64 = Analysis|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3E984E6F-84FA-463E-A118-3C38050F1572}.Debug|Win32.ActiveCfg = Debug|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Debug|Win32.Build.0 = Debug|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Analysis|Win32.Build.0 = Analysis|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Release|Win32.ActiveCfg = Release|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Release|Win32.Build.0 = Release|Win32 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Debug|x64.ActiveCfg = Debug|x64 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Debug|x64.Build.0 = Debug|x64 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Analysis|x64.ActiveCfg = Analysis|x64 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Analysis|x64.Build.0 = Analysis|x64 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Release|x64.ActiveCfg = Release|x64 + {3E984E6F-84FA-463E-A118-3C38050F1572}.Release|x64.Build.0 = Release|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Debug|Win32.Build.0 = Debug|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Analysis|Win32.Build.0 = Analysis|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Release|Win32.ActiveCfg = Release|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Release|Win32.Build.0 = Release|Win32 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Debug|x64.ActiveCfg = Debug|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Debug|x64.Build.0 = Debug|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Analysis|x64.ActiveCfg = Analysis|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Analysis|x64.Build.0 = Analysis|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Release|x64.ActiveCfg = Release|x64 + {7C2DA6C9-97B2-433F-BE81-3A61750C62B3}.Release|x64.Build.0 = Release|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Debug|Win32.ActiveCfg = Debug|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Debug|Win32.Build.0 = Debug|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Analysis|Win32.Build.0 = Analysis|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Release|Win32.ActiveCfg = Release|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Release|Win32.Build.0 = Release|Win32 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Debug|x64.ActiveCfg = Debug|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Debug|x64.Build.0 = Debug|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Analysis|x64.ActiveCfg = Analysis|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Analysis|x64.Build.0 = Analysis|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Release|x64.ActiveCfg = Release|x64 + {A5B1242A-ACCA-490E-A3A6-47E9B55C5D32}.Release|x64.Build.0 = Release|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Debug|Win32.Build.0 = Debug|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Analysis|Win32.Build.0 = Analysis|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Release|Win32.ActiveCfg = Release|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Release|Win32.Build.0 = Release|Win32 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Debug|x64.ActiveCfg = Debug|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Debug|x64.Build.0 = Debug|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Analysis|x64.ActiveCfg = Analysis|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Analysis|x64.Build.0 = Analysis|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Release|x64.ActiveCfg = Release|x64 + {8904FC22-B610-4136-929B-9709A7F9BC4D}.Release|x64.Build.0 = Release|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Debug|Win32.ActiveCfg = Debug|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Debug|Win32.Build.0 = Debug|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Analysis|Win32.Build.0 = Analysis|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Release|Win32.ActiveCfg = Release|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Release|Win32.Build.0 = Release|Win32 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Debug|x64.ActiveCfg = Debug|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Debug|x64.Build.0 = Debug|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Analysis|x64.ActiveCfg = Analysis|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Analysis|x64.Build.0 = Analysis|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Release|x64.ActiveCfg = Release|x64 + {ACE17859-ACE1-4891-89AF-7B3F0DD87297}.Release|x64.Build.0 = Release|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Debug|Win32.Build.0 = Debug|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Analysis|Win32.Build.0 = Analysis|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Release|Win32.ActiveCfg = Release|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Release|Win32.Build.0 = Release|Win32 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Debug|x64.ActiveCfg = Debug|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Debug|x64.Build.0 = Debug|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Analysis|x64.ActiveCfg = Analysis|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Analysis|x64.Build.0 = Analysis|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Release|x64.ActiveCfg = Release|x64 + {DC6FB994-801C-4B14-B763-1D605EDAAE0B}.Release|x64.Build.0 = Release|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Debug|Win32.Build.0 = Debug|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Analysis|Win32.Build.0 = Analysis|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Release|Win32.ActiveCfg = Release|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Release|Win32.Build.0 = Release|Win32 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Debug|x64.ActiveCfg = Debug|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Debug|x64.Build.0 = Debug|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Analysis|x64.ActiveCfg = Analysis|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Analysis|x64.Build.0 = Analysis|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Release|x64.ActiveCfg = Release|x64 + {BC286569-0ACE-4A94-BE77-D38C5047242D}.Release|x64.Build.0 = Release|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Debug|Win32.Build.0 = Debug|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Analysis|Win32.Build.0 = Analysis|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Release|Win32.ActiveCfg = Release|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Release|Win32.Build.0 = Release|Win32 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Debug|x64.ActiveCfg = Debug|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Debug|x64.Build.0 = Debug|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Analysis|x64.ActiveCfg = Analysis|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Analysis|x64.Build.0 = Analysis|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Release|x64.ActiveCfg = Release|x64 + {B7DEC238-FA8E-4DB3-B26A-155245C45D02}.Release|x64.Build.0 = Release|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Debug|Win32.ActiveCfg = Debug|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Debug|Win32.Build.0 = Debug|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Analysis|Win32.Build.0 = Analysis|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Release|Win32.ActiveCfg = Release|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Release|Win32.Build.0 = Release|Win32 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Debug|x64.ActiveCfg = Debug|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Debug|x64.Build.0 = Debug|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Analysis|x64.ActiveCfg = Analysis|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Analysis|x64.Build.0 = Analysis|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Release|x64.ActiveCfg = Release|x64 + {ECC36CF7-9268-4C12-9F61-9E31A8C35E60}.Release|x64.Build.0 = Release|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Debug|Win32.ActiveCfg = Debug|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Debug|Win32.Build.0 = Debug|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Analysis|Win32.Build.0 = Analysis|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Release|Win32.ActiveCfg = Release|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Release|Win32.Build.0 = Release|Win32 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Debug|x64.ActiveCfg = Debug|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Debug|x64.Build.0 = Debug|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Analysis|x64.ActiveCfg = Analysis|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Analysis|x64.Build.0 = Analysis|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Release|x64.ActiveCfg = Release|x64 + {A222999E-B1E6-43A4-9268-F7972D559A1A}.Release|x64.Build.0 = Release|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Debug|Win32.Build.0 = Debug|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Analysis|Win32.Build.0 = Analysis|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Release|Win32.ActiveCfg = Release|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Release|Win32.Build.0 = Release|Win32 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Debug|x64.ActiveCfg = Debug|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Debug|x64.Build.0 = Debug|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Analysis|x64.ActiveCfg = Analysis|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Analysis|x64.Build.0 = Analysis|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Release|x64.ActiveCfg = Release|x64 + {1A0812AC-719F-4E52-815E-83A922E20AC5}.Release|x64.Build.0 = Release|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Debug|Win32.ActiveCfg = Debug|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Debug|Win32.Build.0 = Debug|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Analysis|Win32.Build.0 = Analysis|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Release|Win32.ActiveCfg = Release|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Release|Win32.Build.0 = Release|Win32 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Debug|x64.ActiveCfg = Debug|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Debug|x64.Build.0 = Debug|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Analysis|x64.ActiveCfg = Analysis|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Analysis|x64.Build.0 = Analysis|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Release|x64.ActiveCfg = Release|x64 + {05A464B7-8BB7-4DDD-A155-764FAB1269C5}.Release|x64.Build.0 = Release|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Debug|Win32.Build.0 = Debug|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Analysis|Win32.Build.0 = Analysis|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Release|Win32.ActiveCfg = Release|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Release|Win32.Build.0 = Release|Win32 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Debug|x64.ActiveCfg = Debug|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Debug|x64.Build.0 = Debug|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Analysis|x64.ActiveCfg = Analysis|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Analysis|x64.Build.0 = Analysis|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Release|x64.ActiveCfg = Release|x64 + {1A7C728C-1C32-4E1D-9062-C7B246D2794B}.Release|x64.Build.0 = Release|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Debug|Win32.ActiveCfg = Debug|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Debug|Win32.Build.0 = Debug|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Analysis|Win32.Build.0 = Analysis|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Release|Win32.ActiveCfg = Release|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Release|Win32.Build.0 = Release|Win32 + {77DD0404-9661-42B8-B65A-08626C722987}.Debug|x64.ActiveCfg = Debug|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Debug|x64.Build.0 = Debug|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Analysis|x64.ActiveCfg = Analysis|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Analysis|x64.Build.0 = Analysis|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Release|x64.ActiveCfg = Release|x64 + {77DD0404-9661-42B8-B65A-08626C722987}.Release|x64.Build.0 = Release|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Debug|Win32.Build.0 = Debug|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Analysis|Win32.Build.0 = Analysis|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Release|Win32.ActiveCfg = Release|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Release|Win32.Build.0 = Release|Win32 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Debug|x64.ActiveCfg = Debug|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Debug|x64.Build.0 = Debug|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Analysis|x64.ActiveCfg = Analysis|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Analysis|x64.Build.0 = Analysis|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Release|x64.ActiveCfg = Release|x64 + {EF9B140C-CDF3-4A5F-97F2-139DC58CE93E}.Release|x64.Build.0 = Release|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Debug|Win32.ActiveCfg = Debug|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Debug|Win32.Build.0 = Debug|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Analysis|Win32.Build.0 = Analysis|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Release|Win32.ActiveCfg = Release|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Release|Win32.Build.0 = Release|Win32 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Debug|x64.ActiveCfg = Debug|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Debug|x64.Build.0 = Debug|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Analysis|x64.ActiveCfg = Analysis|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Analysis|x64.Build.0 = Analysis|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Release|x64.ActiveCfg = Release|x64 + {6AED4202-4F26-4A07-80C3-6AED36937526}.Release|x64.Build.0 = Release|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Debug|Win32.ActiveCfg = Debug|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Debug|Win32.Build.0 = Debug|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Analysis|Win32.Build.0 = Analysis|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Release|Win32.ActiveCfg = Release|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Release|Win32.Build.0 = Release|Win32 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Debug|x64.ActiveCfg = Debug|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Debug|x64.Build.0 = Debug|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Analysis|x64.ActiveCfg = Analysis|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Analysis|x64.Build.0 = Analysis|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Release|x64.ActiveCfg = Release|x64 + {308A33FE-7F5E-4ED6-9171-7418FE5E566A}.Release|x64.Build.0 = Release|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Debug|Win32.Build.0 = Debug|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Analysis|Win32.Build.0 = Analysis|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Release|Win32.ActiveCfg = Release|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Release|Win32.Build.0 = Release|Win32 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Debug|x64.ActiveCfg = Debug|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Debug|x64.Build.0 = Debug|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Analysis|x64.ActiveCfg = Analysis|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Analysis|x64.Build.0 = Analysis|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Release|x64.ActiveCfg = Release|x64 + {6D6C1733-4D6A-4B48-A6CB-6EFAE1F2D101}.Release|x64.Build.0 = Release|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Debug|Win32.ActiveCfg = Debug|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Debug|Win32.Build.0 = Debug|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Analysis|Win32.Build.0 = Analysis|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Release|Win32.ActiveCfg = Release|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Release|Win32.Build.0 = Release|Win32 + {101AE23B-72F0-4214-9286-037EFABDC303}.Debug|x64.ActiveCfg = Debug|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Debug|x64.Build.0 = Debug|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Analysis|x64.ActiveCfg = Analysis|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Analysis|x64.Build.0 = Analysis|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Release|x64.ActiveCfg = Release|x64 + {101AE23B-72F0-4214-9286-037EFABDC303}.Release|x64.Build.0 = Release|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Debug|Win32.ActiveCfg = Debug|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Debug|Win32.Build.0 = Debug|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Analysis|Win32.Build.0 = Analysis|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Release|Win32.ActiveCfg = Release|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Release|Win32.Build.0 = Release|Win32 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Debug|x64.ActiveCfg = Debug|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Debug|x64.Build.0 = Debug|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Analysis|x64.ActiveCfg = Analysis|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Analysis|x64.Build.0 = Analysis|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Release|x64.ActiveCfg = Release|x64 + {4D996C9D-C028-4441-AC10-2F23A4A54AD4}.Release|x64.Build.0 = Release|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Debug|Win32.Build.0 = Debug|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Analysis|Win32.Build.0 = Analysis|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Release|Win32.ActiveCfg = Release|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Release|Win32.Build.0 = Release|Win32 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Debug|x64.ActiveCfg = Debug|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Debug|x64.Build.0 = Debug|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Analysis|x64.ActiveCfg = Analysis|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Analysis|x64.Build.0 = Analysis|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Release|x64.ActiveCfg = Release|x64 + {317DD4B0-DC33-472E-A5FC-47A55C9D10A9}.Release|x64.Build.0 = Release|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Debug|Win32.ActiveCfg = Debug|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Debug|Win32.Build.0 = Debug|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Analysis|Win32.Build.0 = Analysis|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Release|Win32.ActiveCfg = Release|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Release|Win32.Build.0 = Release|Win32 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Debug|x64.ActiveCfg = Debug|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Debug|x64.Build.0 = Debug|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Analysis|x64.ActiveCfg = Analysis|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Analysis|x64.Build.0 = Analysis|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Release|x64.ActiveCfg = Release|x64 + {387C47F8-A5EC-4B92-BC6B-B6A111017742}.Release|x64.Build.0 = Release|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Debug|Win32.ActiveCfg = Debug|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Debug|Win32.Build.0 = Debug|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Analysis|Win32.Build.0 = Analysis|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Release|Win32.ActiveCfg = Release|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Release|Win32.Build.0 = Release|Win32 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Debug|x64.ActiveCfg = Debug|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Debug|x64.Build.0 = Debug|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Analysis|x64.ActiveCfg = Analysis|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Analysis|x64.Build.0 = Analysis|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Release|x64.ActiveCfg = Release|x64 + {7F4CF25C-807B-4B26-B8D2-CBD571DC7FAA}.Release|x64.Build.0 = Release|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Debug|Win32.ActiveCfg = Debug|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Debug|Win32.Build.0 = Debug|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Analysis|Win32.Build.0 = Analysis|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Release|Win32.ActiveCfg = Release|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Release|Win32.Build.0 = Release|Win32 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Debug|x64.ActiveCfg = Debug|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Debug|x64.Build.0 = Debug|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Analysis|x64.ActiveCfg = Analysis|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Analysis|x64.Build.0 = Analysis|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Release|x64.ActiveCfg = Release|x64 + {59C6A400-B3DF-43B1-8B4A-535C4BCA9FCB}.Release|x64.Build.0 = Release|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Debug|Win32.ActiveCfg = Debug|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Debug|Win32.Build.0 = Debug|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Analysis|Win32.Build.0 = Analysis|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Release|Win32.ActiveCfg = Release|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Release|Win32.Build.0 = Release|Win32 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Debug|x64.ActiveCfg = Debug|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Debug|x64.Build.0 = Debug|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Analysis|x64.ActiveCfg = Analysis|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Analysis|x64.Build.0 = Analysis|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Release|x64.ActiveCfg = Release|x64 + {17932998-10B4-4E89-888B-5FFA69DEA5C2}.Release|x64.Build.0 = Release|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Debug|Win32.ActiveCfg = Debug|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Debug|Win32.Build.0 = Debug|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Analysis|Win32.Build.0 = Analysis|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Release|Win32.ActiveCfg = Release|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Release|Win32.Build.0 = Release|Win32 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Debug|x64.ActiveCfg = Debug|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Debug|x64.Build.0 = Debug|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Analysis|x64.ActiveCfg = Analysis|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Analysis|x64.Build.0 = Analysis|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Release|x64.ActiveCfg = Release|x64 + {A64AC35B-2B57-4D76-A160-D3ED2C73BA44}.Release|x64.Build.0 = Release|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Debug|Win32.ActiveCfg = Debug|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Debug|Win32.Build.0 = Debug|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Analysis|Win32.Build.0 = Analysis|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Release|Win32.ActiveCfg = Release|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Release|Win32.Build.0 = Release|Win32 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Debug|x64.ActiveCfg = Debug|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Debug|x64.Build.0 = Debug|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Analysis|x64.ActiveCfg = Analysis|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Analysis|x64.Build.0 = Analysis|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Release|x64.ActiveCfg = Release|x64 + {08E3DC18-999C-4122-A902-1E92E0C45687}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dists/msvc8/scummvm.vcproj b/dists/msvc8/scummvm.vcproj new file mode 100644 index 000000000000..c6ddf8a4bd9a --- /dev/null +++ b/dists/msvc8/scummvm.vcproj @@ -0,0 +1,900 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/sky.vcproj b/dists/msvc8/sky.vcproj new file mode 100644 index 000000000000..0ea9ccf3fb0c --- /dev/null +++ b/dists/msvc8/sky.vcproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/sword1.vcproj b/dists/msvc8/sword1.vcproj new file mode 100644 index 000000000000..b3e3463313d9 --- /dev/null +++ b/dists/msvc8/sword1.vcproj @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/sword2.vcproj b/dists/msvc8/sword2.vcproj new file mode 100644 index 000000000000..25dc4ffa8ac7 --- /dev/null +++ b/dists/msvc8/sword2.vcproj @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/teenagent.vcproj b/dists/msvc8/teenagent.vcproj new file mode 100644 index 000000000000..67a4d7b94b80 --- /dev/null +++ b/dists/msvc8/teenagent.vcproj @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/tinsel.vcproj b/dists/msvc8/tinsel.vcproj new file mode 100644 index 000000000000..eb3e8ab28f1a --- /dev/null +++ b/dists/msvc8/tinsel.vcproj @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/toon.vcproj b/dists/msvc8/toon.vcproj new file mode 100644 index 000000000000..6f1fe72fe574 --- /dev/null +++ b/dists/msvc8/toon.vcproj @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/touche.vcproj b/dists/msvc8/touche.vcproj new file mode 100644 index 000000000000..ff563498570e --- /dev/null +++ b/dists/msvc8/touche.vcproj @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc8/tucker.vcproj b/dists/msvc8/tucker.vcproj new file mode 100644 index 000000000000..8fbc5b772b15 --- /dev/null +++ b/dists/msvc8/tucker.vcproj @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/ScummVM_Analysis.vsprops b/dists/msvc9/ScummVM_Analysis.vsprops new file mode 100644 index 000000000000..a9bca19f0e80 --- /dev/null +++ b/dists/msvc9/ScummVM_Analysis.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc9/ScummVM_Analysis64.vsprops b/dists/msvc9/ScummVM_Analysis64.vsprops new file mode 100644 index 000000000000..3e3d824738d3 --- /dev/null +++ b/dists/msvc9/ScummVM_Analysis64.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc9/ScummVM_Debug.vsprops b/dists/msvc9/ScummVM_Debug.vsprops new file mode 100644 index 000000000000..5ecedf2368b8 --- /dev/null +++ b/dists/msvc9/ScummVM_Debug.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc9/ScummVM_Debug64.vsprops b/dists/msvc9/ScummVM_Debug64.vsprops new file mode 100644 index 000000000000..7f7171b29290 --- /dev/null +++ b/dists/msvc9/ScummVM_Debug64.vsprops @@ -0,0 +1,26 @@ + + + + + diff --git a/dists/msvc9/ScummVM_Global.vsprops b/dists/msvc9/ScummVM_Global.vsprops new file mode 100644 index 000000000000..ef9d02b3e5e6 --- /dev/null +++ b/dists/msvc9/ScummVM_Global.vsprops @@ -0,0 +1,38 @@ + + + + + + + diff --git a/dists/msvc9/ScummVM_Global64.vsprops b/dists/msvc9/ScummVM_Global64.vsprops new file mode 100644 index 000000000000..c0c8376e9915 --- /dev/null +++ b/dists/msvc9/ScummVM_Global64.vsprops @@ -0,0 +1,38 @@ + + + + + + + diff --git a/dists/msvc9/ScummVM_Release.vsprops b/dists/msvc9/ScummVM_Release.vsprops new file mode 100644 index 000000000000..a837a9bac967 --- /dev/null +++ b/dists/msvc9/ScummVM_Release.vsprops @@ -0,0 +1,24 @@ + + + + + diff --git a/dists/msvc9/ScummVM_Release64.vsprops b/dists/msvc9/ScummVM_Release64.vsprops new file mode 100644 index 000000000000..9e3bc30bc236 --- /dev/null +++ b/dists/msvc9/ScummVM_Release64.vsprops @@ -0,0 +1,24 @@ + + + + + diff --git a/dists/msvc9/agi.vcproj b/dists/msvc9/agi.vcproj new file mode 100644 index 000000000000..caf087b5da37 --- /dev/null +++ b/dists/msvc9/agi.vcproj @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/agos.vcproj b/dists/msvc9/agos.vcproj new file mode 100644 index 000000000000..40b3c7fa15ad --- /dev/null +++ b/dists/msvc9/agos.vcproj @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/cine.vcproj b/dists/msvc9/cine.vcproj new file mode 100644 index 000000000000..a7ce448185d3 --- /dev/null +++ b/dists/msvc9/cine.vcproj @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/cruise.vcproj b/dists/msvc9/cruise.vcproj new file mode 100644 index 000000000000..2723423f9289 --- /dev/null +++ b/dists/msvc9/cruise.vcproj @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/draci.vcproj b/dists/msvc9/draci.vcproj new file mode 100644 index 000000000000..d31fab0d642c --- /dev/null +++ b/dists/msvc9/draci.vcproj @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/drascula.vcproj b/dists/msvc9/drascula.vcproj new file mode 100644 index 000000000000..500163efb746 --- /dev/null +++ b/dists/msvc9/drascula.vcproj @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/gob.vcproj b/dists/msvc9/gob.vcproj new file mode 100644 index 000000000000..6a6b2b0cae0f --- /dev/null +++ b/dists/msvc9/gob.vcproj @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/groovie.vcproj b/dists/msvc9/groovie.vcproj new file mode 100644 index 000000000000..3af17329bb95 --- /dev/null +++ b/dists/msvc9/groovie.vcproj @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/hugo.vcproj b/dists/msvc9/hugo.vcproj new file mode 100644 index 000000000000..3cd503aee4f5 --- /dev/null +++ b/dists/msvc9/hugo.vcproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/kyra.vcproj b/dists/msvc9/kyra.vcproj new file mode 100644 index 000000000000..924b4c6e38a3 --- /dev/null +++ b/dists/msvc9/kyra.vcproj @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/lure.vcproj b/dists/msvc9/lure.vcproj new file mode 100644 index 000000000000..224a91595ca2 --- /dev/null +++ b/dists/msvc9/lure.vcproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/made.vcproj b/dists/msvc9/made.vcproj new file mode 100644 index 000000000000..e797455706b5 --- /dev/null +++ b/dists/msvc9/made.vcproj @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/mohawk.vcproj b/dists/msvc9/mohawk.vcproj new file mode 100644 index 000000000000..13aef460848b --- /dev/null +++ b/dists/msvc9/mohawk.vcproj @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/parallaction.vcproj b/dists/msvc9/parallaction.vcproj new file mode 100644 index 000000000000..71242b02df91 --- /dev/null +++ b/dists/msvc9/parallaction.vcproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/queen.vcproj b/dists/msvc9/queen.vcproj new file mode 100644 index 000000000000..d93954a10aed --- /dev/null +++ b/dists/msvc9/queen.vcproj @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/saga.vcproj b/dists/msvc9/saga.vcproj new file mode 100644 index 000000000000..e3f038c92dc8 --- /dev/null +++ b/dists/msvc9/saga.vcproj @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/sci.vcproj b/dists/msvc9/sci.vcproj new file mode 100644 index 000000000000..2f6a1c665a9a --- /dev/null +++ b/dists/msvc9/sci.vcproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/scumm.vcproj b/dists/msvc9/scumm.vcproj new file mode 100644 index 000000000000..a789068f22f3 --- /dev/null +++ b/dists/msvc9/scumm.vcproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/scummvm.sln b/dists/msvc9/scummvm.sln new file mode 100644 index 000000000000..3f7956d7b249 --- /dev/null +++ b/dists/msvc9/scummvm.sln @@ -0,0 +1,423 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "scummvm", "scummvm.vcproj", "{F423285D-3154-46E5-AE95-8F03B6FA3690}" + ProjectSection(ProjectDependencies) = postProject + {A05904EB-A491-4B15-AC1E-1D9694D24EF2} = {A05904EB-A491-4B15-AC1E-1D9694D24EF2} + {13E15F31-F80B-4ACD-9884-C536237DD7C4} = {13E15F31-F80B-4ACD-9884-C536237DD7C4} + {D6DBB07C-6EBB-419A-99AF-326F83806296} = {D6DBB07C-6EBB-419A-99AF-326F83806296} + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246} = {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246} + {12D2C281-8F55-4D6A-864F-D989D03C2134} = {12D2C281-8F55-4D6A-864F-D989D03C2134} + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C} = {FEE88FCD-9DBA-44D6-AB53-331B8A56619C} + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B} = {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B} + {172209B4-DDFE-4B8A-93BF-A5DD16087B40} = {172209B4-DDFE-4B8A-93BF-A5DD16087B40} + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B} = {2D9AF9A8-D71F-4B65-9E37-C25A6455957B} + {789F3056-9EBC-41F1-BD87-CF93904BD4BD} = {789F3056-9EBC-41F1-BD87-CF93904BD4BD} + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7} = {E6CF67BE-EE93-440D-8AE7-67303EFDABB7} + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832} = {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832} + {5131F140-C417-4E90-80B6-C03EB46CF652} = {5131F140-C417-4E90-80B6-C03EB46CF652} + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C} = {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C} + {762FBD3B-470C-4B47-838C-8678F97DCB44} = {762FBD3B-470C-4B47-838C-8678F97DCB44} + {845C287C-1C25-4DDA-8E6A-E5F9AF247627} = {845C287C-1C25-4DDA-8E6A-E5F9AF247627} + {5334629A-412F-4205-BC69-7EB6E64AFA6B} = {5334629A-412F-4205-BC69-7EB6E64AFA6B} + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0} = {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0} + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD} = {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD} + {BF7E9902-AD7C-476B-A585-22CDD01E3A78} = {BF7E9902-AD7C-476B-A585-22CDD01E3A78} + {43233D8D-FBDC-473F-A2BB-330D474F0C08} = {43233D8D-FBDC-473F-A2BB-330D474F0C08} + {CDA50A7C-2211-4709-970B-D6682911E16C} = {CDA50A7C-2211-4709-970B-D6682911E16C} + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2} = {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2} + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A} = {1FB93F42-CB28-4B64-B323-CD5D35AFC96A} + {CFC49CCC-680E-4CC7-B399-6FA813206B33} = {CFC49CCC-680E-4CC7-B399-6FA813206B33} + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A} = {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A} + EndProjectSection +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "agi", "agi.vcproj", "{A05904EB-A491-4B15-AC1E-1D9694D24EF2}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "agos", "agos.vcproj", "{13E15F31-F80B-4ACD-9884-C536237DD7C4}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "cine", "cine.vcproj", "{D6DBB07C-6EBB-419A-99AF-326F83806296}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "cruise", "cruise.vcproj", "{62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "draci", "draci.vcproj", "{12D2C281-8F55-4D6A-864F-D989D03C2134}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "drascula", "drascula.vcproj", "{FEE88FCD-9DBA-44D6-AB53-331B8A56619C}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "gob", "gob.vcproj", "{29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "groovie", "groovie.vcproj", "{172209B4-DDFE-4B8A-93BF-A5DD16087B40}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "hugo", "hugo.vcproj", "{2D9AF9A8-D71F-4B65-9E37-C25A6455957B}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "kyra", "kyra.vcproj", "{789F3056-9EBC-41F1-BD87-CF93904BD4BD}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "lure", "lure.vcproj", "{E6CF67BE-EE93-440D-8AE7-67303EFDABB7}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "made", "made.vcproj", "{9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "mohawk", "mohawk.vcproj", "{5131F140-C417-4E90-80B6-C03EB46CF652}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "parallaction", "parallaction.vcproj", "{49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "queen", "queen.vcproj", "{762FBD3B-470C-4B47-838C-8678F97DCB44}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "saga", "saga.vcproj", "{845C287C-1C25-4DDA-8E6A-E5F9AF247627}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "sci", "sci.vcproj", "{5334629A-412F-4205-BC69-7EB6E64AFA6B}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "scumm", "scumm.vcproj", "{5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "sky", "sky.vcproj", "{A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "sword1", "sword1.vcproj", "{BF7E9902-AD7C-476B-A585-22CDD01E3A78}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "sword2", "sword2.vcproj", "{43233D8D-FBDC-473F-A2BB-330D474F0C08}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "teenagent", "teenagent.vcproj", "{CDA50A7C-2211-4709-970B-D6682911E16C}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "tinsel", "tinsel.vcproj", "{351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "toon", "toon.vcproj", "{1FB93F42-CB28-4B64-B323-CD5D35AFC96A}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "touche", "touche.vcproj", "{CFC49CCC-680E-4CC7-B399-6FA813206B33}" +EndProject +Project("{A7AB387B-6D44-4352-9EE8-6DA819F2040E}") = "tucker", "tucker.vcproj", "{D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Analysis|Win32 = Analysis|Win32 + Release|Win32 = Release|Win32 + Debug|x64 = Debug|x64 + Analysis|x64 = Analysis|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Debug|Win32.ActiveCfg = Debug|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Debug|Win32.Build.0 = Debug|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Analysis|Win32.Build.0 = Analysis|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Release|Win32.ActiveCfg = Release|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Release|Win32.Build.0 = Release|Win32 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Debug|x64.ActiveCfg = Debug|x64 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Debug|x64.Build.0 = Debug|x64 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Analysis|x64.ActiveCfg = Analysis|x64 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Analysis|x64.Build.0 = Analysis|x64 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Release|x64.ActiveCfg = Release|x64 + {A05904EB-A491-4B15-AC1E-1D9694D24EF2}.Release|x64.Build.0 = Release|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Debug|Win32.Build.0 = Debug|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Analysis|Win32.Build.0 = Analysis|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Release|Win32.ActiveCfg = Release|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Release|Win32.Build.0 = Release|Win32 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Debug|x64.ActiveCfg = Debug|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Debug|x64.Build.0 = Debug|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Analysis|x64.ActiveCfg = Analysis|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Analysis|x64.Build.0 = Analysis|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Release|x64.ActiveCfg = Release|x64 + {13E15F31-F80B-4ACD-9884-C536237DD7C4}.Release|x64.Build.0 = Release|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Debug|Win32.ActiveCfg = Debug|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Debug|Win32.Build.0 = Debug|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Analysis|Win32.Build.0 = Analysis|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Release|Win32.ActiveCfg = Release|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Release|Win32.Build.0 = Release|Win32 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Debug|x64.ActiveCfg = Debug|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Debug|x64.Build.0 = Debug|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Analysis|x64.ActiveCfg = Analysis|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Analysis|x64.Build.0 = Analysis|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Release|x64.ActiveCfg = Release|x64 + {D6DBB07C-6EBB-419A-99AF-326F83806296}.Release|x64.Build.0 = Release|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Debug|Win32.ActiveCfg = Debug|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Debug|Win32.Build.0 = Debug|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Analysis|Win32.Build.0 = Analysis|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Release|Win32.ActiveCfg = Release|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Release|Win32.Build.0 = Release|Win32 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Debug|x64.ActiveCfg = Debug|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Debug|x64.Build.0 = Debug|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Analysis|x64.ActiveCfg = Analysis|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Analysis|x64.Build.0 = Analysis|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Release|x64.ActiveCfg = Release|x64 + {62C1C75B-CDB3-4A27-B8F0-5E5C6E362246}.Release|x64.Build.0 = Release|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Debug|Win32.ActiveCfg = Debug|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Debug|Win32.Build.0 = Debug|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Analysis|Win32.Build.0 = Analysis|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Release|Win32.ActiveCfg = Release|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Release|Win32.Build.0 = Release|Win32 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Debug|x64.ActiveCfg = Debug|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Debug|x64.Build.0 = Debug|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Analysis|x64.ActiveCfg = Analysis|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Analysis|x64.Build.0 = Analysis|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Release|x64.ActiveCfg = Release|x64 + {12D2C281-8F55-4D6A-864F-D989D03C2134}.Release|x64.Build.0 = Release|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Debug|Win32.ActiveCfg = Debug|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Debug|Win32.Build.0 = Debug|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Analysis|Win32.Build.0 = Analysis|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Release|Win32.ActiveCfg = Release|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Release|Win32.Build.0 = Release|Win32 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Debug|x64.ActiveCfg = Debug|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Debug|x64.Build.0 = Debug|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Analysis|x64.ActiveCfg = Analysis|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Analysis|x64.Build.0 = Analysis|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Release|x64.ActiveCfg = Release|x64 + {FEE88FCD-9DBA-44D6-AB53-331B8A56619C}.Release|x64.Build.0 = Release|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Debug|Win32.ActiveCfg = Debug|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Debug|Win32.Build.0 = Debug|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Analysis|Win32.Build.0 = Analysis|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Release|Win32.ActiveCfg = Release|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Release|Win32.Build.0 = Release|Win32 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Debug|x64.ActiveCfg = Debug|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Debug|x64.Build.0 = Debug|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Analysis|x64.ActiveCfg = Analysis|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Analysis|x64.Build.0 = Analysis|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Release|x64.ActiveCfg = Release|x64 + {29251FB9-7B3C-4481-8CFD-0B5D3B2D913B}.Release|x64.Build.0 = Release|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Debug|Win32.ActiveCfg = Debug|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Debug|Win32.Build.0 = Debug|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Analysis|Win32.Build.0 = Analysis|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Release|Win32.ActiveCfg = Release|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Release|Win32.Build.0 = Release|Win32 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Debug|x64.ActiveCfg = Debug|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Debug|x64.Build.0 = Debug|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Analysis|x64.ActiveCfg = Analysis|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Analysis|x64.Build.0 = Analysis|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Release|x64.ActiveCfg = Release|x64 + {172209B4-DDFE-4B8A-93BF-A5DD16087B40}.Release|x64.Build.0 = Release|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Debug|Win32.ActiveCfg = Debug|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Debug|Win32.Build.0 = Debug|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Analysis|Win32.Build.0 = Analysis|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Release|Win32.ActiveCfg = Release|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Release|Win32.Build.0 = Release|Win32 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Debug|x64.ActiveCfg = Debug|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Debug|x64.Build.0 = Debug|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Analysis|x64.ActiveCfg = Analysis|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Analysis|x64.Build.0 = Analysis|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Release|x64.ActiveCfg = Release|x64 + {2D9AF9A8-D71F-4B65-9E37-C25A6455957B}.Release|x64.Build.0 = Release|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Debug|Win32.ActiveCfg = Debug|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Debug|Win32.Build.0 = Debug|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Analysis|Win32.Build.0 = Analysis|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Release|Win32.ActiveCfg = Release|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Release|Win32.Build.0 = Release|Win32 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Debug|x64.ActiveCfg = Debug|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Debug|x64.Build.0 = Debug|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Analysis|x64.ActiveCfg = Analysis|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Analysis|x64.Build.0 = Analysis|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Release|x64.ActiveCfg = Release|x64 + {789F3056-9EBC-41F1-BD87-CF93904BD4BD}.Release|x64.Build.0 = Release|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Debug|Win32.ActiveCfg = Debug|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Debug|Win32.Build.0 = Debug|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Analysis|Win32.Build.0 = Analysis|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Release|Win32.ActiveCfg = Release|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Release|Win32.Build.0 = Release|Win32 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Debug|x64.ActiveCfg = Debug|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Debug|x64.Build.0 = Debug|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Analysis|x64.ActiveCfg = Analysis|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Analysis|x64.Build.0 = Analysis|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Release|x64.ActiveCfg = Release|x64 + {E6CF67BE-EE93-440D-8AE7-67303EFDABB7}.Release|x64.Build.0 = Release|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Debug|Win32.ActiveCfg = Debug|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Debug|Win32.Build.0 = Debug|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Analysis|Win32.Build.0 = Analysis|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Release|Win32.ActiveCfg = Release|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Release|Win32.Build.0 = Release|Win32 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Debug|x64.ActiveCfg = Debug|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Debug|x64.Build.0 = Debug|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Analysis|x64.ActiveCfg = Analysis|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Analysis|x64.Build.0 = Analysis|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Release|x64.ActiveCfg = Release|x64 + {9DDC0F3C-99F0-4F18-B9FE-AB0A4B81C832}.Release|x64.Build.0 = Release|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Debug|Win32.ActiveCfg = Debug|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Debug|Win32.Build.0 = Debug|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Analysis|Win32.Build.0 = Analysis|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Release|Win32.ActiveCfg = Release|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Release|Win32.Build.0 = Release|Win32 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Debug|x64.ActiveCfg = Debug|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Debug|x64.Build.0 = Debug|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Analysis|x64.ActiveCfg = Analysis|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Analysis|x64.Build.0 = Analysis|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Release|x64.ActiveCfg = Release|x64 + {5131F140-C417-4E90-80B6-C03EB46CF652}.Release|x64.Build.0 = Release|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Debug|Win32.ActiveCfg = Debug|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Debug|Win32.Build.0 = Debug|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Analysis|Win32.Build.0 = Analysis|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Release|Win32.ActiveCfg = Release|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Release|Win32.Build.0 = Release|Win32 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Debug|x64.ActiveCfg = Debug|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Debug|x64.Build.0 = Debug|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Analysis|x64.ActiveCfg = Analysis|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Analysis|x64.Build.0 = Analysis|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Release|x64.ActiveCfg = Release|x64 + {49068FE3-F7BE-4B71-BEA8-7B0A2A453D7C}.Release|x64.Build.0 = Release|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Debug|Win32.ActiveCfg = Debug|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Debug|Win32.Build.0 = Debug|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Analysis|Win32.Build.0 = Analysis|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Release|Win32.ActiveCfg = Release|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Release|Win32.Build.0 = Release|Win32 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Debug|x64.ActiveCfg = Debug|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Debug|x64.Build.0 = Debug|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Analysis|x64.ActiveCfg = Analysis|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Analysis|x64.Build.0 = Analysis|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Release|x64.ActiveCfg = Release|x64 + {762FBD3B-470C-4B47-838C-8678F97DCB44}.Release|x64.Build.0 = Release|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Debug|Win32.ActiveCfg = Debug|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Debug|Win32.Build.0 = Debug|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Analysis|Win32.Build.0 = Analysis|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Release|Win32.ActiveCfg = Release|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Release|Win32.Build.0 = Release|Win32 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Debug|x64.ActiveCfg = Debug|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Debug|x64.Build.0 = Debug|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Analysis|x64.ActiveCfg = Analysis|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Analysis|x64.Build.0 = Analysis|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Release|x64.ActiveCfg = Release|x64 + {845C287C-1C25-4DDA-8E6A-E5F9AF247627}.Release|x64.Build.0 = Release|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Debug|Win32.Build.0 = Debug|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Analysis|Win32.Build.0 = Analysis|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Release|Win32.ActiveCfg = Release|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Release|Win32.Build.0 = Release|Win32 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Debug|x64.ActiveCfg = Debug|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Debug|x64.Build.0 = Debug|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Analysis|x64.ActiveCfg = Analysis|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Analysis|x64.Build.0 = Analysis|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Release|x64.ActiveCfg = Release|x64 + {5334629A-412F-4205-BC69-7EB6E64AFA6B}.Release|x64.Build.0 = Release|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Debug|Win32.Build.0 = Debug|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Analysis|Win32.Build.0 = Analysis|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Release|Win32.ActiveCfg = Release|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Release|Win32.Build.0 = Release|Win32 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Debug|x64.ActiveCfg = Debug|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Debug|x64.Build.0 = Debug|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Analysis|x64.ActiveCfg = Analysis|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Analysis|x64.Build.0 = Analysis|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Release|x64.ActiveCfg = Release|x64 + {5E40926C-1D16-4BB9-944C-98F6DD9EB6A0}.Release|x64.Build.0 = Release|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Debug|Win32.ActiveCfg = Debug|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Debug|Win32.Build.0 = Debug|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Analysis|Win32.Build.0 = Analysis|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Release|Win32.ActiveCfg = Release|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Release|Win32.Build.0 = Release|Win32 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Debug|x64.ActiveCfg = Debug|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Debug|x64.Build.0 = Debug|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Analysis|x64.ActiveCfg = Analysis|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Analysis|x64.Build.0 = Analysis|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Release|x64.ActiveCfg = Release|x64 + {F423285D-3154-46E5-AE95-8F03B6FA3690}.Release|x64.Build.0 = Release|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Debug|Win32.ActiveCfg = Debug|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Debug|Win32.Build.0 = Debug|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Analysis|Win32.Build.0 = Analysis|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Release|Win32.ActiveCfg = Release|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Release|Win32.Build.0 = Release|Win32 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Debug|x64.ActiveCfg = Debug|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Debug|x64.Build.0 = Debug|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Analysis|x64.ActiveCfg = Analysis|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Analysis|x64.Build.0 = Analysis|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Release|x64.ActiveCfg = Release|x64 + {A724E8C3-4AD7-4F19-8385-14F3A98A1BFD}.Release|x64.Build.0 = Release|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Debug|Win32.ActiveCfg = Debug|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Debug|Win32.Build.0 = Debug|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Analysis|Win32.Build.0 = Analysis|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Release|Win32.ActiveCfg = Release|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Release|Win32.Build.0 = Release|Win32 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Debug|x64.ActiveCfg = Debug|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Debug|x64.Build.0 = Debug|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Analysis|x64.ActiveCfg = Analysis|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Analysis|x64.Build.0 = Analysis|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Release|x64.ActiveCfg = Release|x64 + {BF7E9902-AD7C-476B-A585-22CDD01E3A78}.Release|x64.Build.0 = Release|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Debug|Win32.ActiveCfg = Debug|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Debug|Win32.Build.0 = Debug|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Analysis|Win32.Build.0 = Analysis|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Release|Win32.ActiveCfg = Release|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Release|Win32.Build.0 = Release|Win32 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Debug|x64.ActiveCfg = Debug|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Debug|x64.Build.0 = Debug|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Analysis|x64.ActiveCfg = Analysis|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Analysis|x64.Build.0 = Analysis|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Release|x64.ActiveCfg = Release|x64 + {43233D8D-FBDC-473F-A2BB-330D474F0C08}.Release|x64.Build.0 = Release|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Debug|Win32.ActiveCfg = Debug|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Debug|Win32.Build.0 = Debug|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Analysis|Win32.Build.0 = Analysis|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Release|Win32.ActiveCfg = Release|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Release|Win32.Build.0 = Release|Win32 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Debug|x64.ActiveCfg = Debug|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Debug|x64.Build.0 = Debug|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Analysis|x64.ActiveCfg = Analysis|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Analysis|x64.Build.0 = Analysis|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Release|x64.ActiveCfg = Release|x64 + {CDA50A7C-2211-4709-970B-D6682911E16C}.Release|x64.Build.0 = Release|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Debug|Win32.ActiveCfg = Debug|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Debug|Win32.Build.0 = Debug|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Analysis|Win32.Build.0 = Analysis|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Release|Win32.ActiveCfg = Release|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Release|Win32.Build.0 = Release|Win32 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Debug|x64.ActiveCfg = Debug|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Debug|x64.Build.0 = Debug|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Analysis|x64.ActiveCfg = Analysis|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Analysis|x64.Build.0 = Analysis|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Release|x64.ActiveCfg = Release|x64 + {351FFA31-FBA2-415F-9FA4-6CA7F378AFC2}.Release|x64.Build.0 = Release|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Debug|Win32.ActiveCfg = Debug|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Debug|Win32.Build.0 = Debug|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Analysis|Win32.Build.0 = Analysis|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Release|Win32.ActiveCfg = Release|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Release|Win32.Build.0 = Release|Win32 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Debug|x64.ActiveCfg = Debug|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Debug|x64.Build.0 = Debug|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Analysis|x64.ActiveCfg = Analysis|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Analysis|x64.Build.0 = Analysis|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Release|x64.ActiveCfg = Release|x64 + {1FB93F42-CB28-4B64-B323-CD5D35AFC96A}.Release|x64.Build.0 = Release|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Debug|Win32.ActiveCfg = Debug|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Debug|Win32.Build.0 = Debug|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Analysis|Win32.Build.0 = Analysis|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Release|Win32.ActiveCfg = Release|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Release|Win32.Build.0 = Release|Win32 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Debug|x64.ActiveCfg = Debug|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Debug|x64.Build.0 = Debug|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Analysis|x64.ActiveCfg = Analysis|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Analysis|x64.Build.0 = Analysis|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Release|x64.ActiveCfg = Release|x64 + {CFC49CCC-680E-4CC7-B399-6FA813206B33}.Release|x64.Build.0 = Release|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Debug|Win32.ActiveCfg = Debug|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Debug|Win32.Build.0 = Debug|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Analysis|Win32.ActiveCfg = Analysis|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Analysis|Win32.Build.0 = Analysis|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Release|Win32.ActiveCfg = Release|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Release|Win32.Build.0 = Release|Win32 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Debug|x64.ActiveCfg = Debug|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Debug|x64.Build.0 = Debug|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Analysis|x64.ActiveCfg = Analysis|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Analysis|x64.Build.0 = Analysis|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Release|x64.ActiveCfg = Release|x64 + {D9AB75A6-D3C0-4B07-A4D9-641A8A2F855A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dists/msvc9/scummvm.vcproj b/dists/msvc9/scummvm.vcproj new file mode 100644 index 000000000000..d6d17384efc4 --- /dev/null +++ b/dists/msvc9/scummvm.vcproj @@ -0,0 +1,901 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/sky.vcproj b/dists/msvc9/sky.vcproj new file mode 100644 index 000000000000..72532f419013 --- /dev/null +++ b/dists/msvc9/sky.vcproj @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/sword1.vcproj b/dists/msvc9/sword1.vcproj new file mode 100644 index 000000000000..a591895246c5 --- /dev/null +++ b/dists/msvc9/sword1.vcproj @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/sword2.vcproj b/dists/msvc9/sword2.vcproj new file mode 100644 index 000000000000..1ace0cb6c63a --- /dev/null +++ b/dists/msvc9/sword2.vcproj @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/teenagent.vcproj b/dists/msvc9/teenagent.vcproj new file mode 100644 index 000000000000..203b8b08ae53 --- /dev/null +++ b/dists/msvc9/teenagent.vcproj @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/tinsel.vcproj b/dists/msvc9/tinsel.vcproj new file mode 100644 index 000000000000..46d6379c39e8 --- /dev/null +++ b/dists/msvc9/tinsel.vcproj @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/toon.vcproj b/dists/msvc9/toon.vcproj new file mode 100644 index 000000000000..eae67eb6cda7 --- /dev/null +++ b/dists/msvc9/toon.vcproj @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/touche.vcproj b/dists/msvc9/touche.vcproj new file mode 100644 index 000000000000..2fbc3deac0af --- /dev/null +++ b/dists/msvc9/touche.vcproj @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/msvc9/tucker.vcproj b/dists/msvc9/tucker.vcproj new file mode 100644 index 000000000000..f7d29a93046d --- /dev/null +++ b/dists/msvc9/tucker.vcproj @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 96519ad939fab21d07727662aa28a059a3c1d510 Mon Sep 17 00:00:00 2001 From: Max Lingua Date: Tue, 24 May 2011 11:44:59 -0400 Subject: [PATCH 166/369] PS2 backend: Modified and tidied up Makefiles for 1.3.0 release --- backends/platform/ps2/Makefile.gdb | 102 ++++++++++++++++------------- backends/platform/ps2/Makefile.ps2 | 62 +++++++++++------- 2 files changed, 95 insertions(+), 69 deletions(-) diff --git a/backends/platform/ps2/Makefile.gdb b/backends/platform/ps2/Makefile.gdb index 48dcebc1d4cc..456fc5b744c4 100644 --- a/backends/platform/ps2/Makefile.gdb +++ b/backends/platform/ps2/Makefile.gdb @@ -1,7 +1,7 @@ # $Header: Exp $ include $(PS2SDK)/Defs.make -PS2_EXTRA = /media/disk/nw8240/extras/scummvm/ports +PS2_EXTRA = /works/devel/ps2/sdk-extra PS2_EXTRA_INCS = /zlib/include /libmad/ee/include /SjPcm/ee/src /tremor PS2_EXTRA_LIBS = /zlib/lib /libmad/ee/lib /SjPcm/ee/lib /tremor/tremor @@ -9,31 +9,44 @@ ENABLED=STATIC_PLUGIN ENABLE_SCUMM = $(ENABLED) ENABLE_SCUMM_7_8 = $(ENABLED) -#ENABLE_HE = $(ENABLED) -#ENABLE_AGI = $(ENABLED) -#ENABLE_AGOS = $(ENABLED) -#ENABLE_CINE = $(ENABLED) -#ENABLE_CRUISE = $(ENABLED) -#ENABLE_DRASCULA = $(ENABLED) -#ENABLE_GOB = $(ENABLED) -#ENABLE_KYRA = $(ENABLED) -#ENABLE_LURE = $(ENABLED) - # ENABLE_M4 = $(ENABLED) -#ENABLE_MADE = $(ENABLED) -#ENABLE_PARALLACTION = $(ENABLED) -#ENABLE_QUEEN = $(ENABLED) -#ENABLE_SAGA = $(ENABLED) -#ENABLE_SAGA2 = $(ENABLED) -#ENABLE_IHNM = $(ENABLED) -#ENABLE_SKY = $(ENABLED) -#ENABLE_SWORD1 = $(ENABLED) -#ENABLE_SWORD2 = $(ENABLED) - # ENABLE_TINSEL = $(ENABLED) -#ENABLE_TOUCHE = $(ENABLED) +# ENABLE_HE = $(ENABLED) +# ENABLE_AGI = $(ENABLED) +# ENABLE_AGOS = $(ENABLED) +# ENABLE_AGOS2 = $(ENABLED) +# ENABLE_CINE = $(ENABLED) +# ENABLE_CRUISE = $(ENABLED) +# ENABLE_DRACI = $(ENABLED) +# ENABLE_DRASCULA = $(ENABLED) +# ENABLE_GOB = $(ENABLED) +# ENABLE_GROOVIE = $(ENABLED) +## ENABLE_GROOVIE2 = $(ENABLED) +# ENABLE_HUGO = $(ENABLED) +# ENABLE_IHNM = $(ENABLED) +# ENABLE_KYRA = $(ENABLED) +## ENABLE_LOL = $(ENABLED) +# ENABLE_LURE = $(ENABLED) +## ENABLE_M4 = $(ENABLED) +# ENABLE_MADE = $(ENABLED) +# ENABLE_MOHAWK = $(ENABLED) +# ENABLE_PARALLACTION = $(ENABLED) +# ENABLE_QUEEN = $(ENABLED) +# ENABLE_SAGA = $(ENABLED) +# ENABLE_SAGA2 = $(ENABLED) +# ENABLE_SCI = $(ENABLED) +## ENABLE_SCI32 = $(ENABLED) +# ENABLE_SKY = $(ENABLED) +# ENABLE_SWORD1 = $(ENABLED) +# ENABLE_SWORD2 = $(ENABLED) +# ENABLE_TEENAGENT = $(ENABLED) +# ENABLE_TINSEL = $(ENABLED) +# ENABLE_TOON = $(ENABLED) +# ENABLE_TOUCHE = $(ENABLED) +# ENABLE_TUCKER = $(ENABLED) + HAVE_GCC3 = true -CC = ee-gcc +CC = ee-gcc CXX = ee-g++ AS = ee-gcc LD = ee-gcc @@ -48,35 +61,34 @@ VPATH = $(srcdir) INCDIR = ../../../ # DEPDIR = .deps -DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -D_EE -D__PLAYSTATION2__ -D__PS2_DEBUG__ -g -Wall -Wno-multichar - +DEFINES = -DRELEASE_BUILD -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -D__PS2_DEBUG__ -g -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR -INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) +INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) INCLUDES += -I $(PS2GDB)/ee -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines -TARGET = elf/scummvm.elf +CXX_UPDATE_DEP_FLAG = -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP -OBJS := backends/platform/ps2/DmaPipe.o \ - backends/platform/ps2/Gs2dScreen.o \ - backends/platform/ps2/irxboot.o \ - backends/platform/ps2/ps2input.o \ - backends/platform/ps2/ps2pad.o \ - backends/platform/ps2/savefilemgr.o \ - backends/platform/ps2/fileio.o \ - backends/platform/ps2/asyncfio.o \ - backends/platform/ps2/icon.o \ - backends/platform/ps2/cd.o \ - backends/platform/ps2/eecodyvdfs.o \ - backends/platform/ps2/rpckbd.o \ - backends/platform/ps2/systemps2.o \ - backends/platform/ps2/ps2mutex.o \ - backends/platform/ps2/ps2time.o \ - backends/platform/ps2/ps2debug.o +TARGET = elf/scummvm.elf +OBJS := $(srcdir)/backends/platform/ps2/DmaPipe.o \ + $(srcdir)/backends/platform/ps2/Gs2dScreen.o \ + $(srcdir)/backends/platform/ps2/irxboot.o \ + $(srcdir)/backends/platform/ps2/ps2input.o \ + $(srcdir)/backends/platform/ps2/ps2pad.o \ + $(srcdir)/backends/platform/ps2/savefilemgr.o \ + $(srcdir)/backends/platform/ps2/fileio.o \ + $(srcdir)/backends/platform/ps2/asyncfio.o \ + $(srcdir)/backends/platform/ps2/icon.o \ + $(srcdir)/backends/platform/ps2/cd.o \ + $(srcdir)/backends/platform/ps2/eecodyvdfs.o \ + $(srcdir)/backends/platform/ps2/rpckbd.o \ + $(srcdir)/backends/platform/ps2/systemps2.o \ + $(srcdir)/backends/platform/ps2/ps2mutex.o \ + $(srcdir)/backends/platform/ps2/ps2time.o \ + $(srcdir)/backends/platform/ps2/ps2debug.o + MODULE_DIRS += . -BACKEND := ps2 - include $(srcdir)/Makefile.common LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile diff --git a/backends/platform/ps2/Makefile.ps2 b/backends/platform/ps2/Makefile.ps2 index 472ba5ec3a3c..3b807919b0f1 100644 --- a/backends/platform/ps2/Makefile.ps2 +++ b/backends/platform/ps2/Makefile.ps2 @@ -12,28 +12,41 @@ ENABLE_SCUMM_7_8 = $(ENABLED) ENABLE_HE = $(ENABLED) ENABLE_AGI = $(ENABLED) ENABLE_AGOS = $(ENABLED) +ENABLE_AGOS2 = $(ENABLED) ENABLE_CINE = $(ENABLED) ENABLE_CRUISE = $(ENABLED) +ENABLE_DRACI = $(ENABLED) ENABLE_DRASCULA = $(ENABLED) ENABLE_GOB = $(ENABLED) +ENABLE_GROOVIE = $(ENABLED) +# ENABLE_GROOVIE2 = $(ENABLED) +ENABLE_HUGO = $(ENABLED) +ENABLE_IHNM = $(ENABLED) ENABLE_KYRA = $(ENABLED) +# ENABLE_LOL = $(ENABLED) ENABLE_LURE = $(ENABLED) # ENABLE_M4 = $(ENABLED) ENABLE_MADE = $(ENABLED) +ENABLE_MOHAWK = $(ENABLED) ENABLE_PARALLACTION = $(ENABLED) ENABLE_QUEEN = $(ENABLED) ENABLE_SAGA = $(ENABLED) -ENABLE_SAGA2 = $(ENABLED) -ENABLE_IHNM = $(ENABLED) +# ENABLE_SAGA2 = $(ENABLED) +ENABLE_SCI = $(ENABLED) +# ENABLE_SCI32 = $(ENABLED) ENABLE_SKY = $(ENABLED) ENABLE_SWORD1 = $(ENABLED) ENABLE_SWORD2 = $(ENABLED) -# ENABLE_TINSEL = $(ENABLED) +ENABLE_TEENAGENT = $(ENABLED) +ENABLE_TINSEL = $(ENABLED) +ENABLE_TOON = $(ENABLED) ENABLE_TOUCHE = $(ENABLED) +ENABLE_TUCKER = $(ENABLED) + HAVE_GCC3 = true -CC = ee-gcc +CC = ee-gcc CXX = ee-g++ AS = ee-gcc LD = ee-gcc @@ -48,31 +61,32 @@ VPATH = $(srcdir) INCDIR = ../../../ # DEPDIR = .deps -DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -D_EE -D__PLAYSTATION2__ -O2 -Wall -Wno-multichar +DEFINES = -DRELEASE_BUILD -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -G2 -O2 -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR - -INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) +INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) INCLUDES += -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines -TARGET = elf/scummvm.elf +CXX_UPDATE_DEP_FLAG = -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP -OBJS := backends/platform/ps2/DmaPipe.o \ - backends/platform/ps2/Gs2dScreen.o \ - backends/platform/ps2/irxboot.o \ - backends/platform/ps2/ps2input.o \ - backends/platform/ps2/ps2pad.o \ - backends/platform/ps2/savefilemgr.o \ - backends/platform/ps2/fileio.o \ - backends/platform/ps2/asyncfio.o \ - backends/platform/ps2/icon.o \ - backends/platform/ps2/cd.o \ - backends/platform/ps2/eecodyvdfs.o \ - backends/platform/ps2/rpckbd.o \ - backends/platform/ps2/systemps2.o \ - backends/platform/ps2/ps2mutex.o \ - backends/platform/ps2/ps2time.o \ - backends/platform/ps2/ps2debug.o +TARGET = elf/scummvm.elf +OBJS := $(srcdir)/backends/platform/ps2/DmaPipe.o \ + $(srcdir)/backends/platform/ps2/Gs2dScreen.o \ + $(srcdir)/backends/platform/ps2/irxboot.o \ + $(srcdir)/backends/platform/ps2/ps2input.o \ + $(srcdir)/backends/platform/ps2/ps2pad.o \ + $(srcdir)/backends/platform/ps2/savefilemgr.o \ + $(srcdir)/backends/platform/ps2/fileio.o \ + $(srcdir)/backends/platform/ps2/asyncfio.o \ + $(srcdir)/backends/platform/ps2/icon.o \ + $(srcdir)/backends/platform/ps2/cd.o \ + $(srcdir)/backends/platform/ps2/eecodyvdfs.o \ + $(srcdir)/backends/platform/ps2/rpckbd.o \ + $(srcdir)/backends/platform/ps2/systemps2.o \ + $(srcdir)/backends/platform/ps2/ps2mutex.o \ + $(srcdir)/backends/platform/ps2/ps2time.o \ + $(srcdir)/backends/platform/ps2/ps2debug.o + MODULE_DIRS += . BACKEND := ps2 From 0805549e1a8fa2cd17f332b6364d3e15eb832c77 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sun, 22 May 2011 11:13:37 +0200 Subject: [PATCH 167/369] TSAGE: Fix bug "Scene 2100: If you sit down at Quinn's console and then get back up again, his walk animation gets screwed" --- engines/tsage/ringworld_scenes3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 9931d89ad4be..0a64b87a196f 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1401,6 +1401,7 @@ void Scene2100::Hotspot8::doAction(int action) { } void Scene2100::Hotspot10::doAction(int action) { + // Quinn's Console Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; switch (action) { @@ -1415,6 +1416,7 @@ void Scene2100::Hotspot10::doAction(int action) { } else if (_globals->getFlag(13)) { SceneItem::display2(2100, 28); } else { + scene->_sceneMode = 2101; scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL); } break; From 89cc1ce00450e3b0a19b660e7668ed6362e116fa Mon Sep 17 00:00:00 2001 From: strangerke Date: Sun, 22 May 2011 13:14:01 +0200 Subject: [PATCH 168/369] TSAGE: Fix bug "Scene 2320: If you try to activate the flycycle, [...] the game becomes unresponsive.". Also fix an animation bug related to display priorities --- engines/tsage/ringworld_scenes3.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 0a64b87a196f..53b02a752201 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -5164,6 +5164,7 @@ void Scene2320::Action3::signal() { } void Scene2320::Action4::signal() { + // Fly Cycle actions Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -5230,11 +5231,13 @@ void Scene2320::Action4::signal() { setDelay(13); break; case 9: - if (!_globals->getFlag(109)) { - SceneItem::display2(2320, 19); - } else { - _globals->_sceneManager.changeScene(7600); - } + // Quinn sits in the flycycle + scene->_hotspot16.hide(); + _globals->_player.setVisage(2323); + _globals->_player.setPosition(Common::Point(303, 176)); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); break; case 10: if (_globals->getFlag(109)) { @@ -5291,6 +5294,7 @@ void Scene2320::Action4::signal() { break; } case 18: { + scene->_hotspot16.fixPriority(149); Common::Point pt(320, 202); PlayerMover *mover = new PlayerMover(); scene->_hotspot16.addMover(mover, &pt, this); @@ -5735,6 +5739,7 @@ void Scene2320::Hotspot14::doAction(int action) { } void Scene2320::Hotspot15::doAction(int action) { + // Left console (Flycycle console) Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; switch (action) { From 48b4c6c9233b05843a16504064adbe5fd6f4c57c Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Tue, 24 May 2011 20:32:08 +0200 Subject: [PATCH 169/369] SAMSUNGTV: Update port This combines the following Samsung TV port updates from master: 944e0be209f5ab47c3b903f258d2d41b990d80cb dc1d07774fc8ab0554047115d319ef8c0a2c3f63 It also includes the parts touching this backend of: 69b1485a22dc2b8a2cfe0bd10edcbaad0da0cf6e 2fa63ca01586c4e5fda8eb12dca444d47a2375f1 --- backends/base-backend.cpp | 4 -- .../samsungtvsdl/samsungtvsdl-graphics.cpp | 58 +++++++++++++++++++ .../samsungtvsdl/samsungtvsdl-graphics.h | 41 +++++++++++++ backends/module.mk | 1 + backends/platform/samsungtv/main.cpp | 9 ++- backends/platform/samsungtv/samsungtv.cpp | 39 +++++-------- backends/platform/samsungtv/samsungtv.h | 13 ++--- backends/platform/sdl/main.cpp | 1 + backends/platform/sdl/posix/posix.cpp | 3 + backends/saves/posix/posix-saves.cpp | 2 +- 10 files changed, 128 insertions(+), 43 deletions(-) create mode 100644 backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp create mode 100644 backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index f349cc800553..d742261f0c13 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -61,12 +61,8 @@ void BaseBackend::fillScreen(uint32 col) { #if defined(UNIX) -#if defined(SAMSUNGTV) -#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" -#else #define DEFAULT_CONFIG_FILE ".scummvmrc" #endif -#endif #if !defined(UNIX) #define DEFAULT_CONFIG_FILE "scummvm.ini" diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp new file mode 100644 index 000000000000..b929b5fe279c --- /dev/null +++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp @@ -0,0 +1,58 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "backends/platform/samsungtv/samsungtv.h" +#include "backends/events/samsungtvsdl/samsungtvsdl-events.h" +#include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" + +#if defined(SAMSUNGTV) + +SamsungTVSdlGraphicsManager::SamsungTVSdlGraphicsManager(SdlEventSource *sdlEventSource) + : SdlGraphicsManager(sdlEventSource) { +} + +bool SamsungTVSdlGraphicsManager::hasFeature(OSystem::Feature f) { + return + (f == OSystem::kFeatureAspectRatioCorrection) || + (f == OSystem::kFeatureCursorHasPalette); +} + +void SamsungTVSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { + switch (f) { + case OSystem::kFeatureAspectRatioCorrection: + SdlGraphicsManager::setFeatureState(f, enable); + break; + default: + break; + } +} + +bool SamsungTVSdlGraphicsManager::getFeatureState(OSystem::Feature f) { + switch (f) { + case OSystem::kFeatureAspectRatioCorrection: + return SdlGraphicsManager::getFeatureState(f); + default: + return false; + } +} + +#endif diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h new file mode 100644 index 000000000000..dc65c3a69635 --- /dev/null +++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h @@ -0,0 +1,41 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BACKENDS_GRAPHICS_SAMSUNGTV_H +#define BACKENDS_GRAPHICS_SAMSUNGTV_H + +#if defined(SAMSUNGTV) + +#include "backends/graphics/sdl/sdl-graphics.h" + +class SamsungTVSdlGraphicsManager : public SdlGraphicsManager { +public: + SamsungTVSdlGraphicsManager(SdlEventSource *sdlEventSource); + + bool hasFeature(OSystem::Feature f); + void setFeatureState(OSystem::Feature f, bool enable); + bool getFeatureState(OSystem::Feature f); +}; + +#endif + +#endif diff --git a/backends/module.mk b/backends/module.mk index cd0e2a56debe..f669f85ba28e 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -31,6 +31,7 @@ MODULE_OBJS := \ graphics/opengl/opengl-graphics.o \ graphics/openglsdl/openglsdl-graphics.o \ graphics/openpandora/op-graphics.o \ + graphics/samsungtvsdl/samsungtvsdl-graphics.o \ graphics/sdl/sdl-graphics.o \ graphics/symbiansdl/symbiansdl-graphics.o \ graphics/wincesdl/wincesdl-graphics.o \ diff --git a/backends/platform/samsungtv/main.cpp b/backends/platform/samsungtv/main.cpp index 3beb97165f21..4f3291613d49 100644 --- a/backends/platform/samsungtv/main.cpp +++ b/backends/platform/samsungtv/main.cpp @@ -18,11 +18,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ +#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h + #include "backends/platform/samsungtv/samsungtv.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" @@ -39,7 +38,7 @@ extern "C" int Game_Main(char *path, char *) { assert(g_system); // Pre initialize the backend - ((OSystem_SDL_SamsungTV *)g_system)->init(); + ((OSystem_POSIX *)g_system)->init(); #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new SDLPluginProvider()); @@ -49,7 +48,7 @@ extern "C" int Game_Main(char *path, char *) { int res = scummvm_main(0, 0); // Free OSystem - delete g_system; + delete (OSystem_SDL_SamsungTV *)g_system; return res; } diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp index 4d6dca740377..1b978d012123 100644 --- a/backends/platform/samsungtv/samsungtv.cpp +++ b/backends/platform/samsungtv/samsungtv.cpp @@ -18,25 +18,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ #include "backends/platform/samsungtv/samsungtv.h" #include "backends/events/samsungtvsdl/samsungtvsdl-events.h" +#include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" #if defined(SAMSUNGTV) OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : - OSystem_POSIX("/dtv/usb/sda1/.scummvmrc") { -} - -bool OSystem_SDL_SamsungTV::hasFeature(Feature f) { - return - (f == OSystem::kFeatureAspectRatioCorrection) || - (f == OSystem::kFeatureCursorHasPalette); + OSystem_POSIX("/mtd_rwarea/.scummvmrc") { } void OSystem_SDL_SamsungTV::initBackend() { @@ -44,27 +36,22 @@ void OSystem_SDL_SamsungTV::initBackend() { if (_eventSource == 0) _eventSource = new SamsungTVSdlEventSource(); + if (_graphicsManager == 0) + _graphicsManager = new SamsungTVSdlGraphicsManager(_eventSource); + // Call parent implementation of this method - OSystem_SDL::initBackend(); + OSystem_POSIX::initBackend(); } -void OSystem_SDL_SamsungTV::setFeatureState(Feature f, bool enable) { - switch (f) { - case OSystem::kFeatureAspectRatioCorrection: - _graphicsManager->setFeatureState(f, enable); - break; - default: - break; - } +void OSystem_SDL_SamsungTV::quit() { + delete this; } -bool OSystem_SDL_SamsungTV::getFeatureState(Feature f) { - switch (f) { - case OSystem::kFeatureAspectRatioCorrection: - return _graphicsManager->getFeatureState(f); - default: - return false; - } +void OSystem_SDL_SamsungTV::fatalError() { + delete this; + // FIXME + warning("fatal error"); + for (;;) {} } #endif diff --git a/backends/platform/samsungtv/samsungtv.h b/backends/platform/samsungtv/samsungtv.h index bccb6baee9f8..b7a78a96cd16 100644 --- a/backends/platform/samsungtv/samsungtv.h +++ b/backends/platform/samsungtv/samsungtv.h @@ -18,14 +18,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ #ifndef PLATFORM_SDL_SAMSUNGTV_H #define PLATFORM_SDL_SAMSUNGTV_H +#if defined(SAMSUNGTV) + #include "backends/platform/sdl/posix/posix.h" class OSystem_SDL_SamsungTV : public OSystem_POSIX { @@ -33,10 +32,10 @@ class OSystem_SDL_SamsungTV : public OSystem_POSIX { OSystem_SDL_SamsungTV(); virtual void initBackend(); - - virtual bool hasFeature(Feature f); - virtual void setFeatureState(Feature f, bool enable); - virtual bool getFeatureState(Feature f); + virtual void quit(); + virtual void fatalError(); }; #endif + +#endif diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 14cfaaee57b9..871fb2c531be 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -36,6 +36,7 @@ !defined(DINGUX) && \ !defined(CAANOO) && \ !defined(LINUXMOTO) && \ + !defined(SAMSUNGTV) && \ !defined(OPENPANDORA) #include "backends/platform/sdl/sdl.h" diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 71a88265a0e7..e15c09fec7aa 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -81,6 +81,9 @@ Common::WriteStream *OSystem_POSIX::createLogFile() { #else logFile += "/.scummvm"; #endif +#ifdef SAMSUNGTV + logFile = "/mtd_ram"; +#endif struct stat sb; diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index be870abb6ec6..8d2ca363b331 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -48,7 +48,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() { // Register default savepath based on HOME #if defined(SAMSUNGTV) - ConfMan.registerDefault("savepath", "/dtv/usb/sda1/.scummvm"); + ConfMan.registerDefault("savepath", "/mtd_wiselink/scummvm/savegames"); #else Common::String savePath; const char *home = getenv("HOME"); From 725db142bc4b16c930e46e03394611d7a625bbaa Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 24 May 2011 20:58:36 +0200 Subject: [PATCH 170/369] SAMSUNGTV: Fix build on non-SDL platforms --- backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp | 6 ++++-- backends/platform/samsungtv/main.cpp | 6 ++++-- backends/platform/samsungtv/samsungtv.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp index b929b5fe279c..18629d949a27 100644 --- a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp +++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp @@ -20,12 +20,14 @@ * */ +#include "common/scummsys.h" + +#if defined(SAMSUNGTV) + #include "backends/platform/samsungtv/samsungtv.h" #include "backends/events/samsungtvsdl/samsungtvsdl-events.h" #include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" -#if defined(SAMSUNGTV) - SamsungTVSdlGraphicsManager::SamsungTVSdlGraphicsManager(SdlEventSource *sdlEventSource) : SdlGraphicsManager(sdlEventSource) { } diff --git a/backends/platform/samsungtv/main.cpp b/backends/platform/samsungtv/main.cpp index 4f3291613d49..8274bb00a238 100644 --- a/backends/platform/samsungtv/main.cpp +++ b/backends/platform/samsungtv/main.cpp @@ -22,12 +22,14 @@ #define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h +#include "common/scummsys.h" + +#if defined(SAMSUNGTV) + #include "backends/platform/samsungtv/samsungtv.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" -#if defined(SAMSUNGTV) - #include extern "C" int Game_Main(char *path, char *) { diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp index 1b978d012123..ca97565185e3 100644 --- a/backends/platform/samsungtv/samsungtv.cpp +++ b/backends/platform/samsungtv/samsungtv.cpp @@ -20,12 +20,14 @@ * */ +#include "common/scummsys.h" + +#if defined(SAMSUNGTV) + #include "backends/platform/samsungtv/samsungtv.h" #include "backends/events/samsungtvsdl/samsungtvsdl-events.h" #include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" -#if defined(SAMSUNGTV) - OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : OSystem_POSIX("/mtd_rwarea/.scummvmrc") { From 709f0de5c5910e0326ae6e45804526b5c9a9102d Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Tue, 24 May 2011 21:32:24 +0200 Subject: [PATCH 171/369] SAMSUNGTV: Fix build --- backends/platform/samsungtv/samsungtv.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp index ca97565185e3..9718eed1fea4 100644 --- a/backends/platform/samsungtv/samsungtv.cpp +++ b/backends/platform/samsungtv/samsungtv.cpp @@ -27,6 +27,7 @@ #include "backends/platform/samsungtv/samsungtv.h" #include "backends/events/samsungtvsdl/samsungtvsdl-events.h" #include "backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h" +#include "common/textconsole.h" OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : From b1587a9082ab538e53ec6e5ebbdb213bbd6d7c35 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 24 May 2011 22:28:46 +0100 Subject: [PATCH 172/369] I18N: rebuild translations.dat --- gui/themes/translations.dat | Bin 201288 -> 205556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index f025a0533759f44164874b154efde4e9150e3695..d696cc0d7503fe0d3b953f6d07520dec34c27765 100644 GIT binary patch delta 6431 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 I9=JsN{~h{c>i_@% delta 2381 zcmZ8ieQ;FO6@T|!viVL(LQL2IxqL%O_$*&(3ql~^7@=*{TIo2IxR4-hG=wk}B(1bo z9H0_D4#)GwaBPQ{-F?a1xBK3{eUA__lVMv1A1HR{eM=&y`_JzD z&N;vHyXXGy*;}7wTt1!ghPzY8od zjjXY*-s`E^;_Em*CBJG#W$EMfp4#=Ede-Qv-|q1~=ke}t=@nagN!KZ|7GL>2EW)v` zK?T0@8thHU5nPLy+I9`s?txCx{W`o%Tr-3bzSw`nNqb=(!SFuVDIVMpy(HO+nUbda zvFQ!Chk*ky4qeSqOrH@-@Jurl;Gt$H#Aq`tTjLSZ+x6&77PZWQGJ$_K3c3G^SmC&- z8?53n_ITZP?^Xw|5vE_1nH7}6dTfC8NCCs@QOp6R@E=U+VOOP4*pCMfLJi(N1oE`3 z4$jC_CoY#Uhv7FudRtI-0LcN8H`i^i_iV+bN4S>tN8kdHu^8cVEIkT)P&o>_apy4} zdjA;A$AM#T9y{NJa{R?{*ev!RhbaVC{}B#h@(K79BPU=yX8j2ch$SasG{L7&!BhCj zDaglbr{ET@ehVg%WZZQQ3SE7stSNE4{1)`$?bA@UHdU0ON=z~bxJ2R>ays>1L(-fi zM`}Vkhtm_siSZbp(x7yKj2TKFnnW2x^=(*!RqsGteBxc01P?6~Ms?__)WbV4H7xlR z$+Qd$ulxnPnM*jYp-1_3aRO|855{2cd+={G--jQIPyZE`0)FxVY{^_Fq<88uQ;%zk zT!zn`ffsRo3si|(3ltEX=!1{2t_^nJy*57nSKFZ)N1lb}@x)n}ia8&`0&M({mvo4* z2?JwEzSwjQ{!GM2&O^ssB4O$cSWZ@9X?dnF`aCe(~^4c$MHIx8Tjf9|=j01jjE+gi-&HRjZE|`)xeA zA7&66|G6J#;+(=2Pp){Njwe~MsC`}2oze;+&xw9lz7i6xFQJ^kFMT-UHeAY8 zOquzWkf|(nDt;zR)o{ce*x*j`X-ba+trPNBu3E;rEDTbdIu(xnb>~^=82Df1*wGi@rkct{lgiebk$a4iL*MSULoVWY}&lqKiH;D$Q(qX zMm&;`|H8MBAHVtACLxg zZouZd5XE=Dfdgp^K9h`~UotdZT=rkENEQ>j?C`*KS<~YD-o)AWU=ty04Lg>*X+1+%rAtT3w%HH&14;h5;F}ulvplb2zd$E zF-8ZLkDyai{j$+J%b5jk9YM>dNc>Ltc)8sinl7Q}0ykNA!iky`mI8XP+p%I~1f7>5 zJ-B`ei;`$L)+f;wu5`YqdL+Dhk|--!m^OQjzEVmxVdIc_=)nRqsh zelu>I*u_-_cnzPH#Cw=hx5E&$`L+z8lujSb$?eduTPhc(+8TdNN(g6U(8;6_f09A- z(g)2zm@qm4B>A1W;OiOm67h>a&7^50J0Vfgq=>>NLuTRrEII-AWzm7mqQM2@^zX#q zX4AJxr}({*^c_MLV^^tY$#g55^v)LN-&>}v#!QPvbwBroW?z?iBRu&Kt(@B6Q@Z%Nw0KIy8hmi3 zp+u}(JloX!xL+cC>X=tRr-?r-pgDvvTvJHL6qvT^oTE|5Yu8zutQj^ZZT|>=T}c1X zWa@@0X#<>t=`ou<Cl6^p?3=c?j22=Gb(+Gv)*p8h!n-?Zd!#0-Lwf87SXXTm(RH% zaa|E*1S`kV-7eSXI=d!ga4bDXp2U6Q=yW_gj?Nu9(x*6sQ#8#^Y)mXIrn{PQ`M)4{ z$TG$U#NU1Jn(b)(Kp4cA56904?)&-WtVfgjoagha4Qyl0OPjYlf6k;u7&8>t Date: Tue, 24 May 2011 22:32:03 +0100 Subject: [PATCH 173/369] I18N: Update translations.dat --- gui/themes/translations.dat | Bin 201288 -> 205560 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index f025a0533759f44164874b154efde4e9150e3695..ab037eee50db5b458954398c6ddb93b13f2602f8 100644 GIT binary patch delta 6322 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 delta 2245 zcmZuyeQ;FO6~Fh~Wb>VnO+vy(l8byq2TcfAE3ri&kT}y=n4tqQ&R9n$Kq(dL2ec?q zhZe;TBq$yuqt=qzQaeC4!DkCK#Fhc4)9K6ZzU<4}z3;use^Qz0bl6 zxuwK+2RC{~aLqpGS8ASvozypZ_`!a{To!m^5XQqXH!_1tojV@*WI=vaUy$rKx2=QgugqL3d z?OVlt(v2Hj58GN3_uQW*1w9eX15^*l*|K%}qwS9ovX@NjiJ1dxY)qIMk85HaAAA+g zPz`4ze1wg!!9I+?27B;lolu3xJK-Dn&rUdnXJ3bAeBdx_Q9d~g^C-5x0k2@eoA4L3 z--KD{e+xR41;2zD6z_if$OTDkxCa2L>Zm^udYaQqmw z6x~M(`prbrObK0U!cE8F$GG7HtWgptpps%;5I(@idf-W9y>bZ8^}<6~eiD9&zd8wZ zSn(d*jyv9yA%9k2GcK!!3T4mx@LQ_fa|-$vQWcBFVL5HZ)#LDYU-RRSZn?Du=cZtB ziOPk>EjMDs#z!@w;*V1BT^hjCDX5}RWiSPI1GTVr0-7o-&zZK+hq%kT-I)Au;D0n@ zu8mtKpt`uEJ7yYANKNWo=ogjF3D`^Vo=fn0)wfBuS5PWImXPufHNzQ|!66sB_QQPY zqPiaz;Gxf8c4O6wwJWZ3kxov+axVze3vD4~p7rZw^&w^SGiavpKoA@L4d?vc>_hrc zQoqZKSV!sv=1#%}9P5CBl8TkB%lLp6<xzJfn#JgQ=U zHfyh_SoKKz!>w)HFhxSMLuN>oyQeJnv5gd!9F{8apO2-6dBo(FOzsNo&1Ic=`Q7@} z4a9YM?8W>%;yomk37me1PdJNQ99TMjuvIsJX z3)wjuQq~r+e43Nyt_x*jF`G`ys{2esje1Y0f%gx~j*~jRbQGpzR|(rk`<41>>>WCD zalfUFNPc6&;rcRGOK-uSl(C7D+J4Iwt_X9> zHZ>!u>?mhNP&@a0NRJq9LLRiFW+ajhx6F{-7vWyeBn#}C&f4l859$N*NIKFb?p%9< zNn4LQm!x;n9F=<%mu#`JlHH^%tz@P2HhxY`T%WO2NX{wl?Sm_~BO=LOc^3&xH9H~i*?Y50+jo=PJ~Lw4<{%+>UP^^_HxzbYBb7* Date: Tue, 24 May 2011 22:36:49 +0100 Subject: [PATCH 174/369] RELEASE: Specified release date for 1.3.0 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 26085c089e33..d3edf6d9216e 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,7 @@ For a more comprehensive changelog of the latest experimental code, see: SDL ports: - Added support for OpenGL (GSoC Task). -1.3.0 (????-??-??) +1.3.0 (2011-05-28) New Games: - Added support for Backyard Baseball. - Added support for Backyard Baseball 2001. From 1c2e531ebd5a6e562d4d37932030f413281cb474 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 24 May 2011 22:37:46 +0100 Subject: [PATCH 175/369] RELEASE: Specified release date for 1.3.0 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index a446b993982b..2c8f85a57b32 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,7 @@ For a more comprehensive changelog of the latest experimental code, see: https://github.com/scummvm/scummvm/commits/ -1.3.0 (????-??-??) +1.3.0 (2011-05-28) New Games: - Added support for Backyard Baseball. - Added support for Backyard Baseball 2001. From 0a03a620e12b97d02899f31376191014a5205ddb Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Wed, 25 May 2011 05:53:28 +0800 Subject: [PATCH 176/369] CREDITS: Temporarily retire Jubanka, add CeRiAl --- AUTHORS | 3 ++- COPYRIGHT | 1 + devtools/credits.pl | 3 ++- gui/credits.h | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index d2991127d325..89ad7dc1b224 100644 --- a/AUTHORS +++ b/AUTHORS @@ -222,7 +222,8 @@ ScummVM Team PocketPC / WinCE: Nicolas Bacca - (retired) - Kostas Nakos + Ismail Khatib + Kostas Nakos - (retired) PlayStation 2: Robert Goeffringmann - (retired) diff --git a/COPYRIGHT b/COPYRIGHT index fca190596fcb..c4d592ff9feb 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -44,6 +44,7 @@ Willem Jan Palenstijn Florian Kagerer Filippos Karapetis Andreas Karlsson +Ismail Khatib Oliver Kiehl Martin Kiewitz Pawel Kolodziejski diff --git a/devtools/credits.pl b/devtools/credits.pl index 0f07641aaee6..b0f40cbe6e6b 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -712,7 +712,8 @@ sub add_paragraph { begin_section("PocketPC / WinCE"); add_person("Nicolas Bacca", "arisme", "(retired)"); - add_person("Kostas Nakos", "Jubanka", ""); + add_person("Ismail Khatib", "CeRiAl", ""); + add_person("Kostas Nakos", "Jubanka", "(retired)"); end_section(); begin_section("PlayStation 2"); diff --git a/gui/credits.h b/gui/credits.h index a98fddd33933..1b13b31829d1 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -249,7 +249,9 @@ static const char *credits[] = { "C1""PocketPC / WinCE", "C0""Nicolas Bacca", "C2""(retired)", +"C0""Ismail Khatib", "C0""Kostas Nakos", +"C2""(retired)", "", "C1""PlayStation 2", "C0""Robert G\366ffringmann", From cd63f261f9b4018aceb5409f50f18a06b6a30f99 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 25 May 2011 00:02:47 +0200 Subject: [PATCH 177/369] CREDITS: Fix sort order --- COPYRIGHT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/COPYRIGHT b/COPYRIGHT index c4d592ff9feb..f240725e1c90 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -40,7 +40,6 @@ Travis Howell Janne Huttunen Felix Jakschitsch Jeroen Janssen -Willem Jan Palenstijn Florian Kagerer Filippos Karapetis Andreas Karlsson @@ -59,6 +58,7 @@ Gregory Montoir Kostas Nakos Mikesch Nepomuk Nicolas Noble +Willem Jan Palenstijn Lars Persson Joost Peters Tim Phillips From dcfa8fd0483d05cd4bfd4cab0fe7101db5f6844f Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Wed, 25 May 2011 05:53:28 +0800 Subject: [PATCH 178/369] CREDITS: Temporarily retire Jubanka, add CeRiAl --- AUTHORS | 3 ++- COPYRIGHT | 1 + devtools/credits.pl | 3 ++- gui/credits.h | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index ca6342d83601..ea5311bdf184 100644 --- a/AUTHORS +++ b/AUTHORS @@ -222,7 +222,8 @@ ScummVM Team PocketPC / WinCE: Nicolas Bacca - (retired) - Kostas Nakos + Ismail Khatib + Kostas Nakos - (retired) PlayStation 2: Robert Goeffringmann - (retired) diff --git a/COPYRIGHT b/COPYRIGHT index fca190596fcb..c4d592ff9feb 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -44,6 +44,7 @@ Willem Jan Palenstijn Florian Kagerer Filippos Karapetis Andreas Karlsson +Ismail Khatib Oliver Kiehl Martin Kiewitz Pawel Kolodziejski diff --git a/devtools/credits.pl b/devtools/credits.pl index c45f16eec9c8..02e4b6f702e1 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -747,7 +747,8 @@ sub add_paragraph { begin_section("PocketPC / WinCE"); add_person("Nicolas Bacca", "arisme", "(retired)"); - add_person("Kostas Nakos", "Jubanka", ""); + add_person("Ismail Khatib", "CeRiAl", ""); + add_person("Kostas Nakos", "Jubanka", "(retired)"); end_section(); begin_section("PlayStation 2"); diff --git a/gui/credits.h b/gui/credits.h index 7ad480032e4e..df7f1e420ef8 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -246,7 +246,9 @@ static const char *credits[] = { "C1""PocketPC / WinCE", "C0""Nicolas Bacca", "C2""(retired)", +"C0""Ismail Khatib", "C0""Kostas Nakos", +"C2""(retired)", "", "C1""PlayStation 2", "C0""Robert G\366ffringmann", From efcf278bdf8355448534b72ec52fe48a1e0fa636 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 24 May 2011 18:21:29 -0400 Subject: [PATCH 179/369] GRAPHICS: Optimize the convertYUV420ToRGB function a bit more A template is used to avoid a bytesPerPixel check on every pixel and less deferences are done --- graphics/yuv_to_rgb.cpp | 63 ++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/graphics/yuv_to_rgb.cpp b/graphics/yuv_to_rgb.cpp index 831736cd7535..037ea9a007cf 100644 --- a/graphics/yuv_to_rgb.cpp +++ b/graphics/yuv_to_rgb.cpp @@ -196,52 +196,63 @@ DECLARE_SINGLETON(Graphics::YUVToRGBManager); namespace Graphics { #define PUT_PIXEL(s, d) \ - L = &lookup->_rgbToPix[(s)]; \ - if (dst->format.bytesPerPixel == 2) \ - *((uint16 *)(d)) = (L[cr_r] | L[crb_g] | L[cb_b]); \ - else \ - *((uint32 *)(d)) = (L[cr_r] | L[crb_g] | L[cb_b]) - -void convertYUV420ToRGB(Graphics::Surface *dst, const byte *ySrc, const byte *uSrc, const byte *vSrc, int yWidth, int yHeight, int yPitch, int uvPitch) { - // Sanity checks - assert(dst && dst->pixels); - assert(dst->format.bytesPerPixel == 2 || dst->format.bytesPerPixel == 4); - assert(ySrc && uSrc && vSrc); - assert((yWidth & 1) == 0); - assert((yHeight & 1) == 0); - - const YUVToRGBLookup *lookup = YUVToRGBMan.getLookup(dst->format); - - byte *dstPtr = (byte *)dst->pixels; + L = &rgbToPix[(s)]; \ + *((PixelInt *)(d)) = (L[cr_r] | L[crb_g] | L[cb_b]) +template +void convertYUV420ToRGB(byte *dstPtr, int dstPitch, const YUVToRGBLookup *lookup, const byte *ySrc, const byte *uSrc, const byte *vSrc, int yWidth, int yHeight, int yPitch, int uvPitch) { int halfHeight = yHeight >> 1; int halfWidth = yWidth >> 1; + // Keep the tables in pointers here to avoid a dereference on each pixel + const int16 *Cr_r_tab = lookup->_colorTab; + const int16 *Cr_g_tab = Cr_r_tab + 256; + const int16 *Cb_g_tab = Cr_g_tab + 256; + const int16 *Cb_b_tab = Cb_g_tab + 256; + const uint32 *rgbToPix = lookup->_rgbToPix; + for (int h = 0; h < halfHeight; h++) { for (int w = 0; w < halfWidth; w++) { - register uint32 *L; + register const uint32 *L; - int16 cr_r = lookup->_colorTab[*vSrc + 0 * 256]; - int16 crb_g = lookup->_colorTab[*vSrc + 1 * 256] + lookup->_colorTab[*uSrc + 2 * 256]; - int16 cb_b = lookup->_colorTab[*uSrc + 3 * 256]; + int16 cr_r = Cr_r_tab[*vSrc]; + int16 crb_g = Cr_g_tab[*vSrc] + Cb_g_tab[*uSrc]; + int16 cb_b = Cb_b_tab[*uSrc]; ++uSrc; ++vSrc; PUT_PIXEL(*ySrc, dstPtr); - PUT_PIXEL(*(ySrc + yPitch), dstPtr + dst->pitch); + PUT_PIXEL(*(ySrc + yPitch), dstPtr + dstPitch); ySrc++; - dstPtr += dst->format.bytesPerPixel; + dstPtr += sizeof(PixelInt); PUT_PIXEL(*ySrc, dstPtr); - PUT_PIXEL(*(ySrc + yPitch), dstPtr + dst->pitch); + PUT_PIXEL(*(ySrc + yPitch), dstPtr + dstPitch); ySrc++; - dstPtr += dst->format.bytesPerPixel; + dstPtr += sizeof(PixelInt); } - dstPtr += dst->pitch; + dstPtr += dstPitch; ySrc += (yPitch << 1) - yWidth; uSrc += uvPitch - halfWidth; vSrc += uvPitch - halfWidth; } } +void convertYUV420ToRGB(Graphics::Surface *dst, const byte *ySrc, const byte *uSrc, const byte *vSrc, int yWidth, int yHeight, int yPitch, int uvPitch) { + // Sanity checks + assert(dst && dst->pixels); + assert(dst->format.bytesPerPixel == 2 || dst->format.bytesPerPixel == 4); + assert(ySrc && uSrc && vSrc); + assert((yWidth & 1) == 0); + assert((yHeight & 1) == 0); + + const YUVToRGBLookup *lookup = YUVToRGBMan.getLookup(dst->format); + + // Use a templated function to avoid an if check on every pixel + if (dst->format.bytesPerPixel == 2) + convertYUV420ToRGB((byte *)dst->pixels, dst->pitch, lookup, ySrc, uSrc, vSrc, yWidth, yHeight, yPitch, uvPitch); + else + convertYUV420ToRGB((byte *)dst->pixels, dst->pitch, lookup, ySrc, uSrc, vSrc, yWidth, yHeight, yPitch, uvPitch); +} + } // End of namespace Graphics From 91e304e35fe641f46aaf5dce874354627256c1a7 Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Wed, 25 May 2011 06:49:59 +0800 Subject: [PATCH 180/369] WINCE: Update port specific readme --- backends/platform/wince/README-WinCE.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index 69abd66e697d..6d3c66fda8f2 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -1,15 +1,25 @@ ScummVM Windows CE FAQ -Last updated: $Date$ -Release version: 1.1.0 +Last updated: 2011-05-25 +Release version: 1.3.0 ------------------------------------------------------------------------ New in this version ------------------- -1.1.1 +1.3.0: +This is the first official Windows CE release since 1.1.1, there are no other +port specific changes. + +1.2.1: +(Note: No official 1.2.1 release) + +1.2.0: +(Note: No official 1.2.0 release) + +1.1.1: Fix to the Normal2xAspect scaler that was causing crashes. -1.1.0 +1.1.0: The TeenAgent engine is now included, but there are no other port specific changes since 1.0.0. From 23958893722f4a99da89465dc53b84921fe2c727 Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Wed, 25 May 2011 06:49:59 +0800 Subject: [PATCH 181/369] WINCE: Update port specific readme --- backends/platform/wince/README-WinCE.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index 69abd66e697d..6d3c66fda8f2 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -1,15 +1,25 @@ ScummVM Windows CE FAQ -Last updated: $Date$ -Release version: 1.1.0 +Last updated: 2011-05-25 +Release version: 1.3.0 ------------------------------------------------------------------------ New in this version ------------------- -1.1.1 +1.3.0: +This is the first official Windows CE release since 1.1.1, there are no other +port specific changes. + +1.2.1: +(Note: No official 1.2.1 release) + +1.2.0: +(Note: No official 1.2.0 release) + +1.1.1: Fix to the Normal2xAspect scaler that was causing crashes. -1.1.0 +1.1.0: The TeenAgent engine is now included, but there are no other port specific changes since 1.0.0. From 0aa6aca4201df105276455d550d00495fdaa067b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 10:46:58 +0200 Subject: [PATCH 182/369] SCUMM: Switch some code to use String::format --- engines/scumm/detection.cpp | 63 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index bba26961c7bf..aecd13db5ad2 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -69,26 +69,26 @@ static const MD5Table *findInMD5Table(const char *md5) { Common::String ScummEngine::generateFilename(const int room) const { const int diskNumber = (room > 0) ? _res->_types[rtRoom][room]._roomno : 0; - char buf[128]; + Common::String result; if (_game.version == 4) { if (room == 0 || room >= 900) { - snprintf(buf, sizeof(buf), "%03d.lfl", room); + result = Common::String::format("%03d.lfl", room); } else { - snprintf(buf, sizeof(buf), "disk%02d.lec", diskNumber); + result = Common::String::format("disk%02d.lec", diskNumber); } } else { switch (_filenamePattern.genMethod) { case kGenDiskNum: - snprintf(buf, sizeof(buf), _filenamePattern.pattern, diskNumber); + result = Common::String::format(_filenamePattern.pattern, diskNumber); break; case kGenRoomNum: - snprintf(buf, sizeof(buf), _filenamePattern.pattern, room); + result = Common::String::format(_filenamePattern.pattern, room); break; case kGenUnchanged: - strncpy(buf, _filenamePattern.pattern, sizeof(buf)); + result = _filenamePattern.pattern; break; default: @@ -96,11 +96,11 @@ Common::String ScummEngine::generateFilename(const int room) const { } } - return buf; + return result; } Common::String ScummEngine_v60he::generateFilename(const int room) const { - char buf[128]; + Common::String result; char id = 0; switch (_filenamePattern.genMethod) { @@ -115,16 +115,16 @@ Common::String ScummEngine_v60he::generateFilename(const int room) const { } if (_filenamePattern.genMethod == kGenHEPC) { - snprintf(buf, sizeof(buf), "%s.he%c", _filenamePattern.pattern, id); + result = Common::String::format("%s.he%c", _filenamePattern.pattern, id); } else { if (id == '3') { // special case for cursors // For mac they're stored in game binary - strncpy(buf, _filenamePattern.pattern, sizeof(buf)); + result = _filenamePattern.pattern; } else { if (_filenamePattern.genMethod == kGenHEMac) - snprintf(buf, sizeof(buf), "%s (%c)", _filenamePattern.pattern, id); + result = Common::String::format("%s (%c)", _filenamePattern.pattern, id); else - snprintf(buf, sizeof(buf), "%s %c", _filenamePattern.pattern, id); + result = Common::String::format("%s %c", _filenamePattern.pattern, id); } } @@ -135,11 +135,11 @@ Common::String ScummEngine_v60he::generateFilename(const int room) const { return ScummEngine::generateFilename(room); } - return buf; + return result; } Common::String ScummEngine_v70he::generateFilename(const int room) const { - char buf[128]; + Common::String result; char id = 0; switch (_filenamePattern.genMethod) { @@ -156,19 +156,19 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const { id = 'b'; // Special cases for Blue's games, which share common (b) files if (_game.id == GID_BIRTHDAY && !(_game.features & GF_DEMO)) - strcpy(buf, "Blue'sBirthday.(b)"); + result = "Blue'sBirthday.(b)"; else if (_game.id == GID_TREASUREHUNT) - strcpy(buf, "Blue'sTreasureHunt.(b)"); + result = "Blue'sTreasureHunt.(b)"; else - snprintf(buf, sizeof(buf), "%s.(b)", _filenamePattern.pattern); + result = Common::String::format("%s.(b)", _filenamePattern.pattern); break; case 1: id = 'a'; - snprintf(buf, sizeof(buf), "%s.(a)", _filenamePattern.pattern); + result = Common::String::format("%s.(a)", _filenamePattern.pattern); break; default: id = '0'; - snprintf(buf, sizeof(buf), "%s.he0", _filenamePattern.pattern); + result = Common::String::format("%s.he0", _filenamePattern.pattern); } } else if (room < 0) { id = '0' - room; @@ -179,16 +179,16 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const { if (_filenamePattern.genMethod == kGenHEPC) { // For HE >= 98, we already called snprintf above. if (_game.heversion < 98 || room < 0) - snprintf(buf, sizeof(buf), "%s.he%c", _filenamePattern.pattern, id); + result = Common::String::format("%s.he%c", _filenamePattern.pattern, id); } else { if (id == '3') { // special case for cursors // For mac they're stored in game binary - strncpy(buf, _filenamePattern.pattern, sizeof(buf)); + result = _filenamePattern.pattern; } else { if (_filenamePattern.genMethod == kGenHEMac) - snprintf(buf, sizeof(buf), "%s (%c)", _filenamePattern.pattern, id); + result = Common::String::format("%s (%c)", _filenamePattern.pattern, id); else - snprintf(buf, sizeof(buf), "%s %c", _filenamePattern.pattern, id); + result = Common::String::format("%s %c", _filenamePattern.pattern, id); } } @@ -199,40 +199,39 @@ Common::String ScummEngine_v70he::generateFilename(const int room) const { return ScummEngine_v60he::generateFilename(room); } - return buf; + return result; } static Common::String generateFilenameForDetection(const char *pattern, FilenameGenMethod genMethod) { - char buf[128]; + Common::String result; switch (genMethod) { case kGenDiskNum: case kGenRoomNum: - snprintf(buf, sizeof(buf), pattern, 0); + result = Common::String::format(pattern, 0); break; case kGenHEPC: - snprintf(buf, sizeof(buf), "%s.he0", pattern); + result = Common::String::format("%s.he0", pattern); break; case kGenHEMac: - snprintf(buf, sizeof(buf), "%s (0)", pattern); + result = Common::String::format("%s (0)", pattern); break; case kGenHEMacNoParens: - snprintf(buf, sizeof(buf), "%s 0", pattern); + result = Common::String::format("%s 0", pattern); break; case kGenUnchanged: - strncpy(buf, pattern, sizeof(buf)); + result = pattern; break; default: error("generateFilenameForDetection: Unsupported genMethod"); } - buf[sizeof(buf) - 1] = 0; - return buf; + return result; } struct DetectorDesc { From fdf12c5c09e1c644001079a9dce5335e9ae2707d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 11:48:50 +0200 Subject: [PATCH 183/369] SWORD25: Remove more unused loadlib code + use of fopen The functions loader_C and loader_Croot provably did not do anything besides returning an error, so removing them was safe. For loader_Lua, this was using luaL_loadfile. But that in turn now uses Sword25FileProxy, which only supports loading config.lua, and config.lua is not used via the loadlib mechanism. Therefore, I deemed it safe to also remove this third loader. This leaves loader_preload as only remaining loader. It is probably unused, too, but I did not both to investigate further, as I already achieved my primary goal (getting rid of fopen/fclose use). All other removed functions were unused due to the removal of the first three loader_* functions. --- engines/sword25/util/lua/loadlib.cpp | 158 +++------------------------ 1 file changed, 18 insertions(+), 140 deletions(-) diff --git a/engines/sword25/util/lua/loadlib.cpp b/engines/sword25/util/lua/loadlib.cpp index 2fa831ac2a5a..9795a575f5c0 100644 --- a/engines/sword25/util/lua/loadlib.cpp +++ b/engines/sword25/util/lua/loadlib.cpp @@ -8,19 +8,6 @@ ** implementation for Windows, and a stub for other systems. */ -// FIXME: Avoid using these APIs. -// Actually, this could be achieved by removing 80% of the remaining -// code in this file. Most of it is an elaborate way of expressing -// something like "return ERROR;" anyway, as we don't support loading -// dynamic libs -#define FORBIDDEN_SYMBOL_EXCEPTION_FILE -#define FORBIDDEN_SYMBOL_EXCEPTION_fopen -#define FORBIDDEN_SYMBOL_EXCEPTION_fclose - - -#include -#include - #define loadlib_c #define LUA_LIB @@ -44,11 +31,6 @@ #define LIB_FAIL "open" -/* error codes for ll_loadfunc */ -#define ERRLIB 1 -#define ERRFUNC 2 - - /* ** {====================================================== ** Fallback for other systems @@ -97,29 +79,28 @@ static int gctm (lua_State *L) { } -static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { - void **reg = ll_register(L, path); - if (*reg == NULL) { - lua_pushliteral(L, DLMSG); // loading not supported, just push an error msg - return ERRLIB; /* unable to load library */ - } else { - return ERRFUNC; /* unable to find function */ - } -} +/* error codes for ll_loadfunc */ +#define ERRLIB 1 +#define ERRFUNC 2 static int ll_loadlib (lua_State *L) { const char *path = luaL_checkstring(L, 1); - const char *init = luaL_checkstring(L, 2); - int stat = ll_loadfunc(L, path, init); - if (stat == 0) /* no errors? */ - return 1; /* return the loaded function */ - else { /* error; error message is on stack top */ - lua_pushnil(L); - lua_insert(L, -2); - lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); - return 3; /* return nil, error message, and where */ +// const char *init = luaL_checkstring(L, 2); + int stat; + void **reg = ll_register(L, path); + if (*reg == NULL) { + stat = ERRLIB; /* unable to load library */ + } else { + stat = ERRFUNC; /* unable to find function */ } + lua_pushliteral(L, DLMSG); + + /* error; error message is on stack top */ + lua_pushnil(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return nil, error message, and where */ } @@ -131,109 +112,6 @@ static int ll_loadlib (lua_State *L) { */ -static int readable (const char *filename) { - FILE *f = fopen(filename, "r"); /* try to open file */ - if (f == NULL) return 0; /* open failed */ - fclose(f); - return 1; -} - - -static const char *pushnexttemplate (lua_State *L, const char *path) { - const char *l; - while (*path == *LUA_PATHSEP) path++; /* skip separators */ - if (*path == '\0') return NULL; /* no more templates */ - l = strchr(path, *LUA_PATHSEP); /* find next separator */ - if (l == NULL) l = path + strlen(path); - lua_pushlstring(L, path, l - path); /* template */ - return l; -} - - -static const char *findfile (lua_State *L, const char *name, - const char *pname) { - const char *path; - name = luaL_gsub(L, name, ".", LUA_DIRSEP); - lua_getfield(L, LUA_ENVIRONINDEX, pname); - path = lua_tostring(L, -1); - if (path == NULL) - luaL_error(L, LUA_QL("package.%s") " must be a string", pname); - lua_pushliteral(L, ""); /* error accumulator */ - while ((path = pushnexttemplate(L, path)) != NULL) { - const char *filename; - filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); - lua_remove(L, -2); /* remove path template */ - if (readable(filename)) /* does file exist and is readable? */ - return filename; /* return that file name */ - lua_pushfstring(L, "\n\tno file " LUA_QS, filename); - lua_remove(L, -2); /* remove file name */ - lua_concat(L, 2); /* add entry to possible error message */ - } - return NULL; /* not found */ -} - - -static void loaderror (lua_State *L, const char *filename) { - luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", - lua_tostring(L, 1), filename, lua_tostring(L, -1)); -} - - -static int loader_Lua (lua_State *L) { - const char *filename; - const char *name = luaL_checkstring(L, 1); - filename = findfile(L, name, "path"); - if (filename == NULL) return 1; /* library not found in this path */ - if (luaL_loadfile(L, filename) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - - -static const char *mkfuncname (lua_State *L, const char *modname) { - const char *funcname; - const char *mark = strchr(modname, *LUA_IGMARK); - if (mark) modname = mark + 1; - funcname = luaL_gsub(L, modname, ".", LUA_OFSEP); - funcname = lua_pushfstring(L, POF"%s", funcname); - lua_remove(L, -2); /* remove 'gsub' result */ - return funcname; -} - - -static int loader_C (lua_State *L) { - const char *funcname; - const char *name = luaL_checkstring(L, 1); - const char *filename = findfile(L, name, "cpath"); - if (filename == NULL) return 1; /* library not found in this path */ - funcname = mkfuncname(L, name); - if (ll_loadfunc(L, filename, funcname) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - - -static int loader_Croot (lua_State *L) { - const char *funcname; - const char *filename; - const char *name = luaL_checkstring(L, 1); - const char *p = strchr(name, '.'); - int stat; - if (p == NULL) return 0; /* is root */ - lua_pushlstring(L, name, p - name); - filename = findfile(L, lua_tostring(L, -1), "cpath"); - if (filename == NULL) return 1; /* root not found */ - funcname = mkfuncname(L, name); - if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { - if (stat != ERRFUNC) loaderror(L, filename); /* real error */ - lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, - name, filename); - return 1; /* function not found */ - } - return 1; -} - - static int loader_preload (lua_State *L) { const char *name = luaL_checkstring(L, 1); lua_getfield(L, LUA_ENVIRONINDEX, "preload"); @@ -409,7 +287,7 @@ static const luaL_Reg ll_funcs[] = { static const lua_CFunction loaders[] = - {loader_preload, loader_Lua, loader_C, loader_Croot, NULL}; + {loader_preload, NULL}; LUALIB_API int luaopen_package (lua_State *L) { From 1b248cd9362e7201b209eb0bc2a099c4b7cbca27 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 May 2011 16:30:10 +0200 Subject: [PATCH 184/369] BUILD: Reorder parts of configure --- configure | 392 +++++++++++++++++++++++++++--------------------------- 1 file changed, 196 insertions(+), 196 deletions(-) diff --git a/configure b/configure index c4243e17842c..e8390385bc51 100755 --- a/configure +++ b/configure @@ -1431,16 +1431,57 @@ if test "$_global_constructors" = yes; then fi echo $_global_constructors +# +# Do CXXFLAGS now that we know the compiler version +# +if test "$have_gcc" = yes ; then + if test "$_cxx_major" -ge "3" ; then + case $_host_os in + # newlib-based system include files suppress non-C89 function + # declarations under __STRICT_ANSI__ + amigaos* | android | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | wii | wince ) + CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" + ;; + *) + CXXFLAGS="$CXXFLAGS -ansi -W -Wno-unused-parameter" + ;; + esac + add_line_to_config_mk 'HAVE_GCC3 = 1' + add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' + fi; + + if test "$_cxx_major" -eq 4 && test "$_cxx_minor" -ge 3 || \ + test "$_cxx_major" -gt 4 ; then + CXXFLAGS="$CXXFLAGS -Wno-empty-body" + else + CXXFLAGS="$CXXFLAGS -Wconversion" + fi; +elif test "$have_icc" = yes ; then + add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' +fi; + +# Some platforms use certain GNU extensions in header files +case $_host_os in +android | gamecube | psp | wii) + ;; +*) + # ICC does not support pedantic + if test "$have_icc" = no ; then + CXXFLAGS="$CXXFLAGS -pedantic" + fi + ;; +esac + # # Check for endianness # echo_n "Checking endianness... " cat > tmp_endianness_check.cpp << EOF -short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +unsigned short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +unsigned short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; } -short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +unsigned short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +unsigned short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; } int main() { _ascii (); _ebcdic (); return 0; } EOF @@ -2116,6 +2157,157 @@ EOF echo "$_need_memalign" fi +# +# Backend related stuff +# +case $_backend in + android) + # ssp at this point so the cxxtests link + if test "$_debug_build" = yes; then + CXXFLAGS="$CXXFLAGS -fstack-protector" + else + CXXFLAGS="$CXXFLAGS -fno-stack-protector" + fi + CXXFLAGS="$CXXFLAGS -Wa,--noexecstack" + LDFLAGS="$LDFLAGS -Wl,-z,noexecstack" + + static_libs='' + system_libs='' + for lib in $LIBS; do + case $lib in + -lz|-lm) + system_libs="$system_libs $lib" + ;; + *) + static_libs="$static_libs $lib" + ;; + esac + done + + # -lgcc is carefully placed here - we want to catch + # all toolchain symbols in *our* libraries rather + # than pick up anything unhygenic from the Android libs. + LIBS="-Wl,-Bstatic $static_libs" + LIBS="$LIBS -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" + ;; + dc) + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc -isystem $(ronindir)/include' + LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000 -nostartfiles "'$(ronindir)/lib/crt0.o -L$(ronindir)/lib' + LIBS="$LIBS -lronin -lm" + ;; + dingux) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + DEFINES="$DEFINES -DSDL_BACKEND -DDINGUX" + LDFLAGS="$LDFLAGS " + MODULES="$MODULES backends/platform/sdl" + ;; + ds) + # TODO ds + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' + INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' + ;; + gp2x) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + LDFLAGS="$LDFLAGS" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; + gph) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + LDFLAGS="$LDFLAGS" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; + iphone) + OBJCFLAGS="$OBJCFLAGS --std=c99" + LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES -framework QuartzCore -framework GraphicsServices -framework CoreFoundation -framework Foundation -framework AudioToolbox -framework CoreAudio" + ;; + linuxmoto) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" + ;; + n64) + INCLUDES="$INCLUDES "'-I$(N64SDK)/include' + INCLUDES="$INCLUDES "'-I$(N64SDK)/mips64/include' + INCLUDES="$INCLUDES "'-I$(N64SDK)/hkz-libn64' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' + LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs -lm -lstdc++ -lc -lgcc -lz -lnosys" + ;; + null) + DEFINES="$DEFINES -DUSE_NULL_DRIVER" + ;; + openpandora) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + LDFLAGS="$LDFLAGS" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; + ps2) + # TODO ps2 + DEFINES="$DEFINES -D_EE -DFORCE_RTL" + INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include" + if test "$_dynamic_modules" = no ; then + LDFLAGS="$LDFLAGS -mno-crt0 $PS2SDK/ee/startup/crt0.o -T $PS2SDK/ee/startup/linkfile" + fi + LDFLAGS="$LDFLAGS -L$PS2SDK/ee/lib -L$PS2SDK/ports/lib" + LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lm -lc -lfileXio -lkernel -lstdc++ " + ;; + psp) + DEFINES="$DEFINES -D__PSP__ -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" + LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" + ;; + samsungtv) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + DEFINES="$DEFINES -DSDL_BACKEND -DSAMSUNGTV" + LDFLAGS="$LDFLAGS -shared -fpic" + MODULES="$MODULES backends/platform/sdl" + ;; + sdl) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; + webos) + # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. + LIBS="$LIBS -lSDL" + DEFINES="$DEFINES -DSDL_BACKEND -DWEBOS" + MODULES="$MODULES backends/platform/sdl" + ;; + wii) + DEFINES="$DEFINES -D__WII__ -DGEKKO" + case $_host_os in + gamecube) + LIBS="$LIBS -lgxflux -liso9660 -lfat -logc -ldb" + ;; + *) + LIBS="$LIBS -lgxflux -ldi -liso9660 -ltinysmb -lfat -lwiiuse -lbte -logc -lwiikeyboard -ldb" + ;; + esac + ;; + wince) + INCLUDES="$INCLUDES "'-I$(srcdir) -I$(srcdir)/backends/platform/wince -I$(srcdir)/engines -I$(srcdir)/backends/platform/wince/missing/gcc -I$(srcdir)/backends/platform/wince/CEgui -I$(srcdir)/backends/platform/wince/CEkeys' + LIBS="$LIBS -static -lSDL" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; + *) + echo "support for $_backend backend not implemented in configure script yet" + exit 1 + ;; +esac +MODULES="$MODULES backends/platform/$_backend" + # # Enable 16bit support only for backends which support it # @@ -3034,198 +3226,6 @@ else echo fi -# -# Backend related stuff -# -case $_backend in - android) - # ssp at this point so the cxxtests link - if test "$_debug_build" = yes; then - CXXFLAGS="$CXXFLAGS -fstack-protector" - else - CXXFLAGS="$CXXFLAGS -fno-stack-protector" - fi - CXXFLAGS="$CXXFLAGS -Wa,--noexecstack" - LDFLAGS="$LDFLAGS -Wl,-z,noexecstack" - - static_libs='' - system_libs='' - for lib in $LIBS; do - case $lib in - -lz|-lm) - system_libs="$system_libs $lib" - ;; - *) - static_libs="$static_libs $lib" - ;; - esac - done - - # -lgcc is carefully placed here - we want to catch - # all toolchain symbols in *our* libraries rather - # than pick up anything unhygenic from the Android libs. - LIBS="-Wl,-Bstatic $static_libs" - LIBS="$LIBS -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" - ;; - dc) - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc -isystem $(ronindir)/include' - LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000 -nostartfiles "'$(ronindir)/lib/crt0.o -L$(ronindir)/lib' - LIBS="$LIBS -lronin -lm" - ;; - dingux) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DDINGUX" - LDFLAGS="$LDFLAGS " - MODULES="$MODULES backends/platform/sdl" - ;; - ds) - # TODO ds - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' - INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' - ;; - gp2x) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" - ;; - gph) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" - ;; - iphone) - OBJCFLAGS="$OBJCFLAGS --std=c99" - LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES -framework QuartzCore -framework GraphicsServices -framework CoreFoundation -framework Foundation -framework AudioToolbox -framework CoreAudio" - ;; - linuxmoto) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" - ;; - n64) - INCLUDES="$INCLUDES "'-I$(N64SDK)/include' - INCLUDES="$INCLUDES "'-I$(N64SDK)/mips64/include' - INCLUDES="$INCLUDES "'-I$(N64SDK)/hkz-libn64' - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' - LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs -lm -lstdc++ -lc -lgcc -lz -lnosys" - ;; - null) - DEFINES="$DEFINES -DUSE_NULL_DRIVER" - ;; - openpandora) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" - ;; - ps2) - # TODO ps2 - DEFINES="$DEFINES -D_EE -DFORCE_RTL" - INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include" - if test "$_dynamic_modules" = no ; then - LDFLAGS="$LDFLAGS -mno-crt0 $PS2SDK/ee/startup/crt0.o -T $PS2SDK/ee/startup/linkfile" - fi - LDFLAGS="$LDFLAGS -L$PS2SDK/ee/lib -L$PS2SDK/ports/lib" - LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lm -lc -lfileXio -lkernel -lstdc++ " - ;; - psp) - DEFINES="$DEFINES -D__PSP__ -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" - LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" - ;; - samsungtv) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DSAMSUNGTV" - LDFLAGS="$LDFLAGS -shared -fpic" - MODULES="$MODULES backends/platform/sdl" - ;; - sdl) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND" - ;; - webos) - # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. - LIBS="$LIBS -lSDL" - DEFINES="$DEFINES -DSDL_BACKEND -DWEBOS" - MODULES="$MODULES backends/platform/sdl" - ;; - wii) - DEFINES="$DEFINES -D__WII__ -DGEKKO" - case $_host_os in - gamecube) - LIBS="$LIBS -lgxflux -liso9660 -lfat -logc -ldb" - ;; - *) - LIBS="$LIBS -lgxflux -ldi -liso9660 -ltinysmb -lfat -lwiiuse -lbte -logc -lwiikeyboard -ldb" - ;; - esac - ;; - wince) - INCLUDES="$INCLUDES "'-I$(srcdir) -I$(srcdir)/backends/platform/wince -I$(srcdir)/engines -I$(srcdir)/backends/platform/wince/missing/gcc -I$(srcdir)/backends/platform/wince/CEgui -I$(srcdir)/backends/platform/wince/CEkeys' - LIBS="$LIBS -static -lSDL" - DEFINES="$DEFINES -DSDL_BACKEND" - ;; - *) - echo "support for $_backend backend not implemented in configure script yet" - exit 1 - ;; -esac -MODULES="$MODULES backends/platform/$_backend" - -# -# Do CXXFLAGS now that we know the compiler version -# -if test "$have_gcc" = yes ; then - if test "$_cxx_major" -ge "3" ; then - case $_host_os in - # newlib-based system include files suppress non-C89 function - # declarations under __STRICT_ANSI__ - amigaos* | android | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | wii | wince ) - CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" - ;; - *) - CXXFLAGS="$CXXFLAGS -ansi -W -Wno-unused-parameter" - ;; - esac - add_line_to_config_mk 'HAVE_GCC3 = 1' - add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' - fi; - - if test "$_cxx_major" -eq 4 && test "$_cxx_minor" -ge 3 || \ - test "$_cxx_major" -gt 4 ; then - CXXFLAGS="$CXXFLAGS -Wno-empty-body" - else - CXXFLAGS="$CXXFLAGS -Wconversion" - fi; -elif test "$have_icc" = yes ; then - add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' -fi; - -# Some platforms use certain GNU extensions in header files -case $_host_os in -android | gamecube | psp | wii) - ;; -*) - # ICC does not support pedantic - if test "$have_icc" = no ; then - CXXFLAGS="$CXXFLAGS -pedantic" - fi - ;; -esac - # # Engine selection # From 7585303c06fbac525b8e24404c79b673fa1be9c5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 May 2011 23:02:31 +0200 Subject: [PATCH 185/369] BUILD: Do not manually set endianess If for some reason the endianess is not detected right, then this should be reported as a bug; and any (hopefully temporary) specification of the endianess should be accompanied by an explanatory comment. --- configure | 5 ----- 1 file changed, 5 deletions(-) diff --git a/configure b/configure index e8390385bc51..5519a0a862c0 100755 --- a/configure +++ b/configure @@ -1851,7 +1851,6 @@ if test -n "$_host"; then _port_mk="backends/platform/ds/ds.mk" ;; gamecube) - _endian=big _need_memalign=yes _backend="wii" _build_scalers=no @@ -1918,7 +1917,6 @@ if test -n "$_host"; then m68k-atari-mint) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" _unix=yes - _endian=big _need_memalign=yes _ranlib=m68k-atari-mint-ranlib _ar="m68k-atari-mint-ar cru" @@ -1933,7 +1931,6 @@ if test -n "$_host"; then mips-sgi*) LDFLAGS="$LDFLAGS -static-libgcc" LIBS="$LIBS -laudio" - _endian=big _need_memalign=yes ;; motoezx) @@ -2014,7 +2011,6 @@ if test -n "$_host"; then _port_mk="backends/platform/openpandora/op-bundle.mk" ;; ppc-amigaos) - _endian=big # AmigaOS exec allocates memory always in an aligned way _need_memalign=yes ;; @@ -2080,7 +2076,6 @@ if test -n "$_host"; then _keymapper=yes ;; wii) - _endian=big _need_memalign=yes _backend="wii" _build_scalers=no From ecb8618cb723bed6eb054f25c4ee1d2822adabb5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 May 2011 23:19:22 +0200 Subject: [PATCH 186/369] BUILD: Unify build & configure rules for SDL based backends --- backends/platform/dingux/module.mk | 10 +++-- backends/platform/gp2x/module.mk | 3 ++ backends/platform/gph/module.mk | 2 +- backends/platform/linuxmoto/module.mk | 4 +- backends/platform/openpandora/module.mk | 9 ++--- backends/platform/samsungtv/module.mk | 3 ++ configure | 54 +++++++++---------------- 7 files changed, 37 insertions(+), 48 deletions(-) diff --git a/backends/platform/dingux/module.mk b/backends/platform/dingux/module.mk index 2247625a044f..b924fec1cfb2 100644 --- a/backends/platform/dingux/module.mk +++ b/backends/platform/dingux/module.mk @@ -4,8 +4,10 @@ MODULE_OBJS := \ main.o \ dingux.o -MODULE_DIRS += \ - backends/platform/dingux/ +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# Hack to ensure the SDL backend is built so we can use OSystem_SDL. +-include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/gp2x/module.mk b/backends/platform/gp2x/module.mk index 837ad99d7bb3..4846f162cbe5 100644 --- a/backends/platform/gp2x/module.mk +++ b/backends/platform/gp2x/module.mk @@ -10,3 +10,6 @@ MODULE_OBJS := \ MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) OBJS := $(MODULE_OBJS) $(OBJS) MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) + +# Hack to ensure the SDL backend is built so we can use OSystem_SDL. +-include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/gph/module.mk b/backends/platform/gph/module.mk index a9951494d1cc..d8a1a6cd8dbf 100644 --- a/backends/platform/gph/module.mk +++ b/backends/platform/gph/module.mk @@ -11,4 +11,4 @@ OBJS := $(MODULE_OBJS) $(OBJS) MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) # Hack to ensure the SDL backend is built so we can use OSystem_SDL. --include $(srcdir)/backends/platform/sdl/module.mk \ No newline at end of file +-include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/linuxmoto/module.mk b/backends/platform/linuxmoto/module.mk index c604d69da16a..4c81aac3f2c2 100644 --- a/backends/platform/linuxmoto/module.mk +++ b/backends/platform/linuxmoto/module.mk @@ -10,5 +10,5 @@ MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) OBJS := $(MODULE_OBJS) $(OBJS) MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) -# HACK: The linuxmoto backend is based on the SDL one, so we load that, too. -include $(srcdir)/backends/platform/sdl/module.mk +# Hack to ensure the SDL backend is built so we can use OSystem_SDL. +-include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/openpandora/module.mk b/backends/platform/openpandora/module.mk index 8e60b87aa66b..5bd568e1c47f 100755 --- a/backends/platform/openpandora/module.mk +++ b/backends/platform/openpandora/module.mk @@ -5,11 +5,10 @@ MODULE_OBJS := \ op-backend.o \ op-main.o -MODULE_DIRS += \ - backends/platform/openpandora/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) # Hack to ensure the SDL backend is built so we can use OSystem_SDL. -include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/samsungtv/module.mk b/backends/platform/samsungtv/module.mk index 36ad75da6d90..cba09db74cb2 100644 --- a/backends/platform/samsungtv/module.mk +++ b/backends/platform/samsungtv/module.mk @@ -8,3 +8,6 @@ MODULE_OBJS := \ MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) OBJS := $(MODULE_OBJS) $(OBJS) MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) + +# Hack to ensure the SDL backend is built so we can use OSystem_SDL. +-include $(srcdir)/backends/platform/sdl/module.mk diff --git a/configure b/configure index 5519a0a862c0..367289ee12fd 100755 --- a/configure +++ b/configure @@ -2192,12 +2192,7 @@ case $_backend in LIBS="$LIBS -lronin -lm" ;; dingux) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DDINGUX" - LDFLAGS="$LDFLAGS " - MODULES="$MODULES backends/platform/sdl" + DEFINES="$DEFINES -DDINGUX" ;; ds) # TODO ds @@ -2206,28 +2201,15 @@ case $_backend in INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' ;; gp2x) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" ;; gph) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" ;; iphone) OBJCFLAGS="$OBJCFLAGS --std=c99" LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES -framework QuartzCore -framework GraphicsServices -framework CoreFoundation -framework Foundation -framework AudioToolbox -framework CoreAudio" ;; linuxmoto) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" + DEFINES="$DEFINES -DLINUXMOTO" ;; n64) INCLUDES="$INCLUDES "'-I$(N64SDK)/include' @@ -2240,11 +2222,6 @@ case $_backend in DEFINES="$DEFINES -DUSE_NULL_DRIVER" ;; openpandora) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - LDFLAGS="$LDFLAGS" - DEFINES="$DEFINES -DSDL_BACKEND" ;; ps2) # TODO ps2 @@ -2261,18 +2238,8 @@ case $_backend in LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" ;; samsungtv) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND -DSAMSUNGTV" + DEFINES="$DEFINES -DSAMSUNGTV" LDFLAGS="$LDFLAGS -shared -fpic" - MODULES="$MODULES backends/platform/sdl" - ;; - sdl) - find_sdlconfig - INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" - LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" - DEFINES="$DEFINES -DSDL_BACKEND" ;; webos) # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. @@ -2296,6 +2263,8 @@ case $_backend in LIBS="$LIBS -static -lSDL" DEFINES="$DEFINES -DSDL_BACKEND" ;; + sdl) + ;; *) echo "support for $_backend backend not implemented in configure script yet" exit 1 @@ -2303,6 +2272,19 @@ case $_backend in esac MODULES="$MODULES backends/platform/$_backend" +# +# Setup SDL specifics for SDL based backends +# +case $_backend in + dingux | gp2x | gph | linuxmoto | openpandora | samsungtv | sdl) + find_sdlconfig + INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" + LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" + DEFINES="$DEFINES -DSDL_BACKEND" + ;; +esac + + # # Enable 16bit support only for backends which support it # From e013a516041b56e2c0f94b7c967de5cad615d12d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 12:19:47 +0200 Subject: [PATCH 187/369] BUILD: Enable ARM asm only based on _host_cpu Also moved x86 and ARM recognition code in configure to be next to each other; and print whether ARM specific code is going to be used or not. --- configure | 74 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/configure b/configure index 367289ee12fd..152801540270 100755 --- a/configure +++ b/configure @@ -145,7 +145,6 @@ _text_console=no _mt32emu=yes _build_scalers=yes _build_hq_scalers=yes -_arm_asm=no _indeo3=auto _enable_prof=no _unix=no @@ -161,6 +160,7 @@ _backend=sdl _endian=unknown _need_memalign=no _have_x86=no +_arm_asm=no _verbose_build=no _dynamic_modules=no _plugins_default=static @@ -1542,20 +1542,6 @@ TMPR="$?" echo "$type_4_byte" test $TMPR -eq 0 || exit 1 # check exit code of subshell -# -# Check whether we can use x86 asm routines -# -echo_n "Compiling for x86... " -case $_host_cpu in - i386|i486|i586|i686) - _have_x86=yes - ;; - *) - _have_x86=no - ;; -esac -echo "$_have_x86" - # # Determine build settings # @@ -1762,7 +1748,6 @@ if test -n "$_host"; then HOSTEXEEXT=.so _backend="android" _port_mk="backends/platform/android/android.mk" - _arm_asm=yes _build_scalers=no _seq_midi=no _mt32emu=no @@ -1771,7 +1756,6 @@ if test -n "$_host"; then arm-linux|arm*-linux-gnueabi|arm-*-linux) _unix=yes _need_memalign=yes - _arm_asm=yes ;; arm-riscos|linupy) DEFINES="$DEFINES -DLINUPY" @@ -1795,7 +1779,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1843,7 +1826,6 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" _need_memalign=yes - _arm_asm=yes add_line_to_config_h '#define DISABLE_TEXT_CONSOLE' _backend="ds" _build_scalers=no @@ -1876,7 +1858,6 @@ if test -n "$_host"; then LDFLAGS="$LDFLAGS -static" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1896,7 +1877,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfloat-abi=soft" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1909,7 +1889,6 @@ if test -n "$_host"; then DEFINES="$DEFINES -DIPHONE" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="iphone" _build_hq_scalers=no _seq_midi=no @@ -1938,7 +1917,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfpu=vfp" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1951,7 +1929,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfpu=vfp" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -2002,7 +1979,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfloat-abi=soft" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="openpandora" _build_hq_scalers=yes _vkeybd=no @@ -2057,7 +2033,6 @@ if test -n "$_host"; then HOSTEXEEXT=".so" _unix=yes _need_memalign=yes - _arm_asm=yes _backend="samsungtv" _mt32emu=no _vkeybd=yes @@ -2065,7 +2040,6 @@ if test -n "$_host"; then webos) _unix=yes _need_memalign=yes - _arm_asm=yes _backend="webos" _port_mk="backends/platform/webos/webos.mk" _build_scalers=no @@ -2092,7 +2066,6 @@ if test -n "$_host"; then wince) LDFLAGS="$LDFLAGS -Wl,--stack,65536" _need_memalign=yes - _arm_asm=yes _tremolo=yes _backend="wince" _mt32emu=no @@ -2319,7 +2292,6 @@ case $_endian in ;; esac -define_in_config_h_if_yes $_have_x86 'HAVE_X86' define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' @@ -2591,15 +2563,6 @@ define_in_config_if_yes "$_build_scalers" 'USE_SCALERS' define_in_config_if_yes "$_build_hq_scalers" 'USE_HQ_SCALERS' -# -# Check whether to use optimized ARM asm -# -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM' - # # Check whether to compile the Indeo3 decoder # @@ -3037,6 +3000,41 @@ fi define_in_config_if_yes "$_opengl" "USE_OPENGL" define_in_config_if_yes "$_opengles" "USE_GLES" + +# +# Check whether we can use x86 asm routines +# +echo_n "Compiling for x86... " +case $_host_cpu in + i386|i486|i586|i686) + _have_x86=yes + ;; + *) + _have_x86=no + ;; +esac +echo "$_have_x86" +define_in_config_h_if_yes $_have_x86 'HAVE_X86' + +# +# Check whether to use optimized ARM asm +# +echo_n "Compiling for ARM... " +case $_host_cpu in + arm*) + _arm_asm=yes + ;; + *) + _arm_asm=no + ;; +esac +echo "$_arm_asm" +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM' + # # Check for nasm # From 63a69b4f1e3356c1bfbfbfdc77dbb58e26b85d7e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 13:43:30 +0200 Subject: [PATCH 188/369] BUILD: Overhaul how we determine the need for aligned mem access Also add some comments explaining what is going on and why. --- configure | 104 ++++++++++++++++++++++-------------------------------- 1 file changed, 42 insertions(+), 62 deletions(-) diff --git a/configure b/configure index 152801540270..4bbc829d994a 100755 --- a/configure +++ b/configure @@ -158,7 +158,7 @@ _translation=yes # Default platform settings _backend=sdl _endian=unknown -_need_memalign=no +_need_memalign=yes _have_x86=no _arm_asm=no _verbose_build=no @@ -1741,7 +1741,6 @@ if test -n "$_host"; then case "$_host" in android | android-v7a) _unix=yes - _need_memalign=yes # we link a .so as default LDFLAGS="$LDFLAGS -shared -Wl,-Bsymbolic,--no-undefined" HOSTEXEPRE=lib @@ -1755,15 +1754,12 @@ if test -n "$_host"; then ;; arm-linux|arm*-linux-gnueabi|arm-*-linux) _unix=yes - _need_memalign=yes ;; arm-riscos|linupy) DEFINES="$DEFINES -DLINUPY" _unix=yes - _need_memalign=yes ;; bfin*) - _need_memalign=yes ;; caanoo) # This uses the GPH backend. @@ -1778,7 +1774,6 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS" _unix=yes - _need_memalign=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1795,7 +1790,6 @@ if test -n "$_host"; then DEFINES="$DEFINES -DUNIX -DDINGUX -DDISABLE_DOSBOX_OPL -DREDUCE_MEMORY_USAGE" ASFLAGS="$ASFLAGS" CXXFLAGS="$CXXFLAGS -msoft-float -mips32" - _need_memalign=yes _backend="dingux" _mt32emu=no _vkeybd=yes @@ -1810,7 +1804,6 @@ if test -n "$_host"; then dreamcast) DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks" - _need_memalign=yes _backend="dc" _build_scalers=no _mad=yes @@ -1825,7 +1818,6 @@ if test -n "$_host"; then DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" - _need_memalign=yes add_line_to_config_h '#define DISABLE_TEXT_CONSOLE' _backend="ds" _build_scalers=no @@ -1833,7 +1825,6 @@ if test -n "$_host"; then _port_mk="backends/platform/ds/ds.mk" ;; gamecube) - _need_memalign=yes _backend="wii" _build_scalers=no _mt32emu=no @@ -1857,7 +1848,6 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfloat-abi=soft" LDFLAGS="$LDFLAGS -static" _unix=yes - _need_memalign=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1876,7 +1866,6 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" _unix=yes - _need_memalign=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1888,7 +1877,6 @@ if test -n "$_host"; then iphone) DEFINES="$DEFINES -DIPHONE" _unix=yes - _need_memalign=yes _backend="iphone" _build_hq_scalers=no _seq_midi=no @@ -1896,7 +1884,6 @@ if test -n "$_host"; then m68k-atari-mint) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" _unix=yes - _need_memalign=yes _ranlib=m68k-atari-mint-ranlib _ar="m68k-atari-mint-ar cru" _seq_midi=no @@ -1910,13 +1897,11 @@ if test -n "$_host"; then mips-sgi*) LDFLAGS="$LDFLAGS -static-libgcc" LIBS="$LIBS -laudio" - _need_memalign=yes ;; motoezx) DEFINES="$DEFINES -DMOTOEZX" ASFLAGS="$ASFLAGS -mfpu=vfp" _unix=yes - _need_memalign=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1928,7 +1913,6 @@ if test -n "$_host"; then DEFINES="$DEFINES -DMOTOMAGX" ASFLAGS="$ASFLAGS -mfpu=vfp" _unix=yes - _need_memalign=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1943,7 +1927,6 @@ if test -n "$_host"; then LDFLAGS="$LDFLAGS -L$N64SDK/hkz-libn64 -L$N64SDK/lib" LDFLAGS="$LDFLAGS -T n64ld_cpp.x -Xlinker -Map -Xlinker scummvm.map" _backend="n64" - _need_memalign=yes _mt32emu=no _build_scalers=no _indeo3=no @@ -1962,7 +1945,6 @@ if test -n "$_host"; then neuros) DEFINES="$DEFINES -DNEUROS" _unix=yes - _need_memalign=yes _backend='null' _build_hq_scalers=no _mt32emu=no @@ -1978,7 +1960,6 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -march=armv7-a -mtune=cortex-a8 -mfpu=neon" ASFLAGS="$ASFLAGS -mfloat-abi=soft" _unix=yes - _need_memalign=yes _backend="openpandora" _build_hq_scalers=yes _vkeybd=no @@ -1987,14 +1968,11 @@ if test -n "$_host"; then _port_mk="backends/platform/openpandora/op-bundle.mk" ;; ppc-amigaos) - # AmigaOS exec allocates memory always in an aligned way - _need_memalign=yes ;; ps2) # TODO: complete this DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" - _need_memalign=yes _backend="ps2" _build_scalers=no _mt32emu=no @@ -2021,7 +1999,6 @@ if test -n "$_host"; then fi ;; psp) - _need_memalign=yes _backend="psp" _build_scalers=no _mt32emu=no @@ -2032,14 +2009,12 @@ if test -n "$_host"; then ASFLAGS="$ASFLAGS -mfpu=vfp" HOSTEXEEXT=".so" _unix=yes - _need_memalign=yes _backend="samsungtv" _mt32emu=no _vkeybd=yes ;; webos) _unix=yes - _need_memalign=yes _backend="webos" _port_mk="backends/platform/webos/webos.mk" _build_scalers=no @@ -2050,7 +2025,6 @@ if test -n "$_host"; then _keymapper=yes ;; wii) - _need_memalign=yes _backend="wii" _build_scalers=no _port_mk="backends/platform/wii/wii.mk" @@ -2065,7 +2039,6 @@ if test -n "$_host"; then ;; wince) LDFLAGS="$LDFLAGS -Wl,--stack,65536" - _need_memalign=yes _tremolo=yes _backend="wince" _mt32emu=no @@ -2075,33 +2048,42 @@ if test -n "$_host"; then echo "WARNING: Unknown target, continuing with auto-detected values" ;; esac +fi -else - # - # Check whether memory alignment is required - # - echo_n "Alignment required... " - case $_host_cpu in - alpha*) - # Hardcode alignment requirements for Alpha processsors - _need_memalign=yes - ;; - arm*) - _need_memalign=yes - ;; - mips*) - # Hardcode alignment requirements for MIPS processsors. - # While these can emulate unaligned memory access, this - # emulation is rather slow. - _need_memalign=yes - ;; - sh*) - # Hardcode alignment requirements for SH processsors. - # While these can emulate unaligned memory access, this - # emulation is rather slow. - _need_memalign=yes - ;; - *) +# +# Check whether memory alignment is required +# +# For some CPU types, unaligned memory access is either not supported at +# all (and so leads to a crash), requires a super-slow emulation via an +# exception handler, or just results in incorrect results. +# On the other hand, accessing data in a manner that works regardless of +# alignment can be a lot slower than regular access, so we don't want +# to use it if we don't have to. +# +# So we do the following: First, for CPU families where we know whether +# unaligned access is safe & fast, we enable / disable unaligned access +# accordingly. +# Otherwise, for cross compiled builds we just disable memory alignment. +# For native builds, we run some test code that detects whether unaligned +# access is supported (and is supported without an exception handler). +# +# NOTE: The only kinds of unaligned access we allow are for 2 byte and +# 4 byte loads / stores. No promises are made for bigger sizes, such as +# 8 or 16 byte loads, for which various architectures (e.g. x86 and PowerPC) +# behave differently than for the smaller sizes). +echo_n "Alignment required... " +case $_host_cpu in + alpha* | arm* | bfin* | hp* | mips* | sh* | sparc* | ia64 | nv1*) + # Unaligned access is not supported or extremely slow. + _need_memalign=yes + ;; + i[3-6]86 | x86_64 | ppc*) + # Unaligned access should work reasonably well + _need_memalign=no + ;; + *) + if test -z "$_host"; then + # NOT in cross-compiling mode: # Try to auto-detect.... cat > $TMPC << EOF #include @@ -2117,13 +2099,14 @@ int main(int argc, char **argv) { return 0; } EOF - _need_memalign=yes cc_check_no_clean && $TMPO$HOSTEXEEXT && _need_memalign=no cc_check_clean - ;; - esac - echo "$_need_memalign" -fi + fi + ;; +esac +echo "$_need_memalign" + +define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' # # Backend related stuff @@ -2292,9 +2275,6 @@ case $_endian in ;; esac - -define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' - if test "$_unix" = yes ; then DEFINES="$DEFINES -DUNIX" add_line_to_config_mk 'UNIX = 1' From 9b14c50b774afe0d257534e261f412455d8ed93e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 14:02:18 +0200 Subject: [PATCH 189/369] BUILD: Unify how debug/release mode defaults are determined --- configure | 60 +++++++++++++------------------------------------------ 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/configure b/configure index 4bbc829d994a..833ee1441385 100755 --- a/configure +++ b/configure @@ -990,15 +990,6 @@ caanoo) _host_os=gph-linux _host_cpu=arm _host_alias=arm-none-linux-gnueabi - if test "$_debug_build" = auto; then - # If you want to debug on the Caanoo use '--disable-release --enable-debug' - _debug_build=no - fi - - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi ;; dingux) _host_os=linux @@ -1026,29 +1017,11 @@ gp2x) _host_os=gph-linux _host_cpu=arm _host_alias=arm-open2x-linux - if test "$_debug_build" = auto; then - # If you want to debug on the GP2X use '--disable-release --enable-debug' - _debug_build=no - fi - - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi ;; gp2xwiz) _host_os=gph-linux _host_cpu=arm _host_alias=arm-open2x-linux - if test "$_debug_build" = auto; then - # If you want to debug on the GP2XWiz use '--disable-release --enable-debug' - _debug_build=no - fi - - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi ;; i586-mingw32msvc) _host_os=mingw32msvc @@ -1086,15 +1059,6 @@ openpandora) _host_os=linux _host_cpu=arm _host_alias=arm-angstrom-linux-gnueabi - if test "$_debug_build" = auto; then - # If you want to debug on the OP use '--disable-release --enable-debug' - _debug_build=no - fi - - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi ;; ppc-amigaos) _host_os=amigaos @@ -1104,16 +1068,6 @@ ps2) _host_os=ps2 _host_cpu=mips64r5900el _host_alias=ee - if test "$_debug_build" = auto; then - # Disable debug mode by default. The resulting binaries are far too big in general, - # and one has to disable multiple engines to make it usable. - _debug_build=no - fi - - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi ;; psp) _host_os=psp @@ -1182,6 +1136,20 @@ fi # Determine extra build flags for debug and/or release builds # +case $_host in +caanoo | gp2x | gp2xwiz | openpandora | ps2) + if test "$_debug_build" = auto; then + # If you want to debug one of these platforms, use '--disable-release --enable-debug' + _debug_build=no + fi + + if test "$_release_build" = auto; then + # Enable release build by default. + _release_build=yes + fi + ;; +esac + if test "$_debug_build" != no; then # debug mode not explicitly disabled -> compile with -g CXXFLAGS="$CXXFLAGS -g" From d935c53cdf00a54d95714139046abc35bf5c2c6a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 14:14:21 +0200 Subject: [PATCH 190/369] BUILD: Rearrange some PSP stuff Cursory testing shows no regressions caused by this, but proper testing of this change is recommended. --- configure | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/configure b/configure index 833ee1441385..2bf6f99ba3ec 100755 --- a/configure +++ b/configure @@ -1073,13 +1073,6 @@ psp) _host_os=psp _host_cpu=mipsallegrexel _host_alias=psp - if test -z "$PSPDEV"; then - PSPDEV=`psp-config --pspdev-path` - fi - if test -d "$PSPDEV/psp/lib"; then - LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib" - fi - LDFLAGS="$LDFLAGS -L$PSPDEV/psp/sdk/lib -specs=$_srcdir/backends/platform/psp/psp.spec" ;; samsungtv) _host_os=linux @@ -1216,9 +1209,15 @@ ps2) fi ;; psp) - PSPSDK=`psp-config --pspsdk-path` + if test -z "$PSPDEV"; then + PSPDEV=`psp-config --pspdev-path` + fi + # TODO: Should we also insist on a valid PSPDEV value? if test -z "$PSPSDK"; then - echo "Please set the path to PSPSDK in your environment." + PSPSDK=`psp-config --pspsdk-path` + fi + if test -z "$PSPSDK"; then + echo "Please set PSPSDK in your environment. export PSPSDK=" exit 1 fi ;; @@ -1660,6 +1659,10 @@ case $_host_os in DEFINES="$DEFINES -D_EE -D__PLAYSTATION2__" ;; psp) + if test -d "$PSPDEV/psp/lib"; then + LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib" + fi + LDFLAGS="$LDFLAGS -L$PSPSDK/lib -specs=$_srcdir/backends/platform/psp/psp.spec" CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include -D_PSP_FW_VERSION=150" ;; solaris*) From 6639eacb3ae7189bd18e4267d0115caa0a05edb4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 14:21:17 +0200 Subject: [PATCH 191/369] BUILD: Move some Android 'hack' back to near end of configure --- configure | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/configure b/configure index 2bf6f99ba3ec..828e99000455 100755 --- a/configure +++ b/configure @@ -2093,24 +2093,6 @@ case $_backend in CXXFLAGS="$CXXFLAGS -Wa,--noexecstack" LDFLAGS="$LDFLAGS -Wl,-z,noexecstack" - static_libs='' - system_libs='' - for lib in $LIBS; do - case $lib in - -lz|-lm) - system_libs="$system_libs $lib" - ;; - *) - static_libs="$static_libs $lib" - ;; - esac - done - - # -lgcc is carefully placed here - we want to catch - # all toolchain symbols in *our* libraries rather - # than pick up anything unhygenic from the Android libs. - LIBS="-Wl,-Bstatic $static_libs" - LIBS="$LIBS -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; dc) @@ -3152,6 +3134,33 @@ else echo fi +# +# Some last-minute backend specific stuff, executed +# after all of CXXFLAGS, LDFLAGS, LIBS etc. have been setup +# +case $_backend in + android) + static_libs='' + system_libs='' + for lib in $LIBS; do + case $lib in + -lz|-lm) + system_libs="$system_libs $lib" + ;; + *) + static_libs="$static_libs $lib" + ;; + esac + done + + # -lgcc is carefully placed here - we want to catch + # all toolchain symbols in *our* libraries rather + # than pick up anything unhygenic from the Android libs. + LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" + ;; +esac + + # # Engine selection # From 39076ef9722529d80feff94bdff25843beb4fc13 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 15:38:54 +0200 Subject: [PATCH 192/369] BUILD: Rename UNIX #define to POSIX --- backends/base-backend.cpp | 11 +- backends/events/sdl/sdl-events.cpp | 6 +- backends/fs/posix/posix-fs-factory.cpp | 2 +- backends/fs/posix/posix-fs.cpp | 4 +- backends/module.mk | 2 +- backends/platform/null/null.cpp | 4 +- backends/platform/sdl/main.cpp | 2 +- backends/platform/sdl/module.mk | 2 +- backends/platform/sdl/posix/posix-main.cpp | 2 +- backends/platform/sdl/posix/posix.cpp | 4 +- backends/plugins/posix/posix-provider.cpp | 6 +- backends/plugins/posix/posix-provider.h | 6 +- backends/saves/posix/posix-saves.cpp | 9 +- backends/saves/posix/posix-saves.h | 3 +- common/savefile.h | 2 +- configure | 72 +- .../iphone/scummvm.xcodeproj/project.pbxproj | 2436 +++++++---------- ports.mk | 2 +- 18 files changed, 987 insertions(+), 1588 deletions(-) diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index f3935b5893f3..624de1f3e586 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -18,6 +18,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + * $URL$ + * $Id$ + * */ #include "backends/base-backend.h" @@ -57,11 +60,15 @@ void BaseBackend::fillScreen(uint32 col) { */ -#if defined(UNIX) +#if defined(POSIX) +#if defined(SAMSUNGTV) +#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" +#else #define DEFAULT_CONFIG_FILE ".scummvmrc" #endif +#endif -#if !defined(UNIX) +#if !defined(POSIX) #define DEFAULT_CONFIG_FILE "scummvm.ini" #endif diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index cadb10a954ef..835d98e718e4 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -279,7 +279,7 @@ bool SdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_QUIT; return true; } -#elif defined(UNIX) +#elif defined(POSIX) // On other *nix systems, Control-Q quits if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') { event.type = Common::EVENT_QUIT; @@ -323,7 +323,7 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) { if (ev.key.keysym.sym == 'm' || // Ctrl-m toggles mouse capture #if defined(MACOSX) // Meta - Q, handled below -#elif defined(UNIX) +#elif defined(POSIX) ev.key.keysym.sym == 'q' || // On other *nix systems, Control-Q quits #else ev.key.keysym.sym == 'z' || // Ctrl-z quit @@ -336,7 +336,7 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) { #if defined(MACOSX) if ((mod & KMOD_META) && ev.key.keysym.sym == 'q') return false; // On Macintosh, Cmd-Q quits -#elif defined(UNIX) +#elif defined(POSIX) // Control Q has already been handled above #else if ((mod & KMOD_ALT) && ev.key.keysym.sym == 'x') diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp index c94e90ccde48..ccff8a8b4287 100644 --- a/backends/fs/posix/posix-fs-factory.cpp +++ b/backends/fs/posix/posix-fs-factory.cpp @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#if defined(UNIX) +#if defined(POSIX) // Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h. // Also with clock() in sys/time.h in some Mac OS X SDKs. diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 7f2ca695c56e..08a7601c17a7 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#if defined(UNIX) +#if defined(POSIX) // Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h. // Also with clock() in sys/time.h in some Mac OS X SDKs. @@ -249,4 +249,4 @@ Common::WriteStream *POSIXFilesystemNode::createWriteStream() { return StdioStream::makeFromPath(getPath(), true); } -#endif //#if defined(UNIX) +#endif //#if defined(POSIX) diff --git a/backends/module.mk b/backends/module.mk index 04db3138eb39..07a8cbbb3f54 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -55,7 +55,7 @@ MODULE_OBJS += \ plugins/sdl/sdl-provider.o \ timer/sdl/sdl-timer.o -ifdef UNIX +ifdef POSIX MODULE_OBJS += \ fs/posix/posix-fs.o \ fs/posix/posix-fs-factory.o \ diff --git a/backends/platform/null/null.cpp b/backends/platform/null/null.cpp index 7dd127fefa98..b9e901bb5af7 100644 --- a/backends/platform/null/null.cpp +++ b/backends/platform/null/null.cpp @@ -34,7 +34,7 @@ */ #if defined(__amigaos4__) #include "backends/fs/amigaos4/amigaos4-fs-factory.h" -#elif defined(UNIX) +#elif defined(POSIX) #include "backends/fs/posix/posix-fs-factory.h" #elif defined(WIN32) #include "backends/fs/windows/windows-fs-factory.h" @@ -60,7 +60,7 @@ class OSystem_NULL : public ModularBackend { OSystem_NULL::OSystem_NULL() { #if defined(__amigaos4__) _fsFactory = new AmigaOSFilesystemFactory(); - #elif defined(UNIX) + #elif defined(POSIX) _fsFactory = new POSIXFilesystemFactory(); #elif defined(WIN32) _fsFactory = new WindowsFilesystemFactory(); diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index a0a64e115532..1992bdd3f2c7 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -24,7 +24,7 @@ // Several SDL based ports use a custom main, and hence do not want to compile // of this file. The following "#if" ensures that. -#if !defined(UNIX) && \ +#if !defined(POSIX) && \ !defined(WIN32) && \ !defined(__MAEMO__) && \ !defined(__SYMBIAN32__) && \ diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index 87a0e3d658eb..efc5168d5b3a 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -5,7 +5,7 @@ MODULE_OBJS := \ main.o \ sdl.o -ifdef UNIX +ifdef POSIX MODULE_OBJS += \ posix/posix-main.o \ posix/posix.o diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index ffc28b354c35..f78e00139850 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) +#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) #include "backends/platform/sdl/posix/posix.h" #include "backends/plugins/sdl/sdl-provider.h" diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 4dd0039c1ecf..21ad7b9e35b5 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -26,7 +26,7 @@ #include "common/scummsys.h" -#ifdef UNIX +#ifdef POSIX #include "backends/platform/sdl/posix/posix.h" #include "backends/saves/posix/posix-saves.h" @@ -61,7 +61,7 @@ void OSystem_POSIX::initBackend() { Common::String OSystem_POSIX::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; - // On UNIX type systems, by default we store the config file inside + // On POSIX type systems, by default we store the config file inside // to the HOME directory of the user. const char *home = getenv("HOME"); if (home != NULL && strlen(home) < MAXPATHLEN) diff --git a/backends/plugins/posix/posix-provider.cpp b/backends/plugins/posix/posix-provider.cpp index 39ed247436e1..a68a792fa48c 100644 --- a/backends/plugins/posix/posix-provider.cpp +++ b/backends/plugins/posix/posix-provider.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#if defined(DYNAMIC_MODULES) && defined(UNIX) +#if defined(DYNAMIC_MODULES) && defined(POSIX) #include "backends/plugins/posix/posix-provider.h" #include "backends/plugins/dynamic-plugin.h" @@ -77,9 +77,9 @@ class POSIXPlugin : public DynamicPlugin { }; -Plugin* POSIXPluginProvider::createPlugin(const Common::FSNode &node) const { +Plugin *POSIXPluginProvider::createPlugin(const Common::FSNode &node) const { return new POSIXPlugin(node.getPath()); } -#endif // defined(DYNAMIC_MODULES) && defined(UNIX) +#endif // defined(DYNAMIC_MODULES) && defined(POSIX) diff --git a/backends/plugins/posix/posix-provider.h b/backends/plugins/posix/posix-provider.h index 7d6d6ada4ded..b1186ccf3fd9 100644 --- a/backends/plugins/posix/posix-provider.h +++ b/backends/plugins/posix/posix-provider.h @@ -25,13 +25,13 @@ #include "base/plugins.h" -#if defined(DYNAMIC_MODULES) && defined(UNIX) +#if defined(DYNAMIC_MODULES) && defined(POSIX) class POSIXPluginProvider : public FilePluginProvider { protected: - Plugin* createPlugin(const Common::FSNode &node) const; + Plugin *createPlugin(const Common::FSNode &node) const; }; -#endif // defined(DYNAMIC_MODULES) && defined(UNIX) +#endif // defined(DYNAMIC_MODULES) && defined(POSIX) #endif diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index fc75abf86e63..40380a1b237e 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -28,7 +28,7 @@ #include "common/scummsys.h" -#if defined(UNIX) && !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) +#if defined(POSIX) && !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) #include "backends/saves/posix/posix-saves.h" @@ -83,13 +83,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() { } #endif } -/* -POSIXSaveFileManager::POSIXSaveFileManager(const Common::String &defaultSavepath) - : DefaultSaveFileManager(defaultSavepath) { -} -*/ -#if defined(UNIX) void POSIXSaveFileManager::checkPath(const Common::FSNode &dir) { const Common::String path = dir.getPath(); clearError(); @@ -154,6 +148,5 @@ void POSIXSaveFileManager::checkPath(const Common::FSNode &dir) { } } } -#endif #endif diff --git a/backends/saves/posix/posix-saves.h b/backends/saves/posix/posix-saves.h index b7ee7ff5b8e7..160075d3db03 100644 --- a/backends/saves/posix/posix-saves.h +++ b/backends/saves/posix/posix-saves.h @@ -25,7 +25,7 @@ #include "backends/saves/default/default-saves.h" -#if defined(UNIX) +#if defined(POSIX) && !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) /** * Customization of the DefaultSaveFileManager for POSIX platforms. * The only two differences are that the default constructor sets @@ -35,7 +35,6 @@ class POSIXSaveFileManager : public DefaultSaveFileManager { public: POSIXSaveFileManager(); -// POSIXSaveFileManager(const Common::String &defaultSavepath); protected: /** diff --git a/common/savefile.h b/common/savefile.h index 40f316267fa8..03a7b52add42 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -142,7 +142,7 @@ class SaveFileManager : NonCopyable { /** * Request a list of available savegames with a given DOS-style pattern, - * also known as "glob" in the UNIX world. Refer to the Common::matchString() + * also known as "glob" in the POSIX world. Refer to the Common::matchString() * function to learn about the precise pattern format. * @param pattern Pattern to match. Wildcards like * or ? are available. * @return list of strings for all present file names. diff --git a/configure b/configure index 828e99000455..2fc8631f5760 100755 --- a/configure +++ b/configure @@ -147,7 +147,7 @@ _build_scalers=yes _build_hq_scalers=yes _indeo3=auto _enable_prof=no -_unix=no +_posix=no _global_constructors=no _elf_loader=no # Default vkeybd/keymapper options @@ -1548,7 +1548,7 @@ case $_host_os in LDFLAGS="$LDFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm" LDFLAGS="$LDFLAGS -mthumb-interwork" add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" - _unix=yes + _posix=yes _seq_midi=no ;; beos*) @@ -1558,11 +1558,11 @@ case $_host_os in CFLAGS="-I/boot/home/config/include" CXXFLAGS="$CXXFLAGS -fhuge-objects" LIBS="$LIBS -lbind -lsocket" - _unix=yes + _posix=yes _seq_midi=no ;; bsd* | hpux* | netbsd* | openbsd* | sunos*) - _unix=yes + _posix=yes ;; cygwin*) echo ERROR: Cygwin building is not supported by ScummVM anymore. Consider using MinGW. @@ -1572,7 +1572,7 @@ case $_host_os in DEFINES="$DEFINES -DMACOSX" LIBS="$LIBS -framework AudioUnit -framework AudioToolbox -framework Carbon -framework CoreMIDI" add_line_to_config_mk 'MACOSX = 1' - _unix=yes + _posix=yes ;; dreamcast) DEFINES="$DEFINES -D__DC__ -DNONSTANDARD_PORT" @@ -1598,7 +1598,7 @@ case $_host_os in freebsd*) LDFLAGS="$LDFLAGS -L/usr/local/lib" CXXFLAGS="$CXXFLAGS -I/usr/local/include" - _unix=yes + _posix=yes ;; gamecube) CXXFLAGS="$CXXFLAGS -Os -mogc -mcpu=750 -meabi -mhard-float" @@ -1616,14 +1616,14 @@ case $_host_os in DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lnetwork for the timidity MIDI driver LIBS="$LIBS -lnetwork" - _unix=yes + _posix=yes _seq_midi=no ;; irix*) DEFINES="$DEFINES -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" LIBS="$LIBS -lmd -lfastm -lm" _ranlib=: - _unix=yes + _posix=yes ;; linux* | uclinux*) # When not cross-compiling, enable large file support, but don't @@ -1631,7 +1631,7 @@ case $_host_os in if test -z "$_host"; then CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)" fi - _unix=yes + _posix=yes DEFINES="$DEFINES -DLUA_USE_POSIX" ;; mingw*) @@ -1642,7 +1642,7 @@ case $_host_os in ;; mint*) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" - _unix=yes + _posix=yes ;; n64) DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT" @@ -1651,7 +1651,7 @@ case $_host_os in DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; os2-emx*) - _unix=yes # FIXME??? Why?? + _posix=yes # FIXME??? Why?? ;; ps2) # TODO ps2 @@ -1669,7 +1669,7 @@ case $_host_os in DEFINES="$DEFINES -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver LIBS="$LIBS -lnsl -lsocket" - _unix=yes + _posix=yes ;; webos) CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/include -I$WEBOS_PDK/include/SDL -I$WEBOS_PDK/device/usr/include" @@ -1679,7 +1679,7 @@ case $_host_os in LDFLAGS="$LDFLAGS -Wl,--allow-shlib-undefined" LDFLAGS="$LDFLAGS --sysroot=$WEBOS_PDK/arm-gcc/sysroot" add_line_to_config_mk "WEBOS_SDK = $WEBOS_SDK" - _unix=yes + _posix=yes _seq_midi=no ;; wii) @@ -1699,10 +1699,10 @@ case $_host_os in DEFINES="$DEFINES -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT" DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" ;; - # given this is a shell script assume some type of unix + # given this is a shell script assume some type of posix *) echo "WARNING: could not establish system type, assuming unix like" - _unix=yes + _posix=yes ;; esac @@ -1711,7 +1711,7 @@ if test -n "$_host"; then echo "Cross-compiling to $_host" case "$_host" in android | android-v7a) - _unix=yes + _posix=yes # we link a .so as default LDFLAGS="$LDFLAGS -shared -Wl,-Bsymbolic,--no-undefined" HOSTEXEPRE=lib @@ -1724,11 +1724,11 @@ if test -n "$_host"; then _timidity=no ;; arm-linux|arm*-linux-gnueabi|arm-*-linux) - _unix=yes + _posix=yes ;; arm-riscos|linupy) DEFINES="$DEFINES -DLINUPY" - _unix=yes + _posix=yes ;; bfin*) ;; @@ -1744,7 +1744,7 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS" - _unix=yes + _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1758,7 +1758,7 @@ if test -n "$_host"; then _strip=$_host-strip ;; dingux) - DEFINES="$DEFINES -DUNIX -DDINGUX -DDISABLE_DOSBOX_OPL -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DDINGUX -DDISABLE_DOSBOX_OPL -DREDUCE_MEMORY_USAGE" ASFLAGS="$ASFLAGS" CXXFLAGS="$CXXFLAGS -msoft-float -mips32" _backend="dingux" @@ -1818,7 +1818,7 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -march=armv4t" ASFLAGS="$ASFLAGS -mfloat-abi=soft" LDFLAGS="$LDFLAGS -static" - _unix=yes + _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1836,7 +1836,7 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" - _unix=yes + _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1847,14 +1847,14 @@ if test -n "$_host"; then ;; iphone) DEFINES="$DEFINES -DIPHONE" - _unix=yes + _posix=yes _backend="iphone" _build_hq_scalers=no _seq_midi=no ;; m68k-atari-mint) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" - _unix=yes + _posix=yes _ranlib=m68k-atari-mint-ranlib _ar="m68k-atari-mint-ar cru" _seq_midi=no @@ -1872,7 +1872,7 @@ if test -n "$_host"; then motoezx) DEFINES="$DEFINES -DMOTOEZX" ASFLAGS="$ASFLAGS -mfpu=vfp" - _unix=yes + _posix=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1883,7 +1883,7 @@ if test -n "$_host"; then motomagx) DEFINES="$DEFINES -DMOTOMAGX" ASFLAGS="$ASFLAGS -mfpu=vfp" - _unix=yes + _posix=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1915,7 +1915,7 @@ if test -n "$_host"; then ;; neuros) DEFINES="$DEFINES -DNEUROS" - _unix=yes + _posix=yes _backend='null' _build_hq_scalers=no _mt32emu=no @@ -1930,7 +1930,7 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -march=armv7-a -mtune=cortex-a8 -mfpu=neon" ASFLAGS="$ASFLAGS -mfloat-abi=soft" - _unix=yes + _posix=yes _backend="openpandora" _build_hq_scalers=yes _vkeybd=no @@ -1979,13 +1979,13 @@ if test -n "$_host"; then DEFINES="$DEFINES -DSAMSUNGTV -DDISABLE_COMMAND_LINE" ASFLAGS="$ASFLAGS -mfpu=vfp" HOSTEXEEXT=".so" - _unix=yes + _posix=yes _backend="samsungtv" _mt32emu=no _vkeybd=yes ;; webos) - _unix=yes + _posix=yes _backend="webos" _port_mk="backends/platform/webos/webos.mk" _build_scalers=no @@ -2228,9 +2228,9 @@ case $_endian in ;; esac -if test "$_unix" = yes ; then - DEFINES="$DEFINES -DUNIX" - add_line_to_config_mk 'UNIX = 1' +if test "$_posix" = yes ; then + DEFINES="$DEFINES -DPOSIX" + add_line_to_config_mk 'POSIX = 1' fi # @@ -2697,9 +2697,9 @@ fi echocheck "SEQ MIDI" if test "$_seq_midi" = auto ; then # TODO: Test for /dev/sequencer presence? Or maybe just for /dev ? - # For now, we just always enable it when "unix" mode is on (backends + # For now, we just always enable it when "posix" mode is on (backends # that do not want it can disable it by setting _seq_midi=no). - _seq_midi="$_unix" + _seq_midi="$_posix" fi define_in_config_h_if_yes "$_seq_midi" 'USE_SEQ_MIDI' echo "$_seq_midi" @@ -2712,7 +2712,7 @@ if test "$_timidity" = auto ; then # TODO: Is there a good possibility of auto detecting whether we # should include TiMidity support? It can only be used on Unix # currently so we use that as "detection" for now. - _timidity="$_unix" + _timidity="$_posix" fi define_in_config_h_if_yes "$_timidity" 'USE_TIMIDITY' echo "$_timidity" diff --git a/dists/iphone/scummvm.xcodeproj/project.pbxproj b/dists/iphone/scummvm.xcodeproj/project.pbxproj index 08b67b61b32a..d1ab4101d7e3 100755 --- a/dists/iphone/scummvm.xcodeproj/project.pbxproj +++ b/dists/iphone/scummvm.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ 8CB5A9E41253FDF500CB6BC7 /* teenagent.dat in Resources */ = {isa = PBXBuildFile; fileRef = 8CB5A9D81253FDF500CB6BC7 /* teenagent.dat */; }; 8CD1ED0B126202AB00FA198C /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC6126202AA00FA198C /* detection.cpp */; }; 8CD1ED0C126202AB00FA198C /* display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC7126202AA00FA198C /* display.cpp */; }; + 8CD1ED0D126202AB00FA198C /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC9126202AA00FA198C /* engine.cpp */; }; 8CD1ED0E126202AB00FA198C /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCB126202AA00FA198C /* file.cpp */; }; 8CD1ED0F126202AB00FA198C /* hugo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCF126202AA00FA198C /* hugo.cpp */; }; 8CD1ED10126202AB00FA198C /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECD1126202AA00FA198C /* intro.cpp */; }; @@ -67,6 +68,7 @@ 8CD1ED2E126202AB00FA198C /* toon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ED09126202AA00FA198C /* toon.cpp */; }; 8CD1ED2F126202AB00FA198C /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC6126202AA00FA198C /* detection.cpp */; }; 8CD1ED30126202AB00FA198C /* display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC7126202AA00FA198C /* display.cpp */; }; + 8CD1ED31126202AB00FA198C /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC9126202AA00FA198C /* engine.cpp */; }; 8CD1ED32126202AB00FA198C /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCB126202AA00FA198C /* file.cpp */; }; 8CD1ED33126202AB00FA198C /* hugo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCF126202AA00FA198C /* hugo.cpp */; }; 8CD1ED34126202AB00FA198C /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECD1126202AA00FA198C /* intro.cpp */; }; @@ -98,6 +100,7 @@ 8CD1ED52126202AB00FA198C /* toon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ED09126202AA00FA198C /* toon.cpp */; }; 8CD1ED53126202AB00FA198C /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC6126202AA00FA198C /* detection.cpp */; }; 8CD1ED54126202AB00FA198C /* display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC7126202AA00FA198C /* display.cpp */; }; + 8CD1ED55126202AB00FA198C /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECC9126202AA00FA198C /* engine.cpp */; }; 8CD1ED56126202AB00FA198C /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCB126202AA00FA198C /* file.cpp */; }; 8CD1ED57126202AB00FA198C /* hugo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECCF126202AA00FA198C /* hugo.cpp */; }; 8CD1ED58126202AB00FA198C /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CD1ECD1126202AA00FA198C /* intro.cpp */; }; @@ -235,14 +238,41 @@ DF093EA80F63CB26002D821E /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477910D81F4E900B6D1FB /* console.cpp */; }; DF093EA90F63CB26002D821E /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477940D81F4E900B6D1FB /* debugger.cpp */; }; DF093EAA0F63CB26002D821E /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477960D81F4E900B6D1FB /* dialog.cpp */; }; + DF093EAB0F63CB26002D821E /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477980D81F4E900B6D1FB /* editable.cpp */; }; + DF093EAC0F63CB26002D821E /* EditTextWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779A0D81F4E900B6D1FB /* EditTextWidget.cpp */; }; DF093EAD0F63CB26002D821E /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779E0D81F4E900B6D1FB /* Key.cpp */; }; DF093EAE0F63CB26002D821E /* launcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A20D81F4E900B6D1FB /* launcher.cpp */; }; + DF093EAF0F63CB26002D821E /* ListWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A40D81F4E900B6D1FB /* ListWidget.cpp */; }; DF093EB00F63CB26002D821E /* massadd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A60D81F4E900B6D1FB /* massadd.cpp */; }; DF093EB10F63CB26002D821E /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A80D81F4E900B6D1FB /* message.cpp */; }; DF093EB20F63CB26002D821E /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AD0D81F4E900B6D1FB /* object.cpp */; }; DF093EB30F63CB26002D821E /* options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AF0D81F4E900B6D1FB /* options.cpp */; }; + DF093EB40F63CB26002D821E /* PopUpWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B10D81F4E900B6D1FB /* PopUpWidget.cpp */; }; + DF093EB50F63CB26002D821E /* ScrollBarWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B30D81F4E900B6D1FB /* ScrollBarWidget.cpp */; }; + DF093EB60F63CB26002D821E /* TabWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B50D81F4E900B6D1FB /* TabWidget.cpp */; }; DF093EB70F63CB26002D821E /* themebrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477BA0D81F4E900B6D1FB /* themebrowser.cpp */; }; DF093EB80F63CB26002D821E /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477C40D81F4E900B6D1FB /* widget.cpp */; }; + DF093EBB0F63CB26002D821E /* audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CB0D81F4E900B6D1FB /* audiocd.cpp */; }; + DF093EBC0F63CB26002D821E /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CD0D81F4E900B6D1FB /* audiostream.cpp */; }; + DF093EBE0F63CB26002D821E /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D10D81F4E900B6D1FB /* fmopl.cpp */; }; + DF093EC00F63CB26002D821E /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D50D81F4E900B6D1FB /* mididrv.cpp */; }; + DF093EC10F63CB26002D821E /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D70D81F4E900B6D1FB /* midiparser.cpp */; }; + DF093EC20F63CB26002D821E /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D90D81F4E900B6D1FB /* midiparser_smf.cpp */; }; + DF093EC30F63CB26002D821E /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DA0D81F4E900B6D1FB /* midiparser_xmidi.cpp */; }; + DF093EC40F63CB26002D821E /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DB0D81F4E900B6D1FB /* mixer.cpp */; }; + DF093EC50F63CB26002D821E /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DE0D81F4E900B6D1FB /* infogrames.cpp */; }; + DF093EC60F63CB26002D821E /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E00D81F4E900B6D1FB /* module.cpp */; }; + DF093EC70F63CB26002D821E /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E20D81F4E900B6D1FB /* paula.cpp */; }; + DF093EC80F63CB26002D821E /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E40D81F4E900B6D1FB /* protracker.cpp */; }; + DF093EC90F63CB26002D821E /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E60D81F4E900B6D1FB /* rjp1.cpp */; }; + DF093ECA0F63CB26002D821E /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E80D81F4E900B6D1FB /* soundfx.cpp */; }; + DF093ECC0F63CB26002D821E /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477ED0D81F4E900B6D1FB /* mpu401.cpp */; }; + DF093ECD0F63CB26002D821E /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477EF0D81F4E900B6D1FB /* null.cpp */; }; + DF093ECE0F63CB26002D821E /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F00D81F4E900B6D1FB /* rate.cpp */; }; + DF093ECF0F63CB26002D821E /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F70D81F4E900B6D1FB /* adlib.cpp */; }; + DF093ED00F63CB26002D821E /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F90D81F4E900B6D1FB /* fluidsynth.cpp */; }; + DF093ED10F63CB26002D821E /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478210D81F4E900B6D1FB /* pcspk.cpp */; }; + DF093ED20F63CB26002D821E /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478230D81F4E900B6D1FB /* ym2612.cpp */; }; DF093ED60F63CB26002D821E /* memorypool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD511460DF3383500854012 /* memorypool.cpp */; }; DF093ED70F63CB26002D821E /* seq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD517E10DF33CAC00854012 /* seq.cpp */; }; DF093ED80F63CB26002D821E /* scaler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD5183B0DF3411800854012 /* scaler.cpp */; }; @@ -870,6 +900,7 @@ DF09417A0F63CB26002D821E /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A400E7BBBB400F5680E /* archive.cpp */; }; DF09417B0F63CB26002D821E /* unarj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A450E7BBBB400F5680E /* unarj.cpp */; }; DF09417C0F63CB26002D821E /* stdiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6B0E7BBD5700F5680E /* stdiostream.cpp */; }; + DF09417D0F63CB26002D821E /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6F0E7BBDB200F5680E /* musicplugin.cpp */; }; DF09417E0F63CB26002D821E /* saveload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF00ED5FC77001CB19F /* saveload.cpp */; }; DF09417F0F63CB26002D821E /* ThemeEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF40ED5FC77001CB19F /* ThemeEngine.cpp */; }; DF0941800F63CB26002D821E /* ThemeEval.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF60ED5FC77001CB19F /* ThemeEval.cpp */; }; @@ -886,6 +917,7 @@ DF09418B0F63CB26002D821E /* thumbnail_intern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */; }; DF09418C0F63CB26002D821E /* dither.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFB900F485D890006E566 /* dither.cpp */; }; DF0941920F63CB26002D821E /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD10F485DFB0006E566 /* debug.cpp */; }; + DF0941930F63CB26002D821E /* gui-manager.hcpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD50F485E360006E566 /* gui-manager.hcpp */; }; DF0941940F63CB26002D821E /* posix-saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBF80F4860A60006E566 /* posix-saves.cpp */; }; DF0941950F63CB26002D821E /* bmv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC1F0F4862520006E566 /* bmv.cpp */; }; DF0941960F63CB26002D821E /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC200F4862520006E566 /* dialogs.cpp */; }; @@ -957,9 +989,12 @@ DF09420D0F63CB26002D821E /* timer_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF573CBD0F5A85E100961A72 /* timer_lol.cpp */; }; DF0942100F63CB26002D821E /* sprites_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2870F62D55C00D756B6 /* sprites_lol.cpp */; }; DF0942110F63CB26002D821E /* script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2A30F62D79E00D756B6 /* script.cpp */; }; + DF0942140F63CB26002D821E /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2B80F62D91000D756B6 /* timestamp.cpp */; }; DF0942150F63CB26002D821E /* pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5C0F63CAD4002D821E /* pn.cpp */; }; DF0942160F63CB26002D821E /* script_pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5D0F63CAD4002D821E /* script_pn.cpp */; }; DF0942170F63CB26002D821E /* vga_pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5E0F63CAD4002D821E /* vga_pn.cpp */; }; + DF0942430F63CB9A002D821E /* events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0942350F63CB9A002D821E /* events.cpp */; }; + DF0942450F63CB9A002D821E /* graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0942370F63CB9A002D821E /* graphics.cpp */; }; DF0942470F63CB9A002D821E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0942390F63CB9A002D821E /* main.cpp */; }; DF09424A0F63CB9A002D821E /* sdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF09423C0F63CB9A002D821E /* sdl.cpp */; }; DF0943730F63D1DA002D821E /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A170E7BB34E00F5680E /* CoreFoundation.framework */; }; @@ -994,255 +1029,9 @@ DF0E303A1252C5BD0082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E30391252C5BD0082D593 /* cms.cpp */; }; DF0E303B1252C5BD0082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E30391252C5BD0082D593 /* cms.cpp */; }; DF0E303C1252C5BD0082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E30391252C5BD0082D593 /* cms.cpp */; }; - DF203F471380C06E0056300A /* gui-manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F461380C06E0056300A /* gui-manager.cpp */; }; - DF203F481380C06E0056300A /* gui-manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F461380C06E0056300A /* gui-manager.cpp */; }; - DF203F491380C06E0056300A /* gui-manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F461380C06E0056300A /* gui-manager.cpp */; }; - DF203F631380C2750056300A /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F531380C2740056300A /* avi_decoder.cpp */; }; - DF203F641380C2750056300A /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F551380C2740056300A /* coktel_decoder.cpp */; }; - DF203F651380C2750056300A /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F571380C2740056300A /* dxa_decoder.cpp */; }; - DF203F661380C2750056300A /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F591380C2740056300A /* flic_decoder.cpp */; }; - DF203F681380C2750056300A /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5D1380C2740056300A /* qt_decoder.cpp */; }; - DF203F691380C2750056300A /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5F1380C2750056300A /* smk_decoder.cpp */; }; - DF203F6A1380C2750056300A /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F611380C2750056300A /* video_decoder.cpp */; }; - DF203F6B1380C2750056300A /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F531380C2740056300A /* avi_decoder.cpp */; }; - DF203F6C1380C2750056300A /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F551380C2740056300A /* coktel_decoder.cpp */; }; - DF203F6D1380C2750056300A /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F571380C2740056300A /* dxa_decoder.cpp */; }; - DF203F6E1380C2750056300A /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F591380C2740056300A /* flic_decoder.cpp */; }; - DF203F701380C2750056300A /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5D1380C2740056300A /* qt_decoder.cpp */; }; - DF203F711380C2750056300A /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5F1380C2750056300A /* smk_decoder.cpp */; }; - DF203F721380C2750056300A /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F611380C2750056300A /* video_decoder.cpp */; }; - DF203F731380C2750056300A /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F531380C2740056300A /* avi_decoder.cpp */; }; - DF203F741380C2750056300A /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F551380C2740056300A /* coktel_decoder.cpp */; }; - DF203F751380C2750056300A /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F571380C2740056300A /* dxa_decoder.cpp */; }; - DF203F761380C2750056300A /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F591380C2740056300A /* flic_decoder.cpp */; }; - DF203F781380C2750056300A /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5D1380C2740056300A /* qt_decoder.cpp */; }; - DF203F791380C2750056300A /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F5F1380C2750056300A /* smk_decoder.cpp */; }; - DF203F7A1380C2750056300A /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F611380C2750056300A /* video_decoder.cpp */; }; - DF203F951380C2920056300A /* cdtoons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7C1380C2920056300A /* cdtoons.cpp */; }; - DF203F961380C2920056300A /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7E1380C2920056300A /* cinepak.cpp */; }; - DF203F971380C2920056300A /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F811380C2920056300A /* indeo3.cpp */; }; - DF203F981380C2920056300A /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F831380C2920056300A /* mjpeg.cpp */; }; - DF203F991380C2920056300A /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F851380C2920056300A /* msrle.cpp */; }; - DF203F9A1380C2920056300A /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F871380C2920056300A /* msvideo1.cpp */; }; - DF203F9B1380C2920056300A /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F891380C2920056300A /* qdm2.cpp */; }; - DF203F9C1380C2920056300A /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8C1380C2920056300A /* qtrle.cpp */; }; - DF203F9D1380C2920056300A /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8E1380C2920056300A /* rpza.cpp */; }; - DF203F9E1380C2920056300A /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F901380C2920056300A /* smc.cpp */; }; - DF203F9F1380C2920056300A /* truemotion1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F921380C2920056300A /* truemotion1.cpp */; }; - DF203FA01380C2920056300A /* cdtoons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7C1380C2920056300A /* cdtoons.cpp */; }; - DF203FA11380C2920056300A /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7E1380C2920056300A /* cinepak.cpp */; }; - DF203FA21380C2920056300A /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F811380C2920056300A /* indeo3.cpp */; }; - DF203FA31380C2920056300A /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F831380C2920056300A /* mjpeg.cpp */; }; - DF203FA41380C2920056300A /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F851380C2920056300A /* msrle.cpp */; }; - DF203FA51380C2920056300A /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F871380C2920056300A /* msvideo1.cpp */; }; - DF203FA61380C2920056300A /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F891380C2920056300A /* qdm2.cpp */; }; - DF203FA71380C2920056300A /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8C1380C2920056300A /* qtrle.cpp */; }; - DF203FA81380C2920056300A /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8E1380C2920056300A /* rpza.cpp */; }; - DF203FA91380C2920056300A /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F901380C2920056300A /* smc.cpp */; }; - DF203FAA1380C2920056300A /* truemotion1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F921380C2920056300A /* truemotion1.cpp */; }; - DF203FAB1380C2920056300A /* cdtoons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7C1380C2920056300A /* cdtoons.cpp */; }; - DF203FAC1380C2920056300A /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F7E1380C2920056300A /* cinepak.cpp */; }; - DF203FAD1380C2920056300A /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F811380C2920056300A /* indeo3.cpp */; }; - DF203FAE1380C2920056300A /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F831380C2920056300A /* mjpeg.cpp */; }; - DF203FAF1380C2920056300A /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F851380C2920056300A /* msrle.cpp */; }; - DF203FB01380C2920056300A /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F871380C2920056300A /* msvideo1.cpp */; }; - DF203FB11380C2920056300A /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F891380C2920056300A /* qdm2.cpp */; }; - DF203FB21380C2920056300A /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8C1380C2920056300A /* qtrle.cpp */; }; - DF203FB31380C2920056300A /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F8E1380C2920056300A /* rpza.cpp */; }; - DF203FB41380C2920056300A /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F901380C2920056300A /* smc.cpp */; }; - DF203FB51380C2920056300A /* truemotion1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203F921380C2920056300A /* truemotion1.cpp */; }; - DF203FD51380C3BC0056300A /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC01380C3BC0056300A /* console.cpp */; }; - DF203FD61380C3BC0056300A /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC21380C3BC0056300A /* dialogs.cpp */; }; - DF203FD71380C3BC0056300A /* file_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC41380C3BC0056300A /* file_v1d.cpp */; }; - DF203FD81380C3BC0056300A /* file_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC51380C3BC0056300A /* file_v1w.cpp */; }; - DF203FD91380C3BC0056300A /* file_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC61380C3BC0056300A /* file_v2d.cpp */; }; - DF203FDA1380C3BC0056300A /* file_v2w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC71380C3BC0056300A /* file_v2w.cpp */; }; - DF203FDB1380C3BC0056300A /* file_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC81380C3BC0056300A /* file_v3d.cpp */; }; - DF203FDC1380C3BC0056300A /* object_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC91380C3BC0056300A /* object_v1d.cpp */; }; - DF203FDD1380C3BC0056300A /* object_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCA1380C3BC0056300A /* object_v1w.cpp */; }; - DF203FDE1380C3BC0056300A /* object_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCB1380C3BC0056300A /* object_v2d.cpp */; }; - DF203FDF1380C3BC0056300A /* object_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCC1380C3BC0056300A /* object_v3d.cpp */; }; - DF203FE01380C3BC0056300A /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCD1380C3BC0056300A /* object.cpp */; }; - DF203FE11380C3BC0056300A /* parser_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCF1380C3BC0056300A /* parser_v1d.cpp */; }; - DF203FE21380C3BC0056300A /* parser_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD01380C3BC0056300A /* parser_v1w.cpp */; }; - DF203FE31380C3BC0056300A /* parser_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD11380C3BC0056300A /* parser_v2d.cpp */; }; - DF203FE41380C3BC0056300A /* parser_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD21380C3BC0056300A /* parser_v3d.cpp */; }; - DF203FE51380C3BC0056300A /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD31380C3BC0056300A /* text.cpp */; }; - DF203FE61380C3BC0056300A /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC01380C3BC0056300A /* console.cpp */; }; - DF203FE71380C3BC0056300A /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC21380C3BC0056300A /* dialogs.cpp */; }; - DF203FE81380C3BC0056300A /* file_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC41380C3BC0056300A /* file_v1d.cpp */; }; - DF203FE91380C3BC0056300A /* file_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC51380C3BC0056300A /* file_v1w.cpp */; }; - DF203FEA1380C3BC0056300A /* file_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC61380C3BC0056300A /* file_v2d.cpp */; }; - DF203FEB1380C3BC0056300A /* file_v2w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC71380C3BC0056300A /* file_v2w.cpp */; }; - DF203FEC1380C3BC0056300A /* file_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC81380C3BC0056300A /* file_v3d.cpp */; }; - DF203FED1380C3BC0056300A /* object_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC91380C3BC0056300A /* object_v1d.cpp */; }; - DF203FEE1380C3BC0056300A /* object_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCA1380C3BC0056300A /* object_v1w.cpp */; }; - DF203FEF1380C3BC0056300A /* object_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCB1380C3BC0056300A /* object_v2d.cpp */; }; - DF203FF01380C3BC0056300A /* object_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCC1380C3BC0056300A /* object_v3d.cpp */; }; - DF203FF11380C3BC0056300A /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCD1380C3BC0056300A /* object.cpp */; }; - DF203FF21380C3BC0056300A /* parser_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCF1380C3BC0056300A /* parser_v1d.cpp */; }; - DF203FF31380C3BC0056300A /* parser_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD01380C3BC0056300A /* parser_v1w.cpp */; }; - DF203FF41380C3BC0056300A /* parser_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD11380C3BC0056300A /* parser_v2d.cpp */; }; - DF203FF51380C3BC0056300A /* parser_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD21380C3BC0056300A /* parser_v3d.cpp */; }; - DF203FF61380C3BC0056300A /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD31380C3BC0056300A /* text.cpp */; }; - DF203FF71380C3BC0056300A /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC01380C3BC0056300A /* console.cpp */; }; - DF203FF81380C3BC0056300A /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC21380C3BC0056300A /* dialogs.cpp */; }; - DF203FF91380C3BC0056300A /* file_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC41380C3BC0056300A /* file_v1d.cpp */; }; - DF203FFA1380C3BC0056300A /* file_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC51380C3BC0056300A /* file_v1w.cpp */; }; - DF203FFB1380C3BC0056300A /* file_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC61380C3BC0056300A /* file_v2d.cpp */; }; - DF203FFC1380C3BC0056300A /* file_v2w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC71380C3BC0056300A /* file_v2w.cpp */; }; - DF203FFD1380C3BC0056300A /* file_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC81380C3BC0056300A /* file_v3d.cpp */; }; - DF203FFE1380C3BC0056300A /* object_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FC91380C3BC0056300A /* object_v1d.cpp */; }; - DF203FFF1380C3BC0056300A /* object_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCA1380C3BC0056300A /* object_v1w.cpp */; }; - DF2040001380C3BC0056300A /* object_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCB1380C3BC0056300A /* object_v2d.cpp */; }; - DF2040011380C3BC0056300A /* object_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCC1380C3BC0056300A /* object_v3d.cpp */; }; - DF2040021380C3BC0056300A /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCD1380C3BC0056300A /* object.cpp */; }; - DF2040031380C3BC0056300A /* parser_v1d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FCF1380C3BC0056300A /* parser_v1d.cpp */; }; - DF2040041380C3BC0056300A /* parser_v1w.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD01380C3BC0056300A /* parser_v1w.cpp */; }; - DF2040051380C3BC0056300A /* parser_v2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD11380C3BC0056300A /* parser_v2d.cpp */; }; - DF2040061380C3BC0056300A /* parser_v3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD21380C3BC0056300A /* parser_v3d.cpp */; }; - DF2040071380C3BC0056300A /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF203FD31380C3BC0056300A /* text.cpp */; }; - DF20402E1380C8B70056300A /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040221380C8B70056300A /* editable.cpp */; }; - DF20402F1380C8B70056300A /* edittext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040241380C8B70056300A /* edittext.cpp */; }; - DF2040301380C8B70056300A /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040261380C8B70056300A /* list.cpp */; }; - DF2040311380C8B70056300A /* popup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040281380C8B70056300A /* popup.cpp */; }; - DF2040321380C8B70056300A /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402A1380C8B70056300A /* scrollbar.cpp */; }; - DF2040331380C8B70056300A /* tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402C1380C8B70056300A /* tab.cpp */; }; - DF2040341380C8B70056300A /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040221380C8B70056300A /* editable.cpp */; }; - DF2040351380C8B70056300A /* edittext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040241380C8B70056300A /* edittext.cpp */; }; - DF2040361380C8B70056300A /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040261380C8B70056300A /* list.cpp */; }; - DF2040371380C8B70056300A /* popup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040281380C8B70056300A /* popup.cpp */; }; - DF2040381380C8B70056300A /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402A1380C8B70056300A /* scrollbar.cpp */; }; - DF2040391380C8B70056300A /* tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402C1380C8B70056300A /* tab.cpp */; }; - DF20403A1380C8B70056300A /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040221380C8B70056300A /* editable.cpp */; }; - DF20403B1380C8B70056300A /* edittext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040241380C8B70056300A /* edittext.cpp */; }; - DF20403C1380C8B70056300A /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040261380C8B70056300A /* list.cpp */; }; - DF20403D1380C8B70056300A /* popup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040281380C8B70056300A /* popup.cpp */; }; - DF20403E1380C8B70056300A /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402A1380C8B70056300A /* scrollbar.cpp */; }; - DF20403F1380C8B70056300A /* tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20402C1380C8B70056300A /* tab.cpp */; }; - DF20405E1380CA230056300A /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040471380CA230056300A /* audiostream.cpp */; }; - DF20405F1380CA230056300A /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040491380CA230056300A /* fmopl.cpp */; }; - DF2040601380CA230056300A /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404B1380CA230056300A /* mididrv.cpp */; }; - DF2040611380CA230056300A /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404D1380CA230056300A /* midiparser_smf.cpp */; }; - DF2040621380CA230056300A /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404E1380CA230056300A /* midiparser_xmidi.cpp */; }; - DF2040631380CA230056300A /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404F1380CA230056300A /* midiparser.cpp */; }; - DF2040641380CA230056300A /* midiplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040511380CA230056300A /* midiplayer.cpp */; }; - DF2040651380CA230056300A /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040541380CA230056300A /* mixer.cpp */; }; - DF2040661380CA230056300A /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040561380CA230056300A /* mpu401.cpp */; }; - DF2040671380CA230056300A /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040581380CA230056300A /* musicplugin.cpp */; }; - DF2040681380CA230056300A /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405A1380CA230056300A /* rate.cpp */; }; - DF2040691380CA230056300A /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405C1380CA230056300A /* timestamp.cpp */; }; - DF20406A1380CA230056300A /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040471380CA230056300A /* audiostream.cpp */; }; - DF20406B1380CA230056300A /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040491380CA230056300A /* fmopl.cpp */; }; - DF20406C1380CA230056300A /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404B1380CA230056300A /* mididrv.cpp */; }; - DF20406D1380CA230056300A /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404D1380CA230056300A /* midiparser_smf.cpp */; }; - DF20406E1380CA230056300A /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404E1380CA230056300A /* midiparser_xmidi.cpp */; }; - DF20406F1380CA230056300A /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404F1380CA230056300A /* midiparser.cpp */; }; - DF2040701380CA230056300A /* midiplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040511380CA230056300A /* midiplayer.cpp */; }; - DF2040711380CA230056300A /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040541380CA230056300A /* mixer.cpp */; }; - DF2040721380CA230056300A /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040561380CA230056300A /* mpu401.cpp */; }; - DF2040731380CA230056300A /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040581380CA230056300A /* musicplugin.cpp */; }; - DF2040741380CA230056300A /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405A1380CA230056300A /* rate.cpp */; }; - DF2040751380CA230056300A /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405C1380CA230056300A /* timestamp.cpp */; }; - DF2040761380CA230056300A /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040471380CA230056300A /* audiostream.cpp */; }; - DF2040771380CA230056300A /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040491380CA230056300A /* fmopl.cpp */; }; - DF2040781380CA230056300A /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404B1380CA230056300A /* mididrv.cpp */; }; - DF2040791380CA230056300A /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404D1380CA230056300A /* midiparser_smf.cpp */; }; - DF20407A1380CA230056300A /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404E1380CA230056300A /* midiparser_xmidi.cpp */; }; - DF20407B1380CA230056300A /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20404F1380CA230056300A /* midiparser.cpp */; }; - DF20407C1380CA230056300A /* midiplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040511380CA230056300A /* midiplayer.cpp */; }; - DF20407D1380CA230056300A /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040541380CA230056300A /* mixer.cpp */; }; - DF20407E1380CA230056300A /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040561380CA230056300A /* mpu401.cpp */; }; - DF20407F1380CA230056300A /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040581380CA230056300A /* musicplugin.cpp */; }; - DF2040801380CA230056300A /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405A1380CA230056300A /* rate.cpp */; }; - DF2040811380CA230056300A /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20405C1380CA230056300A /* timestamp.cpp */; }; - DF20409A1380CA400056300A /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040841380CA400056300A /* adpcm.cpp */; }; - DF20409B1380CA400056300A /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040861380CA400056300A /* aiff.cpp */; }; - DF20409C1380CA400056300A /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040881380CA400056300A /* flac.cpp */; }; - DF20409D1380CA400056300A /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408A1380CA400056300A /* iff_sound.cpp */; }; - DF20409E1380CA400056300A /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408C1380CA400056300A /* mac_snd.cpp */; }; - DF20409F1380CA400056300A /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408E1380CA400056300A /* mp3.cpp */; }; - DF2040A01380CA400056300A /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040901380CA400056300A /* raw.cpp */; }; - DF2040A11380CA400056300A /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040921380CA400056300A /* vag.cpp */; }; - DF2040A21380CA400056300A /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040941380CA400056300A /* voc.cpp */; }; - DF2040A31380CA400056300A /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040961380CA400056300A /* vorbis.cpp */; }; - DF2040A41380CA400056300A /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040981380CA400056300A /* wave.cpp */; }; - DF2040A51380CA400056300A /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040841380CA400056300A /* adpcm.cpp */; }; - DF2040A61380CA400056300A /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040861380CA400056300A /* aiff.cpp */; }; - DF2040A71380CA400056300A /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040881380CA400056300A /* flac.cpp */; }; - DF2040A81380CA400056300A /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408A1380CA400056300A /* iff_sound.cpp */; }; - DF2040A91380CA400056300A /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408C1380CA400056300A /* mac_snd.cpp */; }; - DF2040AA1380CA400056300A /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408E1380CA400056300A /* mp3.cpp */; }; - DF2040AB1380CA400056300A /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040901380CA400056300A /* raw.cpp */; }; - DF2040AC1380CA400056300A /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040921380CA400056300A /* vag.cpp */; }; - DF2040AD1380CA400056300A /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040941380CA400056300A /* voc.cpp */; }; - DF2040AE1380CA400056300A /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040961380CA400056300A /* vorbis.cpp */; }; - DF2040AF1380CA400056300A /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040981380CA400056300A /* wave.cpp */; }; - DF2040B01380CA400056300A /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040841380CA400056300A /* adpcm.cpp */; }; - DF2040B11380CA400056300A /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040861380CA400056300A /* aiff.cpp */; }; - DF2040B21380CA400056300A /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040881380CA400056300A /* flac.cpp */; }; - DF2040B31380CA400056300A /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408A1380CA400056300A /* iff_sound.cpp */; }; - DF2040B41380CA400056300A /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408C1380CA400056300A /* mac_snd.cpp */; }; - DF2040B51380CA400056300A /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF20408E1380CA400056300A /* mp3.cpp */; }; - DF2040B61380CA400056300A /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040901380CA400056300A /* raw.cpp */; }; - DF2040B71380CA400056300A /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040921380CA400056300A /* vag.cpp */; }; - DF2040B81380CA400056300A /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040941380CA400056300A /* voc.cpp */; }; - DF2040B91380CA400056300A /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040961380CA400056300A /* vorbis.cpp */; }; - DF2040BA1380CA400056300A /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040981380CA400056300A /* wave.cpp */; }; - DF2040CC1380CA810056300A /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BC1380CA810056300A /* infogrames.cpp */; }; - DF2040CD1380CA810056300A /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BE1380CA810056300A /* maxtrax.cpp */; }; - DF2040CE1380CA810056300A /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C01380CA810056300A /* module.cpp */; }; - DF2040CF1380CA810056300A /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C21380CA810056300A /* paula.cpp */; }; - DF2040D01380CA810056300A /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C41380CA810056300A /* protracker.cpp */; }; - DF2040D11380CA810056300A /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C61380CA810056300A /* rjp1.cpp */; }; - DF2040D21380CA810056300A /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C81380CA810056300A /* soundfx.cpp */; }; - DF2040D31380CA810056300A /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040CA1380CA810056300A /* tfmx.cpp */; }; - DF2040D41380CA810056300A /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BC1380CA810056300A /* infogrames.cpp */; }; - DF2040D51380CA810056300A /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BE1380CA810056300A /* maxtrax.cpp */; }; - DF2040D61380CA810056300A /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C01380CA810056300A /* module.cpp */; }; - DF2040D71380CA810056300A /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C21380CA810056300A /* paula.cpp */; }; - DF2040D81380CA810056300A /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C41380CA810056300A /* protracker.cpp */; }; - DF2040D91380CA810056300A /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C61380CA810056300A /* rjp1.cpp */; }; - DF2040DA1380CA810056300A /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C81380CA810056300A /* soundfx.cpp */; }; - DF2040DB1380CA810056300A /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040CA1380CA810056300A /* tfmx.cpp */; }; - DF2040DC1380CA810056300A /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BC1380CA810056300A /* infogrames.cpp */; }; - DF2040DD1380CA810056300A /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040BE1380CA810056300A /* maxtrax.cpp */; }; - DF2040DE1380CA810056300A /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C01380CA810056300A /* module.cpp */; }; - DF2040DF1380CA810056300A /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C21380CA810056300A /* paula.cpp */; }; - DF2040E01380CA810056300A /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C41380CA810056300A /* protracker.cpp */; }; - DF2040E11380CA810056300A /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C61380CA810056300A /* rjp1.cpp */; }; - DF2040E21380CA810056300A /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040C81380CA810056300A /* soundfx.cpp */; }; - DF2040E31380CA810056300A /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040CA1380CA810056300A /* tfmx.cpp */; }; - DF2040F41380CAA40056300A /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E51380CAA40056300A /* adlib.cpp */; }; - DF2040F51380CAA40056300A /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E61380CAA40056300A /* appleiigs.cpp */; }; - DF2040F61380CAA40056300A /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E71380CAA40056300A /* cms.cpp */; }; - DF2040F71380CAA40056300A /* eas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E91380CAA40056300A /* eas.cpp */; }; - DF2040F81380CAA40056300A /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EB1380CAA40056300A /* fluidsynth.cpp */; }; - DF2040F91380CAA40056300A /* mt32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EC1380CAA40056300A /* mt32.cpp */; }; - DF2040FA1380CAA40056300A /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040ED1380CAA40056300A /* pcspk.cpp */; }; - DF2040FB1380CAA40056300A /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EF1380CAA40056300A /* sid.cpp */; }; - DF2040FC1380CAA40056300A /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F11380CAA40056300A /* wave6581.cpp */; }; - DF2040FD1380CAA40056300A /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F21380CAA40056300A /* ym2612.cpp */; }; - DF2040FE1380CAA40056300A /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E51380CAA40056300A /* adlib.cpp */; }; - DF2040FF1380CAA40056300A /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E61380CAA40056300A /* appleiigs.cpp */; }; - DF2041001380CAA40056300A /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E71380CAA40056300A /* cms.cpp */; }; - DF2041011380CAA40056300A /* eas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E91380CAA40056300A /* eas.cpp */; }; - DF2041021380CAA40056300A /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EB1380CAA40056300A /* fluidsynth.cpp */; }; - DF2041031380CAA40056300A /* mt32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EC1380CAA40056300A /* mt32.cpp */; }; - DF2041041380CAA40056300A /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040ED1380CAA40056300A /* pcspk.cpp */; }; - DF2041051380CAA40056300A /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EF1380CAA40056300A /* sid.cpp */; }; - DF2041061380CAA40056300A /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F11380CAA40056300A /* wave6581.cpp */; }; - DF2041071380CAA40056300A /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F21380CAA40056300A /* ym2612.cpp */; }; - DF2041081380CAA40056300A /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E51380CAA40056300A /* adlib.cpp */; }; - DF2041091380CAA40056300A /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E61380CAA40056300A /* appleiigs.cpp */; }; - DF20410A1380CAA40056300A /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E71380CAA40056300A /* cms.cpp */; }; - DF20410B1380CAA40056300A /* eas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040E91380CAA40056300A /* eas.cpp */; }; - DF20410C1380CAA40056300A /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EB1380CAA40056300A /* fluidsynth.cpp */; }; - DF20410D1380CAA40056300A /* mt32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EC1380CAA40056300A /* mt32.cpp */; }; - DF20410E1380CAA40056300A /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040ED1380CAA40056300A /* pcspk.cpp */; }; - DF20410F1380CAA40056300A /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040EF1380CAA40056300A /* sid.cpp */; }; - DF2041101380CAA40056300A /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F11380CAA40056300A /* wave6581.cpp */; }; - DF2041111380CAA40056300A /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2040F21380CAA40056300A /* ym2612.cpp */; }; + DF0E30411252C6090082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E303F1252C6090082D593 /* cms.cpp */; }; + DF0E30421252C6090082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E303F1252C6090082D593 /* cms.cpp */; }; + DF0E30431252C6090082D593 /* cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E303F1252C6090082D593 /* cms.cpp */; }; DF224E040FB23BC500C8E453 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF224E020FB23BC500C8E453 /* OpenGLES.framework */; }; DF224E050FB23BC500C8E453 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF224E020FB23BC500C8E453 /* OpenGLES.framework */; }; DF2EC3E510E6490800765801 /* browser_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC3E410E6490800765801 /* browser_osx.mm */; }; @@ -1264,8 +1053,15 @@ DF2EC50B10E64DB300765801 /* textconsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC50910E64DB300765801 /* textconsole.cpp */; }; DF2EC50C10E64DB300765801 /* textconsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC50910E64DB300765801 /* textconsole.cpp */; }; DF2EC50D10E64DB300765801 /* textconsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC50910E64DB300765801 /* textconsole.cpp */; }; + DF2EC51210E64E3100765801 /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51010E64E3100765801 /* sid.cpp */; }; + DF2EC51310E64E3100765801 /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51010E64E3100765801 /* sid.cpp */; }; + DF2EC51410E64E3100765801 /* sid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51010E64E3100765801 /* sid.cpp */; }; + DF2EC51810E64EE600765801 /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51710E64EE600765801 /* wave6581.cpp */; }; + DF2EC51910E64EE600765801 /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51710E64EE600765801 /* wave6581.cpp */; }; + DF2EC51A10E64EE600765801 /* wave6581.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2EC51710E64EE600765801 /* wave6581.cpp */; }; DF2FFB930F485D890006E566 /* dither.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFB900F485D890006E566 /* dither.cpp */; }; DF2FFBD30F485DFB0006E566 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD10F485DFB0006E566 /* debug.cpp */; }; + DF2FFBD90F485E360006E566 /* gui-manager.hcpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD50F485E360006E566 /* gui-manager.hcpp */; }; DF2FFBFC0F4860A60006E566 /* posix-saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBF80F4860A60006E566 /* posix-saves.cpp */; }; DF2FFC290F4862520006E566 /* bmv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC1F0F4862520006E566 /* bmv.cpp */; }; DF2FFC2A0F4862520006E566 /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC200F4862520006E566 /* dialogs.cpp */; }; @@ -1313,6 +1109,36 @@ DF2FFD2B0F48717F0006E566 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DF2FFD290F48717F0006E566 /* Default.png */; }; DF2FFD2C0F48717F0006E566 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = DF2FFD2A0F48717F0006E566 /* icon.png */; }; DF2FFD2D0F48719E0006E566 /* scummclassic.zip in Resources */ = {isa = PBXBuildFile; fileRef = DF2FFBDB0F485E480006E566 /* scummclassic.zip */; }; + DF45B11F116627DA009B85CC /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0F7116627DA009B85CC /* adpcm.cpp */; }; + DF45B121116627DA009B85CC /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FA116627DA009B85CC /* aiff.cpp */; }; + DF45B123116627DA009B85CC /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FD116627DA009B85CC /* flac.cpp */; }; + DF45B125116627DA009B85CC /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B100116627DA009B85CC /* iff_sound.cpp */; }; + DF45B127116627DA009B85CC /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B103116627DA009B85CC /* mp3.cpp */; }; + DF45B129116627DA009B85CC /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B106116627DA009B85CC /* raw.cpp */; }; + DF45B12B116627DA009B85CC /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B109116627DA009B85CC /* vag.cpp */; }; + DF45B12D116627DA009B85CC /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10C116627DA009B85CC /* voc.cpp */; }; + DF45B12F116627DA009B85CC /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10F116627DA009B85CC /* vorbis.cpp */; }; + DF45B131116627DA009B85CC /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B112116627DA009B85CC /* wave.cpp */; }; + DF45B13D116627DA009B85CC /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0F7116627DA009B85CC /* adpcm.cpp */; }; + DF45B13F116627DA009B85CC /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FA116627DA009B85CC /* aiff.cpp */; }; + DF45B141116627DA009B85CC /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FD116627DA009B85CC /* flac.cpp */; }; + DF45B143116627DA009B85CC /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B100116627DA009B85CC /* iff_sound.cpp */; }; + DF45B145116627DA009B85CC /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B103116627DA009B85CC /* mp3.cpp */; }; + DF45B147116627DA009B85CC /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B106116627DA009B85CC /* raw.cpp */; }; + DF45B149116627DA009B85CC /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B109116627DA009B85CC /* vag.cpp */; }; + DF45B14B116627DA009B85CC /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10C116627DA009B85CC /* voc.cpp */; }; + DF45B14D116627DA009B85CC /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10F116627DA009B85CC /* vorbis.cpp */; }; + DF45B14F116627DA009B85CC /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B112116627DA009B85CC /* wave.cpp */; }; + DF45B15B116627DA009B85CC /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0F7116627DA009B85CC /* adpcm.cpp */; }; + DF45B15D116627DA009B85CC /* aiff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FA116627DA009B85CC /* aiff.cpp */; }; + DF45B15F116627DA009B85CC /* flac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B0FD116627DA009B85CC /* flac.cpp */; }; + DF45B161116627DA009B85CC /* iff_sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B100116627DA009B85CC /* iff_sound.cpp */; }; + DF45B163116627DA009B85CC /* mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B103116627DA009B85CC /* mp3.cpp */; }; + DF45B165116627DA009B85CC /* raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B106116627DA009B85CC /* raw.cpp */; }; + DF45B167116627DA009B85CC /* vag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B109116627DA009B85CC /* vag.cpp */; }; + DF45B169116627DA009B85CC /* voc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10C116627DA009B85CC /* voc.cpp */; }; + DF45B16B116627DA009B85CC /* vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B10F116627DA009B85CC /* vorbis.cpp */; }; + DF45B16D116627DA009B85CC /* wave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B112116627DA009B85CC /* wave.cpp */; }; DF45B1CA116628A5009B85CC /* animate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B176116628A5009B85CC /* animate.cpp */; }; DF45B1CB116628A5009B85CC /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B178116628A5009B85CC /* cache.cpp */; }; DF45B1CC116628A5009B85CC /* compare.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B17A116628A5009B85CC /* compare.cpp */; }; @@ -1403,137 +1229,6 @@ DF45B244116628A5009B85CC /* music.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C1116628A5009B85CC /* music.cpp */; }; DF45B245116628A5009B85CC /* soundcmd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C3116628A5009B85CC /* soundcmd.cpp */; }; DF45B246116628A5009B85CC /* seq_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C6116628A5009B85CC /* seq_decoder.cpp */; }; - DF46B6F31381E18900D08723 /* coroutine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F21381E18900D08723 /* coroutine.cpp */; }; - DF46B6F41381E18900D08723 /* coroutine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F21381E18900D08723 /* coroutine.cpp */; }; - DF46B6F51381E18900D08723 /* coroutine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F21381E18900D08723 /* coroutine.cpp */; }; - DF46B6FF1381E1FF00D08723 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F71381E1FF00D08723 /* towns_audio.cpp */; }; - DF46B7001381E1FF00D08723 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F91381E1FF00D08723 /* towns_euphony.cpp */; }; - DF46B7011381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FB1381E1FF00D08723 /* towns_pc98_driver.cpp */; }; - DF46B7021381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FD1381E1FF00D08723 /* towns_pc98_fmsynth.cpp */; }; - DF46B7031381E1FF00D08723 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F71381E1FF00D08723 /* towns_audio.cpp */; }; - DF46B7041381E1FF00D08723 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F91381E1FF00D08723 /* towns_euphony.cpp */; }; - DF46B7051381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FB1381E1FF00D08723 /* towns_pc98_driver.cpp */; }; - DF46B7061381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FD1381E1FF00D08723 /* towns_pc98_fmsynth.cpp */; }; - DF46B7071381E1FF00D08723 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F71381E1FF00D08723 /* towns_audio.cpp */; }; - DF46B7081381E1FF00D08723 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6F91381E1FF00D08723 /* towns_euphony.cpp */; }; - DF46B7091381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FB1381E1FF00D08723 /* towns_pc98_driver.cpp */; }; - DF46B70A1381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B6FD1381E1FF00D08723 /* towns_pc98_fmsynth.cpp */; }; - DF46B7191381E27000D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B70F1381E27000D08723 /* console.cpp */; }; - DF46B71A1381E27000D08723 /* databases.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7111381E27000D08723 /* databases.cpp */; }; - DF46B71B1381E27000D08723 /* dbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7131381E27000D08723 /* dbase.cpp */; }; - DF46B71C1381E27000D08723 /* iniconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7151381E27000D08723 /* iniconfig.cpp */; }; - DF46B71D1381E27000D08723 /* init_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7171381E27000D08723 /* init_v7.cpp */; }; - DF46B71E1381E27000D08723 /* inter_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7181381E27000D08723 /* inter_inca2.cpp */; }; - DF46B71F1381E27000D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B70F1381E27000D08723 /* console.cpp */; }; - DF46B7201381E27000D08723 /* databases.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7111381E27000D08723 /* databases.cpp */; }; - DF46B7211381E27000D08723 /* dbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7131381E27000D08723 /* dbase.cpp */; }; - DF46B7221381E27000D08723 /* iniconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7151381E27000D08723 /* iniconfig.cpp */; }; - DF46B7231381E27000D08723 /* init_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7171381E27000D08723 /* init_v7.cpp */; }; - DF46B7241381E27000D08723 /* inter_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7181381E27000D08723 /* inter_inca2.cpp */; }; - DF46B7251381E27000D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B70F1381E27000D08723 /* console.cpp */; }; - DF46B7261381E27000D08723 /* databases.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7111381E27000D08723 /* databases.cpp */; }; - DF46B7271381E27000D08723 /* dbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7131381E27000D08723 /* dbase.cpp */; }; - DF46B7281381E27000D08723 /* iniconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7151381E27000D08723 /* iniconfig.cpp */; }; - DF46B7291381E27000D08723 /* init_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7171381E27000D08723 /* init_v7.cpp */; }; - DF46B72A1381E27000D08723 /* inter_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7181381E27000D08723 /* inter_inca2.cpp */; }; - DF46B7441381E40500D08723 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7421381E40500D08723 /* log.cpp */; }; - DF46B7451381E40500D08723 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7421381E40500D08723 /* log.cpp */; }; - DF46B7461381E40500D08723 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7421381E40500D08723 /* log.cpp */; }; - DF46B7491381E40F00D08723 /* modular-backend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7471381E40F00D08723 /* modular-backend.cpp */; }; - DF46B74A1381E40F00D08723 /* modular-backend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7471381E40F00D08723 /* modular-backend.cpp */; }; - DF46B74B1381E40F00D08723 /* modular-backend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7471381E40F00D08723 /* modular-backend.cpp */; }; - DF46B7541381E46700D08723 /* player_v2base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7511381E46700D08723 /* player_v2base.cpp */; }; - DF46B7551381E46700D08723 /* player_v2base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7511381E46700D08723 /* player_v2base.cpp */; }; - DF46B7561381E46700D08723 /* player_v2base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7511381E46700D08723 /* player_v2base.cpp */; }; - DF46B75E1381E4A400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B75B1381E4A400D08723 /* console.cpp */; }; - DF46B75F1381E4A400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B75B1381E4A400D08723 /* console.cpp */; }; - DF46B7601381E4A400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B75B1381E4A400D08723 /* console.cpp */; }; - DF46B7631381E4D400D08723 /* robot_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7611381E4D400D08723 /* robot_decoder.cpp */; }; - DF46B7641381E4D400D08723 /* robot_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7611381E4D400D08723 /* robot_decoder.cpp */; }; - DF46B7651381E4D400D08723 /* robot_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7611381E4D400D08723 /* robot_decoder.cpp */; }; - DF46B7671381E4E400D08723 /* vm_types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7661381E4E400D08723 /* vm_types.cpp */; }; - DF46B7681381E4E400D08723 /* vm_types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7661381E4E400D08723 /* vm_types.cpp */; }; - DF46B7691381E4E400D08723 /* vm_types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7661381E4E400D08723 /* vm_types.cpp */; }; - DF46B77B1381E54200D08723 /* dcl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B76F1381E54200D08723 /* dcl.cpp */; }; - DF46B77C1381E54200D08723 /* iff_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7721381E54200D08723 /* iff_container.cpp */; }; - DF46B77D1381E54200D08723 /* winexe_ne.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7751381E54200D08723 /* winexe_ne.cpp */; }; - DF46B77E1381E54200D08723 /* winexe_pe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7771381E54200D08723 /* winexe_pe.cpp */; }; - DF46B77F1381E54200D08723 /* winexe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7791381E54200D08723 /* winexe.cpp */; }; - DF46B7801381E54200D08723 /* dcl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B76F1381E54200D08723 /* dcl.cpp */; }; - DF46B7811381E54200D08723 /* iff_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7721381E54200D08723 /* iff_container.cpp */; }; - DF46B7821381E54200D08723 /* winexe_ne.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7751381E54200D08723 /* winexe_ne.cpp */; }; - DF46B7831381E54200D08723 /* winexe_pe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7771381E54200D08723 /* winexe_pe.cpp */; }; - DF46B7841381E54200D08723 /* winexe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7791381E54200D08723 /* winexe.cpp */; }; - DF46B7851381E54200D08723 /* dcl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B76F1381E54200D08723 /* dcl.cpp */; }; - DF46B7861381E54200D08723 /* iff_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7721381E54200D08723 /* iff_container.cpp */; }; - DF46B7871381E54200D08723 /* winexe_ne.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7751381E54200D08723 /* winexe_ne.cpp */; }; - DF46B7881381E54200D08723 /* winexe_pe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7771381E54200D08723 /* winexe_pe.cpp */; }; - DF46B7891381E54200D08723 /* winexe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7791381E54200D08723 /* winexe.cpp */; }; - DF46B7931381E58000D08723 /* png.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B78F1381E58000D08723 /* png.cpp */; }; - DF46B7941381E58000D08723 /* wincursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7911381E58000D08723 /* wincursor.cpp */; }; - DF46B7951381E58000D08723 /* png.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B78F1381E58000D08723 /* png.cpp */; }; - DF46B7961381E58000D08723 /* wincursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7911381E58000D08723 /* wincursor.cpp */; }; - DF46B7971381E58000D08723 /* png.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B78F1381E58000D08723 /* png.cpp */; }; - DF46B7981381E58000D08723 /* wincursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7911381E58000D08723 /* wincursor.cpp */; }; - DF46B79F1381E5B500D08723 /* winfont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B79D1381E5B500D08723 /* winfont.cpp */; }; - DF46B7A01381E5B500D08723 /* winfont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B79D1381E5B500D08723 /* winfont.cpp */; }; - DF46B7A11381E5B500D08723 /* winfont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B79D1381E5B500D08723 /* winfont.cpp */; }; - DF46B7A51381E5D900D08723 /* sdl-timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7A31381E5D900D08723 /* sdl-timer.cpp */; }; - DF46B7A91381E5F100D08723 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7A81381E5F100D08723 /* header.cpp */; }; - DF46B7AA1381E5F100D08723 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7A81381E5F100D08723 /* header.cpp */; }; - DF46B7AB1381E5F100D08723 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7A81381E5F100D08723 /* header.cpp */; }; - DF46B7B41381E67800D08723 /* sdl-mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7B21381E67800D08723 /* sdl-mutex.cpp */; }; - DF46B7B51381E67800D08723 /* sdl-mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7B21381E67800D08723 /* sdl-mutex.cpp */; }; - DF46B7B61381E67800D08723 /* sdl-mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7B21381E67800D08723 /* sdl-mutex.cpp */; }; - DF46B7BD1381E6C000D08723 /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7BB1381E6C000D08723 /* object.cpp */; }; - DF46B7BE1381E6C000D08723 /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7BB1381E6C000D08723 /* object.cpp */; }; - DF46B7BF1381E6C000D08723 /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7BB1381E6C000D08723 /* object.cpp */; }; - DF46B7C81381E72500D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7C61381E72500D08723 /* console.cpp */; }; - DF46B7C91381E72500D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7C61381E72500D08723 /* console.cpp */; }; - DF46B7CA1381E72500D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7C61381E72500D08723 /* console.cpp */; }; - DF46B7CF1381E76300D08723 /* sdl-events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7CD1381E76300D08723 /* sdl-events.cpp */; }; - DF46B7D61381E7C600D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7D41381E7C600D08723 /* console.cpp */; }; - DF46B7D71381E7C600D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7D41381E7C600D08723 /* console.cpp */; }; - DF46B7D81381E7C600D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B7D41381E7C600D08723 /* console.cpp */; }; - DF46B83C1381F13500D08723 /* saveload_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B83B1381F13500D08723 /* saveload_v7.cpp */; }; - DF46B83D1381F13500D08723 /* saveload_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B83B1381F13500D08723 /* saveload_v7.cpp */; }; - DF46B83E1381F13500D08723 /* saveload_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B83B1381F13500D08723 /* saveload_v7.cpp */; }; - DF46B8441381F35500D08723 /* saveload_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8431381F35500D08723 /* saveload_inca2.cpp */; }; - DF46B8451381F35500D08723 /* saveload_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8431381F35500D08723 /* saveload_inca2.cpp */; }; - DF46B8461381F35500D08723 /* saveload_inca2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8431381F35500D08723 /* saveload_inca2.cpp */; }; - DF46B8481381F38700D08723 /* inter_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8471381F38700D08723 /* inter_v7.cpp */; }; - DF46B8491381F38700D08723 /* inter_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8471381F38700D08723 /* inter_v7.cpp */; }; - DF46B84A1381F38700D08723 /* inter_v7.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8471381F38700D08723 /* inter_v7.cpp */; }; - DF46B84D1381F39E00D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B84B1381F39E00D08723 /* console.cpp */; }; - DF46B84E1381F39E00D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B84B1381F39E00D08723 /* console.cpp */; }; - DF46B84F1381F39E00D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B84B1381F39E00D08723 /* console.cpp */; }; - DF46B8521381F3B400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8501381F3B400D08723 /* console.cpp */; }; - DF46B8531381F3B400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8501381F3B400D08723 /* console.cpp */; }; - DF46B8541381F3B400D08723 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8501381F3B400D08723 /* console.cpp */; }; - DF46B8601381F44E00D08723 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85A1381F44E00D08723 /* dbopl.cpp */; }; - DF46B8611381F44E00D08723 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85C1381F44E00D08723 /* dosbox.cpp */; }; - DF46B8621381F44E00D08723 /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85E1381F44E00D08723 /* mame.cpp */; }; - DF46B8631381F44E00D08723 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85A1381F44E00D08723 /* dbopl.cpp */; }; - DF46B8641381F44E00D08723 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85C1381F44E00D08723 /* dosbox.cpp */; }; - DF46B8651381F44E00D08723 /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85E1381F44E00D08723 /* mame.cpp */; }; - DF46B8661381F44E00D08723 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85A1381F44E00D08723 /* dbopl.cpp */; }; - DF46B8671381F44E00D08723 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85C1381F44E00D08723 /* dosbox.cpp */; }; - DF46B8681381F44E00D08723 /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B85E1381F44E00D08723 /* mame.cpp */; }; - DF46B8711381F4A200D08723 /* sdl-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B86F1381F4A200D08723 /* sdl-audiocd.cpp */; }; - DF46B8721381F4A200D08723 /* sdl-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B86F1381F4A200D08723 /* sdl-audiocd.cpp */; }; - DF46B8731381F4A200D08723 /* sdl-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B86F1381F4A200D08723 /* sdl-audiocd.cpp */; }; - DF46B87D1381F4F200D08723 /* default-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B87B1381F4F200D08723 /* default-audiocd.cpp */; }; - DF46B87E1381F4F200D08723 /* default-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B87B1381F4F200D08723 /* default-audiocd.cpp */; }; - DF46B87F1381F4F200D08723 /* default-audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B87B1381F4F200D08723 /* default-audiocd.cpp */; }; - DF46B8891381F5D800D08723 /* sdl-provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8871381F5D800D08723 /* sdl-provider.cpp */; }; - DF46B88A1381F5D800D08723 /* sdl-provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8871381F5D800D08723 /* sdl-provider.cpp */; }; - DF46B88B1381F5D800D08723 /* sdl-provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8871381F5D800D08723 /* sdl-provider.cpp */; }; - DF46B8921381F62B00D08723 /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8901381F62B00D08723 /* adpcm.cpp */; }; - DF46B8931381F62B00D08723 /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8901381F62B00D08723 /* adpcm.cpp */; }; - DF46B8941381F62B00D08723 /* adpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8901381F62B00D08723 /* adpcm.cpp */; }; - DF46B89B1381F6C400D08723 /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8991381F6C400D08723 /* null.cpp */; }; - DF46B89C1381F6C400D08723 /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8991381F6C400D08723 /* null.cpp */; }; - DF46B89D1381F6C400D08723 /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF46B8991381F6C400D08723 /* null.cpp */; }; DF573C080F5A81EA00961A72 /* state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF573C010F5A81EA00961A72 /* state.cpp */; }; DF573CBB0F5A85B300961A72 /* exec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF573CBA0F5A85B300961A72 /* exec.cpp */; }; DF573CBE0F5A85E100961A72 /* timer_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF573CBD0F5A85E100961A72 /* timer_lol.cpp */; }; @@ -1558,10 +1253,20 @@ DF6118550FE3A8990042AD3F /* disk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118540FE3A8990042AD3F /* disk.cpp */; }; DF6118560FE3A8990042AD3F /* disk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118540FE3A8990042AD3F /* disk.cpp */; }; DF6118570FE3A8990042AD3F /* disk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118540FE3A8990042AD3F /* disk.cpp */; }; + DF6118680FE3A9410042AD3F /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118600FE3A9410042AD3F /* dxa_decoder.cpp */; }; + DF6118690FE3A9410042AD3F /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118620FE3A9410042AD3F /* flic_decoder.cpp */; }; + DF61186A0FE3A9410042AD3F /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118640FE3A9410042AD3F /* smk_decoder.cpp */; }; + DF61186D0FE3A9410042AD3F /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118600FE3A9410042AD3F /* dxa_decoder.cpp */; }; + DF61186E0FE3A9410042AD3F /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118620FE3A9410042AD3F /* flic_decoder.cpp */; }; + DF61186F0FE3A9410042AD3F /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118640FE3A9410042AD3F /* smk_decoder.cpp */; }; + DF6118720FE3A9410042AD3F /* dxa_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118600FE3A9410042AD3F /* dxa_decoder.cpp */; }; + DF6118730FE3A9410042AD3F /* flic_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118620FE3A9410042AD3F /* flic_decoder.cpp */; }; + DF6118740FE3A9410042AD3F /* smk_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118640FE3A9410042AD3F /* smk_decoder.cpp */; }; DF6118890FE3A9AA0042AD3F /* saveconverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118790FE3A9AA0042AD3F /* saveconverter.cpp */; }; DF61188A0FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187B0FE3A9AA0042AD3F /* saveconverter_v2.cpp */; }; DF61188B0FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187C0FE3A9AA0042AD3F /* saveconverter_v3.cpp */; }; DF61188C0FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187D0FE3A9AA0042AD3F /* saveconverter_v4.cpp */; }; + DF61188D0FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187E0FE3A9AA0042AD3F /* saveconverter_v6.cpp */; }; DF61188E0FE3A9AA0042AD3F /* savefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187F0FE3A9AA0042AD3F /* savefile.cpp */; }; DF61188F0FE3A9AA0042AD3F /* savehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118810FE3A9AA0042AD3F /* savehandler.cpp */; }; DF6118900FE3A9AA0042AD3F /* saveload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118830FE3A9AA0042AD3F /* saveload.cpp */; }; @@ -1573,6 +1278,7 @@ DF6118960FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187B0FE3A9AA0042AD3F /* saveconverter_v2.cpp */; }; DF6118970FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187C0FE3A9AA0042AD3F /* saveconverter_v3.cpp */; }; DF6118980FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187D0FE3A9AA0042AD3F /* saveconverter_v4.cpp */; }; + DF6118990FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187E0FE3A9AA0042AD3F /* saveconverter_v6.cpp */; }; DF61189A0FE3A9AA0042AD3F /* savefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187F0FE3A9AA0042AD3F /* savefile.cpp */; }; DF61189B0FE3A9AA0042AD3F /* savehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118810FE3A9AA0042AD3F /* savehandler.cpp */; }; DF61189C0FE3A9AA0042AD3F /* saveload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118830FE3A9AA0042AD3F /* saveload.cpp */; }; @@ -1584,6 +1290,7 @@ DF6118A20FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187B0FE3A9AA0042AD3F /* saveconverter_v2.cpp */; }; DF6118A30FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187C0FE3A9AA0042AD3F /* saveconverter_v3.cpp */; }; DF6118A40FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187D0FE3A9AA0042AD3F /* saveconverter_v4.cpp */; }; + DF6118A50FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187E0FE3A9AA0042AD3F /* saveconverter_v6.cpp */; }; DF6118A60FE3A9AA0042AD3F /* savefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF61187F0FE3A9AA0042AD3F /* savefile.cpp */; }; DF6118A70FE3A9AA0042AD3F /* savehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118810FE3A9AA0042AD3F /* savehandler.cpp */; }; DF6118A80FE3A9AA0042AD3F /* saveload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118830FE3A9AA0042AD3F /* saveload.cpp */; }; @@ -1610,6 +1317,9 @@ DF6118C80FE3AABD0042AD3F /* player_v2cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118C60FE3AABD0042AD3F /* player_v2cms.cpp */; }; DF6118C90FE3AABD0042AD3F /* player_v2cms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118C60FE3AABD0042AD3F /* player_v2cms.cpp */; }; DF6118CC0FE3AAFD0042AD3F /* hardwarekeys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118CB0FE3AAFD0042AD3F /* hardwarekeys.cpp */; }; + DF6118D10FE3AB560042AD3F /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118CF0FE3AB560042AD3F /* mame.cpp */; }; + DF6118D20FE3AB560042AD3F /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118CF0FE3AB560042AD3F /* mame.cpp */; }; + DF6118D30FE3AB560042AD3F /* mame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6118CF0FE3AB560042AD3F /* mame.cpp */; }; DF6BF4C410529DA50069811F /* conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4C010529DA50069811F /* conversion.cpp */; }; DF6BF4C510529DA50069811F /* jpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4C210529DA50069811F /* jpeg.cpp */; }; DF6BF4C610529DA50069811F /* conversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4C010529DA50069811F /* conversion.cpp */; }; @@ -1643,6 +1353,12 @@ DF6BF4FF10529F140069811F /* EventRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4F810529F140069811F /* EventRecorder.cpp */; }; DF6BF50010529F140069811F /* EventDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4F710529F140069811F /* EventDispatcher.cpp */; }; DF6BF50110529F140069811F /* EventRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF4F810529F140069811F /* EventRecorder.cpp */; }; + DF6BF50610529F540069811F /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50210529F540069811F /* maxtrax.cpp */; }; + DF6BF50710529F540069811F /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50410529F540069811F /* tfmx.cpp */; }; + DF6BF50810529F540069811F /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50210529F540069811F /* maxtrax.cpp */; }; + DF6BF50910529F540069811F /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50410529F540069811F /* tfmx.cpp */; }; + DF6BF50A10529F540069811F /* maxtrax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50210529F540069811F /* maxtrax.cpp */; }; + DF6BF50B10529F540069811F /* tfmx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6BF50410529F540069811F /* tfmx.cpp */; }; DF7585CE100CB66E00CC3324 /* expression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7585C3100CB66E00CC3324 /* expression.cpp */; }; DF7585CF100CB66E00CC3324 /* hotspots.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7585C5100CB66E00CC3324 /* hotspots.cpp */; }; DF7585D0100CB66E00CC3324 /* init_v6.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7585C7100CB66E00CC3324 /* init_v6.cpp */; }; @@ -1719,6 +1435,9 @@ DF7F289311FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; DF7F289511FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; DF7F289711FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; + DF7F28A011FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; + DF7F28A111FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; + DF7F28A211FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; DF7F28A511FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; DF7F28A611FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; DF7F28A711FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; @@ -2348,9 +2067,28 @@ DF842A470E7BBBB400F5680E /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A400E7BBBB400F5680E /* archive.cpp */; }; DF842A490E7BBBB400F5680E /* unarj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A450E7BBBB400F5680E /* unarj.cpp */; }; DF842A6D0E7BBD5700F5680E /* stdiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6B0E7BBD5700F5680E /* stdiostream.cpp */; }; + DF842A710E7BBDB200F5680E /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6F0E7BBDB200F5680E /* musicplugin.cpp */; }; + DF895BFE124C24350077F6E8 /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895BFC124C24350077F6E8 /* coktel_decoder.cpp */; }; + DF895BFF124C24350077F6E8 /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895BFC124C24350077F6E8 /* coktel_decoder.cpp */; }; + DF895C00124C24350077F6E8 /* coktel_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895BFC124C24350077F6E8 /* coktel_decoder.cpp */; }; DF895C03124C24680077F6E8 /* player_towns.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C01124C24680077F6E8 /* player_towns.cpp */; }; DF895C04124C24680077F6E8 /* player_towns.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C01124C24680077F6E8 /* player_towns.cpp */; }; DF895C05124C24680077F6E8 /* player_towns.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C01124C24680077F6E8 /* player_towns.cpp */; }; + DF895C09124C24B60077F6E8 /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C08124C24B50077F6E8 /* appleiigs.cpp */; }; + DF895C0A124C24B60077F6E8 /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C08124C24B50077F6E8 /* appleiigs.cpp */; }; + DF895C0B124C24B60077F6E8 /* appleiigs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C08124C24B50077F6E8 /* appleiigs.cpp */; }; + DF895C15124C24C10077F6E8 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0D124C24C00077F6E8 /* towns_audio.cpp */; }; + DF895C16124C24C10077F6E8 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0F124C24C00077F6E8 /* towns_euphony.cpp */; }; + DF895C17124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C11124C24C00077F6E8 /* towns_pc98_driver.cpp */; }; + DF895C18124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C13124C24C00077F6E8 /* towns_pc98_fmsynth.cpp */; }; + DF895C19124C24C10077F6E8 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0D124C24C00077F6E8 /* towns_audio.cpp */; }; + DF895C1A124C24C10077F6E8 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0F124C24C00077F6E8 /* towns_euphony.cpp */; }; + DF895C1B124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C11124C24C00077F6E8 /* towns_pc98_driver.cpp */; }; + DF895C1C124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C13124C24C00077F6E8 /* towns_pc98_fmsynth.cpp */; }; + DF895C1D124C24C10077F6E8 /* towns_audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0D124C24C00077F6E8 /* towns_audio.cpp */; }; + DF895C1E124C24C10077F6E8 /* towns_euphony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C0F124C24C00077F6E8 /* towns_euphony.cpp */; }; + DF895C1F124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C11124C24C00077F6E8 /* towns_pc98_driver.cpp */; }; + DF895C20124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C13124C24C00077F6E8 /* towns_pc98_fmsynth.cpp */; }; DF895C25124C25150077F6E8 /* init_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C24124C25150077F6E8 /* init_fascin.cpp */; }; DF895C26124C25150077F6E8 /* init_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C24124C25150077F6E8 /* init_fascin.cpp */; }; DF895C27124C25150077F6E8 /* init_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895C24124C25150077F6E8 /* init_fascin.cpp */; }; @@ -2363,8 +2101,27 @@ DF895C41124C271F0077F6E8 /* icon4.png in Resources */ = {isa = PBXBuildFile; fileRef = DF895C40124C271F0077F6E8 /* icon4.png */; }; DF895C42124C271F0077F6E8 /* icon4.png in Resources */ = {isa = PBXBuildFile; fileRef = DF895C40124C271F0077F6E8 /* icon4.png */; }; DF895C43124C271F0077F6E8 /* icon4.png in Resources */ = {isa = PBXBuildFile; fileRef = DF895C40124C271F0077F6E8 /* icon4.png */; }; + DF895CB8124E58980077F6E8 /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAB124E58980077F6E8 /* indeo3.cpp */; }; + DF895CB9124E58980077F6E8 /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAD124E58980077F6E8 /* mjpeg.cpp */; }; + DF895CBA124E58980077F6E8 /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAF124E58980077F6E8 /* qdm2.cpp */; }; + DF895CBB124E58980077F6E8 /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB2124E58980077F6E8 /* qtrle.cpp */; }; + DF895CBC124E58980077F6E8 /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB4124E58980077F6E8 /* rpza.cpp */; }; + DF895CBD124E58990077F6E8 /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB6124E58980077F6E8 /* smc.cpp */; }; + DF895CBE124E58990077F6E8 /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAB124E58980077F6E8 /* indeo3.cpp */; }; + DF895CBF124E58990077F6E8 /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAD124E58980077F6E8 /* mjpeg.cpp */; }; + DF895CC0124E58990077F6E8 /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAF124E58980077F6E8 /* qdm2.cpp */; }; + DF895CC1124E58990077F6E8 /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB2124E58980077F6E8 /* qtrle.cpp */; }; + DF895CC2124E58990077F6E8 /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB4124E58980077F6E8 /* rpza.cpp */; }; + DF895CC3124E58990077F6E8 /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB6124E58980077F6E8 /* smc.cpp */; }; + DF895CC4124E58990077F6E8 /* indeo3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAB124E58980077F6E8 /* indeo3.cpp */; }; + DF895CC5124E58990077F6E8 /* mjpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAD124E58980077F6E8 /* mjpeg.cpp */; }; + DF895CC6124E58990077F6E8 /* qdm2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CAF124E58980077F6E8 /* qdm2.cpp */; }; + DF895CC7124E58990077F6E8 /* qtrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB2124E58980077F6E8 /* qtrle.cpp */; }; + DF895CC8124E58990077F6E8 /* rpza.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB4124E58980077F6E8 /* rpza.cpp */; }; + DF895CC9124E58990077F6E8 /* smc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF895CB6124E58980077F6E8 /* smc.cpp */; }; DF89C2880F62D55C00D756B6 /* sprites_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2870F62D55C00D756B6 /* sprites_lol.cpp */; }; DF89C2A40F62D79E00D756B6 /* script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2A30F62D79E00D756B6 /* script.cpp */; }; + DF89C2BB0F62D91000D756B6 /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2B80F62D91000D756B6 /* timestamp.cpp */; }; DF90E9BF10AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; DF90E9C110AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; DF90E9C310AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; @@ -2374,6 +2131,12 @@ DF90EAAD10B0236F00C8F93F /* staticres.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAAB10B0236F00C8F93F /* staticres.cpp */; }; DF90EAAE10B0236F00C8F93F /* staticres.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAAB10B0236F00C8F93F /* staticres.cpp */; }; DF90EAAF10B0236F00C8F93F /* staticres.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAAB10B0236F00C8F93F /* staticres.cpp */; }; + DF90EAB810B023D100C8F93F /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAB610B023D100C8F93F /* avi_decoder.cpp */; }; + DF90EAB910B023D100C8F93F /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAB610B023D100C8F93F /* avi_decoder.cpp */; }; + DF90EABA10B023D100C8F93F /* avi_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAB610B023D100C8F93F /* avi_decoder.cpp */; }; + DF90EAC310B023F400C8F93F /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAC110B023F400C8F93F /* msvideo1.cpp */; }; + DF90EAC410B023F400C8F93F /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAC110B023F400C8F93F /* msvideo1.cpp */; }; + DF90EAC510B023F400C8F93F /* msvideo1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAC110B023F400C8F93F /* msvideo1.cpp */; }; DF9B9248118E46730069C19D /* error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9B9246118E46730069C19D /* error.cpp */; }; DF9B9249118E46730069C19D /* error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9B9246118E46730069C19D /* error.cpp */; }; DF9B924A118E46730069C19D /* error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9B9246118E46730069C19D /* error.cpp */; }; @@ -2388,13 +2151,15 @@ DFAAAFFC0F0112DF003E9390 /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAAFFB0F0112DF003E9390 /* detection.cpp */; }; DFAAB0020F011392003E9390 /* thumbnail_intern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */; }; DFAAD23D0F50120E00C3A4E2 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAD2390F50120E00C3A4E2 /* console.cpp */; }; - DFADEBB313820DF500C46364 /* maccursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB113820DF500C46364 /* maccursor.cpp */; }; - DFADEBB413820DF500C46364 /* maccursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB113820DF500C46364 /* maccursor.cpp */; }; - DFADEBB513820DF500C46364 /* maccursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB113820DF500C46364 /* maccursor.cpp */; }; - DFADEBB713820E0C00C46364 /* posix-fs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB613820E0C00C46364 /* posix-fs.cpp */; }; - DFADEBB813820E0C00C46364 /* posix-fs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB613820E0C00C46364 /* posix-fs.cpp */; }; - DFADEBB913820E0C00C46364 /* posix-fs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFADEBB613820E0C00C46364 /* posix-fs.cpp */; }; - DFADEC071382140300C46364 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DFADEC061382140300C46364 /* libz.dylib */; }; + DFB0576811B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; + DFB0576911B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; + DFB0576A11B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; + DFB0576B11B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; + DFB0576C11B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; + DFB0576D11B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; + DFB0576E11B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; + DFB0576F11B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; + DFB0577011B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; DFB0577611B753DA0015AE65 /* rational.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0577411B753DA0015AE65 /* rational.cpp */; }; DFB0577711B753DA0015AE65 /* rational.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0577411B753DA0015AE65 /* rational.cpp */; }; DFB0577811B753DA0015AE65 /* rational.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0577411B753DA0015AE65 /* rational.cpp */; }; @@ -2410,6 +2175,9 @@ DFB0579111B7547D0015AE65 /* pict.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0578F11B7547D0015AE65 /* pict.cpp */; }; DFB0579211B7547D0015AE65 /* pict.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0578F11B7547D0015AE65 /* pict.cpp */; }; DFB0579311B7547D0015AE65 /* pict.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0578F11B7547D0015AE65 /* pict.cpp */; }; + DFB0579811B7549C0015AE65 /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0579611B7549C0015AE65 /* cinepak.cpp */; }; + DFB0579911B7549C0015AE65 /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0579611B7549C0015AE65 /* cinepak.cpp */; }; + DFB0579A11B7549C0015AE65 /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0579611B7549C0015AE65 /* cinepak.cpp */; }; DFC831210F48AF19005EF03C /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301A0F48AF18005EF03C /* detection.cpp */; }; DFC831240F48AF19005EF03C /* gc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301E0F48AF18005EF03C /* gc.cpp */; }; DFC831270F48AF19005EF03C /* kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830230F48AF18005EF03C /* kernel.cpp */; }; @@ -2439,6 +2207,9 @@ DFCDC6F711662AAB00A7D2A0 /* resource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6F611662AAB00A7D2A0 /* resource.cpp */; }; DFCDC6F811662AAB00A7D2A0 /* resource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6F611662AAB00A7D2A0 /* resource.cpp */; }; DFCDC6F911662AAB00A7D2A0 /* resource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6F611662AAB00A7D2A0 /* resource.cpp */; }; + DFCDC6FE11662AD700A7D2A0 /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6FC11662AD700A7D2A0 /* msrle.cpp */; }; + DFCDC6FF11662AD700A7D2A0 /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6FC11662AD700A7D2A0 /* msrle.cpp */; }; + DFCDC70011662AD700A7D2A0 /* msrle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC6FC11662AD700A7D2A0 /* msrle.cpp */; }; DFCDC70411662B0200A7D2A0 /* saveload_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC70311662B0200A7D2A0 /* saveload_fascin.cpp */; }; DFCDC70511662B0200A7D2A0 /* saveload_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC70311662B0200A7D2A0 /* saveload_fascin.cpp */; }; DFCDC70611662B0200A7D2A0 /* saveload_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCDC70311662B0200A7D2A0 /* saveload_fascin.cpp */; }; @@ -2497,14 +2268,41 @@ DFE47C200D81F4E900B6D1FB /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477910D81F4E900B6D1FB /* console.cpp */; }; DFE47C210D81F4E900B6D1FB /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477940D81F4E900B6D1FB /* debugger.cpp */; }; DFE47C220D81F4E900B6D1FB /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477960D81F4E900B6D1FB /* dialog.cpp */; }; + DFE47C230D81F4E900B6D1FB /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477980D81F4E900B6D1FB /* editable.cpp */; }; + DFE47C240D81F4E900B6D1FB /* EditTextWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779A0D81F4E900B6D1FB /* EditTextWidget.cpp */; }; DFE47C260D81F4E900B6D1FB /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779E0D81F4E900B6D1FB /* Key.cpp */; }; DFE47C280D81F4E900B6D1FB /* launcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A20D81F4E900B6D1FB /* launcher.cpp */; }; + DFE47C290D81F4E900B6D1FB /* ListWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A40D81F4E900B6D1FB /* ListWidget.cpp */; }; DFE47C2A0D81F4E900B6D1FB /* massadd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A60D81F4E900B6D1FB /* massadd.cpp */; }; DFE47C2B0D81F4E900B6D1FB /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A80D81F4E900B6D1FB /* message.cpp */; }; DFE47C2E0D81F4E900B6D1FB /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AD0D81F4E900B6D1FB /* object.cpp */; }; DFE47C2F0D81F4E900B6D1FB /* options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AF0D81F4E900B6D1FB /* options.cpp */; }; + DFE47C300D81F4E900B6D1FB /* PopUpWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B10D81F4E900B6D1FB /* PopUpWidget.cpp */; }; + DFE47C310D81F4E900B6D1FB /* ScrollBarWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B30D81F4E900B6D1FB /* ScrollBarWidget.cpp */; }; + DFE47C320D81F4E900B6D1FB /* TabWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B50D81F4E900B6D1FB /* TabWidget.cpp */; }; DFE47C350D81F4E900B6D1FB /* themebrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477BA0D81F4E900B6D1FB /* themebrowser.cpp */; }; DFE47C3B0D81F4E900B6D1FB /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477C40D81F4E900B6D1FB /* widget.cpp */; }; + DFE47C3E0D81F4E900B6D1FB /* audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CB0D81F4E900B6D1FB /* audiocd.cpp */; }; + DFE47C3F0D81F4E900B6D1FB /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CD0D81F4E900B6D1FB /* audiostream.cpp */; }; + DFE47C410D81F4E900B6D1FB /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D10D81F4E900B6D1FB /* fmopl.cpp */; }; + DFE47C430D81F4E900B6D1FB /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D50D81F4E900B6D1FB /* mididrv.cpp */; }; + DFE47C440D81F4E900B6D1FB /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D70D81F4E900B6D1FB /* midiparser.cpp */; }; + DFE47C450D81F4E900B6D1FB /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D90D81F4E900B6D1FB /* midiparser_smf.cpp */; }; + DFE47C460D81F4E900B6D1FB /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DA0D81F4E900B6D1FB /* midiparser_xmidi.cpp */; }; + DFE47C470D81F4E900B6D1FB /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DB0D81F4E900B6D1FB /* mixer.cpp */; }; + DFE47C480D81F4E900B6D1FB /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DE0D81F4E900B6D1FB /* infogrames.cpp */; }; + DFE47C490D81F4E900B6D1FB /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E00D81F4E900B6D1FB /* module.cpp */; }; + DFE47C4A0D81F4E900B6D1FB /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E20D81F4E900B6D1FB /* paula.cpp */; }; + DFE47C4B0D81F4E900B6D1FB /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E40D81F4E900B6D1FB /* protracker.cpp */; }; + DFE47C4C0D81F4E900B6D1FB /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E60D81F4E900B6D1FB /* rjp1.cpp */; }; + DFE47C4D0D81F4E900B6D1FB /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E80D81F4E900B6D1FB /* soundfx.cpp */; }; + DFE47C500D81F4E900B6D1FB /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477ED0D81F4E900B6D1FB /* mpu401.cpp */; }; + DFE47C510D81F4E900B6D1FB /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477EF0D81F4E900B6D1FB /* null.cpp */; }; + DFE47C520D81F4E900B6D1FB /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F00D81F4E900B6D1FB /* rate.cpp */; }; + DFE47C570D81F4E900B6D1FB /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F70D81F4E900B6D1FB /* adlib.cpp */; }; + DFE47C580D81F4E900B6D1FB /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F90D81F4E900B6D1FB /* fluidsynth.cpp */; }; + DFE47C740D81F4E900B6D1FB /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478210D81F4E900B6D1FB /* pcspk.cpp */; }; + DFE47C750D81F4E900B6D1FB /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478230D81F4E900B6D1FB /* ym2612.cpp */; }; DFE47C870D81F86900B6D1FB /* kyra.dat in Resources */ = {isa = PBXBuildFile; fileRef = DFE47C810D81F86900B6D1FB /* kyra.dat */; }; DFE47C880D81F86900B6D1FB /* lure.dat in Resources */ = {isa = PBXBuildFile; fileRef = DFE47C820D81F86900B6D1FB /* lure.dat */; }; DFE47C890D81F86900B6D1FB /* queen.tbl in Resources */ = {isa = PBXBuildFile; fileRef = DFE47C830D81F86900B6D1FB /* queen.tbl */; }; @@ -2520,6 +2318,11 @@ DFEC5D361166C67300C90552 /* savestate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D341166C67300C90552 /* savestate.cpp */; }; DFEC5D371166C67300C90552 /* savestate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D341166C67300C90552 /* savestate.cpp */; }; DFEC5D381166C67300C90552 /* savestate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D341166C67300C90552 /* savestate.cpp */; }; + DFEC5D3F1166C6B400C90552 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D3D1166C6B400C90552 /* dbopl.cpp */; }; + DFEC5D401166C6B400C90552 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D3D1166C6B400C90552 /* dbopl.cpp */; }; + DFEC5D411166C6B400C90552 /* dbopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEC5D3D1166C6B400C90552 /* dbopl.cpp */; }; + DFF958AF0FB222F300A3EC78 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFF958A90FB222F300A3EC78 /* dosbox.cpp */; }; + DFF958B20FB222F300A3EC78 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFF958A90FB222F300A3EC78 /* dosbox.cpp */; }; DFF959050FB22D3000A3EC78 /* libmad.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD6476C0F49F7EF008E18EF /* libmad.a */; }; DFF959060FB22D3100A3EC78 /* libFLAC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD6476B0F49F7EF008E18EF /* libFLAC.a */; }; DFF959080FB22D3300A3EC78 /* libvorbisidec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD6476F0F49F7EF008E18EF /* libvorbisidec.a */; }; @@ -2572,14 +2375,41 @@ DFF9593E0FB22D5700A3EC78 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477910D81F4E900B6D1FB /* console.cpp */; }; DFF9593F0FB22D5700A3EC78 /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477940D81F4E900B6D1FB /* debugger.cpp */; }; DFF959400FB22D5700A3EC78 /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477960D81F4E900B6D1FB /* dialog.cpp */; }; + DFF959410FB22D5700A3EC78 /* editable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477980D81F4E900B6D1FB /* editable.cpp */; }; + DFF959420FB22D5700A3EC78 /* EditTextWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779A0D81F4E900B6D1FB /* EditTextWidget.cpp */; }; DFF959430FB22D5700A3EC78 /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4779E0D81F4E900B6D1FB /* Key.cpp */; }; DFF959440FB22D5700A3EC78 /* launcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A20D81F4E900B6D1FB /* launcher.cpp */; }; + DFF959450FB22D5700A3EC78 /* ListWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A40D81F4E900B6D1FB /* ListWidget.cpp */; }; DFF959460FB22D5700A3EC78 /* massadd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A60D81F4E900B6D1FB /* massadd.cpp */; }; DFF959470FB22D5700A3EC78 /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477A80D81F4E900B6D1FB /* message.cpp */; }; DFF959480FB22D5700A3EC78 /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AD0D81F4E900B6D1FB /* object.cpp */; }; DFF959490FB22D5700A3EC78 /* options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477AF0D81F4E900B6D1FB /* options.cpp */; }; + DFF9594A0FB22D5700A3EC78 /* PopUpWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B10D81F4E900B6D1FB /* PopUpWidget.cpp */; }; + DFF9594B0FB22D5700A3EC78 /* ScrollBarWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B30D81F4E900B6D1FB /* ScrollBarWidget.cpp */; }; + DFF9594C0FB22D5700A3EC78 /* TabWidget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477B50D81F4E900B6D1FB /* TabWidget.cpp */; }; DFF9594D0FB22D5700A3EC78 /* themebrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477BA0D81F4E900B6D1FB /* themebrowser.cpp */; }; DFF9594E0FB22D5700A3EC78 /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477C40D81F4E900B6D1FB /* widget.cpp */; }; + DFF959510FB22D5700A3EC78 /* audiocd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CB0D81F4E900B6D1FB /* audiocd.cpp */; }; + DFF959520FB22D5700A3EC78 /* audiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477CD0D81F4E900B6D1FB /* audiostream.cpp */; }; + DFF959540FB22D5700A3EC78 /* fmopl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D10D81F4E900B6D1FB /* fmopl.cpp */; }; + DFF959560FB22D5700A3EC78 /* mididrv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D50D81F4E900B6D1FB /* mididrv.cpp */; }; + DFF959570FB22D5700A3EC78 /* midiparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D70D81F4E900B6D1FB /* midiparser.cpp */; }; + DFF959580FB22D5700A3EC78 /* midiparser_smf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477D90D81F4E900B6D1FB /* midiparser_smf.cpp */; }; + DFF959590FB22D5700A3EC78 /* midiparser_xmidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DA0D81F4E900B6D1FB /* midiparser_xmidi.cpp */; }; + DFF9595A0FB22D5700A3EC78 /* mixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DB0D81F4E900B6D1FB /* mixer.cpp */; }; + DFF9595B0FB22D5700A3EC78 /* infogrames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477DE0D81F4E900B6D1FB /* infogrames.cpp */; }; + DFF9595C0FB22D5700A3EC78 /* module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E00D81F4E900B6D1FB /* module.cpp */; }; + DFF9595D0FB22D5700A3EC78 /* paula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E20D81F4E900B6D1FB /* paula.cpp */; }; + DFF9595E0FB22D5700A3EC78 /* protracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E40D81F4E900B6D1FB /* protracker.cpp */; }; + DFF9595F0FB22D5700A3EC78 /* rjp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E60D81F4E900B6D1FB /* rjp1.cpp */; }; + DFF959600FB22D5700A3EC78 /* soundfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477E80D81F4E900B6D1FB /* soundfx.cpp */; }; + DFF959620FB22D5700A3EC78 /* mpu401.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477ED0D81F4E900B6D1FB /* mpu401.cpp */; }; + DFF959630FB22D5700A3EC78 /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477EF0D81F4E900B6D1FB /* null.cpp */; }; + DFF959640FB22D5700A3EC78 /* rate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F00D81F4E900B6D1FB /* rate.cpp */; }; + DFF959650FB22D5700A3EC78 /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F70D81F4E900B6D1FB /* adlib.cpp */; }; + DFF959660FB22D5700A3EC78 /* fluidsynth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE477F90D81F4E900B6D1FB /* fluidsynth.cpp */; }; + DFF959670FB22D5700A3EC78 /* pcspk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478210D81F4E900B6D1FB /* pcspk.cpp */; }; + DFF959680FB22D5700A3EC78 /* ym2612.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE478230D81F4E900B6D1FB /* ym2612.cpp */; }; DFF9596C0FB22D5700A3EC78 /* memorypool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD511460DF3383500854012 /* memorypool.cpp */; }; DFF9596D0FB22D5700A3EC78 /* seq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD517E10DF33CAC00854012 /* seq.cpp */; }; DFF9596E0FB22D5700A3EC78 /* scaler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD5183B0DF3411800854012 /* scaler.cpp */; }; @@ -3210,6 +3040,7 @@ DFF95C0F0FB22D5700A3EC78 /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A400E7BBBB400F5680E /* archive.cpp */; }; DFF95C100FB22D5700A3EC78 /* unarj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A450E7BBBB400F5680E /* unarj.cpp */; }; DFF95C110FB22D5700A3EC78 /* stdiostream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6B0E7BBD5700F5680E /* stdiostream.cpp */; }; + DFF95C120FB22D5700A3EC78 /* musicplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF842A6F0E7BBDB200F5680E /* musicplugin.cpp */; }; DFF95C130FB22D5700A3EC78 /* saveload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF00ED5FC77001CB19F /* saveload.cpp */; }; DFF95C140FB22D5700A3EC78 /* ThemeEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF40ED5FC77001CB19F /* ThemeEngine.cpp */; }; DFF95C150FB22D5700A3EC78 /* ThemeEval.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8BF60ED5FC77001CB19F /* ThemeEval.cpp */; }; @@ -3226,6 +3057,7 @@ DFF95C200FB22D5700A3EC78 /* thumbnail_intern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */; }; DFF95C210FB22D5700A3EC78 /* dither.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFB900F485D890006E566 /* dither.cpp */; }; DFF95C270FB22D5700A3EC78 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD10F485DFB0006E566 /* debug.cpp */; }; + DFF95C280FB22D5700A3EC78 /* gui-manager.hcpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBD50F485E360006E566 /* gui-manager.hcpp */; }; DFF95C290FB22D5700A3EC78 /* posix-saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFBF80F4860A60006E566 /* posix-saves.cpp */; }; DFF95C2A0FB22D5700A3EC78 /* bmv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC1F0F4862520006E566 /* bmv.cpp */; }; DFF95C2B0FB22D5700A3EC78 /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFC200F4862520006E566 /* dialogs.cpp */; }; @@ -3297,6 +3129,7 @@ DFF95C920FB22D5700A3EC78 /* timer_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF573CBD0F5A85E100961A72 /* timer_lol.cpp */; }; DFF95C940FB22D5700A3EC78 /* sprites_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2870F62D55C00D756B6 /* sprites_lol.cpp */; }; DFF95C950FB22D5700A3EC78 /* script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2A30F62D79E00D756B6 /* script.cpp */; }; + DFF95C980FB22D5700A3EC78 /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2B80F62D91000D756B6 /* timestamp.cpp */; }; DFF95C990FB22D5700A3EC78 /* pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5C0F63CAD4002D821E /* pn.cpp */; }; DFF95C9A0FB22D5700A3EC78 /* script_pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5D0F63CAD4002D821E /* script_pn.cpp */; }; DFF95C9B0FB22D5700A3EC78 /* vga_pn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF093E5E0F63CAD4002D821E /* vga_pn.cpp */; }; @@ -3311,6 +3144,7 @@ DFF95CB30FB22D5700A3EC78 /* inter_fascin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF09CC0F0FAC4E1900A5AFD7 /* inter_fascin.cpp */; }; DFF95CB40FB22D5700A3EC78 /* script_v3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF09CC260FAC4EAB00A5AFD7 /* script_v3.cpp */; }; DFF95CB50FB22D5700A3EC78 /* script_v4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF09CC270FAC4EAB00A5AFD7 /* script_v4.cpp */; }; + DFF95CB70FB22D5700A3EC78 /* dosbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFF958A90FB222F300A3EC78 /* dosbox.cpp */; }; DFF95CBC0FB22D5700A3EC78 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A160E7BB34E00F5680E /* CoreAudio.framework */; }; DFF95CBD0FB22D5700A3EC78 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A170E7BB34E00F5680E /* CoreFoundation.framework */; }; DFF95CBE0FB22D5700A3EC78 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A180E7BB34E00F5680E /* Foundation.framework */; }; @@ -3369,9 +3203,12 @@ 8CD1ECC6126202AA00FA198C /* detection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = detection.cpp; sourceTree = ""; }; 8CD1ECC7126202AA00FA198C /* display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = display.cpp; sourceTree = ""; }; 8CD1ECC8126202AA00FA198C /* display.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = display.h; sourceTree = ""; }; + 8CD1ECC9126202AA00FA198C /* engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = engine.cpp; sourceTree = ""; }; + 8CD1ECCA126202AA00FA198C /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = ""; }; 8CD1ECCB126202AA00FA198C /* file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file.cpp; sourceTree = ""; }; 8CD1ECCC126202AA00FA198C /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; 8CD1ECCD126202AA00FA198C /* game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = ""; }; + 8CD1ECCE126202AA00FA198C /* global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = global.h; sourceTree = ""; }; 8CD1ECCF126202AA00FA198C /* hugo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hugo.cpp; sourceTree = ""; }; 8CD1ECD0126202AA00FA198C /* hugo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hugo.h; sourceTree = ""; }; 8CD1ECD1126202AA00FA198C /* intro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = intro.cpp; sourceTree = ""; }; @@ -3468,6 +3305,8 @@ DF093E5D0F63CAD4002D821E /* script_pn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = script_pn.cpp; sourceTree = ""; }; DF093E5E0F63CAD4002D821E /* vga_pn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vga_pn.cpp; sourceTree = ""; }; DF09422A0F63CB26002D821E /* ScummVM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScummVM.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DF0942350F63CB9A002D821E /* events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = events.cpp; sourceTree = ""; }; + DF0942370F63CB9A002D821E /* graphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = graphics.cpp; sourceTree = ""; }; DF0942390F63CB9A002D821E /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; DF09423C0F63CB9A002D821E /* sdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdl.cpp; sourceTree = ""; }; DF09423D0F63CB9A002D821E /* sdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sdl.h; sourceTree = ""; }; @@ -3500,156 +3339,8 @@ DF09CC260FAC4EAB00A5AFD7 /* script_v3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = script_v3.cpp; sourceTree = ""; }; DF09CC270FAC4EAB00A5AFD7 /* script_v4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = script_v4.cpp; sourceTree = ""; }; DF0E30391252C5BD0082D593 /* cms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cms.cpp; sourceTree = ""; }; - DF203F461380C06E0056300A /* gui-manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "gui-manager.cpp"; sourceTree = ""; }; - DF203F531380C2740056300A /* avi_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = avi_decoder.cpp; path = ../../video/avi_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F541380C2740056300A /* avi_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = avi_decoder.h; path = ../../video/avi_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F551380C2740056300A /* coktel_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = coktel_decoder.cpp; path = ../../video/coktel_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F561380C2740056300A /* coktel_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coktel_decoder.h; path = ../../video/coktel_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F571380C2740056300A /* dxa_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dxa_decoder.cpp; path = ../../video/dxa_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F581380C2740056300A /* dxa_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dxa_decoder.h; path = ../../video/dxa_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F591380C2740056300A /* flic_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = flic_decoder.cpp; path = ../../video/flic_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F5A1380C2740056300A /* flic_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = flic_decoder.h; path = ../../video/flic_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F5D1380C2740056300A /* qt_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qt_decoder.cpp; path = ../../video/qt_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F5E1380C2750056300A /* qt_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qt_decoder.h; path = ../../video/qt_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F5F1380C2750056300A /* smk_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = smk_decoder.cpp; path = ../../video/smk_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F601380C2750056300A /* smk_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = smk_decoder.h; path = ../../video/smk_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F611380C2750056300A /* video_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = video_decoder.cpp; path = ../../video/video_decoder.cpp; sourceTree = SOURCE_ROOT; }; - DF203F621380C2750056300A /* video_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video_decoder.h; path = ../../video/video_decoder.h; sourceTree = SOURCE_ROOT; }; - DF203F7C1380C2920056300A /* cdtoons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cdtoons.cpp; path = ../../video/codecs/cdtoons.cpp; sourceTree = SOURCE_ROOT; }; - DF203F7D1380C2920056300A /* cdtoons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cdtoons.h; path = ../../video/codecs/cdtoons.h; sourceTree = SOURCE_ROOT; }; - DF203F7E1380C2920056300A /* cinepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cinepak.cpp; path = ../../video/codecs/cinepak.cpp; sourceTree = SOURCE_ROOT; }; - DF203F7F1380C2920056300A /* cinepak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cinepak.h; path = ../../video/codecs/cinepak.h; sourceTree = SOURCE_ROOT; }; - DF203F801380C2920056300A /* codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = codec.h; path = ../../video/codecs/codec.h; sourceTree = SOURCE_ROOT; }; - DF203F811380C2920056300A /* indeo3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = indeo3.cpp; path = ../../video/codecs/indeo3.cpp; sourceTree = SOURCE_ROOT; }; - DF203F821380C2920056300A /* indeo3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = indeo3.h; path = ../../video/codecs/indeo3.h; sourceTree = SOURCE_ROOT; }; - DF203F831380C2920056300A /* mjpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mjpeg.cpp; path = ../../video/codecs/mjpeg.cpp; sourceTree = SOURCE_ROOT; }; - DF203F841380C2920056300A /* mjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mjpeg.h; path = ../../video/codecs/mjpeg.h; sourceTree = SOURCE_ROOT; }; - DF203F851380C2920056300A /* msrle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = msrle.cpp; path = ../../video/codecs/msrle.cpp; sourceTree = SOURCE_ROOT; }; - DF203F861380C2920056300A /* msrle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msrle.h; path = ../../video/codecs/msrle.h; sourceTree = SOURCE_ROOT; }; - DF203F871380C2920056300A /* msvideo1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = msvideo1.cpp; path = ../../video/codecs/msvideo1.cpp; sourceTree = SOURCE_ROOT; }; - DF203F881380C2920056300A /* msvideo1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msvideo1.h; path = ../../video/codecs/msvideo1.h; sourceTree = SOURCE_ROOT; }; - DF203F891380C2920056300A /* qdm2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qdm2.cpp; path = ../../video/codecs/qdm2.cpp; sourceTree = SOURCE_ROOT; }; - DF203F8A1380C2920056300A /* qdm2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qdm2.h; path = ../../video/codecs/qdm2.h; sourceTree = SOURCE_ROOT; }; - DF203F8B1380C2920056300A /* qdm2data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qdm2data.h; path = ../../video/codecs/qdm2data.h; sourceTree = SOURCE_ROOT; }; - DF203F8C1380C2920056300A /* qtrle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qtrle.cpp; path = ../../video/codecs/qtrle.cpp; sourceTree = SOURCE_ROOT; }; - DF203F8D1380C2920056300A /* qtrle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qtrle.h; path = ../../video/codecs/qtrle.h; sourceTree = SOURCE_ROOT; }; - DF203F8E1380C2920056300A /* rpza.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rpza.cpp; path = ../../video/codecs/rpza.cpp; sourceTree = SOURCE_ROOT; }; - DF203F8F1380C2920056300A /* rpza.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rpza.h; path = ../../video/codecs/rpza.h; sourceTree = SOURCE_ROOT; }; - DF203F901380C2920056300A /* smc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = smc.cpp; path = ../../video/codecs/smc.cpp; sourceTree = SOURCE_ROOT; }; - DF203F911380C2920056300A /* smc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = smc.h; path = ../../video/codecs/smc.h; sourceTree = SOURCE_ROOT; }; - DF203F921380C2920056300A /* truemotion1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = truemotion1.cpp; path = ../../video/codecs/truemotion1.cpp; sourceTree = SOURCE_ROOT; }; - DF203F931380C2920056300A /* truemotion1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = truemotion1.h; path = ../../video/codecs/truemotion1.h; sourceTree = SOURCE_ROOT; }; - DF203F941380C2920056300A /* truemotion1data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = truemotion1data.h; path = ../../video/codecs/truemotion1data.h; sourceTree = SOURCE_ROOT; }; - DF203FC01380C3BC0056300A /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF203FC11380C3BC0056300A /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF203FC21380C3BC0056300A /* dialogs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dialogs.cpp; sourceTree = ""; }; - DF203FC31380C3BC0056300A /* dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dialogs.h; sourceTree = ""; }; - DF203FC41380C3BC0056300A /* file_v1d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_v1d.cpp; sourceTree = ""; }; - DF203FC51380C3BC0056300A /* file_v1w.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_v1w.cpp; sourceTree = ""; }; - DF203FC61380C3BC0056300A /* file_v2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_v2d.cpp; sourceTree = ""; }; - DF203FC71380C3BC0056300A /* file_v2w.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_v2w.cpp; sourceTree = ""; }; - DF203FC81380C3BC0056300A /* file_v3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_v3d.cpp; sourceTree = ""; }; - DF203FC91380C3BC0056300A /* object_v1d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object_v1d.cpp; sourceTree = ""; }; - DF203FCA1380C3BC0056300A /* object_v1w.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object_v1w.cpp; sourceTree = ""; }; - DF203FCB1380C3BC0056300A /* object_v2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object_v2d.cpp; sourceTree = ""; }; - DF203FCC1380C3BC0056300A /* object_v3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object_v3d.cpp; sourceTree = ""; }; - DF203FCD1380C3BC0056300A /* object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object.cpp; sourceTree = ""; }; - DF203FCE1380C3BC0056300A /* object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object.h; sourceTree = ""; }; - DF203FCF1380C3BC0056300A /* parser_v1d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser_v1d.cpp; sourceTree = ""; }; - DF203FD01380C3BC0056300A /* parser_v1w.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser_v1w.cpp; sourceTree = ""; }; - DF203FD11380C3BC0056300A /* parser_v2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser_v2d.cpp; sourceTree = ""; }; - DF203FD21380C3BC0056300A /* parser_v3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser_v3d.cpp; sourceTree = ""; }; - DF203FD31380C3BC0056300A /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = ""; }; - DF203FD41380C3BC0056300A /* text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text.h; sourceTree = ""; }; - DF2040221380C8B70056300A /* editable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = editable.cpp; path = widgets/editable.cpp; sourceTree = ""; }; - DF2040231380C8B70056300A /* editable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = editable.h; path = widgets/editable.h; sourceTree = ""; }; - DF2040241380C8B70056300A /* edittext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = edittext.cpp; path = widgets/edittext.cpp; sourceTree = ""; }; - DF2040251380C8B70056300A /* edittext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = edittext.h; path = widgets/edittext.h; sourceTree = ""; }; - DF2040261380C8B70056300A /* list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = list.cpp; path = widgets/list.cpp; sourceTree = ""; }; - DF2040271380C8B70056300A /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = list.h; path = widgets/list.h; sourceTree = ""; }; - DF2040281380C8B70056300A /* popup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = popup.cpp; path = widgets/popup.cpp; sourceTree = ""; }; - DF2040291380C8B70056300A /* popup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = popup.h; path = widgets/popup.h; sourceTree = ""; }; - DF20402A1380C8B70056300A /* scrollbar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = scrollbar.cpp; path = widgets/scrollbar.cpp; sourceTree = ""; }; - DF20402B1380C8B70056300A /* scrollbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scrollbar.h; path = widgets/scrollbar.h; sourceTree = ""; }; - DF20402C1380C8B70056300A /* tab.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tab.cpp; path = widgets/tab.cpp; sourceTree = ""; }; - DF20402D1380C8B70056300A /* tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tab.h; path = widgets/tab.h; sourceTree = ""; }; - DF2040471380CA230056300A /* audiostream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audiostream.cpp; path = ../../audio/audiostream.cpp; sourceTree = SOURCE_ROOT; }; - DF2040481380CA230056300A /* audiostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audiostream.h; path = ../../audio/audiostream.h; sourceTree = SOURCE_ROOT; }; - DF2040491380CA230056300A /* fmopl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fmopl.cpp; path = ../../audio/fmopl.cpp; sourceTree = SOURCE_ROOT; }; - DF20404A1380CA230056300A /* fmopl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fmopl.h; path = ../../audio/fmopl.h; sourceTree = SOURCE_ROOT; }; - DF20404B1380CA230056300A /* mididrv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mididrv.cpp; path = ../../audio/mididrv.cpp; sourceTree = SOURCE_ROOT; }; - DF20404C1380CA230056300A /* mididrv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mididrv.h; path = ../../audio/mididrv.h; sourceTree = SOURCE_ROOT; }; - DF20404D1380CA230056300A /* midiparser_smf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midiparser_smf.cpp; path = ../../audio/midiparser_smf.cpp; sourceTree = SOURCE_ROOT; }; - DF20404E1380CA230056300A /* midiparser_xmidi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midiparser_xmidi.cpp; path = ../../audio/midiparser_xmidi.cpp; sourceTree = SOURCE_ROOT; }; - DF20404F1380CA230056300A /* midiparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midiparser.cpp; path = ../../audio/midiparser.cpp; sourceTree = SOURCE_ROOT; }; - DF2040501380CA230056300A /* midiparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midiparser.h; path = ../../audio/midiparser.h; sourceTree = SOURCE_ROOT; }; - DF2040511380CA230056300A /* midiplayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midiplayer.cpp; path = ../../audio/midiplayer.cpp; sourceTree = SOURCE_ROOT; }; - DF2040521380CA230056300A /* midiplayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midiplayer.h; path = ../../audio/midiplayer.h; sourceTree = SOURCE_ROOT; }; - DF2040531380CA230056300A /* mixer_intern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer_intern.h; path = ../../audio/mixer_intern.h; sourceTree = SOURCE_ROOT; }; - DF2040541380CA230056300A /* mixer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mixer.cpp; path = ../../audio/mixer.cpp; sourceTree = SOURCE_ROOT; }; - DF2040551380CA230056300A /* mixer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mixer.h; path = ../../audio/mixer.h; sourceTree = SOURCE_ROOT; }; - DF2040561380CA230056300A /* mpu401.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mpu401.cpp; path = ../../audio/mpu401.cpp; sourceTree = SOURCE_ROOT; }; - DF2040571380CA230056300A /* mpu401.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mpu401.h; path = ../../audio/mpu401.h; sourceTree = SOURCE_ROOT; }; - DF2040581380CA230056300A /* musicplugin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = musicplugin.cpp; path = ../../audio/musicplugin.cpp; sourceTree = SOURCE_ROOT; }; - DF2040591380CA230056300A /* musicplugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = musicplugin.h; path = ../../audio/musicplugin.h; sourceTree = SOURCE_ROOT; }; - DF20405A1380CA230056300A /* rate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rate.cpp; path = ../../audio/rate.cpp; sourceTree = SOURCE_ROOT; }; - DF20405B1380CA230056300A /* rate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rate.h; path = ../../audio/rate.h; sourceTree = SOURCE_ROOT; }; - DF20405C1380CA230056300A /* timestamp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = timestamp.cpp; path = ../../audio/timestamp.cpp; sourceTree = SOURCE_ROOT; }; - DF20405D1380CA230056300A /* timestamp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timestamp.h; path = ../../audio/timestamp.h; sourceTree = SOURCE_ROOT; }; - DF2040831380CA400056300A /* adpcm_intern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adpcm_intern.h; path = ../../audio/decoders/adpcm_intern.h; sourceTree = SOURCE_ROOT; }; - DF2040841380CA400056300A /* adpcm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adpcm.cpp; path = ../../audio/decoders/adpcm.cpp; sourceTree = SOURCE_ROOT; }; - DF2040851380CA400056300A /* adpcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adpcm.h; path = ../../audio/decoders/adpcm.h; sourceTree = SOURCE_ROOT; }; - DF2040861380CA400056300A /* aiff.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aiff.cpp; path = ../../audio/decoders/aiff.cpp; sourceTree = SOURCE_ROOT; }; - DF2040871380CA400056300A /* aiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aiff.h; path = ../../audio/decoders/aiff.h; sourceTree = SOURCE_ROOT; }; - DF2040881380CA400056300A /* flac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = flac.cpp; path = ../../audio/decoders/flac.cpp; sourceTree = SOURCE_ROOT; }; - DF2040891380CA400056300A /* flac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = flac.h; path = ../../audio/decoders/flac.h; sourceTree = SOURCE_ROOT; }; - DF20408A1380CA400056300A /* iff_sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iff_sound.cpp; path = ../../audio/decoders/iff_sound.cpp; sourceTree = SOURCE_ROOT; }; - DF20408B1380CA400056300A /* iff_sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iff_sound.h; path = ../../audio/decoders/iff_sound.h; sourceTree = SOURCE_ROOT; }; - DF20408C1380CA400056300A /* mac_snd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mac_snd.cpp; path = ../../audio/decoders/mac_snd.cpp; sourceTree = SOURCE_ROOT; }; - DF20408D1380CA400056300A /* mac_snd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mac_snd.h; path = ../../audio/decoders/mac_snd.h; sourceTree = SOURCE_ROOT; }; - DF20408E1380CA400056300A /* mp3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mp3.cpp; path = ../../audio/decoders/mp3.cpp; sourceTree = SOURCE_ROOT; }; - DF20408F1380CA400056300A /* mp3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mp3.h; path = ../../audio/decoders/mp3.h; sourceTree = SOURCE_ROOT; }; - DF2040901380CA400056300A /* raw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = raw.cpp; path = ../../audio/decoders/raw.cpp; sourceTree = SOURCE_ROOT; }; - DF2040911380CA400056300A /* raw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = raw.h; path = ../../audio/decoders/raw.h; sourceTree = SOURCE_ROOT; }; - DF2040921380CA400056300A /* vag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vag.cpp; path = ../../audio/decoders/vag.cpp; sourceTree = SOURCE_ROOT; }; - DF2040931380CA400056300A /* vag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vag.h; path = ../../audio/decoders/vag.h; sourceTree = SOURCE_ROOT; }; - DF2040941380CA400056300A /* voc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = voc.cpp; path = ../../audio/decoders/voc.cpp; sourceTree = SOURCE_ROOT; }; - DF2040951380CA400056300A /* voc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = voc.h; path = ../../audio/decoders/voc.h; sourceTree = SOURCE_ROOT; }; - DF2040961380CA400056300A /* vorbis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vorbis.cpp; path = ../../audio/decoders/vorbis.cpp; sourceTree = SOURCE_ROOT; }; - DF2040971380CA400056300A /* vorbis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vorbis.h; path = ../../audio/decoders/vorbis.h; sourceTree = SOURCE_ROOT; }; - DF2040981380CA400056300A /* wave.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wave.cpp; path = ../../audio/decoders/wave.cpp; sourceTree = SOURCE_ROOT; }; - DF2040991380CA400056300A /* wave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wave.h; path = ../../audio/decoders/wave.h; sourceTree = SOURCE_ROOT; }; - DF2040BC1380CA810056300A /* infogrames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = infogrames.cpp; path = ../../audio/mods/infogrames.cpp; sourceTree = SOURCE_ROOT; }; - DF2040BD1380CA810056300A /* infogrames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = infogrames.h; path = ../../audio/mods/infogrames.h; sourceTree = SOURCE_ROOT; }; - DF2040BE1380CA810056300A /* maxtrax.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = maxtrax.cpp; path = ../../audio/mods/maxtrax.cpp; sourceTree = SOURCE_ROOT; }; - DF2040BF1380CA810056300A /* maxtrax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = maxtrax.h; path = ../../audio/mods/maxtrax.h; sourceTree = SOURCE_ROOT; }; - DF2040C01380CA810056300A /* module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = module.cpp; path = ../../audio/mods/module.cpp; sourceTree = SOURCE_ROOT; }; - DF2040C11380CA810056300A /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../audio/mods/module.h; sourceTree = SOURCE_ROOT; }; - DF2040C21380CA810056300A /* paula.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = paula.cpp; path = ../../audio/mods/paula.cpp; sourceTree = SOURCE_ROOT; }; - DF2040C31380CA810056300A /* paula.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = paula.h; path = ../../audio/mods/paula.h; sourceTree = SOURCE_ROOT; }; - DF2040C41380CA810056300A /* protracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = protracker.cpp; path = ../../audio/mods/protracker.cpp; sourceTree = SOURCE_ROOT; }; - DF2040C51380CA810056300A /* protracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = protracker.h; path = ../../audio/mods/protracker.h; sourceTree = SOURCE_ROOT; }; - DF2040C61380CA810056300A /* rjp1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rjp1.cpp; path = ../../audio/mods/rjp1.cpp; sourceTree = SOURCE_ROOT; }; - DF2040C71380CA810056300A /* rjp1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rjp1.h; path = ../../audio/mods/rjp1.h; sourceTree = SOURCE_ROOT; }; - DF2040C81380CA810056300A /* soundfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = soundfx.cpp; path = ../../audio/mods/soundfx.cpp; sourceTree = SOURCE_ROOT; }; - DF2040C91380CA810056300A /* soundfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = soundfx.h; path = ../../audio/mods/soundfx.h; sourceTree = SOURCE_ROOT; }; - DF2040CA1380CA810056300A /* tfmx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tfmx.cpp; path = ../../audio/mods/tfmx.cpp; sourceTree = SOURCE_ROOT; }; - DF2040CB1380CA810056300A /* tfmx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tfmx.h; path = ../../audio/mods/tfmx.h; sourceTree = SOURCE_ROOT; }; - DF2040E51380CAA40056300A /* adlib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adlib.cpp; path = ../../audio/softsynth/adlib.cpp; sourceTree = SOURCE_ROOT; }; - DF2040E61380CAA40056300A /* appleiigs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = appleiigs.cpp; path = ../../audio/softsynth/appleiigs.cpp; sourceTree = SOURCE_ROOT; }; - DF2040E71380CAA40056300A /* cms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cms.cpp; path = ../../audio/softsynth/cms.cpp; sourceTree = SOURCE_ROOT; }; - DF2040E81380CAA40056300A /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cms.h; path = ../../audio/softsynth/cms.h; sourceTree = SOURCE_ROOT; }; - DF2040E91380CAA40056300A /* eas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = eas.cpp; path = ../../audio/softsynth/eas.cpp; sourceTree = SOURCE_ROOT; }; - DF2040EA1380CAA40056300A /* emumidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emumidi.h; path = ../../audio/softsynth/emumidi.h; sourceTree = SOURCE_ROOT; }; - DF2040EB1380CAA40056300A /* fluidsynth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fluidsynth.cpp; path = ../../audio/softsynth/fluidsynth.cpp; sourceTree = SOURCE_ROOT; }; - DF2040EC1380CAA40056300A /* mt32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mt32.cpp; path = ../../audio/softsynth/mt32.cpp; sourceTree = SOURCE_ROOT; }; - DF2040ED1380CAA40056300A /* pcspk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pcspk.cpp; path = ../../audio/softsynth/pcspk.cpp; sourceTree = SOURCE_ROOT; }; - DF2040EE1380CAA40056300A /* pcspk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pcspk.h; path = ../../audio/softsynth/pcspk.h; sourceTree = SOURCE_ROOT; }; - DF2040EF1380CAA40056300A /* sid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sid.cpp; path = ../../audio/softsynth/sid.cpp; sourceTree = SOURCE_ROOT; }; - DF2040F01380CAA40056300A /* sid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sid.h; path = ../../audio/softsynth/sid.h; sourceTree = SOURCE_ROOT; }; - DF2040F11380CAA40056300A /* wave6581.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wave6581.cpp; path = ../../audio/softsynth/wave6581.cpp; sourceTree = SOURCE_ROOT; }; - DF2040F21380CAA40056300A /* ym2612.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ym2612.cpp; path = ../../audio/softsynth/ym2612.cpp; sourceTree = SOURCE_ROOT; }; - DF2040F31380CAA40056300A /* ym2612.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ym2612.h; path = ../../audio/softsynth/ym2612.h; sourceTree = SOURCE_ROOT; }; + DF0E303F1252C6090082D593 /* cms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cms.cpp; sourceTree = ""; }; + DF0E30401252C6090082D593 /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = ""; }; DF224E020FB23BC500C8E453 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; DF2EC3E410E6490800765801 /* browser_osx.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = browser_osx.mm; sourceTree = ""; }; DF2EC3F610E64C0C00765801 /* dialogs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dialogs.cpp; sourceTree = ""; }; @@ -3663,12 +3354,16 @@ DF2EC50010E64D7C00765801 /* player_sid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = player_sid.h; sourceTree = ""; }; DF2EC50910E64DB300765801 /* textconsole.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = textconsole.cpp; sourceTree = ""; }; DF2EC50A10E64DB300765801 /* textconsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textconsole.h; sourceTree = ""; }; + DF2EC51010E64E3100765801 /* sid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sid.cpp; sourceTree = ""; }; + DF2EC51110E64E3100765801 /* sid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sid.h; sourceTree = ""; }; + DF2EC51710E64EE600765801 /* wave6581.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wave6581.cpp; sourceTree = ""; }; DF2FFB900F485D890006E566 /* dither.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dither.cpp; sourceTree = ""; }; DF2FFB910F485D890006E566 /* dither.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dither.h; sourceTree = ""; }; DF2FFB920F485D890006E566 /* pixelformat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pixelformat.h; sourceTree = ""; }; DF2FFBD10F485DFB0006E566 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; DF2FFBD20F485DFB0006E566 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; - DF2FFBD60F485E360006E566 /* gui-manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gui-manager.h"; sourceTree = ""; }; + DF2FFBD50F485E360006E566 /* gui-manager.hcpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gui-manager.hcpp; sourceTree = ""; }; + DF2FFBD60F485E360006E566 /* gui-manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui-manager.h; sourceTree = ""; }; DF2FFBDB0F485E480006E566 /* scummclassic.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = scummclassic.zip; sourceTree = ""; }; DF2FFBF80F4860A60006E566 /* posix-saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "posix-saves.cpp"; sourceTree = ""; }; DF2FFBF90F4860A60006E566 /* posix-saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "posix-saves.h"; sourceTree = ""; }; @@ -3746,6 +3441,26 @@ DF2FFD0F0F4870E50006E566 /* tucker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tucker.h; sourceTree = ""; }; DF2FFD290F48717F0006E566 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; DF2FFD2A0F48717F0006E566 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; + DF45B0F7116627DA009B85CC /* adpcm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adpcm.cpp; sourceTree = ""; }; + DF45B0F8116627DA009B85CC /* adpcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adpcm.h; sourceTree = ""; }; + DF45B0FA116627DA009B85CC /* aiff.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aiff.cpp; sourceTree = ""; }; + DF45B0FB116627DA009B85CC /* aiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aiff.h; sourceTree = ""; }; + DF45B0FD116627DA009B85CC /* flac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flac.cpp; sourceTree = ""; }; + DF45B0FE116627DA009B85CC /* flac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flac.h; sourceTree = ""; }; + DF45B100116627DA009B85CC /* iff_sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iff_sound.cpp; sourceTree = ""; }; + DF45B101116627DA009B85CC /* iff_sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iff_sound.h; sourceTree = ""; }; + DF45B103116627DA009B85CC /* mp3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mp3.cpp; sourceTree = ""; }; + DF45B104116627DA009B85CC /* mp3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mp3.h; sourceTree = ""; }; + DF45B106116627DA009B85CC /* raw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = raw.cpp; sourceTree = ""; }; + DF45B107116627DA009B85CC /* raw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = raw.h; sourceTree = ""; }; + DF45B109116627DA009B85CC /* vag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vag.cpp; sourceTree = ""; }; + DF45B10A116627DA009B85CC /* vag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vag.h; sourceTree = ""; }; + DF45B10C116627DA009B85CC /* voc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = voc.cpp; sourceTree = ""; }; + DF45B10D116627DA009B85CC /* voc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = voc.h; sourceTree = ""; }; + DF45B10F116627DA009B85CC /* vorbis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vorbis.cpp; sourceTree = ""; }; + DF45B110116627DA009B85CC /* vorbis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vorbis.h; sourceTree = ""; }; + DF45B112116627DA009B85CC /* wave.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wave.cpp; sourceTree = ""; }; + DF45B113116627DA009B85CC /* wave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wave.h; sourceTree = ""; }; DF45B176116628A5009B85CC /* animate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = animate.cpp; sourceTree = ""; }; DF45B177116628A5009B85CC /* animate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = animate.h; sourceTree = ""; }; DF45B178116628A5009B85CC /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; @@ -3808,97 +3523,6 @@ DF45B1C4116628A5009B85CC /* soundcmd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soundcmd.h; sourceTree = ""; }; DF45B1C6116628A5009B85CC /* seq_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = seq_decoder.cpp; sourceTree = ""; }; DF45B1C7116628A5009B85CC /* seq_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seq_decoder.h; sourceTree = ""; }; - DF46B6F21381E18900D08723 /* coroutine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coroutine.cpp; sourceTree = ""; }; - DF46B6F71381E1FF00D08723 /* towns_audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = towns_audio.cpp; path = ../../audio/softsynth/fmtowns_pc98/towns_audio.cpp; sourceTree = SOURCE_ROOT; }; - DF46B6F81381E1FF00D08723 /* towns_audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = towns_audio.h; path = ../../audio/softsynth/fmtowns_pc98/towns_audio.h; sourceTree = SOURCE_ROOT; }; - DF46B6F91381E1FF00D08723 /* towns_euphony.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = towns_euphony.cpp; path = ../../audio/softsynth/fmtowns_pc98/towns_euphony.cpp; sourceTree = SOURCE_ROOT; }; - DF46B6FA1381E1FF00D08723 /* towns_euphony.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = towns_euphony.h; path = ../../audio/softsynth/fmtowns_pc98/towns_euphony.h; sourceTree = SOURCE_ROOT; }; - DF46B6FB1381E1FF00D08723 /* towns_pc98_driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = towns_pc98_driver.cpp; path = ../../audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp; sourceTree = SOURCE_ROOT; }; - DF46B6FC1381E1FF00D08723 /* towns_pc98_driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = towns_pc98_driver.h; path = ../../audio/softsynth/fmtowns_pc98/towns_pc98_driver.h; sourceTree = SOURCE_ROOT; }; - DF46B6FD1381E1FF00D08723 /* towns_pc98_fmsynth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = towns_pc98_fmsynth.cpp; path = ../../audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp; sourceTree = SOURCE_ROOT; }; - DF46B6FE1381E1FF00D08723 /* towns_pc98_fmsynth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = towns_pc98_fmsynth.h; path = ../../audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h; sourceTree = SOURCE_ROOT; }; - DF46B70F1381E27000D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B7101381E27000D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B7111381E27000D08723 /* databases.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = databases.cpp; sourceTree = ""; }; - DF46B7121381E27000D08723 /* databases.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = databases.h; sourceTree = ""; }; - DF46B7131381E27000D08723 /* dbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dbase.cpp; sourceTree = ""; }; - DF46B7141381E27000D08723 /* dbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbase.h; sourceTree = ""; }; - DF46B7151381E27000D08723 /* iniconfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iniconfig.cpp; sourceTree = ""; }; - DF46B7161381E27000D08723 /* iniconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iniconfig.h; sourceTree = ""; }; - DF46B7171381E27000D08723 /* init_v7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = init_v7.cpp; sourceTree = ""; }; - DF46B7181381E27000D08723 /* inter_inca2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inter_inca2.cpp; sourceTree = ""; }; - DF46B7421381E40500D08723 /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = log.cpp; path = log/log.cpp; sourceTree = ""; }; - DF46B7431381E40500D08723 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = log.h; path = log/log.h; sourceTree = ""; }; - DF46B7471381E40F00D08723 /* modular-backend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "modular-backend.cpp"; sourceTree = ""; }; - DF46B7481381E40F00D08723 /* modular-backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "modular-backend.h"; sourceTree = ""; }; - DF46B7501381E46700D08723 /* actor_he.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = actor_he.h; sourceTree = ""; }; - DF46B7511381E46700D08723 /* player_v2base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = player_v2base.cpp; sourceTree = ""; }; - DF46B7521381E46700D08723 /* player_v2base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = player_v2base.h; sourceTree = ""; }; - DF46B7531381E46700D08723 /* player_v2cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = player_v2cms.h; sourceTree = ""; }; - DF46B75B1381E4A400D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B75C1381E4A400D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B75D1381E4A400D08723 /* detection_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = detection_tables.h; sourceTree = ""; }; - DF46B7611381E4D400D08723 /* robot_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = robot_decoder.cpp; sourceTree = ""; }; - DF46B7621381E4D400D08723 /* robot_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = robot_decoder.h; sourceTree = ""; }; - DF46B7661381E4E400D08723 /* vm_types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vm_types.cpp; sourceTree = ""; }; - DF46B76E1381E54200D08723 /* bufferedstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bufferedstream.h; sourceTree = ""; }; - DF46B76F1381E54200D08723 /* dcl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dcl.cpp; sourceTree = ""; }; - DF46B7701381E54200D08723 /* dcl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dcl.h; sourceTree = ""; }; - DF46B7711381E54200D08723 /* forbidden.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = forbidden.h; sourceTree = ""; }; - DF46B7721381E54200D08723 /* iff_container.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iff_container.cpp; sourceTree = ""; }; - DF46B7731381E54200D08723 /* substream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = substream.h; sourceTree = ""; }; - DF46B7741381E54200D08723 /* translation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = translation.h; sourceTree = ""; }; - DF46B7751381E54200D08723 /* winexe_ne.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winexe_ne.cpp; sourceTree = ""; }; - DF46B7761381E54200D08723 /* winexe_ne.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winexe_ne.h; sourceTree = ""; }; - DF46B7771381E54200D08723 /* winexe_pe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winexe_pe.cpp; sourceTree = ""; }; - DF46B7781381E54200D08723 /* winexe_pe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winexe_pe.h; sourceTree = ""; }; - DF46B7791381E54200D08723 /* winexe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winexe.cpp; sourceTree = ""; }; - DF46B77A1381E54200D08723 /* winexe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winexe.h; sourceTree = ""; }; - DF46B78E1381E58000D08723 /* palette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = palette.h; sourceTree = ""; }; - DF46B78F1381E58000D08723 /* png.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = png.cpp; sourceTree = ""; }; - DF46B7901381E58000D08723 /* png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = png.h; sourceTree = ""; }; - DF46B7911381E58000D08723 /* wincursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wincursor.cpp; sourceTree = ""; }; - DF46B7921381E58000D08723 /* wincursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wincursor.h; sourceTree = ""; }; - DF46B79D1381E5B500D08723 /* winfont.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winfont.cpp; sourceTree = ""; }; - DF46B79E1381E5B500D08723 /* winfont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winfont.h; sourceTree = ""; }; - DF46B7A31381E5D900D08723 /* sdl-timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "sdl-timer.cpp"; path = "sdl/sdl-timer.cpp"; sourceTree = ""; }; - DF46B7A41381E5D900D08723 /* sdl-timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sdl-timer.h"; path = "sdl/sdl-timer.h"; sourceTree = ""; }; - DF46B7A81381E5F100D08723 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; - DF46B7B21381E67800D08723 /* sdl-mutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "sdl-mutex.cpp"; path = "mutex/sdl/sdl-mutex.cpp"; sourceTree = ""; }; - DF46B7B31381E67800D08723 /* sdl-mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sdl-mutex.h"; path = "mutex/sdl/sdl-mutex.h"; sourceTree = ""; }; - DF46B7BB1381E6C000D08723 /* object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object.cpp; sourceTree = ""; }; - DF46B7BC1381E6C000D08723 /* object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object.h; sourceTree = ""; }; - DF46B7C61381E72500D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B7C71381E72500D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B7CD1381E76300D08723 /* sdl-events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "sdl-events.cpp"; path = "events/sdl/sdl-events.cpp"; sourceTree = ""; }; - DF46B7CE1381E76300D08723 /* sdl-events.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sdl-events.h"; path = "events/sdl/sdl-events.h"; sourceTree = ""; }; - DF46B7D41381E7C600D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B7D51381E7C600D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B83B1381F13500D08723 /* saveload_v7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveload_v7.cpp; sourceTree = ""; }; - DF46B8431381F35500D08723 /* saveload_inca2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveload_inca2.cpp; sourceTree = ""; }; - DF46B8471381F38700D08723 /* inter_v7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = inter_v7.cpp; sourceTree = ""; }; - DF46B84B1381F39E00D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B84C1381F39E00D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B8501381F3B400D08723 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; - DF46B8511381F3B400D08723 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DF46B85A1381F44E00D08723 /* dbopl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dbopl.cpp; path = ../../audio/softsynth/opl/dbopl.cpp; sourceTree = SOURCE_ROOT; }; - DF46B85B1381F44E00D08723 /* dbopl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dbopl.h; path = ../../audio/softsynth/opl/dbopl.h; sourceTree = SOURCE_ROOT; }; - DF46B85C1381F44E00D08723 /* dosbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dosbox.cpp; path = ../../audio/softsynth/opl/dosbox.cpp; sourceTree = SOURCE_ROOT; }; - DF46B85D1381F44E00D08723 /* dosbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dosbox.h; path = ../../audio/softsynth/opl/dosbox.h; sourceTree = SOURCE_ROOT; }; - DF46B85E1381F44E00D08723 /* mame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mame.cpp; path = ../../audio/softsynth/opl/mame.cpp; sourceTree = SOURCE_ROOT; }; - DF46B85F1381F44E00D08723 /* mame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mame.h; path = ../../audio/softsynth/opl/mame.h; sourceTree = SOURCE_ROOT; }; - DF46B86F1381F4A200D08723 /* sdl-audiocd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "sdl-audiocd.cpp"; path = "audiocd/sdl/sdl-audiocd.cpp"; sourceTree = ""; }; - DF46B8701381F4A200D08723 /* sdl-audiocd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sdl-audiocd.h"; path = "audiocd/sdl/sdl-audiocd.h"; sourceTree = ""; }; - DF46B87B1381F4F200D08723 /* default-audiocd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "default-audiocd.cpp"; path = "audiocd/default/default-audiocd.cpp"; sourceTree = ""; }; - DF46B87C1381F4F200D08723 /* default-audiocd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "default-audiocd.h"; path = "audiocd/default/default-audiocd.h"; sourceTree = ""; }; - DF46B8801381F4FF00D08723 /* audiocd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audiocd.h; path = audiocd/audiocd.h; sourceTree = ""; }; - DF46B8851381F56400D08723 /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; - DF46B8871381F5D800D08723 /* sdl-provider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "sdl-provider.cpp"; path = "sdl/sdl-provider.cpp"; sourceTree = ""; }; - DF46B8881381F5D800D08723 /* sdl-provider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sdl-provider.h"; path = "sdl/sdl-provider.h"; sourceTree = ""; }; - DF46B8901381F62B00D08723 /* adpcm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adpcm.cpp; sourceTree = ""; }; - DF46B8911381F62B00D08723 /* adpcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adpcm.h; sourceTree = ""; }; - DF46B8991381F6C400D08723 /* null.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = null.cpp; path = ../../audio/null.cpp; sourceTree = SOURCE_ROOT; }; - DF46B89A1381F6C400D08723 /* null.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = null.h; path = ../../audio/null.h; sourceTree = SOURCE_ROOT; }; DF573BFE0F5A81EA00961A72 /* kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel.h; sourceTree = ""; }; DF573BFF0F5A81EA00961A72 /* script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script.h; sourceTree = ""; }; DF573C000F5A81EA00961A72 /* seg_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seg_manager.h; sourceTree = ""; }; @@ -3922,11 +3546,19 @@ DF6118450FE3A8250042AD3F /* resource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resource.cpp; sourceTree = ""; }; DF6118460FE3A8250042AD3F /* resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resource.h; sourceTree = ""; }; DF6118540FE3A8990042AD3F /* disk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disk.cpp; sourceTree = ""; }; + DF6118590FE3A9020042AD3F /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = ""; }; + DF6118600FE3A9410042AD3F /* dxa_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxa_decoder.cpp; sourceTree = ""; }; + DF6118610FE3A9410042AD3F /* dxa_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dxa_decoder.h; sourceTree = ""; }; + DF6118620FE3A9410042AD3F /* flic_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flic_decoder.cpp; sourceTree = ""; }; + DF6118630FE3A9410042AD3F /* flic_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flic_decoder.h; sourceTree = ""; }; + DF6118640FE3A9410042AD3F /* smk_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smk_decoder.cpp; sourceTree = ""; }; + DF6118650FE3A9410042AD3F /* smk_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smk_decoder.h; sourceTree = ""; }; DF6118790FE3A9AA0042AD3F /* saveconverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveconverter.cpp; sourceTree = ""; }; DF61187A0FE3A9AA0042AD3F /* saveconverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = saveconverter.h; sourceTree = ""; }; DF61187B0FE3A9AA0042AD3F /* saveconverter_v2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveconverter_v2.cpp; sourceTree = ""; }; DF61187C0FE3A9AA0042AD3F /* saveconverter_v3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveconverter_v3.cpp; sourceTree = ""; }; DF61187D0FE3A9AA0042AD3F /* saveconverter_v4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveconverter_v4.cpp; sourceTree = ""; }; + DF61187E0FE3A9AA0042AD3F /* saveconverter_v6.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveconverter_v6.cpp; sourceTree = ""; }; DF61187F0FE3A9AA0042AD3F /* savefile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = savefile.cpp; sourceTree = ""; }; DF6118800FE3A9AA0042AD3F /* savefile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = savefile.h; sourceTree = ""; }; DF6118810FE3A9AA0042AD3F /* savehandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = savehandler.cpp; sourceTree = ""; }; @@ -3945,6 +3577,8 @@ DF6118B70FE3AA280042AD3F /* text_lol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_lol.h; sourceTree = ""; }; DF6118C60FE3AABD0042AD3F /* player_v2cms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = player_v2cms.cpp; sourceTree = ""; }; DF6118CB0FE3AAFD0042AD3F /* hardwarekeys.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hardwarekeys.cpp; sourceTree = ""; }; + DF6118CF0FE3AB560042AD3F /* mame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mame.cpp; sourceTree = ""; }; + DF6118D00FE3AB560042AD3F /* mame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mame.h; sourceTree = ""; }; DF6BF4C010529DA50069811F /* conversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = conversion.cpp; sourceTree = ""; }; DF6BF4C110529DA50069811F /* conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conversion.h; sourceTree = ""; }; DF6BF4C210529DA50069811F /* jpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jpeg.cpp; sourceTree = ""; }; @@ -3963,6 +3597,10 @@ DF6BF4F910529F140069811F /* EventRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventRecorder.h; sourceTree = ""; }; DF6BF4FA10529F140069811F /* list_intern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = list_intern.h; sourceTree = ""; }; DF6BF4FB10529F140069811F /* serializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serializer.h; sourceTree = ""; }; + DF6BF50210529F540069811F /* maxtrax.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = maxtrax.cpp; sourceTree = ""; }; + DF6BF50310529F540069811F /* maxtrax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = maxtrax.h; sourceTree = ""; }; + DF6BF50410529F540069811F /* tfmx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tfmx.cpp; sourceTree = ""; }; + DF6BF50510529F540069811F /* tfmx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tfmx.h; sourceTree = ""; }; DF7585C3100CB66E00CC3324 /* expression.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = expression.cpp; sourceTree = ""; }; DF7585C4100CB66E00CC3324 /* expression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expression.h; sourceTree = ""; }; DF7585C5100CB66E00CC3324 /* hotspots.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hotspots.cpp; sourceTree = ""; }; @@ -4023,6 +3661,8 @@ DF7F288911FF244F00159131 /* Tooltip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tooltip.cpp; sourceTree = ""; }; DF7F288A11FF244F00159131 /* Tooltip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tooltip.h; sourceTree = ""; }; DF7F289111FF247300159131 /* translation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = translation.cpp; sourceTree = ""; }; + DF7F289E11FF24B000159131 /* mac_snd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mac_snd.cpp; sourceTree = ""; }; + DF7F289F11FF24B000159131 /* mac_snd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mac_snd.h; sourceTree = ""; }; DF7F28A311FF24C400159131 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; DF7F28A411FF24C400159131 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; DF841FD90E7BA61800F5680E /* iphone_keyboard.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = iphone_keyboard.m; sourceTree = ""; }; @@ -5065,21 +4705,54 @@ DF842A4C0E7BBBEB00F5680E /* posix-fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "posix-fs.h"; sourceTree = ""; }; DF842A6B0E7BBD5700F5680E /* stdiostream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stdiostream.cpp; sourceTree = ""; }; DF842A6C0E7BBD5700F5680E /* stdiostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdiostream.h; sourceTree = ""; }; + DF842A6F0E7BBDB200F5680E /* musicplugin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = musicplugin.cpp; sourceTree = ""; }; + DF842A700E7BBDB200F5680E /* musicplugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = musicplugin.h; sourceTree = ""; }; + DF895BFC124C24350077F6E8 /* coktel_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coktel_decoder.cpp; sourceTree = ""; }; + DF895BFD124C24350077F6E8 /* coktel_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coktel_decoder.h; sourceTree = ""; }; DF895C01124C24680077F6E8 /* player_towns.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = player_towns.cpp; sourceTree = ""; }; DF895C02124C24680077F6E8 /* player_towns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = player_towns.h; sourceTree = ""; }; + DF895C08124C24B50077F6E8 /* appleiigs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = appleiigs.cpp; sourceTree = ""; }; + DF895C0D124C24C00077F6E8 /* towns_audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = towns_audio.cpp; sourceTree = ""; }; + DF895C0E124C24C00077F6E8 /* towns_audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = towns_audio.h; sourceTree = ""; }; + DF895C0F124C24C00077F6E8 /* towns_euphony.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = towns_euphony.cpp; sourceTree = ""; }; + DF895C10124C24C00077F6E8 /* towns_euphony.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = towns_euphony.h; sourceTree = ""; }; + DF895C11124C24C00077F6E8 /* towns_pc98_driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = towns_pc98_driver.cpp; sourceTree = ""; }; + DF895C12124C24C00077F6E8 /* towns_pc98_driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = towns_pc98_driver.h; sourceTree = ""; }; + DF895C13124C24C00077F6E8 /* towns_pc98_fmsynth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = towns_pc98_fmsynth.cpp; sourceTree = ""; }; + DF895C14124C24C00077F6E8 /* towns_pc98_fmsynth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = towns_pc98_fmsynth.h; sourceTree = ""; }; DF895C23124C25150077F6E8 /* detection_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = detection_tables.h; sourceTree = ""; }; DF895C24124C25150077F6E8 /* init_fascin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = init_fascin.cpp; sourceTree = ""; }; DF895C28124C25350077F6E8 /* kernel_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_tables.h; sourceTree = ""; }; DF895C29124C25350077F6E8 /* script_patches.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = script_patches.cpp; sourceTree = ""; }; DF895C33124C26660077F6E8 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-72.png"; sourceTree = ""; }; DF895C40124C271F0077F6E8 /* icon4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon4.png; sourceTree = ""; }; + DF895CAB124E58980077F6E8 /* indeo3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = indeo3.cpp; sourceTree = ""; }; + DF895CAC124E58980077F6E8 /* indeo3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = indeo3.h; sourceTree = ""; }; + DF895CAD124E58980077F6E8 /* mjpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mjpeg.cpp; sourceTree = ""; }; + DF895CAE124E58980077F6E8 /* mjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mjpeg.h; sourceTree = ""; }; + DF895CAF124E58980077F6E8 /* qdm2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qdm2.cpp; sourceTree = ""; }; + DF895CB0124E58980077F6E8 /* qdm2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qdm2.h; sourceTree = ""; }; + DF895CB1124E58980077F6E8 /* qdm2data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qdm2data.h; sourceTree = ""; }; + DF895CB2124E58980077F6E8 /* qtrle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qtrle.cpp; sourceTree = ""; }; + DF895CB3124E58980077F6E8 /* qtrle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qtrle.h; sourceTree = ""; }; + DF895CB4124E58980077F6E8 /* rpza.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rpza.cpp; sourceTree = ""; }; + DF895CB5124E58980077F6E8 /* rpza.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpza.h; sourceTree = ""; }; + DF895CB6124E58980077F6E8 /* smc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smc.cpp; sourceTree = ""; }; + DF895CB7124E58980077F6E8 /* smc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smc.h; sourceTree = ""; }; DF89C2870F62D55C00D756B6 /* sprites_lol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sprites_lol.cpp; sourceTree = ""; }; DF89C2A30F62D79E00D756B6 /* script.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = script.cpp; sourceTree = ""; }; + DF89C2B80F62D91000D756B6 /* timestamp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timestamp.cpp; sourceTree = ""; }; + DF89C2B90F62D91000D756B6 /* timestamp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timestamp.h; sourceTree = ""; }; DF90E9B410AEDA5300C8F93F /* detection_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = detection_tables.h; sourceTree = ""; }; DF90E9BD10AEDA9B00C8F93F /* selector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = selector.cpp; sourceTree = ""; }; DF90EAA310B0234300C8F93F /* draw_playtoons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = draw_playtoons.cpp; sourceTree = ""; }; DF90EAAB10B0236F00C8F93F /* staticres.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = staticres.cpp; sourceTree = ""; }; DF90EAAC10B0236F00C8F93F /* staticres.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = staticres.h; sourceTree = ""; }; + DF90EAB610B023D100C8F93F /* avi_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = avi_decoder.cpp; sourceTree = ""; }; + DF90EAB710B023D100C8F93F /* avi_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = avi_decoder.h; sourceTree = ""; }; + DF90EAC010B023F400C8F93F /* codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codec.h; sourceTree = ""; }; + DF90EAC110B023F400C8F93F /* msvideo1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = msvideo1.cpp; sourceTree = ""; }; + DF90EAC210B023F400C8F93F /* msvideo1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msvideo1.h; sourceTree = ""; }; DF9B9246118E46730069C19D /* error.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = error.cpp; sourceTree = ""; }; DF9B9247118E46730069C19D /* error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error.h; sourceTree = ""; }; DF9B924F118E46A00069C19D /* fontsjis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fontsjis.cpp; sourceTree = ""; }; @@ -5092,10 +4765,12 @@ DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thumbnail_intern.cpp; sourceTree = ""; }; DFAAD2390F50120E00C3A4E2 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; DFAAD23A0F50120E00C3A4E2 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DFADEBB113820DF500C46364 /* maccursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = maccursor.cpp; sourceTree = ""; }; - DFADEBB213820DF500C46364 /* maccursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = maccursor.h; sourceTree = ""; }; - DFADEBB613820E0C00C46364 /* posix-fs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "posix-fs.cpp"; sourceTree = ""; }; - DFADEC061382140300C46364 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + DFB0576211B753AF0015AE65 /* mpeg_player.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mpeg_player.cpp; sourceTree = ""; }; + DFB0576311B753AF0015AE65 /* mpeg_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpeg_player.h; sourceTree = ""; }; + DFB0576411B753AF0015AE65 /* qt_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qt_decoder.cpp; sourceTree = ""; }; + DFB0576511B753AF0015AE65 /* qt_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qt_decoder.h; sourceTree = ""; }; + DFB0576611B753AF0015AE65 /* video_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video_decoder.cpp; sourceTree = ""; }; + DFB0576711B753AF0015AE65 /* video_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_decoder.h; sourceTree = ""; }; DFB0577311B753DA0015AE65 /* debug-channels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "debug-channels.h"; sourceTree = ""; }; DFB0577411B753DA0015AE65 /* rational.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rational.cpp; sourceTree = ""; }; DFB0577511B753DA0015AE65 /* rational.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rational.h; sourceTree = ""; }; @@ -5106,6 +4781,8 @@ DFB0578911B754570015AE65 /* maciconbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = maciconbar.h; sourceTree = ""; }; DFB0578F11B7547D0015AE65 /* pict.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pict.cpp; sourceTree = ""; }; DFB0579011B7547D0015AE65 /* pict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pict.h; sourceTree = ""; }; + DFB0579611B7549C0015AE65 /* cinepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cinepak.cpp; sourceTree = ""; }; + DFB0579711B7549C0015AE65 /* cinepak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cinepak.h; sourceTree = ""; }; DFC8301A0F48AF18005EF03C /* detection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = detection.cpp; sourceTree = ""; }; DFC8301E0F48AF18005EF03C /* gc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gc.cpp; sourceTree = ""; }; DFC8301F0F48AF18005EF03C /* gc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gc.h; sourceTree = ""; }; @@ -5134,6 +4811,8 @@ DFCDC6D7116629CE00A7D2A0 /* kparse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kparse.cpp; sourceTree = ""; }; DFCDC6D8116629CE00A7D2A0 /* selector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = selector.h; sourceTree = ""; }; DFCDC6F611662AAB00A7D2A0 /* resource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resource.cpp; sourceTree = ""; }; + DFCDC6FC11662AD700A7D2A0 /* msrle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = msrle.cpp; sourceTree = ""; }; + DFCDC6FD11662AD700A7D2A0 /* msrle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msrle.h; sourceTree = ""; }; DFCDC70311662B0200A7D2A0 /* saveload_fascin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = saveload_fascin.cpp; sourceTree = ""; }; DFCDC70911662B6B00A7D2A0 /* macresman.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macresman.cpp; sourceTree = ""; }; DFCDC70A11662B6B00A7D2A0 /* macresman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macresman.h; sourceTree = ""; }; @@ -5263,10 +4942,16 @@ DFE477950D81F4E900B6D1FB /* debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugger.h; sourceTree = ""; }; DFE477960D81F4E900B6D1FB /* dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dialog.cpp; sourceTree = ""; }; DFE477970D81F4E900B6D1FB /* dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dialog.h; sourceTree = ""; }; + DFE477980D81F4E900B6D1FB /* editable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = editable.cpp; sourceTree = ""; }; + DFE477990D81F4E900B6D1FB /* editable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = editable.h; sourceTree = ""; }; + DFE4779A0D81F4E900B6D1FB /* EditTextWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditTextWidget.cpp; sourceTree = ""; }; + DFE4779B0D81F4E900B6D1FB /* EditTextWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditTextWidget.h; sourceTree = ""; }; DFE4779E0D81F4E900B6D1FB /* Key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Key.cpp; sourceTree = ""; }; DFE4779F0D81F4E900B6D1FB /* Key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Key.h; sourceTree = ""; }; DFE477A20D81F4E900B6D1FB /* launcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = launcher.cpp; sourceTree = ""; }; DFE477A30D81F4E900B6D1FB /* launcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = launcher.h; sourceTree = ""; }; + DFE477A40D81F4E900B6D1FB /* ListWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ListWidget.cpp; sourceTree = ""; }; + DFE477A50D81F4E900B6D1FB /* ListWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListWidget.h; sourceTree = ""; }; DFE477A60D81F4E900B6D1FB /* massadd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = massadd.cpp; sourceTree = ""; }; DFE477A70D81F4E900B6D1FB /* massadd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = massadd.h; sourceTree = ""; }; DFE477A80D81F4E900B6D1FB /* message.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message.cpp; sourceTree = ""; }; @@ -5275,10 +4960,54 @@ DFE477AE0D81F4E900B6D1FB /* object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object.h; sourceTree = ""; }; DFE477AF0D81F4E900B6D1FB /* options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = options.cpp; sourceTree = ""; }; DFE477B00D81F4E900B6D1FB /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; + DFE477B10D81F4E900B6D1FB /* PopUpWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PopUpWidget.cpp; sourceTree = ""; }; + DFE477B20D81F4E900B6D1FB /* PopUpWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PopUpWidget.h; sourceTree = ""; }; + DFE477B30D81F4E900B6D1FB /* ScrollBarWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScrollBarWidget.cpp; sourceTree = ""; }; + DFE477B40D81F4E900B6D1FB /* ScrollBarWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollBarWidget.h; sourceTree = ""; }; + DFE477B50D81F4E900B6D1FB /* TabWidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TabWidget.cpp; sourceTree = ""; }; + DFE477B60D81F4E900B6D1FB /* TabWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabWidget.h; sourceTree = ""; }; DFE477BA0D81F4E900B6D1FB /* themebrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = themebrowser.cpp; sourceTree = ""; }; DFE477BB0D81F4E900B6D1FB /* themebrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = themebrowser.h; sourceTree = ""; }; DFE477C40D81F4E900B6D1FB /* widget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cpp; sourceTree = ""; }; DFE477C50D81F4E900B6D1FB /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = ""; }; + DFE477CB0D81F4E900B6D1FB /* audiocd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiocd.cpp; sourceTree = ""; }; + DFE477CC0D81F4E900B6D1FB /* audiocd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiocd.h; sourceTree = ""; }; + DFE477CD0D81F4E900B6D1FB /* audiostream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiostream.cpp; sourceTree = ""; }; + DFE477CE0D81F4E900B6D1FB /* audiostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiostream.h; sourceTree = ""; }; + DFE477D10D81F4E900B6D1FB /* fmopl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fmopl.cpp; sourceTree = ""; }; + DFE477D20D81F4E900B6D1FB /* fmopl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fmopl.h; sourceTree = ""; }; + DFE477D50D81F4E900B6D1FB /* mididrv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mididrv.cpp; sourceTree = ""; }; + DFE477D60D81F4E900B6D1FB /* mididrv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mididrv.h; sourceTree = ""; }; + DFE477D70D81F4E900B6D1FB /* midiparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = midiparser.cpp; sourceTree = ""; }; + DFE477D80D81F4E900B6D1FB /* midiparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midiparser.h; sourceTree = ""; }; + DFE477D90D81F4E900B6D1FB /* midiparser_smf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = midiparser_smf.cpp; sourceTree = ""; }; + DFE477DA0D81F4E900B6D1FB /* midiparser_xmidi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = midiparser_xmidi.cpp; sourceTree = ""; }; + DFE477DB0D81F4E900B6D1FB /* mixer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mixer.cpp; sourceTree = ""; }; + DFE477DC0D81F4E900B6D1FB /* mixer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mixer.h; sourceTree = ""; }; + DFE477DE0D81F4E900B6D1FB /* infogrames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = infogrames.cpp; sourceTree = ""; }; + DFE477DF0D81F4E900B6D1FB /* infogrames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = infogrames.h; sourceTree = ""; }; + DFE477E00D81F4E900B6D1FB /* module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = module.cpp; sourceTree = ""; }; + DFE477E10D81F4E900B6D1FB /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; + DFE477E20D81F4E900B6D1FB /* paula.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = paula.cpp; sourceTree = ""; }; + DFE477E30D81F4E900B6D1FB /* paula.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = paula.h; sourceTree = ""; }; + DFE477E40D81F4E900B6D1FB /* protracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = protracker.cpp; sourceTree = ""; }; + DFE477E50D81F4E900B6D1FB /* protracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protracker.h; sourceTree = ""; }; + DFE477E60D81F4E900B6D1FB /* rjp1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rjp1.cpp; sourceTree = ""; }; + DFE477E70D81F4E900B6D1FB /* rjp1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rjp1.h; sourceTree = ""; }; + DFE477E80D81F4E900B6D1FB /* soundfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soundfx.cpp; sourceTree = ""; }; + DFE477E90D81F4E900B6D1FB /* soundfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soundfx.h; sourceTree = ""; }; + DFE477ED0D81F4E900B6D1FB /* mpu401.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mpu401.cpp; sourceTree = ""; }; + DFE477EE0D81F4E900B6D1FB /* mpu401.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpu401.h; sourceTree = ""; }; + DFE477EF0D81F4E900B6D1FB /* null.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = null.cpp; sourceTree = ""; }; + DFE477F00D81F4E900B6D1FB /* rate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rate.cpp; sourceTree = ""; }; + DFE477F10D81F4E900B6D1FB /* rate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rate.h; sourceTree = ""; }; + DFE477F70D81F4E900B6D1FB /* adlib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adlib.cpp; sourceTree = ""; }; + DFE477F80D81F4E900B6D1FB /* emumidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emumidi.h; sourceTree = ""; }; + DFE477F90D81F4E900B6D1FB /* fluidsynth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fluidsynth.cpp; sourceTree = ""; }; + DFE478210D81F4E900B6D1FB /* pcspk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pcspk.cpp; sourceTree = ""; }; + DFE478220D81F4E900B6D1FB /* pcspk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcspk.h; sourceTree = ""; }; + DFE478230D81F4E900B6D1FB /* ym2612.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ym2612.cpp; sourceTree = ""; }; + DFE478240D81F4E900B6D1FB /* ym2612.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ym2612.h; sourceTree = ""; }; DFE47C810D81F86900B6D1FB /* kyra.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = kyra.dat; sourceTree = ""; }; DFE47C820D81F86900B6D1FB /* lure.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = lure.dat; sourceTree = ""; }; DFE47C830D81F86900B6D1FB /* queen.tbl */ = {isa = PBXFileReference; lastKnownFileType = file; path = queen.tbl; sourceTree = ""; }; @@ -5293,7 +5022,11 @@ DFEC5D0F1166C5CF00C90552 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; DFEC5D341166C67300C90552 /* savestate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = savestate.cpp; sourceTree = ""; }; DFEC5D351166C67300C90552 /* savestate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = savestate.h; sourceTree = ""; }; + DFEC5D3D1166C6B400C90552 /* dbopl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dbopl.cpp; sourceTree = ""; }; + DFEC5D3E1166C6B400C90552 /* dbopl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbopl.h; sourceTree = ""; }; DFF4DFFC0F4B449F00C50BC7 /* Info.plist.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist.in; sourceTree = ""; }; + DFF958A90FB222F300A3EC78 /* dosbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dosbox.cpp; sourceTree = ""; }; + DFF958AA0FB222F300A3EC78 /* dosbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dosbox.h; sourceTree = ""; }; DFF95CCA0FB22D5700A3EC78 /* ScummVM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScummVM.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -5313,7 +5046,6 @@ DFF959080FB22D3300A3EC78 /* libvorbisidec.a in Frameworks */, DFF95CCF0FB22D8500A3EC78 /* libmpeg2.a in Frameworks */, DF224E040FB23BC500C8E453 /* OpenGLES.framework in Frameworks */, - DFADEC071382140300C46364 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5370,7 +5102,6 @@ DF842A170E7BB34E00F5680E /* CoreFoundation.framework */, DF842A180E7BB34E00F5680E /* Foundation.framework */, DF842A190E7BB34E00F5680E /* UIKit.framework */, - DFADEC061382140300C46364 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; @@ -5395,8 +5126,6 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - DF2040461380C9ED0056300A /* audio */, - DF203F521380C2470056300A /* video */, DF9B9277118E475D0069C19D /* games */, DFD6476A0F49F7D2008E18EF /* libs */, DF841FF50E7BA6A600F5680E /* engines */, @@ -5405,6 +5134,7 @@ DFE473950D81F4E800B6D1FB /* common */, DFE477520D81F4E900B6D1FB /* graphics */, DFE477880D81F4E900B6D1FB /* gui */, + DFE477C60D81F4E900B6D1FB /* sound */, 29B97317FDCFA39411CA2CEA /* Resources */, DFA2A57A118E433A00344DFD /* Resources-iPad */, 29B97323FDCFA39411CA2CEA /* Frameworks */, @@ -5457,33 +5187,15 @@ 8CD1ECC5126202AA00FA198C /* hugo */ = { isa = PBXGroup; children = ( - DF203FC01380C3BC0056300A /* console.cpp */, - DF203FC11380C3BC0056300A /* console.h */, - DF203FC21380C3BC0056300A /* dialogs.cpp */, - DF203FC31380C3BC0056300A /* dialogs.h */, - DF203FC41380C3BC0056300A /* file_v1d.cpp */, - DF203FC51380C3BC0056300A /* file_v1w.cpp */, - DF203FC61380C3BC0056300A /* file_v2d.cpp */, - DF203FC71380C3BC0056300A /* file_v2w.cpp */, - DF203FC81380C3BC0056300A /* file_v3d.cpp */, - DF203FC91380C3BC0056300A /* object_v1d.cpp */, - DF203FCA1380C3BC0056300A /* object_v1w.cpp */, - DF203FCB1380C3BC0056300A /* object_v2d.cpp */, - DF203FCC1380C3BC0056300A /* object_v3d.cpp */, - DF203FCD1380C3BC0056300A /* object.cpp */, - DF203FCE1380C3BC0056300A /* object.h */, - DF203FCF1380C3BC0056300A /* parser_v1d.cpp */, - DF203FD01380C3BC0056300A /* parser_v1w.cpp */, - DF203FD11380C3BC0056300A /* parser_v2d.cpp */, - DF203FD21380C3BC0056300A /* parser_v3d.cpp */, - DF203FD31380C3BC0056300A /* text.cpp */, - DF203FD41380C3BC0056300A /* text.h */, 8CD1ECC6126202AA00FA198C /* detection.cpp */, 8CD1ECC7126202AA00FA198C /* display.cpp */, 8CD1ECC8126202AA00FA198C /* display.h */, + 8CD1ECC9126202AA00FA198C /* engine.cpp */, + 8CD1ECCA126202AA00FA198C /* engine.h */, 8CD1ECCB126202AA00FA198C /* file.cpp */, 8CD1ECCC126202AA00FA198C /* file.h */, 8CD1ECCD126202AA00FA198C /* game.h */, + 8CD1ECCE126202AA00FA198C /* global.h */, 8CD1ECCF126202AA00FA198C /* hugo.cpp */, 8CD1ECD0126202AA00FA198C /* hugo.h */, 8CD1ECD1126202AA00FA198C /* intro.cpp */, @@ -5593,6 +5305,8 @@ isa = PBXGroup; children = ( DF6118CB0FE3AAFD0042AD3F /* hardwarekeys.cpp */, + DF0942350F63CB9A002D821E /* events.cpp */, + DF0942370F63CB9A002D821E /* graphics.cpp */, DF0942390F63CB9A002D821E /* main.cpp */, DF09423C0F63CB9A002D821E /* sdl.cpp */, DF09423D0F63CB9A002D821E /* sdl.h */, @@ -5613,189 +5327,28 @@ path = demos; sourceTree = ""; }; - DF203F521380C2470056300A /* video */ = { + DF2FFB940F485D950006E566 /* video */ = { isa = PBXGroup; children = ( - DF203F7B1380C27A0056300A /* codecs */, - DF203F531380C2740056300A /* avi_decoder.cpp */, - DF203F541380C2740056300A /* avi_decoder.h */, - DF203F551380C2740056300A /* coktel_decoder.cpp */, - DF203F561380C2740056300A /* coktel_decoder.h */, - DF203F571380C2740056300A /* dxa_decoder.cpp */, - DF203F581380C2740056300A /* dxa_decoder.h */, - DF203F591380C2740056300A /* flic_decoder.cpp */, - DF203F5A1380C2740056300A /* flic_decoder.h */, - DF203F5D1380C2740056300A /* qt_decoder.cpp */, - DF203F5E1380C2750056300A /* qt_decoder.h */, - DF203F5F1380C2750056300A /* smk_decoder.cpp */, - DF203F601380C2750056300A /* smk_decoder.h */, - DF203F611380C2750056300A /* video_decoder.cpp */, - DF203F621380C2750056300A /* video_decoder.h */, + DF90EAB610B023D100C8F93F /* avi_decoder.cpp */, + DF90EAB710B023D100C8F93F /* avi_decoder.h */, + DF90EABF10B023F300C8F93F /* codecs */, + DF895BFC124C24350077F6E8 /* coktel_decoder.cpp */, + DF895BFD124C24350077F6E8 /* coktel_decoder.h */, + DF6118600FE3A9410042AD3F /* dxa_decoder.cpp */, + DF6118610FE3A9410042AD3F /* dxa_decoder.h */, + DF6118620FE3A9410042AD3F /* flic_decoder.cpp */, + DF6118630FE3A9410042AD3F /* flic_decoder.h */, + DFB0576211B753AF0015AE65 /* mpeg_player.cpp */, + DFB0576311B753AF0015AE65 /* mpeg_player.h */, + DFB0576411B753AF0015AE65 /* qt_decoder.cpp */, + DFB0576511B753AF0015AE65 /* qt_decoder.h */, + DF6118640FE3A9410042AD3F /* smk_decoder.cpp */, + DF6118650FE3A9410042AD3F /* smk_decoder.h */, + DFB0576611B753AF0015AE65 /* video_decoder.cpp */, + DFB0576711B753AF0015AE65 /* video_decoder.h */, ); - name = video; - sourceTree = ""; - }; - DF203F7B1380C27A0056300A /* codecs */ = { - isa = PBXGroup; - children = ( - DF203F7C1380C2920056300A /* cdtoons.cpp */, - DF203F7D1380C2920056300A /* cdtoons.h */, - DF203F7E1380C2920056300A /* cinepak.cpp */, - DF203F7F1380C2920056300A /* cinepak.h */, - DF203F801380C2920056300A /* codec.h */, - DF203F811380C2920056300A /* indeo3.cpp */, - DF203F821380C2920056300A /* indeo3.h */, - DF203F831380C2920056300A /* mjpeg.cpp */, - DF203F841380C2920056300A /* mjpeg.h */, - DF203F851380C2920056300A /* msrle.cpp */, - DF203F861380C2920056300A /* msrle.h */, - DF203F871380C2920056300A /* msvideo1.cpp */, - DF203F881380C2920056300A /* msvideo1.h */, - DF203F891380C2920056300A /* qdm2.cpp */, - DF203F8A1380C2920056300A /* qdm2.h */, - DF203F8B1380C2920056300A /* qdm2data.h */, - DF203F8C1380C2920056300A /* qtrle.cpp */, - DF203F8D1380C2920056300A /* qtrle.h */, - DF203F8E1380C2920056300A /* rpza.cpp */, - DF203F8F1380C2920056300A /* rpza.h */, - DF203F901380C2920056300A /* smc.cpp */, - DF203F911380C2920056300A /* smc.h */, - DF203F921380C2920056300A /* truemotion1.cpp */, - DF203F931380C2920056300A /* truemotion1.h */, - DF203F941380C2920056300A /* truemotion1data.h */, - ); - name = codecs; - sourceTree = ""; - }; - DF2040211380C8A60056300A /* widgets */ = { - isa = PBXGroup; - children = ( - DF2040221380C8B70056300A /* editable.cpp */, - DF2040231380C8B70056300A /* editable.h */, - DF2040241380C8B70056300A /* edittext.cpp */, - DF2040251380C8B70056300A /* edittext.h */, - DF2040261380C8B70056300A /* list.cpp */, - DF2040271380C8B70056300A /* list.h */, - DF2040281380C8B70056300A /* popup.cpp */, - DF2040291380C8B70056300A /* popup.h */, - DF20402A1380C8B70056300A /* scrollbar.cpp */, - DF20402B1380C8B70056300A /* scrollbar.h */, - DF20402C1380C8B70056300A /* tab.cpp */, - DF20402D1380C8B70056300A /* tab.h */, - ); - name = widgets; - sourceTree = ""; - }; - DF2040461380C9ED0056300A /* audio */ = { - isa = PBXGroup; - children = ( - DF46B8991381F6C400D08723 /* null.cpp */, - DF46B89A1381F6C400D08723 /* null.h */, - DF2040E41380CA8C0056300A /* softsynth */, - DF2040BB1380CA5C0056300A /* mods */, - DF2040821380CA280056300A /* decoders */, - DF2040471380CA230056300A /* audiostream.cpp */, - DF2040481380CA230056300A /* audiostream.h */, - DF2040491380CA230056300A /* fmopl.cpp */, - DF20404A1380CA230056300A /* fmopl.h */, - DF20404B1380CA230056300A /* mididrv.cpp */, - DF20404C1380CA230056300A /* mididrv.h */, - DF20404D1380CA230056300A /* midiparser_smf.cpp */, - DF20404E1380CA230056300A /* midiparser_xmidi.cpp */, - DF20404F1380CA230056300A /* midiparser.cpp */, - DF2040501380CA230056300A /* midiparser.h */, - DF2040511380CA230056300A /* midiplayer.cpp */, - DF2040521380CA230056300A /* midiplayer.h */, - DF2040531380CA230056300A /* mixer_intern.h */, - DF2040541380CA230056300A /* mixer.cpp */, - DF2040551380CA230056300A /* mixer.h */, - DF2040561380CA230056300A /* mpu401.cpp */, - DF2040571380CA230056300A /* mpu401.h */, - DF2040581380CA230056300A /* musicplugin.cpp */, - DF2040591380CA230056300A /* musicplugin.h */, - DF20405A1380CA230056300A /* rate.cpp */, - DF20405B1380CA230056300A /* rate.h */, - DF20405C1380CA230056300A /* timestamp.cpp */, - DF20405D1380CA230056300A /* timestamp.h */, - ); - name = audio; - sourceTree = ""; - }; - DF2040821380CA280056300A /* decoders */ = { - isa = PBXGroup; - children = ( - DF2040831380CA400056300A /* adpcm_intern.h */, - DF2040841380CA400056300A /* adpcm.cpp */, - DF2040851380CA400056300A /* adpcm.h */, - DF2040861380CA400056300A /* aiff.cpp */, - DF2040871380CA400056300A /* aiff.h */, - DF2040881380CA400056300A /* flac.cpp */, - DF2040891380CA400056300A /* flac.h */, - DF20408A1380CA400056300A /* iff_sound.cpp */, - DF20408B1380CA400056300A /* iff_sound.h */, - DF20408C1380CA400056300A /* mac_snd.cpp */, - DF20408D1380CA400056300A /* mac_snd.h */, - DF20408E1380CA400056300A /* mp3.cpp */, - DF20408F1380CA400056300A /* mp3.h */, - DF2040901380CA400056300A /* raw.cpp */, - DF2040911380CA400056300A /* raw.h */, - DF2040921380CA400056300A /* vag.cpp */, - DF2040931380CA400056300A /* vag.h */, - DF2040941380CA400056300A /* voc.cpp */, - DF2040951380CA400056300A /* voc.h */, - DF2040961380CA400056300A /* vorbis.cpp */, - DF2040971380CA400056300A /* vorbis.h */, - DF2040981380CA400056300A /* wave.cpp */, - DF2040991380CA400056300A /* wave.h */, - ); - name = decoders; - sourceTree = ""; - }; - DF2040BB1380CA5C0056300A /* mods */ = { - isa = PBXGroup; - children = ( - DF2040BC1380CA810056300A /* infogrames.cpp */, - DF2040BD1380CA810056300A /* infogrames.h */, - DF2040BE1380CA810056300A /* maxtrax.cpp */, - DF2040BF1380CA810056300A /* maxtrax.h */, - DF2040C01380CA810056300A /* module.cpp */, - DF2040C11380CA810056300A /* module.h */, - DF2040C21380CA810056300A /* paula.cpp */, - DF2040C31380CA810056300A /* paula.h */, - DF2040C41380CA810056300A /* protracker.cpp */, - DF2040C51380CA810056300A /* protracker.h */, - DF2040C61380CA810056300A /* rjp1.cpp */, - DF2040C71380CA810056300A /* rjp1.h */, - DF2040C81380CA810056300A /* soundfx.cpp */, - DF2040C91380CA810056300A /* soundfx.h */, - DF2040CA1380CA810056300A /* tfmx.cpp */, - DF2040CB1380CA810056300A /* tfmx.h */, - ); - name = mods; - sourceTree = ""; - }; - DF2040E41380CA8C0056300A /* softsynth */ = { - isa = PBXGroup; - children = ( - DF46B8591381F43100D08723 /* opl */, - DF46B6F61381E1D100D08723 /* fmtowns_pc98 */, - DF2040E51380CAA40056300A /* adlib.cpp */, - DF2040E61380CAA40056300A /* appleiigs.cpp */, - DF2040E71380CAA40056300A /* cms.cpp */, - DF2040E81380CAA40056300A /* cms.h */, - DF2040E91380CAA40056300A /* eas.cpp */, - DF2040EA1380CAA40056300A /* emumidi.h */, - DF2040EB1380CAA40056300A /* fluidsynth.cpp */, - DF2040EC1380CAA40056300A /* mt32.cpp */, - DF2040ED1380CAA40056300A /* pcspk.cpp */, - DF2040EE1380CAA40056300A /* pcspk.h */, - DF2040EF1380CAA40056300A /* sid.cpp */, - DF2040F01380CAA40056300A /* sid.h */, - DF2040F11380CAA40056300A /* wave6581.cpp */, - DF2040F21380CAA40056300A /* ym2612.cpp */, - DF2040F31380CAA40056300A /* ym2612.h */, - ); - name = softsynth; + path = video; sourceTree = ""; }; DF2FFBF50F4860A60006E566 /* posix */ = { @@ -5846,8 +5399,6 @@ DF2FFD040F4870E50006E566 /* tucker */ = { isa = PBXGroup; children = ( - DF46B7D41381E7C600D08723 /* console.cpp */, - DF46B7D51381E7C600D08723 /* console.h */, DF2FFD050F4870E50006E566 /* detection.cpp */, DF2FFD060F4870E50006E566 /* graphics.cpp */, DF2FFD070F4870E50006E566 /* graphics.h */, @@ -5862,6 +5413,35 @@ path = tucker; sourceTree = ""; }; + DF45B0EB116627D9009B85CC /* decoders */ = { + isa = PBXGroup; + children = ( + DF45B0F7116627DA009B85CC /* adpcm.cpp */, + DF45B0F8116627DA009B85CC /* adpcm.h */, + DF45B0FA116627DA009B85CC /* aiff.cpp */, + DF45B0FB116627DA009B85CC /* aiff.h */, + DF45B0FD116627DA009B85CC /* flac.cpp */, + DF45B0FE116627DA009B85CC /* flac.h */, + DF45B100116627DA009B85CC /* iff_sound.cpp */, + DF45B101116627DA009B85CC /* iff_sound.h */, + DF7F289E11FF24B000159131 /* mac_snd.cpp */, + DF7F289F11FF24B000159131 /* mac_snd.h */, + DF45B103116627DA009B85CC /* mp3.cpp */, + DF45B104116627DA009B85CC /* mp3.h */, + DF45B106116627DA009B85CC /* raw.cpp */, + DF45B107116627DA009B85CC /* raw.h */, + DF45B109116627DA009B85CC /* vag.cpp */, + DF45B10A116627DA009B85CC /* vag.h */, + DF45B10C116627DA009B85CC /* voc.cpp */, + DF45B10D116627DA009B85CC /* voc.h */, + DF45B10F116627DA009B85CC /* vorbis.cpp */, + DF45B110116627DA009B85CC /* vorbis.h */, + DF45B112116627DA009B85CC /* wave.cpp */, + DF45B113116627DA009B85CC /* wave.h */, + ); + path = decoders; + sourceTree = ""; + }; DF45B175116628A5009B85CC /* graphics */ = { isa = PBXGroup; children = ( @@ -5961,129 +5541,15 @@ DF45B1C5116628A5009B85CC /* video */ = { isa = PBXGroup; children = ( - DF46B7611381E4D400D08723 /* robot_decoder.cpp */, - DF46B7621381E4D400D08723 /* robot_decoder.h */, DF45B1C6116628A5009B85CC /* seq_decoder.cpp */, DF45B1C7116628A5009B85CC /* seq_decoder.h */, ); path = video; sourceTree = ""; }; - DF46B6F61381E1D100D08723 /* fmtowns_pc98 */ = { - isa = PBXGroup; - children = ( - DF46B6F71381E1FF00D08723 /* towns_audio.cpp */, - DF46B6F81381E1FF00D08723 /* towns_audio.h */, - DF46B6F91381E1FF00D08723 /* towns_euphony.cpp */, - DF46B6FA1381E1FF00D08723 /* towns_euphony.h */, - DF46B6FB1381E1FF00D08723 /* towns_pc98_driver.cpp */, - DF46B6FC1381E1FF00D08723 /* towns_pc98_driver.h */, - DF46B6FD1381E1FF00D08723 /* towns_pc98_fmsynth.cpp */, - DF46B6FE1381E1FF00D08723 /* towns_pc98_fmsynth.h */, - ); - name = fmtowns_pc98; - sourceTree = ""; - }; - DF46B7411381E3F200D08723 /* log */ = { - isa = PBXGroup; - children = ( - DF46B7421381E40500D08723 /* log.cpp */, - DF46B7431381E40500D08723 /* log.h */, - ); - name = log; - sourceTree = ""; - }; - DF46B7A21381E5CC00D08723 /* sdl */ = { - isa = PBXGroup; - children = ( - DF46B7A31381E5D900D08723 /* sdl-timer.cpp */, - DF46B7A41381E5D900D08723 /* sdl-timer.h */, - ); - name = sdl; - sourceTree = ""; - }; - DF46B7B01381E64E00D08723 /* mutex */ = { - isa = PBXGroup; - children = ( - DF46B7B11381E66000D08723 /* sdl */, - ); - name = mutex; - sourceTree = ""; - }; - DF46B7B11381E66000D08723 /* sdl */ = { - isa = PBXGroup; - children = ( - DF46B7B21381E67800D08723 /* sdl-mutex.cpp */, - DF46B7B31381E67800D08723 /* sdl-mutex.h */, - ); - name = sdl; - sourceTree = ""; - }; - DF46B7CC1381E74D00D08723 /* sdl */ = { - isa = PBXGroup; - children = ( - DF46B7CD1381E76300D08723 /* sdl-events.cpp */, - DF46B7CE1381E76300D08723 /* sdl-events.h */, - ); - name = sdl; - path = ..; - sourceTree = ""; - }; - DF46B8591381F43100D08723 /* opl */ = { - isa = PBXGroup; - children = ( - DF46B85A1381F44E00D08723 /* dbopl.cpp */, - DF46B85B1381F44E00D08723 /* dbopl.h */, - DF46B85C1381F44E00D08723 /* dosbox.cpp */, - DF46B85D1381F44E00D08723 /* dosbox.h */, - DF46B85E1381F44E00D08723 /* mame.cpp */, - DF46B85F1381F44E00D08723 /* mame.h */, - ); - name = opl; - sourceTree = ""; - }; - DF46B86D1381F47B00D08723 /* audiocd */ = { - isa = PBXGroup; - children = ( - DF46B8801381F4FF00D08723 /* audiocd.h */, - DF46B8781381F4C500D08723 /* default */, - DF46B86E1381F48D00D08723 /* sdl */, - ); - name = audiocd; - sourceTree = ""; - }; - DF46B86E1381F48D00D08723 /* sdl */ = { - isa = PBXGroup; - children = ( - DF46B86F1381F4A200D08723 /* sdl-audiocd.cpp */, - DF46B8701381F4A200D08723 /* sdl-audiocd.h */, - ); - name = sdl; - sourceTree = ""; - }; - DF46B8781381F4C500D08723 /* default */ = { - isa = PBXGroup; - children = ( - DF46B87B1381F4F200D08723 /* default-audiocd.cpp */, - DF46B87C1381F4F200D08723 /* default-audiocd.h */, - ); - name = default; - sourceTree = ""; - }; - DF46B8861381F5C600D08723 /* sdl */ = { - isa = PBXGroup; - children = ( - DF46B8871381F5D800D08723 /* sdl-provider.cpp */, - DF46B8881381F5D800D08723 /* sdl-provider.h */, - ); - name = sdl; - sourceTree = ""; - }; DF6118780FE3A9AA0042AD3F /* save */ = { isa = PBXGroup; children = ( - DF46B8431381F35500D08723 /* saveload_inca2.cpp */, - DF46B83B1381F13500D08723 /* saveload_v7.cpp */, DFCDC70311662B0200A7D2A0 /* saveload_fascin.cpp */, DF7585F0100CB70600CC3324 /* saveload_playtoons.cpp */, DF6118790FE3A9AA0042AD3F /* saveconverter.cpp */, @@ -6091,6 +5557,7 @@ DF61187B0FE3A9AA0042AD3F /* saveconverter_v2.cpp */, DF61187C0FE3A9AA0042AD3F /* saveconverter_v3.cpp */, DF61187D0FE3A9AA0042AD3F /* saveconverter_v4.cpp */, + DF61187E0FE3A9AA0042AD3F /* saveconverter_v6.cpp */, DF61187F0FE3A9AA0042AD3F /* savefile.cpp */, DF6118800FE3A9AA0042AD3F /* savefile.h */, DF6118810FE3A9AA0042AD3F /* savehandler.cpp */, @@ -6108,7 +5575,6 @@ DF841FF50E7BA6A600F5680E /* engines */ = { isa = PBXGroup; children = ( - DF46B8851381F56400D08723 /* util.h */, DF2FFC4C0F4863560006E566 /* advancedDetector.cpp */, DF2FFC4D0F4863560006E566 /* advancedDetector.h */, DF841FF60E7BA6A600F5680E /* agi */, @@ -6291,9 +5757,6 @@ DF8420640E7BA6A600F5680E /* cine */ = { isa = PBXGroup; children = ( - DF46B75B1381E4A400D08723 /* console.cpp */, - DF46B75C1381E4A400D08723 /* console.h */, - DF46B75D1381E4A400D08723 /* detection_tables.h */, DF8420650E7BA6A600F5680E /* anim.cpp */, DF8420660E7BA6A600F5680E /* anim.h */, DF8420670E7BA6A600F5680E /* bg.cpp */, @@ -6429,17 +5892,6 @@ DF8421170E7BA6A700F5680E /* gob */ = { isa = PBXGroup; children = ( - DF46B8471381F38700D08723 /* inter_v7.cpp */, - DF46B70F1381E27000D08723 /* console.cpp */, - DF46B7101381E27000D08723 /* console.h */, - DF46B7111381E27000D08723 /* databases.cpp */, - DF46B7121381E27000D08723 /* databases.h */, - DF46B7131381E27000D08723 /* dbase.cpp */, - DF46B7141381E27000D08723 /* dbase.h */, - DF46B7151381E27000D08723 /* iniconfig.cpp */, - DF46B7161381E27000D08723 /* iniconfig.h */, - DF46B7171381E27000D08723 /* init_v7.cpp */, - DF46B7181381E27000D08723 /* inter_inca2.cpp */, DF84211B0E7BA6A700F5680E /* dataio.cpp */, DF84211C0E7BA6A700F5680E /* dataio.h */, DF09CC060FAC4E1900A5AFD7 /* demos */, @@ -6466,6 +5918,7 @@ DF8421300E7BA6A700F5680E /* goblin_v2.cpp */, DF8421310E7BA6A700F5680E /* goblin_v3.cpp */, DF8421320E7BA6A700F5680E /* goblin_v4.cpp */, + DF6118590FE3A9020042AD3F /* helper.h */, DF7585C5100CB66E00CC3324 /* hotspots.cpp */, DF7585C6100CB66E00CC3324 /* hotspots.h */, DF8421330E7BA6A700F5680E /* init.cpp */, @@ -6812,8 +6265,6 @@ DF8422C90E7BA6A900F5680E /* made */ = { isa = PBXGroup; children = ( - DF46B8501381F3B400D08723 /* console.cpp */, - DF46B8511381F3B400D08723 /* console.h */, DF8422CA0E7BA6A900F5680E /* database.cpp */, DF8422CB0E7BA6A900F5680E /* database.h */, DF8422CC0E7BA6A900F5680E /* detection.cpp */, @@ -7012,10 +6463,6 @@ DF84237B0E7BA6AA00F5680E /* scumm */ = { isa = PBXGroup; children = ( - DF46B7501381E46700D08723 /* actor_he.h */, - DF46B7511381E46700D08723 /* player_v2base.cpp */, - DF46B7521381E46700D08723 /* player_v2base.h */, - DF46B7531381E46700D08723 /* player_v2cms.h */, DF84237C0E7BA6AA00F5680E /* actor.cpp */, DF84237D0E7BA6AA00F5680E /* actor.h */, DF84237E0E7BA6AA00F5680E /* akos.cpp */, @@ -7291,8 +6738,6 @@ DF84244E0E7BA6AB00F5680E /* sword1 */ = { isa = PBXGroup; children = ( - DF46B7C61381E72500D08723 /* console.cpp */, - DF46B7C71381E72500D08723 /* console.h */, DF84244F0E7BA6AB00F5680E /* animation.cpp */, DF8424500E7BA6AB00F5680E /* animation.h */, DF8424510E7BA6AB00F5680E /* collision.h */, @@ -7338,7 +6783,6 @@ DF8424770E7BA6AB00F5680E /* sword2 */ = { isa = PBXGroup; children = ( - DF46B7A81381E5F100D08723 /* header.cpp */, DF8424780E7BA6AB00F5680E /* animation.cpp */, DF8424790E7BA6AB00F5680E /* animation.h */, DF84247A0E7BA6AB00F5680E /* anims.cpp */, @@ -7395,9 +6839,6 @@ DF8424AA0E7BA6AB00F5680E /* tinsel */ = { isa = PBXGroup; children = ( - DF46B8901381F62B00D08723 /* adpcm.cpp */, - DF46B8911381F62B00D08723 /* adpcm.h */, - DF46B6F21381E18900D08723 /* coroutine.cpp */, DF8424AB0E7BA6AB00F5680E /* actors.cpp */, DF8424AC0E7BA6AB00F5680E /* actors.h */, DF8424AD0E7BA6AB00F5680E /* anim.cpp */, @@ -7492,8 +6933,6 @@ DF8424FC0E7BA6AB00F5680E /* touche */ = { isa = PBXGroup; children = ( - DF46B84B1381F39E00D08723 /* console.cpp */, - DF46B84C1381F39E00D08723 /* console.h */, DF8424FD0E7BA6AB00F5680E /* detection.cpp */, DF8424FE0E7BA6AB00F5680E /* graphics.cpp */, DF8424FF0E7BA6AB00F5680E /* graphics.h */, @@ -7510,6 +6949,48 @@ path = touche; sourceTree = ""; }; + DF895C0C124C24C00077F6E8 /* fmtowns_pc98 */ = { + isa = PBXGroup; + children = ( + DF895C0D124C24C00077F6E8 /* towns_audio.cpp */, + DF895C0E124C24C00077F6E8 /* towns_audio.h */, + DF895C0F124C24C00077F6E8 /* towns_euphony.cpp */, + DF895C10124C24C00077F6E8 /* towns_euphony.h */, + DF895C11124C24C00077F6E8 /* towns_pc98_driver.cpp */, + DF895C12124C24C00077F6E8 /* towns_pc98_driver.h */, + DF895C13124C24C00077F6E8 /* towns_pc98_fmsynth.cpp */, + DF895C14124C24C00077F6E8 /* towns_pc98_fmsynth.h */, + ); + path = fmtowns_pc98; + sourceTree = ""; + }; + DF90EABF10B023F300C8F93F /* codecs */ = { + isa = PBXGroup; + children = ( + DFB0579611B7549C0015AE65 /* cinepak.cpp */, + DFB0579711B7549C0015AE65 /* cinepak.h */, + DF90EAC010B023F400C8F93F /* codec.h */, + DF895CAB124E58980077F6E8 /* indeo3.cpp */, + DF895CAC124E58980077F6E8 /* indeo3.h */, + DF895CAD124E58980077F6E8 /* mjpeg.cpp */, + DF895CAE124E58980077F6E8 /* mjpeg.h */, + DFCDC6FC11662AD700A7D2A0 /* msrle.cpp */, + DFCDC6FD11662AD700A7D2A0 /* msrle.h */, + DF90EAC110B023F400C8F93F /* msvideo1.cpp */, + DF90EAC210B023F400C8F93F /* msvideo1.h */, + DF895CAF124E58980077F6E8 /* qdm2.cpp */, + DF895CB0124E58980077F6E8 /* qdm2.h */, + DF895CB1124E58980077F6E8 /* qdm2data.h */, + DF895CB2124E58980077F6E8 /* qtrle.cpp */, + DF895CB3124E58980077F6E8 /* qtrle.h */, + DF895CB4124E58980077F6E8 /* rpza.cpp */, + DF895CB5124E58980077F6E8 /* rpza.h */, + DF895CB6124E58980077F6E8 /* smc.cpp */, + DF895CB7124E58980077F6E8 /* smc.h */, + ); + path = codecs; + sourceTree = ""; + }; DF9B9277118E475D0069C19D /* games */ = { isa = PBXGroup; children = ( @@ -7555,9 +7036,6 @@ DFC8301B0F48AF18005EF03C /* engine */ = { isa = PBXGroup; children = ( - DF46B7BB1381E6C000D08723 /* object.cpp */, - DF46B7BC1381E6C000D08723 /* object.h */, - DF46B7661381E4E400D08723 /* vm_types.cpp */, DFCDC6D5116629CE00A7D2A0 /* features.cpp */, DFCDC6D6116629CE00A7D2A0 /* features.h */, DFC8301E0F48AF18005EF03C /* gc.cpp */, @@ -7654,11 +7132,6 @@ DFE470D50D81F4E700B6D1FB /* backends */ = { isa = PBXGroup; children = ( - DF46B86D1381F47B00D08723 /* audiocd */, - DF46B7B01381E64E00D08723 /* mutex */, - DF46B7471381E40F00D08723 /* modular-backend.cpp */, - DF46B7481381E40F00D08723 /* modular-backend.h */, - DF46B7411381E3F200D08723 /* log */, DF2FFC5B0F4866E70006E566 /* base-backend.cpp */, DF2FFC5C0F4866E70006E566 /* base-backend.h */, DFE470D60D81F4E700B6D1FB /* events */, @@ -7676,7 +7149,6 @@ DFE470D60D81F4E700B6D1FB /* events */ = { isa = PBXGroup; children = ( - DF46B7CC1381E74D00D08723 /* sdl */, DFE470D70D81F4E700B6D1FB /* default */, ); path = events; @@ -7706,7 +7178,6 @@ DFE470F50D81F4E700B6D1FB /* posix */ = { isa = PBXGroup; children = ( - DFADEBB613820E0C00C46364 /* posix-fs.cpp */, DF842A4C0E7BBBEB00F5680E /* posix-fs.h */, DFE470F60D81F4E700B6D1FB /* posix-fs-factory.cpp */, DFE470F70D81F4E700B6D1FB /* posix-fs-factory.h */, @@ -7757,7 +7228,6 @@ DFE4737B0D81F4E800B6D1FB /* plugins */ = { isa = PBXGroup; children = ( - DF46B8861381F5C600D08723 /* sdl */, DFE4737F0D81F4E800B6D1FB /* dynamic-plugin.h */, DFE473800D81F4E800B6D1FB /* posix */, ); @@ -7795,7 +7265,6 @@ DFE473910D81F4E800B6D1FB /* timer */ = { isa = PBXGroup; children = ( - DF46B7A21381E5CC00D08723 /* sdl */, DFE473920D81F4E800B6D1FB /* default */, ); path = timer; @@ -7813,19 +7282,6 @@ DFE473950D81F4E800B6D1FB /* common */ = { isa = PBXGroup; children = ( - DF46B76E1381E54200D08723 /* bufferedstream.h */, - DF46B76F1381E54200D08723 /* dcl.cpp */, - DF46B7701381E54200D08723 /* dcl.h */, - DF46B7711381E54200D08723 /* forbidden.h */, - DF46B7721381E54200D08723 /* iff_container.cpp */, - DF46B7731381E54200D08723 /* substream.h */, - DF46B7741381E54200D08723 /* translation.h */, - DF46B7751381E54200D08723 /* winexe_ne.cpp */, - DF46B7761381E54200D08723 /* winexe_ne.h */, - DF46B7771381E54200D08723 /* winexe_pe.cpp */, - DF46B7781381E54200D08723 /* winexe_pe.h */, - DF46B7791381E54200D08723 /* winexe.cpp */, - DF46B77A1381E54200D08723 /* winexe.h */, DFE473980D81F4E800B6D1FB /* algorithm.h */, DF842A400E7BBBB400F5680E /* archive.cpp */, DF842A410E7BBBB400F5680E /* archive.h */, @@ -7912,13 +7368,6 @@ DFE477520D81F4E900B6D1FB /* graphics */ = { isa = PBXGroup; children = ( - DFADEBB113820DF500C46364 /* maccursor.cpp */, - DFADEBB213820DF500C46364 /* maccursor.h */, - DF46B78E1381E58000D08723 /* palette.h */, - DF46B78F1381E58000D08723 /* png.cpp */, - DF46B7901381E58000D08723 /* png.h */, - DF46B7911381E58000D08723 /* wincursor.cpp */, - DF46B7921381E58000D08723 /* wincursor.h */, DFE477530D81F4E900B6D1FB /* colormasks.h */, DF6BF4C010529DA50069811F /* conversion.cpp */, DF6BF4C110529DA50069811F /* conversion.h */, @@ -7955,6 +7404,7 @@ DF7E8C080ED5FCAF001CB19F /* VectorRenderer.h */, DF7E8C090ED5FCAF001CB19F /* VectorRendererSpec.cpp */, DF7E8C0A0ED5FCAF001CB19F /* VectorRendererSpec.h */, + DF2FFB940F485D950006E566 /* video */, ); name = graphics; path = ../../graphics; @@ -7963,8 +7413,6 @@ DFE4775C0D81F4E900B6D1FB /* fonts */ = { isa = PBXGroup; children = ( - DF46B79D1381E5B500D08723 /* winfont.cpp */, - DF46B79E1381E5B500D08723 /* winfont.h */, DFE4775D0D81F4E900B6D1FB /* consolefont.cpp */, DFE4775E0D81F4E900B6D1FB /* newfont.cpp */, DFE4775F0D81F4E900B6D1FB /* newfont_big.cpp */, @@ -7976,8 +7424,6 @@ DFE477880D81F4E900B6D1FB /* gui */ = { isa = PBXGroup; children = ( - DF2040211380C8A60056300A /* widgets */, - DF203F461380C06E0056300A /* gui-manager.cpp */, DFE477890D81F4E900B6D1FB /* about.cpp */, DFE4778A0D81F4E900B6D1FB /* about.h */, DFE4778B0D81F4E900B6D1FB /* Actions.cpp */, @@ -7994,13 +7440,20 @@ DFE477950D81F4E900B6D1FB /* debugger.h */, DFE477960D81F4E900B6D1FB /* dialog.cpp */, DFE477970D81F4E900B6D1FB /* dialog.h */, + DFE477980D81F4E900B6D1FB /* editable.cpp */, + DFE477990D81F4E900B6D1FB /* editable.h */, + DFE4779A0D81F4E900B6D1FB /* EditTextWidget.cpp */, + DFE4779B0D81F4E900B6D1FB /* EditTextWidget.h */, DF9B9246118E46730069C19D /* error.cpp */, DF9B9247118E46730069C19D /* error.h */, + DF2FFBD50F485E360006E566 /* gui-manager.hcpp */, DF2FFBD60F485E360006E566 /* gui-manager.h */, DFE4779E0D81F4E900B6D1FB /* Key.cpp */, DFE4779F0D81F4E900B6D1FB /* Key.h */, DFE477A20D81F4E900B6D1FB /* launcher.cpp */, DFE477A30D81F4E900B6D1FB /* launcher.h */, + DFE477A40D81F4E900B6D1FB /* ListWidget.cpp */, + DFE477A50D81F4E900B6D1FB /* ListWidget.h */, DFE477A60D81F4E900B6D1FB /* massadd.cpp */, DFE477A70D81F4E900B6D1FB /* massadd.h */, DFE477A80D81F4E900B6D1FB /* message.cpp */, @@ -8009,8 +7462,14 @@ DFE477AE0D81F4E900B6D1FB /* object.h */, DFE477AF0D81F4E900B6D1FB /* options.cpp */, DFE477B00D81F4E900B6D1FB /* options.h */, + DFE477B10D81F4E900B6D1FB /* PopUpWidget.cpp */, + DFE477B20D81F4E900B6D1FB /* PopUpWidget.h */, DF7E8BF00ED5FC77001CB19F /* saveload.cpp */, DF7E8BF10ED5FC77001CB19F /* saveload.h */, + DFE477B30D81F4E900B6D1FB /* ScrollBarWidget.cpp */, + DFE477B40D81F4E900B6D1FB /* ScrollBarWidget.h */, + DFE477B50D81F4E900B6D1FB /* TabWidget.cpp */, + DFE477B60D81F4E900B6D1FB /* TabWidget.h */, DFE477BA0D81F4E900B6D1FB /* themebrowser.cpp */, DFE477BB0D81F4E900B6D1FB /* themebrowser.h */, DF7E8BF40ED5FC77001CB19F /* ThemeEngine.cpp */, @@ -8040,6 +7499,98 @@ path = themes; sourceTree = ""; }; + DFE477C60D81F4E900B6D1FB /* sound */ = { + isa = PBXGroup; + children = ( + DFE477CB0D81F4E900B6D1FB /* audiocd.cpp */, + DFE477CC0D81F4E900B6D1FB /* audiocd.h */, + DFE477CD0D81F4E900B6D1FB /* audiostream.cpp */, + DFE477CE0D81F4E900B6D1FB /* audiostream.h */, + DF45B0EB116627D9009B85CC /* decoders */, + DFE477D10D81F4E900B6D1FB /* fmopl.cpp */, + DFE477D20D81F4E900B6D1FB /* fmopl.h */, + DFE477D50D81F4E900B6D1FB /* mididrv.cpp */, + DFE477D60D81F4E900B6D1FB /* mididrv.h */, + DFE477D70D81F4E900B6D1FB /* midiparser.cpp */, + DFE477D80D81F4E900B6D1FB /* midiparser.h */, + DFE477D90D81F4E900B6D1FB /* midiparser_smf.cpp */, + DFE477DA0D81F4E900B6D1FB /* midiparser_xmidi.cpp */, + DFE477DB0D81F4E900B6D1FB /* mixer.cpp */, + DFE477DC0D81F4E900B6D1FB /* mixer.h */, + DFE477DD0D81F4E900B6D1FB /* mods */, + DFE477ED0D81F4E900B6D1FB /* mpu401.cpp */, + DFE477EE0D81F4E900B6D1FB /* mpu401.h */, + DF842A6F0E7BBDB200F5680E /* musicplugin.cpp */, + DF842A700E7BBDB200F5680E /* musicplugin.h */, + DFE477EF0D81F4E900B6D1FB /* null.cpp */, + DFE477F00D81F4E900B6D1FB /* rate.cpp */, + DFE477F10D81F4E900B6D1FB /* rate.h */, + DFE477F60D81F4E900B6D1FB /* softsynth */, + DF89C2B80F62D91000D756B6 /* timestamp.cpp */, + DF89C2B90F62D91000D756B6 /* timestamp.h */, + ); + name = sound; + path = ../../sound; + sourceTree = SOURCE_ROOT; + }; + DFE477DD0D81F4E900B6D1FB /* mods */ = { + isa = PBXGroup; + children = ( + DFE477DE0D81F4E900B6D1FB /* infogrames.cpp */, + DFE477DF0D81F4E900B6D1FB /* infogrames.h */, + DF6BF50210529F540069811F /* maxtrax.cpp */, + DF6BF50310529F540069811F /* maxtrax.h */, + DFE477E00D81F4E900B6D1FB /* module.cpp */, + DFE477E10D81F4E900B6D1FB /* module.h */, + DFE477E20D81F4E900B6D1FB /* paula.cpp */, + DFE477E30D81F4E900B6D1FB /* paula.h */, + DFE477E40D81F4E900B6D1FB /* protracker.cpp */, + DFE477E50D81F4E900B6D1FB /* protracker.h */, + DFE477E60D81F4E900B6D1FB /* rjp1.cpp */, + DFE477E70D81F4E900B6D1FB /* rjp1.h */, + DFE477E80D81F4E900B6D1FB /* soundfx.cpp */, + DFE477E90D81F4E900B6D1FB /* soundfx.h */, + DF6BF50410529F540069811F /* tfmx.cpp */, + DF6BF50510529F540069811F /* tfmx.h */, + ); + path = mods; + sourceTree = ""; + }; + DFE477F60D81F4E900B6D1FB /* softsynth */ = { + isa = PBXGroup; + children = ( + DFE477F70D81F4E900B6D1FB /* adlib.cpp */, + DF895C08124C24B50077F6E8 /* appleiigs.cpp */, + DF0E303F1252C6090082D593 /* cms.cpp */, + DF0E30401252C6090082D593 /* cms.h */, + DFE477F80D81F4E900B6D1FB /* emumidi.h */, + DFE477F90D81F4E900B6D1FB /* fluidsynth.cpp */, + DF895C0C124C24C00077F6E8 /* fmtowns_pc98 */, + DFF958A80FB222F300A3EC78 /* opl */, + DFE478210D81F4E900B6D1FB /* pcspk.cpp */, + DFE478220D81F4E900B6D1FB /* pcspk.h */, + DF2EC51010E64E3100765801 /* sid.cpp */, + DF2EC51110E64E3100765801 /* sid.h */, + DF2EC51710E64EE600765801 /* wave6581.cpp */, + DFE478230D81F4E900B6D1FB /* ym2612.cpp */, + DFE478240D81F4E900B6D1FB /* ym2612.h */, + ); + path = softsynth; + sourceTree = ""; + }; + DFF958A80FB222F300A3EC78 /* opl */ = { + isa = PBXGroup; + children = ( + DFEC5D3D1166C6B400C90552 /* dbopl.cpp */, + DFEC5D3E1166C6B400C90552 /* dbopl.h */, + DFF958A90FB222F300A3EC78 /* dosbox.cpp */, + DFF958AA0FB222F300A3EC78 /* dosbox.h */, + DF6118CF0FE3AB560042AD3F /* mame.cpp */, + DF6118D00FE3AB560042AD3F /* mame.h */, + ); + path = opl; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -8237,14 +7788,41 @@ DFE47C200D81F4E900B6D1FB /* console.cpp in Sources */, DFE47C210D81F4E900B6D1FB /* debugger.cpp in Sources */, DFE47C220D81F4E900B6D1FB /* dialog.cpp in Sources */, + DFE47C230D81F4E900B6D1FB /* editable.cpp in Sources */, + DFE47C240D81F4E900B6D1FB /* EditTextWidget.cpp in Sources */, DFE47C260D81F4E900B6D1FB /* Key.cpp in Sources */, DFE47C280D81F4E900B6D1FB /* launcher.cpp in Sources */, + DFE47C290D81F4E900B6D1FB /* ListWidget.cpp in Sources */, DFE47C2A0D81F4E900B6D1FB /* massadd.cpp in Sources */, DFE47C2B0D81F4E900B6D1FB /* message.cpp in Sources */, DFE47C2E0D81F4E900B6D1FB /* object.cpp in Sources */, DFE47C2F0D81F4E900B6D1FB /* options.cpp in Sources */, + DFE47C300D81F4E900B6D1FB /* PopUpWidget.cpp in Sources */, + DFE47C310D81F4E900B6D1FB /* ScrollBarWidget.cpp in Sources */, + DFE47C320D81F4E900B6D1FB /* TabWidget.cpp in Sources */, DFE47C350D81F4E900B6D1FB /* themebrowser.cpp in Sources */, DFE47C3B0D81F4E900B6D1FB /* widget.cpp in Sources */, + DFE47C3E0D81F4E900B6D1FB /* audiocd.cpp in Sources */, + DFE47C3F0D81F4E900B6D1FB /* audiostream.cpp in Sources */, + DFE47C410D81F4E900B6D1FB /* fmopl.cpp in Sources */, + DFE47C430D81F4E900B6D1FB /* mididrv.cpp in Sources */, + DFE47C440D81F4E900B6D1FB /* midiparser.cpp in Sources */, + DFE47C450D81F4E900B6D1FB /* midiparser_smf.cpp in Sources */, + DFE47C460D81F4E900B6D1FB /* midiparser_xmidi.cpp in Sources */, + DFE47C470D81F4E900B6D1FB /* mixer.cpp in Sources */, + DFE47C480D81F4E900B6D1FB /* infogrames.cpp in Sources */, + DFE47C490D81F4E900B6D1FB /* module.cpp in Sources */, + DFE47C4A0D81F4E900B6D1FB /* paula.cpp in Sources */, + DFE47C4B0D81F4E900B6D1FB /* protracker.cpp in Sources */, + DFE47C4C0D81F4E900B6D1FB /* rjp1.cpp in Sources */, + DFE47C4D0D81F4E900B6D1FB /* soundfx.cpp in Sources */, + DFE47C500D81F4E900B6D1FB /* mpu401.cpp in Sources */, + DFE47C510D81F4E900B6D1FB /* null.cpp in Sources */, + DFE47C520D81F4E900B6D1FB /* rate.cpp in Sources */, + DFE47C570D81F4E900B6D1FB /* adlib.cpp in Sources */, + DFE47C580D81F4E900B6D1FB /* fluidsynth.cpp in Sources */, + DFE47C740D81F4E900B6D1FB /* pcspk.cpp in Sources */, + DFE47C750D81F4E900B6D1FB /* ym2612.cpp in Sources */, DFD511480DF3383500854012 /* memorypool.cpp in Sources */, DFD517E20DF33CAC00854012 /* seq.cpp in Sources */, DFD5183D0DF3411800854012 /* scaler.cpp in Sources */, @@ -8875,6 +8453,7 @@ DF842A470E7BBBB400F5680E /* archive.cpp in Sources */, DF842A490E7BBBB400F5680E /* unarj.cpp in Sources */, DF842A6D0E7BBD5700F5680E /* stdiostream.cpp in Sources */, + DF842A710E7BBDB200F5680E /* musicplugin.cpp in Sources */, DF7E8BFD0ED5FC77001CB19F /* saveload.cpp in Sources */, DF7E8BFF0ED5FC77001CB19F /* ThemeEngine.cpp in Sources */, DF7E8C000ED5FC77001CB19F /* ThemeEval.cpp in Sources */, @@ -8891,6 +8470,7 @@ DFAAB0020F011392003E9390 /* thumbnail_intern.cpp in Sources */, DF2FFB930F485D890006E566 /* dither.cpp in Sources */, DF2FFBD30F485DFB0006E566 /* debug.cpp in Sources */, + DF2FFBD90F485E360006E566 /* gui-manager.hcpp in Sources */, DF2FFBFC0F4860A60006E566 /* posix-saves.cpp in Sources */, DF2FFC290F4862520006E566 /* bmv.cpp in Sources */, DF2FFC2A0F4862520006E566 /* dialogs.cpp in Sources */, @@ -8962,6 +8542,7 @@ DF573CBE0F5A85E100961A72 /* timer_lol.cpp in Sources */, DF89C2880F62D55C00D756B6 /* sprites_lol.cpp in Sources */, DF89C2A40F62D79E00D756B6 /* script.cpp in Sources */, + DF89C2BB0F62D91000D756B6 /* timestamp.cpp in Sources */, DF093E5F0F63CAD4002D821E /* pn.cpp in Sources */, DF093E600F63CAD4002D821E /* script_pn.cpp in Sources */, DF093E610F63CAD4002D821E /* vga_pn.cpp in Sources */, @@ -8976,15 +8557,20 @@ DF09CC1B0FAC4E1900A5AFD7 /* inter_fascin.cpp in Sources */, DF09CC2A0FAC4EAB00A5AFD7 /* script_v3.cpp in Sources */, DF09CC2B0FAC4EAB00A5AFD7 /* script_v4.cpp in Sources */, + DFF958B20FB222F300A3EC78 /* dosbox.cpp in Sources */, DF61183E0FE3A8080042AD3F /* kmisc.cpp in Sources */, DF61183F0FE3A8080042AD3F /* segment.cpp in Sources */, DF61184C0FE3A8250042AD3F /* decompressor.cpp in Sources */, DF61184D0FE3A8250042AD3F /* resource.cpp in Sources */, DF6118560FE3A8990042AD3F /* disk.cpp in Sources */, + DF61186D0FE3A9410042AD3F /* dxa_decoder.cpp in Sources */, + DF61186E0FE3A9410042AD3F /* flic_decoder.cpp in Sources */, + DF61186F0FE3A9410042AD3F /* smk_decoder.cpp in Sources */, DF6118950FE3A9AA0042AD3F /* saveconverter.cpp in Sources */, DF6118960FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */, DF6118970FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */, DF6118980FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */, + DF6118990FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */, DF61189A0FE3A9AA0042AD3F /* savefile.cpp in Sources */, DF61189B0FE3A9AA0042AD3F /* savehandler.cpp in Sources */, DF61189C0FE3A9AA0042AD3F /* saveload.cpp in Sources */, @@ -8998,6 +8584,7 @@ DF6118BE0FE3AA280042AD3F /* sound_pcspk.cpp in Sources */, DF6118BF0FE3AA280042AD3F /* text_lol.cpp in Sources */, DF6118C80FE3AABD0042AD3F /* player_v2cms.cpp in Sources */, + DF6118D30FE3AB560042AD3F /* mame.cpp in Sources */, DF7585DA100CB66E00CC3324 /* expression.cpp in Sources */, DF7585DB100CB66E00CC3324 /* hotspots.cpp in Sources */, DF7585DC100CB66E00CC3324 /* init_v6.cpp in Sources */, @@ -9022,15 +8609,31 @@ DF6BF4F410529EE40069811F /* player_v4a.cpp in Sources */, DF6BF4FE10529F140069811F /* EventDispatcher.cpp in Sources */, DF6BF4FF10529F140069811F /* EventRecorder.cpp in Sources */, + DF6BF50810529F540069811F /* maxtrax.cpp in Sources */, + DF6BF50910529F540069811F /* tfmx.cpp in Sources */, DF90E9C310AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA610B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAF10B0236F00C8F93F /* staticres.cpp in Sources */, + DF90EABA10B023D100C8F93F /* avi_decoder.cpp in Sources */, + DF90EAC510B023F400C8F93F /* msvideo1.cpp in Sources */, DF2EC3F910E64C0C00765801 /* dialogs.cpp in Sources */, DF2EC3FF10E64C4300765801 /* animator_tim.cpp in Sources */, DF2EC40610E64C8000765801 /* event.cpp in Sources */, DF2EC50310E64D7C00765801 /* player_pce.cpp in Sources */, DF2EC50410E64D7C00765801 /* player_sid.cpp in Sources */, DF2EC50C10E64DB300765801 /* textconsole.cpp in Sources */, + DF2EC51310E64E3100765801 /* sid.cpp in Sources */, + DF2EC51910E64EE600765801 /* wave6581.cpp in Sources */, + DF45B11F116627DA009B85CC /* adpcm.cpp in Sources */, + DF45B121116627DA009B85CC /* aiff.cpp in Sources */, + DF45B123116627DA009B85CC /* flac.cpp in Sources */, + DF45B125116627DA009B85CC /* iff_sound.cpp in Sources */, + DF45B127116627DA009B85CC /* mp3.cpp in Sources */, + DF45B129116627DA009B85CC /* raw.cpp in Sources */, + DF45B12B116627DA009B85CC /* vag.cpp in Sources */, + DF45B12D116627DA009B85CC /* voc.cpp in Sources */, + DF45B12F116627DA009B85CC /* vorbis.cpp in Sources */, + DF45B131116627DA009B85CC /* wave.cpp in Sources */, DF45B1CA116628A5009B85CC /* animate.cpp in Sources */, DF45B1CB116628A5009B85CC /* cache.cpp in Sources */, DF45B1CC116628A5009B85CC /* compare.cpp in Sources */, @@ -9064,19 +8667,25 @@ DFCDC6D9116629CE00A7D2A0 /* features.cpp in Sources */, DFCDC6DA116629CE00A7D2A0 /* kparse.cpp in Sources */, DFCDC6F711662AAB00A7D2A0 /* resource.cpp in Sources */, + DFCDC6FE11662AD700A7D2A0 /* msrle.cpp in Sources */, DFCDC70411662B0200A7D2A0 /* saveload_fascin.cpp in Sources */, DFCDC70B11662B6B00A7D2A0 /* macresman.cpp in Sources */, DFEC5D121166C5CF00C90552 /* random.cpp in Sources */, DFEC5D131166C5CF00C90552 /* tokenizer.cpp in Sources */, DFEC5D371166C67300C90552 /* savestate.cpp in Sources */, + DFEC5D401166C6B400C90552 /* dbopl.cpp in Sources */, DF9B9249118E46730069C19D /* error.cpp in Sources */, DF9B9254118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9263118E46FE0069C19D /* error.cpp in Sources */, + DFB0576B11B753AF0015AE65 /* mpeg_player.cpp in Sources */, + DFB0576C11B753AF0015AE65 /* qt_decoder.cpp in Sources */, + DFB0576D11B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577711B753DA0015AE65 /* rational.cpp in Sources */, DFB0578211B7541F0015AE65 /* resource_audio.cpp in Sources */, DFB0578311B7541F0015AE65 /* util.cpp in Sources */, DFB0578B11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579211B7547D0015AE65 /* pict.cpp in Sources */, + DFB0579911B7549C0015AE65 /* cinepak.cpp in Sources */, DF7F286211FF23D500159131 /* amigamac.cpp in Sources */, DF7F286911FF23EF00159131 /* kvideo.cpp in Sources */, DF7F286A11FF23EF00159131 /* workarounds.cpp in Sources */, @@ -9087,11 +8696,25 @@ DF7F288311FF243B00159131 /* sound_sarien.cpp in Sources */, DF7F288C11FF244F00159131 /* Tooltip.cpp in Sources */, DF7F289511FF247300159131 /* translation.cpp in Sources */, + DF7F28A111FF24B000159131 /* mac_snd.cpp in Sources */, DF7F28A611FF24C400159131 /* console.cpp in Sources */, + DF895BFE124C24350077F6E8 /* coktel_decoder.cpp in Sources */, DF895C03124C24680077F6E8 /* player_towns.cpp in Sources */, + DF895C09124C24B60077F6E8 /* appleiigs.cpp in Sources */, + DF895C15124C24C10077F6E8 /* towns_audio.cpp in Sources */, + DF895C16124C24C10077F6E8 /* towns_euphony.cpp in Sources */, + DF895C17124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */, + DF895C18124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */, DF895C25124C25150077F6E8 /* init_fascin.cpp in Sources */, DF895C2A124C25350077F6E8 /* script_patches.cpp in Sources */, + DF895CB8124E58980077F6E8 /* indeo3.cpp in Sources */, + DF895CB9124E58980077F6E8 /* mjpeg.cpp in Sources */, + DF895CBA124E58980077F6E8 /* qdm2.cpp in Sources */, + DF895CBB124E58980077F6E8 /* qtrle.cpp in Sources */, + DF895CBC124E58980077F6E8 /* rpza.cpp in Sources */, + DF895CBD124E58990077F6E8 /* smc.cpp in Sources */, DF0E303B1252C5BD0082D593 /* cms.cpp in Sources */, + DF0E30421252C6090082D593 /* cms.cpp in Sources */, 8CB5A9CB1253FD6900CB6BC7 /* m4_scene.cpp in Sources */, 8CB5A9CC1253FD6900CB6BC7 /* mads_logic.cpp in Sources */, 8CB5A9CD1253FD6900CB6BC7 /* mads_player.cpp in Sources */, @@ -9099,6 +8722,7 @@ 8CB5A9CF1253FD6900CB6BC7 /* mads_views.cpp in Sources */, 8CD1ED53126202AB00FA198C /* detection.cpp in Sources */, 8CD1ED54126202AB00FA198C /* display.cpp in Sources */, + 8CD1ED55126202AB00FA198C /* engine.cpp in Sources */, 8CD1ED56126202AB00FA198C /* file.cpp in Sources */, 8CD1ED57126202AB00FA198C /* hugo.cpp in Sources */, 8CD1ED58126202AB00FA198C /* intro.cpp in Sources */, @@ -9147,134 +8771,6 @@ 8CD80D13126272A0001C6C87 /* surface.cpp in Sources */, 8CD80D14126272A0001C6C87 /* surface_list.cpp in Sources */, 8CD80D15126272A0001C6C87 /* teenagent.cpp in Sources */, - DF203F481380C06E0056300A /* gui-manager.cpp in Sources */, - DF203F6B1380C2750056300A /* avi_decoder.cpp in Sources */, - DF203F6C1380C2750056300A /* coktel_decoder.cpp in Sources */, - DF203F6D1380C2750056300A /* dxa_decoder.cpp in Sources */, - DF203F6E1380C2750056300A /* flic_decoder.cpp in Sources */, - DF203F701380C2750056300A /* qt_decoder.cpp in Sources */, - DF203F711380C2750056300A /* smk_decoder.cpp in Sources */, - DF203F721380C2750056300A /* video_decoder.cpp in Sources */, - DF203FA01380C2920056300A /* cdtoons.cpp in Sources */, - DF203FA11380C2920056300A /* cinepak.cpp in Sources */, - DF203FA21380C2920056300A /* indeo3.cpp in Sources */, - DF203FA31380C2920056300A /* mjpeg.cpp in Sources */, - DF203FA41380C2920056300A /* msrle.cpp in Sources */, - DF203FA51380C2920056300A /* msvideo1.cpp in Sources */, - DF203FA61380C2920056300A /* qdm2.cpp in Sources */, - DF203FA71380C2920056300A /* qtrle.cpp in Sources */, - DF203FA81380C2920056300A /* rpza.cpp in Sources */, - DF203FA91380C2920056300A /* smc.cpp in Sources */, - DF203FAA1380C2920056300A /* truemotion1.cpp in Sources */, - DF203FE61380C3BC0056300A /* console.cpp in Sources */, - DF203FE71380C3BC0056300A /* dialogs.cpp in Sources */, - DF203FE81380C3BC0056300A /* file_v1d.cpp in Sources */, - DF203FE91380C3BC0056300A /* file_v1w.cpp in Sources */, - DF203FEA1380C3BC0056300A /* file_v2d.cpp in Sources */, - DF203FEB1380C3BC0056300A /* file_v2w.cpp in Sources */, - DF203FEC1380C3BC0056300A /* file_v3d.cpp in Sources */, - DF203FED1380C3BC0056300A /* object_v1d.cpp in Sources */, - DF203FEE1380C3BC0056300A /* object_v1w.cpp in Sources */, - DF203FEF1380C3BC0056300A /* object_v2d.cpp in Sources */, - DF203FF01380C3BC0056300A /* object_v3d.cpp in Sources */, - DF203FF11380C3BC0056300A /* object.cpp in Sources */, - DF203FF21380C3BC0056300A /* parser_v1d.cpp in Sources */, - DF203FF31380C3BC0056300A /* parser_v1w.cpp in Sources */, - DF203FF41380C3BC0056300A /* parser_v2d.cpp in Sources */, - DF203FF51380C3BC0056300A /* parser_v3d.cpp in Sources */, - DF203FF61380C3BC0056300A /* text.cpp in Sources */, - DF2040341380C8B70056300A /* editable.cpp in Sources */, - DF2040351380C8B70056300A /* edittext.cpp in Sources */, - DF2040361380C8B70056300A /* list.cpp in Sources */, - DF2040371380C8B70056300A /* popup.cpp in Sources */, - DF2040381380C8B70056300A /* scrollbar.cpp in Sources */, - DF2040391380C8B70056300A /* tab.cpp in Sources */, - DF20406A1380CA230056300A /* audiostream.cpp in Sources */, - DF20406B1380CA230056300A /* fmopl.cpp in Sources */, - DF20406C1380CA230056300A /* mididrv.cpp in Sources */, - DF20406D1380CA230056300A /* midiparser_smf.cpp in Sources */, - DF20406E1380CA230056300A /* midiparser_xmidi.cpp in Sources */, - DF20406F1380CA230056300A /* midiparser.cpp in Sources */, - DF2040701380CA230056300A /* midiplayer.cpp in Sources */, - DF2040711380CA230056300A /* mixer.cpp in Sources */, - DF2040721380CA230056300A /* mpu401.cpp in Sources */, - DF2040731380CA230056300A /* musicplugin.cpp in Sources */, - DF2040741380CA230056300A /* rate.cpp in Sources */, - DF2040751380CA230056300A /* timestamp.cpp in Sources */, - DF2040A51380CA400056300A /* adpcm.cpp in Sources */, - DF2040A61380CA400056300A /* aiff.cpp in Sources */, - DF2040A71380CA400056300A /* flac.cpp in Sources */, - DF2040A81380CA400056300A /* iff_sound.cpp in Sources */, - DF2040A91380CA400056300A /* mac_snd.cpp in Sources */, - DF2040AA1380CA400056300A /* mp3.cpp in Sources */, - DF2040AB1380CA400056300A /* raw.cpp in Sources */, - DF2040AC1380CA400056300A /* vag.cpp in Sources */, - DF2040AD1380CA400056300A /* voc.cpp in Sources */, - DF2040AE1380CA400056300A /* vorbis.cpp in Sources */, - DF2040AF1380CA400056300A /* wave.cpp in Sources */, - DF2040D41380CA810056300A /* infogrames.cpp in Sources */, - DF2040D51380CA810056300A /* maxtrax.cpp in Sources */, - DF2040D61380CA810056300A /* module.cpp in Sources */, - DF2040D71380CA810056300A /* paula.cpp in Sources */, - DF2040D81380CA810056300A /* protracker.cpp in Sources */, - DF2040D91380CA810056300A /* rjp1.cpp in Sources */, - DF2040DA1380CA810056300A /* soundfx.cpp in Sources */, - DF2040DB1380CA810056300A /* tfmx.cpp in Sources */, - DF2040FE1380CAA40056300A /* adlib.cpp in Sources */, - DF2040FF1380CAA40056300A /* appleiigs.cpp in Sources */, - DF2041001380CAA40056300A /* cms.cpp in Sources */, - DF2041011380CAA40056300A /* eas.cpp in Sources */, - DF2041021380CAA40056300A /* fluidsynth.cpp in Sources */, - DF2041031380CAA40056300A /* mt32.cpp in Sources */, - DF2041041380CAA40056300A /* pcspk.cpp in Sources */, - DF2041051380CAA40056300A /* sid.cpp in Sources */, - DF2041061380CAA40056300A /* wave6581.cpp in Sources */, - DF2041071380CAA40056300A /* ym2612.cpp in Sources */, - DF46B6F41381E18900D08723 /* coroutine.cpp in Sources */, - DF46B7031381E1FF00D08723 /* towns_audio.cpp in Sources */, - DF46B7041381E1FF00D08723 /* towns_euphony.cpp in Sources */, - DF46B7051381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */, - DF46B7061381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */, - DF46B71F1381E27000D08723 /* console.cpp in Sources */, - DF46B7201381E27000D08723 /* databases.cpp in Sources */, - DF46B7211381E27000D08723 /* dbase.cpp in Sources */, - DF46B7221381E27000D08723 /* iniconfig.cpp in Sources */, - DF46B7231381E27000D08723 /* init_v7.cpp in Sources */, - DF46B7241381E27000D08723 /* inter_inca2.cpp in Sources */, - DF46B7451381E40500D08723 /* log.cpp in Sources */, - DF46B74A1381E40F00D08723 /* modular-backend.cpp in Sources */, - DF46B7551381E46700D08723 /* player_v2base.cpp in Sources */, - DF46B75F1381E4A400D08723 /* console.cpp in Sources */, - DF46B7641381E4D400D08723 /* robot_decoder.cpp in Sources */, - DF46B7681381E4E400D08723 /* vm_types.cpp in Sources */, - DF46B7801381E54200D08723 /* dcl.cpp in Sources */, - DF46B7811381E54200D08723 /* iff_container.cpp in Sources */, - DF46B7821381E54200D08723 /* winexe_ne.cpp in Sources */, - DF46B7831381E54200D08723 /* winexe_pe.cpp in Sources */, - DF46B7841381E54200D08723 /* winexe.cpp in Sources */, - DF46B7951381E58000D08723 /* png.cpp in Sources */, - DF46B7961381E58000D08723 /* wincursor.cpp in Sources */, - DF46B7A01381E5B500D08723 /* winfont.cpp in Sources */, - DF46B7AA1381E5F100D08723 /* header.cpp in Sources */, - DF46B7B51381E67800D08723 /* sdl-mutex.cpp in Sources */, - DF46B7BE1381E6C000D08723 /* object.cpp in Sources */, - DF46B7C91381E72500D08723 /* console.cpp in Sources */, - DF46B7D71381E7C600D08723 /* console.cpp in Sources */, - DF46B83D1381F13500D08723 /* saveload_v7.cpp in Sources */, - DF46B8451381F35500D08723 /* saveload_inca2.cpp in Sources */, - DF46B8491381F38700D08723 /* inter_v7.cpp in Sources */, - DF46B84E1381F39E00D08723 /* console.cpp in Sources */, - DF46B8531381F3B400D08723 /* console.cpp in Sources */, - DF46B8631381F44E00D08723 /* dbopl.cpp in Sources */, - DF46B8641381F44E00D08723 /* dosbox.cpp in Sources */, - DF46B8651381F44E00D08723 /* mame.cpp in Sources */, - DF46B8721381F4A200D08723 /* sdl-audiocd.cpp in Sources */, - DF46B87E1381F4F200D08723 /* default-audiocd.cpp in Sources */, - DF46B88A1381F5D800D08723 /* sdl-provider.cpp in Sources */, - DF46B8931381F62B00D08723 /* adpcm.cpp in Sources */, - DF46B89C1381F6C400D08723 /* null.cpp in Sources */, - DFADEBB413820DF500C46364 /* maccursor.cpp in Sources */, - DFADEBB813820E0C00C46364 /* posix-fs.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -9321,14 +8817,41 @@ DF093EA80F63CB26002D821E /* console.cpp in Sources */, DF093EA90F63CB26002D821E /* debugger.cpp in Sources */, DF093EAA0F63CB26002D821E /* dialog.cpp in Sources */, + DF093EAB0F63CB26002D821E /* editable.cpp in Sources */, + DF093EAC0F63CB26002D821E /* EditTextWidget.cpp in Sources */, DF093EAD0F63CB26002D821E /* Key.cpp in Sources */, DF093EAE0F63CB26002D821E /* launcher.cpp in Sources */, + DF093EAF0F63CB26002D821E /* ListWidget.cpp in Sources */, DF093EB00F63CB26002D821E /* massadd.cpp in Sources */, DF093EB10F63CB26002D821E /* message.cpp in Sources */, DF093EB20F63CB26002D821E /* object.cpp in Sources */, DF093EB30F63CB26002D821E /* options.cpp in Sources */, + DF093EB40F63CB26002D821E /* PopUpWidget.cpp in Sources */, + DF093EB50F63CB26002D821E /* ScrollBarWidget.cpp in Sources */, + DF093EB60F63CB26002D821E /* TabWidget.cpp in Sources */, DF093EB70F63CB26002D821E /* themebrowser.cpp in Sources */, DF093EB80F63CB26002D821E /* widget.cpp in Sources */, + DF093EBB0F63CB26002D821E /* audiocd.cpp in Sources */, + DF093EBC0F63CB26002D821E /* audiostream.cpp in Sources */, + DF093EBE0F63CB26002D821E /* fmopl.cpp in Sources */, + DF093EC00F63CB26002D821E /* mididrv.cpp in Sources */, + DF093EC10F63CB26002D821E /* midiparser.cpp in Sources */, + DF093EC20F63CB26002D821E /* midiparser_smf.cpp in Sources */, + DF093EC30F63CB26002D821E /* midiparser_xmidi.cpp in Sources */, + DF093EC40F63CB26002D821E /* mixer.cpp in Sources */, + DF093EC50F63CB26002D821E /* infogrames.cpp in Sources */, + DF093EC60F63CB26002D821E /* module.cpp in Sources */, + DF093EC70F63CB26002D821E /* paula.cpp in Sources */, + DF093EC80F63CB26002D821E /* protracker.cpp in Sources */, + DF093EC90F63CB26002D821E /* rjp1.cpp in Sources */, + DF093ECA0F63CB26002D821E /* soundfx.cpp in Sources */, + DF093ECC0F63CB26002D821E /* mpu401.cpp in Sources */, + DF093ECD0F63CB26002D821E /* null.cpp in Sources */, + DF093ECE0F63CB26002D821E /* rate.cpp in Sources */, + DF093ECF0F63CB26002D821E /* adlib.cpp in Sources */, + DF093ED00F63CB26002D821E /* fluidsynth.cpp in Sources */, + DF093ED10F63CB26002D821E /* pcspk.cpp in Sources */, + DF093ED20F63CB26002D821E /* ym2612.cpp in Sources */, DF093ED60F63CB26002D821E /* memorypool.cpp in Sources */, DF093ED70F63CB26002D821E /* seq.cpp in Sources */, DF093ED80F63CB26002D821E /* scaler.cpp in Sources */, @@ -9956,6 +9479,7 @@ DF09417A0F63CB26002D821E /* archive.cpp in Sources */, DF09417B0F63CB26002D821E /* unarj.cpp in Sources */, DF09417C0F63CB26002D821E /* stdiostream.cpp in Sources */, + DF09417D0F63CB26002D821E /* musicplugin.cpp in Sources */, DF09417E0F63CB26002D821E /* saveload.cpp in Sources */, DF09417F0F63CB26002D821E /* ThemeEngine.cpp in Sources */, DF0941800F63CB26002D821E /* ThemeEval.cpp in Sources */, @@ -9972,6 +9496,7 @@ DF09418B0F63CB26002D821E /* thumbnail_intern.cpp in Sources */, DF09418C0F63CB26002D821E /* dither.cpp in Sources */, DF0941920F63CB26002D821E /* debug.cpp in Sources */, + DF0941930F63CB26002D821E /* gui-manager.hcpp in Sources */, DF0941940F63CB26002D821E /* posix-saves.cpp in Sources */, DF0941950F63CB26002D821E /* bmv.cpp in Sources */, DF0941960F63CB26002D821E /* dialogs.cpp in Sources */, @@ -10043,9 +9568,12 @@ DF09420D0F63CB26002D821E /* timer_lol.cpp in Sources */, DF0942100F63CB26002D821E /* sprites_lol.cpp in Sources */, DF0942110F63CB26002D821E /* script.cpp in Sources */, + DF0942140F63CB26002D821E /* timestamp.cpp in Sources */, DF0942150F63CB26002D821E /* pn.cpp in Sources */, DF0942160F63CB26002D821E /* script_pn.cpp in Sources */, DF0942170F63CB26002D821E /* vga_pn.cpp in Sources */, + DF0942430F63CB9A002D821E /* events.cpp in Sources */, + DF0942450F63CB9A002D821E /* graphics.cpp in Sources */, DF0942470F63CB9A002D821E /* main.cpp in Sources */, DF09424A0F63CB9A002D821E /* sdl.cpp in Sources */, DF0944330F63FBB3002D821E /* coreaudio.cpp in Sources */, @@ -10061,15 +9589,20 @@ DF09CC150FAC4E1900A5AFD7 /* inter_fascin.cpp in Sources */, DF09CC280FAC4EAB00A5AFD7 /* script_v3.cpp in Sources */, DF09CC290FAC4EAB00A5AFD7 /* script_v4.cpp in Sources */, + DFF958AF0FB222F300A3EC78 /* dosbox.cpp in Sources */, DF61183C0FE3A8080042AD3F /* kmisc.cpp in Sources */, DF61183D0FE3A8080042AD3F /* segment.cpp in Sources */, DF6118490FE3A8250042AD3F /* decompressor.cpp in Sources */, DF61184A0FE3A8250042AD3F /* resource.cpp in Sources */, DF6118550FE3A8990042AD3F /* disk.cpp in Sources */, + DF6118680FE3A9410042AD3F /* dxa_decoder.cpp in Sources */, + DF6118690FE3A9410042AD3F /* flic_decoder.cpp in Sources */, + DF61186A0FE3A9410042AD3F /* smk_decoder.cpp in Sources */, DF6118890FE3A9AA0042AD3F /* saveconverter.cpp in Sources */, DF61188A0FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */, DF61188B0FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */, DF61188C0FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */, + DF61188D0FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */, DF61188E0FE3A9AA0042AD3F /* savefile.cpp in Sources */, DF61188F0FE3A9AA0042AD3F /* savehandler.cpp in Sources */, DF6118900FE3A9AA0042AD3F /* saveload.cpp in Sources */, @@ -10084,6 +9617,7 @@ DF6118BB0FE3AA280042AD3F /* text_lol.cpp in Sources */, DF6118C70FE3AABD0042AD3F /* player_v2cms.cpp in Sources */, DF6118CC0FE3AAFD0042AD3F /* hardwarekeys.cpp in Sources */, + DF6118D10FE3AB560042AD3F /* mame.cpp in Sources */, DF7585CE100CB66E00CC3324 /* expression.cpp in Sources */, DF7585CF100CB66E00CC3324 /* hotspots.cpp in Sources */, DF7585D0100CB66E00CC3324 /* init_v6.cpp in Sources */, @@ -10104,9 +9638,13 @@ DF6BF4F510529EE40069811F /* player_v4a.cpp in Sources */, DF6BF50010529F140069811F /* EventDispatcher.cpp in Sources */, DF6BF50110529F140069811F /* EventRecorder.cpp in Sources */, + DF6BF50A10529F540069811F /* maxtrax.cpp in Sources */, + DF6BF50B10529F540069811F /* tfmx.cpp in Sources */, DF90E9BF10AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA410B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAD10B0236F00C8F93F /* staticres.cpp in Sources */, + DF90EAB810B023D100C8F93F /* avi_decoder.cpp in Sources */, + DF90EAC310B023F400C8F93F /* msvideo1.cpp in Sources */, DF2EC3E510E6490800765801 /* browser_osx.mm in Sources */, DF2EC3F810E64C0C00765801 /* dialogs.cpp in Sources */, DF2EC3FE10E64C4300765801 /* animator_tim.cpp in Sources */, @@ -10114,6 +9652,18 @@ DF2EC50110E64D7C00765801 /* player_pce.cpp in Sources */, DF2EC50210E64D7C00765801 /* player_sid.cpp in Sources */, DF2EC50B10E64DB300765801 /* textconsole.cpp in Sources */, + DF2EC51210E64E3100765801 /* sid.cpp in Sources */, + DF2EC51810E64EE600765801 /* wave6581.cpp in Sources */, + DF45B13D116627DA009B85CC /* adpcm.cpp in Sources */, + DF45B13F116627DA009B85CC /* aiff.cpp in Sources */, + DF45B141116627DA009B85CC /* flac.cpp in Sources */, + DF45B143116627DA009B85CC /* iff_sound.cpp in Sources */, + DF45B145116627DA009B85CC /* mp3.cpp in Sources */, + DF45B147116627DA009B85CC /* raw.cpp in Sources */, + DF45B149116627DA009B85CC /* vag.cpp in Sources */, + DF45B14B116627DA009B85CC /* voc.cpp in Sources */, + DF45B14D116627DA009B85CC /* vorbis.cpp in Sources */, + DF45B14F116627DA009B85CC /* wave.cpp in Sources */, DF45B1F4116628A5009B85CC /* animate.cpp in Sources */, DF45B1F5116628A5009B85CC /* cache.cpp in Sources */, DF45B1F6116628A5009B85CC /* compare.cpp in Sources */, @@ -10147,19 +9697,25 @@ DFCDC6DB116629CE00A7D2A0 /* features.cpp in Sources */, DFCDC6DC116629CE00A7D2A0 /* kparse.cpp in Sources */, DFCDC6F811662AAB00A7D2A0 /* resource.cpp in Sources */, + DFCDC6FF11662AD700A7D2A0 /* msrle.cpp in Sources */, DFCDC70511662B0200A7D2A0 /* saveload_fascin.cpp in Sources */, DFCDC70C11662B6B00A7D2A0 /* macresman.cpp in Sources */, DFEC5D141166C5CF00C90552 /* random.cpp in Sources */, DFEC5D151166C5CF00C90552 /* tokenizer.cpp in Sources */, DFEC5D381166C67300C90552 /* savestate.cpp in Sources */, + DFEC5D411166C6B400C90552 /* dbopl.cpp in Sources */, DF9B924A118E46730069C19D /* error.cpp in Sources */, DF9B9256118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9264118E46FE0069C19D /* error.cpp in Sources */, + DFB0576E11B753AF0015AE65 /* mpeg_player.cpp in Sources */, + DFB0576F11B753AF0015AE65 /* qt_decoder.cpp in Sources */, + DFB0577011B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577811B753DA0015AE65 /* rational.cpp in Sources */, DFB0578411B7541F0015AE65 /* resource_audio.cpp in Sources */, DFB0578511B7541F0015AE65 /* util.cpp in Sources */, DFB0578C11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579311B7547D0015AE65 /* pict.cpp in Sources */, + DFB0579A11B7549C0015AE65 /* cinepak.cpp in Sources */, DF7F286311FF23D500159131 /* amigamac.cpp in Sources */, DF7F286B11FF23EF00159131 /* kvideo.cpp in Sources */, DF7F286C11FF23EF00159131 /* workarounds.cpp in Sources */, @@ -10170,11 +9726,25 @@ DF7F288811FF243B00159131 /* sound_sarien.cpp in Sources */, DF7F288D11FF244F00159131 /* Tooltip.cpp in Sources */, DF7F289711FF247300159131 /* translation.cpp in Sources */, + DF7F28A211FF24B000159131 /* mac_snd.cpp in Sources */, DF7F28A711FF24C400159131 /* console.cpp in Sources */, + DF895BFF124C24350077F6E8 /* coktel_decoder.cpp in Sources */, DF895C04124C24680077F6E8 /* player_towns.cpp in Sources */, + DF895C0A124C24B60077F6E8 /* appleiigs.cpp in Sources */, + DF895C19124C24C10077F6E8 /* towns_audio.cpp in Sources */, + DF895C1A124C24C10077F6E8 /* towns_euphony.cpp in Sources */, + DF895C1B124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */, + DF895C1C124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */, DF895C26124C25150077F6E8 /* init_fascin.cpp in Sources */, DF895C2B124C25350077F6E8 /* script_patches.cpp in Sources */, + DF895CBE124E58990077F6E8 /* indeo3.cpp in Sources */, + DF895CBF124E58990077F6E8 /* mjpeg.cpp in Sources */, + DF895CC0124E58990077F6E8 /* qdm2.cpp in Sources */, + DF895CC1124E58990077F6E8 /* qtrle.cpp in Sources */, + DF895CC2124E58990077F6E8 /* rpza.cpp in Sources */, + DF895CC3124E58990077F6E8 /* smc.cpp in Sources */, DF0E303C1252C5BD0082D593 /* cms.cpp in Sources */, + DF0E30431252C6090082D593 /* cms.cpp in Sources */, 8CB5A9C61253FD6900CB6BC7 /* m4_scene.cpp in Sources */, 8CB5A9C71253FD6900CB6BC7 /* mads_logic.cpp in Sources */, 8CB5A9C81253FD6900CB6BC7 /* mads_player.cpp in Sources */, @@ -10182,6 +9752,7 @@ 8CB5A9CA1253FD6900CB6BC7 /* mads_views.cpp in Sources */, 8CD1ED2F126202AB00FA198C /* detection.cpp in Sources */, 8CD1ED30126202AB00FA198C /* display.cpp in Sources */, + 8CD1ED31126202AB00FA198C /* engine.cpp in Sources */, 8CD1ED32126202AB00FA198C /* file.cpp in Sources */, 8CD1ED33126202AB00FA198C /* hugo.cpp in Sources */, 8CD1ED34126202AB00FA198C /* intro.cpp in Sources */, @@ -10230,136 +9801,6 @@ 8CD80D01126272A0001C6C87 /* surface.cpp in Sources */, 8CD80D02126272A0001C6C87 /* surface_list.cpp in Sources */, 8CD80D03126272A0001C6C87 /* teenagent.cpp in Sources */, - DF203F471380C06E0056300A /* gui-manager.cpp in Sources */, - DF203F631380C2750056300A /* avi_decoder.cpp in Sources */, - DF203F641380C2750056300A /* coktel_decoder.cpp in Sources */, - DF203F651380C2750056300A /* dxa_decoder.cpp in Sources */, - DF203F661380C2750056300A /* flic_decoder.cpp in Sources */, - DF203F681380C2750056300A /* qt_decoder.cpp in Sources */, - DF203F691380C2750056300A /* smk_decoder.cpp in Sources */, - DF203F6A1380C2750056300A /* video_decoder.cpp in Sources */, - DF203F951380C2920056300A /* cdtoons.cpp in Sources */, - DF203F961380C2920056300A /* cinepak.cpp in Sources */, - DF203F971380C2920056300A /* indeo3.cpp in Sources */, - DF203F981380C2920056300A /* mjpeg.cpp in Sources */, - DF203F991380C2920056300A /* msrle.cpp in Sources */, - DF203F9A1380C2920056300A /* msvideo1.cpp in Sources */, - DF203F9B1380C2920056300A /* qdm2.cpp in Sources */, - DF203F9C1380C2920056300A /* qtrle.cpp in Sources */, - DF203F9D1380C2920056300A /* rpza.cpp in Sources */, - DF203F9E1380C2920056300A /* smc.cpp in Sources */, - DF203F9F1380C2920056300A /* truemotion1.cpp in Sources */, - DF203FD51380C3BC0056300A /* console.cpp in Sources */, - DF203FD61380C3BC0056300A /* dialogs.cpp in Sources */, - DF203FD71380C3BC0056300A /* file_v1d.cpp in Sources */, - DF203FD81380C3BC0056300A /* file_v1w.cpp in Sources */, - DF203FD91380C3BC0056300A /* file_v2d.cpp in Sources */, - DF203FDA1380C3BC0056300A /* file_v2w.cpp in Sources */, - DF203FDB1380C3BC0056300A /* file_v3d.cpp in Sources */, - DF203FDC1380C3BC0056300A /* object_v1d.cpp in Sources */, - DF203FDD1380C3BC0056300A /* object_v1w.cpp in Sources */, - DF203FDE1380C3BC0056300A /* object_v2d.cpp in Sources */, - DF203FDF1380C3BC0056300A /* object_v3d.cpp in Sources */, - DF203FE01380C3BC0056300A /* object.cpp in Sources */, - DF203FE11380C3BC0056300A /* parser_v1d.cpp in Sources */, - DF203FE21380C3BC0056300A /* parser_v1w.cpp in Sources */, - DF203FE31380C3BC0056300A /* parser_v2d.cpp in Sources */, - DF203FE41380C3BC0056300A /* parser_v3d.cpp in Sources */, - DF203FE51380C3BC0056300A /* text.cpp in Sources */, - DF20402E1380C8B70056300A /* editable.cpp in Sources */, - DF20402F1380C8B70056300A /* edittext.cpp in Sources */, - DF2040301380C8B70056300A /* list.cpp in Sources */, - DF2040311380C8B70056300A /* popup.cpp in Sources */, - DF2040321380C8B70056300A /* scrollbar.cpp in Sources */, - DF2040331380C8B70056300A /* tab.cpp in Sources */, - DF20405E1380CA230056300A /* audiostream.cpp in Sources */, - DF20405F1380CA230056300A /* fmopl.cpp in Sources */, - DF2040601380CA230056300A /* mididrv.cpp in Sources */, - DF2040611380CA230056300A /* midiparser_smf.cpp in Sources */, - DF2040621380CA230056300A /* midiparser_xmidi.cpp in Sources */, - DF2040631380CA230056300A /* midiparser.cpp in Sources */, - DF2040641380CA230056300A /* midiplayer.cpp in Sources */, - DF2040651380CA230056300A /* mixer.cpp in Sources */, - DF2040661380CA230056300A /* mpu401.cpp in Sources */, - DF2040671380CA230056300A /* musicplugin.cpp in Sources */, - DF2040681380CA230056300A /* rate.cpp in Sources */, - DF2040691380CA230056300A /* timestamp.cpp in Sources */, - DF20409A1380CA400056300A /* adpcm.cpp in Sources */, - DF20409B1380CA400056300A /* aiff.cpp in Sources */, - DF20409C1380CA400056300A /* flac.cpp in Sources */, - DF20409D1380CA400056300A /* iff_sound.cpp in Sources */, - DF20409E1380CA400056300A /* mac_snd.cpp in Sources */, - DF20409F1380CA400056300A /* mp3.cpp in Sources */, - DF2040A01380CA400056300A /* raw.cpp in Sources */, - DF2040A11380CA400056300A /* vag.cpp in Sources */, - DF2040A21380CA400056300A /* voc.cpp in Sources */, - DF2040A31380CA400056300A /* vorbis.cpp in Sources */, - DF2040A41380CA400056300A /* wave.cpp in Sources */, - DF2040CC1380CA810056300A /* infogrames.cpp in Sources */, - DF2040CD1380CA810056300A /* maxtrax.cpp in Sources */, - DF2040CE1380CA810056300A /* module.cpp in Sources */, - DF2040CF1380CA810056300A /* paula.cpp in Sources */, - DF2040D01380CA810056300A /* protracker.cpp in Sources */, - DF2040D11380CA810056300A /* rjp1.cpp in Sources */, - DF2040D21380CA810056300A /* soundfx.cpp in Sources */, - DF2040D31380CA810056300A /* tfmx.cpp in Sources */, - DF2040F41380CAA40056300A /* adlib.cpp in Sources */, - DF2040F51380CAA40056300A /* appleiigs.cpp in Sources */, - DF2040F61380CAA40056300A /* cms.cpp in Sources */, - DF2040F71380CAA40056300A /* eas.cpp in Sources */, - DF2040F81380CAA40056300A /* fluidsynth.cpp in Sources */, - DF2040F91380CAA40056300A /* mt32.cpp in Sources */, - DF2040FA1380CAA40056300A /* pcspk.cpp in Sources */, - DF2040FB1380CAA40056300A /* sid.cpp in Sources */, - DF2040FC1380CAA40056300A /* wave6581.cpp in Sources */, - DF2040FD1380CAA40056300A /* ym2612.cpp in Sources */, - DF46B6F31381E18900D08723 /* coroutine.cpp in Sources */, - DF46B6FF1381E1FF00D08723 /* towns_audio.cpp in Sources */, - DF46B7001381E1FF00D08723 /* towns_euphony.cpp in Sources */, - DF46B7011381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */, - DF46B7021381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */, - DF46B7191381E27000D08723 /* console.cpp in Sources */, - DF46B71A1381E27000D08723 /* databases.cpp in Sources */, - DF46B71B1381E27000D08723 /* dbase.cpp in Sources */, - DF46B71C1381E27000D08723 /* iniconfig.cpp in Sources */, - DF46B71D1381E27000D08723 /* init_v7.cpp in Sources */, - DF46B71E1381E27000D08723 /* inter_inca2.cpp in Sources */, - DF46B7441381E40500D08723 /* log.cpp in Sources */, - DF46B7491381E40F00D08723 /* modular-backend.cpp in Sources */, - DF46B7541381E46700D08723 /* player_v2base.cpp in Sources */, - DF46B75E1381E4A400D08723 /* console.cpp in Sources */, - DF46B7631381E4D400D08723 /* robot_decoder.cpp in Sources */, - DF46B7671381E4E400D08723 /* vm_types.cpp in Sources */, - DF46B77B1381E54200D08723 /* dcl.cpp in Sources */, - DF46B77C1381E54200D08723 /* iff_container.cpp in Sources */, - DF46B77D1381E54200D08723 /* winexe_ne.cpp in Sources */, - DF46B77E1381E54200D08723 /* winexe_pe.cpp in Sources */, - DF46B77F1381E54200D08723 /* winexe.cpp in Sources */, - DF46B7931381E58000D08723 /* png.cpp in Sources */, - DF46B7941381E58000D08723 /* wincursor.cpp in Sources */, - DF46B79F1381E5B500D08723 /* winfont.cpp in Sources */, - DF46B7A51381E5D900D08723 /* sdl-timer.cpp in Sources */, - DF46B7A91381E5F100D08723 /* header.cpp in Sources */, - DF46B7B41381E67800D08723 /* sdl-mutex.cpp in Sources */, - DF46B7BD1381E6C000D08723 /* object.cpp in Sources */, - DF46B7C81381E72500D08723 /* console.cpp in Sources */, - DF46B7CF1381E76300D08723 /* sdl-events.cpp in Sources */, - DF46B7D61381E7C600D08723 /* console.cpp in Sources */, - DF46B83C1381F13500D08723 /* saveload_v7.cpp in Sources */, - DF46B8441381F35500D08723 /* saveload_inca2.cpp in Sources */, - DF46B8481381F38700D08723 /* inter_v7.cpp in Sources */, - DF46B84D1381F39E00D08723 /* console.cpp in Sources */, - DF46B8521381F3B400D08723 /* console.cpp in Sources */, - DF46B8601381F44E00D08723 /* dbopl.cpp in Sources */, - DF46B8611381F44E00D08723 /* dosbox.cpp in Sources */, - DF46B8621381F44E00D08723 /* mame.cpp in Sources */, - DF46B8711381F4A200D08723 /* sdl-audiocd.cpp in Sources */, - DF46B87D1381F4F200D08723 /* default-audiocd.cpp in Sources */, - DF46B8891381F5D800D08723 /* sdl-provider.cpp in Sources */, - DF46B8921381F62B00D08723 /* adpcm.cpp in Sources */, - DF46B89B1381F6C400D08723 /* null.cpp in Sources */, - DFADEBB313820DF500C46364 /* maccursor.cpp in Sources */, - DFADEBB713820E0C00C46364 /* posix-fs.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -10408,14 +9849,41 @@ DFF9593E0FB22D5700A3EC78 /* console.cpp in Sources */, DFF9593F0FB22D5700A3EC78 /* debugger.cpp in Sources */, DFF959400FB22D5700A3EC78 /* dialog.cpp in Sources */, + DFF959410FB22D5700A3EC78 /* editable.cpp in Sources */, + DFF959420FB22D5700A3EC78 /* EditTextWidget.cpp in Sources */, DFF959430FB22D5700A3EC78 /* Key.cpp in Sources */, DFF959440FB22D5700A3EC78 /* launcher.cpp in Sources */, + DFF959450FB22D5700A3EC78 /* ListWidget.cpp in Sources */, DFF959460FB22D5700A3EC78 /* massadd.cpp in Sources */, DFF959470FB22D5700A3EC78 /* message.cpp in Sources */, DFF959480FB22D5700A3EC78 /* object.cpp in Sources */, DFF959490FB22D5700A3EC78 /* options.cpp in Sources */, + DFF9594A0FB22D5700A3EC78 /* PopUpWidget.cpp in Sources */, + DFF9594B0FB22D5700A3EC78 /* ScrollBarWidget.cpp in Sources */, + DFF9594C0FB22D5700A3EC78 /* TabWidget.cpp in Sources */, DFF9594D0FB22D5700A3EC78 /* themebrowser.cpp in Sources */, DFF9594E0FB22D5700A3EC78 /* widget.cpp in Sources */, + DFF959510FB22D5700A3EC78 /* audiocd.cpp in Sources */, + DFF959520FB22D5700A3EC78 /* audiostream.cpp in Sources */, + DFF959540FB22D5700A3EC78 /* fmopl.cpp in Sources */, + DFF959560FB22D5700A3EC78 /* mididrv.cpp in Sources */, + DFF959570FB22D5700A3EC78 /* midiparser.cpp in Sources */, + DFF959580FB22D5700A3EC78 /* midiparser_smf.cpp in Sources */, + DFF959590FB22D5700A3EC78 /* midiparser_xmidi.cpp in Sources */, + DFF9595A0FB22D5700A3EC78 /* mixer.cpp in Sources */, + DFF9595B0FB22D5700A3EC78 /* infogrames.cpp in Sources */, + DFF9595C0FB22D5700A3EC78 /* module.cpp in Sources */, + DFF9595D0FB22D5700A3EC78 /* paula.cpp in Sources */, + DFF9595E0FB22D5700A3EC78 /* protracker.cpp in Sources */, + DFF9595F0FB22D5700A3EC78 /* rjp1.cpp in Sources */, + DFF959600FB22D5700A3EC78 /* soundfx.cpp in Sources */, + DFF959620FB22D5700A3EC78 /* mpu401.cpp in Sources */, + DFF959630FB22D5700A3EC78 /* null.cpp in Sources */, + DFF959640FB22D5700A3EC78 /* rate.cpp in Sources */, + DFF959650FB22D5700A3EC78 /* adlib.cpp in Sources */, + DFF959660FB22D5700A3EC78 /* fluidsynth.cpp in Sources */, + DFF959670FB22D5700A3EC78 /* pcspk.cpp in Sources */, + DFF959680FB22D5700A3EC78 /* ym2612.cpp in Sources */, DFF9596C0FB22D5700A3EC78 /* memorypool.cpp in Sources */, DFF9596D0FB22D5700A3EC78 /* seq.cpp in Sources */, DFF9596E0FB22D5700A3EC78 /* scaler.cpp in Sources */, @@ -11046,6 +10514,7 @@ DFF95C0F0FB22D5700A3EC78 /* archive.cpp in Sources */, DFF95C100FB22D5700A3EC78 /* unarj.cpp in Sources */, DFF95C110FB22D5700A3EC78 /* stdiostream.cpp in Sources */, + DFF95C120FB22D5700A3EC78 /* musicplugin.cpp in Sources */, DFF95C130FB22D5700A3EC78 /* saveload.cpp in Sources */, DFF95C140FB22D5700A3EC78 /* ThemeEngine.cpp in Sources */, DFF95C150FB22D5700A3EC78 /* ThemeEval.cpp in Sources */, @@ -11062,6 +10531,7 @@ DFF95C200FB22D5700A3EC78 /* thumbnail_intern.cpp in Sources */, DFF95C210FB22D5700A3EC78 /* dither.cpp in Sources */, DFF95C270FB22D5700A3EC78 /* debug.cpp in Sources */, + DFF95C280FB22D5700A3EC78 /* gui-manager.hcpp in Sources */, DFF95C290FB22D5700A3EC78 /* posix-saves.cpp in Sources */, DFF95C2A0FB22D5700A3EC78 /* bmv.cpp in Sources */, DFF95C2B0FB22D5700A3EC78 /* dialogs.cpp in Sources */, @@ -11133,6 +10603,7 @@ DFF95C920FB22D5700A3EC78 /* timer_lol.cpp in Sources */, DFF95C940FB22D5700A3EC78 /* sprites_lol.cpp in Sources */, DFF95C950FB22D5700A3EC78 /* script.cpp in Sources */, + DFF95C980FB22D5700A3EC78 /* timestamp.cpp in Sources */, DFF95C990FB22D5700A3EC78 /* pn.cpp in Sources */, DFF95C9A0FB22D5700A3EC78 /* script_pn.cpp in Sources */, DFF95C9B0FB22D5700A3EC78 /* vga_pn.cpp in Sources */, @@ -11147,15 +10618,20 @@ DFF95CB30FB22D5700A3EC78 /* inter_fascin.cpp in Sources */, DFF95CB40FB22D5700A3EC78 /* script_v3.cpp in Sources */, DFF95CB50FB22D5700A3EC78 /* script_v4.cpp in Sources */, + DFF95CB70FB22D5700A3EC78 /* dosbox.cpp in Sources */, DF6118400FE3A8080042AD3F /* kmisc.cpp in Sources */, DF6118410FE3A8080042AD3F /* segment.cpp in Sources */, DF61184F0FE3A8250042AD3F /* decompressor.cpp in Sources */, DF6118500FE3A8250042AD3F /* resource.cpp in Sources */, DF6118570FE3A8990042AD3F /* disk.cpp in Sources */, + DF6118720FE3A9410042AD3F /* dxa_decoder.cpp in Sources */, + DF6118730FE3A9410042AD3F /* flic_decoder.cpp in Sources */, + DF6118740FE3A9410042AD3F /* smk_decoder.cpp in Sources */, DF6118A10FE3A9AA0042AD3F /* saveconverter.cpp in Sources */, DF6118A20FE3A9AA0042AD3F /* saveconverter_v2.cpp in Sources */, DF6118A30FE3A9AA0042AD3F /* saveconverter_v3.cpp in Sources */, DF6118A40FE3A9AA0042AD3F /* saveconverter_v4.cpp in Sources */, + DF6118A50FE3A9AA0042AD3F /* saveconverter_v6.cpp in Sources */, DF6118A60FE3A9AA0042AD3F /* savefile.cpp in Sources */, DF6118A70FE3A9AA0042AD3F /* savehandler.cpp in Sources */, DF6118A80FE3A9AA0042AD3F /* saveload.cpp in Sources */, @@ -11169,6 +10645,7 @@ DF6118C20FE3AA280042AD3F /* sound_pcspk.cpp in Sources */, DF6118C30FE3AA280042AD3F /* text_lol.cpp in Sources */, DF6118C90FE3AABD0042AD3F /* player_v2cms.cpp in Sources */, + DF6118D20FE3AB560042AD3F /* mame.cpp in Sources */, DF7585D4100CB66E00CC3324 /* expression.cpp in Sources */, DF7585D5100CB66E00CC3324 /* hotspots.cpp in Sources */, DF7585D6100CB66E00CC3324 /* init_v6.cpp in Sources */, @@ -11193,15 +10670,31 @@ DF6BF4F310529EE40069811F /* player_v4a.cpp in Sources */, DF6BF4FC10529F140069811F /* EventDispatcher.cpp in Sources */, DF6BF4FD10529F140069811F /* EventRecorder.cpp in Sources */, + DF6BF50610529F540069811F /* maxtrax.cpp in Sources */, + DF6BF50710529F540069811F /* tfmx.cpp in Sources */, DF90E9C110AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA510B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAE10B0236F00C8F93F /* staticres.cpp in Sources */, + DF90EAB910B023D100C8F93F /* avi_decoder.cpp in Sources */, + DF90EAC410B023F400C8F93F /* msvideo1.cpp in Sources */, DF2EC3FA10E64C0C00765801 /* dialogs.cpp in Sources */, DF2EC40010E64C4300765801 /* animator_tim.cpp in Sources */, DF2EC40710E64C8000765801 /* event.cpp in Sources */, DF2EC50510E64D7C00765801 /* player_pce.cpp in Sources */, DF2EC50610E64D7C00765801 /* player_sid.cpp in Sources */, DF2EC50D10E64DB300765801 /* textconsole.cpp in Sources */, + DF2EC51410E64E3100765801 /* sid.cpp in Sources */, + DF2EC51A10E64EE600765801 /* wave6581.cpp in Sources */, + DF45B15B116627DA009B85CC /* adpcm.cpp in Sources */, + DF45B15D116627DA009B85CC /* aiff.cpp in Sources */, + DF45B15F116627DA009B85CC /* flac.cpp in Sources */, + DF45B161116627DA009B85CC /* iff_sound.cpp in Sources */, + DF45B163116627DA009B85CC /* mp3.cpp in Sources */, + DF45B165116627DA009B85CC /* raw.cpp in Sources */, + DF45B167116627DA009B85CC /* vag.cpp in Sources */, + DF45B169116627DA009B85CC /* voc.cpp in Sources */, + DF45B16B116627DA009B85CC /* vorbis.cpp in Sources */, + DF45B16D116627DA009B85CC /* wave.cpp in Sources */, DF45B21E116628A5009B85CC /* animate.cpp in Sources */, DF45B21F116628A5009B85CC /* cache.cpp in Sources */, DF45B220116628A5009B85CC /* compare.cpp in Sources */, @@ -11235,19 +10728,25 @@ DFCDC6DD116629CE00A7D2A0 /* features.cpp in Sources */, DFCDC6DE116629CE00A7D2A0 /* kparse.cpp in Sources */, DFCDC6F911662AAB00A7D2A0 /* resource.cpp in Sources */, + DFCDC70011662AD700A7D2A0 /* msrle.cpp in Sources */, DFCDC70611662B0200A7D2A0 /* saveload_fascin.cpp in Sources */, DFCDC70D11662B6B00A7D2A0 /* macresman.cpp in Sources */, DFEC5D101166C5CF00C90552 /* random.cpp in Sources */, DFEC5D111166C5CF00C90552 /* tokenizer.cpp in Sources */, DFEC5D361166C67300C90552 /* savestate.cpp in Sources */, + DFEC5D3F1166C6B400C90552 /* dbopl.cpp in Sources */, DF9B9248118E46730069C19D /* error.cpp in Sources */, DF9B9252118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9262118E46FE0069C19D /* error.cpp in Sources */, + DFB0576811B753AF0015AE65 /* mpeg_player.cpp in Sources */, + DFB0576911B753AF0015AE65 /* qt_decoder.cpp in Sources */, + DFB0576A11B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577611B753DA0015AE65 /* rational.cpp in Sources */, DFB0578011B7541F0015AE65 /* resource_audio.cpp in Sources */, DFB0578111B7541F0015AE65 /* util.cpp in Sources */, DFB0578A11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579111B7547D0015AE65 /* pict.cpp in Sources */, + DFB0579811B7549C0015AE65 /* cinepak.cpp in Sources */, DF7F286111FF23D500159131 /* amigamac.cpp in Sources */, DF7F286711FF23EF00159131 /* kvideo.cpp in Sources */, DF7F286811FF23EF00159131 /* workarounds.cpp in Sources */, @@ -11258,11 +10757,25 @@ DF7F287E11FF243B00159131 /* sound_sarien.cpp in Sources */, DF7F288B11FF244F00159131 /* Tooltip.cpp in Sources */, DF7F289311FF247300159131 /* translation.cpp in Sources */, + DF7F28A011FF24B000159131 /* mac_snd.cpp in Sources */, DF7F28A511FF24C400159131 /* console.cpp in Sources */, + DF895C00124C24350077F6E8 /* coktel_decoder.cpp in Sources */, DF895C05124C24680077F6E8 /* player_towns.cpp in Sources */, + DF895C0B124C24B60077F6E8 /* appleiigs.cpp in Sources */, + DF895C1D124C24C10077F6E8 /* towns_audio.cpp in Sources */, + DF895C1E124C24C10077F6E8 /* towns_euphony.cpp in Sources */, + DF895C1F124C24C10077F6E8 /* towns_pc98_driver.cpp in Sources */, + DF895C20124C24C10077F6E8 /* towns_pc98_fmsynth.cpp in Sources */, DF895C27124C25150077F6E8 /* init_fascin.cpp in Sources */, DF895C2C124C25350077F6E8 /* script_patches.cpp in Sources */, + DF895CC4124E58990077F6E8 /* indeo3.cpp in Sources */, + DF895CC5124E58990077F6E8 /* mjpeg.cpp in Sources */, + DF895CC6124E58990077F6E8 /* qdm2.cpp in Sources */, + DF895CC7124E58990077F6E8 /* qtrle.cpp in Sources */, + DF895CC8124E58990077F6E8 /* rpza.cpp in Sources */, + DF895CC9124E58990077F6E8 /* smc.cpp in Sources */, DF0E303A1252C5BD0082D593 /* cms.cpp in Sources */, + DF0E30411252C6090082D593 /* cms.cpp in Sources */, 8CB5A9C11253FD6900CB6BC7 /* m4_scene.cpp in Sources */, 8CB5A9C21253FD6900CB6BC7 /* mads_logic.cpp in Sources */, 8CB5A9C31253FD6900CB6BC7 /* mads_player.cpp in Sources */, @@ -11270,6 +10783,7 @@ 8CB5A9C51253FD6900CB6BC7 /* mads_views.cpp in Sources */, 8CD1ED0B126202AB00FA198C /* detection.cpp in Sources */, 8CD1ED0C126202AB00FA198C /* display.cpp in Sources */, + 8CD1ED0D126202AB00FA198C /* engine.cpp in Sources */, 8CD1ED0E126202AB00FA198C /* file.cpp in Sources */, 8CD1ED0F126202AB00FA198C /* hugo.cpp in Sources */, 8CD1ED10126202AB00FA198C /* intro.cpp in Sources */, @@ -11318,134 +10832,6 @@ 8CD80CEF126272A0001C6C87 /* surface.cpp in Sources */, 8CD80CF0126272A0001C6C87 /* surface_list.cpp in Sources */, 8CD80CF1126272A0001C6C87 /* teenagent.cpp in Sources */, - DF203F491380C06E0056300A /* gui-manager.cpp in Sources */, - DF203F731380C2750056300A /* avi_decoder.cpp in Sources */, - DF203F741380C2750056300A /* coktel_decoder.cpp in Sources */, - DF203F751380C2750056300A /* dxa_decoder.cpp in Sources */, - DF203F761380C2750056300A /* flic_decoder.cpp in Sources */, - DF203F781380C2750056300A /* qt_decoder.cpp in Sources */, - DF203F791380C2750056300A /* smk_decoder.cpp in Sources */, - DF203F7A1380C2750056300A /* video_decoder.cpp in Sources */, - DF203FAB1380C2920056300A /* cdtoons.cpp in Sources */, - DF203FAC1380C2920056300A /* cinepak.cpp in Sources */, - DF203FAD1380C2920056300A /* indeo3.cpp in Sources */, - DF203FAE1380C2920056300A /* mjpeg.cpp in Sources */, - DF203FAF1380C2920056300A /* msrle.cpp in Sources */, - DF203FB01380C2920056300A /* msvideo1.cpp in Sources */, - DF203FB11380C2920056300A /* qdm2.cpp in Sources */, - DF203FB21380C2920056300A /* qtrle.cpp in Sources */, - DF203FB31380C2920056300A /* rpza.cpp in Sources */, - DF203FB41380C2920056300A /* smc.cpp in Sources */, - DF203FB51380C2920056300A /* truemotion1.cpp in Sources */, - DF203FF71380C3BC0056300A /* console.cpp in Sources */, - DF203FF81380C3BC0056300A /* dialogs.cpp in Sources */, - DF203FF91380C3BC0056300A /* file_v1d.cpp in Sources */, - DF203FFA1380C3BC0056300A /* file_v1w.cpp in Sources */, - DF203FFB1380C3BC0056300A /* file_v2d.cpp in Sources */, - DF203FFC1380C3BC0056300A /* file_v2w.cpp in Sources */, - DF203FFD1380C3BC0056300A /* file_v3d.cpp in Sources */, - DF203FFE1380C3BC0056300A /* object_v1d.cpp in Sources */, - DF203FFF1380C3BC0056300A /* object_v1w.cpp in Sources */, - DF2040001380C3BC0056300A /* object_v2d.cpp in Sources */, - DF2040011380C3BC0056300A /* object_v3d.cpp in Sources */, - DF2040021380C3BC0056300A /* object.cpp in Sources */, - DF2040031380C3BC0056300A /* parser_v1d.cpp in Sources */, - DF2040041380C3BC0056300A /* parser_v1w.cpp in Sources */, - DF2040051380C3BC0056300A /* parser_v2d.cpp in Sources */, - DF2040061380C3BC0056300A /* parser_v3d.cpp in Sources */, - DF2040071380C3BC0056300A /* text.cpp in Sources */, - DF20403A1380C8B70056300A /* editable.cpp in Sources */, - DF20403B1380C8B70056300A /* edittext.cpp in Sources */, - DF20403C1380C8B70056300A /* list.cpp in Sources */, - DF20403D1380C8B70056300A /* popup.cpp in Sources */, - DF20403E1380C8B70056300A /* scrollbar.cpp in Sources */, - DF20403F1380C8B70056300A /* tab.cpp in Sources */, - DF2040761380CA230056300A /* audiostream.cpp in Sources */, - DF2040771380CA230056300A /* fmopl.cpp in Sources */, - DF2040781380CA230056300A /* mididrv.cpp in Sources */, - DF2040791380CA230056300A /* midiparser_smf.cpp in Sources */, - DF20407A1380CA230056300A /* midiparser_xmidi.cpp in Sources */, - DF20407B1380CA230056300A /* midiparser.cpp in Sources */, - DF20407C1380CA230056300A /* midiplayer.cpp in Sources */, - DF20407D1380CA230056300A /* mixer.cpp in Sources */, - DF20407E1380CA230056300A /* mpu401.cpp in Sources */, - DF20407F1380CA230056300A /* musicplugin.cpp in Sources */, - DF2040801380CA230056300A /* rate.cpp in Sources */, - DF2040811380CA230056300A /* timestamp.cpp in Sources */, - DF2040B01380CA400056300A /* adpcm.cpp in Sources */, - DF2040B11380CA400056300A /* aiff.cpp in Sources */, - DF2040B21380CA400056300A /* flac.cpp in Sources */, - DF2040B31380CA400056300A /* iff_sound.cpp in Sources */, - DF2040B41380CA400056300A /* mac_snd.cpp in Sources */, - DF2040B51380CA400056300A /* mp3.cpp in Sources */, - DF2040B61380CA400056300A /* raw.cpp in Sources */, - DF2040B71380CA400056300A /* vag.cpp in Sources */, - DF2040B81380CA400056300A /* voc.cpp in Sources */, - DF2040B91380CA400056300A /* vorbis.cpp in Sources */, - DF2040BA1380CA400056300A /* wave.cpp in Sources */, - DF2040DC1380CA810056300A /* infogrames.cpp in Sources */, - DF2040DD1380CA810056300A /* maxtrax.cpp in Sources */, - DF2040DE1380CA810056300A /* module.cpp in Sources */, - DF2040DF1380CA810056300A /* paula.cpp in Sources */, - DF2040E01380CA810056300A /* protracker.cpp in Sources */, - DF2040E11380CA810056300A /* rjp1.cpp in Sources */, - DF2040E21380CA810056300A /* soundfx.cpp in Sources */, - DF2040E31380CA810056300A /* tfmx.cpp in Sources */, - DF2041081380CAA40056300A /* adlib.cpp in Sources */, - DF2041091380CAA40056300A /* appleiigs.cpp in Sources */, - DF20410A1380CAA40056300A /* cms.cpp in Sources */, - DF20410B1380CAA40056300A /* eas.cpp in Sources */, - DF20410C1380CAA40056300A /* fluidsynth.cpp in Sources */, - DF20410D1380CAA40056300A /* mt32.cpp in Sources */, - DF20410E1380CAA40056300A /* pcspk.cpp in Sources */, - DF20410F1380CAA40056300A /* sid.cpp in Sources */, - DF2041101380CAA40056300A /* wave6581.cpp in Sources */, - DF2041111380CAA40056300A /* ym2612.cpp in Sources */, - DF46B6F51381E18900D08723 /* coroutine.cpp in Sources */, - DF46B7071381E1FF00D08723 /* towns_audio.cpp in Sources */, - DF46B7081381E1FF00D08723 /* towns_euphony.cpp in Sources */, - DF46B7091381E1FF00D08723 /* towns_pc98_driver.cpp in Sources */, - DF46B70A1381E1FF00D08723 /* towns_pc98_fmsynth.cpp in Sources */, - DF46B7251381E27000D08723 /* console.cpp in Sources */, - DF46B7261381E27000D08723 /* databases.cpp in Sources */, - DF46B7271381E27000D08723 /* dbase.cpp in Sources */, - DF46B7281381E27000D08723 /* iniconfig.cpp in Sources */, - DF46B7291381E27000D08723 /* init_v7.cpp in Sources */, - DF46B72A1381E27000D08723 /* inter_inca2.cpp in Sources */, - DF46B7461381E40500D08723 /* log.cpp in Sources */, - DF46B74B1381E40F00D08723 /* modular-backend.cpp in Sources */, - DF46B7561381E46700D08723 /* player_v2base.cpp in Sources */, - DF46B7601381E4A400D08723 /* console.cpp in Sources */, - DF46B7651381E4D400D08723 /* robot_decoder.cpp in Sources */, - DF46B7691381E4E400D08723 /* vm_types.cpp in Sources */, - DF46B7851381E54200D08723 /* dcl.cpp in Sources */, - DF46B7861381E54200D08723 /* iff_container.cpp in Sources */, - DF46B7871381E54200D08723 /* winexe_ne.cpp in Sources */, - DF46B7881381E54200D08723 /* winexe_pe.cpp in Sources */, - DF46B7891381E54200D08723 /* winexe.cpp in Sources */, - DF46B7971381E58000D08723 /* png.cpp in Sources */, - DF46B7981381E58000D08723 /* wincursor.cpp in Sources */, - DF46B7A11381E5B500D08723 /* winfont.cpp in Sources */, - DF46B7AB1381E5F100D08723 /* header.cpp in Sources */, - DF46B7B61381E67800D08723 /* sdl-mutex.cpp in Sources */, - DF46B7BF1381E6C000D08723 /* object.cpp in Sources */, - DF46B7CA1381E72500D08723 /* console.cpp in Sources */, - DF46B7D81381E7C600D08723 /* console.cpp in Sources */, - DF46B83E1381F13500D08723 /* saveload_v7.cpp in Sources */, - DF46B8461381F35500D08723 /* saveload_inca2.cpp in Sources */, - DF46B84A1381F38700D08723 /* inter_v7.cpp in Sources */, - DF46B84F1381F39E00D08723 /* console.cpp in Sources */, - DF46B8541381F3B400D08723 /* console.cpp in Sources */, - DF46B8661381F44E00D08723 /* dbopl.cpp in Sources */, - DF46B8671381F44E00D08723 /* dosbox.cpp in Sources */, - DF46B8681381F44E00D08723 /* mame.cpp in Sources */, - DF46B8731381F4A200D08723 /* sdl-audiocd.cpp in Sources */, - DF46B87F1381F4F200D08723 /* default-audiocd.cpp in Sources */, - DF46B88B1381F5D800D08723 /* sdl-provider.cpp in Sources */, - DF46B8941381F62B00D08723 /* adpcm.cpp in Sources */, - DF46B89D1381F6C400D08723 /* null.cpp in Sources */, - DFADEBB513820DF500C46364 /* maccursor.cpp in Sources */, - DFADEBB913820E0C00C46364 /* posix-fs.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11471,43 +10857,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = ( - IPHONE_OFFICIAL, - IPHONE, - UNIX, - ENABLE_SCUMM, - ENABLE_SCUMM_7_8, - ENABLE_HE, - ENABLE_AGI, - ENABLE_AGOS, - ENABLE_CINE, - ENABLE_CRUISE, - ENABLE_DRASCULA, - ENABLE_GOB, - ENABLE_GROOVIE, - ENABLE_IGOR, - ENABLE_KYRA, - ENABLE_LURE, - ENABLE_MADE, - ENABLE_PARALLACTION, - ENABLE_QUEEN, - ENABLE_SAGA, - ENABLE_IHNM, - ENABLE_SCI, - ENABLE_SKY, - ENABLE_SWORD1, - ENABLE_SWORD2, - ENABLE_TEENAGENT, - ENABLE_TINSEL, - ENABLE_TOUCHE, - ENABLE_TUCKER, - USE_FLAC, - USE_MAD, - USE_TREMOR, - USE_VORBIS, - USE_ZLIB, - USE_TREMOR, - ); GCC_THUMB_SUPPORT = NO; GCC_UNROLL_LOOPS = YES; HEADER_SEARCH_PATHS = ( @@ -11516,7 +10865,6 @@ include/, ); INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", @@ -11524,11 +10872,10 @@ ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; PRODUCT_NAME = ScummVM; - PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos4.2; + SDKROOT = iphoneos4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "armv6 armv7"; }; name = Debug; }; @@ -11550,10 +10897,49 @@ GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; + GCC_THUMB_SUPPORT = NO; + GCC_UNROLL_LOOPS = YES; + HEADER_SEARCH_PATHS = ( + ../../engines/, + ../../, + include/, + ); + INFOPLIST_FILE = Info.plist; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/lib\"", + ); + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + PRODUCT_NAME = ScummVM; + PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos3.2; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_INPUT_FILETYPE = automatic; + GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( + CONFIG_H, IPHONE_OFFICIAL, IPHONE, - UNIX, + POSIX, + SCUMM_LITTLE_ENDIAN, + SCUMM_NEED_ALIGNMENT, ENABLE_SCUMM, ENABLE_SCUMM_7_8, ENABLE_HE, @@ -11585,48 +10971,8 @@ USE_TREMOR, USE_VORBIS, USE_ZLIB, - USE_TREMOR, ); GCC_THUMB_SUPPORT = NO; - GCC_UNROLL_LOOPS = YES; - HEADER_SEARCH_PATHS = ( - ../../engines/, - ../../, - include/, - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - ); - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - PRODUCT_NAME = ScummVM; - PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "armv6 armv7"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(NATIVE_ARCH_ACTUAL)"; - CODE_SIGN_IDENTITY = "Don't Code Sign"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; - FRAMEWORK_SEARCH_PATHS = ""; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_INPUT_FILETYPE = automatic; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; GCC_USE_GCC3_PFE_SUPPORT = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -11634,15 +10980,16 @@ ../../engines/, ../../, ); - IPHONEOS_DEPLOYMENT_TARGET = 3.0; LIBRARY_SEARCH_PATHS = ""; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = "-lz"; PREBINDING = NO; - SDKROOT = ""; + PROVISIONING_PROFILE = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "i386 ppc ppc64 x86_64 armv6 armv7"; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64 armv6 armv7"; }; name = Debug; }; @@ -11650,39 +10997,91 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(NATIVE_ARCH_ACTUAL)"; - CODE_SIGN_IDENTITY = "Don't Code Sign"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; GCC_ENABLE_EXCEPTIONS = NO; GCC_INPUT_FILETYPE = automatic; - GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + CONFIG_H, + IPHONE_OFFICIAL, + IPHONE, + POSIX, + SCUMM_LITTLE_ENDIAN, + SCUMM_NEED_ALIGNMENT, + ENABLE_SCUMM, + ENABLE_SCUMM_7_8, + ENABLE_HE, + ENABLE_AGI, + ENABLE_AGOS, + ENABLE_CINE, + ENABLE_CRUISE, + ENABLE_DRASCULA, + ENABLE_GOB, + ENABLE_GROOVIE, + ENABLE_IGOR, + ENABLE_KYRA, + ENABLE_LURE, + ENABLE_MADE, + ENABLE_PARALLACTION, + ENABLE_QUEEN, + ENABLE_SAGA, + ENABLE_IHNM, + ENABLE_SCI, + ENABLE_SKY, + ENABLE_SWORD1, + ENABLE_SWORD2, + ENABLE_TEENAGENT, + ENABLE_TINSEL, + ENABLE_TOUCHE, + ENABLE_TUCKER, + USE_FLAC, + USE_MAD, + USE_TREMOR, + USE_VORBIS, + USE_ZLIB, + ); GCC_THUMB_SUPPORT = NO; GCC_USE_GCC3_PFE_SUPPORT = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; HEADER_SEARCH_PATHS = ( + /opt/local/include/SDL, + /opt/local/include, + /sw/include/SDL, + /sw/include, ../../engines/, ../../, ); - IPHONEOS_DEPLOYMENT_TARGET = 3.0; LIBRARY_SEARCH_PATHS = ""; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; - OTHER_LDFLAGS = ""; + OTHER_LDFLAGS = ( + "-lSDLmain", + "-logg", + "-lvorbisfile", + "-lvorbis", + "-lmad", + "-lFLAC", + "-lSDL", + "-lz", + ); PREBINDING = NO; - SDKROOT = ""; + PROVISIONING_PROFILE = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphonesimulator3.2; TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "i386 ppc ppc64 x86_64 armv6 armv7"; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64 armv6 armv7"; }; name = Release; }; DF0942280F63CB26002D821E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -11693,9 +11092,12 @@ GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; GCC_PREPROCESSOR_DEFINITIONS = ( + CONFIG_H, MACOSX, SDL_BACKEND, - UNIX, + POSIX, + SCUMM_LITTLE_ENDIAN, + SCUMM_NEED_ALIGNMENT, ENABLE_SCUMM, ENABLE_SCUMM_7_8, ENABLE_HE, @@ -11725,6 +11127,7 @@ USE_FLAC, USE_MAD, USE_MPEG2, + USE_TREMOR, USE_VORBIS, USE_ZLIB, ); @@ -11734,6 +11137,7 @@ /opt/local/include, /sw/include/SDL, /sw/include, + include/, ../../engines/, ../../, ); @@ -11743,8 +11147,7 @@ /opt/local/lib, "$(inherited)", ); - MACOSX_DEPLOYMENT_TARGET = 10.4; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-lSDLmain", @@ -11758,15 +11161,15 @@ ); PREBINDING = NO; PRODUCT_NAME = ScummVM; - SDKROOT = macosx10.5; - VALID_ARCHS = "i386 ppc ppc64 x86_64"; + SDKROOT = macosx10.6; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64"; }; name = Debug; }; DF0942290F63CB26002D821E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -11775,9 +11178,12 @@ GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; GCC_PREPROCESSOR_DEFINITIONS = ( + CONFIG_H, MACOSX, SDL_BACKEND, - UNIX, + POSIX, + SCUMM_LITTLE_ENDIAN, + SCUMM_NEED_ALIGNMENT, ENABLE_SCUMM, ENABLE_SCUMM_7_8, ENABLE_HE, @@ -11807,6 +11213,7 @@ USE_FLAC, USE_MAD, USE_MPEG2, + USE_TREMOR, USE_VORBIS, USE_ZLIB, ); @@ -11825,8 +11232,7 @@ /opt/local/lib, "$(inherited)", ); - MACOSX_DEPLOYMENT_TARGET = 10.4; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-lSDLmain", @@ -11840,8 +11246,8 @@ ); PREBINDING = NO; PRODUCT_NAME = ScummVM; - SDKROOT = macosx10.5; - VALID_ARCHS = "i386 ppc ppc64 x86_64"; + SDKROOT = macosx10.6; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64"; WRAPPER_EXTENSION = app; }; name = Release; @@ -11849,7 +11255,6 @@ DFF95CC80FB22D5700A3EC78 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COMPRESS_PNG_FILES = NO; @@ -11878,7 +11283,6 @@ /opt/local/lib, "$(inherited)", ); - ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ( "-lSDLmain", "-logg", @@ -11893,15 +11297,13 @@ PRODUCT_NAME = ScummVM; PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "i386 x86_64"; + SDKROOT = iphonesimulator3.2; }; name = Debug; }; DFF95CC90FB22D5700A3EC78 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COMPRESS_PNG_FILES = NO; @@ -11929,7 +11331,6 @@ /opt/local/lib, "$(inherited)", ); - ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ( "-lSDLmain", "-logg", @@ -11944,8 +11345,7 @@ PRODUCT_NAME = ScummVM; PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "i386 x86_64"; + SDKROOT = iphonesimulator3.2; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/ports.mk b/ports.mk index dc0c720c48a5..5e5ee03bc545 100644 --- a/ports.mk +++ b/ports.mk @@ -4,7 +4,7 @@ # -# UNIX specific +# POSIX specific # install: $(INSTALL) -d "$(DESTDIR)$(bindir)" From 38ff07589c8e6c3ecd2b2fcfbc8e1bc1b495eb78 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 16:14:28 +0200 Subject: [PATCH 193/369] BUILD: Unify how _posix is computed However, the current approach of determining _posix based on _host_os is flawed and should be replaced by feature detection; added a TODO about this. --- configure | 60 +++++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/configure b/configure index 2fc8631f5760..69fffc7eea6a 100755 --- a/configure +++ b/configure @@ -1548,7 +1548,6 @@ case $_host_os in LDFLAGS="$LDFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm" LDFLAGS="$LDFLAGS -mthumb-interwork" add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" - _posix=yes _seq_midi=no ;; beos*) @@ -1558,12 +1557,8 @@ case $_host_os in CFLAGS="-I/boot/home/config/include" CXXFLAGS="$CXXFLAGS -fhuge-objects" LIBS="$LIBS -lbind -lsocket" - _posix=yes _seq_midi=no ;; - bsd* | hpux* | netbsd* | openbsd* | sunos*) - _posix=yes - ;; cygwin*) echo ERROR: Cygwin building is not supported by ScummVM anymore. Consider using MinGW. exit 1 @@ -1572,7 +1567,6 @@ case $_host_os in DEFINES="$DEFINES -DMACOSX" LIBS="$LIBS -framework AudioUnit -framework AudioToolbox -framework Carbon -framework CoreMIDI" add_line_to_config_mk 'MACOSX = 1' - _posix=yes ;; dreamcast) DEFINES="$DEFINES -D__DC__ -DNONSTANDARD_PORT" @@ -1598,7 +1592,6 @@ case $_host_os in freebsd*) LDFLAGS="$LDFLAGS -L/usr/local/lib" CXXFLAGS="$CXXFLAGS -I/usr/local/include" - _posix=yes ;; gamecube) CXXFLAGS="$CXXFLAGS -Os -mogc -mcpu=750 -meabi -mhard-float" @@ -1616,14 +1609,12 @@ case $_host_os in DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lnetwork for the timidity MIDI driver LIBS="$LIBS -lnetwork" - _posix=yes _seq_midi=no ;; irix*) DEFINES="$DEFINES -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" LIBS="$LIBS -lmd -lfastm -lm" _ranlib=: - _posix=yes ;; linux* | uclinux*) # When not cross-compiling, enable large file support, but don't @@ -1631,7 +1622,6 @@ case $_host_os in if test -z "$_host"; then CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)" fi - _posix=yes DEFINES="$DEFINES -DLUA_USE_POSIX" ;; mingw*) @@ -1642,7 +1632,6 @@ case $_host_os in ;; mint*) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" - _posix=yes ;; n64) DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT" @@ -1650,9 +1639,6 @@ case $_host_os in DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; - os2-emx*) - _posix=yes # FIXME??? Why?? - ;; ps2) # TODO ps2 CXXFLAGS="$CXXFLAGS -G2" @@ -1669,7 +1655,6 @@ case $_host_os in DEFINES="$DEFINES -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver LIBS="$LIBS -lnsl -lsocket" - _posix=yes ;; webos) CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/include -I$WEBOS_PDK/include/SDL -I$WEBOS_PDK/device/usr/include" @@ -1679,7 +1664,6 @@ case $_host_os in LDFLAGS="$LDFLAGS -Wl,--allow-shlib-undefined" LDFLAGS="$LDFLAGS --sysroot=$WEBOS_PDK/arm-gcc/sysroot" add_line_to_config_mk "WEBOS_SDK = $WEBOS_SDK" - _posix=yes _seq_midi=no ;; wii) @@ -1699,19 +1683,42 @@ case $_host_os in DEFINES="$DEFINES -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT" DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" ;; - # given this is a shell script assume some type of posix - *) - echo "WARNING: could not establish system type, assuming unix like" +esac + +# +# Determine whether host is POSIX compliant, or at least POSIX +# compatible enough to support our POSIX code (including dlsym(), +# mkdir() and some other APIs). +# +# TODO: Instead of basing this on the host name, we should really base +# this on the presence of features (such as the dlsym and mkdir APIs). +# +echo_n "Checking if host is POSIX compliant... " +case $_host_os in + amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | psp | wii | wince) + ;; + android | beos* | bsd* | darwin* | freebsd* | gph-linux | haiku* | hpux* | iphone | irix* | linux* | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos) _posix=yes ;; + os2-emx*) + _posix=yes # FIXME: Really??? + ;; + *) + # given this is a shell script, we might assume some type of posix. + # However, the host system might be a totally different one, so + # we can assume nothing about it. + # Indeed, as mentioned further above, we really should test for the + # presences of relevant APIs on the host anyway... + _posix=no + ;; esac +echo $_posix if test -n "$_host"; then # Cross-compiling mode - add your target here if needed echo "Cross-compiling to $_host" case "$_host" in android | android-v7a) - _posix=yes # we link a .so as default LDFLAGS="$LDFLAGS -shared -Wl,-Bsymbolic,--no-undefined" HOSTEXEPRE=lib @@ -1724,11 +1731,9 @@ if test -n "$_host"; then _timidity=no ;; arm-linux|arm*-linux-gnueabi|arm-*-linux) - _posix=yes ;; arm-riscos|linupy) DEFINES="$DEFINES -DLINUPY" - _posix=yes ;; bfin*) ;; @@ -1744,7 +1749,6 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS" - _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1818,7 +1822,6 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -march=armv4t" ASFLAGS="$ASFLAGS -mfloat-abi=soft" LDFLAGS="$LDFLAGS -static" - _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1836,7 +1839,6 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" - _posix=yes _backend="gph" _build_hq_scalers=no _vkeybd=yes @@ -1847,14 +1849,12 @@ if test -n "$_host"; then ;; iphone) DEFINES="$DEFINES -DIPHONE" - _posix=yes _backend="iphone" _build_hq_scalers=no _seq_midi=no ;; m68k-atari-mint) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" - _posix=yes _ranlib=m68k-atari-mint-ranlib _ar="m68k-atari-mint-ar cru" _seq_midi=no @@ -1872,7 +1872,6 @@ if test -n "$_host"; then motoezx) DEFINES="$DEFINES -DMOTOEZX" ASFLAGS="$ASFLAGS -mfpu=vfp" - _posix=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1883,7 +1882,6 @@ if test -n "$_host"; then motomagx) DEFINES="$DEFINES -DMOTOMAGX" ASFLAGS="$ASFLAGS -mfpu=vfp" - _posix=yes _backend="linuxmoto" _build_hq_scalers=no _mt32emu=no @@ -1915,7 +1913,6 @@ if test -n "$_host"; then ;; neuros) DEFINES="$DEFINES -DNEUROS" - _posix=yes _backend='null' _build_hq_scalers=no _mt32emu=no @@ -1930,7 +1927,6 @@ if test -n "$_host"; then fi CXXFLAGS="$CXXFLAGS -march=armv7-a -mtune=cortex-a8 -mfpu=neon" ASFLAGS="$ASFLAGS -mfloat-abi=soft" - _posix=yes _backend="openpandora" _build_hq_scalers=yes _vkeybd=no @@ -1979,13 +1975,11 @@ if test -n "$_host"; then DEFINES="$DEFINES -DSAMSUNGTV -DDISABLE_COMMAND_LINE" ASFLAGS="$ASFLAGS -mfpu=vfp" HOSTEXEEXT=".so" - _posix=yes _backend="samsungtv" _mt32emu=no _vkeybd=yes ;; webos) - _posix=yes _backend="webos" _port_mk="backends/platform/webos/webos.mk" _build_scalers=no From 8387b68c5758819789a0f555abadb089a7c500b1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 16:26:05 +0200 Subject: [PATCH 194/369] BUILD: Add only one -D to DEFINES per line; add FIXMEs to -D in CXXFLAGS --- configure | 109 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 31 deletions(-) diff --git a/configure b/configure index 69fffc7eea6a..a2542dac939c 100755 --- a/configure +++ b/configure @@ -1153,7 +1153,9 @@ if test "$_release_build" = yes; then # makes it possible to use -Wuninitialized, so let's do that. # We will also add a define, which indicates we are doing # an build for a release version. - CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized -DRELEASE_BUILD" + CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized" + # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. + CXXFLAGS="$CXXFLAGS -DRELEASE_BUILD" fi @@ -1541,6 +1543,7 @@ case $_host_os in fi CXXFLAGS="$CXXFLAGS -finline-limit=300" CXXFLAGS="$CXXFLAGS -Os -mthumb-interwork" + # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__" CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__" # supress 'mangling of 'va_list' has changed in GCC 4.4' @@ -1569,11 +1572,16 @@ case $_host_os in add_line_to_config_mk 'MACOSX = 1' ;; dreamcast) - DEFINES="$DEFINES -D__DC__ -DNONSTANDARD_PORT" + DEFINES="$DEFINES -D__DC__" + DEFINES="$DEFINES -DNONSTANDARD_PORT" ;; ds) # TODO Nintendo DS - DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" + DEFINES="$DEFINES -D__DS__" + DEFINES="$DEFINES -DNDS" + DEFINES="$DEFINES -DARM9" + DEFINES="$DEFINES -DARM" + DEFINES="$DEFINES -DNONSTANDARD_PORT" CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" CXXFLAGS="$CXXFLAGS -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer -mthumb-interwork" CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fno-strict-aliasing" @@ -1612,7 +1620,8 @@ case $_host_os in _seq_midi=no ;; irix*) - DEFINES="$DEFINES -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DIRIX" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" LIBS="$LIBS -lmd -lfastm -lm" _ranlib=: ;; @@ -1625,7 +1634,8 @@ case $_host_os in DEFINES="$DEFINES -DLUA_USE_POSIX" ;; mingw*) - DEFINES="$DEFINES -DWIN32 -D__USE_MINGW_ANSI_STDIO=0" + DEFINES="$DEFINES -DWIN32" + DEFINES="$DEFINES -D__USE_MINGW_ANSI_STDIO=0" LIBS="$LIBS -lmingw32 -lwinmm" OBJS="$OBJS scummvmwinres.o" add_line_to_config_mk 'WIN32 = 1' @@ -1634,25 +1644,35 @@ case $_host_os in DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" ;; n64) - DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT" - DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_COMMAND_LINE" - DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" + DEFINES="$DEFINES -D__N64__" + DEFINES="$DEFINES -DLIMIT_FPS" + DEFINES="$DEFINES -DNONSTANDARD_PORT" + DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_FANCY_THEMES" + DEFINES="$DEFINES -DDISABLE_NES_APU" + DEFINES="$DEFINES -DDISABLE_SID" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; ps2) # TODO ps2 CXXFLAGS="$CXXFLAGS -G2" - DEFINES="$DEFINES -D_EE -D__PLAYSTATION2__" + DEFINES="$DEFINES -D_EE" + DEFINES="$DEFINES -D__PLAYSTATION2__" ;; psp) if test -d "$PSPDEV/psp/lib"; then LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib" fi LDFLAGS="$LDFLAGS -L$PSPSDK/lib -specs=$_srcdir/backends/platform/psp/psp.spec" - CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include -D_PSP_FW_VERSION=150" + CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include" + # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. + CXXFLAGS="$CXXFLAGS -D_PSP_FW_VERSION=150" ;; solaris*) - DEFINES="$DEFINES -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSOLARIS" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver LIBS="$LIBS -lnsl -lsocket" ;; @@ -1679,9 +1699,16 @@ case $_host_os in fi ;; wince) - CXXFLAGS="$CXXFLAGS -O3 -fno-inline-functions -march=armv4 -mtune=xscale -D_WIN32_WCE=300 " - DEFINES="$DEFINES -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT" - DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" + CXXFLAGS="$CXXFLAGS -O3 -fno-inline-functions -march=armv4 -mtune=xscale" + DEFINES="$DEFINES -D_WIN32_WCE=300" + DEFINES="$DEFINES -D__ARM__" + DEFINES="$DEFINES -D_ARM_" + DEFINES="$DEFINES -DUNICODE" + DEFINES="$DEFINES -DFPM_DEFAULT" + DEFINES="$DEFINES -DNONSTANDARD_PORT" + DEFINES="$DEFINES -DWIN32" + DEFINES="$DEFINES -Dcdecl=" + DEFINES="$DEFINES -D__cdecl__=" ;; esac @@ -1740,7 +1767,8 @@ if test -n "$_host"; then caanoo) # This uses the GPH backend. DEFINES="$DEFINES -DGPH_DEVICE" - DEFINES="$DEFINES -DCAANOO -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DCAANOO" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_debug_build" = yes; then DEFINES="$DEFINES -DGPH_DEBUG" else @@ -1762,7 +1790,9 @@ if test -n "$_host"; then _strip=$_host-strip ;; dingux) - DEFINES="$DEFINES -DDINGUX -DDISABLE_DOSBOX_OPL -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DDINGUX" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ASFLAGS="$ASFLAGS" CXXFLAGS="$CXXFLAGS -msoft-float -mips32" _backend="dingux" @@ -1777,7 +1807,9 @@ if test -n "$_host"; then _port_mk="backends/platform/dingux/dingux.mk" ;; dreamcast) - DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" + DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" + DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks" _backend="dc" _build_scalers=no @@ -1788,11 +1820,14 @@ if test -n "$_host"; then ;; ds) # TODO: complete this - DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" - DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" - DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_FANCY_THEMES" + DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DSTREAM_AUDIO_FROM_DISK" + DEFINES="$DEFINES -DVECTOR_RENDERER_FORMAT=1555" add_line_to_config_h '#define DISABLE_TEXT_CONSOLE' _backend="ds" _build_scalers=no @@ -1815,7 +1850,8 @@ if test -n "$_host"; then gp2x) # This uses the GPH backend. DEFINES="$DEFINES -DGPH_DEVICE" - DEFINES="$DEFINES -DGP2X -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DGP2X" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_debug_build" = yes; then DEFINES="$DEFINES -DGPH_DEBUG" fi @@ -1833,7 +1869,8 @@ if test -n "$_host"; then gp2xwiz) # This uses the GPH backend. DEFINES="$DEFINES -DGPH_DEVICE" - DEFINES="$DEFINES -DGP2XWIZ -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DGP2XWIZ" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_debug_build" = yes; then DEFINES="$DEFINES -DGPH_DEBUG" fi @@ -1918,7 +1955,8 @@ if test -n "$_host"; then _mt32emu=no ;; openpandora) - DEFINES="$DEFINES -DOPENPANDORA -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DOPENPANDORA" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_release_build" = no; then DEFINES="$DEFINES -DOP_DEBUG" else @@ -1938,8 +1976,11 @@ if test -n "$_host"; then ;; ps2) # TODO: complete this - DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" - DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" + DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" + DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_SID" + DEFINES="$DEFINES -DDISABLE_NES_APU" _backend="ps2" _build_scalers=no _mt32emu=no @@ -1972,7 +2013,8 @@ if test -n "$_host"; then _port_mk="backends/platform/psp/psp.mk" ;; samsungtv) - DEFINES="$DEFINES -DSAMSUNGTV -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DSAMSUNGTV" + DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" ASFLAGS="$ASFLAGS -mfpu=vfp" HOSTEXEEXT=".so" _backend="samsungtv" @@ -2128,7 +2170,8 @@ case $_backend in ;; ps2) # TODO ps2 - DEFINES="$DEFINES -D_EE -DFORCE_RTL" + DEFINES="$DEFINES -D_EE" + DEFINES="$DEFINES -DFORCE_RTL" INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include" if test "$_dynamic_modules" = no ; then LDFLAGS="$LDFLAGS -mno-crt0 $PS2SDK/ee/startup/crt0.o -T $PS2SDK/ee/startup/linkfile" @@ -2137,7 +2180,9 @@ case $_backend in LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lm -lc -lfileXio -lkernel -lstdc++ " ;; psp) - DEFINES="$DEFINES -D__PSP__ -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -D__PSP__" + DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" ;; samsungtv) @@ -2147,11 +2192,13 @@ case $_backend in webos) # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. LIBS="$LIBS -lSDL" - DEFINES="$DEFINES -DSDL_BACKEND -DWEBOS" + DEFINES="$DEFINES -DSDL_BACKEND" + DEFINES="$DEFINES -DWEBOS" MODULES="$MODULES backends/platform/sdl" ;; wii) - DEFINES="$DEFINES -D__WII__ -DGEKKO" + DEFINES="$DEFINES -D__WII__" + DEFINES="$DEFINES -DGEKKO" case $_host_os in gamecube) LIBS="$LIBS -lgxflux -liso9660 -lfat -logc -ldb" From 717a7accf5f4c58e4b4b9187ee349841163c3896 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 16:34:17 +0200 Subject: [PATCH 195/369] BUILD: Always enable indeo3 codec --- configure | 23 ---------------------- devtools/create_project/create_project.cpp | 1 - video/avi_decoder.cpp | 2 -- video/codecs/indeo3.cpp | 4 ---- video/codecs/indeo3.h | 4 ---- video/coktel_decoder.cpp | 4 ---- 6 files changed, 38 deletions(-) diff --git a/configure b/configure index a2542dac939c..a86bff773437 100755 --- a/configure +++ b/configure @@ -145,7 +145,6 @@ _text_console=no _mt32emu=yes _build_scalers=yes _build_hq_scalers=yes -_indeo3=auto _enable_prof=no _posix=no _global_constructors=no @@ -746,8 +745,6 @@ Optional Libraries: --with-opengl-prefix=DIR Prefix where OpenGL (ES) is installed (optional) --disable-opengl disable OpenGL (ES) support [autodetect] - --disable-indeo3 disable Indeo3 decoder [autodetect] - --with-png-prefix=DIR Prefix where libpng is installed (optional) --disable-png disable PNG decoder [autodetect] @@ -806,8 +803,6 @@ for ac_option in $@; do --enable-nasm) _nasm=yes ;; --disable-nasm) _nasm=no ;; --enable-mpeg2) _mpeg2=yes ;; - --disable-indeo3) _indeo3=no ;; - --enable-indeo3) _indeo3=yes ;; --disable-png) _png=no ;; --enable-png) _png=yes ;; --disable-theoradec) _theoradec=no ;; @@ -1935,7 +1930,6 @@ if test -n "$_host"; then _backend="n64" _mt32emu=no _build_scalers=no - _indeo3=no _translation=no _keymapper=no _text_console=no @@ -2537,19 +2531,6 @@ define_in_config_if_yes "$_build_scalers" 'USE_SCALERS' define_in_config_if_yes "$_build_hq_scalers" 'USE_HQ_SCALERS' -# -# Check whether to compile the Indeo3 decoder -# -if test "$_indeo3" = auto ; then - # Autodetect. Build if either the gob engine or plugins are enabled - if test `get_engine_build gob` = yes || test "$_dynamic_modules" = yes ; then - _indeo3=yes - else - _indeo3=no - fi -fi -define_in_config_if_yes "$_indeo3" 'USE_INDEO3' - # # Check for math lib # @@ -3157,10 +3138,6 @@ if test "$_mt32emu" = yes ; then echo_n ", MT-32 emu" fi -if test "$_indeo3" = yes ; then - echo_n ", Indeo3 decoder" -fi - if test "$_text_console" = yes ; then echo_n ", text console" fi diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index b75b22a29066..fd28882e3d33 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -738,7 +738,6 @@ const Feature s_features[] = { { "mt32emu", "USE_MT32EMU", "", true, "integrated MT-32 emulator" }, { "nasm", "USE_NASM", "", true, "IA-32 assembly support" }, // This feature is special in the regard, that it needs additional handling. { "opengl", "USE_OPENGL", "opengl32", true, "OpenGL support" }, - { "indeo3", "USE_INDEO3", "", true, "Indeo3 codec support"}, { "translation", "USE_TRANSLATION", "", true, "Translation support" }, { "vkeybd", "ENABLE_VKEYBD", "", false, "Virtual keyboard support"}, { "langdetect", "USE_DETECTLANG", "", true, "System language detection support" } // This feature actually depends on "translation", there diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index e3fb2d09ace8..968595230484 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -399,10 +399,8 @@ Codec *AviDecoder::createCodec() { return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); case ID_CVID: return new CinepakDecoder(_bmInfo.bitCount); -#ifdef USE_INDEO3 case ID_IV32: return new Indeo3Decoder(_bmInfo.width, _bmInfo.height); -#endif #ifdef VIDEO_CODECS_TRUEMOTION1_H case ID_DUCK: return new TrueMotion1Decoder(_bmInfo.width, _bmInfo.height); diff --git a/video/codecs/indeo3.cpp b/video/codecs/indeo3.cpp index 529f0b5bda46..7bf7fc8235f8 100644 --- a/video/codecs/indeo3.cpp +++ b/video/codecs/indeo3.cpp @@ -22,8 +22,6 @@ #include "common/scummsys.h" -#ifdef USE_INDEO3 - /* Intel Indeo 3 decompressor, derived from ffmpeg. * * Original copyright note: * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg @@ -3516,5 +3514,3 @@ const uint32 Indeo3Decoder::correctionhighorder[] = { }; } // End of namespace Video - -#endif // USE_INDEO3 diff --git a/video/codecs/indeo3.h b/video/codecs/indeo3.h index c0a88fec5ee6..a07d779dec8e 100644 --- a/video/codecs/indeo3.h +++ b/video/codecs/indeo3.h @@ -22,8 +22,6 @@ #include "common/scummsys.h" -#ifdef USE_INDEO3 - /* Intel Indeo 3 decompressor, derived from ffmpeg. * * Original copyright note: @@ -87,5 +85,3 @@ class Indeo3Decoder : public Codec { } // End of namespace Video #endif // VIDEO_CODECS_INDEO3_H - -#endif // USE_INDEO3 diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp index ee4b22e6b9d9..8ea2d08acb86 100644 --- a/video/coktel_decoder.cpp +++ b/video/coktel_decoder.cpp @@ -1624,11 +1624,7 @@ bool VMDDecoder::openExternalCodec() { if (_videoCodec == kVideoCodecIndeo3) { _isPaletted = false; -#ifdef USE_INDEO3 _codec = new Indeo3Decoder(_width, _height); -#else - warning("VMDDecoder::openExternalCodec(): Indeo3 decoder not compiled in"); -#endif } else { warning("VMDDecoder::openExternalCodec(): Unknown video codec FourCC \"%s\"", From 4b7f6dfa3c8ca3ee614810007728e49ba2fd9e6e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 5 May 2011 17:32:31 +0200 Subject: [PATCH 196/369] BUILD: Rename USE_TEXT_CONSOLE -> USE_TEXT_CONSOLE_FOR_DEBUGGER This reduces the similarity in name to the otherwise mostly unrelated DISABLE_TEXT_CONSOLE #define. --- backends/platform/ds/arm9/makefile | 2 +- configure | 2 +- gui/debugger.cpp | 18 +++++++++--------- gui/debugger.h | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 781738265cff..65fb98ee0dc8 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -245,7 +245,7 @@ ifdef USE_MAD DEFINES += -DUSE_MAD endif -DEFINES += -DREDUCE_MEMORY_USAGE -DDISABLE_DEBUGGER -DUSE_TEXT_CONSOLE -DDISABLE_MASS_ADD -DDISABLE_NES_APU +DEFINES += -DREDUCE_MEMORY_USAGE -DDISABLE_DEBUGGER -DUSE_TEXT_CONSOLE_FOR_DEBUGGER -DDISABLE_MASS_ADD -DDISABLE_NES_APU LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections diff --git a/configure b/configure index a86bff773437..6697fcc5d112 100755 --- a/configure +++ b/configure @@ -2869,7 +2869,7 @@ if test "$_readline" = yes ; then fi define_in_config_h_if_yes "$_readline" 'USE_READLINE' -define_in_config_h_if_yes "$_text_console" 'USE_TEXT_CONSOLE' +define_in_config_h_if_yes "$_text_console" 'USE_TEXT_CONSOLE_FOR_DEBUGGER' # # Check for OpenGL (ES) diff --git a/gui/debugger.cpp b/gui/debugger.cpp index ab3fcef6b2f1..2f49cb2bbe79 100644 --- a/gui/debugger.cpp +++ b/gui/debugger.cpp @@ -29,7 +29,7 @@ #include "engines/engine.h" #include "gui/debugger.h" -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER #include "gui/console.h" #elif defined(USE_READLINE) #include @@ -44,7 +44,7 @@ Debugger::Debugger() { _isActive = false; _errStr = NULL; _firstTime = true; -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER _debuggerDialog = new GUI::ConsoleDialog(1.0f, 0.67f); _debuggerDialog->setInputCallback(debuggerInputCallback, this); _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this); @@ -66,7 +66,7 @@ Debugger::Debugger() { } Debugger::~Debugger() { -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER delete _debuggerDialog; #endif } @@ -78,7 +78,7 @@ int Debugger::DebugPrintf(const char *format, ...) { va_start(argptr, format); int count; -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER count = _debuggerDialog->vprintFormat(1, format, argptr); #else count = ::vprintf(format, argptr); @@ -125,7 +125,7 @@ void Debugger::onFrame() { } } -#if defined(USE_TEXT_CONSOLE) && defined(USE_READLINE) +#if defined(USE_TEXT_CONSOLE_FOR_DEBUGGER) && defined(USE_READLINE) namespace { Debugger *g_readline_debugger; @@ -140,7 +140,7 @@ void Debugger::enter() { // TODO: Having three I/O methods #ifdef-ed in this file is not the // cleanest approach to this... -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER if (_firstTime) { DebugPrintf("Debugger started, type 'exit' to return to the game.\n"); DebugPrintf("Type 'help' to see a little list of commands and variables.\n"); @@ -363,7 +363,7 @@ bool Debugger::tabComplete(const char *input, Common::String &completion) const return true; } -#if defined(USE_TEXT_CONSOLE) && defined(USE_READLINE) +#if defined(USE_TEXT_CONSOLE_FOR_DEBUGGER) && defined(USE_READLINE) char *Debugger::readlineComplete(const char *input, int state) { static CommandsMap::const_iterator iter; @@ -417,7 +417,7 @@ bool Debugger::Cmd_Exit(int argc, const char **argv) { // Print a list of all registered commands (and variables, if any), // nicely word-wrapped. bool Debugger::Cmd_Help(int argc, const char **argv) { -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER const int charsPerLine = _debuggerDialog->getCharsPerLine(); #elif defined(USE_READLINE) int charsPerLine, rows; @@ -520,7 +520,7 @@ bool Debugger::Cmd_DebugFlagDisable(int argc, const char **argv) { } // Console handler -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER bool Debugger::debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon) { Debugger *debugger = (Debugger *)refCon; diff --git a/gui/debugger.h b/gui/debugger.h index c6fce87107a4..6da569e0f8e0 100644 --- a/gui/debugger.h +++ b/gui/debugger.h @@ -29,7 +29,7 @@ namespace GUI { -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER class ConsoleDialog; #endif @@ -144,7 +144,7 @@ class Debugger { */ bool _firstTime; -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER GUI::ConsoleDialog *_debuggerDialog; #endif @@ -194,7 +194,7 @@ class Debugger { bool Cmd_DebugFlagEnable(int argc, const char **argv); bool Cmd_DebugFlagDisable(int argc, const char **argv); -#ifndef USE_TEXT_CONSOLE +#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER private: static bool debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon); static bool debuggerCompletionCallback(GUI::ConsoleDialog *console, const char *input, Common::String &completion, void *refCon); From d2e778bf0b4692e957c74a7749a75d6fd5ed214d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 6 May 2011 13:14:44 +0200 Subject: [PATCH 197/369] BUILD: Replace _need_memalign runtime test by hardcoded list According to a discussion on -devel, this test cannot work reliably in general: It cannot determine when unaligned access really works reliably in all situations, nor on all implementations of the target CPU arch; nor does it determine whether unaligned access is supported effectively (as opposed to say supported via super-slow fault handler mechanism). --- configure | 56 +++++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/configure b/configure index 6697fcc5d112..d230d588df05 100755 --- a/configure +++ b/configure @@ -2061,48 +2061,34 @@ fi # alignment can be a lot slower than regular access, so we don't want # to use it if we don't have to. # -# So we do the following: First, for CPU families where we know whether -# unaligned access is safe & fast, we enable / disable unaligned access -# accordingly. -# Otherwise, for cross compiled builds we just disable memory alignment. -# For native builds, we run some test code that detects whether unaligned -# access is supported (and is supported without an exception handler). -# -# NOTE: The only kinds of unaligned access we allow are for 2 byte and -# 4 byte loads / stores. No promises are made for bigger sizes, such as -# 8 or 16 byte loads, for which various architectures (e.g. x86 and PowerPC) -# behave differently than for the smaller sizes). +# So we do the following: For CPU families where we know whether unaligned +# access is safe & fast, we enable / disable unaligned access accordingly. +# Otherwise, we just disable memory alignment. +# +# NOTE: In the past, for non-cross compiled builds, we would also run some code +# which would try to test whether unaligned access worked or not. But this test +# could not reliably determine whether unaligned access really worked in all +# situations (and across different implementations of the target CPU arch), nor +# whether it was fast (as opposed to slowly emulated by fault handlers). Hence, +# we do not use this approach anymore. +# +# NOTE: The only kinds of unaligned access we allow are for 2 byte and 4 +# byte loads / stores. No promises are made for bigger sizes, such as 8 +# or 16 byte loads, for which architectures may behave differently than +# for the smaller sizes. echo_n "Alignment required... " case $_host_cpu in + i[3-6]86 | x86_64 | ppc*) + # Unaligned access should work + _need_memalign=no + ;; alpha* | arm* | bfin* | hp* | mips* | sh* | sparc* | ia64 | nv1*) # Unaligned access is not supported or extremely slow. _need_memalign=yes ;; - i[3-6]86 | x86_64 | ppc*) - # Unaligned access should work reasonably well - _need_memalign=no - ;; *) - if test -z "$_host"; then - # NOT in cross-compiling mode: - # Try to auto-detect.... - cat > $TMPC << EOF -#include -#include -int main(int argc, char **argv) { - unsigned char test[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }; - signal(SIGBUS, exit); - signal(SIGABRT, exit); - signal(SIGSEGV, exit); - if (*((unsigned int *)(test + 1)) != 0x55443322 && *((unsigned int *)(test + 1)) != 0x22334455) { - return 1; - } - return 0; -} -EOF - cc_check_no_clean && $TMPO$HOSTEXEEXT && _need_memalign=no - cc_check_clean - fi + # Status of unaligned access is unknown, so assume the worst. + _need_memalign=yes ;; esac echo "$_need_memalign" From c439e08590f3e340d80c0c135f412893ddc0c8d5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 9 May 2011 16:37:23 +0200 Subject: [PATCH 198/369] BUILD: Declare RELEASE_BUILD in DEFINES, not CXXFLAGS --- configure | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configure b/configure index d230d588df05..16a4e4c2a2db 100755 --- a/configure +++ b/configure @@ -1149,8 +1149,7 @@ if test "$_release_build" = yes; then # We will also add a define, which indicates we are doing # an build for a release version. CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized" - # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. - CXXFLAGS="$CXXFLAGS -DRELEASE_BUILD" + DEFINES="$DEFINES -DRELEASE_BUILD" fi From 652bf358c25784fe84aed473b555cbe4c836b34d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 13:40:07 +0200 Subject: [PATCH 199/369] BUILD: Update comments --- configure | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/configure b/configure index 16a4e4c2a2db..4b86a8b643ad 100755 --- a/configure +++ b/configure @@ -1376,6 +1376,9 @@ fi echo "$cxx_version" +# +# Bail out now if now useable compiler was found. +# if test "$cxx_verc_fail" = yes ; then echo echo "The version of your compiler is not supported at this time" @@ -1383,19 +1386,10 @@ if test "$cxx_verc_fail" = yes ; then exit 1 fi -echocheck "whether -Wglobal-constructors work" -cat > $TMPC << EOF -int main() { return 0; } -EOF -cc_check -Wglobal-constructors && _global_constructors=yes - -if test "$_global_constructors" = yes; then - CXXFLAGS="$CXXFLAGS -Wglobal-constructors" -fi -echo $_global_constructors - # -# Do CXXFLAGS now that we know the compiler version +# Setup compiler specific CXXFLAGS now that we know the compiler version. +# Foremost, this means enabling various warnings. +# In addition, we set CXX_UPDATE_DEP_FLAG for GCC >= 3.0 and for ICC. # if test "$have_gcc" = yes ; then if test "$_cxx_major" -ge "3" ; then @@ -1423,18 +1417,34 @@ elif test "$have_icc" = yes ; then add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' fi; -# Some platforms use certain GNU extensions in header files +# By default, we add -pedantic to the CXXFLAGS to catch some potentially +# non-portable constructs, like use of GNU extensions. +# However, some platforms use GNU extensions in system header files, so +# for these we must not use -pedantic. case $_host_os in android | gamecube | psp | wii) ;; *) - # ICC does not support pedantic + # ICC does not support pedantic, while GCC and clang do. if test "$have_icc" = no ; then CXXFLAGS="$CXXFLAGS -pedantic" fi ;; esac +# If possible, we want to use -Wglobal-constructors +# However, not all compilers support that, so check whether the active one does. +echocheck "whether -Wglobal-constructors work" +cat > $TMPC << EOF +int main() { return 0; } +EOF +cc_check -Wglobal-constructors && _global_constructors=yes + +if test "$_global_constructors" = yes; then + CXXFLAGS="$CXXFLAGS -Wglobal-constructors" +fi +echo $_global_constructors + # # Check for endianness # @@ -1570,7 +1580,6 @@ case $_host_os in DEFINES="$DEFINES -DNONSTANDARD_PORT" ;; ds) - # TODO Nintendo DS DEFINES="$DEFINES -D__DS__" DEFINES="$DEFINES -DNDS" DEFINES="$DEFINES -DARM9" @@ -1650,7 +1659,6 @@ case $_host_os in DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; ps2) - # TODO ps2 CXXFLAGS="$CXXFLAGS -G2" DEFINES="$DEFINES -D_EE" DEFINES="$DEFINES -D__PLAYSTATION2__" @@ -1813,7 +1821,6 @@ if test -n "$_host"; then _port_mk="backends/platform/dc/dreamcast.mk" ;; ds) - # TODO: complete this DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" @@ -1968,7 +1975,6 @@ if test -n "$_host"; then ppc-amigaos) ;; ps2) - # TODO: complete this DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" @@ -2119,7 +2125,6 @@ case $_backend in DEFINES="$DEFINES -DDINGUX" ;; ds) - # TODO ds INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' @@ -2148,7 +2153,6 @@ case $_backend in openpandora) ;; ps2) - # TODO ps2 DEFINES="$DEFINES -D_EE" DEFINES="$DEFINES -DFORCE_RTL" INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include" From 6e157fd2d4ee1cc5de5b4950ca499ba28f1f153e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 13:40:45 +0200 Subject: [PATCH 200/369] BUILD: Do not define LUA_USE_POSIX It doesn't really do anything useful anymore anyway (except make linux builds use _setjmp instead of setjmp, but both are equally bad for us and need to replaced anyway). --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index 4b86a8b643ad..23eb329dfac4 100755 --- a/configure +++ b/configure @@ -1634,7 +1634,6 @@ case $_host_os in if test -z "$_host"; then CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)" fi - DEFINES="$DEFINES -DLUA_USE_POSIX" ;; mingw*) DEFINES="$DEFINES -DWIN32" From 4f34347485c0f7451987cd25ad69f4f3cb13b1ff Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 14:39:56 +0200 Subject: [PATCH 201/369] BUILD: Minor configure cleanup --- configure | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 23eb329dfac4..0d742b5cc189 100755 --- a/configure +++ b/configure @@ -1824,11 +1824,12 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" DEFINES="$DEFINES -DDISABLE_FANCY_THEMES" - DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" + DEFINES="$DEFINES -DDISABLE_SID" + DEFINES="$DEFINES -DDISABLE_NES_APU" + DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" DEFINES="$DEFINES -DSTREAM_AUDIO_FROM_DISK" DEFINES="$DEFINES -DVECTOR_RENDERER_FORMAT=1555" - add_line_to_config_h '#define DISABLE_TEXT_CONSOLE' _backend="ds" _build_scalers=no _mt32emu=no From 7fcaac9408b920cd5bab21336140ded966e37f89 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 14:55:36 +0200 Subject: [PATCH 202/369] BUILD: Unify plugin prefix/suffix handling, unify setting DYNAMIC_MODULES --- configure | 121 ++++++++++++++++-------------------------------------- 1 file changed, 36 insertions(+), 85 deletions(-) diff --git a/configure b/configure index 0d742b5cc189..3025c7b5f791 100755 --- a/configure +++ b/configure @@ -163,6 +163,8 @@ _arm_asm=no _verbose_build=no _dynamic_modules=no _plugins_default=static +_plugin_prefix= +_plugin_suffix= _nasm=auto # Default commands _ranlib=ranlib @@ -2270,16 +2272,13 @@ add_to_config_mk_if_yes "$_verbose_build" 'VERBOSE_BUILD = 1' echo_n "Checking whether building plugins was requested... " echo "$_dynamic_modules" _mak_plugins= -_def_plugin="/* -> plugins disabled */" if test "$_dynamic_modules" = yes ; then echo_n "Checking whether building plugins is supported... " case $_host_os in android) -_def_plugin=' -#define PLUGIN_PREFIX "lib" -#define PLUGIN_SUFFIX ".so" -' + _plugin_prefix="lib" + _plugin_suffix=".so" # Work around an Android 2.0+ run-time linker bug: # The linker doesn't actually look in previously # loaded libraries when trying to resolve symbols - @@ -2289,11 +2288,7 @@ _def_plugin=' # (otherwise unnecessary) dependency from plugins back # to the main libscummvm.so. _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := lib -PLUGIN_SUFFIX := .so PLUGIN_EXTRA_DEPS = libscummvm.so -CXXFLAGS += -DDYNAMIC_MODULES CXXFLAGS += -fpic PLUGIN_LDFLAGS += $(LDFLAGS) -L. -lscummvm PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive @@ -2302,16 +2297,10 @@ LIBS += -ldl ' ;; darwin*) -_def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".plugin" -' + _plugin_prefix="" + _plugin_suffix=".plugin" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .plugin PLUGIN_EXTRA_DEPS = $(EXECUTABLE) -CXXFLAGS += -DDYNAMIC_MODULES PLUGIN_LDFLAGS += -bundle -bundle_loader $(EXECUTABLE) -exported_symbols_list "$(srcdir)/plugin.exp" PRE_OBJS_FLAGS := -all_load POST_OBJS_FLAGS := @@ -2319,16 +2308,10 @@ LIBS += -ldl ' ;; dreamcast) -_def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".plg" -' + _plugin_prefix="" + _plugin_suffix=".plg" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .plg PLUGIN_EXTRA_DEPS = $(abspath $(srcdir)/backends/platform/dc/plugin.x $(srcdir)/backends/platform/dc/plugin.syms) $(EXECUTABLE) backends/platform/dc/plugin_head.o -CXXFLAGS += -DDYNAMIC_MODULES PLUGIN_LDFLAGS = -ml -m4-single-only -nostartfiles -Wl,-q,-T$(srcdir)/backends/platform/dc/plugin.x,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/platform/dc/plugin.syms -L$(ronindir)/lib backends/platform/dc/plugin_head.o PRE_OBJS_FLAGS := -Wl,--whole-archive POST_OBJS_FLAGS := -Wl,--no-whole-archive @@ -2342,16 +2325,10 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/ds/plugin.ld -mthumb-interwo ' ;; freebsd*) -_def_plugin=' -#define PLUGIN_PREFIX "lib" -#define PLUGIN_SUFFIX ".so" -' + _plugin_prefix="lib" + _plugin_suffix=".so" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := lib -PLUGIN_SUFFIX := .so PLUGIN_EXTRA_DEPS = -CXXFLAGS += -DDYNAMIC_MODULES CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive @@ -2366,16 +2343,10 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/wii/plugin.ld ' ;; gph*) -_def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".plugin" -' + _plugin_prefix="" + _plugin_suffix=".plugin" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .plugin PLUGIN_EXTRA_DEPS = $(EXECUTABLE) -CXXFLAGS += -DDYNAMIC_MODULES CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive @@ -2384,16 +2355,10 @@ LIBS += -ldl ' ;; linux*) -_def_plugin=' -#define PLUGIN_PREFIX "lib" -#define PLUGIN_SUFFIX ".so" -' + _plugin_prefix="lib" + _plugin_suffix=".so" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := lib -PLUGIN_SUFFIX := .so PLUGIN_EXTRA_DEPS = -CXXFLAGS += -DDYNAMIC_MODULES CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive @@ -2402,16 +2367,10 @@ LIBS += -ldl ' ;; *mingw32*) -_def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".dll" -' + _plugin_prefix="" + _plugin_suffix=".dll" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .dll PLUGIN_EXTRA_DEPS = $(EXECUTABLE) -CXXFLAGS += -DDYNAMIC_MODULES PLUGIN_LDFLAGS := -Wl,--enable-auto-import -shared ./libscummvm.a PRE_OBJS_FLAGS := -Wl,--whole-archive POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-implib,./libscummvm.a @@ -2420,16 +2379,10 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im wince) DEFINES="$DEFINES -DUNCACHED_PLUGINS" HOSTEXEEXT=".dll" -_def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".plugin" -' + _plugin_prefix="" + _plugin_suffix=".plugin" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .plugin PLUGIN_EXTRA_DEPS = $(EXECUTABLE) -CXXFLAGS += -DDYNAMIC_MODULES PLUGIN_LDFLAGS := -shared -lscummvm -L. PRE_OBJS_FLAGS := -Wl,--whole-archive POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-implib,./libscummvm.a -shared @@ -2452,16 +2405,10 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/plugin.ld -lstdc++ -lc ' ;; webos) -_def_plugin=' -#define PLUGIN_PREFIX "lib" -#define PLUGIN_SUFFIX ".so" -' + _plugin_prefix="lib" + _plugin_suffix=".so" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := lib -PLUGIN_SUFFIX := .so PLUGIN_EXTRA_DEPS = -CXXFLAGS += -DDYNAMIC_MODULES CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared $(LDFLAGS) PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive @@ -2472,7 +2419,6 @@ LIBS += -ldl *) _dynamic_modules=no _mak_plugins= - _def_plugin= ;; esac echo "$_dynamic_modules" @@ -2484,15 +2430,9 @@ fi define_in_config_if_yes "$_elf_loader" 'USE_ELF_LOADER' if test "$_elf_loader" = yes; then - CXXFLAGS="$CXXFLAGS -DDYNAMIC_MODULES" - _def_plugin=' -#define PLUGIN_PREFIX "" -#define PLUGIN_SUFFIX ".plg" -' + _plugin_prefix="" + _plugin_suffix=".plg" _mak_plugins=' -DYNAMIC_MODULES := 1 -PLUGIN_PREFIX := -PLUGIN_SUFFIX := .plg PLUGIN_EXTRA_DEPS = $(EXECUTABLE) PLUGIN_LDFLAGS = -nostartfiles backends/plugins/elf/version.o -Wl,-q,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/plugins/elf/plugin.syms PRE_OBJS_FLAGS := -Wl,--whole-archive @@ -2500,6 +2440,20 @@ POST_OBJS_FLAGS := -Wl,--no-whole-archive '"$_mak_plugins" fi +# +# Set up some common plugin settings in config.h and config.mk, if enabled +# +if test "$_dynamic_modules" = yes ; then + add_line_to_config_h "#define PLUGIN_PREFIX \"$_plugin_prefix\"" + add_line_to_config_h "#define PLUGIN_SUFFIX \"$_plugin_suffix\"" + add_line_to_config_mk "PLUGIN_PREFIX := $_plugin_prefix" + add_line_to_config_mk "PLUGIN_SUFFIX := $_plugin_suffix" + + add_line_to_config_mk "DYNAMIC_MODULES := 1" + DEFINES="$DEFINES -DDYNAMIC_MODULES" +fi + + # # Check whether integrated MT-32 emulator support is requested # @@ -3269,9 +3223,6 @@ typedef signed $type_1_byte int8; typedef signed $type_2_byte int16; typedef signed $type_4_byte int32; -/* Plugin settings */ -$_def_plugin - #endif /* CONFIG_H */ EOF From b86da6028fd702cd2a3f0c278d1b372135208ad3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 16:32:38 +0200 Subject: [PATCH 203/369] MOHAWK: Fix warning about uninitialized var --- engines/mohawk/livingbooks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index a4e7f0349c28..375806cda413 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -3781,7 +3781,7 @@ void LBProxyItem::init() { Common::String filename = _vm->getFileNameFromConfig("Proxies", _desc.c_str(), leftover); if (!leftover.empty()) error("LBProxyItem tried loading proxy '%s' but got leftover '%s'", _desc.c_str(), leftover.c_str()); - uint16 baseId; + uint16 baseId = 0; for (uint i = 0; i < filename.size(); i++) { if (filename[i] == ';') { baseId = atoi(filename.c_str() + i + 1); From 7e5113b4230d2186a85e2e5ef0920d9d7e753c6d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 16:35:09 +0200 Subject: [PATCH 204/369] TSAGE: Silence another (incorrect but still annoying) uninitialized var warning --- engines/tsage/saveload.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp index 6ae62568a373..56df32146a11 100644 --- a/engines/tsage/saveload.cpp +++ b/engines/tsage/saveload.cpp @@ -64,14 +64,12 @@ Saver::~Saver() { void Serializer::syncPointer(SavedObject **ptr, Common::Serializer::Version minVersion, Common::Serializer::Version maxVersion) { - int idx; + int idx = 0; assert(ptr); if (isSaving()) { // Get the object index for the given pointer and write it out - if (!*ptr) { - idx = 0; - } else { + if (*ptr) { idx = _saver->blockIndexOf(*ptr); assert(idx > 0); } From 587811d852713dfd14a23e48bedc06ae9d99a79b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 16:42:16 +0200 Subject: [PATCH 205/369] M4: Attempt to fix the broken Rails code I am not sure how this code could have ever worked without lots of crashing, but maybe I am missing something... Still, casting an arbitrary integer value to an int *pointer* and then later dereferencing it does not seem like a good idea :). Changed the code to do what I *guess* it was meant to do. But somebody who actually knows M4 and its games should double check. --- engines/m4/rails.cpp | 8 +++----- engines/m4/rails.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/engines/m4/rails.cpp b/engines/m4/rails.cpp index d706af8ef1f9..f51d81c8f406 100644 --- a/engines/m4/rails.cpp +++ b/engines/m4/rails.cpp @@ -61,9 +61,7 @@ void Rails::clearRails() { delete tempNode; } - for (i = 0; i < _edges.size(); i++) { - _edges.remove_at(i); - } + _edges.clear(); for (j = _noWalkRects.begin(); j != _noWalkRects.end(); ++j) delete (*j); @@ -246,7 +244,7 @@ void Rails::createEdge(int32 node1, int32 node2) { } else { distance = SqrtF16(FixedMul(deltaX, deltaX) + FixedMul(deltaY, deltaY)) << 8; } - _edges.insert_at(index, (int16*)(distance >> 16)); + _edges.insert_at(index, distance >> 16); } debugCN(kDebugCore, "node1 = %d, node2 = %d, valid = %d\n", node1, node2, valid); @@ -312,7 +310,7 @@ int16 Rails::getEdgeLength(int32 node1, int32 node2) { // Find the table entry i.e. tableWidth * node1 + node2 and then subtract // n(n+1)/2, since only the upper triangle of the table is stored index = (MAXRAILNODES-1)*node1 + node2 - 1 - (node1*(node1+1)>>1); - return *_edges[index]; + return _edges[index]; } void Rails::disposePath(RailNode *pathStart) { diff --git a/engines/m4/rails.h b/engines/m4/rails.h index ccc9e0053678..80bb55e9de8e 100644 --- a/engines/m4/rails.h +++ b/engines/m4/rails.h @@ -73,7 +73,7 @@ class Rails { private: Common::Array _nodes; - Common::Array _edges; + Common::Array _edges; Common::List _noWalkRects; M4Surface *_walkCodes; From 8615cecfe07ee4d76d9620dd96d11c8ce4df5011 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 16:44:50 +0200 Subject: [PATCH 206/369] SCI: Constify Object::_baseVars This may have to be undone if we ever want to start free'ing _baseVars again. --- engines/sci/engine/object.cpp | 4 ++-- engines/sci/engine/object.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp index aee93ffaa754..f09f18298ac3 100644 --- a/engines/sci/engine/object.cpp +++ b/engines/sci/engine/object.cpp @@ -58,14 +58,14 @@ void Object::init(byte *buf, reg_t obj_pos, bool initVariables) { if (getSciVersion() <= SCI_VERSION_1_LATE) { _variables.resize(READ_LE_UINT16(data + kOffsetSelectorCounter)); - _baseVars = (uint16 *)(_baseObj + _variables.size() * 2); + _baseVars = (const uint16 *)(_baseObj + _variables.size() * 2); _methodCount = READ_LE_UINT16(data + READ_LE_UINT16(data + kOffsetFunctionArea) - 2); for (int i = 0; i < _methodCount * 2 + 2; ++i) { _baseMethod.push_back(READ_SCI11ENDIAN_UINT16(data + READ_LE_UINT16(data + kOffsetFunctionArea) + i * 2)); } } else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1) { _variables.resize(READ_SCI11ENDIAN_UINT16(data + 2)); - _baseVars = (uint16 *)(buf + READ_SCI11ENDIAN_UINT16(data + 4)); + _baseVars = (const uint16 *)(buf + READ_SCI11ENDIAN_UINT16(data + 4)); _methodCount = READ_SCI11ENDIAN_UINT16(buf + READ_SCI11ENDIAN_UINT16(data + 6)); for (int i = 0; i < _methodCount * 2 + 3; ++i) { _baseMethod.push_back(READ_SCI11ENDIAN_UINT16(buf + READ_SCI11ENDIAN_UINT16(data + 6) + i * 2)); diff --git a/engines/sci/engine/object.h b/engines/sci/engine/object.h index 7e07fb2f6da1..80c8e9e83db3 100644 --- a/engines/sci/engine/object.h +++ b/engines/sci/engine/object.h @@ -236,7 +236,7 @@ class Object { void initSelectorsSci3(const byte *buf); const byte *_baseObj; /**< base + object offset within base */ - uint16 *_baseVars; /**< Pointer to the varselector area for this object */ + const uint16 *_baseVars; /**< Pointer to the varselector area for this object */ Common::Array _baseMethod; /**< Pointer to the method selector area for this object */ uint16 *_propertyOffsetsSci3; /**< This is used to enable relocation of property valuesa in SCI3 */ From 1277975c6685d13a05a2e77dc5f5604f3a4620bf Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 09:56:31 -0400 Subject: [PATCH 207/369] ALL: neighbour -> neighbor --- engines/queen/command.cpp | 4 ++-- engines/queen/cutaway.cpp | 4 ++-- engines/queen/logic.cpp | 2 +- engines/queen/structs.h | 6 +++--- engines/queen/walk.cpp | 4 ++-- engines/scumm/boxes.cpp | 10 +++++----- engines/scumm/gfx.cpp | 2 +- engines/scumm/scumm.h | 2 +- engines/scumm/scumm_v0.h | 2 +- engines/sword1/router.cpp | 2 +- engines/sword2/router.cpp | 2 +- engines/tinsel/move.cpp | 2 +- graphics/scaler.cpp | 6 +++--- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/engines/queen/command.cpp b/engines/queen/command.cpp index 4f86d1f7ec4e..7876dbfae984 100644 --- a/engines/queen/command.cpp +++ b/engines/queen/command.cpp @@ -1081,10 +1081,10 @@ void Command::setAreas(uint16 command) { Area *area = _vm->grid()->area(cmdArea->room, areaNum); if (cmdArea->area > 0) { // turn on area - area->mapNeighbours = ABS(area->mapNeighbours); + area->mapNeighbors = ABS(area->mapNeighbors); } else { // turn off area - area->mapNeighbours = -ABS(area->mapNeighbours); + area->mapNeighbors = -ABS(area->mapNeighbors); } } } diff --git a/engines/queen/cutaway.cpp b/engines/queen/cutaway.cpp index 70d825229965..de54b7e33c48 100644 --- a/engines/queen/cutaway.cpp +++ b/engines/queen/cutaway.cpp @@ -1152,10 +1152,10 @@ void Cutaway::updateGameState() { if (areaSubIndex > 0) { Area *area = _vm->grid()->area(areaIndex, areaSubIndex); - area->mapNeighbours = ABS(area->mapNeighbours); + area->mapNeighbors = ABS(area->mapNeighbors); } else { Area *area = _vm->grid()->area(areaIndex, ABS(areaSubIndex)); - area->mapNeighbours = -ABS(area->mapNeighbours); + area->mapNeighbors = -ABS(area->mapNeighbors); } } diff --git a/engines/queen/logic.cpp b/engines/queen/logic.cpp index db496bee3951..f60ac59ff1d3 100644 --- a/engines/queen/logic.cpp +++ b/engines/queen/logic.cpp @@ -1626,7 +1626,7 @@ void Logic::asmSetLightsOn() { void Logic::asmSetManequinAreaOn() { Area *a = _vm->grid()->area(ROOM_FLODA_FRONTDESK, 7); - a->mapNeighbours = ABS(a->mapNeighbours); + a->mapNeighbors = ABS(a->mapNeighbors); } void Logic::asmPanToJoe() { diff --git a/engines/queen/structs.h b/engines/queen/structs.h index b0a26ed4ba79..6dd98fa1f5ab 100644 --- a/engines/queen/structs.h +++ b/engines/queen/structs.h @@ -77,7 +77,7 @@ struct Box { struct Area { //! bitmask of connected areas - int16 mapNeighbours; + int16 mapNeighbors; //! coordinates defining area limits Box box; //! scaling factors for bobs actors @@ -86,7 +86,7 @@ struct Area { uint16 object; void readFromBE(byte *&ptr) { - mapNeighbours = (int16)READ_BE_UINT16(ptr); ptr += 2; + mapNeighbors = (int16)READ_BE_UINT16(ptr); ptr += 2; box.readFromBE(ptr); bottomScaleFactor = READ_BE_UINT16(ptr); ptr += 2; topScaleFactor = READ_BE_UINT16(ptr); ptr += 2; @@ -94,7 +94,7 @@ struct Area { } void writeToBE(byte *&ptr) { - WRITE_BE_UINT16(ptr, mapNeighbours); ptr += 2; + WRITE_BE_UINT16(ptr, mapNeighbors); ptr += 2; box.writeToBE(ptr); WRITE_BE_UINT16(ptr, bottomScaleFactor); ptr += 2; WRITE_BE_UINT16(ptr, topScaleFactor); ptr += 2; diff --git a/engines/queen/walk.cpp b/engines/queen/walk.cpp index c5cfbb7d5f4b..b5c9b97ce088 100644 --- a/engines/queen/walk.cpp +++ b/engines/queen/walk.cpp @@ -111,7 +111,7 @@ void Walk::animateJoe() { WalkData *pwd = &_walkData[i]; // area has been turned off, see if we should execute a cutaway - if (pwd->area->mapNeighbours < 0) { + if (pwd->area->mapNeighbors < 0) { // queen.c l.2838-2911 _vm->logic()->handleSpecialArea(pwd->anim.facing, pwd->areaNum, i); _joeMoveBlock = true; @@ -482,7 +482,7 @@ int16 Walk::findAreaPosition(int16 *x, int16 *y, bool recalibrate) { uint16 Walk::findFreeArea(uint16 area) const { uint16 testArea; uint16 freeArea = 0; - uint16 map = ABS(_roomArea[area].mapNeighbours); + uint16 map = ABS(_roomArea[area].mapNeighbors); for (testArea = 1; testArea <= _roomAreaCount; ++testArea) { int b = _roomAreaCount - testArea; if (map & (1 << b)) { diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp index ba4dedfbd367..1acb7e558655 100644 --- a/engines/scumm/boxes.cpp +++ b/engines/scumm/boxes.cpp @@ -726,7 +726,7 @@ int ScummEngine::getNextBox(byte from, byte to) { dest = to; do { dest = itineraryMatrix[numOfBoxes * from + dest]; - } while (dest != Actor::kInvalidBox && !areBoxesNeighbours(from, dest)); + } while (dest != Actor::kInvalidBox && !areBoxesNeighbors(from, dest)); if (dest == Actor::kInvalidBox) dest = -1; @@ -970,7 +970,7 @@ void ScummEngine::calcItineraryMatrix(byte *itineraryMatrix, int num) { if (i == j) { adjacentMatrix[i * boxSize + j] = 0; itineraryMatrix[i * boxSize + j] = j; - } else if (areBoxesNeighbours(i, j)) { + } else if (areBoxesNeighbors(i, j)) { adjacentMatrix[i * boxSize + j] = 1; itineraryMatrix[i * boxSize + j] = j; } else { @@ -1060,8 +1060,8 @@ void ScummEngine::createBoxMatrix() { free(itineraryMatrix); } -/** Check if two boxes are neighbours. */ -bool ScummEngine::areBoxesNeighbours(int box1nr, int box2nr) { +/** Check if two boxes are neighbors. */ +bool ScummEngine::areBoxesNeighbors(int box1nr, int box2nr) { Common::Point tmp; BoxCoords box; BoxCoords box2; @@ -1158,7 +1158,7 @@ bool ScummEngine::areBoxesNeighbours(int box1nr, int box2nr) { return false; } -bool ScummEngine_v0::areBoxesNeighbours(int box1nr, int box2nr) { +bool ScummEngine_v0::areBoxesNeighbors(int box1nr, int box2nr) { int i; const int numOfBoxes = getNumBoxes(); const byte *boxm; diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 08ae9fdd96ee..1b913e16b40e 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -583,7 +583,7 @@ void ScummEngine::updateDirtyScreen(VirtScreenNumber slot) { vs->tdirty[i] = vs->h; vs->bdirty[i] = 0; if (i != (_gdi->_numStrips - 1) && vs->bdirty[i + 1] == bottom && vs->tdirty[i + 1] == top) { - // Simple optimizations: if two or more neighbouring strips + // Simple optimizations: if two or more neighboring strips // form one bigger rectangle, coalesce them. w += 8; continue; diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 636c9099116c..60bcd97d7c3b 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -1120,7 +1120,7 @@ class ScummEngine : public Engine { void calcItineraryMatrix(byte *itineraryMatrix, int num); void createBoxMatrix(); - virtual bool areBoxesNeighbours(int i, int j); + virtual bool areBoxesNeighbors(int i, int j); /* String class */ public: diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h index 9c492663dc1a..af481df0e0a1 100644 --- a/engines/scumm/scumm_v0.h +++ b/engines/scumm/scumm_v0.h @@ -94,7 +94,7 @@ class ScummEngine_v0 : public ScummEngine_v2 { virtual void resetSentence(bool walking); - virtual bool areBoxesNeighbours(int box1nr, int box2nr); + virtual bool areBoxesNeighbors(int box1nr, int box2nr); /* Version C64 script opcodes */ void o_stopCurrentScript(); diff --git a/engines/sword1/router.cpp b/engines/sword1/router.cpp index e3b6ab3343cc..aaf475912dbb 100644 --- a/engines/sword1/router.cpp +++ b/engines/sword1/router.cpp @@ -261,7 +261,7 @@ int32 Router::getRoute() { // of a line // scan through the nodes linking each node to its nearest - // neighbour until no more nodes change + // neighbor until no more nodes change // This is the routine that finds a route using scan() diff --git a/engines/sword2/router.cpp b/engines/sword2/router.cpp index fa5a677b8631..d3f274dd2c69 100644 --- a/engines/sword2/router.cpp +++ b/engines/sword2/router.cpp @@ -320,7 +320,7 @@ int32 Router::getRoute() { // of a line // scan through the nodes linking each node to its nearest - // neighbour until no more nodes change + // neighbor until no more nodes change // This is the routine that finds a route using scan() diff --git a/engines/tinsel/move.cpp b/engines/tinsel/move.cpp index d6b96fee7be8..e20f28d52897 100644 --- a/engines/tinsel/move.cpp +++ b/engines/tinsel/move.cpp @@ -578,7 +578,7 @@ static void SetMoverUltDest(PMOVER pActor, int x, int y) { * Set intermediate destination. * * If in final destination path, go straight to target. - * If in a neighbouring path to the final destination, if the target path + * If in a neighboring path to the final destination, if the target path * is a follow nodes path, head for the end node, otherwise head straight * for the target. * Otherwise, head towards the pseudo-center or end node of the first diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp index 8038e2089ee4..a35fb9046e25 100644 --- a/graphics/scaler.cpp +++ b/graphics/scaler.cpp @@ -196,7 +196,7 @@ void Normal2x(const uint8 *srcPtr, #else /** - * Trivial nearest-neighbour 2x scaler. + * Trivial nearest-neighbor 2x scaler. */ void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -221,7 +221,7 @@ void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPit #endif /** - * Trivial nearest-neighbour 3x scaler. + * Trivial nearest-neighbor 3x scaler. */ void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -254,7 +254,7 @@ void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPit #define interpolate_1_1_1_1 interpolate16_1_1_1_1 /** - * Trivial nearest-neighbour 1.5x scaler. + * Trivial nearest-neighbor 1.5x scaler. */ template void Normal1o5xTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, From eea482fa4304cab0e23ca4abffdec3651e45f01d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:31:37 -0400 Subject: [PATCH 208/369] ALL: behaviour -> behavior --- backends/midi/alsa.cpp | 2 +- backends/platform/wince/README-WinCE.txt | 4 ++-- common/str.h | 2 +- engines/agi/checks.cpp | 2 +- engines/agi/graphics.cpp | 2 +- engines/agi/op_cmd.cpp | 2 +- engines/agi/op_test.cpp | 4 ++-- engines/agos/midi.cpp | 2 +- engines/cruise/mainDraw.cpp | 2 +- engines/gob/save/saveconverter.cpp | 2 +- engines/lure/debugger.cpp | 2 +- engines/mohawk/cstime_ui.cpp | 4 ++-- engines/sci/engine/kfile.cpp | 2 +- engines/sci/engine/kscripts.cpp | 4 ++-- engines/sci/engine/seg_manager.cpp | 2 +- engines/sci/engine/selector.h | 2 +- engines/sci/graphics/animate.cpp | 2 +- engines/sci/graphics/cursor.cpp | 4 ++-- engines/sci/graphics/text16.cpp | 2 +- engines/scumm/actor.cpp | 2 +- engines/scumm/help.cpp | 2 +- engines/scumm/input.cpp | 4 ++-- engines/scumm/object.cpp | 2 +- engines/scumm/script_v5.cpp | 2 +- engines/scumm/scumm.h | 4 ++-- engines/sword2/controls.cpp | 2 +- engines/sword2/interpreter.cpp | 2 +- engines/sword25/util/lua/luaconf.h | 2 +- graphics/palette.h | 2 +- gui/gui-manager.cpp | 2 +- 30 files changed, 37 insertions(+), 37 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 28e44b445acf..9f1e48dc2b10 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -382,7 +382,7 @@ MusicDevices AlsaMusicPlugin::getDevices() const { AlsaDevices alsaDevices = getAlsaDevices(); - // Since the default behaviour is to use the first device in the list, + // Since the default behavior is to use the first device in the list, // try to put something sensible there. We used to have 17:0 and 65:0 // as defaults. diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index 6d3c66fda8f2..5ea3437d18b3 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -265,7 +265,7 @@ How do I play a game on a Smartphone device ? On non-stylus devices, the mouse cursor is emulated via a set of keys. The cursor will move faster if you keep the key down. You can tweak this -behaviour in the configuration file described below. +behavior in the configuration file described below. Here is the list of available actions for Smartphones: @@ -369,7 +369,7 @@ You can tweak these parameters to customize how the cursor is handled. * repeatTrigger int Number of milliseconds a key must be held to consider being repeated. * repeatX int Number of key repeat events before changing - horizontal cursor behaviour. + horizontal cursor behavior. * stepX1 int Horizontal cursor offset value when the key is not repeated. * stepX2 int Horizontal cursor offset value when the key diff --git a/common/str.h b/common/str.h index b76e4f8448a9..b85c3812a7a4 100644 --- a/common/str.h +++ b/common/str.h @@ -38,7 +38,7 @@ namespace Common { * a certain length do we allocate a buffer on the heap. * * The presence of \0 characters in the string will cause undefined - * behaviour in some operations. + * behavior in some operations. */ class String { protected: diff --git a/engines/agi/checks.cpp b/engines/agi/checks.cpp index 8d03ae67b96b..20276657ff37 100644 --- a/engines/agi/checks.cpp +++ b/engines/agi/checks.cpp @@ -265,7 +265,7 @@ void AgiEngine::updatePosition() { * This function adjusts the position of a sprite moving it until * certain criteria is matched. According to priority and control line * data, a sprite may not always appear at the location we specified. - * This behaviour is also known as the "Budin-Sonneveld effect". + * This behavior is also known as the "Budin-Sonneveld effect". * * @param n view table entry number */ diff --git a/engines/agi/graphics.cpp b/engines/agi/graphics.cpp index 5ceccd9e2744..eb162e4ab0f2 100644 --- a/engines/agi/graphics.cpp +++ b/engines/agi/graphics.cpp @@ -841,7 +841,7 @@ void GfxMgr::setAGIPal(int p0) { // Use only the lowest 6 bits of each color component (Red, Green and Blue) // because VGA used only 6 bits per color component (i.e. VGA had 18-bit colors). - // This should now be identical to the original AGIPAL-hack's behaviour. + // This should now be identical to the original AGIPAL-hack's behavior. bool validVgaPalette = true; for (int i = 0; i < 16 * 3; i++) { if (_agipalPalette[i] >= (1 << 6)) { diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index fb4c079a4aca..bde62fe2d993 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -672,7 +672,7 @@ void AgiEngine::cmd_adj_ego_move_to_x_y(uint8 *p) { // Turn off ego's current movement caused with the mouse if // adj.ego.move.to.x.y is called with other arguments than previously. - // Fixes weird looping behaviour when walking to a ladder in the mines + // Fixes weird looping behavior when walking to a ladder in the mines // (Rooms 147-162) in Gold Rush using the mouse. Sometimes the ego didn't // stop when walking to a ladder using the mouse but kept moving on the // ladder in a horizontally looping manner i.e. from right to left, from diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp index 13b2d250236d..0660a614b612 100644 --- a/engines/agi/op_test.cpp +++ b/engines/agi/op_test.cpp @@ -167,7 +167,7 @@ uint8 AgiEngine::testSaid(uint8 nwords, uint8 *cc) { // user typed should be correct, but it looks like code 9999 means that // if the string is empty at this point, the entry is also correct... // - // With the removal of this code, the behaviour of the scene was + // With the removal of this code, the behavior of the scene was // corrected for (c = 0; nwords && n; c++, nwords--, n--) { @@ -316,7 +316,7 @@ int AgiEngine::testIfCode(int lognum) { case 0x13: // Unknown test command 19 // My current theory is that this command checks whether the ego is currently moving // and that that movement has been caused using the mouse and not using the keyboard. - // I base this theory on the game's behaviour on an Amiga emulator, not on disassembly. + // I base this theory on the game's behavior on an Amiga emulator, not on disassembly. // This command is used at least in the Amiga version of Gold Rush! v2.05 1989-03-09 // (AGI 2.316) in logics 1, 3, 5, 6, 137 and 192 (Logic.192 revealed this command's nature). // TODO: Check this command's implementation using disassembly just to be sure. diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp index 4459701d65df..88f6dd80d181 100644 --- a/engines/agos/midi.cpp +++ b/engines/agos/midi.cpp @@ -150,7 +150,7 @@ void MidiPlayer::send(uint32 b) { // We have received a "Reset All Controllers" message // and passed it on to the MIDI driver. This may or may // not have affected the volume controller. To ensure - // consistent behaviour, explicitly set the volume to + // consistent behavior, explicitly set the volume to // what we think it should be. if (_current == &_sfx) diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp index 336471b6fff0..814d0aa9e983 100644 --- a/engines/cruise/mainDraw.cpp +++ b/engines/cruise/mainDraw.cpp @@ -211,7 +211,7 @@ int m_color; This "worked" on many platforms so far, but on OSX apparently the buffers don't occupy contiguous memory, and this causes severe corruption and subsequent crashes. Since I'm not really familiar with how the strange drawing code is supposed to work, - or whether this behaviour is intentional or not, the short-term fix is to allocate a big + or whether this behavior is intentional or not, the short-term fix is to allocate a big buffer and setup pointers within it. This fixes the crashes I'm seeing without causing any (visual) side-effects. If anyone wants to look, this is easily reproduced by starting the game and examining the rug. diff --git a/engines/gob/save/saveconverter.cpp b/engines/gob/save/saveconverter.cpp index f24cb6000577..ec8bcbcfea4f 100644 --- a/engines/gob/save/saveconverter.cpp +++ b/engines/gob/save/saveconverter.cpp @@ -301,7 +301,7 @@ bool SaveConverter::createStream(SaveWriter &writer) { } /* Stream functions. If the new save data stream is available, redirect the stream - * operations to that stream. Normal stream error behaviour if not. */ + * operations to that stream. Normal stream error behavior if not. */ bool SaveConverter::err() const { if (!_data || !_stream) diff --git a/engines/lure/debugger.cpp b/engines/lure/debugger.cpp index 9d54bccb499f..68410875f73d 100644 --- a/engines/lure/debugger.cpp +++ b/engines/lure/debugger.cpp @@ -534,7 +534,7 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) { } // Bottle object is used as a handy hotspot holder that doesn't have any - // tick proc behaviour that we need to worry about + // tick proc behavior that we need to worry about Hotspot *hotspot = res.activateHotspot(BOTTLE_HOTSPOT_ID); hotspot->setLayer(0xfe); hotspot->setSize(width, height); diff --git a/engines/mohawk/cstime_ui.cpp b/engines/mohawk/cstime_ui.cpp index ee08384590cd..de7d5bde8042 100644 --- a/engines/mohawk/cstime_ui.cpp +++ b/engines/mohawk/cstime_ui.cpp @@ -643,7 +643,7 @@ void CSTimeInterface::startDragging(uint16 id) { _vm->getView()->dragFeature((NewFeature *)invObj->feature, _grabPoint, 4, dragFlags, NULL); if (_vm->getCase()->getId() == 1 && id == 2) { - // Hardcoded behaviour for the torch in the first case. + // Hardcoded behavior for the torch in the first case. if (_vm->getCase()->getCurrScene()->getId() == 4) { // This is the dark tomb. // FIXME: apply torch hack @@ -810,7 +810,7 @@ void CSTimeInterface::stopDragging() { } if (_vm->getCase()->getId() == 1 && _vm->getCase()->getCurrScene()->getId() == 4) { - // Hardcoded behaviour for torches in the dark tomb, in the first case. + // Hardcoded behavior for torches in the dark tomb, in the first case. if (_draggedItem == 1 && foundInvObjHotspot == 0xffff) { // Trying to drag an unlit torch around? _vm->addEvent(CSTimeEvent(kCSTimeEventCharStartFlapping, 0, 16352)); diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 39e15aa84edb..ee88d8af1567 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -463,7 +463,7 @@ static int findSavegame(Common::Array &saves, int16 savegameId) { // The scripts get IDs ranging from 100->199, because the scripts require us to assign unique ids THAT EVEN STAY BETWEEN // SAVES and the scripts also use "saves-count + 1" to create a new savedgame slot. // SCI1.1 actually recycles ids, in that case we will currently get "0". -// This behaviour is required especially for LSL6. In this game, it's possible to quick save. The scripts will use +// This behavior is required especially for LSL6. In this game, it's possible to quick save. The scripts will use // the last-used id for that feature. If we don't assign sticky ids, the feature will overwrite different saves all the // time. And sadly we can't just use the actual filename ids directly, because of the creation method for new slots. diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index b48de1c7ea7a..d83254b2c448 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -46,7 +46,7 @@ reg_t kLoad(EngineState *s, int argc, reg_t *argv) { } // Unloads an arbitrary resource of type 'restype' with resource numbber 'resnr' -// behaviour of this call didn't change between sci0->sci1.1 parameter wise, which means getting called with +// behavior of this call didn't change between sci0->sci1.1 parameter wise, which means getting called with // 1 or 3+ parameters is not right according to sierra sci reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { if (argc >= 2) { @@ -192,7 +192,7 @@ reg_t kDisposeClone(EngineState *s, int argc, reg_t *argv) { } // SCI uses this technique to find out, if it's a clone and if it's supposed to get freed - // At least kq4early relies on this behaviour. The scripts clone "Sound", then set bit 1 manually + // At least kq4early relies on this behavior. The scripts clone "Sound", then set bit 1 manually // and call kDisposeClone later. In that case we may not free it, otherwise we will run into issues // later, because kIsObject would then return false and Sound object wouldn't get checked. uint16 infoSelector = object->getInfoSelector().offset; diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index b28e8cd450b6..3692bb2d5505 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -1020,7 +1020,7 @@ void SegManager::uninstantiateScript(int script_nr) { if (!scr || scr->isMarkedAsDeleted()) { // Is it already unloaded? //warning("unloading script 0x%x requested although not loaded", script_nr); - // This is perfectly valid SCI behaviour + // This is perfectly valid SCI behavior return; } diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index dae1ea92664b..f13c13e00cbc 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -44,7 +44,7 @@ struct SelectorCache { Selector underBits; ///< Used by the graphics subroutines to store backupped BG pic data Selector nsTop, nsLeft, nsBottom, nsRight; ///< View boundaries ('now seen') Selector lsTop, lsLeft, lsBottom, lsRight; ///< Used by Animate() subfunctions and scroll list controls - Selector signal; ///< Used by Animate() to control a view's behaviour + Selector signal; ///< Used by Animate() to control a view's behavior Selector illegalBits; ///< Used by CanBeHere Selector brTop, brLeft, brBottom, brRight; ///< Bounding Rectangle // name, key, time diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index f72f9a78ccd0..c36ecd112aac 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -230,7 +230,7 @@ void GfxAnimate::adjustInvalidCels(GfxView *view, AnimateList::iterator it) { // this seems to be completely crazy code // sierra sci checked signed int16 to be above or equal the counts and reseted to 0 in those cases // later during view processing those are compared unsigned again and then set to maximum count - 1 - // Games rely on this behaviour. For example laura bow 1 has a knight standing around in room 37 + // Games rely on this behavior. For example laura bow 1 has a knight standing around in room 37 // which has cel set to 3. This cel does not exist and the actual knight is 0 // In kq5 on the other hand during the intro, when the trunk is opened, cel is set to some real // high number, which is negative when considered signed. This actually requires to get fixed to diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 6ad2cb3cb374..ec49a388146d 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -252,10 +252,10 @@ void GfxCursor::setPosition(Common::Point pos) { // Some games display a new menu, set mouse position somewhere within and // expect it to be in there. This is fine for a real mouse, but on wii using // wii-mote or touch interfaces this won't work. In fact on those platforms - // the menus will close immediately because of that behaviour. + // the menus will close immediately because of that behavior. // We identify those cases and set a reaction-rect. If the mouse it outside // of that rect, we won't report the position back to the scripts. - // As soon as the mouse was inside once, we will revert to normal behaviour + // As soon as the mouse was inside once, we will revert to normal behavior // Currently this code is enabled for all platforms, especially because we can't // differentiate between e.g. Windows used via mouse and Windows used via touchscreen // The workaround won't hurt real-mouse platforms diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 459be7fcf73e..c2f71a0e54f2 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -466,7 +466,7 @@ void GfxText16::Box(const char *text, bool show, const Common::Rect &rect, TextA if (doubleByteMode) { // Kanji is written by pc98 rom to screen directly. Because of - // GetLongest() behaviour (not cutting off the last char, that causes a + // GetLongest() behavior (not cutting off the last char, that causes a // new line), results in the script thinking that the text would need // less space. The coordinate adjustment in fontsjis.cpp handles the // incorrect centering because of that and this code actually shows all diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index 25a26f6cf272..e4057d1f1351 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -2747,7 +2747,7 @@ void Actor::saveLoadWithSerializer(Serializer *ser) { if (ser->isLoading()) { // Not all actor data is saved; so when loading, we first reset - // the actor, to ensure completely reproducible behaviour (else, + // the actor, to ensure completely reproducible behavior (else, // some not saved value in the actor class can cause odd things) initActor(-1); } diff --git a/engines/scumm/help.cpp b/engines/scumm/help.cpp index 59bf79658efb..ae7a1ad3bcb5 100644 --- a/engines/scumm/help.cpp +++ b/engines/scumm/help.cpp @@ -107,7 +107,7 @@ void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platfo ADD_TEXT(_("* Note that using ctrl-f and")); ADD_TEXT(_(" ctrl-g are not recommended")); ADD_TEXT(_(" since they may cause crashes")); - ADD_TEXT(_(" or incorrect game behaviour.")); + ADD_TEXT(_(" or incorrect game behavior.")); break; case 3: if (gameId == GID_LOOM) diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp index 1a4ed91f1cf5..ff85bd0a619d 100644 --- a/engines/scumm/input.cpp +++ b/engines/scumm/input.cpp @@ -303,14 +303,14 @@ void ScummEngine::processInput() { if ((_leftBtnPressed & msClicked) && (_rightBtnPressed & msClicked) && _game.version >= 4) { // Pressing both mouse buttons is treated as if you pressed // the cutscene exit key (ESC) in V4+ games. That mimicks - // the behaviour of the original engine where pressing both + // the behavior of the original engine where pressing both // mouse buttons also skips the current cutscene. _mouseAndKeyboardStat = 0; lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); } else if ((_rightBtnPressed & msClicked) && (_game.version <= 3 && _game.id != GID_LOOM)) { // Pressing right mouse button is treated as if you pressed // the cutscene exit key (ESC) in V0-V3 games. That mimicks - // the behaviour of the original engine where pressing right + // the behavior of the original engine where pressing right // mouse button also skips the current cutscene. _mouseAndKeyboardStat = 0; lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index fb99d6ce7d37..ae4bbc45a627 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -101,7 +101,7 @@ void ScummEngine::setOwnerOf(int obj, int owner) { // In Sam & Max this is necessary, or you won't get your stuff back // from the Lost and Found tent after riding the Cone of Tragedy. But // it probably applies to all V6+ games. See bugs #493153 and #907113. - // FT disassembly is checked, behaviour is correct. [sev] + // FT disassembly is checked, behavior is correct. [sev] int arg = (_game.version >= 6) ? obj : 0; diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index b8f3b4b3b32f..2c8f65496fe1 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -2646,7 +2646,7 @@ void ScummEngine_v5::decodeParseString() { // In SCUMM V1-V3, there were no 'default' values for the text slot - // values. Hence to achieve correct behaviour, we have to keep the + // values. Hence to achieve correct behavior, we have to keep the // 'default' values in sync with the active values. // // Note: This is needed for Indy3 (Grail Diary). It's also needed diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 60bcd97d7c3b..d1804d323e7b 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -44,7 +44,7 @@ #ifdef __DS__ /* This disables the dual layer mode which is used in FM-Towns versions - * of SCUMM games and which emulates the behaviour of the original code. + * of SCUMM games and which emulates the behavior of the original code. * The only purpose is code size reduction for certain backends. * SCUMM 3 (FM-Towns) games will run in normal (DOS VGA) mode, which should * work just fine in most situations. Some glitches might occur. SCUMM 5 games @@ -228,7 +228,7 @@ enum ScummGameId { GID_TENTACLE, GID_ZAK, - GID_HEGAME, // Generic name for all HE games with default behaviour + GID_HEGAME, // Generic name for all HE games with default behavior GID_PUTTDEMO, GID_FBEAR, GID_PUTTMOON, diff --git a/engines/sword2/controls.cpp b/engines/sword2/controls.cpp index d37edf308279..6ce447a4cc7c 100644 --- a/engines/sword2/controls.cpp +++ b/engines/sword2/controls.cpp @@ -618,7 +618,7 @@ class Switch : public Widget { // The sound mute switches have 0 as their "down" state and 1 as // their "up" state, so this function is needed to get consistent - // behaviour. + // behavior. void reverseStates() { _upState = 1; diff --git a/engines/sword2/interpreter.cpp b/engines/sword2/interpreter.cpp index 7f340df1716f..fbfb03cf61e4 100644 --- a/engines/sword2/interpreter.cpp +++ b/engines/sword2/interpreter.cpp @@ -374,7 +374,7 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) { // sets variable 913 to 1 (probably to stop him from // turning around every now and then). The script may // then go on to set the variable to different values - // to trigger various behaviours in him, but if you + // to trigger various behaviors in him, but if you // have run out of these cases the script won't ever // set it back to 0 again. // diff --git a/engines/sword25/util/lua/luaconf.h b/engines/sword25/util/lua/luaconf.h index 29411d5af15c..16cd6ba27f48 100644 --- a/engines/sword25/util/lua/luaconf.h +++ b/engines/sword25/util/lua/luaconf.h @@ -357,7 +357,7 @@ /* @@ LUA_COMPAT_LSTR controls compatibility with old long string nesting @* facility. -** CHANGE it to 2 if you want the old behaviour, or undefine it to turn +** CHANGE it to 2 if you want the old behavior, or undefine it to turn ** off the advisory error when nesting [[...]]. */ #define LUA_COMPAT_LSTR 1 diff --git a/graphics/palette.h b/graphics/palette.h index 7eedb0f78da0..77891c3fdc0e 100644 --- a/graphics/palette.h +++ b/graphics/palette.h @@ -55,7 +55,7 @@ class PaletteManager : Common::NonCopyable { * @param start the first palette entry to be updated * @param num the number of palette entries to be updated * - * @note It is an error if start+num exceeds 256, behaviour is undefined + * @note It is an error if start+num exceeds 256, behavior is undefined * in that case (the backend may ignore it silently or assert). * @note It is an error if this function gets called when the pixel format * in use (the return value of getScreenFormat) has more than one diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp index ef2f89df9c94..f56a9097d566 100644 --- a/gui/gui-manager.cpp +++ b/gui/gui-manager.cpp @@ -297,7 +297,7 @@ void GuiManager::runLoop() { // dialog-related events since they were probably generated while the old dialog // was still visible, and therefore not intended for the new one. // - // This hopefully fixes strange behaviour/crashes with pop-up widgets. (Most easily + // This hopefully fixes strange behavior/crashes with pop-up widgets. (Most easily // triggered in 3x mode or when running ScummVM under Valgrind.) if (activeDialog != getTopDialog() && event.type != Common::EVENT_SCREEN_CHANGED) continue; From 6b367531707a866e5997039d2a139ef16287a256 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:32:45 -0400 Subject: [PATCH 209/369] ALL: favour/favourite -> favor/favorite --- NEWS | 2 +- backends/platform/ds/arm9/dist/readme_ds.txt | 2 +- engines/lure/decode.cpp | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index d3edf6d9216e..6fda0a8f39d3 100644 --- a/NEWS +++ b/NEWS @@ -1123,7 +1123,7 @@ For a more comprehensive changelog of the latest experimental code, see: - Added MMX i386 assembler versions of the HQ2x and HQ3x scalers. - Added 'Extra Path' option allows for a searching an additional datafile location (for reencoded cutscenes and the like). - - Disabled Alt-x and Ctrl-z quit keys in favour of Ctrl-q on unix like + - Disabled Alt-x and Ctrl-z quit keys in favor of Ctrl-q on unix like operating systems, like Linux (exception: Mac OS X still uses Cmd-q). - Separate smaller font for the console, allowing for more visible information, for example in the SCUMM debugger. diff --git a/backends/platform/ds/arm9/dist/readme_ds.txt b/backends/platform/ds/arm9/dist/readme_ds.txt index ee1db719f457..24c85ad556b7 100644 --- a/backends/platform/ds/arm9/dist/readme_ds.txt +++ b/backends/platform/ds/arm9/dist/readme_ds.txt @@ -679,7 +679,7 @@ not supported. Cdex can do the conversion very well and I recommend using it to convert your audio files, although any CD ripping software can be used, so feel -free to use your favourite program. The format you need to use is +free to use your favorite program. The format you need to use is IMA-ADPCM 4-bit Mono. You may use any sample rate. All other formats will be rejected, including uncompressed WAV files. diff --git a/engines/lure/decode.cpp b/engines/lure/decode.cpp index 3e139a10d626..59390e6e910a 100644 --- a/engines/lure/decode.cpp +++ b/engines/lure/decode.cpp @@ -131,7 +131,7 @@ MemoryBlock *PictureDecoder::egaDecode(MemoryBlock *src, uint32 maxOutputSize) { READ_BIT_DX if (!bitFlag) { - // Get the favourite color + // Get the favorite color v = popTable[tableOffset]; } else { @@ -143,7 +143,7 @@ MemoryBlock *PictureDecoder::egaDecode(MemoryBlock *src, uint32 maxOutputSize) { READ_BIT_DX if (bitFlag) { - // We have no favourite. Could this be a repeat? + // We have no favorite. Could this be a repeat? al = dx >> 11; READ_BITS(5); @@ -184,7 +184,7 @@ MemoryBlock *PictureDecoder::egaDecode(MemoryBlock *src, uint32 maxOutputSize) { } } else { - // Fourth favourite + // Fourth favorite v = popTable[tableOffset + 96]; } @@ -193,10 +193,10 @@ MemoryBlock *PictureDecoder::egaDecode(MemoryBlock *src, uint32 maxOutputSize) { READ_BIT_DX if (bitFlag) { - // Third favourite + // Third favorite v = popTable[tableOffset + 64]; } else { - // Second favourite + // Second favorite v = popTable[tableOffset + 32]; } } From ad9c46344cbd1bab1685858ad743f1f12ed15c02 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:33:35 -0400 Subject: [PATCH 210/369] GRAPHICS: flavour -> flavor --- graphics/iff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/iff.h b/graphics/iff.h index 761c57c9328a..4d8814837271 100644 --- a/graphics/iff.h +++ b/graphics/iff.h @@ -111,7 +111,7 @@ void decodePBM(Common::ReadStream &input, Surface &surface, byte *colors); * Decode a given PackBits encoded stream. * * PackBits is an RLE compression algorithm introduced by Apple. It is also - * used to encode ILBM and PBM subtypes of IFF files, and some flavours of + * used to encode ILBM and PBM subtypes of IFF files, and some flavors of * TIFF. * * As there is no compression across row boundaries in the above formats, From e18401a07c7defe7a461d2a78150748ca7833474 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:45:38 -0400 Subject: [PATCH 211/369] ALL: armour -> armor --- engines/sky/sound.cpp | 4 ++-- engines/sword1/sworddefs.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sky/sound.cpp b/engines/sky/sound.cpp index c6bcb2a4c414..e94a2a61d9c7 100644 --- a/engines/sky/sound.cpp +++ b/engines/sky/sound.cpp @@ -313,7 +313,7 @@ static const Sfx fx_hello_helga = { } }; -static const Sfx fx_statue_on_armour = { +static const Sfx fx_statue_on_armor = { 8, 0, { @@ -985,7 +985,7 @@ static const Sfx *musicList[] = { &fx_null, // 365 &fx_break_crystals, // 366 &fx_disintegrate, // 367 - &fx_statue_on_armour, // 368 + &fx_statue_on_armor, // 368 &fx_null, // 369 &fx_null, // 360 &fx_ping, // 371 diff --git a/engines/sword1/sworddefs.h b/engines/sword1/sworddefs.h index 460b4dd2d1e4..15736dcae061 100644 --- a/engines/sword1/sworddefs.h +++ b/engines/sword1/sworddefs.h @@ -499,7 +499,7 @@ enum ScriptVariableNames { CASE_2_LOCKED_FLAG, CASE_3_LOCKED_FLAG, CASE_4_LOCKED_FLAG, - SEEN_ARMOUR_28_FLAG, + SEEN_ARMOR_28_FLAG, CLOSED_WINDOW_28_FLAG, WINDOW_28_FLAG, WINDOW_DRAUGHT_FLAG, @@ -1405,7 +1405,7 @@ enum ScriptVariableNames { SEEN_STATUE_FLAG, SYRIA_DEAD_FLAG, SYRIA_NICHE_FLAG, - ARMOUR_HIDE_FLAG, + ARMOR_HIDE_FLAG, CANDLE59_FLAG, CANDLE_BURNT, CHALICE_FLAG, From 28301e2bd1ff9b6da313cd212b0e2695f201c85e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:48:13 -0400 Subject: [PATCH 212/369] ALL: analyse -> analyze --- engines/sci/engine/segment.h | 2 +- engines/sword2/maketext.cpp | 6 +++--- engines/sword2/maketext.h | 2 +- engines/tsage/graphics.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index f5c5e2289d86..009a2558ce8f 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -131,7 +131,7 @@ struct SegmentObj : public Common::Serializable { /** * Iterates over all references reachable from the specified object. * Used by the garbage collector. - * @param object object (within the current segment) to analyse + * @param object object (within the current segment) to analyze * @return a list of outgoing references within the object * * @note This function may also choose to report numbers (segment 0) as adresses diff --git a/engines/sword2/maketext.cpp b/engines/sword2/maketext.cpp index dc88f6e68e32..804862e13f52 100644 --- a/engines/sword2/maketext.cpp +++ b/engines/sword2/maketext.cpp @@ -112,7 +112,7 @@ byte *FontRenderer::makeTextSprite(byte *sentence, uint16 maxWidth, uint8 pen, u // Get details of sentence breakdown into array of LineInfo structures // and get the number of lines involved - uint16 noOfLines = analyseSentence(sentence, maxWidth, fontRes, (LineInfo *)line); + uint16 noOfLines = analyzeSentence(sentence, maxWidth, fontRes, (LineInfo *)line); // Construct the sprite based on the info gathered - returns floating // mem block @@ -123,7 +123,7 @@ byte *FontRenderer::makeTextSprite(byte *sentence, uint16 maxWidth, uint8 pen, u return textSprite; } -uint16 FontRenderer::analyseSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line) { +uint16 FontRenderer::analyzeSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line) { // joinWidth = how much extra space is needed to append a word to a // line. NB. SPACE requires TWICE the '_charSpacing' to join a word // to line @@ -199,7 +199,7 @@ uint16 FontRenderer::analyseSentence(byte *sentence, uint16 maxWidth, uint32 fon * @param sentence pointer to a null-terminated string * @param fontRes the font resource id * @param pen the text color, or zero to use the source colors - * @param line array of LineInfo structures, created by analyseSentence() + * @param line array of LineInfo structures, created by analyzeSentence() * @param noOfLines the number of lines, i.e. the number of elements in 'line' * @return a handle to a floating memory block containing the text sprite * @note The sentence must contain no leading, trailing or extra spaces. diff --git a/engines/sword2/maketext.h b/engines/sword2/maketext.h index db5833ac55a1..726c23a5f905 100644 --- a/engines/sword2/maketext.h +++ b/engines/sword2/maketext.h @@ -91,7 +91,7 @@ class FontRenderer { // each line - negative for overlap uint8 _borderPen; // output pen color of character borders - uint16 analyseSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line); + uint16 analyzeSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line); byte *buildTextSprite(byte *sentence, uint32 fontRes, uint8 pen, LineInfo *line, uint16 noOfLines); uint16 charWidth(byte ch, uint32 fontRes); uint16 charHeight(uint32 fontRes); diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index a212c5dd77c4..96fd8002b615 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -1209,7 +1209,7 @@ int GfxFont::getStringWidth(const char *s) { /** * Returns the maximum number of characters for words that will fit into a given width * - * @s Message to be analysed + * @s Message to be analyzed * @maxWidth Maximum allowed width */ int GfxFont::getStringFit(const char *&s, int maxWidth) { @@ -1255,7 +1255,7 @@ int GfxFont::getStringFit(const char *&s, int maxWidth) { * Fills out the passed rect with the dimensions of a given string word-wrapped to a * maximum specified width * - * @s Message to be analysed + * @s Message to be analyzed * @bounds Rectangle to put output size into * @maxWidth Maximum allowed line width in pixels */ From 0104d56444d09f9b65df41baa56c93a85d87f509 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:48:51 -0400 Subject: [PATCH 213/369] ALL: recognise -> recognize --- audio/midiparser_xmidi.cpp | 2 +- devtools/create_lure/create_lure_dat.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/audio/midiparser_xmidi.cpp b/audio/midiparser_xmidi.cpp index 84e1aa2ec73a..7c3cf102d1ff 100644 --- a/audio/midiparser_xmidi.cpp +++ b/audio/midiparser_xmidi.cpp @@ -237,7 +237,7 @@ bool MidiParser_XMIDI::loadMusic(byte *data, uint32 size) { pos += 4; _num_tracks = 1; } else if (memcmp(pos, "XDIR", 4)) { - // Not an XMIDI that we recognise + // Not an XMIDI that we recognize warning("Expected 'XDIR' but found '%c%c%c%c'", pos[0], pos[1], pos[2], pos[3]); return false; } else { diff --git a/devtools/create_lure/create_lure_dat.cpp b/devtools/create_lure/create_lure_dat.cpp index c55252410c38..c53a6bf81db1 100644 --- a/devtools/create_lure/create_lure_dat.cpp +++ b/devtools/create_lure/create_lure_dat.cpp @@ -1920,7 +1920,7 @@ bool validate_executable() { dataSegment = 0xAD20; printf("Detected Spanish version\n"); } else { - printf("Lure executable version not recognised. Checksum = %xh\n", sumTotal); + printf("Lure executable version not recognized. Checksum = %xh\n", sumTotal); return false; } From 7ff9f34aef3a89f167f1867fb31147571ba8112a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 10:49:12 -0400 Subject: [PATCH 214/369] QUEEN: tyre -> tire --- engines/queen/musicdata.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/queen/musicdata.cpp b/engines/queen/musicdata.cpp index afcc54d2e636..d3974dcdbf24 100644 --- a/engines/queen/musicdata.cpp +++ b/engines/queen/musicdata.cpp @@ -493,7 +493,7 @@ const SongData Sound::_song[] = { /* 124 - Dino Horn */ { { 127, 0 }, 128, 128, 128, 0, 1 }, - /* 125 - Tyre Screech */ + /* 125 - Tire Screech */ { { 128, 0 }, 128, 128, 128, 0, 1 }, /* 126 - Oil Splat */ @@ -1238,7 +1238,7 @@ const TuneData Sound::_tune[] = { /* 127 - Dino Horn */ { { 0, 0 }, { 67, 0 }, 2, 0 }, - /* 128 - Tyre Screech */ + /* 128 - Tire Screech */ { { 0, 0 }, { 68, 0 }, 2, 0 }, /* 129 - Oil Splat */ @@ -1697,7 +1697,7 @@ const char *Sound::_sfxName[] = { /* 67 - Dino Horn */ "103sssss", - /* 68 - Tyre Screech */ + /* 68 - Tire Screech */ "125sssss", /* 69 - Chicken */ From 9539017ee35ce280758f22e589aa52c3baf9aaf3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 May 2011 11:17:11 -0400 Subject: [PATCH 215/369] ALL: initialise -> initialize --- audio/decoders/flac.cpp | 2 +- audio/mods/tfmx.cpp | 4 +-- audio/softsynth/mt32.cpp | 14 +++++----- audio/softsynth/mt32/partial.cpp | 2 +- audio/softsynth/mt32/synth.cpp | 22 ++++++++-------- audio/softsynth/mt32/synth.h | 2 +- audio/softsynth/mt32/tables.cpp | 20 +++++++------- audio/softsynth/mt32/tables.h | 4 +-- backends/audiocd/audiocd.h | 2 +- backends/midi/alsa.cpp | 2 +- backends/platform/android/gfx.cpp | 2 +- .../org/inodes/gus/scummvm/ScummVM.java | 2 +- backends/platform/dc/dc.h | 2 +- .../platform/ds/arm9/source/fat/gba_nds_fat.c | 2 +- backends/platform/gp2x/gp2x.cpp | 2 +- backends/platform/gph/gph-backend.cpp | 2 +- backends/platform/wii/options.cpp | 6 ++--- common/events.h | 2 +- common/system.h | 2 +- common/unzip.cpp | 10 +++---- devtools/create_hugo/create_hugo.h | 14 +++++----- devtools/create_hugo/enums.h | 2 +- devtools/create_mads/parser.cpp | 6 ++--- engines/agos/string_pn.cpp | 2 +- engines/cruise/cruise.cpp | 4 +-- engines/cruise/cruise.h | 2 +- engines/draci/script.h | 2 +- engines/hugo/hugo.cpp | 2 +- engines/hugo/object_v1d.cpp | 2 +- engines/hugo/object_v1w.cpp | 2 +- engines/hugo/object_v2d.cpp | 2 +- engines/hugo/schedule.cpp | 26 +++++++++---------- engines/hugo/schedule.h | 16 ++++++------ engines/kyra/sound_adlib.cpp | 2 +- engines/lure/lure.cpp | 12 ++++----- engines/lure/lure.h | 2 +- engines/lure/res.cpp | 2 +- engines/lure/res_struct.cpp | 2 +- engines/lure/sound.h | 2 +- engines/lure/surface.cpp | 8 +++--- engines/lure/surface.h | 4 +-- engines/m4/animation.cpp | 12 ++++----- engines/m4/animation.h | 2 +- engines/m4/compression.cpp | 8 +++--- engines/m4/compression.h | 2 +- engines/m4/gui.h | 2 +- engines/m4/m4.cpp | 2 +- engines/m4/m4.h | 2 +- engines/m4/mads_anim.cpp | 2 +- engines/m4/mads_logic.cpp | 6 ++--- engines/m4/mads_logic.h | 4 +-- engines/m4/mads_menus.cpp | 10 +++---- engines/m4/mads_menus.h | 4 +-- engines/m4/mads_scene.cpp | 12 ++++----- engines/m4/mads_scene.h | 6 ++--- engines/m4/mads_views.h | 2 +- engines/queen/command.h | 2 +- engines/queen/display.h | 4 +-- engines/sci/engine/script.cpp | 18 ++++++------- engines/sci/engine/script.h | 12 ++++----- engines/sci/engine/seg_manager.cpp | 6 ++--- engines/sci/engine/seg_manager.h | 2 +- engines/scumm/boxes.cpp | 2 +- engines/scumm/palette.cpp | 2 +- engines/scumm/player_v4a.h | 2 +- engines/sky/logic.cpp | 4 +-- engines/sword2/console.cpp | 6 ++--- engines/sword2/icons.cpp | 2 +- engines/sword2/interpreter.cpp | 4 +-- engines/sword2/layers.cpp | 26 +++++++++---------- engines/sword2/maketext.cpp | 12 ++++----- engines/sword2/render.cpp | 18 ++++++------- engines/sword2/router.h | 2 +- engines/sword2/screen.cpp | 14 +++++----- engines/sword2/screen.h | 8 +++--- engines/sword2/sword2.cpp | 4 +-- engines/sword2/sword2.h | 4 +-- engines/sword25/gfx/graphicengine.h | 2 +- engines/sword25/gfx/panel.cpp | 4 +-- engines/sword25/input/inputengine.h | 2 +- engines/sword25/kernel/kernel.cpp | 2 +- engines/sword25/kernel/kernel.h | 2 +- engines/sword25/math/polygon.cpp | 2 +- engines/sword25/math/polygon.h | 6 ++--- engines/sword25/math/region.cpp | 2 +- engines/sword25/math/region.h | 4 +-- engines/sword25/math/walkregion.cpp | 6 ++--- engines/sword25/script/luascript.cpp | 2 +- engines/sword25/script/luascript.h | 2 +- engines/sword25/script/script.h | 2 +- engines/sword25/sfx/soundengine.h | 2 +- engines/sword25/sword25.cpp | 4 +-- engines/tinsel/actors.cpp | 2 +- engines/tinsel/background.cpp | 2 +- engines/tinsel/background.h | 2 +- engines/tinsel/bg.cpp | 8 +++--- engines/tinsel/bmv.cpp | 12 ++++----- engines/tinsel/bmv.h | 4 +-- engines/tinsel/cliprect.cpp | 2 +- engines/tinsel/cursor.cpp | 24 ++++++++--------- engines/tinsel/dialogs.cpp | 2 +- engines/tinsel/heapmem.cpp | 4 +-- engines/tinsel/heapmem.h | 4 +-- engines/tinsel/multiobj.cpp | 2 +- engines/tinsel/multiobj.h | 2 +- engines/tinsel/object.cpp | 6 ++--- engines/tinsel/pcode.cpp | 4 +-- engines/tinsel/pcode.h | 2 +- engines/tinsel/polygons.cpp | 22 ++++++++-------- engines/tinsel/savescn.cpp | 4 +-- engines/tinsel/savescn.h | 2 +- engines/tinsel/scene.cpp | 12 ++++----- engines/tinsel/scroll.cpp | 2 +- engines/tinsel/sysvar.cpp | 2 +- engines/tinsel/tinlib.cpp | 4 +-- engines/tinsel/tinsel.cpp | 2 +- engines/tsage/graphics.cpp | 2 +- engines/tsage/scenes.cpp | 2 +- engines/tsage/tsage.cpp | 8 +++--- engines/tsage/tsage.h | 4 +-- gui/widgets/list.cpp | 4 +-- 121 files changed, 324 insertions(+), 324 deletions(-) diff --git a/audio/decoders/flac.cpp b/audio/decoders/flac.cpp index b818d4f7e941..d06a7b9c0e6c 100644 --- a/audio/decoders/flac.cpp +++ b/audio/decoders/flac.cpp @@ -303,7 +303,7 @@ int FLACStream::readBuffer(int16 *buffer, const int numSamples) { const uint numChannels = getChannels(); if (numChannels == 0) { - warning("FLACStream: Stream not successfully initialised, cant playback"); + warning("FLACStream: Stream not successfully initialized, cant playback"); return -1; // streaminfo wasnt read! } diff --git a/audio/mods/tfmx.cpp b/audio/mods/tfmx.cpp index afc7d3b40bbd..a89da78af193 100644 --- a/audio/mods/tfmx.cpp +++ b/audio/mods/tfmx.cpp @@ -332,7 +332,7 @@ void Tfmx::macroRun(ChannelContext &channel) { channel.vibLength = macroPtr[1]; channel.vibCount = macroPtr[1] / 2; channel.vibDelta = macroPtr[3]; - // TODO: Perhaps a bug, vibValue could be left uninitialised + // TODO: Perhaps a bug, vibValue could be left uninitialized if (!channel.portaDelta) { channel.period = channel.refPeriod; channel.vibValue = 0; @@ -700,7 +700,7 @@ void Tfmx::noteCommand(const uint8 note, const uint8 param1, const uint8 param2, channel.relVol = param2 >> 4; channel.fineTune = (int8)param3; - // TODO: the point where the channel gets initialised varies with the games, needs more research. + // TODO: the point where the channel gets initialized varies with the games, needs more research. initMacroProgramm(channel); channel.keyUp = false; // key down = playing a Note diff --git a/audio/softsynth/mt32.cpp b/audio/softsynth/mt32.cpp index a9a612f41028..27a5a629c4d7 100644 --- a/audio/softsynth/mt32.cpp +++ b/audio/softsynth/mt32.cpp @@ -63,7 +63,7 @@ class MidiDriver_MT32 : public MidiDriver_Emulated { void generateSamples(int16 *buf, int len); public: - bool _initialising; + bool _initializing; MidiDriver_MT32(Audio::Mixer *mixer); virtual ~MidiDriver_MT32(); @@ -215,7 +215,7 @@ static MT32Emu::File *MT32_OpenFile(void *userData, const char *filename, MT32Em } static void MT32_PrintDebug(void *userData, const char *fmt, va_list list) { - if (((MidiDriver_MT32 *)userData)->_initialising) { + if (((MidiDriver_MT32 *)userData)->_initializing) { char buf[512]; vsnprintf(buf, 512, fmt, list); @@ -239,7 +239,7 @@ static int MT32_Report(void *userData, MT32Emu::ReportType type, const void *rep error("Failed to load MT32_PCM.ROM"); break; case MT32Emu::ReportType_progressInit: - if (((MidiDriver_MT32 *)userData)->_initialising) { + if (((MidiDriver_MT32 *)userData)->_initializing) { drawProgress(*((const float *)reportData)); return eatSystemEvents(); } @@ -283,7 +283,7 @@ MidiDriver_MT32::MidiDriver_MT32(Audio::Mixer *mixer) : MidiDriver_Emulated(mixe // at rates other than 32KHz, thus we produce data at 32KHz and // rely on Mixer to convert. _outputRate = 32000; //_mixer->getOutputRate(); - _initialising = false; + _initializing = false; } MidiDriver_MT32::~MidiDriver_MT32() { @@ -324,11 +324,11 @@ int MidiDriver_MT32::open() { g_system->getPaletteManager()->setPalette(dummy_palette, 0, 3); } - _initialising = true; - drawMessage(-1, _s("Initialising MT-32 Emulator")); + _initializing = true; + drawMessage(-1, _s("Initializing MT-32 Emulator")); if (!_synth->open(prop)) return MERR_DEVICE_NOT_AVAILABLE; - _initialising = false; + _initializing = false; if (screenFormat.bytesPerPixel > 1) g_system->fillScreen(screenFormat.RGBToColor(0, 0, 0)); diff --git a/audio/softsynth/mt32/partial.cpp b/audio/softsynth/mt32/partial.cpp index d06634dc916e..c4f2e94ebe3f 100644 --- a/audio/softsynth/mt32/partial.cpp +++ b/audio/softsynth/mt32/partial.cpp @@ -164,7 +164,7 @@ void Partial::startPartial(dpoly *usePoly, const PatchCache *useCache, Partial * structurePosition = patchCache->structurePosition; play = true; - initKeyFollow(poly->freqnum); // Initialises noteVal, filtVal and realVal + initKeyFollow(poly->freqnum); // Initializes noteVal, filtVal and realVal #if MT32EMU_ACCURATENOTES == 0 noteLookup = &synth->tables.noteLookups[noteVal - LOWEST_NOTE]; #else diff --git a/audio/softsynth/mt32/synth.cpp b/audio/softsynth/mt32/synth.cpp index 5e74b262aeef..322b864b6eea 100644 --- a/audio/softsynth/mt32/synth.cpp +++ b/audio/softsynth/mt32/synth.cpp @@ -426,36 +426,36 @@ bool Synth::open(SynthProperties &useProp) { } } - printDebug("Initialising Timbre Bank A"); + printDebug("Initializing Timbre Bank A"); if (!initTimbres(controlROMMap->timbreAMap, controlROMMap->timbreAOffset, 0)) { return false; } - printDebug("Initialising Timbre Bank B"); + printDebug("Initializing Timbre Bank B"); if (!initTimbres(controlROMMap->timbreBMap, controlROMMap->timbreBOffset, 64)) { return false; } - printDebug("Initialising Timbre Bank R"); + printDebug("Initializing Timbre Bank R"); if (!initRhythmTimbres(controlROMMap->timbreRMap, controlROMMap->timbreRCount)) { return false; } - printDebug("Initialising Timbre Bank M"); - // CM-64 seems to initialise all bytes in this bank to 0. + printDebug("Initializing Timbre Bank M"); + // CM-64 seems to initialize all bytes in this bank to 0. memset(&mt32ram.timbres[128], 0, sizeof (mt32ram.timbres[128]) * 64); partialManager = new PartialManager(this); pcmWaves = new PCMWaveEntry[controlROMMap->pcmCount]; - printDebug("Initialising PCM List"); + printDebug("Initializing PCM List"); initPCMList(controlROMMap->pcmTable, controlROMMap->pcmCount); - printDebug("Initialising Rhythm Temp"); + printDebug("Initializing Rhythm Temp"); memcpy(mt32ram.rhythmSettings, &controlROMData[controlROMMap->rhythmSettings], controlROMMap->rhythmSettingsCount * 4); - printDebug("Initialising Patches"); + printDebug("Initializing Patches"); for (Bit8u i = 0; i < 128; i++) { PatchParam *patch = &mt32ram.patches[i]; patch->timbreGroup = i / 64; @@ -468,9 +468,9 @@ bool Synth::open(SynthProperties &useProp) { patch->dummy = 0; } - printDebug("Initialising System"); + printDebug("Initializing System"); // The MT-32 manual claims that "Standard pitch" is 442Hz. - mt32ram.system.masterTune = 0x40; // Confirmed on CM-64 as 0x4A, but SCUMM games use 0x40 and we don't want to initialise twice + mt32ram.system.masterTune = 0x40; // Confirmed on CM-64 as 0x4A, but SCUMM games use 0x40 and we don't want to initialize twice mt32ram.system.reverbMode = 0; // Confirmed mt32ram.system.reverbTime = 5; // Confirmed mt32ram.system.reverbLevel = 3; // Confirmed @@ -792,7 +792,7 @@ void Synth::writeSysex(unsigned char device, const Bit8u *sysex, Bit32u len) { for (;;) { // Find the appropriate memory region int regionNum; - const MemoryRegion *region = NULL; // Initialised to please compiler + const MemoryRegion *region = NULL; // Initialized to please compiler for (regionNum = 0; regionNum < NUM_REGIONS; regionNum++) { region = &memoryRegions[regionNum]; if (region->contains(addr)) { diff --git a/audio/softsynth/mt32/synth.h b/audio/softsynth/mt32/synth.h index edda44628796..0ef2c9d135d7 100644 --- a/audio/softsynth/mt32/synth.h +++ b/audio/softsynth/mt32/synth.h @@ -263,7 +263,7 @@ friend class Tables; Synth(); ~Synth(); - // Used to initialise the MT-32. Must be called before any other function. + // Used to initialize the MT-32. Must be called before any other function. // Returns true if initialization was sucessful, otherwise returns false. bool open(SynthProperties &useProp); diff --git a/audio/softsynth/mt32/tables.cpp b/audio/softsynth/mt32/tables.cpp index 25ee0436dbb8..9fdb595467c1 100644 --- a/audio/softsynth/mt32/tables.cpp +++ b/audio/softsynth/mt32/tables.cpp @@ -203,7 +203,7 @@ void Tables::initEnvelopes(float samplerate) { void Tables::initMT32ConstantTables(Synth *synth) { int lf; - synth->printDebug("Initialising Pitch Tables"); + synth->printDebug("Initializing Pitch Tables"); for (lf = -108; lf <= 108; lf++) { tvfKeyfollowMult[lf + 108] = (int)(256 * powf(2.0f, (float)(lf / 24.0f))); //synth->printDebug("KT %d = %d", f, keytable[f+108]); @@ -668,7 +668,7 @@ bool Tables::initNotes(Synth *synth, PCMWaveEntry *pcmWaves, float rate, float m bool abort = false; synth->report(ReportType_progressInit, &progress); for (int f = LOWEST_NOTE; f <= HIGHEST_NOTE; f++) { - synth->printDebug("Initialising note %s%d", NoteNames[f % 12], (f / 12) - 2); + synth->printDebug("Initializing note %s%d", NoteNames[f % 12], (f / 12) - 2); NoteLookup *noteLookup = ¬eLookups[f - LOWEST_NOTE]; file = initNote(synth, noteLookup, (float)f, rate, masterTune, pcmWaves, file); progress = (f - LOWEST_NOTE + 1) / (float)NUM_NOTES; @@ -723,12 +723,12 @@ void Tables::freeNotes() { } } } - initialisedMasterTune = 0.0f; + initializedMasterTune = 0.0f; } Tables::Tables() { - initialisedSampleRate = 0.0f; - initialisedMasterTune = 0.0f; + initializedSampleRate = 0.0f; + initializedMasterTune = 0.0f; memset(¬eLookups, 0, sizeof(noteLookups)); } @@ -737,23 +737,23 @@ bool Tables::init(Synth *synth, PCMWaveEntry *pcmWaves, float sampleRate, float synth->printDebug("Bad sampleRate (%f <= 0.0f)", (double)sampleRate); return false; } - if (initialisedSampleRate == 0.0f) { + if (initializedSampleRate == 0.0f) { initMT32ConstantTables(synth); } - if (initialisedSampleRate != sampleRate) { + if (initializedSampleRate != sampleRate) { initFiltCoeff(sampleRate); initEnvelopes(sampleRate); for (int key = 12; key <= 108; key++) { initDep(&keyLookups[key - 12], (float)key); } } - if (initialisedSampleRate != sampleRate || initialisedMasterTune != masterTune) { + if (initializedSampleRate != sampleRate || initializedMasterTune != masterTune) { freeNotes(); if (!initNotes(synth, pcmWaves, sampleRate, masterTune)) { return false; } - initialisedSampleRate = sampleRate; - initialisedMasterTune = masterTune; + initializedSampleRate = sampleRate; + initializedMasterTune = masterTune; } return true; } diff --git a/audio/softsynth/mt32/tables.h b/audio/softsynth/mt32/tables.h index d9af5114b24d..9950323e7be4 100644 --- a/audio/softsynth/mt32/tables.h +++ b/audio/softsynth/mt32/tables.h @@ -69,8 +69,8 @@ struct KeyLookup { }; class Tables { - float initialisedSampleRate; - float initialisedMasterTune; + float initializedSampleRate; + float initializedMasterTune; void initMT32ConstantTables(Synth *synth); static Bit16s clampWF(Synth *synth, const char *n, float ampVal, double input); static File *initWave(Synth *synth, NoteLookup *noteLookup, float ampsize, float div2, File *file); diff --git a/backends/audiocd/audiocd.h b/backends/audiocd/audiocd.h index a4aeb41e741f..92b7598cb5df 100644 --- a/backends/audiocd/audiocd.h +++ b/backends/audiocd/audiocd.h @@ -108,7 +108,7 @@ class AudioCDManager : Common::NonCopyable { //@{ /** - * Initialise the specified CD drive for audio playback. + * Initialize the specified CD drive for audio playback. * @param drive the drive id * @return true if the CD drive was inited succesfully */ diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 9f1e48dc2b10..c006b6b6bf41 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -164,7 +164,7 @@ int MidiDriver_ALSA::open() { } printf("Connected to Alsa sequencer client [%d:%d]\n", seq_client, seq_port); - printf("ALSA client initialised [%d:0]\n", my_client); + printf("ALSA client initialized [%d:0]\n", my_client); return 0; } diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp index 62226eb8b187..89e918a34e9b 100644 --- a/backends/platform/android/gfx.cpp +++ b/backends/platform/android/gfx.cpp @@ -179,7 +179,7 @@ void OSystem_Android::initSurface() { JNI::initSurface(); - // Initialise OpenGLES context. + // Initialize OpenGLES context. GLESTexture::initGLExtensions(); if (_game_texture) diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java index c4de6d62f8ce..ef9f4cc1e0e1 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -260,7 +260,7 @@ final private void initAudio() throws Exception { if (_audio_track.getState() != AudioTrack.STATE_INITIALIZED) throw new Exception( - String.format("Error initialising AudioTrack: %d", + String.format("Error initializing AudioTrack: %d", _audio_track.getState())); } diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h index 81f93a077e03..e31b817d7c02 100644 --- a/backends/platform/dc/dc.h +++ b/backends/platform/dc/dc.h @@ -53,7 +53,7 @@ class DCHardware { }; class DCCDManager : public DefaultAudioCDManager { - // Initialise the specified CD drive for audio playback. + // Initialize the specified CD drive for audio playback. bool openCD(int drive); // Poll cdrom status diff --git a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c index 698590418c3b..76508a166470 100644 --- a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c +++ b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c @@ -1010,7 +1010,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin) dir.name[0] = FILE_FREE; // default to no file found dir.attrib = 0x00; - // Check if fat has been initialised + // Check if fat has been initialized if (filesysBytePerSec == 0) { return (dir); diff --git a/backends/platform/gp2x/gp2x.cpp b/backends/platform/gp2x/gp2x.cpp index 4cdb4cd0d5dd..0e28a6b7381e 100644 --- a/backends/platform/gp2x/gp2x.cpp +++ b/backends/platform/gp2x/gp2x.cpp @@ -125,7 +125,7 @@ void OSystem_GP2X::initBackend() { ConfMan.setBool("FM_low_quality", true); - /* Initialise any GP2X specific stuff we may want (Batt Status, scaler etc.) */ + /* Initialize any GP2X specific stuff we may want (Batt Status, scaler etc.) */ GP2X_HW::deviceInit(); /* Set Default hardware mixer volume to a preset level (VOLUME_INITIAL). This is done to 'reset' volume level if set by other apps. */ diff --git a/backends/platform/gph/gph-backend.cpp b/backends/platform/gph/gph-backend.cpp index 375ee373786b..cb52da441da4 100644 --- a/backends/platform/gph/gph-backend.cpp +++ b/backends/platform/gph/gph-backend.cpp @@ -141,7 +141,7 @@ void OSystem_GPH::initBackend() { printf("%s\n", "Debug: STDOUT and STDERR redirected to text files."); #endif /* DUMP_STDOUT */ - /* Initialise any GP2X Wiz specific stuff we may want (Batt Status, scaler etc.) */ + /* Initialize any GP2X Wiz specific stuff we may want (Batt Status, scaler etc.) */ WIZ_HW::deviceInit(); /* Set Default hardware mixer volume to a preset level (VOLUME_INITIAL). This is done to 'reset' volume level if set by other apps. */ diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp index ffabc5ae9713..8c12ad9b81f6 100644 --- a/backends/platform/wii/options.cpp +++ b/backends/platform/wii/options.cpp @@ -175,15 +175,15 @@ void WiiOptionsDialog::handleTickle() { break; case -EBUSY: - label = _("Initialising network"); + label = _("Initializing network"); break; case -ETIMEDOUT: - label = _("Timeout while initialising network"); + label = _("Timeout while initializing network"); break; default: - label = String::format(_("Network not initialised (%d)"), status); + label = String::format(_("Network not initialized (%d)"), status); break; } diff --git a/common/events.h b/common/events.h index 11eb0c316ee1..371080c1b279 100644 --- a/common/events.h +++ b/common/events.h @@ -306,7 +306,7 @@ class EventManager : NonCopyable { /** - * Initialise the event manager. + * Initialize the event manager. * @note called after graphics system has been set up */ virtual void init() {} diff --git a/common/system.h b/common/system.h index e02779fe4724..b584739b773e 100644 --- a/common/system.h +++ b/common/system.h @@ -1031,7 +1031,7 @@ class OSystem : Common::NonCopyable { }; -/** The global OSystem instance. Initialised in main(). */ +/** The global OSystem instance. Initialized in main(). */ extern OSystem *g_system; #endif diff --git a/common/unzip.cpp b/common/unzip.cpp index f0590dcbfd49..91f352f40a9e 100644 --- a/common/unzip.cpp +++ b/common/unzip.cpp @@ -349,7 +349,7 @@ typedef struct { z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ + uLong stream_initialized; /* flag set if stream structure is initialized*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ @@ -1073,7 +1073,7 @@ int unzOpenCurrentFile (unzFile file) { return UNZ_INTERNALERROR; } - pfile_in_zip_read_info->stream_initialised=0; + pfile_in_zip_read_info->stream_initialized=0; if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) @@ -1096,7 +1096,7 @@ int unzOpenCurrentFile (unzFile file) { err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised = 1; + pfile_in_zip_read_info->stream_initialized = 1; /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and @@ -1365,7 +1365,7 @@ int unzCloseCurrentFile(unzFile file) { if (pfile_in_zip_read_info->crc32_data != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } - if (pfile_in_zip_read_info->stream_initialised) + if (pfile_in_zip_read_info->stream_initialized) inflateEnd(&pfile_in_zip_read_info->stream); #endif @@ -1373,7 +1373,7 @@ int unzCloseCurrentFile(unzFile file) { free(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; - pfile_in_zip_read_info->stream_initialised = 0; + pfile_in_zip_read_info->stream_initialized = 0; free(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; diff --git a/devtools/create_hugo/create_hugo.h b/devtools/create_hugo/create_hugo.h index 16d15fe317b1..e176dbb19589 100644 --- a/devtools/create_hugo/create_hugo.h +++ b/devtools/create_hugo/create_hugo.h @@ -144,7 +144,7 @@ struct act1 { // Type 1 - Start an object cycle_t cycle; // Direction to start cycling }; -struct act2 { // Type 2 - Initialise an object coords +struct act2 { // Type 2 - Initialize an object coords byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number @@ -168,21 +168,21 @@ struct act4 { // Type 4 - Set new backgrou long newBkgColor; // New color }; -struct act5 { // Type 5 - Initialise an object velocity +struct act5 { // Type 5 - Initialize an object velocity byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number int vx, vy; // velocity }; -struct act6 { // Type 6 - Initialise an object carrying +struct act6 { // Type 6 - Initialize an object carrying byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number bool carriedFl; // carrying }; -struct act7 { // Type 7 - Initialise an object to hero's coords +struct act7 { // Type 7 - Initialize an object to hero's coords byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number @@ -194,14 +194,14 @@ struct act8 { // Type 8 - switch to new sc int screenIndex; // The new screen number }; -struct act9 { // Type 9 - Initialise an object state +struct act9 { // Type 9 - Initialize an object state byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number byte newState; // New state }; -struct act10 { // Type 10 - Initialise an object path type +struct act10 { // Type 10 - Initialize an object path type byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number @@ -290,7 +290,7 @@ struct act21 { // Type 21 - Gameover. Disa int timer; // Time to set off the action }; -struct act22 { // Type 22 - Initialise an object to hero's coords +struct act22 { // Type 22 - Initialize an object to hero's coords byte actType; // The type of action int timer; // Time to set off the action int objNumb; // The object number diff --git a/devtools/create_hugo/enums.h b/devtools/create_hugo/enums.h index 90cb1d54f33e..f721c3d4f583 100644 --- a/devtools/create_hugo/enums.h +++ b/devtools/create_hugo/enums.h @@ -1376,7 +1376,7 @@ enum action_t { // Parameters: INIT_MAZE = 30, // 30 - Start special maze hotspot processing EXIT_MAZE = 31, // 31 - Exit special maze processing INIT_PRIORITY = 32, // 32 - Initialize fbg field - INIT_SCREEN = 33, // 33 - Initialise screen field of object + INIT_SCREEN = 33, // 33 - Initialize screen field of object AGSCHEDULE = 34, // 34 - Global schedule - lasts over new screen REMAPPAL = 35, // 35 - Remappe palette - palette index, color COND_NOUN = 36, // 36 - Conditional on noun appearing in line diff --git a/devtools/create_mads/parser.cpp b/devtools/create_mads/parser.cpp index 2daaff0d33da..0c6df430468e 100644 --- a/devtools/create_mads/parser.cpp +++ b/devtools/create_mads/parser.cpp @@ -237,10 +237,10 @@ void close_source_file() { } /** - * Initialises the scanner + * Initializes the scanner */ void init_scanner(const char *name) { - // Initialise character table + // Initialize character table for (int i = 0; i < 256; ++i) char_table[i] = SPECIAL; for (int i = '0'; i <= '9'; ++i) char_table[i] = DIGIT; for (int i = 'A'; i <= 'Z'; ++i) char_table[i] = LETTER; @@ -265,7 +265,7 @@ void quit_scanner() { /** - * Initialises the output + * Initializes the output */ void init_output(const char *destFilename) { dest_file = fopen(destFilename, "wb"); diff --git a/engines/agos/string_pn.cpp b/engines/agos/string_pn.cpp index 9656eb469e5f..570fbc6200fa 100644 --- a/engines/agos/string_pn.cpp +++ b/engines/agos/string_pn.cpp @@ -131,7 +131,7 @@ void AGOSEngine_PN::pcf(uint8 ch) { if (ch == 255) { _bp = 0; _xofs = 0; - return; /* pcf(255) initialises the routine */ + return; /* pcf(255) initializes the routine */ } /* pcf(254) flushes its working _buffer */ if (ch != 254) { if ((ch != 32) || (_bp + _xofs != 50)) diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp index 1e0b7b1d7a4b..b57e0ab1885e 100644 --- a/engines/cruise/cruise.cpp +++ b/engines/cruise/cruise.cpp @@ -92,7 +92,7 @@ Common::Error CruiseEngine::run() { mainLoop(); - deinitialise(); + deinitialize(); return Common::kNoError; } @@ -118,7 +118,7 @@ void CruiseEngine::initialize() { _vm->_polyStruct = NULL; } -void CruiseEngine::deinitialise() { +void CruiseEngine::deinitialize() { _vm->_polyStructNorm.clear(); _vm->_polyStructExp.clear(); diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h index a9eb39c3f2d0..44e3f26d9d24 100644 --- a/engines/cruise/cruise.h +++ b/engines/cruise/cruise.h @@ -69,7 +69,7 @@ class CruiseEngine: public Engine { bool _speedFlag; void initialize(); - void deinitialise(); + void deinitialize(); bool loadLanguageStrings(); bool makeLoad(char *saveName); void mainLoop(); diff --git a/engines/draci/script.h b/engines/draci/script.h index d788dfb66fb7..72d6f6c34421 100644 --- a/engines/draci/script.h +++ b/engines/draci/script.h @@ -106,7 +106,7 @@ class Script { int _jump; bool _endProgram; - /** List of all GPL commands. Initialised in the constructor. */ + /** List of all GPL commands. Initialized in the constructor. */ const GPL2Command *_commandList; const GPL2Operator *_operatorList; const GPL2Function *_functionList; diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 7d35aec9728c..6a0eaac33130 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -593,7 +593,7 @@ void HugoEngine::initialize() { _scheduler->initEventQueue(); // Init scheduler stuff _screen->initDisplay(); // Create Dibs and palette _file->openDatabaseFiles(); // Open database files - calcMaxScore(); // Initialise maxscore + calcMaxScore(); // Initialize maxscore _rnd = new Common::RandomSource("hugo"); _rnd->setSeed(42); // Kick random number generator diff --git a/engines/hugo/object_v1d.cpp b/engines/hugo/object_v1d.cpp index 297a856203b5..ecdbb3b4c68b 100644 --- a/engines/hugo/object_v1d.cpp +++ b/engines/hugo/object_v1d.cpp @@ -58,7 +58,7 @@ ObjectHandler_v1d::~ObjectHandler_v1d() { void ObjectHandler_v1d::updateImages() { debugC(5, kDebugObject, "updateImages"); - // Initialise the index array to visible objects in current screen + // Initialize the index array to visible objects in current screen int num_objs = 0; byte objindex[kMaxObjNumb]; // Array of indeces to objects diff --git a/engines/hugo/object_v1w.cpp b/engines/hugo/object_v1w.cpp index 098acdf3677e..11c09176e5ac 100644 --- a/engines/hugo/object_v1w.cpp +++ b/engines/hugo/object_v1w.cpp @@ -58,7 +58,7 @@ ObjectHandler_v1w::~ObjectHandler_v1w() { void ObjectHandler_v1w::updateImages() { debugC(5, kDebugObject, "updateImages"); - // Initialise the index array to visible objects in current screen + // Initialize the index array to visible objects in current screen int num_objs = 0; byte objindex[kMaxObjNumb]; // Array of indeces to objects diff --git a/engines/hugo/object_v2d.cpp b/engines/hugo/object_v2d.cpp index 3a98885ebe9d..c9e510497264 100644 --- a/engines/hugo/object_v2d.cpp +++ b/engines/hugo/object_v2d.cpp @@ -58,7 +58,7 @@ ObjectHandler_v2d::~ObjectHandler_v2d() { void ObjectHandler_v2d::updateImages() { debugC(5, kDebugObject, "updateImages"); - // Initialise the index array to visible objects in current screen + // Initialize the index array to visible objects in current screen int num_objs = 0; byte objindex[kMaxObjNumb]; // Array of indeces to objects diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp index 7e66f34af251..a099bec21c1e 100644 --- a/engines/hugo/schedule.cpp +++ b/engines/hugo/schedule.cpp @@ -61,7 +61,7 @@ void Scheduler::initCypher() { } /** - * Initialise the timer event queue + * Initialize the timer event queue */ void Scheduler::initEventQueue() { debugC(1, kDebugSchedule, "initEventQueue"); @@ -159,7 +159,7 @@ void Scheduler::processBonus(const int bonusIndex) { * 2. Set the new screen (in the hero object and any carried objects) * 3. Read in the screen files for the new screen * 4. Schedule action list for new screen - * 5. Initialise prompt line and status line + * 5. Initialize prompt line and status line */ void Scheduler::newScreen(const int screenIndex) { debugC(1, kDebugSchedule, "newScreen(%d)", screenIndex); @@ -193,7 +193,7 @@ void Scheduler::newScreen(const int screenIndex) { // 4. Schedule action list for this screen _vm->_scheduler->screenActions(screenIndex); - // 5. Initialise prompt line and status line + // 5. Initialize prompt line and status line _vm->_screen->initNewScreenDisplay(); } @@ -201,7 +201,7 @@ void Scheduler::newScreen(const int screenIndex) { * Transition to a new screen as follows: * 1. Set the new screen (in the hero object and any carried objects) * 2. Read in the screen files for the new screen - * 3. Initialise prompt line and status line + * 3. Initialize prompt line and status line */ void Scheduler::restoreScreen(const int screenIndex) { debugC(1, kDebugSchedule, "restoreScreen(%d)", screenIndex); @@ -212,7 +212,7 @@ void Scheduler::restoreScreen(const int screenIndex) { // 2. Read in new screen files _vm->readScreenFiles(screenIndex); - // 3. Initialise prompt line and status line + // 3. Initialize prompt line and status line _vm->_screen->initNewScreenDisplay(); } @@ -1135,7 +1135,7 @@ void Scheduler::restoreEvents(Common::ReadStream *f) { void Scheduler::insertAction(act *action) { debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType); - // First, get and initialise the event structure + // First, get and initialize the event structure event_t *curEvent = getQueue(); curEvent->action = action; switch (action->a0.actType) { // Assign whether local or global @@ -1208,7 +1208,7 @@ event_t *Scheduler::doAction(event_t *curEvent) { _vm->_object->_objects[action->a1.objIndex].cycleNumb = action->a1.cycleNumb; _vm->_object->_objects[action->a1.objIndex].cycling = action->a1.cycle; break; - case INIT_OBJXY: // act2: Initialise an object + case INIT_OBJXY: // act2: Initialize an object _vm->_object->_objects[action->a2.objIndex].x = action->a2.x; // Coordinates _vm->_object->_objects[action->a2.objIndex].y = action->a2.y; break; @@ -1218,13 +1218,13 @@ event_t *Scheduler::doAction(event_t *curEvent) { case BKGD_COLOR: // act4: Set new background color _vm->_screen->setBackgroundColor(action->a4.newBackgroundColor); break; - case INIT_OBJVXY: // act5: Initialise an object velocity + case INIT_OBJVXY: // act5: Initialize an object velocity _vm->_object->setVelocity(action->a5.objIndex, action->a5.vx, action->a5.vy); break; - case INIT_CARRY: // act6: Initialise an object + case INIT_CARRY: // act6: Initialize an object _vm->_object->setCarry(action->a6.objIndex, action->a6.carriedFl); // carried status break; - case INIT_HF_COORD: // act7: Initialise an object to hero's "feet" coords + case INIT_HF_COORD: // act7: Initialize an object to hero's "feet" coords _vm->_object->_objects[action->a7.objIndex].x = _vm->_hero->x - 1; _vm->_object->_objects[action->a7.objIndex].y = _vm->_hero->y + _vm->_hero->currImagePtr->y2 - 1; _vm->_object->_objects[action->a7.objIndex].screenIndex = *_vm->_screen_p; // Don't forget screen! @@ -1232,10 +1232,10 @@ event_t *Scheduler::doAction(event_t *curEvent) { case NEW_SCREEN: // act8: Start new screen newScreen(action->a8.screenIndex); break; - case INIT_OBJSTATE: // act9: Initialise an object state + case INIT_OBJSTATE: // act9: Initialize an object state _vm->_object->_objects[action->a9.objIndex].state = action->a9.newState; break; - case INIT_PATH: // act10: Initialise an object path and velocity + case INIT_PATH: // act10: Initialize an object path and velocity _vm->_object->setPath(action->a10.objIndex, (path_t) action->a10.newPathType, action->a10.vxPath, action->a10.vyPath); break; case COND_R: // act11: action lists conditional on object state @@ -1284,7 +1284,7 @@ event_t *Scheduler::doAction(event_t *curEvent) { // any objects are to be made invisible! gameStatus.gameOverFl = true; break; - case INIT_HH_COORD: // act22: Initialise an object to hero's actual coords + case INIT_HH_COORD: // act22: Initialize an object to hero's actual coords _vm->_object->_objects[action->a22.objIndex].x = _vm->_hero->x; _vm->_object->_objects[action->a22.objIndex].y = _vm->_hero->y; _vm->_object->_objects[action->a22.objIndex].screenIndex = *_vm->_screen_p;// Don't forget screen! diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h index 003974f2fa69..e3107809cf24 100644 --- a/engines/hugo/schedule.h +++ b/engines/hugo/schedule.h @@ -73,7 +73,7 @@ enum action_t { // Parameters: INIT_MAZE, // 30 - Start special maze hotspot processing EXIT_MAZE, // 31 - Exit special maze processing INIT_PRIORITY, // 32 - Initialize fbg field - INIT_SCREEN, // 33 - Initialise screen field of object + INIT_SCREEN, // 33 - Initialize screen field of object AGSCHEDULE, // 34 - Global schedule - lasts over new screen REMAPPAL, // 35 - Remappe palette - palette index, color COND_NOUN, // 36 - Conditional on noun appearing in line @@ -106,7 +106,7 @@ struct act1 { // Type 1 - Start an object cycle_t cycle; // Direction to start cycling }; -struct act2 { // Type 2 - Initialise an object coords +struct act2 { // Type 2 - Initialize an object coords action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number @@ -129,21 +129,21 @@ struct act4 { // Type 4 - Set new backgrou long newBackgroundColor; // New color }; -struct act5 { // Type 5 - Initialise an object velocity +struct act5 { // Type 5 - Initialize an object velocity action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number int vx, vy; // velocity }; -struct act6 { // Type 6 - Initialise an object carrying +struct act6 { // Type 6 - Initialize an object carrying action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number bool carriedFl; // carrying }; -struct act7 { // Type 7 - Initialise an object to hero's coords +struct act7 { // Type 7 - Initialize an object to hero's coords action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number @@ -155,14 +155,14 @@ struct act8 { // Type 8 - switch to new sc int screenIndex; // The new screen number }; -struct act9 { // Type 9 - Initialise an object state +struct act9 { // Type 9 - Initialize an object state action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number byte newState; // New state }; -struct act10 { // Type 10 - Initialise an object path type +struct act10 { // Type 10 - Initialize an object path type action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number @@ -251,7 +251,7 @@ struct act21 { // Type 21 - Gameover. Disa int timer; // Time to set off the action }; -struct act22 { // Type 22 - Initialise an object to hero's coords +struct act22 { // Type 22 - Initialize an object to hero's coords action_t actType; // The type of action int timer; // Time to set off the action int objIndex; // The object number diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp index 6ca01c65f362..75041b81617b 100644 --- a/engines/kyra/sound_adlib.cpp +++ b/engines/kyra/sound_adlib.cpp @@ -1558,7 +1558,7 @@ int AdLibDriver::update_changeExtraLevel2(uint8 *&dataptr, Channel &channel, uin return 0; } -// Apart from initialising to zero, these two functions are the only ones that +// Apart from initializing to zero, these two functions are the only ones that // modify _vibratoAndAMDepthBits. int AdLibDriver::update_setAMDepth(uint8 *&dataptr, Channel &channel, uint8 value) { diff --git a/engines/lure/lure.cpp b/engines/lure/lure.cpp index c6be5c48fe01..3217cf039d4e 100644 --- a/engines/lure/lure.cpp +++ b/engines/lure/lure.cpp @@ -51,7 +51,7 @@ LureEngine::LureEngine(OSystem *system, const LureGameDescription *gameDesc) Common::Error LureEngine::init() { int_engine = this; - _initialised = false; + _initialized = false; _saveLoadAllowed = false; initGraphics(FULL_SCREEN_WIDTH, FULL_SCREEN_HEIGHT, false); @@ -85,12 +85,12 @@ Common::Error LureEngine::init() { _mouse = new Mouse(); _events = new Events(); _menu = new Menu(); - Surface::initialise(); + Surface::initialize(); _room = new Room(); _fights = new FightsManager(); _gameToLoad = -1; - _initialised = true; + _initialized = true; // Setup mixer syncSoundSettings(); @@ -102,9 +102,9 @@ LureEngine::~LureEngine() { // Remove all of our debug levels here DebugMan.clearAllDebugChannels(); - if (_initialised) { - // Delete and deinitialise subsystems - Surface::deinitialise(); + if (_initialized) { + // Delete and deinitialize subsystems + Surface::deinitialize(); Sound.destroy(); delete _fights; delete _room; diff --git a/engines/lure/lure.h b/engines/lure/lure.h index 53fdb8c7131d..7a67c8b85544 100644 --- a/engines/lure/lure.h +++ b/engines/lure/lure.h @@ -65,7 +65,7 @@ struct LureGameDescription; class LureEngine : public Engine { private: - bool _initialised; + bool _initialized; int _gameToLoad; uint8 _saveVersion; Disk *_disk; diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp index 31c4efa2aacf..fbf9f33b87f6 100644 --- a/engines/lure/res.cpp +++ b/engines/lure/res.cpp @@ -345,7 +345,7 @@ void Resources::reloadData() { } delete mb; - // Initialise delay list + // Initialize delay list _delayList.clear(true); // Load miscellaneous data diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp index 0d9d75b00bfe..222f55b5dc71 100644 --- a/engines/lure/res_struct.cpp +++ b/engines/lure/res_struct.cpp @@ -415,7 +415,7 @@ HotspotData::HotspotData(HotspotResource *rec) { flags2 = READ_LE_UINT16(&rec->flags2); headerFlags = READ_LE_UINT16(&rec->hdrFlags); - // Initialise runtime fields + // Initialize runtime fields actionCtr = 0; blockedState = BS_NONE; blockedFlag = false; diff --git a/engines/lure/sound.h b/engines/lure/sound.h index 58b4a6896695..9fa9a9126035 100644 --- a/engines/lure/sound.h +++ b/engines/lure/sound.h @@ -153,7 +153,7 @@ class SoundManager : public Common::Singleton { uint sfxVolume() const { return _sfxVolume; } // The following methods implement the external sound player module - void musicInterface_Initialise(); + void musicInterface_Initialize(); void musicInterface_Play(uint8 soundNumber, uint8 channelNumber, uint8 numChannels = 4); void musicInterface_Stop(uint8 soundNumber); bool musicInterface_CheckPlaying(uint8 soundNumber); diff --git a/engines/lure/surface.cpp b/engines/lure/surface.cpp index 106b62b7a4a7..bfada8fde67a 100644 --- a/engines/lure/surface.cpp +++ b/engines/lure/surface.cpp @@ -33,8 +33,8 @@ namespace Lure { -// These variables hold resources commonly used by the Surfaces, and must be initialised and freed -// by the static Surface methods initialise and deinitailse +// These variables hold resources commonly used by the Surfaces, and must be initialized and freed +// by the static Surface methods initialize and deinitailse static MemoryBlock *int_font = NULL; static MemoryBlock *int_dialog_frame = NULL; @@ -45,7 +45,7 @@ static const byte char8A[8] = {0x40, 0x20, 0x00, 0x90, 0x90, 0x90, 0x68, 0x00}; static const byte char8D[8] = {0x80, 0x40, 0x00, 0xc0, 0x40, 0x40, 0x60, 0x00}; // accented `i static const byte char95[8] = {0x40, 0x20, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00}; // accented `o -void Surface::initialise() { +void Surface::initialize() { Disk &disk = Disk::getReference(); int_font = disk.getEntry(FONT_RESOURCE_ID); int_dialog_frame = disk.getEntry(DIALOG_RESOURCE_ID); @@ -80,7 +80,7 @@ void Surface::initialise() { } } -void Surface::deinitialise() { +void Surface::deinitialize() { delete int_font; delete int_dialog_frame; } diff --git a/engines/lure/surface.h b/engines/lure/surface.h index 56af37c049fc..d56e37632b84 100644 --- a/engines/lure/surface.h +++ b/engines/lure/surface.h @@ -49,8 +49,8 @@ class Surface { static void getDialogBounds(Common::Point &size, int charWidth, int numLines, bool squashedLines = true); - static void initialise(); - static void deinitialise(); + static void initialize(); + static void deinitialize(); uint16 width() { return _width; } uint16 height() { return _height; } diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index c89f74bd0acf..39a3f175cd53 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -61,9 +61,9 @@ MadsAnimation::~MadsAnimation() { #define FILENAME_SIZE 13 /** - * Initialises and loads the data of an animation + * Initializes and loads the data of an animation */ -void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) { +void MadsAnimation::initialize(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) { MadsPack anim(filename.c_str(), _vm); bool madsRes = filename[0] == '*'; char buffer[20]; @@ -131,7 +131,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S if (flags & 0x100) loadInterface(surface, depthSurface); - // Initialise the reference list + // Initialize the reference list for (int i = 0; i < spriteListCount; ++i) _spriteListIndexes.push_back(-1); @@ -266,7 +266,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S * Loads an animation file for display */ void MadsAnimation::load(const Common::String &filename, int abortTimers) { - initialise(filename, 0, NULL, NULL); + initialize(filename, 0, NULL, NULL); _messageCtr = 0; _skipLoad = true; @@ -279,7 +279,7 @@ void MadsAnimation::load(const Common::String &filename, int abortTimers) { } */ - // Initialise miscellaneous fields + // Initialize miscellaneous fields _currentFrame = 0; _oldFrameEntry = 0; _nextFrameTimer = _madsVm->_currentTimer; @@ -289,7 +289,7 @@ void MadsAnimation::load(const Common::String &filename, int abortTimers) { if (_madsVm->_scene) _actionNouns = _madsVm->scene()->_action._action; - // Initialise kernel message list + // Initialize kernel message list for (uint i = 0; i < _messages.size(); ++i) _messages[i].kernelMsgIndex = -1; } diff --git a/engines/m4/animation.h b/engines/m4/animation.h index ed6f49786db1..68a288324194 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -111,7 +111,7 @@ class MadsAnimation: public Animation { MadsAnimation(MadsM4Engine *vm, MadsView *view); virtual ~MadsAnimation(); - virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface); + virtual void initialize(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface); virtual void load(const Common::String &filename, int abortTimers); virtual void update(); virtual void setCurrentFrame(int frameNumber); diff --git a/engines/m4/compression.cpp b/engines/m4/compression.cpp index 4ec9fae32f7b..65a25c14e3ee 100644 --- a/engines/m4/compression.cpp +++ b/engines/m4/compression.cpp @@ -44,16 +44,16 @@ bool MadsPack::isCompressed(Common::SeekableReadStream *stream) { } MadsPack::MadsPack(Common::SeekableReadStream *stream) { - initialise(stream); + initialize(stream); } MadsPack::MadsPack(const char *resourceName, MadsM4Engine* vm) { Common::SeekableReadStream *stream = vm->_resourceManager->get(resourceName); - initialise(stream); + initialize(stream); vm->_resourceManager->toss(resourceName); } -void MadsPack::initialise(Common::SeekableReadStream *stream) { +void MadsPack::initialize(Common::SeekableReadStream *stream) { if (!MadsPack::isCompressed(stream)) error("Attempted to decompress a resource that was not MadsPacked"); @@ -121,7 +121,7 @@ void FabDecompressor::decompress(const byte *srcData, int srcSize, byte *destDat copyOfs = 0xFFFF0000; destP = destData; - // Initialise data fields + // Initialize data fields _srcData = srcData; _srcP = _srcData + 6; _srcSize = srcSize; diff --git a/engines/m4/compression.h b/engines/m4/compression.h index a24a41da3cb3..cb0ef74eb748 100644 --- a/engines/m4/compression.h +++ b/engines/m4/compression.h @@ -45,7 +45,7 @@ class MadsPack { int _count; int _dataOffset; - void initialise(Common::SeekableReadStream *stream); + void initialize(Common::SeekableReadStream *stream); public: static bool isCompressed(Common::SeekableReadStream *stream); MadsPack(Common::SeekableReadStream *stream); diff --git a/engines/m4/gui.h b/engines/m4/gui.h index 99b44a3af71a..2b673d624c74 100644 --- a/engines/m4/gui.h +++ b/engines/m4/gui.h @@ -443,7 +443,7 @@ class GameInterfaceView : public View { GameInterfaceView(MadsM4Engine *vm, const Common::Rect &rect): View(vm, rect) {} ~GameInterfaceView() {} - virtual void initialise() {} + virtual void initialize() {} virtual void setSelectedObject(int objectNumber) {} virtual void addObjectToInventory(int objectNumber) {} }; diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index d456accca195..93f5ab4cba27 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -530,7 +530,7 @@ Common::Error MadsEngine::run() { //debugCN(kDebugCore, "%s\n----------\n", _globals->loadMessage(i)); if (getGameType() == GType_RexNebular) { - MadsGameLogic::initialiseGlobals(); + MadsGameLogic::initializeGlobals(); _scene = NULL; loadMenu(MAIN_MENU); diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 4c9b10011743..18c3936db8fb 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -223,7 +223,7 @@ class MadsEngine : public MadsM4Engine { void startScene(int sceneNum) { if (!_scene) { _scene = new MadsScene(this); - ((MadsScene *)_scene)->initialise(); + ((MadsScene *)_scene)->initialize(); } _scene->show(); _scene->loadScene(101); diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index dc2758bedc07..d35b31943aeb 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -603,7 +603,7 @@ static bool tempFlag = true;//****DEBUG - Temporarily allow me to skip several i flags |= 0x100; _activeAnimation = new MadsAnimation(_vm, this); - _activeAnimation->initialise(_currentLine, flags, &_backgroundSurface, &_codeSurface); + _activeAnimation->initialize(_currentLine, flags, &_backgroundSurface, &_codeSurface); if (_startFrame != -1) _activeAnimation->setCurrentFrame(_startFrame); diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index a28d38080b41..a73e943f4fd8 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -31,7 +31,7 @@ namespace M4 { -void MadsGameLogic::initialiseGlobals() { +void MadsGameLogic::initializeGlobals() { // Clear the entire globals list Common::set_to(&_madsVm->globals()->_globals[0], &_madsVm->globals()->_globals[TOTAL_NUM_VARIABLES], 0); @@ -170,7 +170,7 @@ const char *MadsSceneLogic::_opcodeStrings[] = { * convert game specific offsets for various fields in the original game's data segment into a generic data index * that will be common across all the MADS games -void MadsSceneLogic::initialiseDataMap() { +void MadsSceneLogic::initializeDataMap() { // The unique order of these items must be maintained } */ @@ -382,7 +382,7 @@ void MadsSceneLogic::getPlayerSpritesPrefix2() { /** * Loads the MADS.DAT file and loads the script data for the correct game/language */ -void MadsSceneLogic::initialiseScripts() { +void MadsSceneLogic::initializeScripts() { Common::File f; if (!f.open("mads.dat")) { warning("Could not locate mads.dat file"); diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 016adb2ebf9c..3132094252f7 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -92,7 +92,7 @@ class MadsSceneLogic { MadsSceneLogic() { _scriptsData = NULL; } ~MadsSceneLogic() { delete _scriptsData; } - void initialiseScripts(); + void initializeScripts(); void selectScene(int sceneNum); void setupScene(); @@ -109,7 +109,7 @@ class MadsSceneLogic { class MadsGameLogic { public: - static void initialiseGlobals(); + static void initializeGlobals(); }; } diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index a6e2b7725370..fa65329d7620 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -596,18 +596,18 @@ RexDialogView::RexDialogView(): View(_madsVm, Common::Rect(0, 0, _madsVm->_scree MadsView(this) { _screenType = VIEWID_MENU; - // Initialise class variables + // Initialize class variables _priorSceneId = _madsVm->_scene->getCurrentScene(); _dialogType = DIALOG_NONE; // Load necessary quotes _madsVm->globals()->loadQuoteRange(1, 48); - initialiseLines(); - initialiseGraphics(); + initializeLines(); + initializeGraphics(); } -void RexDialogView::initialiseLines() { +void RexDialogView::initializeLines() { // Set up a list of blank entries for use in the various dialogs for (int i = 0; i < DIALOG_LINES_SIZE; ++i) { DialogTextEntry rec; @@ -622,7 +622,7 @@ void RexDialogView::initialiseLines() { _spriteSlots[0].seqIndex = -1; } -void RexDialogView::initialiseGraphics() { +void RexDialogView::initializeGraphics() { // Set needed palette entries _madsVm->_palette->blockRange(0, 16); _madsVm->_palette->setEntry(10, 0, 255, 0); diff --git a/engines/m4/mads_menus.h b/engines/m4/mads_menus.h index 766767dc842e..4d3ea5da39fa 100644 --- a/engines/m4/mads_menus.h +++ b/engines/m4/mads_menus.h @@ -117,8 +117,8 @@ class RexDialogView : public View, public MadsView { private: int _priorSceneId; - void initialiseLines(); - void initialiseGraphics(); + void initializeLines(); + void initializeGraphics(); void loadBackground(); void loadMenuSprites(); protected: diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index b305242bbbc2..1a44c49f0096 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -94,12 +94,12 @@ void MadsScene::loadScene2(const char *aaName, int sceneNumber) { // Load scene walk paths loadSceneCodes(_currentScene); - // Initialise the scene animation + // Initialize the scene animation uint16 flags = 0x4100; if (_madsVm->globals()->_config.textWindowStill) flags |= 0x200; - _sceneAnimation->initialise(aaName, flags, _interfaceSurface, NULL); + _sceneAnimation->initialize(aaName, flags, _interfaceSurface, NULL); } /** @@ -113,7 +113,7 @@ void MadsScene::loadSceneTemporary() { {0x00<<2, 0x10<<2, 0x16<<2}}; _vm->_palette->setPalette(&sysColors[0], 4, 3); - _interfaceSurface->initialise(); + _interfaceSurface->initialize(); loadSceneHotspots(_currentScene); @@ -596,7 +596,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su char buffer1[80]; const char *sceneName; - // TODO: Initialise spriteSet / xp_list + // TODO: Initialize spriteSet / xp_list if (sceneNumber > 0) { sceneName = MADSResourceManager::getResourceName(RESPREFIX_RM, sceneNumber, ".DAT"); @@ -668,7 +668,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su delete stream; - // Initialise a copy of the surfaces if they weren't provided + // Initialize a copy of the surfaces if they weren't provided bool dsFlag = false, ssFlag = false; if (!surface) { surface = new M4Surface(_width, _height); @@ -864,7 +864,7 @@ void MadsInterfaceView::setFontMode(InterfaceFontMode newMode) { } } -void MadsInterfaceView::initialise() { +void MadsInterfaceView::initialize() { // Build up the inventory list _inventoryList.clear(); diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 12d7088a2f59..9835de4daf3c 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -108,8 +108,8 @@ class MadsScene : public Scene, public MadsView { public: MadsScene(MadsEngine *vm); virtual ~MadsScene(); - void initialise() { - _sceneLogic.initialiseScripts(); + void initialize() { + _sceneLogic.initializeScripts(); } // Methods that differ between engines @@ -177,7 +177,7 @@ class MadsInterfaceView : public GameInterfaceView { MadsInterfaceView(MadsM4Engine *vm); ~MadsInterfaceView(); - virtual void initialise(); + virtual void initialize(); virtual void setSelectedObject(int objectNumber); virtual void addObjectToInventory(int objectNumber); int getSelectedObject() { return _selectedObject; } diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 72a70cfbc070..e49c9e6d94a2 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -447,7 +447,7 @@ class Animation { public: Animation(MadsM4Engine *vm); virtual ~Animation(); - virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) = 0; + virtual void initialize(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) = 0; virtual void load(const Common::String &filename, int v0) = 0; virtual void update() = 0; virtual void setCurrentFrame(int frameNumber) = 0; diff --git a/engines/queen/command.h b/engines/queen/command.h index 772d6cb0f112..aa72537a9feb 100644 --- a/engines/queen/command.h +++ b/engines/queen/command.h @@ -97,7 +97,7 @@ class Command { Command(QueenEngine *vm); ~Command(); - //! initialise command construction + //! initialize command construction void clear(bool clearTexts); //! execute last constructed command diff --git a/engines/queen/display.h b/engines/queen/display.h index ffb4479426ef..4256b19d72e7 100644 --- a/engines/queen/display.h +++ b/engines/queen/display.h @@ -44,7 +44,7 @@ class Display { Display(QueenEngine *vm, OSystem *system); ~Display(); - //! initialise dynalum for the specified room + //! initialize dynalum for the specified room void dynalumInit(const char *roomName, uint16 roomNum); //! update dynalum for the current room @@ -138,7 +138,7 @@ class Display { //! show/hide mouse cursor void showMouseCursor(bool show); - //! initialise font, compute justification sizes + //! initialize font, compute justification sizes void initFont(); //! add the specified text to the texts list diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index eae2dd674c9e..a38aa06bc4ed 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -492,7 +492,7 @@ SegmentRef Script::dereference(reg_t pointer) { return ret; } -void Script::initialiseLocals(SegManager *segMan) { +void Script::initializeLocals(SegManager *segMan) { LocalVariables *locals = segMan->allocLocalsSegment(this); if (locals) { if (getSciVersion() > SCI_VERSION_0_EARLY) { @@ -508,7 +508,7 @@ void Script::initialiseLocals(SegManager *segMan) { } } -void Script::initialiseClasses(SegManager *segMan) { +void Script::initializeClasses(SegManager *segMan) { const byte *seeker = 0; uint16 mult = 0; @@ -580,7 +580,7 @@ void Script::initialiseClasses(SegManager *segMan) { } } -void Script::initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId) { +void Script::initializeObjectsSci0(SegManager *segMan, SegmentId segmentId) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); // We need to make two passes, as the objects in the script might be in the @@ -632,7 +632,7 @@ void Script::initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId) { relocateSci0Sci21(make_reg(segmentId, relocationBlock - getBuf() + 4)); } -void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) { +void Script::initializeObjectsSci11(SegManager *segMan, SegmentId segmentId) { const byte *seeker = _heapStart + 4 + READ_SCI11ENDIAN_UINT16(_heapStart + 2) * 2; while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { @@ -667,7 +667,7 @@ void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) { relocateSci0Sci21(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(_heapStart))); } -void Script::initialiseObjectsSci3(SegManager *segMan, SegmentId segmentId) { +void Script::initializeObjectsSci3(SegManager *segMan, SegmentId segmentId) { const byte *seeker = getSci3ObjectsPointer(); while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { @@ -681,13 +681,13 @@ void Script::initialiseObjectsSci3(SegManager *segMan, SegmentId segmentId) { relocateSci3(make_reg(segmentId, 0)); } -void Script::initialiseObjects(SegManager *segMan, SegmentId segmentId) { +void Script::initializeObjects(SegManager *segMan, SegmentId segmentId) { if (getSciVersion() <= SCI_VERSION_1_LATE) - initialiseObjectsSci0(segMan, segmentId); + initializeObjectsSci0(segMan, segmentId); else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1) - initialiseObjectsSci11(segMan, segmentId); + initializeObjectsSci11(segMan, segmentId); else if (getSciVersion() == SCI_VERSION_3) - initialiseObjectsSci3(segMan, segmentId); + initializeObjectsSci3(segMan, segmentId); } reg_t Script::findCanonicAddress(SegManager *segMan, reg_t addr) const { diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 13744b6f939c..ff061e0e36ca 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -137,20 +137,20 @@ class Script : public SegmentObj { * Initializes the script's local variables * @param segMan A reference to the segment manager */ - void initialiseLocals(SegManager *segMan); + void initializeLocals(SegManager *segMan); /** * Adds the script's classes to the segment manager's class table * @param segMan A reference to the segment manager */ - void initialiseClasses(SegManager *segMan); + void initializeClasses(SegManager *segMan); /** * Initializes the script's objects (SCI0) * @param segMan A reference to the segment manager * @param segmentId The script's segment id */ - void initialiseObjects(SegManager *segMan, SegmentId segmentId); + void initializeObjects(SegManager *segMan, SegmentId segmentId); // script lock operations @@ -280,21 +280,21 @@ class Script : public SegmentObj { * @param segMan A reference to the segment manager * @param segmentId The script's segment id */ - void initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId); + void initializeObjectsSci0(SegManager *segMan, SegmentId segmentId); /** * Initializes the script's objects (SCI1.1 - SCI2.1) * @param segMan A reference to the segment manager * @param segmentId The script's segment id */ - void initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId); + void initializeObjectsSci11(SegManager *segMan, SegmentId segmentId); /** * Initializes the script's objects (SCI3) * @param segMan A reference to the segment manager * @param segmentId The script's segment id */ - void initialiseObjectsSci3(SegManager *segMan, SegmentId segmentId); + void initializeObjectsSci3(SegManager *segMan, SegmentId segmentId); }; } // End of namespace Sci diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 3692bb2d5505..ab67da32dbcd 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -1007,9 +1007,9 @@ int SegManager::instantiateScript(int scriptNum) { scr->init(scriptNum, _resMan); scr->load(_resMan); - scr->initialiseLocals(this); - scr->initialiseClasses(this); - scr->initialiseObjects(this, segmentId); + scr->initializeLocals(this); + scr->initializeClasses(this); + scr->initializeObjects(this, segmentId); return segmentId; } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index a579ba10e19e..ab5aeacabfc4 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -71,7 +71,7 @@ class SegManager : public Common::Serializable { */ Script *allocateScript(int script_nr, SegmentId *seg_id); - // The script must then be initialised; see section (1b.), below. + // The script must then be initialized; see section (1b.), below. /** * Forcefully deallocate a previously allocated script. diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp index 1acb7e558655..64d4d7422c72 100644 --- a/engines/scumm/boxes.cpp +++ b/engines/scumm/boxes.cpp @@ -962,7 +962,7 @@ void ScummEngine::calcItineraryMatrix(byte *itineraryMatrix, int num) { // Allocate the adjacent & itinerary matrices adjacentMatrix = (byte *)malloc(boxSize * boxSize); - // Initialise the adjacent matrix: each box has distance 0 to itself, + // Initialize the adjacent matrix: each box has distance 0 to itself, // and distance 1 to its direct neighbors. Initially, it has distance // 255 (= infinity) to all other boxes. for (i = 0; i < num; i++) { diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp index b85771e89798..ba13ff46d9df 100644 --- a/engines/scumm/palette.cpp +++ b/engines/scumm/palette.cpp @@ -214,7 +214,7 @@ void ScummEngine::resetPalette() { } else { if ((_game.platform == Common::kPlatformAmiga) && _game.version == 4) { // if rendermode is set to EGA we use the full palette from the resources - // else we initialise and then lock down the first 16 colors. + // else we initialize and then lock down the first 16 colors. if (_renderMode != Common::kRenderEGA) setPaletteFromTable(tableAmigaMIPalette, sizeof(tableAmigaMIPalette) / 3); #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE diff --git a/engines/scumm/player_v4a.h b/engines/scumm/player_v4a.h index b51ca2f99343..d01c70f29566 100644 --- a/engines/scumm/player_v4a.h +++ b/engines/scumm/player_v4a.h @@ -67,7 +67,7 @@ class Player_V4A : public MusicEngine { // byte type; } _sfxSlots[4]; - int8 _initState; // < 0: failed, 0: uninitialised, > 0: initialised + int8 _initState; // < 0: failed, 0: uninitialized, > 0: initialized int getSfxChan(int id) const { for (int i = 0; i < ARRAYSIZE(_sfxSlots); ++i) diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp index de081bb63119..616670b0fda8 100644 --- a/engines/sky/logic.cpp +++ b/engines/sky/logic.cpp @@ -1890,7 +1890,7 @@ bool Logic::fnCheckRequest(uint32 a, uint32 b, uint32 c) { } bool Logic::fnStartMenu(uint32 firstObject, uint32 b, uint32 c) { - /// initialise the top menu bar + /// initialize the top menu bar // firstObject is o0 for game menu, k0 for linc uint i; @@ -1939,7 +1939,7 @@ bool Logic::fnStartMenu(uint32 firstObject, uint32 b, uint32 c) { else if (menuLength < _scriptVariables[SCROLL_OFFSET] + 11) _scriptVariables[SCROLL_OFFSET] = menuLength - 11; - // (6) AND FINALLY, INITIALISE THE 11 OBJECTS SO THEY APPEAR ON SCREEEN + // (6) AND FINALLY, INITIALIZE THE 11 OBJECTS SO THEY APPEAR ON SCREEEN uint16 rollingX = TOP_LEFT_X + 28; for (i = 0; i < 11; i++) { diff --git a/engines/sword2/console.cpp b/engines/sword2/console.cpp index 8d956703083c..957b2431e050 100644 --- a/engines/sword2/console.cpp +++ b/engines/sword2/console.cpp @@ -779,19 +779,19 @@ bool Debugger::Cmd_Sfx(int argc, const char **argv) { } bool Debugger::Cmd_English(int argc, const char **argv) { - _vm->initialiseFontResourceFlags(DEFAULT_TEXT); + _vm->initializeFontResourceFlags(DEFAULT_TEXT); DebugPrintf("Default fonts selected\n"); return true; } bool Debugger::Cmd_Finnish(int argc, const char **argv) { - _vm->initialiseFontResourceFlags(FINNISH_TEXT); + _vm->initializeFontResourceFlags(FINNISH_TEXT); DebugPrintf("Finnish fonts selected\n"); return true; } bool Debugger::Cmd_Polish(int argc, const char **argv) { - _vm->initialiseFontResourceFlags(POLISH_TEXT); + _vm->initializeFontResourceFlags(POLISH_TEXT); DebugPrintf("Polish fonts selected\n"); return true; } diff --git a/engines/sword2/icons.cpp b/engines/sword2/icons.cpp index f179f3c89949..a555e63449a5 100644 --- a/engines/sword2/icons.cpp +++ b/engines/sword2/icons.cpp @@ -147,7 +147,7 @@ void Mouse::buildMenu() { } } - // Initialise the menu from the master list. + // Initialize the menu from the master list. for (i = 0; i < 15; i++) { uint32 res = _masterMenuList[i].icon_resource; diff --git a/engines/sword2/interpreter.cpp b/engines/sword2/interpreter.cpp index fbfb03cf61e4..e7fb979d69f7 100644 --- a/engines/sword2/interpreter.cpp +++ b/engines/sword2/interpreter.cpp @@ -264,7 +264,7 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) { // int32_TYPE 1 numberOfScripts // int32_TYPE numberOfScripts The offsets for each script - // Initialise some stuff + // Initialize some stuff uint32 ip = 0; // Code pointer int scriptNumber; @@ -614,7 +614,7 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) { // The scripts do not always call the mcode command // with as many parameters as it can accept. To keep - // things predictable, initialise the remaining + // things predictable, initialize the remaining // parameters to 0. for (i = STACK_SIZE - 1; i >= value; i--) { diff --git a/engines/sword2/layers.cpp b/engines/sword2/layers.cpp index ad65336c0f6f..b13006cd7066 100644 --- a/engines/sword2/layers.cpp +++ b/engines/sword2/layers.cpp @@ -22,7 +22,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// high level layer initialising +// high level layer initializing // the system supports: // 1 optional background parallax layer @@ -97,7 +97,7 @@ void Screen::initBackground(int32 res, int32 new_palette) { debug(2, "layers=%d width=%d depth=%d", screen_head.noLayers, screen_head.width, screen_head.height); - // initialise the driver back buffer + // initialize the driver back buffer setLocationMetrics(screen_head.width, screen_head.height); for (i = 0; i < screen_head.noLayers; i++) { @@ -180,22 +180,22 @@ void Screen::initBackground(int32 res, int32 new_palette) { for (i = 0; i < 2; i++) { if (screenLayerTable.bg_parallax[i]) - initialiseBackgroundLayer(_vm->fetchBackgroundParallaxLayer(file, i)); + initializeBackgroundLayer(_vm->fetchBackgroundParallaxLayer(file, i)); else - initialiseBackgroundLayer(NULL); + initializeBackgroundLayer(NULL); } // Normal backround layer - initialiseBackgroundLayer(_vm->fetchBackgroundLayer(file)); + initializeBackgroundLayer(_vm->fetchBackgroundLayer(file)); // Foreground parallax layers for (i = 0; i < 2; i++) { if (screenLayerTable.fg_parallax[i]) - initialiseBackgroundLayer(_vm->fetchForegroundParallaxLayer(file, i)); + initializeBackgroundLayer(_vm->fetchForegroundParallaxLayer(file, i)); else - initialiseBackgroundLayer(NULL); + initializeBackgroundLayer(NULL); } _vm->_resman->closeResource(_thisScreen.background_layer_id); @@ -243,7 +243,7 @@ void Screen::initPsxBackground(int32 res, int32 new_palette) { debug(2, "layers=%d width=%d depth=%d", screen_head.noLayers, screen_head.width, screen_head.height); - // initialise the driver back buffer + // initialize the driver back buffer setLocationMetrics(screen_head.width, screen_head.height); for (i = 0; i < screen_head.noLayers; i++) { @@ -279,15 +279,15 @@ void Screen::initPsxBackground(int32 res, int32 new_palette) { _thisScreen.feet_y = 340; // Background parallax layers - initialisePsxParallaxLayer(_vm->fetchBackgroundParallaxLayer(file, 0)); - initialisePsxParallaxLayer(NULL); + initializePsxParallaxLayer(_vm->fetchBackgroundParallaxLayer(file, 0)); + initializePsxParallaxLayer(NULL); // Normal backround layer - initialisePsxBackgroundLayer(_vm->fetchBackgroundLayer(file)); + initializePsxBackgroundLayer(_vm->fetchBackgroundLayer(file)); // Foreground parallax layers - initialisePsxParallaxLayer(_vm->fetchForegroundParallaxLayer(file, 1)); - initialisePsxParallaxLayer(NULL); + initializePsxParallaxLayer(_vm->fetchForegroundParallaxLayer(file, 1)); + initializePsxParallaxLayer(NULL); _vm->_resman->closeResource(_thisScreen.background_layer_id); diff --git a/engines/sword2/maketext.cpp b/engines/sword2/maketext.cpp index 804862e13f52..e279284d76b9 100644 --- a/engines/sword2/maketext.cpp +++ b/engines/sword2/maketext.cpp @@ -636,7 +636,7 @@ void FontRenderer::killTextBloc(uint32 bloc_number) { #define SAVE_LINE_NO 1 -void Sword2Engine::initialiseFontResourceFlags() { +void Sword2Engine::initializeFontResourceFlags() { byte *textFile = _resman->openResource(TEXT_RES); // If language is Polish or Finnish it requires alternate fonts. @@ -649,11 +649,11 @@ void Sword2Engine::initialiseFontResourceFlags() { char *textLine = (char *)fetchTextLine(textFile, SAVE_LINE_NO) + 2; if (strcmp(textLine, "tallenna") == 0) - initialiseFontResourceFlags(FINNISH_TEXT); + initializeFontResourceFlags(FINNISH_TEXT); else if (strcmp(textLine, "zapisz") == 0) - initialiseFontResourceFlags(POLISH_TEXT); + initializeFontResourceFlags(POLISH_TEXT); else - initialiseFontResourceFlags(DEFAULT_TEXT); + initializeFontResourceFlags(DEFAULT_TEXT); // Get the game name for the windows application @@ -677,10 +677,10 @@ void Sword2Engine::initialiseFontResourceFlags() { } /** - * Called from initialiseFontResourceFlags(), and also from console.cpp + * Called from initializeFontResourceFlags(), and also from console.cpp */ -void Sword2Engine::initialiseFontResourceFlags(uint8 language) { +void Sword2Engine::initializeFontResourceFlags(uint8 language) { switch (language) { case FINNISH_TEXT: _speechFontId = FINNISH_SPEECH_FONT_ID; diff --git a/engines/sword2/render.cpp b/engines/sword2/render.cpp index e3bce7d27f40..1e068d606163 100644 --- a/engines/sword2/render.cpp +++ b/engines/sword2/render.cpp @@ -342,10 +342,10 @@ void Screen::renderParallax(byte *ptr, int16 l) { #define LIMIT_FRAME_RATE /** - * Initialises the timers before the render loop is entered. + * Initializes the timers before the render loop is entered. */ -void Screen::initialiseRenderCycle() { +void Screen::initializeRenderCycle() { _initialTime = _vm->_system->getMillis(); _totalTime = _initialTime + (1000 / _vm->getFramesPerSecond()); } @@ -399,7 +399,7 @@ bool Screen::endRenderCycle() { renderCountIndex = 0; if (_renderTooSlow) { - initialiseRenderCycle(); + initializeRenderCycle(); return true; } @@ -461,13 +461,13 @@ void Screen::resetRenderEngine() { * or a NULL pointer in order of background parallax to foreground parallax. */ -int32 Screen::initialiseBackgroundLayer(byte *parallax) { +int32 Screen::initializeBackgroundLayer(byte *parallax) { Parallax p; uint16 i, j, k; byte *data; byte *dst; - debug(2, "initialiseBackgroundLayer"); + debug(2, "initializeBackgroundLayer"); assert(_layer < MAXLAYERS); @@ -588,14 +588,14 @@ int32 Screen::initialiseBackgroundLayer(byte *parallax) { * ratio correction), while PC backgrounds are in tiles of 64x64. */ -int32 Screen::initialisePsxBackgroundLayer(byte *parallax) { +int32 Screen::initializePsxBackgroundLayer(byte *parallax) { uint16 bgXres, bgYres; uint16 trueXres, stripeNumber, totStripes; uint32 baseAddress, stripePos; uint16 i, j; byte *dst; - debug(2, "initialisePsxBackgroundLayer"); + debug(2, "initializePsxBackgroundLayer"); assert(_layer < MAXLAYERS); @@ -698,14 +698,14 @@ int32 Screen::initialisePsxBackgroundLayer(byte *parallax) { * can be understood by renderParallax functions. */ -int32 Screen::initialisePsxParallaxLayer(byte *parallax) { +int32 Screen::initializePsxParallaxLayer(byte *parallax) { uint16 plxXres, plxYres; uint16 xTiles, yTiles; uint16 i, j, k; byte *data; byte *dst; - debug(2, "initialisePsxParallaxLayer"); + debug(2, "initializePsxParallaxLayer"); assert(_layer < MAXLAYERS); diff --git a/engines/sword2/router.h b/engines/sword2/router.h index ec711bcc40ad..7196ea8df453 100644 --- a/engines/sword2/router.h +++ b/engines/sword2/router.h @@ -26,7 +26,7 @@ #define SWORD2_ROUTER_H // This used to be a variable, but it was never set. Actually, it wasn't even -// initialised! +// initialized! // // Define this to force the use of slidy router (so solid path not used when // ending walk in ANY direction) diff --git a/engines/sword2/screen.cpp b/engines/sword2/screen.cpp index cae719c1d434..0cb951fdfc9c 100644 --- a/engines/sword2/screen.cpp +++ b/engines/sword2/screen.cpp @@ -61,11 +61,11 @@ Screen::Screen(Sword2Engine *vm, int16 width, int16 height) { _dirtyGrid = (byte *)calloc(_gridWide, _gridDeep); if (!_dirtyGrid) - error("Could not initialise dirty grid"); + error("Could not initialize dirty grid"); _buffer = (byte *)malloc(width * height); if (!_buffer) - error("Could not initialise display"); + error("Could not initialize display"); for (int i = 0; i < ARRAYSIZE(_blockSurfaces); i++) _blockSurfaces[i] = NULL; @@ -1225,11 +1225,11 @@ void Screen::rollCredits() { void Screen::splashScreen() { byte *bgfile = _vm->_resman->openResource(2950); - initialiseBackgroundLayer(NULL); - initialiseBackgroundLayer(NULL); - initialiseBackgroundLayer(_vm->fetchBackgroundLayer(bgfile)); - initialiseBackgroundLayer(NULL); - initialiseBackgroundLayer(NULL); + initializeBackgroundLayer(NULL); + initializeBackgroundLayer(NULL); + initializeBackgroundLayer(_vm->fetchBackgroundLayer(bgfile)); + initializeBackgroundLayer(NULL); + initializeBackgroundLayer(NULL); _vm->fetchPalette(bgfile, _palette); setPalette(0, 256, _palette, RDPAL_FADE); diff --git a/engines/sword2/screen.h b/engines/sword2/screen.h index 2d1569229929..11e323d0a714 100644 --- a/engines/sword2/screen.h +++ b/engines/sword2/screen.h @@ -390,12 +390,12 @@ class Screen { void resetRenderLists(); void setLocationMetrics(uint16 w, uint16 h); - int32 initialiseBackgroundLayer(byte *parallax); - int32 initialisePsxParallaxLayer(byte *parallax); // These are used to initialize psx backgrounds and - int32 initialisePsxBackgroundLayer(byte *parallax); // parallaxes, which are different from pc counterparts. + int32 initializeBackgroundLayer(byte *parallax); + int32 initializePsxParallaxLayer(byte *parallax); // These are used to initialize psx backgrounds and + int32 initializePsxBackgroundLayer(byte *parallax); // parallaxes, which are different from pc counterparts. void closeBackgroundLayer(); - void initialiseRenderCycle(); + void initializeRenderCycle(); void initBackground(int32 res, int32 new_palette); void initPsxBackground(int32 res, int32 new_palette); diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index bc34e1523694..62a391923dd7 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -425,7 +425,7 @@ Common::Error Sword2Engine::run() { setInputEventFilter(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP | RD_WHEELUP | RD_WHEELDOWN); setupPersistentResources(); - initialiseFontResourceFlags(); + initializeFontResourceFlags(); if (_features & GF_DEMO) _logic->writeVar(DEMO, 1); @@ -463,7 +463,7 @@ Common::Error Sword2Engine::run() { } else startGame(); - _screen->initialiseRenderCycle(); + _screen->initializeRenderCycle(); while (1) { _debugger->onFrame(); diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h index 27cbd9e49d11..e4c9dcca3c85 100644 --- a/engines/sword2/sword2.h +++ b/engines/sword2/sword2.h @@ -233,8 +233,8 @@ class Sword2Engine : public Engine { void sleepUntil(uint32 time); - void initialiseFontResourceFlags(); - void initialiseFontResourceFlags(uint8 language); + void initializeFontResourceFlags(); + void initializeFontResourceFlags(uint8 language); bool initStartMenu(); void registerStartPoint(int32 key, char *name); diff --git a/engines/sword25/gfx/graphicengine.h b/engines/sword25/gfx/graphicengine.h index 04826c2e5ac8..33097639668b 100644 --- a/engines/sword25/gfx/graphicengine.h +++ b/engines/sword25/gfx/graphicengine.h @@ -106,7 +106,7 @@ class GraphicEngine : public ResourceService, public Persistable { // --------- /** - * Initialises the graphics engine and sets the screen mode. Returns + * Initializes the graphics engine and sets the screen mode. Returns * true if initialisation failed. * @note This method should be called immediately after the * initialisation of all services. diff --git a/engines/sword25/gfx/panel.cpp b/engines/sword25/gfx/panel.cpp index 34ab4876ea1b..6d5b2a623d1a 100644 --- a/engines/sword25/gfx/panel.cpp +++ b/engines/sword25/gfx/panel.cpp @@ -47,12 +47,12 @@ Panel::Panel(RenderObjectPtr parentPtr, int width, int height, uin _height = height; if (_width < 0) { - error("Tried to initialise a panel with an invalid width (%d).", _width); + error("Tried to initialize a panel with an invalid width (%d).", _width); return; } if (_height < 0) { - error("Tried to initialise a panel with an invalid height (%d).", _height); + error("Tried to initialize a panel with an invalid height (%d).", _height); return; } diff --git a/engines/sword25/input/inputengine.h b/engines/sword25/input/inputengine.h index a84c21507690..f79890a9fd0b 100644 --- a/engines/sword25/input/inputengine.h +++ b/engines/sword25/input/inputengine.h @@ -172,7 +172,7 @@ class InputEngine : public Service, public Persistable { /// -------------------------------------------------------------- /** - * Initialises the input engine + * Initializes the input engine * @return Returns a true on success, otherwise false. */ bool init(); diff --git a/engines/sword25/kernel/kernel.cpp b/engines/sword25/kernel/kernel.cpp index f45137ce0212..d6388eee2b41 100644 --- a/engines/sword25/kernel/kernel.cpp +++ b/engines/sword25/kernel/kernel.cpp @@ -63,7 +63,7 @@ Kernel::Kernel() : // Create the resource manager _resourceManager = new ResourceManager(this); - // Initialise the script engine + // Initialize the script engine _script = new LuaScriptEngine(this); if (!_script || !_script->init()) { _initSuccess = false; diff --git a/engines/sword25/kernel/kernel.h b/engines/sword25/kernel/kernel.h index a0c2927fdc4e..adf69f92d6e5 100644 --- a/engines/sword25/kernel/kernel.h +++ b/engines/sword25/kernel/kernel.h @@ -79,7 +79,7 @@ class Kernel { uint getMilliTicks(); /** - * Specifies whether the kernel was successfully initialised + * Specifies whether the kernel was successfully initialized */ bool getInitSuccess() const { return _initSuccess; diff --git a/engines/sword25/math/polygon.cpp b/engines/sword25/math/polygon.cpp index fe2fc84cad6c..2e7836ff77ee 100644 --- a/engines/sword25/math/polygon.cpp +++ b/engines/sword25/math/polygon.cpp @@ -59,7 +59,7 @@ Polygon::~Polygon() { } bool Polygon::init(int vertexCount_, const Vertex *vertices_) { - // Rember the old obstate to restore it if an error occurs whilst initialising it with the new data + // Rember the old obstate to restore it if an error occurs whilst initializing it with the new data int oldvertexCount = this->vertexCount; Vertex *oldvertices = this->vertices; diff --git a/engines/sword25/math/polygon.h b/engines/sword25/math/polygon.h index eac19d790006..ffdbf14f6bf7 100644 --- a/engines/sword25/math/polygon.h +++ b/engines/sword25/math/polygon.h @@ -78,15 +78,15 @@ class Polygon : public Persistable { virtual ~Polygon(); /** - * Initialises the BS_Polygon with a list of Vertecies. + * Initializes the BS_Polygon with a list of Vertecies. * * The Vertices need to define a polygon must not have self-intersections. - * If a polygon already has verticies, this will re-initialise it with the new list. + * If a polygon already has verticies, this will re-initialize it with the new list. * * @param VertexCount The number of vertices being passed * @param Vertecies An array of BS_Vertex objects representing the vertices in the polygon. * @return Returns false if the Vertecies have self-intersections. In this case, - * the object is not initialised. + * the object is not initialized. */ bool init(int vertexCount_, const Vertex *vertices_); diff --git a/engines/sword25/math/region.cpp b/engines/sword25/math/region.cpp index 8790860a55fc..7681ef6d9f38 100644 --- a/engines/sword25/math/region.cpp +++ b/engines/sword25/math/region.cpp @@ -115,7 +115,7 @@ bool Region::init(const Polygon &contour, const Common::Array *pHoles) } - // Initialise bounding box + // Initialize bounding box updateBoundingBox(); _valid = true; diff --git a/engines/sword25/math/region.h b/engines/sword25/math/region.h index f9a3f50b3f92..0fd722363135 100644 --- a/engines/sword25/math/region.h +++ b/engines/sword25/math/region.h @@ -73,12 +73,12 @@ class Region : public Persistable { virtual ~Region(); /** - * Initialises a BS_Region object + * Initializes a BS_Region object * @param Contour A polygon indicating the outline of the region * @param pHoles A pointer to an array of polygons representing the hole state in the region. * If the region has no holes, it must be passed as NULL. The default value is NULL. * @return Returns true if the initialisation was successful, otherwise false. - * @remark If the region was already initialised, the old state will be deleted. + * @remark If the region was already initialized, the old state will be deleted. */ virtual bool init(const Polygon &contour, const Common::Array *pHoles = NULL); diff --git a/engines/sword25/math/walkregion.cpp b/engines/sword25/math/walkregion.cpp index 3eea689877f5..bace4d54bc81 100644 --- a/engines/sword25/math/walkregion.cpp +++ b/engines/sword25/math/walkregion.cpp @@ -101,7 +101,7 @@ static void initDijkstraNodes(DijkstraNode::Container &dijkstraNodes, const Regi // Allocate sufficient space in the array dijkstraNodes.resize(nodes.size()); - // Initialise all the nodes which are visible from the starting node + // Initialize all the nodes which are visible from the starting node DijkstraNode::Iter dijkstraIter = dijkstraNodes.begin(); for (Common::Array::const_iterator nodesIter = nodes.begin(); nodesIter != nodes.end(); nodesIter++, dijkstraIter++) { @@ -173,7 +173,7 @@ void reverseArray(Common::Array &arr) { bool WalkRegion::findPath(const Vertex &start, const Vertex &end, BS_Path &path) const { // This is an implementation of Dijkstra's algorithm - // Initialise edge node list + // Initialize edge node list DijkstraNode::Container dijkstraNodes; initDijkstraNodes(dijkstraNodes, *this, start, _nodes); @@ -247,7 +247,7 @@ void WalkRegion::initNodeVector() { } void WalkRegion::computeVisibilityMatrix() { - // Initialise visibility matrix + // Initialize visibility matrix _visibilityMatrix = Common::Array< Common::Array >(); for (uint idx = 0; idx < _nodes.size(); ++idx) { Common::Array arr; diff --git a/engines/sword25/script/luascript.cpp b/engines/sword25/script/luascript.cpp index 7fd3d1b65876..9c65c9948da2 100644 --- a/engines/sword25/script/luascript.cpp +++ b/engines/sword25/script/luascript.cpp @@ -112,7 +112,7 @@ bool LuaScriptEngine::init() { // Place the error handler function in the Lua registry, and remember the index _pcallErrorhandlerRegistryIndex = luaL_ref(_state, LUA_REGISTRYINDEX); - // Initialise the Pluto-Persistence library + // Initialize the Pluto-Persistence library luaopen_pluto(_state); lua_pop(_state, 1); diff --git a/engines/sword25/script/luascript.h b/engines/sword25/script/luascript.h index cd6d0e887857..1a4a38c3bec5 100644 --- a/engines/sword25/script/luascript.h +++ b/engines/sword25/script/luascript.h @@ -49,7 +49,7 @@ class LuaScriptEngine : public ScriptEngine { virtual ~LuaScriptEngine(); /** - * Initialises the scripting engine + * Initializes the scripting engine * @return Returns true if successful, otherwise false. */ virtual bool init(); diff --git a/engines/sword25/script/script.h b/engines/sword25/script/script.h index e4ce846b66cd..04f248fe7ecc 100644 --- a/engines/sword25/script/script.h +++ b/engines/sword25/script/script.h @@ -54,7 +54,7 @@ class ScriptEngine : public Service, public Persistable { // ----------------------------------------------------------------------------- /** - * Initialises the scrip tengine. Returns true if successful, false otherwise. + * Initializes the scrip tengine. Returns true if successful, false otherwise. */ virtual bool init() = 0; diff --git a/engines/sword25/sfx/soundengine.h b/engines/sword25/sfx/soundengine.h index c087392570d3..4dbd475846f8 100644 --- a/engines/sword25/sfx/soundengine.h +++ b/engines/sword25/sfx/soundengine.h @@ -88,7 +88,7 @@ class SoundEngine : public ResourceService, public Persistable { ~SoundEngine() {} /** - * Initialises the sound engine + * Initializes the sound engine * @param SampleRate Specifies the sample rate to use. * @param Channels The maximum number of channels. The default is 32. * @return Returns true on success, otherwise false. diff --git a/engines/sword25/sword25.cpp b/engines/sword25/sword25.cpp index 93666fed398d..b111746c32a3 100644 --- a/engines/sword25/sword25.cpp +++ b/engines/sword25/sword25.cpp @@ -94,7 +94,7 @@ Common::Error Sword25Engine::run() { } Common::Error Sword25Engine::appStart() { - // Initialise the graphics mode to ARGB8888 + // Initialize the graphics mode to ARGB8888 Graphics::PixelFormat format = Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24); initGraphics(800, 600, true, &format); if (format != g_system->getScreenFormat()) @@ -142,7 +142,7 @@ bool Sword25Engine::appMain() { } bool Sword25Engine::appEnd() { - // The kernel is shutdown, and un-initialises all subsystems + // The kernel is shutdown, and un-initializes all subsystems Kernel::deleteInstance(); AnimationTemplateRegistry::destroy(); diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp index 9caa12d32038..4e9847f8b4fd 100644 --- a/engines/tinsel/actors.cpp +++ b/engines/tinsel/actors.cpp @@ -434,7 +434,7 @@ void StartTaggedActors(SCNHANDLE ah, int numActors, bool bRunScript) { memset(taggedActors, 0, sizeof(taggedActors)); numTaggedActors = numActors; } else { - // Only actors with code blocks got (x, y) re-initialised, so... + // Only actors with code blocks got (x, y) re-initialized, so... for (i = 0; i < NumActors; i++) { actorInfo[i].x = actorInfo[i].y = 0; actorInfo[i].mtype = 0; diff --git a/engines/tinsel/background.cpp b/engines/tinsel/background.cpp index 5e2ebaafdcbd..72397db97fbc 100644 --- a/engines/tinsel/background.cpp +++ b/engines/tinsel/background.cpp @@ -37,7 +37,7 @@ namespace Tinsel { const BACKGND *pCurBgnd = NULL; /** - * Called to initialise a background. + * Called to initialize a background. * @param pBgnd Pointer to data struct for current background */ diff --git a/engines/tinsel/background.h b/engines/tinsel/background.h index 37ab4d4d5c12..34f1bd6dd289 100644 --- a/engines/tinsel/background.h +++ b/engines/tinsel/background.h @@ -73,7 +73,7 @@ struct BACKGND { |* Background Function Prototypes *| \*----------------------------------------------------------------------*/ -void InitBackground( // called to initialise a background +void InitBackground( // called to initialize a background const BACKGND *pBgnd); // pointer to data struct for current background void StartupBackground(CORO_PARAM, SCNHANDLE hFilm); diff --git a/engines/tinsel/bg.cpp b/engines/tinsel/bg.cpp index e5618afc5c10..cf692e16eafe 100644 --- a/engines/tinsel/bg.cpp +++ b/engines/tinsel/bg.cpp @@ -126,7 +126,7 @@ static void BGmainProcess(CORO_PARAM, const void *param) { // Get the MULTI_INIT structure pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pReel->mobj)); - // Initialise and insert the object, and initialise its script. + // Initialize and insert the object, and initialize its script. pBG[0] = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), pBG[0]); InitStepAnimScript(&thisAnim[0], pBG[0], FROM_LE_32(pReel->script), BGspeed); @@ -141,7 +141,7 @@ static void BGmainProcess(CORO_PARAM, const void *param) { // Get the MULTI_INIT structure pmi = (PMULTI_INIT) LockMem(FROM_LE_32(pFilm->reels[i].mobj)); - // Initialise and insert the object, and initialise its script. + // Initialize and insert the object, and initialize its script. pBG[i] = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), pBG[i]); MultiSetZPosition(pBG[i], 0); @@ -176,7 +176,7 @@ static void BGmainProcess(CORO_PARAM, const void *param) { pFilm = (const FILM *)LockMem(hBackground); assert(bgReels == (int32)FROM_LE_32(pFilm->numreels)); - // Just re-initialise the scripts. + // Just re-initialize the scripts. for (int i = 0; i < bgReels; i++) { InitStepAnimScript(&thisAnim[i], pBG[i], pFilm->reels[i].script, BGspeed); StepAnimScript(&thisAnim[i]); @@ -202,7 +202,7 @@ static void BGotherProcess(CORO_PARAM, const void *param) { CORO_BEGIN_CODE(_ctx); - // Initialise and insert the object, and initialise its script. + // Initialize and insert the object, and initialize its script. _ctx->pObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), _ctx->pObj); diff --git a/engines/tinsel/bmv.cpp b/engines/tinsel/bmv.cpp index db56c5bbba5d..24d47b920f4f 100644 --- a/engines/tinsel/bmv.cpp +++ b/engines/tinsel/bmv.cpp @@ -385,7 +385,7 @@ void BMVPlayer::MoviePalette(int paletteOffset) { SetTextPal(talkColor); } -void BMVPlayer::InitialiseMovieSound() { +void BMVPlayer::InitializeMovieSound() { _audioStream = Audio::makeQueuingAudioStream(22050, true); audioStarted = false; } @@ -663,7 +663,7 @@ void BMVPlayer::LoadSlots(int number) { /** * Called from the foreground when starting playback of a movie. */ -void BMVPlayer::InitialiseBMV() { +void BMVPlayer::InitializeBMV() { if (!stream.open(szMovieFile)) error(CANNOT_FIND_FILE, szMovieFile); @@ -680,7 +680,7 @@ void BMVPlayer::InitialiseBMV() { // Pass the sceen buffer to the decompresser InitBMV(screenBuffer); - // Initialise some stuff + // Initialize some stuff nextUseOffset = 0; nextSoundOffset = 0; wrapUseOffset = -1; @@ -705,8 +705,8 @@ void BMVPlayer::InitialiseBMV() { while (numAdvancePackets < ADVANCE_SOUND) LoadSlots(1); - // Initialise the sound channel - InitialiseMovieSound(); + // Initialize the sound channel + InitializeMovieSound(); } /** @@ -1066,7 +1066,7 @@ void BMVPlayer::FettleBMV() { // First time in with this movie - InitialiseBMV(); + InitializeBMV(); for (i = 0; i < ADVANCE_SOUND;) { if (DoSoundFrame()) diff --git a/engines/tinsel/bmv.h b/engines/tinsel/bmv.h index 02ba6d100f06..eadf65c3aab6 100644 --- a/engines/tinsel/bmv.h +++ b/engines/tinsel/bmv.h @@ -134,7 +134,7 @@ class BMVPlayer { void InitBMV(byte *memoryBuffer); void PrepAudio(const byte *sourceData, int blobCount, byte *destPtr); void MoviePalette(int paletteOffset); - void InitialiseMovieSound(); + void InitializeMovieSound(); void StartMovieSound(); void FinishMovieSound(); void MovieAudio(int audioOffset, int blobs); @@ -144,7 +144,7 @@ class BMVPlayer { int MovieCommand(char cmd, int commandOffset); int FollowingPacket(int thisPacket, bool bReallyImportant); void LoadSlots(int number); - void InitialiseBMV(); + void InitializeBMV(); bool MaintainBuffer(); bool DoBMVFrame(); bool DoSoundFrame(); diff --git a/engines/tinsel/cliprect.cpp b/engines/tinsel/cliprect.cpp index f8d8011b1261..76feede83f85 100644 --- a/engines/tinsel/cliprect.cpp +++ b/engines/tinsel/cliprect.cpp @@ -209,7 +209,7 @@ void UpdateClipRect(OBJECT **pObjList, Common::Point *pWin, Common::Rect *pClip) DRAWOBJECT currentObj; // filled in to draw the current object in list OBJECT *pObj; // object list iterator - // Initialise the fields of the drawing object to empty + // Initialize the fields of the drawing object to empty memset(¤tObj, 0, sizeof(DRAWOBJECT)); for (pObj = *pObjList; pObj != NULL; pObj = pObj->pNext) { diff --git a/engines/tinsel/cursor.cpp b/engines/tinsel/cursor.cpp index 6e04feff572c..8248609a811c 100644 --- a/engines/tinsel/cursor.cpp +++ b/engines/tinsel/cursor.cpp @@ -77,7 +77,7 @@ static int nextTrail = 0; static bool bWhoa = false; // Set by DropCursor() at the end of a scene // - causes cursor processes to do nothing - // Reset when main cursor has re-initialised + // Reset when main cursor has re-initialized static uint16 restart = 0; // When main cursor has been bWhoa-ed, it waits // for this to be set to 0x8000. @@ -106,8 +106,8 @@ static int lastCursorX = 0, lastCursorY = 0; static void DoCursorMove(); /** - * Initialise and insert a cursor trail object, set its Z-pos, and hide - * it. Also initialise its animation script. + * Initialize and insert a cursor trail object, set its Z-pos, and hide + * it. Also initialize its animation script. */ static void InitCurTrailObj(int i, int x, int y) { const FREEL *pfr; // pointer to reel @@ -127,13 +127,13 @@ static void InitCurTrailObj(int i, int x, int y) { assert(BgPal()); // No background palette pim->hImgPal = TO_LE_32(BgPal()); - // Initialise and insert the object, set its Z-pos, and hide it + // Initialize and insert the object, set its Z-pos, and hide it ntrailData[i].trailObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_STATUS), ntrailData[i].trailObj); MultiSetZPosition(ntrailData[i].trailObj, Z_CURSORTRAIL); MultiSetAniXY(ntrailData[i].trailObj, x, y); - // Initialise the animation script + // Initialize the animation script InitStepAnimScript(&ntrailData[i].trailAnim, ntrailData[i].trailObj, FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); StepAnimScript(&ntrailData[i].trailAnim); } @@ -227,7 +227,7 @@ void GetCursorXY(int *x, int *y, bool absolute) { } /** - * Re-initialise the main cursor to use the main cursor reel. + * Re-initialize the main cursor to use the main cursor reel. * Called from TINLIB.C to restore cursor after hiding it. * Called from INVENTRY.C to restore cursor after customising it. */ @@ -385,11 +385,11 @@ void SetAuxCursor(SCNHANDLE hFilm) { ACoY = (short)((FROM_LE_16(pim->imgHeight) & ~C16_FLAG_MASK)/2 - ((int16) FROM_LE_16(pim->anioffY))); - // Initialise and insert the auxillary cursor object + // Initialize and insert the auxillary cursor object AcurObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_STATUS), AcurObj); - // Initialise the animation and set its position + // Initialize the animation and set its position InitStepAnimScript(&AcurAnim, AcurObj, FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); MultiSetAniXY(AcurObj, x - ACoX, y - ACoY); MultiSetZPosition(AcurObj, Z_ACURSOR); @@ -470,7 +470,7 @@ static void DoCursorMove() { } /** - * Initialise cursor object. + * Initialize cursor object. */ static void InitCurObj() { const FILM *pFilm; @@ -500,7 +500,7 @@ static void InitCurObj() { } /** - * Initialise the cursor position. + * Initialize the cursor position. */ static void InitCurPos() { Common::Point ptMouse = _vm->getMousePosition(); @@ -530,7 +530,7 @@ static void CursorStoppedCheck(CORO_PARAM) { while (restart != 0x8000) CORO_SLEEP(1); - // Re-initialise + // Re-initialize InitCurObj(); InitCurPos(); InventoryIconCursor(false); // May be holding something @@ -656,7 +656,7 @@ void DropCursor() { * RestartCursor is called when a new scene is starting up. */ void RestartCursor() { - restart = 0x8000; // Get the main cursor to re-initialise + restart = 0x8000; // Get the main cursor to re-initialize } /** diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp index 6deeab27cd07..6ca070b67aa2 100644 --- a/engines/tinsel/dialogs.cpp +++ b/engines/tinsel/dialogs.cpp @@ -1319,7 +1319,7 @@ extern int WhichItemHeld() { } /** - * Called from the cursor module when it re-initialises (at the start of + * Called from the cursor module when it re-initializes (at the start of * a new scene). For if we are holding something at scene-change time. */ extern void InventoryIconCursor(bool bNewItem) { diff --git a/engines/tinsel/heapmem.cpp b/engines/tinsel/heapmem.cpp index 23765832223f..026dc9457e5f 100644 --- a/engines/tinsel/heapmem.cpp +++ b/engines/tinsel/heapmem.cpp @@ -100,7 +100,7 @@ static void MemoryStats() { #endif /** - * Initialises the memory manager. + * Initializes the memory manager. */ void MemoryInit() { // place first node on free list @@ -133,7 +133,7 @@ void MemoryInit() { } /** - * Deinitialises the memory manager. + * Deinitializes the memory manager. */ void MemoryDeinit() { const MEM_NODE *pHeap = &heapSentinel; diff --git a/engines/tinsel/heapmem.h b/engines/tinsel/heapmem.h index 277463e4ef4c..7b29a3ecceaf 100644 --- a/engines/tinsel/heapmem.h +++ b/engines/tinsel/heapmem.h @@ -35,8 +35,8 @@ struct MEM_NODE; |* Memory Function Prototypes *| \*----------------------------------------------------------------------*/ -void MemoryInit(); // initialises the memory manager -void MemoryDeinit(); // deinitialises the memory manager +void MemoryInit(); // initializes the memory manager +void MemoryDeinit(); // deinitializes the memory manager // reserves a memory node for a movable & discardable block MEM_NODE *MemoryNoAlloc(); diff --git a/engines/tinsel/multiobj.cpp b/engines/tinsel/multiobj.cpp index 4a9d4b65d40c..c48fefdd22d1 100644 --- a/engines/tinsel/multiobj.cpp +++ b/engines/tinsel/multiobj.cpp @@ -29,7 +29,7 @@ namespace Tinsel { /** - * Initialise a multi-part object using a list of images to init + * Initialize a multi-part object using a list of images to init * each object piece. One object is created for each image in the list. * All objects are given the same palette as the first image. A pointer * to the first (master) object created is returned. diff --git a/engines/tinsel/multiobj.h b/engines/tinsel/multiobj.h index a467fac425a6..a0f977553ada 100644 --- a/engines/tinsel/multiobj.h +++ b/engines/tinsel/multiobj.h @@ -53,7 +53,7 @@ typedef MULTI_INIT *PMULTI_INIT; |* Multi Object Function Prototypes *| \*----------------------------------------------------------------------*/ -OBJECT *MultiInitObject( // Initialise a multi-part object +OBJECT *MultiInitObject( // Initialize a multi-part object const MULTI_INIT *pInitTbl); // pointer to multi-object initialisation table void MultiInsertObject( // Insert a multi-part object onto a object list diff --git a/engines/tinsel/object.cpp b/engines/tinsel/object.cpp index b1090058d18f..cbe5b0a88fb8 100644 --- a/engines/tinsel/object.cpp +++ b/engines/tinsel/object.cpp @@ -345,7 +345,7 @@ void GetAniPosition(OBJECT *pObj, int *pPosX, int *pPosY) { } /** - * Initialise a object using a OBJ_INIT structure to supply parameters. + * Initialize a object using a OBJ_INIT structure to supply parameters. * @param pInitTbl Pointer to object initialisation table */ OBJECT *InitObject(const OBJ_INIT *pInitTbl) { @@ -486,7 +486,7 @@ void AnimateObject(OBJECT *pAniObj, SCNHANDLE hNewImg) { * @param height Height of rectangle */ OBJECT *RectangleObject(SCNHANDLE hPal, int color, int width, int height) { - // template for initialising the rectangle object + // template for initializing the rectangle object static const OBJ_INIT rectObj = {0, DMA_CONST, OID_EFFECTS, 0, 0, 0}; PALQ *pPalQ; // palette queue pointer @@ -522,7 +522,7 @@ OBJECT *RectangleObject(SCNHANDLE hPal, int color, int width, int height) { * @param height Height of rectangle */ OBJECT *TranslucentObject(int width, int height) { - // template for initialising the rectangle object + // template for initializing the rectangle object static const OBJ_INIT rectObj = {0, DMA_TRANS, OID_EFFECTS, 0, 0, 0}; // allocate and init a new object diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp index 39423813bf84..0834e7df242d 100644 --- a/engines/tinsel/pcode.cpp +++ b/engines/tinsel/pcode.cpp @@ -348,7 +348,7 @@ void FreeMasterInterpretContext() { } /** - * Allocate and initialise an interpret context. + * Allocate and initialize an interpret context. * Called from a process prior to Interpret(). * @param gsort which sort of code * @param hCode Handle to code to execute @@ -385,7 +385,7 @@ INT_CONTEXT *InitInterpretContext(GSORT gsort, SCNHANDLE hCode, TINSEL_EVENT eve } /** - * Allocate and initialise an interpret context with restored data. + * Allocate and initialize an interpret context with restored data. */ INT_CONTEXT *RestoreInterpretContext(INT_CONTEXT *ric) { INT_CONTEXT *ic; diff --git a/engines/tinsel/pcode.h b/engines/tinsel/pcode.h index eedf9fb827c2..971a42d7bd29 100644 --- a/engines/tinsel/pcode.h +++ b/engines/tinsel/pcode.h @@ -74,7 +74,7 @@ struct INT_CONTEXT { int ip; ///< instruction pointer bool bHalt; ///< set to exit interpeter bool escOn; - int myEscape; ///< only initialised to prevent compiler warning! + int myEscape; ///< only initialized to prevent compiler warning! uint32 waitNumber1; // The waiting numbert uint32 waitNumber2; // The wait for number diff --git a/engines/tinsel/polygons.cpp b/engines/tinsel/polygons.cpp index 26a861f69239..6fc1c65ec55c 100644 --- a/engines/tinsel/polygons.cpp +++ b/engines/tinsel/polygons.cpp @@ -1275,13 +1275,13 @@ HPOLYGON GetPolyHandle(int i) { // ************************************************************************** // -// Code called to initialise or wrap up a scene: +// Code called to initialize or wrap up a scene: // // ************************************************************************** /** * Called at the start of a scene, when all polygons have been - * initialised, to work out which paths are adjacent to which. + * initialized, to work out which paths are adjacent to which. */ static int DistinctCorners(HPOLYGON hp1, HPOLYGON hp2) { const POLYGON *pp1, *pp2; @@ -1593,7 +1593,7 @@ static PPOLYGON GetPolyEntry() { /** * Variation of GetPolyEntry from Tinsel 1 that splits up getting a new - * polygon structure from initialising it + * polygon structure from initializing it */ static PPOLYGON CommonInits(PTYPE polyType, int pno, const Poly &ptp, bool bRestart) { int i; @@ -1657,14 +1657,14 @@ static void PseudoCenter(POLYGON *p) { } /** - * Initialise an EXIT polygon. + * Initialize an EXIT polygon. */ static void InitExit(const Poly &ptp, int pno, bool bRestart) { CommonInits(EXIT, pno, ptp, bRestart); } /** - * Initialise a PATH or NPATH polygon. + * Initialize a PATH or NPATH polygon. */ static void InitPath(const Poly &ptp, bool NodePath, int pno, bool bRestart) { PPOLYGON p = CommonInits(PATH, pno, ptp, bRestart); @@ -1676,14 +1676,14 @@ static void InitPath(const Poly &ptp, bool NodePath, int pno, bool bRestart) { /** - * Initialise a BLOCKING polygon. + * Initialize a BLOCKING polygon. */ static void InitBlock(const Poly &ptp, int pno, bool bRestart) { CommonInits(BLOCK, pno, ptp, bRestart); } /** - * Initialise an extra BLOCKING polygon related to a moving actor. + * Initialize an extra BLOCKING polygon related to a moving actor. * The width of the polygon depends on the width of the actor which is * trying to walk through the actor you first thought of. * This is for dynamic blocking. @@ -1718,7 +1718,7 @@ HPOLYGON InitExtraBlock(PMOVER ca, PMOVER ta) { } /** - * Initialise an EFFECT polygon. + * Initialize an EFFECT polygon. */ static void InitEffect(const Poly &ptp, int pno, bool bRestart) { CommonInits(EFFECT, pno, ptp, bRestart); @@ -1726,7 +1726,7 @@ static void InitEffect(const Poly &ptp, int pno, bool bRestart) { /** - * Initialise a REFER polygon. + * Initialize a REFER polygon. */ static void InitRefer(const Poly &ptp, int pno, bool bRestart) { PPOLYGON p = CommonInits(REFER, pno, ptp, bRestart); @@ -1736,7 +1736,7 @@ static void InitRefer(const Poly &ptp, int pno, bool bRestart) { /** - * Initialise a TAG polygon. + * Initialize a TAG polygon. */ static void InitTag(const Poly &ptp, int pno, bool bRestart) { CommonInits(TAG, pno, ptp, bRestart); @@ -1781,7 +1781,7 @@ static void KillDeadPolygons() { } /** - * Called at the start of a scene to initialise the polys in that scene. + * Called at the start of a scene to initialize the polys in that scene. */ void InitPolygons(SCNHANDLE ph, int numPoly, bool bRestart) { pHandle = ph; diff --git a/engines/tinsel/savescn.cpp b/engines/tinsel/savescn.cpp index 7be24cc96482..89d68a611e9b 100644 --- a/engines/tinsel/savescn.cpp +++ b/engines/tinsel/savescn.cpp @@ -150,14 +150,14 @@ void DoRestoreScene(SAVED_DATA *sd, bool bFadeOut) { RestoreSceneCount = RS_COUNT; // Set restore scene count } -void InitialiseSaveScenes() { +void InitializeSaveScenes() { if (ssData == NULL) { ssData = (SAVED_DATA *)calloc(MAX_NEST, sizeof(SAVED_DATA)); if (ssData == NULL) { error("Cannot allocate memory for scene changes"); } } else { - // Re-initialise - no scenes saved + // Re-initialize - no scenes saved savedSceneCount = 0; } } diff --git a/engines/tinsel/savescn.h b/engines/tinsel/savescn.h index 27840876f275..894af0d6b8f4 100644 --- a/engines/tinsel/savescn.h +++ b/engines/tinsel/savescn.h @@ -96,7 +96,7 @@ void ProcessSRQueue(); void RequestSaveGame(char *name, char *desc, SAVED_DATA *sd, int *ssCount, SAVED_DATA *ssData); void RequestRestoreGame(int num, SAVED_DATA *sd, int *ssCount, SAVED_DATA *ssData); -void InitialiseSaveScenes(); +void InitializeSaveScenes(); void FreeSaveScenes(); } // End of namespace Tinsel diff --git a/engines/tinsel/scene.cpp b/engines/tinsel/scene.cpp index f2c3bff1d535..89b0da7d65d9 100644 --- a/engines/tinsel/scene.cpp +++ b/engines/tinsel/scene.cpp @@ -201,8 +201,8 @@ void SendSceneTinselProcess(TINSEL_EVENT event) { /** * Get the SCENE_STRUC - * Initialise polygons for the scene - * Initialise the actors for this scene + * Initialize polygons for the scene + * Initialize the actors for this scene * Run the appropriate entrance code (if any) * Get the default refer type */ @@ -244,10 +244,10 @@ static void LoadScene(SCNHANDLE scene, int entry) { if (entry == NO_ENTRY_NUM) { // Restoring scene - // Initialise all the polygons for this scene + // Initialize all the polygons for this scene InitPolygons(FROM_LE_32(ss->hPoly), FROM_LE_32(ss->numPoly), true); - // Initialise the actors for this scene + // Initialize the actors for this scene StartTaggedActors(FROM_LE_32(ss->hTaggedActor), FROM_LE_32(ss->numTaggedActor), false); if (TinselV2) @@ -257,10 +257,10 @@ static void LoadScene(SCNHANDLE scene, int entry) { } else { // Genuine new scene - // Initialise all the polygons for this scene + // Initialize all the polygons for this scene InitPolygons(FROM_LE_32(ss->hPoly), FROM_LE_32(ss->numPoly), false); - // Initialise the actors for this scene + // Initialize the actors for this scene StartTaggedActors(FROM_LE_32(ss->hTaggedActor), FROM_LE_32(ss->numTaggedActor), true); // Run the appropriate entrance code (if any) diff --git a/engines/tinsel/scroll.cpp b/engines/tinsel/scroll.cpp index 76376641638c..d75e649be30f 100644 --- a/engines/tinsel/scroll.cpp +++ b/engines/tinsel/scroll.cpp @@ -416,7 +416,7 @@ void ScrollProcess(CORO_PARAM, const void *) { CORO_BEGIN_CODE(_ctx); // In Tinsel v2, scenes may play movies, so the background may not always - // already be initialised like it is in v1 + // already be initialized like it is in v1 while (!GetBgObject()) CORO_SLEEP(1); diff --git a/engines/tinsel/sysvar.cpp b/engines/tinsel/sysvar.cpp index aa3fdeead886..88053f15c6b7 100644 --- a/engines/tinsel/sysvar.cpp +++ b/engines/tinsel/sysvar.cpp @@ -112,7 +112,7 @@ static SCNHANDLE systemStrings[SS_MAX_VALID]; // FIXME: Avoid non-const global v //----------------- FUNCTIONS -------------------------------- /** - * Initialises the system variable list + * Initializes the system variable list */ void InitSysVars() { diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index a5a0c73395c4..7613c1a897c3 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -2749,7 +2749,7 @@ static void SetTag(CORO_PARAM, int tagno) { } /** - * Initialise a timer. + * Initialize a timer. */ static void SetTimer(int timerno, int start, bool up, bool frame) { StartTimer(timerno, start, up != 0, frame != 0); @@ -2999,7 +2999,7 @@ static void StartProcess(CORO_PARAM, uint32 procID) { } /** - * Initialise a timer. + * Initialize a timer. */ static void StartTimerFn(int timerno, int start, bool up, int fs) { StartTimer(timerno, start, up, fs); diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 84a8ea8eb3fe..6c1898b08cf0 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -705,7 +705,7 @@ void LoadBasicChunks() { int numObjects; // Allocate RAM for savescene data - InitialiseSaveScenes(); + InitializeSaveScenes(); // CHUNK_TOTAL_ACTORS seems to be missing in the released version, hard coding a value // TODO: Would be nice to just change 511 to MAX_SAVED_ALIVES diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 96fd8002b615..cc11343c9cda 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -874,7 +874,7 @@ GfxDialog::~GfxDialog() { void GfxDialog::setDefaults() { GfxElement::setDefaults(); - // Initialise the embedded graphics manager + // Initialize the embedded graphics manager _gfxManager.setDefaults(); // Figure out a rect needed for all the added elements diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 3741bdafd77e..11308e6c4b27 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -319,7 +319,7 @@ void Scene::loadSceneData(int sceneNum) { // Load the priority regions _priorities.load(sceneNum); - // Initialise the section enabled list + // Initialize the section enabled list Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff); _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 4f55ecfb8398..6fae9785c048 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -60,7 +60,7 @@ bool TSageEngine::hasFeature(EngineFeature f) const { (f == kSupportsSavingDuringRuntime); } -void TSageEngine::initialise() { +void TSageEngine::initialize() { _saver = new Saver(); // Set up the resource manager @@ -83,7 +83,7 @@ void TSageEngine::initialise() { _globals->gfxManager().setDefaults(); } -void TSageEngine::deinitialise() { +void TSageEngine::deinitialize() { delete _globals; delete _resourceManager; delete _saver; @@ -91,12 +91,12 @@ void TSageEngine::deinitialise() { Common::Error TSageEngine::run() { // Basic initialisation - initialise(); + initialize(); _globals->_sceneHandler.registerHandler(); _globals->_game->execute(); - deinitialise(); + deinitialize(); return Common::kNoError; } diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index 22282125107a..e3d37257cdec 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -86,8 +86,8 @@ class TSageEngine : public Engine { virtual Common::Error saveGameState(int slot, const char *desc); Common::String generateSaveName(int slot); - void initialise(); - void deinitialise(); + void initialize(); + void deinitialize(); }; extern TSageEngine *_vm; diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp index 065b24047181..a0877fc68adf 100644 --- a/gui/widgets/list.cpp +++ b/gui/widgets/list.cpp @@ -38,7 +38,7 @@ ListWidget::ListWidget(Dialog *boss, const String &name, const char *tooltip, ui _scrollBar = NULL; _textWidth = NULL; - // This ensures that _entriesPerPage is properly initialised. + // This ensures that _entriesPerPage is properly initialized. reflowLayout(); _scrollBar = new ScrollBarWidget(this, _w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h); @@ -70,7 +70,7 @@ ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, const char *too _scrollBar = NULL; _textWidth = NULL; - // This ensures that _entriesPerPage is properly initialised. + // This ensures that _entriesPerPage is properly initialized. reflowLayout(); _scrollBar = new ScrollBarWidget(this, _w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h); From 5cd5d2663dc57157e79d5f1621ead4e446bec046 Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Wed, 25 May 2011 19:22:17 +0200 Subject: [PATCH 216/369] SAMSUNGTV: change default path --- backends/saves/posix/posix-saves.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index 40380a1b237e..e04609be5b96 100644 --- a/backends/saves/posix/posix-saves.cpp +++ b/backends/saves/posix/posix-saves.cpp @@ -51,7 +51,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() { // Register default savepath based on HOME #if defined(SAMSUNGTV) - ConfMan.registerDefault("savepath", "/mtd_wiselink/scummvm/savegames"); + ConfMan.registerDefault("savepath", "/mtd_wiselink/scummvm savegames"); #else Common::String savePath; const char *home = getenv("HOME"); From a87d33845a9e8253b876ef59d0b9b9fd45a9aaa4 Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Wed, 25 May 2011 19:40:55 +0200 Subject: [PATCH 217/369] SAMSUNGTV: revert code of result some previous commit --- backends/base-backend.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index 624de1f3e586..40e702495a3f 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -61,12 +61,8 @@ void BaseBackend::fillScreen(uint32 col) { #if defined(POSIX) -#if defined(SAMSUNGTV) -#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" -#else #define DEFAULT_CONFIG_FILE ".scummvmrc" #endif -#endif #if !defined(POSIX) #define DEFAULT_CONFIG_FILE "scummvm.ini" From 218d82c62b8078e82dd5dabc165e35563c464600 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 25 May 2011 22:43:31 +0200 Subject: [PATCH 218/369] AGI: Fix compilation on 64 bit platforms I'm unable to test this change, but it avoids using a pointer to store an int temporarily. --- engines/agi/sound_2gs.cpp | 17 ++++++++--------- engines/agi/sound_2gs.h | 4 +++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index af7214f74919..6d64c29de94d 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -396,7 +396,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { wb++; // Prepare the generator. - g->osc[0].base = i->wave[0][wa].base; + g->osc[0].base = i->base + i->wave[0][wa].offset; g->osc[0].size = i->wave[0][wa].size; g->osc[0].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[0][wa].tune / 256.0) / (double)_sampleRate); g->osc[0].p = 0; @@ -405,7 +405,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->osc[0].swap = i->wave[0][wa].swap; g->osc[0].chn = i->wave[0][wa].chn; - g->osc[1].base = i->wave[1][wb].base; + g->osc[1].base = i->base + i->wave[1][wb].offset; g->osc[1].size = i->wave[1][wb].size; g->osc[1].pd = doubleToFrac(midiKeyToFreq(note, (double)i->wave[1][wb].tune / 256.0) / (double)_sampleRate); g->osc[1].p = 0; @@ -528,19 +528,19 @@ bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreA for (int i = 0; i < 2; i++) for (int k = 0; k < waveCount[i]; k++) { wave[i][k].key = stream.readByte(); - wave[i][k].base = (int8*)(stream.readByte() << 8); + wave[i][k].offset = stream.readByte() << 8; wave[i][k].size = 0x100 << (stream.readByte() & 7); uint8 b = stream.readByte(); wave[i][k].tune = stream.readUint16LE(); // For sample resources we ignore the address. if (ignoreAddr) - wave[i][k].base = 0; + wave[i][k].offset = 0; // Check for samples that extend out of the wavetable. - if ((int)wave[i][k].base + wave[i][k].size >= SIERRASTANDARD_SIZE) { + if (wave[i][k].offset + wave[i][k].size >= SIERRASTANDARD_SIZE) { warning("Invalid data detected in the instrument set of Apple IIGS AGI. Continuing anyway..."); - wave[i][k].size = SIERRASTANDARD_SIZE - (int)wave[i][k].base; + wave[i][k].size = SIERRASTANDARD_SIZE - wave[i][k].offset; } // Parse the generator mode byte to separate fields. @@ -558,9 +558,8 @@ bool IIgsInstrumentHeader::finalize(int8 *wavetable) { // in case the sample ends prematurely. for (int i = 0; i < 2; i++) for (int k = 0; k < waveCount[i]; k++) { - wave[i][k].base += (uint)wavetable; - - int8 *p = wave[i][k].base; + base = wavetable; + int8 *p = base + wave[i][k].offset; uint trueSize; for (trueSize = 0; trueSize < wave[i][k].size; trueSize++) if (p[trueSize] == -ZERO_OFFSET) diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 732d3cd12b9b..1a225300aedb 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -80,7 +80,7 @@ struct IIgsInstrumentHeader { uint8 waveCount[2]; ///< Wave count for both generators struct { uint8 key; ///< Highest MIDI key to use this wave - int8* base; ///< Pointer to wave data + int offset; ///< Offset of wave data, relative to base uint size; ///< Wave size bool halt; ///< Oscillator halted? bool loop; ///< Loop mode? @@ -89,6 +89,8 @@ struct IIgsInstrumentHeader { int16 tune; ///< Fine tune in semitones (8.8 fixed point) } wave[2][MAX_OSCILLATOR_WAVES]; + int8* base; ///< Base of wave data + /** * Read an Apple IIGS instrument header from the given stream. * @param stream The source stream from which to read the data. From 185536e4b1ee2d837103cefa3605e8ed4f559ddd Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 25 May 2011 23:12:41 +0200 Subject: [PATCH 219/369] TOON: Remove unused variable --- engines/toon/audio.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp index 46b96286b36d..ae67d1900eb9 100644 --- a/engines/toon/audio.cpp +++ b/engines/toon/audio.cpp @@ -393,7 +393,6 @@ void AudioStreamInstance::decodeADPCM(uint8 *comp, int16 *dest, int32 packetSize void AudioStreamInstance::play(bool fade, Audio::Mixer::SoundType soundType) { debugC(1, kDebugAudio, "play(%d)", (fade) ? 1 : 0); - Audio::SoundHandle soundHandle; _stopped = false; _fadingIn = fade; _fadeTime = 0; From 472d45aa2b726d05c66299cbe93c515dca79a037 Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 09:07:09 +0200 Subject: [PATCH 220/369] TSAGE: Add a couple of comments --- engines/tsage/ringworld_scenes3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 53b02a752201..8a1e103e11cb 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -5594,6 +5594,7 @@ void Scene2320::Hotspot8::doAction(int action) { } void Scene2320::Hotspot10::doAction(int action) { + // Seeker Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; switch (action) { @@ -5687,6 +5688,7 @@ void Scene2320::Hotspot12::doAction(int action) { } void Scene2320::Hotspot14::doAction(int action) { + // Right Console Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; switch (action) { From bb4df3f115634ba2f719a4ef342879fc73aef246 Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 20:03:48 +0200 Subject: [PATCH 221/369] HUGO: Add listscreens() and gotoscreen() to console --- engines/hugo/console.cpp | 48 ++++++++++++++++++++++++++++++++++++++++ engines/hugo/console.h | 2 ++ 2 files changed, 50 insertions(+) diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp index 3d7449e51f4a..0afd991728ca 100644 --- a/engines/hugo/console.cpp +++ b/engines/hugo/console.cpp @@ -22,13 +22,61 @@ #include "hugo/console.h" #include "hugo/hugo.h" +#include "hugo/schedule.h" +#include "hugo/text.h" namespace Hugo { HugoConsole::HugoConsole(HugoEngine *vm) : GUI::Debugger(), _vm(vm) { + DCmd_Register("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens)); + DCmd_Register("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen)); } HugoConsole::~HugoConsole() { } +static int strToInt(const char *s) { + if (!*s) + // No string at all + return 0; + else if (toupper(s[strlen(s) - 1]) != 'H') + // Standard decimal string + return atoi(s); + + // Hexadecimal string + uint tmp = 0; + int read = sscanf(s, "%xh", &tmp); + if (read < 1) + error("strToInt failed on string \"%s\"", s); + return (int)tmp; +} + +/** + * This command loads up the specified screen number + */ +bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) { + if (argc != 2) { + DebugPrintf("Usage: %s \n", argv[0]); + return true; + } else { + _vm->_scheduler->newScreen(strToInt(argv[1])); + return false; + } +} + +/** + * This command lists all the screens available + */ +bool HugoConsole::Cmd_listScreens(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); + return true; + } + + DebugPrintf("Available screens for this game are:\n"); + for (int i = 0; i < _vm->_numScreens; i++) + DebugPrintf("%2d - %s\n", i, _vm->_text->getScreenNames(i)); + return true; +} + } // End of namespace Hugo diff --git a/engines/hugo/console.h b/engines/hugo/console.h index 4743b791f397..1c715a046ed5 100644 --- a/engines/hugo/console.h +++ b/engines/hugo/console.h @@ -36,6 +36,8 @@ class HugoConsole : public GUI::Debugger { private: HugoEngine *_vm; + bool Cmd_listScreens(int argc, const char **argv); + bool Cmd_gotoScreen(int argc, const char **argv); }; } // End of namespace Hugo From 65a9ef7639c65afa685b2805f52df567e044810b Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 20:08:30 +0200 Subject: [PATCH 222/369] HUGO: Cosmetic modification, for consistency --- engines/hugo/console.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp index 0afd991728ca..a6acb63852c7 100644 --- a/engines/hugo/console.cpp +++ b/engines/hugo/console.cpp @@ -58,10 +58,10 @@ bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) { if (argc != 2) { DebugPrintf("Usage: %s \n", argv[0]); return true; - } else { - _vm->_scheduler->newScreen(strToInt(argv[1])); - return false; - } + } + + _vm->_scheduler->newScreen(strToInt(argv[1])); + return false; } /** From be3306a9eb2bff80fc1f9bdc858ac4d759d926e4 Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 20:08:54 +0200 Subject: [PATCH 223/369] TSAGE: Cosmetic modification, for consistency --- engines/tsage/debugger.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index 42ae366cedda..5288c98b7250 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -63,13 +63,13 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) { if (argc < 2) { DebugPrintf("Usage: %s [prior scene #]\n", argv[0]); return true; - } else { - if (argc == 3) - _globals->_sceneManager._sceneNumber = strToInt(argv[2]); + } - _globals->_sceneManager.changeScene(strToInt(argv[1])); - return false; - } + if (argc == 3) + _globals->_sceneManager._sceneNumber = strToInt(argv[2]); + + _globals->_sceneManager.changeScene(strToInt(argv[1])); + return false; } /** @@ -377,7 +377,8 @@ bool Debugger::Cmd_MoveObject(int argc, const char **argv) { RING_INVENTORY._jar._sceneNumber = sceneNum; break; default: - DebugPrintf("Invlid object Id %s\n", argv[1]); + DebugPrintf("Invalid object Id %s\n", argv[1]); + break; } return true; From fe41da83ad8d59062f9188414cf4759d1d42f25a Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 20:23:02 +0200 Subject: [PATCH 224/369] HUGO: Add boundaries() to the console. God mode no longer shows boundaries, as in the original --- engines/hugo/console.cpp | 14 ++++++++++++++ engines/hugo/console.h | 1 + engines/hugo/display.cpp | 6 +++--- engines/hugo/hugo.cpp | 19 ++++++++++--------- engines/hugo/hugo.h | 2 ++ 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp index a6acb63852c7..5c7b5ce412d2 100644 --- a/engines/hugo/console.cpp +++ b/engines/hugo/console.cpp @@ -30,6 +30,7 @@ namespace Hugo { HugoConsole::HugoConsole(HugoEngine *vm) : GUI::Debugger(), _vm(vm) { DCmd_Register("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens)); DCmd_Register("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen)); + DCmd_Register("Boundaries", WRAP_METHOD(HugoConsole, Cmd_boundaries)); } HugoConsole::~HugoConsole() { @@ -79,4 +80,17 @@ bool HugoConsole::Cmd_listScreens(int argc, const char **argv) { return true; } +/** + * This command shows and hides boundaries + */ +bool HugoConsole::Cmd_boundaries(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); + return true; + } + + _vm->getGameStatus().showBoundariesFl = !_vm->getGameStatus().showBoundariesFl; + return false; +} + } // End of namespace Hugo diff --git a/engines/hugo/console.h b/engines/hugo/console.h index 1c715a046ed5..150bc2e4bee8 100644 --- a/engines/hugo/console.h +++ b/engines/hugo/console.h @@ -38,6 +38,7 @@ class HugoConsole : public GUI::Debugger { HugoEngine *_vm; bool Cmd_listScreens(int argc, const char **argv); bool Cmd_gotoScreen(int argc, const char **argv); + bool Cmd_boundaries(int argc, const char **argv); }; } // End of namespace Hugo diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp index c731b23e5931..c716e80d875f 100644 --- a/engines/hugo/display.cpp +++ b/engines/hugo/display.cpp @@ -644,13 +644,13 @@ bool Screen::isOverlapping(const rect_t *rectA, const rect_t *rectB) const { } /** - * Display active boundaries in God Mode ('PPG') + * Display active boundaries (activated in the console) * Light Red = Exit hotspots * Light Green = Visible objects - * White = Fixed objects, parts of background + * White = Fix objects, parts of background */ void Screen::drawBoundaries() { - if (!_vm->getGameStatus().godModeFl) + if (!_vm->getGameStatus().showBoundariesFl) return; _vm->_mouse->drawHotspots(); diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 6a0eaac33130..abde0fbd203b 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -527,15 +527,16 @@ void HugoEngine::initPlaylist(bool playlist[kMaxTunes]) { */ void HugoEngine::initStatus() { debugC(1, kDebugEngine, "initStatus"); - _status.storyModeFl = false; // Not in story mode - _status.gameOverFl = false; // Hero not knobbled yet - _status.lookFl = false; // Toolbar "look" button - _status.recallFl = false; // Toolbar "recall" button - _status.newScreenFl = false; // Screen not just loaded - _status.godModeFl = false; // No special cheats allowed - _status.doQuitFl = false; - _status.skipIntroFl = false; - _status.helpFl = false; + _status.storyModeFl = false; // Not in story mode + _status.gameOverFl = false; // Hero not knobbled yet + _status.lookFl = false; // Toolbar "look" button + _status.recallFl = false; // Toolbar "recall" button + _status.newScreenFl = false; // Screen not just loaded + _status.godModeFl = false; // No special cheats allowed + _status.showBoundariesFl = false; // No special cheats allowed + _status.doQuitFl = false; // Boundaries hidden by default + _status.skipIntroFl = false; + _status.helpFl = false; // Initialize every start of new game _status.tick = 0; // Tick count diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h index 61b002a2eeff..b5b8d5ea6182 100644 --- a/engines/hugo/hugo.h +++ b/engines/hugo/hugo.h @@ -177,6 +177,8 @@ struct status_t { // Game status (not saved) bool recallFl; // Toolbar "recall" button pressed bool newScreenFl; // New screen just loaded in dib_a bool godModeFl; // Allow DEBUG features in live version + bool showBoundariesFl; // Flag used to show and hide boundaries, + // used by the console bool doQuitFl; bool skipIntroFl; bool helpFl; From dceaa08e69f820b4901cc5b690c1c63487e8063d Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 20:29:43 +0200 Subject: [PATCH 225/369] TSAGE: Add scene description in scene groups 8 and 10 --- engines/tsage/ringworld_scenes10.cpp | 28 ++++++++++++++-------------- engines/tsage/ringworld_scenes8.cpp | 12 ++++++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp index f8844ec48645..0b4186531df9 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -49,7 +49,7 @@ void Object9350::draw() { } /*-------------------------------------------------------------------------- - * Scene 9100 + * Scene 9100 - Near beach: Slave washing clothes * *--------------------------------------------------------------------------*/ void Scene9100::SceneHotspot1::doAction(int action) { @@ -174,7 +174,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9150 + * Scene 9150 - Castle: Outside the bulwarks * *--------------------------------------------------------------------------*/ void Scene9150::Object3::signal() { @@ -294,7 +294,7 @@ void Scene9150::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9200 + * Scene 9200 - Castle: Near the fountain * *--------------------------------------------------------------------------*/ void Scene9200::SceneHotspot1::doAction(int action) { @@ -470,7 +470,7 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9300 + * Scene 9300 - Castle: In front of a large guarded door * *--------------------------------------------------------------------------*/ void Scene9300::signal() { @@ -537,7 +537,7 @@ void Scene9300::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9350 + * Scene 9350 - Castle: In a hallway * *--------------------------------------------------------------------------*/ @@ -623,7 +623,7 @@ void Scene9350::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9360 + * Scene 9360 - Castle: In a hallway * *--------------------------------------------------------------------------*/ @@ -701,7 +701,7 @@ void Scene9360::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9400 + * Scene 9400 - Castle: Black-Smith room * *--------------------------------------------------------------------------*/ Scene9400::Scene9400() { @@ -826,7 +826,7 @@ void Scene9400::synchronize(Serializer &s) { } /*-------------------------------------------------------------------------- - * Scene 9450 + * Scene 9450 - Castle: Dining room * *--------------------------------------------------------------------------*/ void Scene9450::Object2::signal() { @@ -1009,7 +1009,7 @@ void Scene9450::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9500 + * Scene 9500 - Castle: Bedroom * *--------------------------------------------------------------------------*/ void Scene9500::Hotspot1::doAction(int action) { @@ -1230,7 +1230,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9700 + * Scene 9700 - Castle: Balcony * *--------------------------------------------------------------------------*/ void Scene9700::signal() { @@ -1302,7 +1302,7 @@ void Scene9700::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9750 + * Scene 9750 - Castle: In the garden * *--------------------------------------------------------------------------*/ void Scene9750::signal() { @@ -1338,7 +1338,7 @@ void Scene9750::postInit(SceneObjectList *OwnerList) { /*-------------------------------------------------------------------------- - * Scene 9850 + * Scene 9850 - Castle: Dressing room * *--------------------------------------------------------------------------*/ void Scene9850::Object6::doAction(int action) { @@ -1642,7 +1642,7 @@ void Scene9850::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9900 + * Scene 9900 - Ending * *--------------------------------------------------------------------------*/ void Scene9900::strAction1::signal() { @@ -1997,7 +1997,7 @@ void Scene9900::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 9999 + * Scene 9999 - Space travel * *--------------------------------------------------------------------------*/ diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp index 05306fb450a4..8fa3582732da 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -43,7 +43,7 @@ void SceneObject7700::synchronize(Serializer &s) { } /*-------------------------------------------------------------------------- - * Scene 7000 + * Scene 7000 - Landing near beach * *--------------------------------------------------------------------------*/ @@ -652,7 +652,7 @@ void Scene7000::signal() { /*-------------------------------------------------------------------------- - * Scene 7100 + * Scene 7100 - Underwater: swimming * *--------------------------------------------------------------------------*/ @@ -1136,7 +1136,7 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { _globals->_soundHandler.startSound(270); } /*-------------------------------------------------------------------------- - * Scene 7200 + * Scene 7200 - Underwater: Entering the cave * *--------------------------------------------------------------------------*/ @@ -1302,7 +1302,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 7300 + * Scene 7300 - Underwater: Lord Poria * *--------------------------------------------------------------------------*/ @@ -1497,7 +1497,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 7600 + * Scene 7600 - Floating Buildings: Outside * *--------------------------------------------------------------------------*/ @@ -1602,7 +1602,7 @@ void Scene7600::postInit(SceneObjectList *OwnerList) { } /*-------------------------------------------------------------------------- - * Scene 7700 + * Scene 7700 - Floating Buildings: In the lab * *--------------------------------------------------------------------------*/ From c6ef39dcf20cecef3639d686fd188fc9c7118421 Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 23:36:50 +0200 Subject: [PATCH 226/369] HUGO: Add 3 object related functions to the console --- engines/hugo/console.cpp | 64 +++++++++++++++++++++++++++++++++++++--- engines/hugo/console.h | 3 ++ engines/hugo/parser.h | 5 ++-- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp index 5c7b5ce412d2..0a67b5cd0ae1 100644 --- a/engines/hugo/console.cpp +++ b/engines/hugo/console.cpp @@ -22,15 +22,20 @@ #include "hugo/console.h" #include "hugo/hugo.h" +#include "hugo/object.h" +#include "hugo/parser.h" #include "hugo/schedule.h" #include "hugo/text.h" namespace Hugo { HugoConsole::HugoConsole(HugoEngine *vm) : GUI::Debugger(), _vm(vm) { - DCmd_Register("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens)); - DCmd_Register("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen)); - DCmd_Register("Boundaries", WRAP_METHOD(HugoConsole, Cmd_boundaries)); + DCmd_Register("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens)); + DCmd_Register("listobjects", WRAP_METHOD(HugoConsole, Cmd_listObjects)); + DCmd_Register("getobject", WRAP_METHOD(HugoConsole, Cmd_getObject)); + DCmd_Register("getallobjects", WRAP_METHOD(HugoConsole, Cmd_getAllObjects)); + DCmd_Register("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen)); + DCmd_Register("Boundaries", WRAP_METHOD(HugoConsole, Cmd_boundaries)); } HugoConsole::~HugoConsole() { @@ -56,7 +61,7 @@ static int strToInt(const char *s) { * This command loads up the specified screen number */ bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) { - if (argc != 2) { + if ((argc != 2) || (strToInt(argv[1]) > _vm->_numScreens)){ DebugPrintf("Usage: %s \n", argv[0]); return true; } @@ -80,6 +85,57 @@ bool HugoConsole::Cmd_listScreens(int argc, const char **argv) { return true; } +/** + * This command lists all the objects available + */ +bool HugoConsole::Cmd_listObjects(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); + return true; + } + + DebugPrintf("Available objects for this game are:\n"); + for (int i = 0; i < _vm->_object->_numObj; i++) { + if (_vm->_object->_objects[i].genericCmd & TAKE) + DebugPrintf("%2d - %s\n", i, _vm->_text->getNoun(_vm->_object->_objects[i].nounIndex, 2)); + } + return true; +} + +/** + * This command puts an object in the inventory + */ +bool HugoConsole::Cmd_getObject(int argc, const char **argv) { + if ((argc != 2) || (strToInt(argv[1]) > _vm->_object->_numObj)) { + DebugPrintf("Usage: %s \n", argv[0]); + return true; + } + + if (_vm->_object->_objects[strToInt(argv[1])].genericCmd & TAKE) + _vm->_parser->takeObject(&_vm->_object->_objects[strToInt(argv[1])]); + else + DebugPrintf("Object not available\n"); + + return true; +} + +/** + * This command puts all the available objects in the inventory + */ +bool HugoConsole::Cmd_getAllObjects(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); + return true; + } + + for (int i = 0; i < _vm->_object->_numObj; i++) { + if (_vm->_object->_objects[i].genericCmd & TAKE) + _vm->_parser->takeObject(&_vm->_object->_objects[i]); + } + + return false; +} + /** * This command shows and hides boundaries */ diff --git a/engines/hugo/console.h b/engines/hugo/console.h index 150bc2e4bee8..16317e83d542 100644 --- a/engines/hugo/console.h +++ b/engines/hugo/console.h @@ -37,6 +37,9 @@ class HugoConsole : public GUI::Debugger { private: HugoEngine *_vm; bool Cmd_listScreens(int argc, const char **argv); + bool Cmd_listObjects(int argc, const char **argv); + bool Cmd_getObject(int argc, const char **argv); + bool Cmd_getAllObjects(int argc, const char **argv); bool Cmd_gotoScreen(int argc, const char **argv); bool Cmd_boundaries(int argc, const char **argv); }; diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h index 6ad2b38234b7..faa6dc23035c 100644 --- a/engines/hugo/parser.h +++ b/engines/hugo/parser.h @@ -97,6 +97,7 @@ class Parser { virtual void lineHandler() = 0; virtual void showInventory() const = 0; + virtual void takeObject(object_t *obj) = 0; protected: HugoEngine *_vm; @@ -135,10 +136,10 @@ class Parser_v1d : public Parser { virtual void lineHandler(); virtual void showInventory() const; + virtual void takeObject(object_t *obj); protected: - virtual void dropObject(object_t *obj); - virtual void takeObject(object_t *obj); + virtual void dropObject(object_t *obj); const char *findNextNoun(const char *noun) const; bool isBackgroundWord_v1(const char *noun, const char *verb, objectList_t obj) const; From 6098506a4215ac2bb72b141da837f3a4619b3ca3 Mon Sep 17 00:00:00 2001 From: strangerke Date: Wed, 25 May 2011 23:58:46 +0200 Subject: [PATCH 227/369] HUGO: Fix comments --- engines/hugo/hugo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index abde0fbd203b..a08dbc094b30 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -533,8 +533,8 @@ void HugoEngine::initStatus() { _status.recallFl = false; // Toolbar "recall" button _status.newScreenFl = false; // Screen not just loaded _status.godModeFl = false; // No special cheats allowed - _status.showBoundariesFl = false; // No special cheats allowed - _status.doQuitFl = false; // Boundaries hidden by default + _status.showBoundariesFl = false; // Boundaries hidden by default + _status.doQuitFl = false; _status.skipIntroFl = false; _status.helpFl = false; From bed40a60350c98cbe432fa75db919a78e2a66a7e Mon Sep 17 00:00:00 2001 From: Pawel Kolodziejski Date: Thu, 26 May 2011 07:14:53 +0200 Subject: [PATCH 228/369] SAMSUNGTV: added readme to dists --- dists/samsungtv/README-SamsungTV | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 dists/samsungtv/README-SamsungTV diff --git a/dists/samsungtv/README-SamsungTV b/dists/samsungtv/README-SamsungTV new file mode 100644 index 000000000000..26ded6c7e62c --- /dev/null +++ b/dists/samsungtv/README-SamsungTV @@ -0,0 +1,17 @@ +Notes: + +- Should works on 2009 B series TVs (Full HD): LExxBE65x, LExxBE75x, PSxxB65x, UExxB7xxx, UExxB8xxx, PSxxB85x, LAxxB65x, LAxxB75x, UNxxB7xxx, UAxxB8xxx +- To allow use mouse and keyboard you need load extension first: "SamyGO Mouse And Keyboard" + Download from SamyGO project and run from Content Library: + http://sourceforge.net/projects/samygo/files/SamyGO%20Kernel%20Modules/SamyGO%20Mouse%20and%20Keyboard%20Modules%20v0.01.zip/download +- Buttons on remote controler: EXIT, SOURCE, P+, P-, TV, POWER, CONTENT - cause immediately exit from ScummVM +- Config file is in /mtd_rwarea/.scummvmrc +- Saves are stored in '/mtd_wiselink/scummvm savegames' directory +- Audio is delayed a upto one second, it's TV software issue :/ +- Do not use 3x scalers, they are not fit in TV display frame buffer and you get gfx glitches + +Remote Controler buttons: + +GREEN - emulate key F5 +YELLOW - emulate key F7 - virtual keyboard +BLUE and RETURN - emulate key ESC From bf490b4084d7d1fbec52fc2c6b47ae7a0156c7fc Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 07:25:52 +0200 Subject: [PATCH 229/369] BUILD: Reorder plugin stuff in configure some more --- configure | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/configure b/configure index 3025c7b5f791..736325926be3 100755 --- a/configure +++ b/configure @@ -2279,6 +2279,8 @@ if test "$_dynamic_modules" = yes ; then android) _plugin_prefix="lib" _plugin_suffix=".so" + CXXFLAGS="$CXXFLAGS -fpic" + LIBS="$LIBS -ldl" # Work around an Android 2.0+ run-time linker bug: # The linker doesn't actually look in previously # loaded libraries when trying to resolve symbols - @@ -2289,22 +2291,20 @@ if test "$_dynamic_modules" = yes ; then # to the main libscummvm.so. _mak_plugins=' PLUGIN_EXTRA_DEPS = libscummvm.so -CXXFLAGS += -fpic PLUGIN_LDFLAGS += $(LDFLAGS) -L. -lscummvm PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive POST_OBJS_FLAGS := -Wl,-no-whole-archive -LIBS += -ldl ' ;; darwin*) _plugin_prefix="" _plugin_suffix=".plugin" + LIBS="$LIBS -ldl" _mak_plugins=' PLUGIN_EXTRA_DEPS = $(EXECUTABLE) PLUGIN_LDFLAGS += -bundle -bundle_loader $(EXECUTABLE) -exported_symbols_list "$(srcdir)/plugin.exp" PRE_OBJS_FLAGS := -all_load POST_OBJS_FLAGS := -LIBS += -ldl ' ;; dreamcast) @@ -2327,9 +2327,9 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/ds/plugin.ld -mthumb-interwo freebsd*) _plugin_prefix="lib" _plugin_suffix=".so" + CXXFLAGS="$CXXFLAGS -fpic" _mak_plugins=' PLUGIN_EXTRA_DEPS = -CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive POST_OBJS_FLAGS := -Wl,-no-whole-archive @@ -2345,25 +2345,25 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/wii/plugin.ld gph*) _plugin_prefix="" _plugin_suffix=".plugin" + CXXFLAGS="$CXXFLAGS -fpic" + LIBS="$LIBS -ldl" _mak_plugins=' PLUGIN_EXTRA_DEPS = $(EXECUTABLE) -CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive POST_OBJS_FLAGS := -Wl,-no-whole-archive -LIBS += -ldl ' ;; linux*) _plugin_prefix="lib" _plugin_suffix=".so" + CXXFLAGS="$CXXFLAGS -fpic" + LIBS="$LIBS -ldl" _mak_plugins=' PLUGIN_EXTRA_DEPS = -CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive POST_OBJS_FLAGS := -Wl,-no-whole-archive -LIBS += -ldl ' ;; *mingw32*) @@ -2392,7 +2392,7 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im _elf_loader=yes DEFINES="$DEFINES -DMIPS_TARGET" _mak_plugins=' -LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T$(srcdir)/backends/plugins/ps2/main_prog.ld +LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc ' ;; @@ -2407,13 +2407,13 @@ PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/plugin.ld -lstdc++ -lc webos) _plugin_prefix="lib" _plugin_suffix=".so" + CXXFLAGS="$CXXFLAGS -fpic" + LIBS="$LIBS -ldl" _mak_plugins=' PLUGIN_EXTRA_DEPS = -CXXFLAGS += -fpic PLUGIN_LDFLAGS += -shared $(LDFLAGS) PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive POST_OBJS_FLAGS := -Wl,-no-whole-archive -LIBS += -ldl ' ;; *) From 2c8a9b0e7669df1914b8e01d347fef7e8776ef11 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 08:14:57 +0200 Subject: [PATCH 230/369] SWORD25: Avoid using strcoll --- engines/sword25/util/lua/luaconf.h | 8 -------- engines/sword25/util/lua/lvm.cpp | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/engines/sword25/util/lua/luaconf.h b/engines/sword25/util/lua/luaconf.h index 16cd6ba27f48..f3509e969b09 100644 --- a/engines/sword25/util/lua/luaconf.h +++ b/engines/sword25/util/lua/luaconf.h @@ -18,14 +18,6 @@ ** =================================================================== */ -#if defined(__ANDROID__) -/* Android is missing strcoll(). -** For more information, refer to: -** http://www.damonkohler.com/2008/12/lua-on-android.html -*/ -#define strcoll strcmp -#endif - /* @@ LUA_ANSI controls the use of non-ansi features. diff --git a/engines/sword25/util/lua/lvm.cpp b/engines/sword25/util/lua/lvm.cpp index ae70fe2645db..fb700c20a289 100644 --- a/engines/sword25/util/lua/lvm.cpp +++ b/engines/sword25/util/lua/lvm.cpp @@ -202,7 +202,7 @@ static int l_strcmp (const TString *ls, const TString *rs) { const char *r = getstr(rs); size_t lr = rs->tsv.len; for (;;) { - int temp = strcoll(l, r); + int temp = strcmp(l, r); if (temp != 0) return temp; else { /* strings are equal up to a `\0' */ size_t len = strlen(l); /* index of first `\0' in both strings */ From 2068bc1527369ee4468f178b745e9722ef9f695c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 08:22:36 +0200 Subject: [PATCH 231/369] SWORD25: Fix warning: double format, float arg on DC --- engines/sword25/util/lua/scummvm_file.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp index 659f5a36c22c..3c0377d0ee36 100644 --- a/engines/sword25/util/lua/scummvm_file.cpp +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -33,9 +33,9 @@ Sword25FileProxy::Sword25FileProxy(const Common::String &filename, const Common: } void Sword25FileProxy::setupConfigFile() { - float sfxVolume = ConfMan.hasKey("sfx_volume") ? 1.0 : 1.0 * ConfMan.getInt("sfx_volume") / 255.0; - float musicVolume = ConfMan.hasKey("music_volume") ? 0.5 : 1.0 * ConfMan.getInt("music_volume") / 255.0; - float speechVolume = ConfMan.hasKey("speech_volume") ? 1.0 : 1.0 * ConfMan.getInt("speech_volume") / 255.0; + double sfxVolume = ConfMan.hasKey("sfx_volume") ? 1.0 : 1.0 * ConfMan.getInt("sfx_volume") / 255.0; + double musicVolume = ConfMan.hasKey("music_volume") ? 0.5 : 1.0 * ConfMan.getInt("music_volume") / 255.0; + double speechVolume = ConfMan.hasKey("speech_volume") ? 1.0 : 1.0 * ConfMan.getInt("speech_volume") / 255.0; bool subtitles = ConfMan.hasKey("subtitles") ? true : ConfMan.getBool("subtitles"); _readData = Common::String::format( From a2f16d91552aa888ca3d6f8bbbf41aed3ce75874 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 08:22:46 +0200 Subject: [PATCH 232/369] SWORD25: Const correctness --- engines/sword25/script/luascript.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/script/luascript.cpp b/engines/sword25/script/luascript.cpp index 9c65c9948da2..9d394309e67b 100644 --- a/engines/sword25/script/luascript.cpp +++ b/engines/sword25/script/luascript.cpp @@ -177,7 +177,7 @@ bool LuaScriptEngine::executeFile(const Common::String &fileName) { } bool LuaScriptEngine::executeString(const Common::String &code) { - return executeBuffer((byte *)code.c_str(), code.size(), "???"); + return executeBuffer((const byte *)code.c_str(), code.size(), "???"); } namespace { From 7b51caedbaa3594736d8a4f28064de1b65816ca4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 08:25:28 +0200 Subject: [PATCH 233/369] ANDROID: Trying to fix the recent linker failures --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 736325926be3..c4536c02a91b 100755 --- a/configure +++ b/configure @@ -3105,7 +3105,7 @@ case $_backend in system_libs='' for lib in $LIBS; do case $lib in - -lz|-lm) + -lz|-lm|-ldl) system_libs="$system_libs $lib" ;; *) From 984f53ac14cb0124caab39aba3e712dfc49a8ef5 Mon Sep 17 00:00:00 2001 From: md5 Date: Thu, 26 May 2011 11:43:28 +0300 Subject: [PATCH 234/369] SWORD25 (LUA): Removed unused code for handling precompiled LUA scipts --- engines/sword25/module.mk | 2 - engines/sword25/util/lua/lapi.cpp | 16 +- engines/sword25/util/lua/ldo.cpp | 8 +- engines/sword25/util/lua/ldump.cpp | 164 ------------------- engines/sword25/util/lua/lundump.cpp | 225 --------------------------- engines/sword25/util/lua/lundump.h | 31 ---- 6 files changed, 7 insertions(+), 439 deletions(-) delete mode 100644 engines/sword25/util/lua/ldump.cpp delete mode 100644 engines/sword25/util/lua/lundump.cpp delete mode 100644 engines/sword25/util/lua/lundump.h diff --git a/engines/sword25/module.mk b/engines/sword25/module.mk index e87707d5a2cb..2a568f58565e 100644 --- a/engines/sword25/module.mk +++ b/engines/sword25/module.mk @@ -60,7 +60,6 @@ MODULE_OBJS := \ util/lua/ldblib.o \ util/lua/ldebug.o \ util/lua/ldo.o \ - util/lua/ldump.o \ util/lua/lfunc.o \ util/lua/lgc.o \ util/lua/linit.o \ @@ -79,7 +78,6 @@ MODULE_OBJS := \ util/lua/ltable.o \ util/lua/ltablib.o \ util/lua/ltm.o \ - util/lua/lundump.o \ util/lua/lvm.o \ util/lua/lzio.o \ util/lua/scummvm_file.o \ diff --git a/engines/sword25/util/lua/lapi.cpp b/engines/sword25/util/lua/lapi.cpp index b1118db36837..16f8460e39ec 100644 --- a/engines/sword25/util/lua/lapi.cpp +++ b/engines/sword25/util/lua/lapi.cpp @@ -26,9 +26,8 @@ #include "lstring.h" #include "ltable.h" #include "ltm.h" -#include "lundump.h" #include "lvm.h" - +#include "common/textconsole.h" const char lua_ident[] = @@ -876,17 +875,8 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { - int status; - TValue *o; - lua_lock(L); - api_checknelems(L, 1); - o = L->top - 1; - if (isLfunction(o)) - status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0); - else - status = 1; - lua_unlock(L); - return status; + error("lua_dump not supported: Handling of precompiled LUA scripts has been removed in ScummVM"); + return 1; // error } diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp index b699c5d8a758..bbcdf98b3d78 100644 --- a/engines/sword25/util/lua/ldo.cpp +++ b/engines/sword25/util/lua/ldo.cpp @@ -36,10 +36,9 @@ #include "lstring.h" #include "ltable.h" #include "ltm.h" -#include "lundump.h" #include "lvm.h" #include "lzio.h" - +#include "common/textconsole.h" @@ -514,8 +513,9 @@ static void f_parser (lua_State *L, void *ud) { struct SParser *p = cast(struct SParser *, ud); int c = luaZ_lookahead(p->z); luaC_checkGC(L); - tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, - &p->buff, p->name); + if (c == LUA_SIGNATURE[0]) + error("Handling of precompiled LUA scripts has been removed in ScummVM"); + tf = luaY_parser(L, p->z, &p->buff, p->name); cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); cl->l.p = tf; for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ diff --git a/engines/sword25/util/lua/ldump.cpp b/engines/sword25/util/lua/ldump.cpp deleted file mode 100644 index 3ce16542d631..000000000000 --- a/engines/sword25/util/lua/ldump.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* -** $Id$ -** save precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#include - -#define ldump_c -#define LUA_CORE - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lundump.h" - -typedef struct { - lua_State* L; - lua_Writer writer; - void* data; - int strip; - int status; -} DumpState; - -#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) -#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) - -static void DumpBlock(const void* b, size_t size, DumpState* D) -{ - if (D->status==0) - { - lua_unlock(D->L); - D->status=(*D->writer)(D->L,b,size,D->data); - lua_lock(D->L); - } -} - -static void DumpChar(int y, DumpState* D) -{ - char x=(char)y; - DumpVar(x,D); -} - -static void DumpInt(int x, DumpState* D) -{ - DumpVar(x,D); -} - -static void DumpNumber(lua_Number x, DumpState* D) -{ - DumpVar(x,D); -} - -static void DumpVector(const void* b, int n, size_t size, DumpState* D) -{ - DumpInt(n,D); - DumpMem(b,n,size,D); -} - -static void DumpString(const TString* s, DumpState* D) -{ - if (s==NULL || getstr(s)==NULL) - { - size_t size=0; - DumpVar(size,D); - } - else - { - size_t size=s->tsv.len+1; /* include trailing '\0' */ - DumpVar(size,D); - DumpBlock(getstr(s),size,D); - } -} - -#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D); - -static void DumpConstants(const Proto* f, DumpState* D) -{ - int i,n=f->sizek; - DumpInt(n,D); - for (i=0; ik[i]; - DumpChar(ttype(o),D); - switch (ttype(o)) - { - case LUA_TNIL: - break; - case LUA_TBOOLEAN: - DumpChar(bvalue(o),D); - break; - case LUA_TNUMBER: - DumpNumber(nvalue(o),D); - break; - case LUA_TSTRING: - DumpString(rawtsvalue(o),D); - break; - default: - lua_assert(0); /* cannot happen */ - break; - } - } - n=f->sizep; - DumpInt(n,D); - for (i=0; ip[i],f->source,D); -} - -static void DumpDebug(const Proto* f, DumpState* D) -{ - int i,n; - n= (D->strip) ? 0 : f->sizelineinfo; - DumpVector(f->lineinfo,n,sizeof(int),D); - n= (D->strip) ? 0 : f->sizelocvars; - DumpInt(n,D); - for (i=0; ilocvars[i].varname,D); - DumpInt(f->locvars[i].startpc,D); - DumpInt(f->locvars[i].endpc,D); - } - n= (D->strip) ? 0 : f->sizeupvalues; - DumpInt(n,D); - for (i=0; iupvalues[i],D); -} - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D) -{ - DumpString((f->source==p || D->strip) ? NULL : f->source,D); - DumpInt(f->linedefined,D); - DumpInt(f->lastlinedefined,D); - DumpChar(f->nups,D); - DumpChar(f->numparams,D); - DumpChar(f->is_vararg,D); - DumpChar(f->maxstacksize,D); - DumpCode(f,D); - DumpConstants(f,D); - DumpDebug(f,D); -} - -static void DumpHeader(DumpState* D) -{ - char h[LUAC_HEADERSIZE]; - luaU_header(h); - DumpBlock(h,LUAC_HEADERSIZE,D); -} - -/* -** dump Lua function as precompiled chunk -*/ -int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) -{ - DumpState D; - D.L=L; - D.writer=w; - D.data=data; - D.strip=strip; - D.status=0; - DumpHeader(&D); - DumpFunction(f,NULL,&D); - return D.status; -} diff --git a/engines/sword25/util/lua/lundump.cpp b/engines/sword25/util/lua/lundump.cpp deleted file mode 100644 index 4ffc623575b0..000000000000 --- a/engines/sword25/util/lua/lundump.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* -** $Id$ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#include - -#define lundump_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstring.h" -#include "lundump.h" -#include "lzio.h" - -typedef struct { - lua_State* L; - ZIO* Z; - Mbuffer* b; - const char* name; -} LoadState; - -#ifdef LUAC_TRUST_BINARIES -#define IF(c,s) -#define error(S,s) -#else -#define IF(c,s) if (c) error(S,s) - -static void error(LoadState* S, const char* why) -{ - luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); - luaD_throw(S->L,LUA_ERRSYNTAX); -} -#endif - -#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) -#define LoadByte(S) (lu_byte)LoadChar(S) -#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) -#define LoadVector(S,b,n,size) LoadMem(S,b,n,size) - -static void LoadBlock(LoadState* S, void* b, size_t size) -{ - size_t r=luaZ_read(S->Z,b,size); - UNUSED(r); - IF (r!=0, "unexpected end"); -} - -static int LoadChar(LoadState* S) -{ - char x; - LoadVar(S,x); - return x; -} - -static int LoadInt(LoadState* S) -{ - int x; - LoadVar(S,x); - IF (x<0, "bad integer"); - return x; -} - -static lua_Number LoadNumber(LoadState* S) -{ - lua_Number x; - LoadVar(S,x); - return x; -} - -static TString* LoadString(LoadState* S) -{ - size_t size; - LoadVar(S,size); - if (size==0) - return NULL; - else - { - char* s=luaZ_openspace(S->L,S->b,size); - LoadBlock(S,s,size); - return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ - } -} - -static void LoadCode(LoadState* S, Proto* f) -{ - int n=LoadInt(S); - f->code=luaM_newvector(S->L,n,Instruction); - f->sizecode=n; - LoadVector(S,f->code,n,sizeof(Instruction)); -} - -static Proto* LoadFunction(LoadState* S, TString* p); - -static void LoadConstants(LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->k=luaM_newvector(S->L,n,TValue); - f->sizek=n; - for (i=0; ik[i]); - for (i=0; ik[i]; - int t=LoadChar(S); - switch (t) - { - case LUA_TNIL: - setnilvalue(o); - break; - case LUA_TBOOLEAN: - setbvalue(o,LoadChar(S)); - break; - case LUA_TNUMBER: - setnvalue(o,LoadNumber(S)); - break; - case LUA_TSTRING: - setsvalue2n(S->L,o,LoadString(S)); - break; - default: - error(S,"bad constant"); - break; - } - } - n=LoadInt(S); - f->p=luaM_newvector(S->L,n,Proto*); - f->sizep=n; - for (i=0; ip[i]=NULL; - for (i=0; ip[i]=LoadFunction(S,f->source); -} - -static void LoadDebug(LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->lineinfo=luaM_newvector(S->L,n,int); - f->sizelineinfo=n; - LoadVector(S,f->lineinfo,n,sizeof(int)); - n=LoadInt(S); - f->locvars=luaM_newvector(S->L,n,LocVar); - f->sizelocvars=n; - for (i=0; ilocvars[i].varname=NULL; - for (i=0; ilocvars[i].varname=LoadString(S); - f->locvars[i].startpc=LoadInt(S); - f->locvars[i].endpc=LoadInt(S); - } - n=LoadInt(S); - f->upvalues=luaM_newvector(S->L,n,TString*); - f->sizeupvalues=n; - for (i=0; iupvalues[i]=NULL; - for (i=0; iupvalues[i]=LoadString(S); -} - -static Proto* LoadFunction(LoadState* S, TString* p) -{ - Proto* f=luaF_newproto(S->L); - setptvalue2s(S->L,S->L->top,f); incr_top(S->L); - f->source=LoadString(S); if (f->source==NULL) f->source=p; - f->linedefined=LoadInt(S); - f->lastlinedefined=LoadInt(S); - f->nups=LoadByte(S); - f->numparams=LoadByte(S); - f->is_vararg=LoadByte(S); - f->maxstacksize=LoadByte(S); - LoadCode(S,f); - LoadConstants(S,f); - LoadDebug(S,f); - IF (!luaG_checkcode(f), "bad code"); - S->L->top--; - return f; -} - -static void LoadHeader(LoadState* S) -{ - char h[LUAC_HEADERSIZE]; - char s[LUAC_HEADERSIZE]; - luaU_header(h); - LoadBlock(S,s,LUAC_HEADERSIZE); - IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); -} - -/* -** load precompiled chunk -*/ -Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) -{ - LoadState S; - if (*name=='@' || *name=='=') - S.name=name+1; - else if (*name==LUA_SIGNATURE[0]) - S.name="binary string"; - else - S.name=name; - S.L=L; - S.Z=Z; - S.b=buff; - LoadHeader(&S); - return LoadFunction(&S,luaS_newliteral(L,"=?")); -} - -/* -* make header -*/ -void luaU_header (char* h) -{ - int x=1; - memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); - h+=sizeof(LUA_SIGNATURE)-1; - *h++=(char)LUAC_VERSION; - *h++=(char)LUAC_FORMAT; - *h++=(char)*(char*)&x; /* endianness */ - *h++=(char)sizeof(int); - *h++=(char)sizeof(size_t); - *h++=(char)sizeof(Instruction); - *h++=(char)sizeof(lua_Number); - *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ -} diff --git a/engines/sword25/util/lua/lundump.h b/engines/sword25/util/lua/lundump.h deleted file mode 100644 index c293c56ce92e..000000000000 --- a/engines/sword25/util/lua/lundump.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** $Id$ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#ifndef lundump_h -#define lundump_h - -#include "lobject.h" -#include "lzio.h" - -/* load one chunk; from lundump.c */ -LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name); - -/* make header; from lundump.c */ -LUAI_FUNC void luaU_header (char* h); - -/* dump one chunk; from ldump.c */ -LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); - -/* for header of binary files -- this is Lua 5.1 */ -#define LUAC_VERSION 0x51 - -/* for header of binary files -- this is the official format */ -#define LUAC_FORMAT 0 - -/* size of header of binary files */ -#define LUAC_HEADERSIZE 12 - -#endif From d5050463d52ef396f4e91e7780424ed19dd79fd2 Mon Sep 17 00:00:00 2001 From: md5 Date: Thu, 26 May 2011 11:44:52 +0300 Subject: [PATCH 235/369] SWORD25: Removed the leftover libpng code --- engines/sword25/gfx/image/pngloader.cpp | 185 +------------------- engines/sword25/gfx/image/pngloader.h | 26 --- engines/sword25/gfx/image/renderedimage.cpp | 9 - engines/sword25/gfx/image/swimage.cpp | 8 - 4 files changed, 1 insertion(+), 227 deletions(-) diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/pngloader.cpp index 6f370d8861fe..921994052f1e 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/pngloader.cpp @@ -29,141 +29,15 @@ * */ -#ifndef USE_INTERNAL_PNG_DECODER -// Disable symbol overrides so that we can use png.h -#define FORBIDDEN_SYMBOL_ALLOW_ALL -#endif - #include "common/memstream.h" #include "sword25/gfx/image/image.h" #include "sword25/gfx/image/pngloader.h" -#ifndef USE_INTERNAL_PNG_DECODER -#include -#else #include "graphics/pixelformat.h" #include "graphics/png.h" -#endif namespace Sword25 { -#ifndef USE_INTERNAL_PNG_DECODER -static void png_user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { - const byte **ref = (const byte **)png_get_io_ptr(png_ptr); - memcpy(data, *ref, length); - *ref += length; -} - -static bool doIsCorrectImageFormat(const byte *fileDataPtr, uint fileSize) { - return (fileSize > 8) && png_check_sig(const_cast(fileDataPtr), 8); -} -#endif - -bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { -#ifndef USE_INTERNAL_PNG_DECODER - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - - int bitDepth; - int colorType; - int interlaceType; - int i; - - // Check for valid PNG signature - if (!doIsCorrectImageFormat(fileDataPtr, fileSize)) { - error("png_check_sig failed"); - } - - // Create both PNG structures - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) { - error("Could not create libpng read struct."); - } - - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) { - error("Could not create libpng info struct."); - } - - // Use alternative reading function - const byte **ref = &fileDataPtr; - png_set_read_fn(png_ptr, (void *)ref, png_user_read_data); - - // Read PNG header - png_read_info(png_ptr, info_ptr); - - // Read out PNG informations - - png_uint_32 w, h; - png_get_IHDR(png_ptr, info_ptr, &w, &h, &bitDepth, &colorType, &interlaceType, NULL, NULL); - width = w; - height = h; - - // Calculate pitch of output image - pitch = GraphicEngine::calcPitch(GraphicEngine::CF_ARGB32, width); - - // Allocate memory for the final image data. - // To keep memory framentation low this happens before allocating memory for temporary image data. - uncompressedDataPtr = new byte[pitch * height]; - if (!uncompressedDataPtr) { - error("Could not allocate memory for output image."); - } - - // Images of all color formates will be transformed into ARGB images - if (bitDepth == 16) - png_set_strip_16(png_ptr); - if (colorType == PNG_COLOR_TYPE_PALETTE) - png_set_expand(png_ptr); - if (bitDepth < 8) - png_set_expand(png_ptr); - if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_expand(png_ptr); - if (colorType == PNG_COLOR_TYPE_GRAY || - colorType == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb(png_ptr); - - png_set_bgr(png_ptr); - - if (colorType != PNG_COLOR_TYPE_RGB_ALPHA) - png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); - - // After the transformations have been registered, the image data is read again. - png_read_update_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, &w, &h, &bitDepth, &colorType, NULL, NULL, NULL); - width = w; - height = h; - - if (interlaceType == PNG_INTERLACE_NONE) { - // PNGs without interlacing can simply be read row by row. - for (i = 0; i < height; i++) { - png_read_row(png_ptr, uncompressedDataPtr + i * pitch, NULL); - } - } else { - // PNGs with interlacing require us to allocate an auxillary - // buffer with pointers to all row starts. - - // Allocate row pointer buffer - png_bytep *pRowPtr = new png_bytep[height]; - if (!pRowPtr) { - error("Could not allocate memory for row pointers."); - } - - // Initialize row pointers - for (i = 0; i < height; i++) - pRowPtr[i] = uncompressedDataPtr + i * pitch; - - // Read image data - png_read_image(png_ptr, pRowPtr); - - // Free row pointer buffer - delete[] pRowPtr; - } - - // Read additional data at the end. - png_read_end(png_ptr, NULL); - - // Destroy libpng structures - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); -#else +bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { Common::MemoryReadStream *fileStr = new Common::MemoryReadStream(fileDataPtr, fileSize, DisposeAfterUse::NO); Graphics::PNG *png = new Graphics::PNG(); if (!png->read(fileStr)) // the fileStr pointer, and thus pFileData will be deleted after this is done @@ -181,65 +55,8 @@ bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&unc delete pngSurface; delete png; -#endif // Signal success return true; } -bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { - return doDecodeImage(fileDataPtr, fileSize, uncompressedDataPtr, width, height, pitch); -} - -#ifndef USE_INTERNAL_PNG_DECODER -bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height) { - // Check for valid PNG signature - if (!doIsCorrectImageFormat(fileDataPtr, fileSize)) - return false; - - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - - // Create both PNG structures - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) { - error("Could not create libpng read struct."); - } - - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) { - error("Could not create libpng info struct."); - } - - // Use alternative reading function - const byte **ref = &fileDataPtr; - png_set_read_fn(png_ptr, (void *)ref, png_user_read_data); - - // Read PNG Header - png_read_info(png_ptr, info_ptr); - - // Read out PNG informations - int bitDepth; - int colorType; - png_uint_32 w, h; - png_get_IHDR(png_ptr, info_ptr, &w, &h, &bitDepth, &colorType, NULL, NULL, NULL); - - width = w; - height = h; - - // Destroy libpng structures - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - - return true; - -} - -bool PNGLoader::imageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height) { - return doImageProperties(fileDataPtr, fileSize, width, height); -} - -#else - // We don't need to read the image properties here... -#endif - - } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/pngloader.h b/engines/sword25/gfx/image/pngloader.h index 6b5f65ff5777..3f909315abd4 100644 --- a/engines/sword25/gfx/image/pngloader.h +++ b/engines/sword25/gfx/image/pngloader.h @@ -37,9 +37,6 @@ namespace Sword25 { -// Define to use ScummVM's PNG decoder, instead of libpng -#define USE_INTERNAL_PNG_DECODER - /** * Class for loading PNG files, and PNG data embedded into savegames. * @@ -49,11 +46,6 @@ class PNGLoader { protected: PNGLoader() {} // Protected constructor to prevent instances - static bool doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch); -#ifndef USE_INTERNAL_PNG_DECODER - static bool doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height); -#endif - public: /** @@ -74,24 +66,6 @@ class PNGLoader { byte *&pUncompressedData, int &width, int &height, int &pitch); - -#ifndef USE_INTERNAL_PNG_DECODER - /** - * Extract the properties of an image. - * @param[in] fileDatePtr pointer to the image data - * @param[in] fileSize size of the image data in bytes - * @param[out] width if successful, this is set to the width of the image - * @param[out] height if successful, this is set to the height of the image - * @return returns true if extraction of the properties was successful, false in case of an error - * - * @remark This function does not free the image buffer passed to it, - * it is the callers responsibility to do so. - */ - static bool imageProperties(const byte *fileDatePtr, uint fileSize, - int &width, - int &height); -#endif - }; } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index 395d29d81ac1..476d293779b0 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -145,15 +145,6 @@ RenderedImage::RenderedImage(const Common::String &filename, bool &result) : return; } -#ifndef USE_INTERNAL_PNG_DECODER - // Determine image properties - if (!PNGLoader::imageProperties(pFileData, fileSize, _width, _height)) { - error("Could not read image properties."); - delete[] pFileData; - return; - } -#endif - // Uncompress the image int pitch; if (isPNG) diff --git a/engines/sword25/gfx/image/swimage.cpp b/engines/sword25/gfx/image/swimage.cpp index 92d47368b224..0978eb5ac18c 100644 --- a/engines/sword25/gfx/image/swimage.cpp +++ b/engines/sword25/gfx/image/swimage.cpp @@ -53,14 +53,6 @@ SWImage::SWImage(const Common::String &filename, bool &result) : return; } -#ifndef USE_INTERNAL_PNG_DECODER - // Determine image properties - if (!PNGLoader::imageProperties(pFileData, fileSize, _width, _height)) { - error("Could not read image properties."); - return; - } -#endif - // Uncompress the image int pitch; byte *pUncompressedData; From de8a44abfc221a4a173cbc1bab87f596379ab14c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 11:02:46 +0200 Subject: [PATCH 236/369] BUILD: Reorder configure some more --- configure | 251 +++++++++++++++++++++++++++--------------------------- 1 file changed, 127 insertions(+), 124 deletions(-) diff --git a/configure b/configure index c4536c02a91b..45b31216146c 100755 --- a/configure +++ b/configure @@ -134,21 +134,19 @@ _mpeg2=no _png=auto _theoradec=auto _fluidsynth=auto -_16bit=auto _opengl=auto _opengles=auto _readline=auto # Default option behaviour yes/no _debug_build=auto _release_build=auto +_verbose_build=no _text_console=no _mt32emu=yes _build_scalers=yes _build_hq_scalers=yes _enable_prof=no -_posix=no _global_constructors=no -_elf_loader=no # Default vkeybd/keymapper options _vkeybd=no _keymapper=no @@ -156,12 +154,9 @@ _keymapper=no _translation=yes # Default platform settings _backend=sdl -_endian=unknown -_need_memalign=yes -_have_x86=no -_arm_asm=no -_verbose_build=no +_16bit=auto _dynamic_modules=no +_elf_loader=no _plugins_default=static _plugin_prefix= _plugin_suffix= @@ -180,6 +175,15 @@ _sdlpath="$PATH" _nasmpath="$PATH" NASMFLAGS="" NASM="" +# The following variables are automatically detected, and should not +# be modified otherwise. Consider them read-only. +_posix=no +_endian=unknown +_need_memalign=yes +_have_x86=no +_arm_asm=no + + # Directories for installing ScummVM. # This list is closely based on what GNU autoconf does, @@ -1469,6 +1473,20 @@ fi echo $_endian; cc_check_clean tmp_endianness_check.cpp +case $_endian in + big) + add_line_to_config_h '#undef SCUMM_LITTLE_ENDIAN' + add_line_to_config_h '#define SCUMM_BIG_ENDIAN' + ;; + little) + add_line_to_config_h '#define SCUMM_LITTLE_ENDIAN' + add_line_to_config_h '#undef SCUMM_BIG_ENDIAN' + ;; + *) + exit 1 + ;; +esac + # # Determine a data type with the given length # @@ -1517,6 +1535,85 @@ TMPR="$?" echo "$type_4_byte" test $TMPR -eq 0 || exit 1 # check exit code of subshell +# +# Check whether memory alignment is required +# +# For some CPU types, unaligned memory access is either not supported at +# all (and so leads to a crash), requires a super-slow emulation via an +# exception handler, or just results in incorrect results. +# On the other hand, accessing data in a manner that works regardless of +# alignment can be a lot slower than regular access, so we don't want +# to use it if we don't have to. +# +# So we do the following: For CPU families where we know whether unaligned +# access is safe & fast, we enable / disable unaligned access accordingly. +# Otherwise, we just disable memory alignment. +# +# NOTE: In the past, for non-cross compiled builds, we would also run some code +# which would try to test whether unaligned access worked or not. But this test +# could not reliably determine whether unaligned access really worked in all +# situations (and across different implementations of the target CPU arch), nor +# whether it was fast (as opposed to slowly emulated by fault handlers). Hence, +# we do not use this approach anymore. +# +# NOTE: The only kinds of unaligned access we allow are for 2 byte and 4 +# byte loads / stores. No promises are made for bigger sizes, such as 8 +# or 16 byte loads, for which architectures may behave differently than +# for the smaller sizes. +echo_n "Alignment required... " +case $_host_cpu in + i[3-6]86 | x86_64 | ppc*) + # Unaligned access should work + _need_memalign=no + ;; + alpha* | arm* | bfin* | hp* | mips* | sh* | sparc* | ia64 | nv1*) + # Unaligned access is not supported or extremely slow. + _need_memalign=yes + ;; + *) + # Status of unaligned access is unknown, so assume the worst. + _need_memalign=yes + ;; +esac +echo "$_need_memalign" + +define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' + +# +# Check whether we can use x86 asm routines +# +echo_n "Compiling for x86... " +case $_host_cpu in + i386|i486|i586|i686) + _have_x86=yes + ;; + *) + _have_x86=no + ;; +esac +echo "$_have_x86" +define_in_config_h_if_yes $_have_x86 'HAVE_X86' + +# +# Check whether to use optimized ARM asm +# +echo_n "Compiling for ARM... " +case $_host_cpu in + arm*) + _arm_asm=yes + ;; + *) + _arm_asm=no + ;; +esac +echo "$_arm_asm" +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM' +define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM' + + # # Determine build settings # @@ -1715,35 +1812,6 @@ case $_host_os in ;; esac -# -# Determine whether host is POSIX compliant, or at least POSIX -# compatible enough to support our POSIX code (including dlsym(), -# mkdir() and some other APIs). -# -# TODO: Instead of basing this on the host name, we should really base -# this on the presence of features (such as the dlsym and mkdir APIs). -# -echo_n "Checking if host is POSIX compliant... " -case $_host_os in - amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | psp | wii | wince) - ;; - android | beos* | bsd* | darwin* | freebsd* | gph-linux | haiku* | hpux* | iphone | irix* | linux* | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos) - _posix=yes - ;; - os2-emx*) - _posix=yes # FIXME: Really??? - ;; - *) - # given this is a shell script, we might assume some type of posix. - # However, the host system might be a totally different one, so - # we can assume nothing about it. - # Indeed, as mentioned further above, we really should test for the - # presences of relevant APIs on the host anyway... - _posix=no - ;; -esac -echo $_posix - if test -n "$_host"; then # Cross-compiling mode - add your target here if needed echo "Cross-compiling to $_host" @@ -2058,50 +2126,6 @@ if test -n "$_host"; then esac fi -# -# Check whether memory alignment is required -# -# For some CPU types, unaligned memory access is either not supported at -# all (and so leads to a crash), requires a super-slow emulation via an -# exception handler, or just results in incorrect results. -# On the other hand, accessing data in a manner that works regardless of -# alignment can be a lot slower than regular access, so we don't want -# to use it if we don't have to. -# -# So we do the following: For CPU families where we know whether unaligned -# access is safe & fast, we enable / disable unaligned access accordingly. -# Otherwise, we just disable memory alignment. -# -# NOTE: In the past, for non-cross compiled builds, we would also run some code -# which would try to test whether unaligned access worked or not. But this test -# could not reliably determine whether unaligned access really worked in all -# situations (and across different implementations of the target CPU arch), nor -# whether it was fast (as opposed to slowly emulated by fault handlers). Hence, -# we do not use this approach anymore. -# -# NOTE: The only kinds of unaligned access we allow are for 2 byte and 4 -# byte loads / stores. No promises are made for bigger sizes, such as 8 -# or 16 byte loads, for which architectures may behave differently than -# for the smaller sizes. -echo_n "Alignment required... " -case $_host_cpu in - i[3-6]86 | x86_64 | ppc*) - # Unaligned access should work - _need_memalign=no - ;; - alpha* | arm* | bfin* | hp* | mips* | sh* | sparc* | ia64 | nv1*) - # Unaligned access is not supported or extremely slow. - _need_memalign=yes - ;; - *) - # Status of unaligned access is unknown, so assume the worst. - _need_memalign=yes - ;; -esac -echo "$_need_memalign" - -define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' - # # Backend related stuff # @@ -2238,21 +2262,34 @@ esac # -# Add the results of the above checks to config.h +# Determine whether host is POSIX compliant, or at least POSIX +# compatible enough to support our POSIX code (including dlsym(), +# mkdir() and some other APIs). +# +# TODO: Instead of basing this on the host name, we should really base +# this on the presence of features (such as the dlsym and mkdir APIs). # -case $_endian in - big) - add_line_to_config_h '#undef SCUMM_LITTLE_ENDIAN' - add_line_to_config_h '#define SCUMM_BIG_ENDIAN' +echo_n "Checking if host is POSIX compliant... " +case $_host_os in + amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | psp | wii | wince) + _posix=no ;; - little) - add_line_to_config_h '#define SCUMM_LITTLE_ENDIAN' - add_line_to_config_h '#undef SCUMM_BIG_ENDIAN' + android | beos* | bsd* | darwin* | freebsd* | gph-linux | haiku* | hpux* | iphone | irix* | linux* | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos) + _posix=yes + ;; + os2-emx*) + _posix=yes # FIXME: Really??? ;; *) - exit 1 + # given this is a shell script, we might assume some type of posix. + # However, the host system might be a totally different one, so + # we can assume nothing about it. + # Indeed, as mentioned further above, we really should test for the + # presences of relevant APIs on the host anyway... + _posix=no ;; esac +echo $_posix if test "$_posix" = yes ; then DEFINES="$DEFINES -DPOSIX" @@ -2899,40 +2936,6 @@ define_in_config_if_yes "$_opengl" "USE_OPENGL" define_in_config_if_yes "$_opengles" "USE_GLES" -# -# Check whether we can use x86 asm routines -# -echo_n "Compiling for x86... " -case $_host_cpu in - i386|i486|i586|i686) - _have_x86=yes - ;; - *) - _have_x86=no - ;; -esac -echo "$_have_x86" -define_in_config_h_if_yes $_have_x86 'HAVE_X86' - -# -# Check whether to use optimized ARM asm -# -echo_n "Compiling for ARM... " -case $_host_cpu in - arm*) - _arm_asm=yes - ;; - *) - _arm_asm=no - ;; -esac -echo "$_arm_asm" -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM' - # # Check for nasm # From a654115f1a9a1497ee7d73a3c861e4f37ab1e081 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 11:03:00 +0200 Subject: [PATCH 237/369] BUILD: Make endianess check stricter --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 45b31216146c..907323282396 100755 --- a/configure +++ b/configure @@ -1467,7 +1467,7 @@ EOF $CXX $CXXFLAGS -c -o $TMPO.o tmp_endianness_check.cpp if strings $TMPO.o | grep BIGenDianSyS >/dev/null; then _endian=big -else +elif strings $TMPO.o | grep LiTTleEnDian >/dev/null; then _endian=little fi echo $_endian; From 62c026d3b6a17ab3e7634cf3d4e5b63bbf0aa7eb Mon Sep 17 00:00:00 2001 From: md5 Date: Thu, 26 May 2011 12:29:51 +0300 Subject: [PATCH 238/369] SWORD25: Merged the PNG and thumbnail decoding code into a common class --- .../image/{pngloader.cpp => imgloader.cpp} | 27 +++++++++++++++-- .../gfx/image/{pngloader.h => imgloader.h} | 15 ++++++---- engines/sword25/gfx/image/renderedimage.cpp | 30 ++----------------- engines/sword25/gfx/image/swimage.cpp | 4 +-- 4 files changed, 40 insertions(+), 36 deletions(-) rename engines/sword25/gfx/image/{pngloader.cpp => imgloader.cpp} (68%) rename engines/sword25/gfx/image/{pngloader.h => imgloader.h} (84%) diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/imgloader.cpp similarity index 68% rename from engines/sword25/gfx/image/pngloader.cpp rename to engines/sword25/gfx/image/imgloader.cpp index 921994052f1e..1df0fba70c61 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/imgloader.cpp @@ -31,13 +31,13 @@ #include "common/memstream.h" #include "sword25/gfx/image/image.h" -#include "sword25/gfx/image/pngloader.h" +#include "sword25/gfx/image/imgloader.h" #include "graphics/pixelformat.h" #include "graphics/png.h" namespace Sword25 { -bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { +bool ImgLoader::decodePNGImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { Common::MemoryReadStream *fileStr = new Common::MemoryReadStream(fileDataPtr, fileSize, DisposeAfterUse::NO); Graphics::PNG *png = new Graphics::PNG(); if (!png->read(fileStr)) // the fileStr pointer, and thus pFileData will be deleted after this is done @@ -59,4 +59,27 @@ bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncom return true; } +bool ImgLoader::decodeThumbnailImage(const byte *pFileData, uint fileSize, byte *&pUncompressedData, int &width, int &height, int &pitch) { + const byte *src = pFileData + 4; // skip header + width = READ_LE_UINT16(src); src += 2; + height = READ_LE_UINT16(src); src += 2; + src++; // version, ignored for now + pitch = width * 4; + + uint32 totalSize = pitch * height; + pUncompressedData = new byte[totalSize]; + uint32 *dst = (uint32 *)pUncompressedData; // treat as uint32, for pixelformat output + const Graphics::PixelFormat format = Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24); + byte r, g, b; + + for (uint32 i = 0; i < totalSize / 4; i++) { + r = *src++; + g = *src++; + b = *src++; + *dst++ = format.RGBToColor(r, g, b); + } + + return true; +} + } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/pngloader.h b/engines/sword25/gfx/image/imgloader.h similarity index 84% rename from engines/sword25/gfx/image/pngloader.h rename to engines/sword25/gfx/image/imgloader.h index 3f909315abd4..735ab9203c09 100644 --- a/engines/sword25/gfx/image/pngloader.h +++ b/engines/sword25/gfx/image/imgloader.h @@ -29,8 +29,8 @@ * */ -#ifndef SWORD25_PNGLOADER2_H -#define SWORD25_PNGLOADER2_H +#ifndef SWORD25_IMGLOADER_H +#define SWORD25_IMGLOADER_H #include "sword25/kernel/common.h" #include "sword25/gfx/graphicengine.h" @@ -42,9 +42,9 @@ namespace Sword25 { * * Originally written by Malte Thiesen. */ -class PNGLoader { +class ImgLoader { protected: - PNGLoader() {} // Protected constructor to prevent instances + ImgLoader() {} // Protected constructor to prevent instances public: @@ -62,7 +62,12 @@ class PNGLoader { * @remark This function does not free the image buffer passed to it, * it is the callers responsibility to do so. */ - static bool decodeImage(const byte *pFileData, uint fileSize, + static bool decodePNGImage(const byte *pFileData, uint fileSize, + byte *&pUncompressedData, + int &width, int &height, + int &pitch); + + static bool decodeThumbnailImage(const byte *pFileData, uint fileSize, byte *&pUncompressedData, int &width, int &height, int &pitch); diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index 476d293779b0..a9c9de4f0c1d 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -35,7 +35,7 @@ #include "common/savefile.h" #include "sword25/package/packagemanager.h" -#include "sword25/gfx/image/pngloader.h" +#include "sword25/gfx/image/imgloader.h" #include "sword25/gfx/image/renderedimage.h" #include "common/system.h" @@ -93,30 +93,6 @@ static byte *readSavegameThumbnail(const Common::String &filename, uint &fileSiz return pFileData; } -// TODO: Move this method into a more generic image loading class, together with the PNG reading code -static bool decodeThumbnail(const byte *pFileData, uint fileSize, byte *&pUncompressedData, int &width, int &height, int &pitch) { - const byte *src = pFileData + 4; // skip header - width = READ_LE_UINT16(src); src += 2; - height = READ_LE_UINT16(src); src += 2; - src++; // version, ignored for now - pitch = width * 4; - - uint32 totalSize = pitch * height; - pUncompressedData = new byte[totalSize]; - uint32 *dst = (uint32 *)pUncompressedData; // treat as uint32, for pixelformat output - const Graphics::PixelFormat format = Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24); - byte r, g, b; - - for (uint32 i = 0; i < totalSize / 4; i++) { - r = *src++; - g = *src++; - b = *src++; - *dst++ = format.RGBToColor(r, g, b); - } - - return true; -} - RenderedImage::RenderedImage(const Common::String &filename, bool &result) : _data(0), _width(0), @@ -148,9 +124,9 @@ RenderedImage::RenderedImage(const Common::String &filename, bool &result) : // Uncompress the image int pitch; if (isPNG) - result = PNGLoader::decodeImage(pFileData, fileSize, _data, _width, _height, pitch); + result = ImgLoader::decodePNGImage(pFileData, fileSize, _data, _width, _height, pitch); else - result = decodeThumbnail(pFileData, fileSize, _data, _width, _height, pitch); + result = ImgLoader::decodeThumbnailImage(pFileData, fileSize, _data, _width, _height, pitch); if (!result) { error("Could not decode image."); diff --git a/engines/sword25/gfx/image/swimage.cpp b/engines/sword25/gfx/image/swimage.cpp index 0978eb5ac18c..0b9cc11df2e2 100644 --- a/engines/sword25/gfx/image/swimage.cpp +++ b/engines/sword25/gfx/image/swimage.cpp @@ -30,7 +30,7 @@ */ #include "sword25/package/packagemanager.h" -#include "sword25/gfx/image/pngloader.h" +#include "sword25/gfx/image/imgloader.h" #include "sword25/gfx/image/swimage.h" namespace Sword25 { @@ -56,7 +56,7 @@ SWImage::SWImage(const Common::String &filename, bool &result) : // Uncompress the image int pitch; byte *pUncompressedData; - if (!PNGLoader::decodeImage(pFileData, fileSize, pUncompressedData, _width, _height, pitch)) { + if (!ImgLoader::decodePNGImage(pFileData, fileSize, pUncompressedData, _width, _height, pitch)) { error("Could not decode image."); return; } From 86563d00093fc1791b94489d476600f0de50ad4c Mon Sep 17 00:00:00 2001 From: md5 Date: Thu, 26 May 2011 12:34:22 +0300 Subject: [PATCH 239/369] SWORD25: Committed changes to module.mk which were forgotten in my previous commit --- engines/sword25/module.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword25/module.mk b/engines/sword25/module.mk index 2a568f58565e..302120c5005e 100644 --- a/engines/sword25/module.mk +++ b/engines/sword25/module.mk @@ -24,7 +24,7 @@ MODULE_OBJS := \ gfx/text.o \ gfx/timedrenderobject.o \ gfx/image/art.o \ - gfx/image/pngloader.o \ + gfx/image/imgloader.o \ gfx/image/renderedimage.o \ gfx/image/swimage.o \ gfx/image/vectorimage.o \ From 7b03a6e604f154dbe23a5b927a4be01aaa28248d Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Thu, 26 May 2011 13:20:06 +0200 Subject: [PATCH 240/369] SWORD25: Fix making multiple saves at the same time. This adds a missing seek. Thanks to [md5] for guessing the cause. --- engines/sword25/kernel/persistenceservice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sword25/kernel/persistenceservice.cpp b/engines/sword25/kernel/persistenceservice.cpp index 432950271077..17e9199b5ca9 100644 --- a/engines/sword25/kernel/persistenceservice.cpp +++ b/engines/sword25/kernel/persistenceservice.cpp @@ -301,6 +301,7 @@ bool PersistenceService::saveGame(uint slotID, const Common::String &screenshotF if (thumbnail) { byte *buffer = new byte[FILE_COPY_BUFFER_SIZE]; + thumbnail->seek(0, SEEK_SET); while (!thumbnail->eos()) { int bytesRead = thumbnail->read(&buffer[0], FILE_COPY_BUFFER_SIZE); file->write(&buffer[0], bytesRead); From 09ba2ad438d1316792861b25e68e19594eb26c7f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 13:29:09 +0200 Subject: [PATCH 241/369] DC: Don't set a lib search path for plugins Plugins may not rely on external libs, so there is no point in specifying a custom library search path for them. --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 907323282396..00679c9a22e6 100755 --- a/configure +++ b/configure @@ -2349,7 +2349,7 @@ POST_OBJS_FLAGS := _plugin_suffix=".plg" _mak_plugins=' PLUGIN_EXTRA_DEPS = $(abspath $(srcdir)/backends/platform/dc/plugin.x $(srcdir)/backends/platform/dc/plugin.syms) $(EXECUTABLE) backends/platform/dc/plugin_head.o -PLUGIN_LDFLAGS = -ml -m4-single-only -nostartfiles -Wl,-q,-T$(srcdir)/backends/platform/dc/plugin.x,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/platform/dc/plugin.syms -L$(ronindir)/lib backends/platform/dc/plugin_head.o +PLUGIN_LDFLAGS = -ml -m4-single-only -nostartfiles -Wl,-q,-T$(srcdir)/backends/platform/dc/plugin.x,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/platform/dc/plugin.syms backends/platform/dc/plugin_head.o PRE_OBJS_FLAGS := -Wl,--whole-archive POST_OBJS_FLAGS := -Wl,--no-whole-archive ' From a010884c9bfb230da1448d2598011dc68e9efb22 Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 27 May 2011 02:31:03 +0300 Subject: [PATCH 242/369] SCI: Fixed bug #3306417 - "LAURA BOW 2: segmentation fault while talking to Dr. Myklos" --- engines/sci/engine/kstring.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index c3f2b4dee215..add5b7b52dbe 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -66,8 +66,24 @@ reg_t kStrCpy(EngineState *s, int argc, reg_t *argv) { s->_segMan->strncpy(argv[0], argv[1], length); else s->_segMan->memcpy(argv[0], argv[1], -length); - } else + } else { + if (g_sci->getGameId() == GID_LAURABOW2 && g_sci->getLanguage() == Common::DE_DEU && + s->currentRoomNumber() == 360) { + // One of the game texts in LB2 German contains loads of spaces in + // its end. We trim the text here, otherwise the graphics code will + // attempt to draw a very large window (larger than the screen) to + // show the text, and crash. + // Fixes bug #3306417. + SegmentRef src = s->_segMan->dereference(argv[1]); + if (src.maxSize == 7992) { // the problematic resource. Trim it. + Common::String text = s->_segMan->getString(argv[1]); + text.trim(); + s->_segMan->strcpy(argv[1], text.c_str()); + } + } + s->_segMan->strcpy(argv[0], argv[1]); + } return argv[0]; } From 28b7cf71a98981b6d77598aca026572ba32ee1b4 Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 27 May 2011 02:47:48 +0300 Subject: [PATCH 243/369] SCI: Added a workaround for bug #3308087 - "SCI: SQ1VGA - Engine Abort Upon Loading Ulence Flats Save" --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index aba2e66effb0..fa25b02a8f98 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -213,6 +213,7 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_QFG3, -1, 47, 0, "barterWin", "open", 0x1426, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251 { GID_QFG3, -1, 47, 0, "barterIcon", "show", 0x135c, 0, { WORKAROUND_IGNORE, 0 } }, // sometimes when talking with a vendor that can be bartered with, the wrong local variable is checked and the variable contents are wrong - bug #3292251 { GID_SQ1, -1, 700, 0, "arcadaRegion", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restoring in some rooms of the arcada (right at the start) + { GID_SQ1, 44, 44, 0, "spinDone", "changeState",0x13b0, 0, { WORKAROUND_IGNORE, 0 } }, // restoring a game at the slot machine in Ulence Flats (bug #3308087) { GID_SQ4, 397, 0, 0, "", "export 12", -1, 0, { WORKAROUND_IGNORE, 0 } }, // FLOPPY: when going into the computer store (bug #3044044) { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // CD: clicking on catalog in roboter sale - a parameter is an object { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // CD: ordering connector in roboter sale - a parameter is an object From 48140a012d69d76de5ae80de7ca926e71c39cd03 Mon Sep 17 00:00:00 2001 From: md5 Date: Fri, 27 May 2011 03:06:06 +0300 Subject: [PATCH 244/369] SCI: Don't attempt to modify null/disposed objects. These cases occur usually because of script bugs. Fixes script bug #3303802 - "SCI: PQ1VGA - Crash at the jail" --- engines/sci/engine/vm.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 499574957ef5..af34e6d924c5 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -297,6 +297,13 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (argc > 0x800) // More arguments than the stack could possibly accomodate for error("send_selector(): More than 0x800 arguments to function call"); + if (send_obj.isNull()) { + warning("Attempt to invoke a selector of a null/disposed object. Ignoring call"); + framesize -= (2 + argc); + argp += argc + 1; + continue; + } + SelectorType selectorType = lookupSelector(s->_segMan, send_obj, selector, &varp, &funcp); if (selectorType == kSelectorNone) error("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj)); From fb4bdae4c7e0b49dabd08cd281a5542292032bbe Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 27 May 2011 19:08:36 +1000 Subject: [PATCH 245/369] TSAGE: Bugfix for using lift after restoring a savegame in scene #2320 --- engines/tsage/ringworld_scenes3.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 8a1e103e11cb..4d2225eb1b5a 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -5770,6 +5770,14 @@ Scene2320::Scene2320() : _hotspot4(0, CURSOR_LOOK, 2320, 14, LIST_END), _hotspot13(0, CURSOR_LOOK, 2320, 12, LIST_END) { + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, 10); + _area4._pt = Common::Point(237, 77); } void Scene2320::postInit(SceneObjectList *OwnerList) { @@ -5822,15 +5830,6 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _globals->_sceneItems.push_back(&_hotspot8); } - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, 10); - _area4._pt = Common::Point(237, 77); - if (_globals->getFlag(43)) { _hotspot11.postInit(); _hotspot11.setVisage(2705); From 6072f976413428d4ee9f72d0a23c8ef302a2fb99 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 27 May 2011 19:14:04 +1000 Subject: [PATCH 246/369] TSAGE: Bugfix for saving game in scene #4025 --- engines/tsage/ringworld_scenes5.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index fc7362c38076..afab92097c94 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -1458,7 +1458,7 @@ void Scene4025::Hole::doAction(int action) { void Scene4025::Peg::synchronize(Serializer &s) { SceneObject::synchronize(s); s.syncAsSint16LE(_field88); - SYNC_POINTER(_armStrip); + s.syncAsSint16LE(_armStrip); } void Scene4025::Peg::doAction(int action) { From d50c6277e41a5280e5fe02015d497d2d29603aa9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 27 May 2011 19:28:31 +1000 Subject: [PATCH 247/369] TSAGE: Bugfix for loading savegames directly from the launcher --- engines/tsage/core.cpp | 1 + engines/tsage/ringworld_logic.cpp | 8 ++++++-- engines/tsage/scenes.cpp | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 7534abdec79d..8c1bd2fd3992 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -21,6 +21,7 @@ */ #include "common/system.h" +#include "common/config-manager.h" #include "engines/engine.h" #include "graphics/palette.h" #include "tsage/tsage.h" diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 2141fcce5adc..3f68e4673b1f 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1334,8 +1334,12 @@ void RingworldGame::start() { RING_INVENTORY._scanner._sceneNumber = 1; RING_INVENTORY._ring._sceneNumber = 1; - // Switch to the title screen - _globals->_sceneManager.setNewScene(1000); + + if (ConfMan.hasKey("save_slot")) + _globals->_sceneHandler._loadGameSlot = ConfMan.getInt("save_slot"); + else + // Switch to the title screen + _globals->_sceneManager.setNewScene(1000); _globals->_events.showCursor(); } diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 11308e6c4b27..d9a983cb5276 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -227,6 +227,11 @@ void SceneManager::setBgOffset(const Common::Point &pt, int loadCount) { void SceneManager::listenerSynchronize(Serializer &s) { s.validate("SceneManager"); + if (s.isLoading() && !_globals->_sceneManager._scene) + // Loading a savegame straight from the launcher, so instantiate a blank placeholder scene + // in order for the savegame loading to work correctly + _globals->_sceneManager._scene = new Scene(); + _altSceneObjects.synchronize(s); s.syncAsSint32LE(_sceneNumber); s.syncAsUint16LE(_globals->_sceneManager._scene->_activeScreenNumber); From ff62a6050aedca96e69cb284c5406833e59ca588 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Fri, 27 May 2011 13:15:57 +0200 Subject: [PATCH 248/369] Revert "SCI: Don't attempt to modify null/disposed objects." This fix for bug #3303802 is a potential cause of unreproducible bugs in all SCI games that taint savegames. This reverts commit 48140a012d69d76de5ae80de7ca926e71c39cd03. --- engines/sci/engine/vm.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index af34e6d924c5..499574957ef5 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -297,13 +297,6 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (argc > 0x800) // More arguments than the stack could possibly accomodate for error("send_selector(): More than 0x800 arguments to function call"); - if (send_obj.isNull()) { - warning("Attempt to invoke a selector of a null/disposed object. Ignoring call"); - framesize -= (2 + argc); - argp += argc + 1; - continue; - } - SelectorType selectorType = lookupSelector(s->_segMan, send_obj, selector, &varp, &funcp); if (selectorType == kSelectorNone) error("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj)); From cb990e68a170f354a7e3e2db3be05e0a2ce46a04 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Fri, 27 May 2011 17:34:43 +0200 Subject: [PATCH 249/369] SCI: Fix access to variables (gc_interval etc.) from the console --- engines/sci/console.cpp | 3 +++ engines/sci/sci.cpp | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e6b5c3c1d41b..ac87b3f6f683 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -74,6 +74,9 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV Console::Console(SciEngine *engine) : GUI::Debugger(), _engine(engine), _debugState(engine->_debugState) { + assert(_engine); + assert(_engine->_gamestate); + // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); DVar_Register("gc_interval", &engine->_gamestate->scriptGCInterval, DVAR_INT, 0); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index cf46d4138286..cc9042ceb7d3 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -213,8 +213,6 @@ Common::Error SciEngine::run() { _gfxScreen = new GfxScreen(_resMan); _gfxScreen->enableUndithering(ConfMan.getBool("disable_dithering")); - // Create debugger console. It requires GFX to be initialized - _console = new Console(this); _kernel = new Kernel(_resMan, segMan); _features = new GameFeatures(segMan, _kernel); @@ -227,6 +225,9 @@ Common::Error SciEngine::run() { _gamestate = new EngineState(segMan); _eventMan = new EventManager(_resMan->detectFontExtended()); + // Create debugger console. It requires GFX and _gamestate to be initialized + _console = new Console(this); + // The game needs to be initialized before the graphics system is initialized, as // the graphics code checks parts of the seg manager upon initialization (e.g. for // the presence of the fastCast object) From edbc712a0fd0c2486b5e8205dc970f1b299b0c5e Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 27 May 2011 20:53:05 +0200 Subject: [PATCH 250/369] TSAGE: Fix (second) bug "Scene 2100: If you sit down at Quinn's console and then get back up again, his walk animation gets screwed" --- engines/tsage/ringworld_scenes3.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 4d2225eb1b5a..c449d0132a93 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -655,6 +655,7 @@ void Scene2100::Action4::signal() { } void Scene2100::Action5::signal() { + // Quinn enters the cokpit after Seeker decided to enter the cave alone Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -1416,6 +1417,7 @@ void Scene2100::Hotspot10::doAction(int action) { } else if (_globals->getFlag(13)) { SceneItem::display2(2100, 28); } else { + _globals->_player.disableControl(); scene->_sceneMode = 2101; scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL); } @@ -1499,6 +1501,7 @@ void Scene2100::Object2::doAction(int action) { } void Scene2100::Object3::doAction(int action) { + // Miranda Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; switch (action) { From 1d9a7886498fef5c45673b1b38153909f7f2d3fa Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 27 May 2011 21:39:55 +0200 Subject: [PATCH 251/369] TSAGE: Rename _field1800 in scene 2100 --- engines/tsage/ringworld_scenes3.cpp | 20 ++++++++++---------- engines/tsage/ringworld_scenes3.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index c449d0132a93..e11f1539e14c 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -488,11 +488,11 @@ void Scene2100::Action1::signal() { switch (_actionIndex++) { case 0: _globals->_player.disableControl(); - if (!scene->_field1800) + if (!scene->_sitFl) setDelay(1); else { setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); - scene->_field1800 = 0; + scene->_sitFl = 0; } break; case 1: { @@ -631,7 +631,7 @@ void Scene2100::Action4::signal() { switch (_actionIndex++) { case 0: _globals->_player.disableControl(); - if (!scene->_field1800) + if (!scene->_sitFl) setDelay(1); else setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); @@ -1410,7 +1410,7 @@ void Scene2100::Hotspot10::doAction(int action) { SceneItem::display2(2100, 13); break; case CURSOR_USE: - if (scene->_field1800) { + if (scene->_sitFl) { _globals->_player.disableControl(); scene->_sceneMode = 2102; scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL); @@ -1688,7 +1688,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _globals->_player._moveDiff.x = 4; _globals->_player.changeZoom(-1); _globals->_player.disableControl(); - _field1800 = 0; + _sitFl = 0; switch (_globals->_sceneManager._previousScene) { case 2120: @@ -1823,7 +1823,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _globals->_player.fixPriority(152); _globals->_player.setStrip(2); - _field1800 = 1; + _sitFl = 1; _object4.postInit(); _object4.setVisage(2102); @@ -1857,7 +1857,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _globals->_player.fixPriority(152); _globals->_player.setStrip(2); - _field1800 = 1; + _sitFl = 1; setAction(&_action16); } break; @@ -1931,12 +1931,12 @@ void Scene2100::stripCallback(int v) { void Scene2100::signal() { switch (_sceneMode) { case 2101: - _field1800 = 1; + _sitFl = 1; _globals->_player._uiEnabled = true; _globals->_events.setCursor(CURSOR_USE); break; case 2102: - _field1800 = 0; + _sitFl = 0; _globals->_player.enableControl(); break; case 2103: @@ -1963,7 +1963,7 @@ void Scene2100::signal() { void Scene2100::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() >= 3) - s.syncAsSint16LE(_field1800); + s.syncAsSint16LE(_sitFl); } /*-------------------------------------------------------------------------- diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld_scenes3.h index 3c3b90db5631..cc237a1f91e7 100644 --- a/engines/tsage/ringworld_scenes3.h +++ b/engines/tsage/ringworld_scenes3.h @@ -278,7 +278,7 @@ class Scene2100 : public Scene { Action15 _action15; Action16 _action16; Action17 _action17; - int _field1800; + int _sitFl; SceneArea _area1, _area2, _area3, _area4; Scene2100(); From a6fedd6034b9e1d3723bd7fcee170429e1a4afed Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Fri, 27 May 2011 21:44:41 +0200 Subject: [PATCH 252/369] TSAGE: Cosmetic tweaks to Scene::setZoomPercents. --- engines/tsage/scenes.cpp | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index d9a983cb5276..4625661b6241 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -463,32 +463,32 @@ void Scene::drawAltObjects() { } void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent) { - int var_6 = 0; + int currDiff = 0; int v = 0; while (v < yStart) _zoomPercents[v++] = minPercent; int diff1 = ABS(maxPercent - minPercent); int diff2 = ABS(yEnd - yStart); - int var_8 = MAX(diff1, diff2); - - while (var_8-- != 0) { - _zoomPercents[v] = minPercent; - if (diff2 <= diff1) { - ++minPercent; - var_6 += diff2; - if (var_6 >= diff1) { - var_6 -= diff1; - ++v; - } - } else { - ++v; - var_6 += diff1; - if (var_6 >= diff2) { - var_6 -= diff2; - ++minPercent; - } - } + int remainingDiff = MAX(diff1, diff2); + + while (remainingDiff-- != 0) { + _zoomPercents[v] = minPercent; + if (diff2 <= diff1) { + ++minPercent; + currDiff += diff2; + if (currDiff >= diff1) { + currDiff -= diff1; + ++v; + } + } else { + ++v; + currDiff += diff1; + if (currDiff >= diff2) { + currDiff -= diff2; + ++minPercent; + } + } } while (yEnd < 256) From f4b2f84c019b3c0f6f5e701119ff0fe292029693 Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 27 May 2011 22:11:00 +0200 Subject: [PATCH 253/369] TSAGE: Fix priority issue in scene 2100, in the lift --- engines/tsage/ringworld_scenes3.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index e11f1539e14c..b4c5628499d4 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1753,6 +1753,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action14); } else { _globals->_player.disableControl(); + _globals->_player.fixPriority(1); _globals->_player.setPosition(Common::Point(157, 56)); _sceneMode = 2104; From 67c73a25f05c8c14669f68a5c2558977ad49d8dc Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Fri, 27 May 2011 22:14:04 +0200 Subject: [PATCH 254/369] WINCE: Update of port-related README --- backends/platform/wince/README-WinCE.txt | 34 ++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index 5ea3437d18b3..c48d9ca9982e 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -1,5 +1,5 @@ ScummVM Windows CE FAQ -Last updated: 2011-05-25 +Last updated: 2011-05-27 Release version: 1.3.0 ------------------------------------------------------------------------ @@ -7,8 +7,32 @@ New in this version ------------------- 1.3.0: -This is the first official Windows CE release since 1.1.1, there are no other -port specific changes. +This is the first official Windows CE release since 1.1.1. + +The following new engines are now included (changes since last WinCE release): + - Draci Engine (Dragon History) + - Hugo Engine (Hugo Trilogy) + - Mohawk Engine (Myst, Riven, Living Book games & Where in Time is Carmen + Sandiego?) + - SCI Engine (Sierra SCI games, see main README for a list of supported games) + - Toon Engine (Toonstruck) + +Also, there are now 4 binaries in this distribution, a single executable +which contains all engines (for devices with enough memory) and 3 smaller +binaries which contain only some of the engines. The following lists all +executables and the engines they contain: + +scummvm.exe: + - all supported engines +scummvm1.exe: + - scumm, agi, cruise, draci, lure, queen, sky, sword1, tinsel, touche +scummvm2.exe: + - agos, cine, drascula, gob, groovie, kyra, made, parallaction, saga, + teenagent, tucker +scummvm3.exe: + - hugo, mohawk, sci, sword2, toon + +There are no other port specific changes. 1.2.1: (Note: No official 1.2.1 release) @@ -265,7 +289,7 @@ How do I play a game on a Smartphone device ? On non-stylus devices, the mouse cursor is emulated via a set of keys. The cursor will move faster if you keep the key down. You can tweak this -behavior in the configuration file described below. +behaviour in the configuration file described below. Here is the list of available actions for Smartphones: @@ -369,7 +393,7 @@ You can tweak these parameters to customize how the cursor is handled. * repeatTrigger int Number of milliseconds a key must be held to consider being repeated. * repeatX int Number of key repeat events before changing - horizontal cursor behavior. + horizontal cursor behaviour. * stepX1 int Horizontal cursor offset value when the key is not repeated. * stepX2 int Horizontal cursor offset value when the key From 625f6d3b0e04add1694be14eb44ee9aa3bd71fd8 Mon Sep 17 00:00:00 2001 From: CeRiAl Date: Fri, 27 May 2011 22:14:04 +0200 Subject: [PATCH 255/369] WINCE: Update of port-related README --- backends/platform/wince/README-WinCE.txt | 30 +++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index 6d3c66fda8f2..c48d9ca9982e 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -1,5 +1,5 @@ ScummVM Windows CE FAQ -Last updated: 2011-05-25 +Last updated: 2011-05-27 Release version: 1.3.0 ------------------------------------------------------------------------ @@ -7,8 +7,32 @@ New in this version ------------------- 1.3.0: -This is the first official Windows CE release since 1.1.1, there are no other -port specific changes. +This is the first official Windows CE release since 1.1.1. + +The following new engines are now included (changes since last WinCE release): + - Draci Engine (Dragon History) + - Hugo Engine (Hugo Trilogy) + - Mohawk Engine (Myst, Riven, Living Book games & Where in Time is Carmen + Sandiego?) + - SCI Engine (Sierra SCI games, see main README for a list of supported games) + - Toon Engine (Toonstruck) + +Also, there are now 4 binaries in this distribution, a single executable +which contains all engines (for devices with enough memory) and 3 smaller +binaries which contain only some of the engines. The following lists all +executables and the engines they contain: + +scummvm.exe: + - all supported engines +scummvm1.exe: + - scumm, agi, cruise, draci, lure, queen, sky, sword1, tinsel, touche +scummvm2.exe: + - agos, cine, drascula, gob, groovie, kyra, made, parallaction, saga, + teenagent, tucker +scummvm3.exe: + - hugo, mohawk, sci, sword2, toon + +There are no other port specific changes. 1.2.1: (Note: No official 1.2.1 release) From 6113724eb5eb3fac1bb421751451a2af8ac18abd Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 27 May 2011 23:30:55 +0200 Subject: [PATCH 256/369] TSAGE: Fix a sound glitch in scene 4150 --- engines/tsage/ringworld_scenes5.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index afab92097c94..4f1735141e87 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -3088,6 +3088,7 @@ void Scene4150::dispatch() { if (!_action && (_globals->_player._position.x >= 316)) { _globals->_soundHandler.proc1(NULL); + _soundHandler.proc1(NULL); _globals->_player.disableControl(); _sceneMode = 4152; setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); From daa69cce8b95e2d7dcf28c770191bc3924d0b5b7 Mon Sep 17 00:00:00 2001 From: strangerke Date: Fri, 27 May 2011 23:52:16 +0200 Subject: [PATCH 257/369] TSAGE: Add a workaround for the mouse hidden bug in scene 4150 (also present in the original) --- engines/tsage/ringworld_scenes5.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index 4f1735141e87..e55703993cd6 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -2712,6 +2712,10 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { setAction(&_action4); _globals->clearFlag(43); + } else { + // Workaround: In the original, the mouse is hidden when Quinn + // goes back to scene 4150 then to scene 4100. This enables everything. + _globals->_player.enableControl(); } _globals->_player.setPosition(Common::Point(252, 139)); From adc087c37e8c79ff78a4d60b6b32ea5628b66928 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 00:14:45 +0200 Subject: [PATCH 258/369] TSAGE: Fix bug in scene 2100 when Seeker is in the cave. (Thanks eriktorbjorn for pointing the reason of the problem) --- engines/tsage/ringworld_scenes3.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index b4c5628499d4..38a4afc0f77f 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1506,14 +1506,14 @@ void Scene2100::Object3::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (!_globals->getFlag(59)) + if (_globals->getFlag(59)) SceneItem::display2(2100, 34); else error("***I have no response."); break; case CURSOR_TALK: - if (!_globals->getFlag(59)) { + if (_globals->getFlag(59)) { _globals->_player.disableControl(); scene->_sceneMode = 2108; scene->setAction(&scene->_sequenceManager, scene, 2108, NULL); From 4b01303e296e35863681ec990ae8a4812606e558 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 01:05:48 +0200 Subject: [PATCH 259/369] TSAGE: Fix a couple of glitches in scene 5300 --- engines/tsage/ringworld_scenes6.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index 958c0ef9e2aa..b99ff71fa458 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -2068,6 +2068,7 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _globals->_player.disableControl(); if (_globals->getFlag(107) && _globals->getFlag(106)) { + _hotspot2.setVisage(2806); _hotspot2.postInit(); _hotspot2.setObjectWrapper(new SceneObjectWrapper()); _hotspot2.animate(ANIM_MODE_1, NULL); @@ -2175,7 +2176,7 @@ void Scene5300::signal() { setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL); break; case 5315: - _globals->_stripNum = 5315; + _globals->_stripNum = 5302; _globals->_sceneManager.changeScene(5100); break; } From 595728c8cae665fff075bd215a8794d0ad9a9275 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 02:08:19 +0200 Subject: [PATCH 260/369] TSAGE: Fix several bugs in scene 5300 --- engines/tsage/ringworld_scenes6.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index b99ff71fa458..bab9b168c0f1 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -1883,11 +1883,17 @@ void Scene5300::Hotspot2::doAction(int action) { _globals->_player.disableControl(); if (RING_INVENTORY._stasisBox._sceneNumber != 1) { + scene->_sceneMode = 5316; scene->setAction(&scene->_sequenceManager, scene, 5316, NULL); } else { _globals->setFlag(60); - scene->_sceneMode = _globals->getFlag(67) ? 5315 : 5347; - scene->setAction(&scene->_sequenceManager, scene, 5315, this); + if (_globals->getFlag(67)) { + scene->_sceneMode = 5315; + scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL); + } else { + scene->_sceneMode = 5347; + scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); + } } } break; From a7580aee6674fb67647f24bd851b2bd2b66c9bf8 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 07:21:38 +0200 Subject: [PATCH 261/369] TSAGE: Add specific initialization for ringworld CD, fixing the color of the buttons --- engines/tsage/globals.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index e38fb21237cf..e629396501b5 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -64,6 +64,13 @@ Globals::Globals() : _fontColors.background = 0; _fontColors.foreground = 0; _dialogCenter.y = 80; + } else if ((_vm->getGameID() == GType_Ringworld) && (_vm->getFeatures() & GF_CD)) { + _gfxFontNumber = 50; + _gfxColors.background = 53; + _gfxColors.foreground = 0; + _fontColors.background = 51; + _fontColors.foreground = 54; + warning("TODO: Check the 3 additional colors"); } else { _gfxFontNumber = 50; _gfxColors.background = 53; From 1bd2f50dee281a82627df464ae7532f4279c725c Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 07:59:34 +0200 Subject: [PATCH 262/369] TSAGE: Fix crash when restoring a game in scene 2100 --- engines/tsage/ringworld_scenes3.cpp | 35 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 38a4afc0f77f..dc6cd17cd790 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1530,15 +1530,23 @@ void Scene2100::Object3::doAction(int action) { /*--------------------------------------------------------------------------*/ Scene2100::Scene2100() : - _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), - _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), - _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), - _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), - _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), - _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), - _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), - _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { + _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), + _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), + _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), + _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), + _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), + _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), + _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), + _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, OBJECT_TRANSLATOR); + _area4._pt = Common::Point(237, 77); } void Scene2100::postInit(SceneObjectList *OwnerList) { @@ -1665,15 +1673,6 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { &_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot7, &_hotspot1, NULL); - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, OBJECT_TRANSLATOR); - _area4._pt = Common::Point(237, 77); - _globals->_player.postInit(); if (_globals->getFlag(13)) { _globals->_player.setVisage(2170); From e213ecc74f4d6bb0df2c40d93a5c53c6336ac99a Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 08:13:51 +0200 Subject: [PATCH 263/369] TSAGE: Fix similar issue in scene 2150 --- engines/tsage/ringworld_scenes3.cpp | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index dc6cd17cd790..568acf3a99a0 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1530,15 +1530,15 @@ void Scene2100::Object3::doAction(int action) { /*--------------------------------------------------------------------------*/ Scene2100::Scene2100() : - _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), - _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), - _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), - _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), - _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), - _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), - _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), - _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { + _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), + _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), + _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), + _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), + _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), + _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), + _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), + _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { _area1.setup(2153, 2, 1, 2100); _area1._pt = Common::Point(200, 31); _area2.setup(2153, 3, 1, 2150); @@ -2484,6 +2484,15 @@ Scene2150::Scene2150() : _hotspot11(0, CURSOR_LOOK, 2150, 12, LIST_END) { _rect1 = Rect(260, 70, 270, 77); _rect2 = Rect(222, 142, 252, 150); + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, 10); + _area4._pt = Common::Point(237, 77); + } void Scene2150::postInit(SceneObjectList *OwnerList) { @@ -2549,15 +2558,6 @@ void Scene2150::postInit(SceneObjectList *OwnerList) { _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL); - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, 10); - _area4._pt = Common::Point(237, 77); - switch (_globals->_sceneManager._previousScene) { case 2120: _globals->_soundHandler.startSound(160); From b5e6a3a5e90ec90136ef397abc1514dcaa733e9f Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 08:58:49 +0200 Subject: [PATCH 264/369] TSAGE: Add some comments, and a missing remove() in scene 2300 --- engines/tsage/ringworld_scenes3.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 568acf3a99a0..ff8530d5e5de 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -4376,6 +4376,7 @@ void Scene2280::synchronize(Serializer &s) { *--------------------------------------------------------------------------*/ void Scene2300::Action1::signal() { + // Quinn and Seeker Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -4446,6 +4447,7 @@ void Scene2300::Action1::signal() { break; case 8: _globals->_game->endGame(2300, 0); + remove(); break; case 9: if (scene->_hotspot5._mover) @@ -4518,6 +4520,7 @@ void Scene2300::Action1::signal() { } void Scene2300::Action2::signal() { + // Miranda tearing cables Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -4584,6 +4587,7 @@ void Scene2300::Action2::signal() { } void Scene2300::Action3::signal() { + // Stunned Miranda Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -4636,6 +4640,7 @@ void Scene2300::Action3::signal() { } void Scene2300::Action4::signal() { + // Ennemies coming Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -4674,6 +4679,7 @@ void Scene2300::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene2300::Hotspot5::doAction(int action) { + // Ennemies Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (action) { @@ -4696,6 +4702,7 @@ void Scene2300::Hotspot5::doAction(int action) { } void Scene2300::Hotspot7::doAction(int action) { + // Miranda Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; switch (action) { From 2aaeb19a2c77b624d15a19993781559557b0386f Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 09:22:29 +0200 Subject: [PATCH 265/369] TSAGE: Fix priority glitch in scene 4000 when climbing down the right chimney --- engines/tsage/ringworld_scenes5.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index e55703993cd6..8cdb0a46fb52 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -322,6 +322,7 @@ void Scene4000::Action7::signal() { } void Scene4000::Action8::signal() { + // Climb down right Chimney using a rope Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -335,7 +336,7 @@ void Scene4000::Action8::signal() { case 1: _globals->_player.setVisage(4008); _globals->_player.setStrip(5); - _globals->_player.setPriority(16); + _globals->_player.fixPriority(16); _globals->_player.setFrame(1); _globals->_player.setPosition(Common::Point(283, 52)); _globals->_player.animate(ANIM_MODE_5, this); From f51eaed5952ecb53ce9c780d05f04eb94e64b7e4 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 09:37:08 +0200 Subject: [PATCH 266/369] TSAGE: Fix 'Restart' button, when game is over --- engines/tsage/ringworld_logic.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 3f68e4673b1f..95c9da9fe714 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -1413,7 +1413,10 @@ void RingworldGame::endGame(int resNum, int lineNum) { // Savegames exist, so prompt for Restore/Restart bool breakFlag; do { - if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0 || _vm->shouldQuit()) { + if (_vm->shouldQuit()) { + breakFlag = true; + } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { + restart(); breakFlag = true; } else { handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); From 402fc4f950eb203e3c195b1cac7d0dcdabe10639 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 16:35:08 +0200 Subject: [PATCH 267/369] TSAGE: Fix an animation issue, and the transition between scene 5300 and 5100 (Seeker waking up and leaving) --- engines/tsage/ringworld_scenes6.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index bab9b168c0f1..1a848719efff 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -1744,6 +1744,7 @@ void Scene5200::dispatch() { *--------------------------------------------------------------------------*/ void Scene5300::Action1::signal() { + // Seeker waking up Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -1777,7 +1778,8 @@ void Scene5300::Action1::signal() { _globals->_player.enableControl(); remove(); } else { - _globals->getFlag(60); + _globals->setFlag(60); + scene->_hotspot2._numFrames = 10; if (_globals->getFlag(67)) { scene->_sceneMode = 5310; @@ -1855,8 +1857,8 @@ void Scene5300::Hotspot1::doAction(int action) { break; } } - void Scene5300::Hotspot2::doAction(int action) { + // Seeker Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; switch (action) { @@ -1930,6 +1932,7 @@ void Scene5300::Hotspot2::doAction(int action) { } void Scene5300::Hotspot5::doAction(int action) { + // Sharp bone Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; switch (action) { From f38bc65be50dc7e778e1bf3e8707eb8dc9523d79 Mon Sep 17 00:00:00 2001 From: strangerke Date: Sat, 28 May 2011 23:33:50 +0200 Subject: [PATCH 268/369] TSAGE: Fix a glitch in scene 5100, add some comments --- engines/tsage/ringworld_scenes6.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index 1a848719efff..6c4b62ccd739 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -712,6 +712,7 @@ void Scene5100::Action2::signal() { } void Scene5100::Action3::signal() { + // Quinns shots flesheater Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -746,7 +747,7 @@ void Scene5100::Action3::signal() { scene->_hotspot2.setAction(NULL); scene->_hotspot3.setStrip2(1); - ADD_PLAYER_MOVER_THIS(scene->_hotspot3, 1200, 100); + ADD_PLAYER_MOVER_NULL(scene->_hotspot3, 1200, 100); } else { scene->_hotspot3.setVisage(5130); scene->_hotspot3._strip = 1; @@ -807,6 +808,7 @@ void Scene5100::Action4::signal() { } void Scene5100::Action5::signal() { + // Quinns forgot the statis box in the throne room, and goes back Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -943,6 +945,7 @@ void Scene5100::Hotspot9::doAction(int action) { } void Scene5100::Hotspot17::doAction(int action) { + // Rock blocking pit entrance Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; switch (action) { From 187ecdd54f94026dd47b959050295f10faa65bb0 Mon Sep 17 00:00:00 2001 From: athrxx Date: Sat, 21 May 2011 12:54:08 +0200 Subject: [PATCH 269/369] KYRA: remove useless mutex from sound_towns --- engines/kyra/sound_intern.h | 2 -- engines/kyra/sound_towns.cpp | 4 ---- 2 files changed, 6 deletions(-) diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 488dbc3742b1..e9cffd88e8b4 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -139,8 +139,6 @@ class SoundTowns : public Sound { TownsEuphonyDriver *_driver; - Common::Mutex _mutex; - bool _cdaPlaying; const uint8 *_musicFadeTable; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 9a9892c9a40a..73d435f3e511 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -297,8 +297,6 @@ bool SoundTowns::loadInstruments() { if (!twm) return false; - Common::StackLock lock(_mutex); - Screen::decodeFrame4(twm, _musicTrackData, 50570); for (int i = 0; i < 128; i++) _driver->loadInstrument(0, i, &_musicTrackData[i * 48 + 8]); @@ -322,8 +320,6 @@ bool SoundTowns::loadInstruments() { } void SoundTowns::playEuphonyTrack(uint32 offset, int loop) { - Common::StackLock lock(_mutex); - uint8 *twm = _vm->resource()->fileData("twmusic.pak", 0); Screen::decodeFrame4(twm + 19312 + offset, _musicTrackData, 50570); delete[] twm; From 3d42141e9dda203a5dae7bb91384405be5abc243 Mon Sep 17 00:00:00 2001 From: athrxx Date: Sun, 22 May 2011 18:25:29 +0200 Subject: [PATCH 270/369] SCUMM: implement some missing (very low relevance) imuse code 1) Don't skip transpose setting in sysex command 0. There are only a few sounds where this setting is used (mainly sfx). 2) Make MI2 and INDY4 read certain player start parameters from the sound resource. The start parameters usually match our default parameters (exception: e.g. LeChuck's Fortress). The use of these parameters has been dropped in DOTT (they use default parameters like we do). --- engines/scumm/imuse/imuse.cpp | 27 ++++++++++------ engines/scumm/imuse/imuse_internal.h | 10 +++++- engines/scumm/imuse/imuse_part.cpp | 3 +- engines/scumm/imuse/imuse_player.cpp | 47 ++++++++++++++++++++++------ engines/scumm/imuse/sysex_scumm.cpp | 8 ++++- 5 files changed, 73 insertions(+), 22 deletions(-) diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp index fe23b88e52e5..7d971f5ca417 100644 --- a/engines/scumm/imuse/imuse.cpp +++ b/engines/scumm/imuse/imuse.cpp @@ -99,8 +99,9 @@ IMuseInternal::~IMuseInternal() { } } -byte *IMuseInternal::findStartOfSound(int sound) { +byte *IMuseInternal::findStartOfSound(int sound, int ct) { int32 size, pos; + static uint32 id[] = { 'MThd', 'FORM', 'MDhd', 'MDpg' }; byte *ptr = g_scumm->_res->_types[rtSound][sound]._address; @@ -110,10 +111,11 @@ byte *IMuseInternal::findStartOfSound(int sound) { } // Check for old-style headers first, like 'RO' + int trFlag = (kMThd | kFORM); if (ptr[0] == 'R' && ptr[1] == 'O'&& ptr[2] != 'L') - return ptr; + return ct == trFlag ? ptr : 0; if (ptr[4] == 'S' && ptr[5] == 'O') - return ptr + 4; + return ct == trFlag ? ptr + 4 : 0; ptr += 4; size = READ_BE_UINT32(ptr); @@ -124,12 +126,16 @@ byte *IMuseInternal::findStartOfSound(int sound) { size = 48; // Arbitrary; we should find our tag within the first 48 bytes of the resource pos = 0; while (pos < size) { - if (!memcmp(ptr + pos, "MThd", 4) || !memcmp(ptr + pos, "FORM", 4)) - return ptr + pos; + for (int i = 0; i < ARRAYSIZE(id); ++i) { + if ((ct & (1 << i)) && (READ_BE_UINT32(ptr + pos) == id[i])) + return ptr + pos; + } ++pos; // We could probably iterate more intelligently } - debug(3, "IMuseInternal::findStartOfSound(): Failed to align on sound %d", sound); + if (ct == (kMThd | kFORM)) + debug(3, "IMuseInternal::findStartOfSound(): Failed to align on sound %d", sound); + return 0; } @@ -556,7 +562,7 @@ bool IMuseInternal::startSound_internal(int sound, int offset) { return false; } - void *ptr = findStartOfSound(sound); + byte *ptr = findStartOfSound(sound); if (!ptr) { debug(2, "IMuseInternal::startSound(): Couldn't find sound %d", sound); return false; @@ -576,8 +582,11 @@ bool IMuseInternal::startSound_internal(int sound, int offset) { // Bug #590511 and Patch #607175 (which was reversed to fix // an FOA regression: Bug #622606). Player *player = findActivePlayer(sound); - if (!player) - player = allocate_player(128); + if (!player) { + ptr = findStartOfSound(sound, IMuseInternal::kMDhd); + player = allocate_player(ptr ? (READ_BE_UINT32(&ptr[4]) && ptr[10] ? ptr[10] : 128) : 128); + } + if (!player) return false; diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h index ec60b225099f..8808a3655ab7 100644 --- a/engines/scumm/imuse/imuse_internal.h +++ b/engines/scumm/imuse/imuse_internal.h @@ -229,6 +229,7 @@ class Player : public MidiDriver_BASE { // Sequencer part int start_seq_sound(int sound, bool reset_vars = true); + void loadStartParameters(int sound); int query_param(int param); public: @@ -445,7 +446,14 @@ class IMuseInternal : public IMuse { static void midiTimerCallback(void *data); void on_timer(MidiDriver *midi); - byte *findStartOfSound(int sound); + enum ChunkType { + kMThd = 1, + kFORM = 2, + kMDhd = 4, // Used in MI2 and INDY4. Contain certain start parameters (priority, volume, etc. ) for the player. + kMDpg = 8 // These chunks exist in DOTT and SAMNMAX. They don't get processed, however. + }; + + byte *findStartOfSound(int sound, int ct = (kMThd | kFORM)); bool isMT32(int sound); bool isMIDI(int sound); int get_queue_sound_status(int sound) const; diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp index 808af23ddec8..5df8407a96cb 100644 --- a/engines/scumm/imuse/imuse_part.cpp +++ b/engines/scumm/imuse/imuse_part.cpp @@ -137,7 +137,8 @@ void Part::set_pan(int8 pan) { } void Part::set_transpose(int8 transpose) { - _transpose_eff = transpose_clamp((_transpose = transpose) + _player->getTranspose(), -24, 24); + _transpose = transpose; + _transpose_eff = (_transpose == -128) ? 0 : transpose_clamp(_transpose + _player->getTranspose(), -24, 24); sendPitchBend(); } diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp index e7ee93513043..0b084f3116c0 100644 --- a/engines/scumm/imuse/imuse_player.cpp +++ b/engines/scumm/imuse/imuse_player.cpp @@ -90,7 +90,7 @@ Player::~Player() { } bool Player::startSound(int sound, MidiDriver *midi) { - void *ptr; + byte *ptr; int i; // Not sure what the old code was doing, @@ -108,13 +108,8 @@ bool Player::startSound(int sound, MidiDriver *midi) { _active = true; _midi = midi; _id = sound; - _priority = 0x80; - _volume = 0x7F; - _vol_chan = 0xFFFF; - _vol_eff = (_se->get_channel_volume(0xFFFF) << 7) >> 7; - _pan = 0; - _transpose = 0; - _detune = 0; + + loadStartParameters(sound); for (i = 0; i < ARRAYSIZE(_parameterFaders); ++i) _parameterFaders[i].init(); @@ -125,7 +120,7 @@ bool Player::startSound(int sound, MidiDriver *midi) { _midi = NULL; return false; } - + debugC(DEBUG_IMUSE, "Starting music %d", sound); return true; } @@ -199,11 +194,43 @@ int Player::start_seq_sound(int sound, bool reset_vars) { _parser->property(MidiParser::mpSmartJump, 1); _parser->loadMusic(ptr, 0); _parser->setTrack(_track_index); - setSpeed(reset_vars ? 128 : _speed); + + ptr = _se->findStartOfSound(sound, IMuseInternal::kMDhd); + setSpeed(reset_vars ? (ptr ? (READ_BE_UINT32(&ptr[4]) && ptr[15] ? ptr[15] : 128) : 128) : _speed); return 0; } +void Player::loadStartParameters(int sound) { + _priority = 0x80; + _volume = 0x7F; + _vol_chan = 0xFFFF; + _vol_eff = (_se->get_channel_volume(0xFFFF) << 7) >> 7; + _pan = 0; + _transpose = 0; + _detune = 0; + + byte *ptr = _se->findStartOfSound(sound, IMuseInternal::kMDhd); + uint32 size = 0; + + if (ptr) { + ptr += 4; + size = READ_BE_UINT32(ptr); + ptr += 4; + + // MDhd chunks don't get used in MI1 and contain only zeroes. + // We check for volume, priority and speed settings of zero here. + if (size && (ptr[2] | ptr[3] | ptr[7])) { + _priority = ptr[2]; + _volume = ptr[3]; + _pan = ptr[4]; + _transpose = ptr[5]; + _detune = ptr[6]; + setSpeed(ptr[7]); + } + } +} + void Player::uninit_parts() { assert(!_parts || _parts->_player == this); diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp index 6ab71c2fa53a..4eb3bee93c69 100644 --- a/engines/scumm/imuse/sysex_scumm.cpp +++ b/engines/scumm/imuse/sysex_scumm.cpp @@ -64,6 +64,11 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) { // BYTE 14: Pitchbend range(lower 4 bits) [bug #1088045] // BYTE 15: Program(upper 4 bits) // BYTE 16: Program(lower 4 bits) + + // athrxx (05-21-2011): + // BYTE 9, 10: Transpose (if set to 0x80, this means that part->_transpose_eff will be 0 (also ignoring player->_transpose) + // BYTE 11, 12: Detune + part = player->getPart(p[0] & 0x0F); if (part) { part->set_onoff(p[2] & 0x01); @@ -71,7 +76,8 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) { part->set_pri(p[4]); part->volume((p[5] & 0x0F) << 4 |(p[6] & 0x0F)); part->set_pan((p[7] & 0x0F) << 4 | (p[8] & 0x0F)); - part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false; + part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false; + part->set_transpose((p[9] & 0x0F) << 4 | (p[10] & 0x0F)); part->set_detune((p[11] & 0x0F) << 4 | (p[12] & 0x0F)); part->pitchBendFactor((p[13] & 0x0F) << 4 | (p[14] & 0x0F)); if (part->_percussion) { From c60807cbb9dec063c0b00f8d6ffdb19e83db48f3 Mon Sep 17 00:00:00 2001 From: athrxx Date: Mon, 23 May 2011 16:37:58 +0200 Subject: [PATCH 271/369] FM-TOWNS AUDIO: Unlock internal mutex before calling imuse timer proc. --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 33 ++++++++----------- audio/softsynth/fmtowns_pc98/towns_audio.h | 9 +---- audio/softsynth/fmtowns_pc98/towns_midi.cpp | 4 ++- .../fmtowns_pc98/towns_pc98_fmsynth.cpp | 29 +++++++++------- .../fmtowns_pc98/towns_pc98_fmsynth.h | 6 ++-- engines/scumm/player_towns.cpp | 9 ++--- 6 files changed, 39 insertions(+), 51 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 5161871601a3..42a8252d5323 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -103,12 +103,12 @@ friend class TownsAudioInterfaceInternal; class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { public: - TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); ~TownsAudioInterfaceInternal(); - static TownsAudioInterfaceInternal *addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + static TownsAudioInterfaceInternal *addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); static void releaseRef(); - bool checkPluginDriver(TownsAudioInterfacePluginDriver *driver); + bool checkPluginDriver(TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); bool init(); @@ -252,7 +252,8 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { static const uint16 _pcmPhase2[]; }; -TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), +TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) : + TownsPC98_FmSynth(mixer, kTypeTowns, externalMutexHandling), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), @@ -395,13 +396,13 @@ TownsAudioInterfaceInternal::~TownsAudioInterfaceInternal() { delete[] _pcmChan; } -TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) { +TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { _refCount++; if (_refCount == 1 && _refInstance == 0) - _refInstance = new TownsAudioInterfaceInternal(mixer, driver); + _refInstance = new TownsAudioInterfaceInternal(mixer, driver, externalMutexHandling); else if (_refCount < 2 || _refInstance == 0) error("TownsAudioInterfaceInternal::addNewRef(): Internal reference management failure"); - else if (!_refInstance->checkPluginDriver(driver)) + else if (!_refInstance->checkPluginDriver(driver, externalMutexHandling)) error("TownsAudioInterfaceInternal::addNewRef(): Plugin driver conflict"); return _refInstance; @@ -419,7 +420,7 @@ void TownsAudioInterfaceInternal::releaseRef() { } } -bool TownsAudioInterfaceInternal::checkPluginDriver(TownsAudioInterfacePluginDriver *driver) { +bool TownsAudioInterfaceInternal::checkPluginDriver(TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { if (_refCount <= 1) return true; @@ -428,6 +429,7 @@ bool TownsAudioInterfaceInternal::checkPluginDriver(TownsAudioInterfacePluginDri return false; } else { _drv = driver; + _externalMutex = externalMutexHandling; } return true; @@ -1669,7 +1671,6 @@ void TownsAudioInterfaceInternal::updateOutputVolumeInternal() { int volume = (int)(((float)(maxVol * 255) / 63.0f)); int balance = maxVol ? (int)( ( ((int)_outputLevel[13] * (_outputMute[13] ^ 1) - _outputLevel[12] * (_outputMute[12] ^ 1)) * 127) / (float)maxVol) : 0; - Common::StackLock lock(_mutex); g_system->getAudioCDManager()->setVolume(volume); g_system->getAudioCDManager()->setBalance(balance); @@ -1854,8 +1855,8 @@ void TownsAudio_WaveTable::clear() { data = 0; } -TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) { - _intf = TownsAudioInterfaceInternal::addNewRef(mixer, driver); +TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { + _intf = TownsAudioInterfaceInternal::addNewRef(mixer, driver, externalMutexHandling); } TownsAudioInterface::~TownsAudioInterface() { @@ -1887,12 +1888,4 @@ void TownsAudioInterface::setSoundEffectVolume(int volume) { void TownsAudioInterface::setSoundEffectChanMask(int mask) { _intf->setSoundEffectChanMask(mask); -} - -void TownsAudioInterface::lockInternal() { - _intf->mutexLock(); -} - -void TownsAudioInterface::unlockInternal() { - _intf->mutexUnlock(); -} +} \ No newline at end of file diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.h b/audio/softsynth/fmtowns_pc98/towns_audio.h index b00243f610a4..4af888f00957 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.h +++ b/audio/softsynth/fmtowns_pc98/towns_audio.h @@ -35,7 +35,7 @@ class TownsAudioInterfacePluginDriver { class TownsAudioInterface { public: - TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); ~TownsAudioInterface(); bool init(); @@ -48,13 +48,6 @@ class TownsAudioInterface { // The first 6 bits are the 6 fm channels. The next 8 bits are pcm channels. void setSoundEffectChanMask(int mask); - // These methods should not be needed in standard situations, since the mutex - // is handled internally. However, they may be required to avoid lockup situations - // if the code using this class has a mutex of its own (example for a lockup - // situation: imuse.cpp, line 78). - void lockInternal(); - void unlockInternal(); - private: TownsAudioInterfaceInternal *_intf; }; diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp index 00f0d43b980a..4617b0555c1d 100644 --- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp @@ -834,7 +834,9 @@ const uint8 TownsMidiInputChannel::_programAdjustLevel[] = { MidiDriver_TOWNS::MidiDriver_TOWNS(Audio::Mixer *mixer) : _timerProc(0), _timerProcPara(0), _channels(0), _out(0), _chanState(0), _operatorLevelTable(0), _tickCounter1(0), _tickCounter2(0), _rand(1), _allocCurPos(0), _isOpen(false) { - _intf = new TownsAudioInterface(mixer, this); + // We set exteral mutex handling to true, since this driver is only suitable for use with the SCUMM engine + // which has its own mutex. This causes lockups which cannot always be avoided. + _intf = new TownsAudioInterface(mixer, this, true); _channels = new TownsMidiInputChannel*[32]; for (int i = 0; i < 32; i++) diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 4336de9bdbf0..f4dd3cf6cc67 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -851,7 +851,7 @@ void TownsPC98_FmSynthPercussionSource::advanceInput(RhtChannel *ins) { } #endif // DISABLE_PC98_RHYTHM_CHANNEL -TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) : +TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type, bool externalMutexHandling) : _mixer(mixer), _chanInternal(0), _ssg(0), #ifndef DISABLE_PC98_RHYTHM_CHANNEL @@ -861,7 +861,8 @@ TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) : _hasPercussion(type == kType86 ? true : false), _oprRates(0), _oprRateshift(0), _oprAttackDecay(0), _oprFrq(0), _oprSinTbl(0), _oprLevelOut(0), _oprDetune(0), _rtt(type == kTypeTowns ? 0x514767 : 0x5B8D80), _baserate(55125.0f / (float)mixer->getOutputRate()), - _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), _regProtectionFlag(false), _ready(false) { + _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), + _regProtectionFlag(false), _externalMutex(externalMutexHandling), _ready(false) { memset(&_timers[0], 0, sizeof(ChipTimer)); memset(&_timers[1], 0, sizeof(ChipTimer)); @@ -1147,7 +1148,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { bool locked = false; if (_ready) { - mutexLock(); + _mutex.lock(); locked = true; } @@ -1157,7 +1158,19 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { for (int i = 0; i < 2; i++) { if (_timers[i].enabled && _timers[i].cb) { if (!_timers[i].smpTillCb) { + + if (locked && _externalMutex) { + _mutex.unlock(); + locked = false; + } + (this->*_timers[i].cb)(); + + if (_ready && !locked && _externalMutex) { + _mutex.lock(); + locked = true; + } + _timers[i].smpTillCb = _timers[i].smpPerCb; _timers[i].smpTillCbRem += _timers[i].smpPerCbRem; @@ -1201,7 +1214,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { } if (locked) - mutexUnlock(); + _mutex.unlock(); delete[] tmpStart; @@ -1220,14 +1233,6 @@ int TownsPC98_FmSynth::getRate() const { return _mixer->getOutputRate(); } -void TownsPC98_FmSynth::mutexLock() { - _mutex.lock(); -} - -void TownsPC98_FmSynth::mutexUnlock() { - _mutex.unlock(); -} - void TownsPC98_FmSynth::deinit() { _ready = false; _mixer->stopHandle(_soundHandle); diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 6ea9815a7297..50a05f92a9c5 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -59,7 +59,7 @@ class TownsPC98_FmSynth : public Audio::AudioStream { kType86 }; - TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type); + TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type, bool externalMutexHandling = false); virtual ~TownsPC98_FmSynth(); virtual bool init(); @@ -73,9 +73,6 @@ class TownsPC98_FmSynth : public Audio::AudioStream { bool endOfData() const; int getRate() const; - void mutexLock(); - void mutexUnlock(); - protected: void deinit(); @@ -104,6 +101,7 @@ class TownsPC98_FmSynth : public Audio::AudioStream { const bool _hasPercussion; Common::Mutex _mutex; + bool _externalMutex; private: void generateTables(); diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp index 15b2f657973f..e71a8d0587c9 100644 --- a/engines/scumm/player_towns.cpp +++ b/engines/scumm/player_towns.cpp @@ -581,15 +581,12 @@ Player_Towns_v2::Player_Towns_v2(ScummEngine *vm, Audio::Mixer *mixer, IMuse *im } Player_Towns_v2::~Player_Towns_v2() { - // Avoid lockup in imuse.cpp, line 78 - _intf->lockInternal(); - if (_imuseDispose) - delete _imuse; - _intf->unlockInternal(); - delete _intf; _intf = 0; + if (_imuseDispose) + delete _imuse; + delete[] _sblData; delete[] _soundOverride; } From d7f877b3ab080b8e01bd6d55d2b52114dfe0f5fa Mon Sep 17 00:00:00 2001 From: athrxx Date: Sun, 29 May 2011 01:01:07 +0200 Subject: [PATCH 272/369] KYRA: pause midi sounds while gmm is running --- engines/kyra/kyra_v1.cpp | 2 +- engines/kyra/sound.cpp | 4 ++++ engines/kyra/sound.h | 8 +++++++- engines/kyra/sound_intern.h | 2 ++ engines/kyra/sound_midi.cpp | 20 ++++++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 7f4f1ec2c73b..75df1d148b0e 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -84,7 +84,7 @@ ::GUI::Debugger *KyraEngine_v1::getDebugger() { } void KyraEngine_v1::pauseEngineIntern(bool pause) { - Engine::pauseEngineIntern(pause); + _sound->pause(pause); _timer->pause(pause); } diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp index 4da35cc28b92..3713537afd49 100644 --- a/engines/kyra/sound.cpp +++ b/engines/kyra/sound.cpp @@ -43,6 +43,10 @@ Sound::Sound(KyraEngine_v1 *vm, Audio::Mixer *mixer) Sound::~Sound() { } +void Sound::pause(bool paused) { + _mixer->pauseAll(paused); +} + bool Sound::voiceFileIsPresent(const char *file) { for (int i = 0; _supportedCodecs[i].fileext; ++i) { Common::String f = file; diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h index 4f8e54212fd1..566b37ff4319 100644 --- a/engines/kyra/sound.h +++ b/engines/kyra/sound.h @@ -101,7 +101,7 @@ class Sound { /** * Load a sound file for playing music - * (and somtimes sound effects) from. + * (and sometimes sound effects) from. */ virtual void loadSoundFile(Common::String file) = 0; @@ -153,6 +153,11 @@ class Sound { */ virtual void beginFadeOut() = 0; + /** + * Stops all audio playback when paused. Continues after end of pause. + */ + virtual void pause(bool paused); + void enableMusic(int enable) { _musicEnabled = enable; } int musicEnabled() const { return _musicEnabled; } void enableSFX(bool enable) { _sfxEnabled = enable; } @@ -275,6 +280,7 @@ class MixedSoundDriver : public Sound { void stopAllSoundEffects() { _sfx->stopAllSoundEffects(); } void beginFadeOut() { _music->beginFadeOut(); } + void pause(bool paused) { _music->pause(paused); _sfx->pause(paused); } private: Sound *_music, *_sfx; }; diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index e9cffd88e8b4..2ba08907899f 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -71,6 +71,8 @@ class SoundMidiPC : public Sound { void stopAllSoundEffects(); void beginFadeOut(); + + void pause(bool paused); private: static void onTimer(void *data); diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index 00f6c9329e6a..6c003d0a111f 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -714,6 +714,26 @@ void SoundMidiPC::beginFadeOut() { _fadeStartTime = _vm->_system->getMillis(); } +void SoundMidiPC::pause(bool paused) { + // Stop all mixer related sounds + Sound::pause(paused); + + Common::StackLock lock(_mutex); + + if (paused) { + _music->setMidiDriver(0); + for (int i = 0; i < 3; i++) + _sfx[i]->setMidiDriver(0); + for (int i = 0; i < 16; i++) + _output->stopNotesOnChannel(i); + } else { + _music->setMidiDriver(_output); + for (int i = 0; i < 3; ++i) + _sfx[i]->setMidiDriver(_output); + // Possible TODO (IMHO unnecessary): restore notes and/or update _fadeStartTime + } +} + void SoundMidiPC::onTimer(void *data) { SoundMidiPC *midi = (SoundMidiPC *)data; From 4b98d6a9e44e2868cf6f4c7d32f9ab291b542eae Mon Sep 17 00:00:00 2001 From: athrxx Date: Sun, 29 May 2011 00:29:03 +0200 Subject: [PATCH 273/369] SCUMM: Fix bug #1013617 (ZAK FM-TOWNS: Wrong verb ('Teleport To') shown) --- engines/scumm/string.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index c27b6d5e1c08..4b3207c6bf08 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -1210,7 +1210,8 @@ int ScummEngine::convertVerbMessage(byte *dst, int dstSize, int var) { num = readVar(var); if (num) { for (k = 1; k < _numVerbs; k++) { - if (num == _verbs[k].verbid && !_verbs[k].type && !_verbs[k].saveid) { + // Fix ZAK FM-TOWNS bug #1013617 by emulating exact (inconsistant?) behavior of the original code + if (num == _verbs[k].verbid && !_verbs[k].type && (!_verbs[k].saveid || (_game.version == 3 && _game.platform == Common::kPlatformFMTowns))) { const byte *ptr = getResourceAddress(rtVerb, k); return convertMessageToString(ptr, dst, dstSize); } From e42e83d303b5516c7ce40effcf975ec1d4228bca Mon Sep 17 00:00:00 2001 From: md5 Date: Sun, 29 May 2011 12:33:54 +0300 Subject: [PATCH 274/369] CREATE_PROJECT: Disable PNG, Theora and OpenGL by default. PNG and Theora are used for the sword25 engine, which isn't stable yet. OpenGL isn't stable yet. --- devtools/create_project/create_project.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index 35f68a12c0ba..a48d4df7867a 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -725,8 +725,8 @@ const Feature s_features[] = { { "mad", "USE_MAD", "libmad", true, "libmad (MP3) support" }, { "vorbis", "USE_VORBIS", "libvorbisfile_static libvorbis_static libogg_static", true, "Ogg Vorbis support" }, { "flac", "USE_FLAC", "libFLAC_static", true, "FLAC support" }, - { "png", "USE_PNG", "libpng", true, "libpng support" }, - { "theora", "USE_THEORADEC", "libtheora_static", true, "Theora decoding support" }, + { "png", "USE_PNG", "libpng", false, "libpng support" }, + { "theora", "USE_THEORADEC", "libtheora_static", false, "Theora decoding support" }, { "mpeg2", "USE_MPEG2", "libmpeg2", false, "mpeg2 codec for cutscenes" }, // Feature flags @@ -735,7 +735,7 @@ const Feature s_features[] = { { "16bit", "USE_RGB_COLOR", "", true, "16bit color support" }, { "mt32emu", "USE_MT32EMU", "", true, "integrated MT-32 emulator" }, { "nasm", "USE_NASM", "", true, "IA-32 assembly support" }, // This feature is special in the regard, that it needs additional handling. - { "opengl", "USE_OPENGL", "opengl32", true, "OpenGL support" }, + { "opengl", "USE_OPENGL", "opengl32", false, "OpenGL support" }, { "indeo3", "USE_INDEO3", "", true, "Indeo3 codec support"}, { "translation", "USE_TRANSLATION", "", true, "Translation support" }, { "vkeybd", "ENABLE_VKEYBD", "", false, "Virtual keyboard support"}, From 59dd072f63cfad3c9a251b9033dcf88377c4778c Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 29 May 2011 16:01:56 +0200 Subject: [PATCH 275/369] SCI: Make 'quit' an alias for 'quit game' in the console --- engines/sci/console.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index ac87b3f6f683..af945247bad7 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3362,20 +3362,22 @@ bool Console::cmdSfx01Track(int argc, const char **argv) { bool Console::cmdQuit(int argc, const char **argv) { if (argc != 2) { - DebugPrintf("%s game - exit gracefully\n", argv[0]); - DebugPrintf("%s now - exit ungracefully\n", argv[0]); - return true; } - if (!scumm_stricmp(argv[1], "game")) { + if (argc == 2 && !scumm_stricmp(argv[1], "now")) { + // Quit ungracefully + g_system->quit(); + } else if (argc == 1 || (argc == 2 && !scumm_stricmp(argv[1], "game"))) { + // Quit gracefully _engine->_gamestate->abortScriptProcessing = kAbortQuitGame; // Terminate VM _debugState.seeking = kDebugSeekNothing; _debugState.runningStep = 0; - } else if (!scumm_stricmp(argv[1], "now")) { - // Quit ungracefully - g_system->quit(); + } else { + DebugPrintf("%s [game] - exit gracefully\n", argv[0]); + DebugPrintf("%s now - exit ungracefully\n", argv[0]); + return true; } return Cmd_Exit(0, 0); From afe1a77d573ea15c45848c722732f9e84221c669 Mon Sep 17 00:00:00 2001 From: md5 Date: Sun, 29 May 2011 18:54:04 +0300 Subject: [PATCH 276/369] VS: Disabled libpng, libtheora and opengl in the VS solution files --- dists/msvc10/ScummVM_Global.props | 2 +- dists/msvc10/ScummVM_Global64.props | 2 +- dists/msvc10/scummvm.vcxproj | 13 +++++++------ dists/msvc8/ScummVM_Global.vsprops | 2 +- dists/msvc8/ScummVM_Global64.vsprops | 2 +- dists/msvc8/scummvm.vcproj | 12 ++++++------ dists/msvc9/ScummVM_Global.vsprops | 2 +- dists/msvc9/ScummVM_Global64.vsprops | 2 +- dists/msvc9/scummvm.vcproj | 12 ++++++------ 9 files changed, 25 insertions(+), 24 deletions(-) diff --git a/dists/msvc10/ScummVM_Global.props b/dists/msvc10/ScummVM_Global.props index cb9ca4e7adbe..c9028e3cda3b 100644 --- a/dists/msvc10/ScummVM_Global.props +++ b/dists/msvc10/ScummVM_Global.props @@ -14,7 +14,7 @@ true 4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;;%(DisableSpecificWarnings) $(SCUMMVM_LIBS)\include;..\..;..\..\engines;$(TargetDir);%(AdditionalIncludeDirectories) - USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) + USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) false Level4 diff --git a/dists/msvc10/ScummVM_Global64.props b/dists/msvc10/ScummVM_Global64.props index 62d85beb30b5..f554fc94d39e 100644 --- a/dists/msvc10/ScummVM_Global64.props +++ b/dists/msvc10/ScummVM_Global64.props @@ -14,7 +14,7 @@ true 4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;;%(DisableSpecificWarnings) $(SCUMMVM_LIBS)\include;..\..;..\..\engines;$(TargetDir);%(AdditionalIncludeDirectories) - USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) + USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND;%(PreprocessorDefinitions) false Level4 diff --git a/dists/msvc10/scummvm.vcxproj b/dists/msvc10/scummvm.vcxproj index 0d59e6b8328f..d5190cb3ae2c 100644 --- a/dists/msvc10/scummvm.vcxproj +++ b/dists/msvc10/scummvm.vcxproj @@ -84,7 +84,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -93,7 +93,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -102,7 +102,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -111,7 +111,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -120,7 +120,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -129,7 +129,7 @@ $(OutDir)scummvm.exe - zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;libpng.lib;libtheora_static.lib;opengl32.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) + zlib.lib;libmad.lib;libvorbisfile_static.lib;libvorbis_static.lib;libogg_static.lib;libFLAC_static.lib;sdl.lib;winmm.lib;%(AdditionalDependencies) @@ -487,6 +487,7 @@ + diff --git a/dists/msvc8/ScummVM_Global.vsprops b/dists/msvc8/ScummVM_Global.vsprops index ef9d02b3e5e6..7343b3fcee4e 100644 --- a/dists/msvc8/ScummVM_Global.vsprops +++ b/dists/msvc8/ScummVM_Global.vsprops @@ -11,7 +11,7 @@ DisableLanguageExtensions="true" DisableSpecificWarnings="4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;" AdditionalIncludeDirectories="..\..;..\..\engines;$(SCUMMVM_LIBS)\include;$(TargetDir)" - PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" + PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" ExceptionHandling="0" RuntimeTypeInfo="false" RuntimeTypeInfo="false" diff --git a/dists/msvc8/ScummVM_Global64.vsprops b/dists/msvc8/ScummVM_Global64.vsprops index c0c8376e9915..584534b37ffb 100644 --- a/dists/msvc8/ScummVM_Global64.vsprops +++ b/dists/msvc8/ScummVM_Global64.vsprops @@ -11,7 +11,7 @@ DisableLanguageExtensions="true" DisableSpecificWarnings="4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;" AdditionalIncludeDirectories="..\..;..\..\engines;$(SCUMMVM_LIBS)\include;$(TargetDir)" - PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" + PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" ExceptionHandling="0" RuntimeTypeInfo="false" RuntimeTypeInfo="false" diff --git a/dists/msvc8/scummvm.vcproj b/dists/msvc8/scummvm.vcproj index c6ddf8a4bd9a..fa1dae0bd770 100644 --- a/dists/msvc8/scummvm.vcproj +++ b/dists/msvc8/scummvm.vcproj @@ -15,37 +15,37 @@ diff --git a/dists/msvc9/ScummVM_Global.vsprops b/dists/msvc9/ScummVM_Global.vsprops index ef9d02b3e5e6..7343b3fcee4e 100644 --- a/dists/msvc9/ScummVM_Global.vsprops +++ b/dists/msvc9/ScummVM_Global.vsprops @@ -11,7 +11,7 @@ DisableLanguageExtensions="true" DisableSpecificWarnings="4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;" AdditionalIncludeDirectories="..\..;..\..\engines;$(SCUMMVM_LIBS)\include;$(TargetDir)" - PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" + PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_NASM;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" ExceptionHandling="0" RuntimeTypeInfo="false" RuntimeTypeInfo="false" diff --git a/dists/msvc9/ScummVM_Global64.vsprops b/dists/msvc9/ScummVM_Global64.vsprops index c0c8376e9915..584534b37ffb 100644 --- a/dists/msvc9/ScummVM_Global64.vsprops +++ b/dists/msvc9/ScummVM_Global64.vsprops @@ -11,7 +11,7 @@ DisableLanguageExtensions="true" DisableSpecificWarnings="4068;4100;4103;4127;4244;4250;4310;4351;4512;4702;4706;4800;4996;6204;6211;6385;6386;" AdditionalIncludeDirectories="..\..;..\..\engines;$(SCUMMVM_LIBS)\include;$(TargetDir)" - PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_PNG;USE_THEORADEC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_OPENGL;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" + PreprocessorDefinitions="USE_ZLIB;USE_MAD;USE_VORBIS;USE_FLAC;USE_SCALERS;USE_HQ_SCALERS;USE_RGB_COLOR;USE_MT32EMU;USE_INDEO3;USE_TRANSLATION;USE_DETECTLANG;ENABLE_SCUMM;ENABLE_SCUMM_7_8;ENABLE_HE;ENABLE_AGI;ENABLE_AGOS;ENABLE_AGOS2;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRACI;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_GROOVIE;ENABLE_HUGO;ENABLE_KYRA;ENABLE_LURE;ENABLE_MADE;ENABLE_MOHAWK;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_IHNM;ENABLE_SCI;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TEENAGENT;ENABLE_TINSEL;ENABLE_TOON;ENABLE_TOUCHE;ENABLE_TUCKER;WIN32;SDL_BACKEND" ExceptionHandling="0" RuntimeTypeInfo="false" RuntimeTypeInfo="false" diff --git a/dists/msvc9/scummvm.vcproj b/dists/msvc9/scummvm.vcproj index d6d17384efc4..ebabab423b4f 100644 --- a/dists/msvc9/scummvm.vcproj +++ b/dists/msvc9/scummvm.vcproj @@ -16,37 +16,37 @@ From bc2e7707f1e99de59cb5e21ef2239dcdfb681024 Mon Sep 17 00:00:00 2001 From: md5 Date: Sun, 29 May 2011 19:29:01 +0300 Subject: [PATCH 277/369] CREATE_PROJECT: Fixed typo --- devtools/create_project/create_project.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index fd28882e3d33..17b3d29d0bbc 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -636,7 +636,7 @@ bool setEngineBuildState(const std::string &name, EngineDescList &engines, bool if (engine != engines.end()) { engine->enable = enable; - // When we disable an einge, we also need to disable all the sub engines. + // When we disable an engine, we also need to disable all the sub engines. if (!enable && !engine->subEngines.empty()) { for (StringList::const_iterator j = engine->subEngines.begin(); j != engine->subEngines.end(); ++j) { EngineDescList::iterator subEngine = std::find(engines.begin(), engines.end(), *j); From c713628721e8b07fdec05e7ead85ab9ad144b48d Mon Sep 17 00:00:00 2001 From: md5 Date: Sun, 29 May 2011 19:48:47 +0300 Subject: [PATCH 278/369] AGOS: Silenced a false positive warning in MSVC --- engines/agos/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp index deab57d0e65b..e6cce36b229f 100644 --- a/engines/agos/saveload.cpp +++ b/engines/agos/saveload.cpp @@ -35,7 +35,7 @@ namespace AGOS { int AGOSEngine::countSaveGames() { - Common::InSaveFile *f; + Common::InSaveFile *f = NULL; Common::StringArray filenames; uint i = 1; char slot[4]; From 1ea96002b88c5d65a5f6b1e093c83d48a3c6cbbb Mon Sep 17 00:00:00 2001 From: md5 Date: Sun, 29 May 2011 21:12:37 +0300 Subject: [PATCH 279/369] SCI: Added a more generalized fix for bug #3306417 --- engines/sci/engine/kgraphics.cpp | 21 ++++++++++++++++++++- engines/sci/engine/kstring.cpp | 15 --------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 75f8c25ed203..6c9626692219 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -360,10 +360,29 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) { } else #endif g_sci->_gfxText16->kernelTextSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight); - + + // One of the game texts in LB2 German contains loads of spaces in + // its end. We trim the text here, otherwise the graphics code will + // attempt to draw a very large window (larger than the screen) to + // show the text, and crash. + // Fixes bug #3306417. + if (textWidth >= g_sci->_gfxScreen->getDisplayWidth() || + textHeight >= g_sci->_gfxScreen->getDisplayHeight()) { + // TODO: Is this needed for SCI32 as well? + if (g_sci->_gfxText16) { + warning("kTextSize: string would be too big to fit on screen. Trimming it"); + text.trim(); + // Copy over the trimmed string... + s->_segMan->strcpy(argv[1], text.c_str()); + // ...and recalculate bounding box dimensions + g_sci->_gfxText16->kernelTextSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight); + } + } + debugC(kDebugLevelStrings, "GetTextSize '%s' -> %dx%d", text.c_str(), textWidth, textHeight); dest[2] = make_reg(0, textHeight); dest[3] = make_reg(0, textWidth); + return s->r_acc; } diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index add5b7b52dbe..c3c10bd2a215 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -67,21 +67,6 @@ reg_t kStrCpy(EngineState *s, int argc, reg_t *argv) { else s->_segMan->memcpy(argv[0], argv[1], -length); } else { - if (g_sci->getGameId() == GID_LAURABOW2 && g_sci->getLanguage() == Common::DE_DEU && - s->currentRoomNumber() == 360) { - // One of the game texts in LB2 German contains loads of spaces in - // its end. We trim the text here, otherwise the graphics code will - // attempt to draw a very large window (larger than the screen) to - // show the text, and crash. - // Fixes bug #3306417. - SegmentRef src = s->_segMan->dereference(argv[1]); - if (src.maxSize == 7992) { // the problematic resource. Trim it. - Common::String text = s->_segMan->getString(argv[1]); - text.trim(); - s->_segMan->strcpy(argv[1], text.c_str()); - } - } - s->_segMan->strcpy(argv[0], argv[1]); } From 263adb5cfcd485a99ad869ed702586202e8bc7b6 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 29 May 2011 21:12:42 +0200 Subject: [PATCH 280/369] COMMON: Limit pragma warning use in algorithm.h to MSVC. Since we only want to disable a MSVC specific warning with it and other compilers might have different warnings numbers it is safer to only target MSVC here. --- common/algorithm.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/algorithm.h b/common/algorithm.h index fa9d08b3808b..00c0e1c98f3c 100644 --- a/common/algorithm.h +++ b/common/algorithm.h @@ -236,8 +236,10 @@ void sort(T first, T last) { // MSVC is complaining about the minus operator being applied to an unsigned type // We disable this warning for the affected section of code +#if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable: 4146) +#endif /** * Euclid's algorithm to compute the greatest common divisor. @@ -261,7 +263,9 @@ T gcd(T a, T b) { return b; } +#if defined(_MSC_VER) #pragma warning(pop) +#endif } // End of namespace Common #endif From 10ee61fd37b2e8fcddf425e921f1966d40437243 Mon Sep 17 00:00:00 2001 From: strangerke Date: Mon, 30 May 2011 00:36:56 +0200 Subject: [PATCH 281/369] TSAGE: Fix a bug in scene 7000, after talking to Skeenar --- engines/tsage/ringworld_scenes8.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp index 8fa3582732da..934c7494fa40 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -48,6 +48,7 @@ void SceneObject7700::synchronize(Serializer &s) { *--------------------------------------------------------------------------*/ void Scene7000::Action1::signal() { + // Quinn walks from the lander to the seaside (action6) then discuss with Skeenar Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -125,6 +126,7 @@ void Scene7000::Action3::dispatch() { /*--------------------------------------------------------------------------*/ void Scene7000::Action3::signal() { + // Lander is landing Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -260,6 +262,7 @@ void Scene7000::Action5::signal() { /*--------------------------------------------------------------------------*/ void Scene7000::Action6::signal() { + // Quinn walks from the lander to the seaside switch (_actionIndex++) { case 0: _globals->_player.disableControl(); @@ -361,6 +364,7 @@ void Scene7000::Hotspot1::doAction(int action) { /*--------------------------------------------------------------------------*/ void Scene7000::Object1::doAction(int action) { + // Skeenar Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; switch (action) { @@ -439,10 +443,10 @@ void Scene7000::Object1::doAction(int action) { scene->_sceneMode = 7005; scene->setAction(&scene->_sequenceManager, scene, 7013, NULL); } else if (_globals->getFlag(13)) { - _globals->_sceneManager._sceneNumber = 7002; + scene->_sceneMode = 7002; scene->setAction(&scene->_sequenceManager, scene, 7014, NULL); } else { - _globals->_sceneManager._sceneNumber = 7002; + scene->_sceneMode = 7002; scene->setAction(&scene->_sequenceManager, scene, 7002, NULL); } break; From 82d18d3831e338f9fe95f4dd928712c6bc9fe5e5 Mon Sep 17 00:00:00 2001 From: strangerke Date: Mon, 30 May 2011 00:38:47 +0200 Subject: [PATCH 282/369] TSAGE: Fix a glitch in scene 2320 (no idea if it was visible or not) --- engines/tsage/ringworld_scenes3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index ff8530d5e5de..60d35260e0f8 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -5915,7 +5915,7 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _globals->_player.disableControl(); _globals->_player.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setObjectWrapper(NULL); _globals->_player.setVisage(2347); _globals->_player.setStrip(2); _globals->_player.setFrame(5); From aa78f068986a1db7cbffd1fd563fe1d8e16eb24e Mon Sep 17 00:00:00 2001 From: strangerke Date: Mon, 30 May 2011 01:17:12 +0200 Subject: [PATCH 283/369] TSAGE: Fix a mess in Seeker's actions in scene 2100 --- engines/tsage/ringworld_scenes3.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 60d35260e0f8..5de9efa6534e 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -1475,24 +1475,23 @@ void Scene2100::Object2::doAction(int action) { case CURSOR_TALK: if (_globals->getFlag(72)) { _globals->_player.disableControl(); - if (!_globals->getFlag(52)) + if (!_globals->getFlag(52)) { + scene->_sceneMode = 2111; scene->setAction(&scene->_sequenceManager, scene, 2111, NULL); - else { + } else { scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110; scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL); } - } else { - if (_globals->getFlag(14)) + } else if (_globals->getFlag(13)) { + SceneItem::display2(2100, 31); + } else if (_globals->getFlag(14)) { SceneItem::display2(2100, 32); - else { + } else { _globals->setFlag(14); _globals->_player.disableControl(); scene->_sceneMode = 2108; scene->setAction(&scene->_sequenceManager, scene, 2109, NULL); - } } - - scene->setAction(&scene->_action4); break; default: SceneHotspot::doAction(action); From 7f8a69d6fc44ca5515a91f29ce5451c12f85daa5 Mon Sep 17 00:00:00 2001 From: athrxx Date: Sun, 29 May 2011 21:43:38 +0200 Subject: [PATCH 284/369] FM-TOWNS AUDIO: fix destructors (thread safety) --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 73 ++++++++++++------- .../fmtowns_pc98/towns_pc98_driver.cpp | 2 + .../fmtowns_pc98/towns_pc98_fmsynth.cpp | 8 +- .../fmtowns_pc98/towns_pc98_fmsynth.h | 8 +- 4 files changed, 57 insertions(+), 34 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 42a8252d5323..efc9f9fb62ed 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -103,12 +103,11 @@ friend class TownsAudioInterfaceInternal; class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { public: - TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); + TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); ~TownsAudioInterfaceInternal(); - static TownsAudioInterfaceInternal *addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); - static void releaseRef(); - bool checkPluginDriver(TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); + static TownsAudioInterfaceInternal *addNewRef(Audio::Mixer *mixer, TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); + static void releaseRef(TownsAudioInterface *owner); bool init(); @@ -122,6 +121,9 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { void setSoundEffectChanMask(int mask); private: + bool assignPluginDriver(TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling = false); + void removePluginDriver(TownsAudioInterface *owner); + void nextTickEx(int32 *buffer, uint32 bufferSize); void timerCallbackA(); @@ -239,6 +241,7 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { int _pcmSfxChanMask; TownsAudioInterfacePluginDriver *_drv; + void *_drvOwner; bool _ready; static TownsAudioInterfaceInternal *_refInstance; @@ -252,10 +255,10 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { static const uint16 _pcmPhase2[]; }; -TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) : +TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) : TownsPC98_FmSynth(mixer, kTypeTowns, externalMutexHandling), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), - _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), + _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _drvOwner(owner), _pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), _outputVolumeFlags(0), _pcmChanOut(0), _pcmChanReserved(0), _pcmChanKeyPressed(0), _pcmChanEffectPlaying(0), _pcmChanKeyPlaying(0), _fmChanPlaying(0), @@ -388,6 +391,8 @@ TownsAudioInterfaceInternal::~TownsAudioInterfaceInternal() { _ready = false; deinit(); + Common::StackLock lock(_mutex); + delete[] _fmSaveReg[0]; delete[] _fmSaveReg[1]; delete[] _fmInstruments; @@ -396,45 +401,33 @@ TownsAudioInterfaceInternal::~TownsAudioInterfaceInternal() { delete[] _pcmChan; } -TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::addNewRef(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { +TownsAudioInterfaceInternal *TownsAudioInterfaceInternal::addNewRef(Audio::Mixer *mixer, TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { _refCount++; if (_refCount == 1 && _refInstance == 0) - _refInstance = new TownsAudioInterfaceInternal(mixer, driver, externalMutexHandling); + _refInstance = new TownsAudioInterfaceInternal(mixer, owner, driver, externalMutexHandling); else if (_refCount < 2 || _refInstance == 0) error("TownsAudioInterfaceInternal::addNewRef(): Internal reference management failure"); - else if (!_refInstance->checkPluginDriver(driver, externalMutexHandling)) + else if (!_refInstance->assignPluginDriver(owner, driver, externalMutexHandling)) error("TownsAudioInterfaceInternal::addNewRef(): Plugin driver conflict"); return _refInstance; } -void TownsAudioInterfaceInternal::releaseRef() { +void TownsAudioInterfaceInternal::releaseRef(TownsAudioInterface *owner) { if (!_refCount) return; _refCount--; - if (!_refCount) { + if (_refCount) { + if (_refInstance) + _refInstance->removePluginDriver(owner); + } else { delete _refInstance; _refInstance = 0; } } -bool TownsAudioInterfaceInternal::checkPluginDriver(TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { - if (_refCount <= 1) - return true; - - if (_drv) { - if (driver && driver != _drv) - return false; - } else { - _drv = driver; - _externalMutex = externalMutexHandling; - } - - return true; -} - bool TownsAudioInterfaceInternal::init() { if (_ready) return true; @@ -501,6 +494,30 @@ void TownsAudioInterfaceInternal::setSoundEffectChanMask(int mask) { setVolumeChannelMasks(~mask, mask); } +bool TownsAudioInterfaceInternal::assignPluginDriver(TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { + if (_refCount <= 1) + return true; + + if (_drv) { + if (driver && driver != _drv) + return false; + } else { + Common::StackLock lock(_mutex); + _drv = driver; + _drvOwner = owner; + _externalMutex = externalMutexHandling; + } + + return true; +} + +void TownsAudioInterfaceInternal::removePluginDriver(TownsAudioInterface *owner) { + if (_drvOwner == owner) { + Common::StackLock lock(_mutex); + _drv = 0; + } +} + void TownsAudioInterfaceInternal::nextTickEx(int32 *buffer, uint32 bufferSize) { if (!_ready) return; @@ -1856,11 +1873,11 @@ void TownsAudio_WaveTable::clear() { } TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) { - _intf = TownsAudioInterfaceInternal::addNewRef(mixer, driver, externalMutexHandling); + _intf = TownsAudioInterfaceInternal::addNewRef(mixer, this, driver, externalMutexHandling); } TownsAudioInterface::~TownsAudioInterface() { - TownsAudioInterfaceInternal::releaseRef(); + TownsAudioInterfaceInternal::releaseRef(this); _intf = 0; } diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index ee20068e7459..49fe97caf18d 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -1054,6 +1054,8 @@ TownsPC98_AudioDriver::~TownsPC98_AudioDriver() { _ready = false; deinit(); + Common::StackLock lock(_mutex); + if (_channels) { for (int i = 0; i < _numChan; i++) delete _channels[i]; diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index f4dd3cf6cc67..63007ba93c76 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -875,6 +875,8 @@ TownsPC98_FmSynth::~TownsPC98_FmSynth() { if (_ready) deinit(); + Common::StackLock lock(_mutex); + delete _ssg; #ifndef DISABLE_PC98_RHYTHM_CHANNEL delete _prc; @@ -1166,7 +1168,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { (this->*_timers[i].cb)(); - if (_ready && !locked && _externalMutex) { + if (!locked && _externalMutex) { _mutex.lock(); locked = true; } @@ -1240,6 +1242,10 @@ void TownsPC98_FmSynth::deinit() { _timers[0].cb = _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback; } +void TownsPC98_FmSynth::toggleRegProtection(bool prot) { + _regProtectionFlag = prot; +} + uint8 TownsPC98_FmSynth::readSSGStatus() { return _ssg->chanEnable(); } diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 50a05f92a9c5..4f81fa9a5c19 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -80,17 +80,15 @@ class TownsPC98_FmSynth : public Audio::AudioStream { // additional output that has to be inserted into the buffer. virtual void nextTickEx(int32 *buffer, uint32 bufferSize) {} - void toggleRegProtection(bool prot) { - _regProtectionFlag = prot; - } + void toggleRegProtection(bool prot); uint8 readSSGStatus(); virtual void timerCallbackA() = 0; virtual void timerCallbackB() = 0; - // The audio driver can store and apply two different audio settings + // The audio driver can store and apply two different volume settings // (usually for music and sound effects). The channel mask will determine - // which channels get effected by the setting. The first bits will be + // which channels get effected by which setting. The first bits will be // the normal fm channels, the next bits the ssg channels and the final // bit the rhythm channel. void setVolumeIntern(int volA, int volB); From ed20f18d29fa6fcfa682c74530515e26a94aef29 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 29 May 2011 21:02:06 +1000 Subject: [PATCH 285/369] TSAGE: General cleanup of object class --- engines/m4/console.cpp | 14 ++++++------- engines/m4/globals.cpp | 24 ++++++++++++---------- engines/m4/globals.h | 15 +++++++------- engines/m4/mads_logic.cpp | 10 +++++++++- engines/m4/mads_scene.cpp | 42 +++++++++++++++++++++++++++++---------- engines/m4/mads_views.cpp | 14 ++++++------- engines/m4/mads_views.h | 9 ++++----- 7 files changed, 81 insertions(+), 47 deletions(-) diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp index 6f45f11f5a63..fa4ca6d121f9 100644 --- a/engines/m4/console.cpp +++ b/engines/m4/console.cpp @@ -267,7 +267,7 @@ bool MadsConsole::cmdObject(int argc, const char **argv) { DebugPrintf("%2d - ", objStart); for (uint objId = objStart; objId < MIN(_vm->globals()->getObjectsSize(), objStart + 5); ++objId) { if (objId != objStart) DebugPrintf(", "); - uint16 descId = _vm->globals()->getObject(objId)->descId; + uint16 descId = _vm->globals()->getObject(objId)->_descId; DebugPrintf("%s", _vm->globals()->getVocab(descId)); } @@ -297,15 +297,15 @@ bool MadsConsole::cmdObject(int argc, const char **argv) { else { const MadsObject *obj = _vm->globals()->getObject(objNum); - DebugPrintf("Object #%d (%s) room=%d article=%d/%s vocabs=%d", objNum, _vm->globals()->getVocab(obj->descId), - obj->roomNumber, (int)obj->article, englishMADSArticleList[obj->article], obj->vocabCount); + DebugPrintf("Object #%d (%s) room=%d article=%d/%s vocabs=%d", objNum, _vm->globals()->getVocab(obj->_descId), + obj->_roomNumber, (int)obj->_article, englishMADSArticleList[obj->_article], obj->_vocabCount); - if (obj->vocabCount > 0) { + if (obj->_vocabCount > 0) { DebugPrintf(" - "); - for (int i = 0; i < obj->vocabCount; ++i) { + for (int i = 0; i < obj->_vocabCount; ++i) { if (i != 0) DebugPrintf(", "); - DebugPrintf("%s (%d)/%d,%d", _vm->globals()->getVocab(obj->vocabList[i].vocabId), - obj->vocabList[i].vocabId, obj->vocabList[i].flags1, obj->vocabList[i].flags2); + DebugPrintf("%s (%d)/%d,%d", _vm->globals()->getVocab(obj->_vocabList[i].vocabId), + obj->_vocabList[i].vocabId, obj->_vocabList[i].flags1, obj->_vocabList[i].flags2); } } DebugPrintf("\n"); diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index 58cadb3c9fa9..8787f89d04af 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -523,19 +523,23 @@ void MadsObject::load(Common::SeekableReadStream *stream) { stream->read(obj, 0x30); // Extract object data fields - descId = READ_LE_UINT16(&obj[0]); - roomNumber = READ_LE_UINT16(&obj[2]); - article = (MADSArticles)obj[4]; - vocabCount = obj[5] & 0x7f; + _descId = READ_LE_UINT16(&obj[0]); + _roomNumber = READ_LE_UINT16(&obj[2]); + _article = (MADSArticles)obj[4]; + _vocabCount = obj[5] & 0x7f; // Phantom / Dragon - if (vocabCount > 3) - warning("MadsObject::load(), vocab cound > 3 (it's %d)", vocabCount); + if (_vocabCount > 3) + warning("MadsObject::load(), vocab cound > 3 (it's %d)", _vocabCount); - for (int i = 0; i < vocabCount; ++i) { - vocabList[i].flags1 = obj[6 + i * 4]; - vocabList[i].flags2 = obj[7 + i * 4]; - vocabList[i].vocabId = READ_LE_UINT16(&obj[8 + i * 4]); + for (int i = 0; i < _vocabCount; ++i) { + _vocabList[i].flags1 = obj[6 + i * 4]; + _vocabList[i].flags2 = obj[7 + i * 4]; + _vocabList[i].vocabId = READ_LE_UINT16(&obj[8 + i * 4]); } } +void MadsObject::setRoom(int roomNumber) { + +} + } // End of namespace M4 diff --git a/engines/m4/globals.h b/engines/m4/globals.h index a95e5169bead..ae2941c1699d 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -177,13 +177,14 @@ class MadsObject { MadsObject() {} MadsObject(Common::SeekableReadStream *stream); void load(Common::SeekableReadStream *stream); - bool isInInventory() const { return roomNumber == PLAYER_INVENTORY; } - - uint16 descId; - uint16 roomNumber; - MADSArticles article; - uint8 vocabCount; - VocabEntry vocabList[3]; + bool isInInventory() const { return _roomNumber == PLAYER_INVENTORY; } + void setRoom(int roomNumber); + + uint16 _descId; + uint16 _roomNumber; + MADSArticles _article; + uint8 _vocabCount; + VocabEntry _vocabList[3]; }; typedef Common::Array > MadsObjectArray; diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index a73e943f4fd8..b1e57bd7f3fe 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -951,7 +951,7 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack &stac // object_is_present EXTRACT_PARAMS(1); const MadsObject *obj = _madsVm->globals()->getObject(p[0]); - stack.push(ScriptVar((obj->roomNumber == _madsVm->scene()->_currentScene))); + stack.push(ScriptVar((obj->_roomNumber == _madsVm->scene()->_currentScene))); break; } @@ -978,6 +978,14 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack &stac break; } + case 26: { + // object_set_room + EXTRACT_PARAMS(2); + MadsObject *obj = _madsVm->globals()->getObject(p[0]); + obj->setRoom(p[1]); + break; + } + default: error("Unknown subroutine %d called", subIndex); break; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 1a44c49f0096..a0acbdd69db5 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -428,7 +428,29 @@ void MadsScene::doSceneStep() { } void MadsScene::doAction() { - warning("TODO MadsScene::doAction"); + AbortTimerMode mode = ABORTMODE_0; + _abortTimersMode2 = mode; + + if ((_action._inProgress || (_abortTimers != 0)) && !_action._v8453A) { + _sceneLogic.doAction(); + mode = _action._inProgress ? ABORTMODE_0 : ABORTMODE_1; + } + + if (_screenObjects._v832EC) + _action._inProgress = false; + else { + if ((_action._inProgress || (_abortTimers != 0)) && (mode == ABORTMODE_0) && (_action._v8453A == mode)) { + // TODO: sound_fn_p(); + mode = _action._inProgress ? ABORTMODE_0 : ABORTMODE_1; + + } + + if ((_action._inProgress || (_abortTimers != 0)) && (mode == ABORTMODE_0) && (_action._v8453A == mode)) { + // Perform a core scene-indepedant action on an object + // object_do_action + } + } + } @@ -870,7 +892,7 @@ void MadsInterfaceView::initialize() { for (uint i = 0; i < _madsVm->globals()->getObjectsSize(); ++i) { MadsObject *obj = _madsVm->globals()->getObject(i); - if (obj->roomNumber == PLAYER_INVENTORY) + if (obj->_roomNumber == PLAYER_INVENTORY) _inventoryList.push_back(i); } @@ -919,7 +941,7 @@ void MadsInterfaceView::setSelectedObject(int objectNumber) { void MadsInterfaceView::addObjectToInventory(int objectNumber) { if (_inventoryList.indexOf(objectNumber) == -1) { - _madsVm->globals()->getObject(objectNumber)->roomNumber = PLAYER_INVENTORY; + _madsVm->globals()->getObject(objectNumber)->_roomNumber = PLAYER_INVENTORY; _inventoryList.push_back(objectNumber); } @@ -972,7 +994,7 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) { break; const char *descStr = _madsVm->globals()->getVocab(_madsVm->globals()->getObject( - _inventoryList[_topIndex + i])->descId); + _inventoryList[_topIndex + i])->_descId); strcpy(buffer, descStr); if ((buffer[0] >= 'a') && (buffer[0] <= 'z')) buffer[0] -= 'a' - 'A'; @@ -1002,13 +1024,13 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) { // List the vocab actions for the currently selected object MadsObject *obj = _madsVm->globals()->getObject(_selectedObject); - int yIndex = MIN(_highlightedElement - VOCAB_START, obj->vocabCount - 1); + int yIndex = MIN(_highlightedElement - VOCAB_START, obj->_vocabCount - 1); - for (int i = 0; i < obj->vocabCount; ++i) { + for (int i = 0; i < obj->_vocabCount; ++i) { const Common::Rect r(_screenObjects[VOCAB_START + i]); // Get the vocab description and capitalise it - const char *descStr = _madsVm->globals()->getVocab(obj->vocabList[i].vocabId); + const char *descStr = _madsVm->globals()->getVocab(obj->_vocabList[i].vocabId); strcpy(buffer, descStr); if ((buffer[0] >= 'a') && (buffer[0] <= 'z')) buffer[0] -= 'a' - 'A'; @@ -1060,12 +1082,12 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int } else if ((_highlightedElement >= VOCAB_START) && (_highlightedElement < (VOCAB_START + 5))) { // A vocab action was selected MadsObject *obj = _madsVm->globals()->getObject(_selectedObject); - int vocabIndex = MIN(_highlightedElement - VOCAB_START, obj->vocabCount - 1); + int vocabIndex = MIN(_highlightedElement - VOCAB_START, obj->_vocabCount - 1); if (vocabIndex >= 0) { act._actionMode = ACTMODE_OBJECT; act._actionMode2 = ACTMODE2_2; - act._flags1 = obj->vocabList[1].flags1; - act._flags2 = obj->vocabList[1].flags2; + act._flags1 = obj->_vocabList[1].flags1; + act._flags2 = obj->_vocabList[1].flags2; act._action.verbId = _selectedObject; act._articleNumber = act._flags2; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 7628c0d65041..b66591a207ce 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -100,8 +100,8 @@ void MadsAction::set() { int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); - _action.objectNameId = objEntry->descId; - _currentAction = objEntry->vocabList[_selectedRow].vocabId; + _action.objectNameId = objEntry->_descId; + _currentAction = objEntry->_vocabList[_selectedRow].vocabId; // Set up the status text stirng strcpy(_statusText, useStr); @@ -119,7 +119,7 @@ void MadsAction::set() { int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); - _currentAction = objEntry->vocabList[_selectedRow].vocabId; + _currentAction = objEntry->_vocabList[_selectedRow].vocabId; } appendVocab(_currentAction, true); @@ -165,7 +165,7 @@ void MadsAction::set() { if ((_actionMode2 == ACTMODE2_2) || (_actionMode2 == ACTMODE2_5)) { // Get name from given inventory object int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId); - _action.objectNameId = _madsVm->globals()->getObject(objectId)->descId; + _action.objectNameId = _madsVm->globals()->getObject(objectId)->_descId; } else if (_hotspotId < hotspotCount) { // Get name from scene hotspot _action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID(); @@ -184,7 +184,7 @@ void MadsAction::set() { if ((_v86F42 == 2) || (_v86F42 == 5)) { int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId); - articleNum = _madsVm->globals()->getObject(objectId)->article; + articleNum = _madsVm->globals()->getObject(objectId)->_article; } else if (_v86F3A < hotspotCount) { articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle(); } else { @@ -256,7 +256,7 @@ void MadsAction::startAction() { _madsVm->_player.moveComplete(); _inProgress = true; - _v8453A = 0; + _v8453A = ABORTMODE_0; _savedFields.selectedRow = _selectedRow; _savedFields.articleNumber = _articleNumber; _savedFields.actionMode = _actionMode; @@ -271,7 +271,7 @@ void MadsAction::startAction() { strcpy(_dialogTitle, _statusText); if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0)) - _v8453A = true; + _v8453A = ABORTMODE_1; _startWalkFlag = false; int hotspotId = -1; diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index e49c9e6d94a2..6be2283a3252 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -34,7 +34,8 @@ namespace M4 { class MadsView; enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; -enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5}; +enum MadsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5}; +enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2}; struct ActionDetails { int verbId; @@ -62,7 +63,7 @@ class MadsAction { int _currentAction; int8 _flags1, _flags2; MadsActionMode _actionMode; - MAdsActionMode2 _actionMode2; + MadsActionMode2 _actionMode2; int _articleNumber; bool _lookFlag; int _selectedRow; @@ -82,7 +83,7 @@ class MadsAction { int16 _v86F4C; int _v83338; bool _inProgress; - bool _v8453A; + AbortTimerMode _v8453A; public: MadsAction(MadsView &owner); @@ -96,8 +97,6 @@ class MadsAction { bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0); }; -enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2}; - class SpriteSlotSubset { public: int spriteListIndex; From f094cb81cb9e470ada4d4584e3d9e71f018ddd28 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 30 May 2011 20:28:21 +1000 Subject: [PATCH 286/369] TSAGE: Bugfix for saving in scene #2150 --- engines/tsage/ringworld_scenes3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index 5de9efa6534e..f09a0c03a0ad 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -2505,7 +2505,7 @@ void Scene2150::postInit(SceneObjectList *OwnerList) { _hotspot7.setVisage(2152); _hotspot7._frame = 1; _hotspot7._strip = 2; - _hotspot7.animate(ANIM_MODE_8, NULL); + _hotspot7.animate(ANIM_MODE_8, NULL, NULL); _hotspot7.setPosition(Common::Point(122, 62)); _hotspot7.changeZoom(100); _hotspot7.fixPriority(76); From 2be59d519ebb009f5e6e881c055567834df3ac16 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 30 May 2011 20:37:29 +1000 Subject: [PATCH 287/369] TSAGE: Changed parameter to animate call from NULL to 0 for better type matching --- engines/tsage/ringworld_scenes3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index f09a0c03a0ad..a19f15eca60b 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -2505,7 +2505,7 @@ void Scene2150::postInit(SceneObjectList *OwnerList) { _hotspot7.setVisage(2152); _hotspot7._frame = 1; _hotspot7._strip = 2; - _hotspot7.animate(ANIM_MODE_8, NULL, NULL); + _hotspot7.animate(ANIM_MODE_8, 0, NULL); _hotspot7.setPosition(Common::Point(122, 62)); _hotspot7.changeZoom(100); _hotspot7.fixPriority(76); From 22e02b0aa221058e04ba117a63ac71b6099f0190 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 26 May 2011 14:03:39 +0200 Subject: [PATCH 288/369] BUILD: Only add one option per line to INCLUDES/CXXFLAGS/LDFLAGS This improves (IMHO) readability, and makes it easier to diff for changes in compiler options. --- configure | 191 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 141 insertions(+), 50 deletions(-) diff --git a/configure b/configure index 00679c9a22e6..48216b62b184 100755 --- a/configure +++ b/configure @@ -1154,7 +1154,8 @@ if test "$_release_build" = yes; then # makes it possible to use -Wuninitialized, so let's do that. # We will also add a define, which indicates we are doing # an build for a release version. - CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized" + CXXFLAGS="$CXXFLAGS -O2" + CXXFLAGS="$CXXFLAGS -Wuninitialized" DEFINES="$DEFINES -DRELEASE_BUILD" fi @@ -1403,12 +1404,12 @@ if test "$have_gcc" = yes ; then # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ amigaos* | android | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | wii | wince ) - CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) - CXXFLAGS="$CXXFLAGS -ansi -W -Wno-unused-parameter" + CXXFLAGS="$CXXFLAGS -ansi" ;; esac + CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" add_line_to_config_mk 'HAVE_GCC3 = 1' add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' fi; @@ -1621,7 +1622,8 @@ echo_n "Checking hosttype... " echo $_host_os case $_host_os in amigaos*) - LDFLAGS="$LDFLAGS -use-dynld -L/sdk/local/newlib/lib" + LDFLAGS="$LDFLAGS -use-dynld" + LDFLAGS="$LDFLAGS -L/sdk/local/newlib/lib" # We have to use 'long' for our 4 byte typedef because AmigaOS already typedefs (u)int32 # as (unsigned) long, and consequently we'd get a compiler error otherwise. type_4_byte='long' @@ -1630,25 +1632,36 @@ case $_host_os in android) case $_host in android) - CXXFLAGS="$CXXFLAGS -march=armv5te -mtune=xscale -msoft-float" + CXXFLAGS="$CXXFLAGS -march=armv5te" + CXXFLAGS="$CXXFLAGS -mtune=xscale" + CXXFLAGS="$CXXFLAGS -msoft-float" ;; android-v7a) - CXXFLAGS="$CXXFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=vfp" + CXXFLAGS="$CXXFLAGS -march=armv7-a" + CXXFLAGS="$CXXFLAGS -mfloat-abi=softfp" + CXXFLAGS="$CXXFLAGS -mfpu=vfp" LDFLAGS="$LDFLAGS -Wl,--fix-cortex-a8" ;; esac CXXFLAGS="$CXXFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm" - CXXFLAGS="$CXXFLAGS -fpic -ffunction-sections -funwind-tables" + CXXFLAGS="$CXXFLAGS -fpic" + CXXFLAGS="$CXXFLAGS -ffunction-sections" + CXXFLAGS="$CXXFLAGS -funwind-tables" if test "$_debug_build" = yes; then - CXXFLAGS="$CXXFLAGS -fno-omit-frame-pointer -fno-strict-aliasing" + CXXFLAGS="$CXXFLAGS -fno-omit-frame-pointer" + CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" else - CXXFLAGS="$CXXFLAGS -fomit-frame-pointer -fstrict-aliasing" + CXXFLAGS="$CXXFLAGS -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -fstrict-aliasing" fi CXXFLAGS="$CXXFLAGS -finline-limit=300" - CXXFLAGS="$CXXFLAGS -Os -mthumb-interwork" + CXXFLAGS="$CXXFLAGS -Os" + CXXFLAGS="$CXXFLAGS -mthumb-interwork" # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. - CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__" - CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__" + CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5__" + CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5T__" + CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5E__" + CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5TE__" # supress 'mangling of 'va_list' has changed in GCC 4.4' CXXFLAGS="$CXXFLAGS -Wno-psabi" LDFLAGS="$LDFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm" @@ -1684,11 +1697,20 @@ case $_host_os in DEFINES="$DEFINES -DARM9" DEFINES="$DEFINES -DARM" DEFINES="$DEFINES -DNONSTANDARD_PORT" - CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" - CXXFLAGS="$CXXFLAGS -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer -mthumb-interwork" - CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fno-strict-aliasing" + CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include" + CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/devkitARM/arm-eabi/include" + CXXFLAGS="$CXXFLAGS -mcpu=arm9tdmi" + CXXFLAGS="$CXXFLAGS -mtune=arm9tdmi" + CXXFLAGS="$CXXFLAGS -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -mthumb-interwork" + CXXFLAGS="$CXXFLAGS -ffunction-sections" + CXXFLAGS="$CXXFLAGS -fdata-sections" + CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" CXXFLAGS="$CXXFLAGS -fuse-cxa-atexit" - LDFLAGS="$LDFLAGS -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt" + LDFLAGS="$LDFLAGS -specs=ds_arm9.specs" + LDFLAGS="$LDFLAGS -mthumb-interwork" + LDFLAGS="$LDFLAGS -mno-fpu" + LDFLAGS="$LDFLAGS -Wl,-Map,map.txt" if test "$_dynamic_modules" = no ; then LDFLAGS="$LDFLAGS -Wl,--gc-sections" else @@ -1704,12 +1726,21 @@ case $_host_os in CXXFLAGS="$CXXFLAGS -I/usr/local/include" ;; gamecube) - CXXFLAGS="$CXXFLAGS -Os -mogc -mcpu=750 -meabi -mhard-float" - CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fmodulo-sched" + CXXFLAGS="$CXXFLAGS -Os" + CXXFLAGS="$CXXFLAGS -mogc" + CXXFLAGS="$CXXFLAGS -mcpu=750" + CXXFLAGS="$CXXFLAGS -meabi" + CXXFLAGS="$CXXFLAGS -mhard-float" + CXXFLAGS="$CXXFLAGS -ffunction-sections" + CXXFLAGS="$CXXFLAGS -fdata-sections" + CXXFLAGS="$CXXFLAGS -fmodulo-sched" CXXFLAGS="$CXXFLAGS -fuse-cxa-atexit" CXXFLAGS="$CXXFLAGS -I$DEVKITPRO/libogc/include" # libogc is required to link the cc tests (includes _start()) - LDFLAGS="$LDFLAGS -mogc -mcpu=750 -L$DEVKITPRO/libogc/lib/cube -logc" + LDFLAGS="$LDFLAGS -mogc" + LDFLAGS="$LDFLAGS -mcpu=750" + LDFLAGS="$LDFLAGS -L$DEVKITPRO/libogc/lib/cube" + LDFLAGS="$LDFLAGS -logc" if test "$_dynamic_modules" = "yes" ; then # retarded toolchain patch forces --gc-sections, overwrite it LDFLAGS="$LDFLAGS -Wl,--no-gc-sections" @@ -1765,8 +1796,10 @@ case $_host_os in if test -d "$PSPDEV/psp/lib"; then LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib" fi - LDFLAGS="$LDFLAGS -L$PSPSDK/lib -specs=$_srcdir/backends/platform/psp/psp.spec" - CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include" + LDFLAGS="$LDFLAGS -L$PSPSDK/lib" + LDFLAGS="$LDFLAGS -specs=$_srcdir/backends/platform/psp/psp.spec" + CXXFLAGS="$CXXFLAGS -O3" + CXXFLAGS="$CXXFLAGS -I$PSPSDK/include" # FIXME: Why is the following in CXXFLAGS and not in DEFINES? Change or document this. CXXFLAGS="$CXXFLAGS -D_PSP_FW_VERSION=150" ;; @@ -1777,29 +1810,46 @@ case $_host_os in LIBS="$LIBS -lnsl -lsocket" ;; webos) - CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/include -I$WEBOS_PDK/include/SDL -I$WEBOS_PDK/device/usr/include" + CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/include" + CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/include/SDL" + CXXFLAGS="$CXXFLAGS -I$WEBOS_PDK/device/usr/include" # These compiler options are needed to support the Palm Pixi - CXXFLAGS="$CXXFLAGS -mcpu=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp" - LDFLAGS="$LDFLAGS -L$WEBOS_PDK/device/lib -L$WEBOS_PDK/device/usr/lib" + CXXFLAGS="$CXXFLAGS -mcpu=arm1136jf-s" + CXXFLAGS="$CXXFLAGS -mfpu=vfp " + CXXFLAGS="$CXXFLAGS mfloat-abi=softfp" + LDFLAGS="$LDFLAGS -L$WEBOS_PDK/device/lib" + LDFLAGS="$LDFLAGS -L$WEBOS_PDK/device/usr/lib" LDFLAGS="$LDFLAGS -Wl,--allow-shlib-undefined" LDFLAGS="$LDFLAGS --sysroot=$WEBOS_PDK/arm-gcc/sysroot" add_line_to_config_mk "WEBOS_SDK = $WEBOS_SDK" _seq_midi=no ;; wii) - CXXFLAGS="$CXXFLAGS -Os -mrvl -mcpu=750 -meabi -mhard-float" - CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fmodulo-sched" + CXXFLAGS="$CXXFLAGS -Os" + CXXFLAGS="$CXXFLAGS -mrvl" + CXXFLAGS="$CXXFLAGS -mcpu=750" + CXXFLAGS="$CXXFLAGS -meabi" + CXXFLAGS="$CXXFLAGS -mhard-float" + CXXFLAGS="$CXXFLAGS -ffunction-sections" + CXXFLAGS="$CXXFLAGS -fdata-sections" + CXXFLAGS="$CXXFLAGS -fmodulo-sched" CXXFLAGS="$CXXFLAGS -fuse-cxa-atexit" CXXFLAGS="$CXXFLAGS -I$DEVKITPRO/libogc/include" # libogc is required to link the cc tests (includes _start()) - LDFLAGS="$LDFLAGS -mrvl -mcpu=750 -L$DEVKITPRO/libogc/lib/wii -logc" + LDFLAGS="$LDFLAGS -mrvl" + LDFLAGS="$LDFLAGS -mcpu=750" + LDFLAGS="$LDFLAGS -L$DEVKITPRO/libogc/lib/wii" + LDFLAGS="$LDFLAGS -logc" if test "$_dynamic_modules" = "yes" ; then # retarded toolchain patch forces --gc-sections, overwrite it LDFLAGS="$LDFLAGS -Wl,--no-gc-sections" fi ;; wince) - CXXFLAGS="$CXXFLAGS -O3 -fno-inline-functions -march=armv4 -mtune=xscale" + CXXFLAGS="$CXXFLAGS -O3" + CXXFLAGS="$CXXFLAGS -fno-inline-functions" + CXXFLAGS="$CXXFLAGS -march=armv4" + CXXFLAGS="$CXXFLAGS -mtune=xscale" DEFINES="$DEFINES -D_WIN32_WCE=300" DEFINES="$DEFINES -D__ARM__" DEFINES="$DEFINES -D_ARM_" @@ -1818,7 +1868,8 @@ if test -n "$_host"; then case "$_host" in android | android-v7a) # we link a .so as default - LDFLAGS="$LDFLAGS -shared -Wl,-Bsymbolic,--no-undefined" + LDFLAGS="$LDFLAGS -shared" + LDFLAGS="$LDFLAGS -Wl,-Bsymbolic,--no-undefined" HOSTEXEPRE=lib HOSTEXEEXT=.so _backend="android" @@ -1846,7 +1897,8 @@ if test -n "$_host"; then # Use -O3 on the Caanoo for non-debug builds. CXXFLAGS="$CXXFLAGS -O3" fi - CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" + CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s" + CXXFLAGS="$CXXFLAGS -mtune=arm926ej-s" ASFLAGS="$ASFLAGS" _backend="gph" _build_hq_scalers=no @@ -1865,7 +1917,8 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ASFLAGS="$ASFLAGS" - CXXFLAGS="$CXXFLAGS -msoft-float -mips32" + CXXFLAGS="$CXXFLAGS -msoft-float" + CXXFLAGS="$CXXFLAGS -mips32" _backend="dingux" _mt32emu=no _vkeybd=yes @@ -1881,7 +1934,11 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" - CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks" + CXXFLAGS="$CXXFLAGS -O3" + CXXFLAGS="$CXXFLAGS -funroll-loops" + CXXFLAGS="$CXXFLAGS -fschedule-insns2" + CXXFLAGS="$CXXFLAGS -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -fdelete-null-pointer-checks" _backend="dc" _build_scalers=no _mad=yes @@ -1945,7 +2002,8 @@ if test -n "$_host"; then if test "$_debug_build" = yes; then DEFINES="$DEFINES -DGPH_DEBUG" fi - CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" + CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s" + CXXFLAGS="$CXXFLAGS -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" _backend="gph" _build_hq_scalers=no @@ -1998,10 +2056,19 @@ if test -n "$_host"; then _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; n64) - CXXFLAGS="$CXXFLAGS -mno-extern-sdata --param max-inline-insns-auto=20 -fomit-frame-pointer" - CXXFLAGS="$CXXFLAGS -march=vr4300 -mtune=vr4300 -mhard-float" - LDFLAGS="$LDFLAGS -march=vr4300 -mtune=vr4300 -nodefaultlibs -nostartfiles -mno-crt0" - LDFLAGS="$LDFLAGS -L$N64SDK/hkz-libn64 -L$N64SDK/lib" + CXXFLAGS="$CXXFLAGS -mno-extern-sdata" + CXXFLAGS="$CXXFLAGS --param max-inline-insns-auto=20" + CXXFLAGS="$CXXFLAGS -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -march=vr4300" + CXXFLAGS="$CXXFLAGS -mtune=vr4300" + CXXFLAGS="$CXXFLAGS -mhard-float" + LDFLAGS="$LDFLAGS -march=vr4300" + LDFLAGS="$LDFLAGS -mtune=vr4300" + LDFLAGS="$LDFLAGS -nodefaultlibs" + LDFLAGS="$LDFLAGS -nostartfiles" + LDFLAGS="$LDFLAGS -mno-crt0" + LDFLAGS="$LDFLAGS -L$N64SDK/hkz-libn64" + LDFLAGS="$LDFLAGS -L$N64SDK/lib" LDFLAGS="$LDFLAGS -T n64ld_cpp.x -Xlinker -Map -Xlinker scummvm.map" _backend="n64" _mt32emu=no @@ -2033,7 +2100,9 @@ if test -n "$_host"; then # Use -O3 on the OpenPandora for non-debug builds. CXXFLAGS="$CXXFLAGS -O3" fi - CXXFLAGS="$CXXFLAGS -march=armv7-a -mtune=cortex-a8 -mfpu=neon" + CXXFLAGS="$CXXFLAGS -march=armv7-a" + CXXFLAGS="$CXXFLAGS -mtune=cortex-a8" + CXXFLAGS="$CXXFLAGS -mfpu=neon" ASFLAGS="$ASFLAGS -mfloat-abi=soft" _backend="openpandora" _build_hq_scalers=yes @@ -2069,7 +2138,9 @@ if test -n "$_host"; then DEFINES="$DEFINES -D__PS2_DEBUG__" #INCLUDES="$INCLUDES -I$(PS2GDB)/ee" #LDFLAGS="$LDFLAGS -L$(PS2GDB)/lib" - LDFLAGS="$LDFLAGS -lps2gdbStub -lps2ip -ldebug" + LDFLAGS="$LDFLAGS -lps2gdbStub" + LDFLAGS="$LDFLAGS -lps2ip" + LDFLAGS="$LDFLAGS -ldebug" else # If not building for debug mode, strip binaries. CXXFLAGS="$CXXFLAGS -s" @@ -2143,8 +2214,12 @@ case $_backend in DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" ;; dc) - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc -isystem $(ronindir)/include' - LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000 -nostartfiles "'$(ronindir)/lib/crt0.o -L$(ronindir)/lib' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc' + INCLUDES="$INCLUDES "'-isystem $(ronindir)/include' + LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000" + LDFLAGS="$LDFLAGS -nostartfiles" + LDFLAGS="$LDFLAGS "'$(ronindir)/lib/crt0.o' + LDFLAGS="$LDFLAGS "'-L$(ronindir)/lib' LIBS="$LIBS -lronin -lm" ;; dingux) @@ -2161,7 +2236,9 @@ case $_backend in ;; iphone) OBJCFLAGS="$OBJCFLAGS --std=c99" - LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES -framework QuartzCore -framework GraphicsServices -framework CoreFoundation -framework Foundation -framework AudioToolbox -framework CoreAudio" + LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES" + LIBS="$LIBS -framework QuartzCore -framework GraphicsServices -framework CoreFoundation" + LIBS="$LIBS -framework Foundation -framework AudioToolbox -framework CoreAudio" ;; linuxmoto) DEFINES="$DEFINES -DLINUXMOTO" @@ -2171,7 +2248,8 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(N64SDK)/mips64/include' INCLUDES="$INCLUDES "'-I$(N64SDK)/hkz-libn64' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' - LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs -lm -lstdc++ -lc -lgcc -lz -lnosys" + LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs" + LIBS="$LIBS -lm -lstdc++ -lc -lgcc -lz -lnosys" ;; null) DEFINES="$DEFINES -DUSE_NULL_DRIVER" @@ -2181,22 +2259,30 @@ case $_backend in ps2) DEFINES="$DEFINES -D_EE" DEFINES="$DEFINES -DFORCE_RTL" - INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include" + INCLUDES="$INCLUDES -I$PS2SDK/ee/include" + INCLUDES="$INCLUDES -I$PS2SDK/common/include" + INCLUDES="$INCLUDES -I$PS2SDK/ports/include" if test "$_dynamic_modules" = no ; then - LDFLAGS="$LDFLAGS -mno-crt0 $PS2SDK/ee/startup/crt0.o -T $PS2SDK/ee/startup/linkfile" + LDFLAGS="$LDFLAGS -mno-crt0" + LDFLAGS="$LDFLAGS $PS2SDK/ee/startup/crt0.o" + LDFLAGS="$LDFLAGS -T $PS2SDK/ee/startup/linkfile" fi - LDFLAGS="$LDFLAGS -L$PS2SDK/ee/lib -L$PS2SDK/ports/lib" - LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lm -lc -lfileXio -lkernel -lstdc++ " + LDFLAGS="$LDFLAGS -L$PS2SDK/ee/lib" + LDFLAGS="$LDFLAGS -L$PS2SDK/ports/lib" + LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm" + LIBS="$LIBS -lm -lc -lfileXio -lkernel -lstdc++" ;; psp) DEFINES="$DEFINES -D__PSP__" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" - LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" + LIBS="$LIBS -lpng" + LIBS="$LIBS -Wl,-Map,mapfile.txt" ;; samsungtv) DEFINES="$DEFINES -DSAMSUNGTV" - LDFLAGS="$LDFLAGS -shared -fpic" + LDFLAGS="$LDFLAGS -shared" + LDFLAGS="$LDFLAGS -fpic" ;; webos) # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. @@ -2218,7 +2304,12 @@ case $_backend in esac ;; wince) - INCLUDES="$INCLUDES "'-I$(srcdir) -I$(srcdir)/backends/platform/wince -I$(srcdir)/engines -I$(srcdir)/backends/platform/wince/missing/gcc -I$(srcdir)/backends/platform/wince/CEgui -I$(srcdir)/backends/platform/wince/CEkeys' + INCLUDES="$INCLUDES "'-I$(srcdir)' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince' + INCLUDES="$INCLUDES "'-I$(srcdir)/engines' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/missing/gcc' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/CEgui' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/CEkeys' LIBS="$LIBS -static -lSDL" DEFINES="$DEFINES -DSDL_BACKEND" ;; From f7e94e90b67dd21058ede1ae69283592a88bed7d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 30 May 2011 23:58:45 +0200 Subject: [PATCH 289/369] WINCE: Remove unnecessary -I flags --- configure | 3 --- 1 file changed, 3 deletions(-) diff --git a/configure b/configure index 48216b62b184..299e9927aa22 100755 --- a/configure +++ b/configure @@ -2304,10 +2304,7 @@ case $_backend in esac ;; wince) - INCLUDES="$INCLUDES "'-I$(srcdir)' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince' - INCLUDES="$INCLUDES "'-I$(srcdir)/engines' - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/missing/gcc' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/CEgui' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/CEkeys' LIBS="$LIBS -static -lSDL" From 127a6f920a649e4f981ba6d3333dac516dfbb258 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 00:25:40 +0200 Subject: [PATCH 290/369] BUILD: Add SDL_BACKEND=1 to config.mk for all SDL based backends --- backends/graphics/opengl/gltexture.h | 2 ++ backends/mixer/sdl/sdl-mixer.cpp | 2 ++ backends/module.mk | 6 ++---- configure | 5 ++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h index 63d5e3a733ef..f0cd7aed569b 100644 --- a/backends/graphics/opengl/gltexture.h +++ b/backends/graphics/opengl/gltexture.h @@ -20,6 +20,8 @@ * */ +#include "common/scummsys.h" + #ifdef WIN32 #if defined(ARRAYSIZE) && !defined(_WINDOWS_) #undef ARRAYSIZE diff --git a/backends/mixer/sdl/sdl-mixer.cpp b/backends/mixer/sdl/sdl-mixer.cpp index 61e7f051e52a..16e7f22db5c8 100644 --- a/backends/mixer/sdl/sdl-mixer.cpp +++ b/backends/mixer/sdl/sdl-mixer.cpp @@ -20,6 +20,8 @@ * */ +#include "common/scummsys.h" + #if defined(SDL_BACKEND) #include "backends/mixer/sdl/sdl-mixer.h" diff --git a/backends/module.mk b/backends/module.mk index 07a8cbbb3f54..e91c0917a4b7 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -41,10 +41,7 @@ MODULE_OBJS := \ # SDL specific source files. # We cannot just check $BACKEND = sdl, as various other backends # derive from the SDL backend, and they all need the following files. -# TODO: Add SDL_BACKEND to config.mk; this would match the fact that -# we also add -DSDL_BACKEND to the DEFINES. -# However, the latter is only done for *most* SDL based stuff, not always -# so we really should unify the relevant code in configure. +ifdef SDL_BACKEND MODULE_OBJS += \ audiocd/sdl/sdl-audiocd.o \ events/sdl/sdl-events.o \ @@ -54,6 +51,7 @@ MODULE_OBJS += \ mutex/sdl/sdl-mutex.o \ plugins/sdl/sdl-provider.o \ timer/sdl/sdl-timer.o +endif ifdef POSIX MODULE_OBJS += \ diff --git a/configure b/configure index 299e9927aa22..6ae3cce8b674 100755 --- a/configure +++ b/configure @@ -2287,8 +2287,9 @@ case $_backend in webos) # There is no sdl-config in the WebOS PDK so we don't use find_sdlconfig here. LIBS="$LIBS -lSDL" - DEFINES="$DEFINES -DSDL_BACKEND" DEFINES="$DEFINES -DWEBOS" + DEFINES="$DEFINES -DSDL_BACKEND" + add_line_to_config_mk "SDL_BACKEND = 1" MODULES="$MODULES backends/platform/sdl" ;; wii) @@ -2309,6 +2310,7 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/wince/CEkeys' LIBS="$LIBS -static -lSDL" DEFINES="$DEFINES -DSDL_BACKEND" + add_line_to_config_mk "SDL_BACKEND = 1" ;; sdl) ;; @@ -2328,6 +2330,7 @@ case $_backend in INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" DEFINES="$DEFINES -DSDL_BACKEND" + add_line_to_config_mk "SDL_BACKEND = 1" ;; esac From 9c3a8cd3b5de4281167e4becb0846eebe23efee9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 00:35:27 +0200 Subject: [PATCH 291/369] BUILD: Compile more files only when necessary --- backends/module.mk | 41 ++++++++++++++++------- backends/vkeybd/image-map.h | 3 +- backends/vkeybd/polygon.h | 3 +- backends/vkeybd/virtual-keyboard-gui.h | 3 +- backends/vkeybd/virtual-keyboard-parser.h | 3 +- backends/vkeybd/virtual-keyboard.h | 3 +- configure | 13 +++---- 7 files changed, 43 insertions(+), 26 deletions(-) diff --git a/backends/module.mk b/backends/module.mk index e91c0917a4b7..b2831538f950 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -7,20 +7,19 @@ MODULE_OBJS := \ events/default/default-events.o \ fs/abstract-fs.o \ fs/stdiostream.o \ - graphics/opengl/glerrorcheck.o \ - graphics/opengl/gltexture.o \ - graphics/opengl/opengl-graphics.o \ - graphics/openglsdl/openglsdl-graphics.o \ - keymapper/action.o \ - keymapper/keymap.o \ - keymapper/keymapper.o \ - keymapper/remap-dialog.o \ log/log.o \ midi/alsa.o \ midi/dmedia.o \ midi/seq.o \ midi/stmidi.o \ midi/timidity.o \ + saves/savefile.o \ + saves/default/default-saves.o \ + timer/default/default-timer.o + + +ifdef USE_ELF_LOADER +MODULE_OBJS := \ plugins/elf/arm-loader.o \ plugins/elf/elf-loader.o \ plugins/elf/elf-provider.o \ @@ -28,15 +27,33 @@ MODULE_OBJS := \ plugins/elf/mips-loader.o \ plugins/elf/ppc-loader.o \ plugins/elf/shorts-segment-manager.o \ - plugins/elf/version.o \ - saves/savefile.o \ - saves/default/default-saves.o \ - timer/default/default-timer.o \ + plugins/elf/version.o +endif + +ifdef ENABLE_KEYMAPPER +MODULE_OBJS := \ + keymapper/action.o \ + keymapper/keymap.o \ + keymapper/keymapper.o \ + keymapper/remap-dialog.o +endif + +ifdef USE_OPENGL +MODULE_OBJS := \ + graphics/opengl/glerrorcheck.o \ + graphics/opengl/gltexture.o \ + graphics/opengl/opengl-graphics.o \ + graphics/openglsdl/openglsdl-graphics.o +endif + +ifdef ENABLE_VKEYBD +MODULE_OBJS := \ vkeybd/image-map.o \ vkeybd/polygon.o \ vkeybd/virtual-keyboard.o \ vkeybd/virtual-keyboard-gui.o \ vkeybd/virtual-keyboard-parser.o +endif # SDL specific source files. # We cannot just check $BACKEND = sdl, as various other backends diff --git a/backends/vkeybd/image-map.h b/backends/vkeybd/image-map.h index 020bf70c67a5..3bd8cfa0dbc7 100644 --- a/backends/vkeybd/image-map.h +++ b/backends/vkeybd/image-map.h @@ -23,9 +23,10 @@ #ifndef COMMON_IMAGEMAP_H #define COMMON_IMAGEMAP_H +#include "common/scummsys.h" + #ifdef ENABLE_VKEYBD -#include "common/scummsys.h" #include "common/hashmap.h" #include "common/hash-str.h" diff --git a/backends/vkeybd/polygon.h b/backends/vkeybd/polygon.h index bc76dfb4d7dc..19a12a040986 100644 --- a/backends/vkeybd/polygon.h +++ b/backends/vkeybd/polygon.h @@ -23,9 +23,10 @@ #ifndef COMMON_POLYGON_H #define COMMON_POLYGON_H +#include "common/scummsys.h" + #ifdef ENABLE_VKEYBD -#include "common/scummsys.h" #include "common/array.h" #include "common/rect.h" diff --git a/backends/vkeybd/virtual-keyboard-gui.h b/backends/vkeybd/virtual-keyboard-gui.h index e3798569fb5d..da80ef22232a 100644 --- a/backends/vkeybd/virtual-keyboard-gui.h +++ b/backends/vkeybd/virtual-keyboard-gui.h @@ -23,10 +23,11 @@ #ifndef COMMON_VIRTUAL_KEYBOARD_GUI_H #define COMMON_VIRTUAL_KEYBOARD_GUI_H +#include "common/scummsys.h" + #ifdef ENABLE_VKEYBD #include "backends/vkeybd/virtual-keyboard.h" -#include "common/scummsys.h" #include "common/rect.h" #include "common/system.h" #include "graphics/font.h" diff --git a/backends/vkeybd/virtual-keyboard-parser.h b/backends/vkeybd/virtual-keyboard-parser.h index a5d0e0e4f16a..eb25ebe6fdbe 100644 --- a/backends/vkeybd/virtual-keyboard-parser.h +++ b/backends/vkeybd/virtual-keyboard-parser.h @@ -23,9 +23,10 @@ #ifndef COMMON_VIRTUAL_KEYBOARD_PARSER_H #define COMMON_VIRTUAL_KEYBOARD_PARSER_H +#include "common/scummsys.h" + #ifdef ENABLE_VKEYBD -#include "common/scummsys.h" #include "common/xmlparser.h" #include "backends/vkeybd/virtual-keyboard.h" diff --git a/backends/vkeybd/virtual-keyboard.h b/backends/vkeybd/virtual-keyboard.h index 4936275e2338..21db5a47daec 100644 --- a/backends/vkeybd/virtual-keyboard.h +++ b/backends/vkeybd/virtual-keyboard.h @@ -23,11 +23,12 @@ #ifndef COMMON_VIRTUAL_KEYBOARD_H #define COMMON_VIRTUAL_KEYBOARD_H +#include "common/scummsys.h" + #ifdef ENABLE_VKEYBD class OSystem; -#include "common/scummsys.h" #include "common/events.h" #include "common/hashmap.h" #include "common/hash-str.h" diff --git a/configure b/configure index 6ae3cce8b674..230db7bc6a15 100755 --- a/configure +++ b/configure @@ -2571,14 +2571,13 @@ fi # # Set up some common plugin settings in config.h and config.mk, if enabled # +define_in_config_if_yes "$_dynamic_modules" 'DYNAMIC_MODULES' + if test "$_dynamic_modules" = yes ; then add_line_to_config_h "#define PLUGIN_PREFIX \"$_plugin_prefix\"" add_line_to_config_h "#define PLUGIN_SUFFIX \"$_plugin_suffix\"" add_line_to_config_mk "PLUGIN_PREFIX := $_plugin_prefix" add_line_to_config_mk "PLUGIN_SUFFIX := $_plugin_suffix" - - add_line_to_config_mk "DYNAMIC_MODULES := 1" - DEFINES="$DEFINES -DDYNAMIC_MODULES" fi @@ -3088,12 +3087,8 @@ define_in_config_if_yes $_nasm 'USE_NASM' # # Enable vkeybd / keymapper # -if test "$_vkeybd" = yes ; then - DEFINES="$DEFINES -DENABLE_VKEYBD" -fi -if test "$_keymapper" = yes ; then - DEFINES="$DEFINES -DENABLE_KEYMAPPER" -fi +define_in_config_if_yes $_vkeybd 'ENABLE_VKEYBD' +define_in_config_if_yes $_keymapper 'ENABLE_KEYMAPPER' # Check whether to build translation support # From 1edcbe0b00c2a60ee528077fb43120bd5a6081a8 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 31 May 2011 01:18:31 +0100 Subject: [PATCH 292/369] BUILD: Fix Linking. These defines are adding to, not replacing the MODULES list. --- backends/module.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backends/module.mk b/backends/module.mk index b2831538f950..27058bef8844 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -19,7 +19,7 @@ MODULE_OBJS := \ ifdef USE_ELF_LOADER -MODULE_OBJS := \ +MODULE_OBJS += \ plugins/elf/arm-loader.o \ plugins/elf/elf-loader.o \ plugins/elf/elf-provider.o \ @@ -31,7 +31,7 @@ MODULE_OBJS := \ endif ifdef ENABLE_KEYMAPPER -MODULE_OBJS := \ +MODULE_OBJS += \ keymapper/action.o \ keymapper/keymap.o \ keymapper/keymapper.o \ @@ -39,7 +39,7 @@ MODULE_OBJS := \ endif ifdef USE_OPENGL -MODULE_OBJS := \ +MODULE_OBJS += \ graphics/opengl/glerrorcheck.o \ graphics/opengl/gltexture.o \ graphics/opengl/opengl-graphics.o \ @@ -47,7 +47,7 @@ MODULE_OBJS := \ endif ifdef ENABLE_VKEYBD -MODULE_OBJS := \ +MODULE_OBJS += \ vkeybd/image-map.o \ vkeybd/polygon.o \ vkeybd/virtual-keyboard.o \ From 5a2e6e4f3f9b26569797d998252d2016a33f57c0 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 31 May 2011 04:44:12 +0100 Subject: [PATCH 293/369] BUILD: Fix compilation when --enable-plugins is enabled. --- base/plugins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/plugins.h b/base/plugins.h index 247564171ddf..a1ae7341591f 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -80,7 +80,7 @@ extern int pluginTypeVersions[PLUGIN_TYPE_MAX]; (ENABLE_##ID && !PLUGIN_ENABLED_DYNAMIC(ID)) #define PLUGIN_ENABLED_DYNAMIC(ID) \ - (ENABLE_##ID && (ENABLE_##ID == DYNAMIC_PLUGIN) && DYNAMIC_MODULES) + (ENABLE_##ID && (ENABLE_##ID == DYNAMIC_PLUGIN) && defined(DYNAMIC_MODULES)) // see comments in backends/plugins/elf/elf-provider.cpp #if defined(USE_ELF_LOADER) && defined(ELF_LOADER_CXA_ATEXIT) From c30904b48a1320ccc73fabea616a60ac314bc9f6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 12:22:26 +0200 Subject: [PATCH 294/369] BUILD: Fix typo which broke WebOS builds --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 230db7bc6a15..c8cb45554d9c 100755 --- a/configure +++ b/configure @@ -1816,7 +1816,7 @@ case $_host_os in # These compiler options are needed to support the Palm Pixi CXXFLAGS="$CXXFLAGS -mcpu=arm1136jf-s" CXXFLAGS="$CXXFLAGS -mfpu=vfp " - CXXFLAGS="$CXXFLAGS mfloat-abi=softfp" + CXXFLAGS="$CXXFLAGS -mfloat-abi=softfp" LDFLAGS="$LDFLAGS -L$WEBOS_PDK/device/lib" LDFLAGS="$LDFLAGS -L$WEBOS_PDK/device/usr/lib" LDFLAGS="$LDFLAGS -Wl,--allow-shlib-undefined" From bea6858953dbcde1c6dc88345631f14d9b550ef8 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 31 May 2011 12:06:14 +0100 Subject: [PATCH 295/369] AUDIO: Fix GCC Compilation Warning in FM-Towns Softsynth. --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index efc9f9fb62ed..786e3ee1d2e6 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -1905,4 +1905,4 @@ void TownsAudioInterface::setSoundEffectVolume(int volume) { void TownsAudioInterface::setSoundEffectChanMask(int mask) { _intf->setSoundEffectChanMask(mask); -} \ No newline at end of file +} From 9c3e2e43bde0c03ec012b83cd501a93a9ec4025e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 13:48:03 +0200 Subject: [PATCH 296/369] COMMON: Move some code from scummsys.h to relevant portdefs.h files --- backends/platform/ds/arm9/source/portdefs.h | 7 +- backends/platform/n64/portdefs.h | 13 ++++ backends/platform/symbian/src/portdefs.h | 21 ++++++ common/scummsys.h | 78 ++++----------------- 4 files changed, 51 insertions(+), 68 deletions(-) diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 580eb680ebdc..f512ce3ea251 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -26,8 +26,11 @@ // Include ndstypes.h for uint16 etc. typedefs #include "nds/ndstypes.h" -// Somebody removed these from scummsys.h, but they're still required, so I'm -// adding them here in the hope that they'll stay. +// Define SCUMMVM_DONT_DEFINE_TYPES to prevent scummsys.h from trying to +// re-define those data types. +#define SCUMMVM_DONT_DEFINE_TYPES + +// Include required headers #include #include #include diff --git a/backends/platform/n64/portdefs.h b/backends/platform/n64/portdefs.h index e62551355d1f..35ef3c71dbc3 100644 --- a/backends/platform/n64/portdefs.h +++ b/backends/platform/n64/portdefs.h @@ -35,5 +35,18 @@ #undef assert #define assert(x) ((x) ? 0 : (print_error("ASSERT TRIGGERED:\n\n("#x")\n%s\nline: %d", __FILE__, __LINE__))) +// Typedef basic data types in a way that is compatible with the N64 SDK. +typedef unsigned char byte; +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short int uint16; +typedef signed short int int16; +typedef unsigned int uint32; +typedef signed int int32; + +// Define SCUMMVM_DONT_DEFINE_TYPES to prevent scummsys.h from trying to +// re-define those data types. +#define SCUMMVM_DONT_DEFINE_TYPES + #endif diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h index ebcd273659c1..8ad2fa98f503 100644 --- a/backends/platform/symbian/src/portdefs.h +++ b/backends/platform/symbian/src/portdefs.h @@ -18,8 +18,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + #ifndef SYMBIAN_PORTDEFS_H #define SYMBIAN_PORTDEFS_H + #include #include #include @@ -37,6 +39,25 @@ #define M_PI 3.14159265358979323846 #endif /* M_PI */ + +// Enable Symbians own datatypes +// This is done for two reasons +// a) uint is already defined by Symbians libc component +// b) Symbian is using its "own" datatyping, and the Scummvm port +// should follow this to ensure the best compability possible. +typedef unsigned char byte; +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short int uint16; +typedef signed short int int16; +typedef unsigned long int uint32; +typedef signed long int int32; + +// Define SCUMMVM_DONT_DEFINE_TYPES to prevent scummsys.h from trying to +// re-define those data types. +#define SCUMMVM_DONT_DEFINE_TYPES + + #define DISABLE_COMMAND_LINE #if defined(USE_TREMOR) && !defined(USE_VORBIS) diff --git a/common/scummsys.h b/common/scummsys.h index 5cf3ba4dadab..cc8f3b987ab1 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -320,75 +320,21 @@ // -// Typedef our system types +// Typedef our system types unless they have already been defined by config.h, +// or SCUMMVM_DONT_DEFINE_TYPES is set. // -#if !defined(HAVE_CONFIG_H) - - #if defined(__SYMBIAN32__) - - // Enable Symbians own datatypes - // This is done for two reasons - // a) uint is already defined by Symbians libc component - // b) Symbian is using its "own" datatyping, and the Scummvm port - // should follow this to ensure the best compability possible. - typedef unsigned char byte; - - typedef unsigned char uint8; - typedef signed char int8; - - typedef unsigned short int uint16; - typedef signed short int int16; - - typedef unsigned long int uint32; - typedef signed long int int32; - - #elif defined(__GP32__) - - // Override typenames. uint is already defined by system header files. - typedef unsigned char byte; - - typedef unsigned char uint8; - typedef signed char int8; - - typedef unsigned short int uint16; - typedef signed short int int16; - - typedef unsigned long int uint32; - typedef signed long int int32; - - #elif defined(__N64__) - - typedef unsigned char byte; - - typedef unsigned char uint8; - typedef signed char int8; - - typedef unsigned short int uint16; - typedef signed short int int16; - - typedef unsigned int uint32; - typedef signed int int32; - - #elif defined(__DS__) - - // Do nothing, the SDK defines all types we need in nds/ndstypes.h, - // which we include in our portsdef.h - - #else - - typedef unsigned char byte; - typedef unsigned char uint8; - typedef signed char int8; - typedef unsigned short uint16; - typedef signed short int16; - typedef unsigned int uint32; - typedef signed int int32; - typedef unsigned int uint; - - #endif - +#if !defined(HAVE_CONFIG_H) && !defined(SCUMMVM_DONT_DEFINE_TYPES) + typedef unsigned char byte; + typedef unsigned char uint8; + typedef signed char int8; + typedef unsigned short uint16; + typedef signed short int16; + typedef unsigned int uint32; + typedef signed int int32; + typedef unsigned int uint; #endif + // // Define scumm_stricmp and scumm_strnicmp // From 2d6be5d0771ef3c3ac5d7dac1bdb5b0aab4793c6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 13:56:28 +0200 Subject: [PATCH 297/369] COMMON: Move more stuff from scummsys.h to portdefs.h --- backends/platform/symbian/src/portdefs.h | 1 + backends/platform/wince/portdefs.h | 60 ++++++++++++++---------- common/scummsys.h | 12 +---- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h index 8ad2fa98f503..86460e65c54b 100644 --- a/backends/platform/symbian/src/portdefs.h +++ b/backends/platform/symbian/src/portdefs.h @@ -57,6 +57,7 @@ typedef signed long int int32; // re-define those data types. #define SCUMMVM_DONT_DEFINE_TYPES +#define SMALL_SCREEN_DEVICE #define DISABLE_COMMAND_LINE diff --git a/backends/platform/wince/portdefs.h b/backends/platform/wince/portdefs.h index 64aa80abf26f..93df6cd39e97 100644 --- a/backends/platform/wince/portdefs.h +++ b/backends/platform/wince/portdefs.h @@ -20,40 +20,47 @@ * */ -// Missing string/stdlib/assert declarations for WinCE 2.xx +#ifndef WINCE_PORTDEFS_H +#define WINCE_PORTDEFS_H + +#ifndef _WIN32_WCE +#error For use on WinCE only +#endif +// Missing string/stdlib/assert declarations for WinCE 2.xx #if _WIN32_WCE < 300 -void *calloc(size_t n, size_t s); -int isalnum(int c); -int isdigit(int c); -int isprint(int c); -int isspace(int c); -char *strrchr(const char *s, int c); -char *strdup(const char *s); -void assert(void *expression); -void assert(int expression); -long int strtol(const char *nptr, char **endptr, int base); -char *_strdup(const char *s); -char *strpbrk(const char *s, const char *accept); + #define SMALL_SCREEN_DEVICE + + void *calloc(size_t n, size_t s); + int isalnum(int c); + int isdigit(int c); + int isprint(int c); + int isspace(int c); + char *strrchr(const char *s, int c); + char *strdup(const char *s); + void assert(void *expression); + void assert(int expression); + long int strtol(const char *nptr, char **endptr, int base); + char *_strdup(const char *s); + char *strpbrk(const char *s, const char *accept); #endif -#ifdef _WIN32_WCE #ifndef __GNUC__ -void *bsearch(const void *, const void *, size_t, size_t, int (*x)(const void *, const void *)); -char *getcwd(char *buf, int size); -typedef int ptrdiff_t; -void GetCurrentDirectory(int len, char *buf); -#define INVALID_FILE_ATTRIBUTES 0xffffffff + void *bsearch(const void *, const void *, size_t, size_t, int (*x)(const void *, const void *)); + char *getcwd(char *buf, int size); + typedef int ptrdiff_t; + void GetCurrentDirectory(int len, char *buf); + #define INVALID_FILE_ATTRIBUTES 0xffffffff #else -#include -#undef GetCurrentDirectory -extern "C" void GetCurrentDirectory(int len, char *buf); -#define snprintf _snprintf -#define strdup _strdup -#define fopen wce_fopen + #include + #undef GetCurrentDirectory + extern "C" void GetCurrentDirectory(int len, char *buf); + #define snprintf _snprintf + #define strdup _strdup + #define fopen wce_fopen #endif #include @@ -68,7 +75,7 @@ extern "C" void GetCurrentDirectory(int len, char *buf); //#include #ifdef __MINGW32CE__ -void *bsearch(const void *, const void *, size_t, size_t, int (*x)(const void *, const void *)); + void *bsearch(const void *, const void *, size_t, size_t, int (*x)(const void *, const void *)); #endif int remove(const char *path); int _access(const char *path, int mode); @@ -77,4 +84,5 @@ void drawError(char *); #define vsnprintf _vsnprintf + #endif diff --git a/common/scummsys.h b/common/scummsys.h index cc8f3b987ab1..300009119912 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -225,17 +225,7 @@ // Some more system specific settings. // TODO/FIXME: All of these should be moved to backend specific files (such as portdefs.h) // -#if defined(__SYMBIAN32__) - - #define SMALL_SCREEN_DEVICE - -#elif defined(_WIN32_WCE) - - #if _WIN32_WCE < 300 - #define SMALL_SCREEN_DEVICE - #endif - -#elif defined(DINGUX) +#if defined(DINGUX) // Very BAD hack following, used to avoid triggering an assert in uClibc dingux library // "toupper" when pressing keyboard function keys. From 8654e846e4005d25f46587188c8964dc2e0a65d9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 14:05:37 +0200 Subject: [PATCH 298/369] COMMON: Shorten endianess / mem align guessing logic in scummsys.h --- common/scummsys.h | 107 ++++++++++++++-------------------------------- 1 file changed, 33 insertions(+), 74 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index 300009119912..f7743a894193 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -136,88 +136,47 @@ // #define SCUMMVM_USE_PRAGMA_PACK +// +// Determine the host endianess and whether memory alignment is required. +// +#if !defined(HAVE_CONFIG_H) + #if defined(SDL_BACKEND) + /* need this for the SDL_BYTEORDER define */ + #include + + #if SDL_BYTEORDER == SDL_LIL_ENDIAN + #define SCUMM_LITTLE_ENDIAN + #elif SDL_BYTEORDER == SDL_BIG_ENDIAN + #define SCUMM_BIG_ENDIAN + #else + #error Neither SDL_BIG_ENDIAN nor SDL_LIL_ENDIAN is set. + #endif -#if defined(HAVE_CONFIG_H) - // All settings should have been set in config.h - -#elif defined(__SYMBIAN32__) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(_WIN32_WCE) - - #define SCUMM_LITTLE_ENDIAN + #elif defined(__DC__) || \ + defined(__DS__) || \ + defined(__GP32__) || \ + defined(IPHONE) || \ + defined(__PLAYSTATION2__) || \ + defined(__PSP__) || \ + defined(__SYMBIAN32__) -#elif defined(_MSC_VER) + #define SCUMM_LITTLE_ENDIAN + #define SCUMM_NEED_ALIGNMENT - #define SCUMM_LITTLE_ENDIAN + #elif defined(_WIN32_WCE) || defined(_MSC_VER) || defined(__MINGW32__) -#elif defined(__MINGW32__) + #define SCUMM_LITTLE_ENDIAN - #define SCUMM_LITTLE_ENDIAN + #elif defined(__amigaos4__) || defined(__N64__) || defined(__WII__) -#elif defined(SDL_BACKEND) - /* need this for the SDL_BYTEORDER define */ - #include + #define SCUMM_BIG_ENDIAN + #define SCUMM_NEED_ALIGNMENT - #if SDL_BYTEORDER == SDL_LIL_ENDIAN - #define SCUMM_LITTLE_ENDIAN - #elif SDL_BYTEORDER == SDL_BIG_ENDIAN - #define SCUMM_BIG_ENDIAN #else - #error Neither SDL_BIG_ENDIAN nor SDL_LIL_ENDIAN is set. - #endif - -#elif defined(__DC__) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__GP32__) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__PLAYSTATION2__) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__N64__) - #define SCUMM_BIG_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__PSP__) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__amigaos4__) - - #define SCUMM_BIG_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(__DS__) - - #define SCUMM_NEED_ALIGNMENT - #define SCUMM_LITTLE_ENDIAN - -#elif defined(__WII__) - - #define SCUMM_BIG_ENDIAN - #define SCUMM_NEED_ALIGNMENT - -#elif defined(IPHONE) - - #define SCUMM_LITTLE_ENDIAN - #define SCUMM_NEED_ALIGNMENT - - -#else - #error No system type defined + #error No system type defined, host endianess unknown. + #endif #endif @@ -284,7 +243,7 @@ #if defined(_MSC_VER) #define NORETURN_PRE __declspec(noreturn) #else - #define NORETURN_PRE + #define NORETURN_PRE #endif #endif @@ -292,7 +251,7 @@ #if defined(__GNUC__) || defined(__INTEL_COMPILER) #define NORETURN_POST __attribute__((__noreturn__)) #else - #define NORETURN_POST + #define NORETURN_POST #endif #endif From 1c198cec1b7f0f3025ca1db26a8d44b7584c6eee Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 14:06:47 +0200 Subject: [PATCH 299/369] COMMON: Move some weird WinCE/MSVC snprintf-#define around --- common/scummsys.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index f7743a894193..a09d6fd85f8c 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -44,6 +44,9 @@ #if (_MSC_VER < 1500) #define vsnprintf _vsnprintf #endif + // FIXME: Is this actually necessary for WinCE or Windows? + // If yes, please add corresponding comments. Otherwise, let's get rid of it! + #define snprintf _snprintf #endif #if !defined(_WIN32_WCE) @@ -289,10 +292,6 @@ // extern int scumm_stricmp(const char *s1, const char *s2); extern int scumm_strnicmp(const char *s1, const char *s2, uint n); -#if defined(_WIN32_WCE) || defined(_MSC_VER) - // FIXME: Why is this necessary? - #define snprintf _snprintf -#endif // From e06ca6560f6c4295a9cd3828abfbeec5286630c6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 14:19:25 +0200 Subject: [PATCH 300/369] COMMON: Move scumm_str(n)icmp declaration to str.h --- common/scummsys.h | 7 ------- common/str.h | 3 +++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index a09d6fd85f8c..7b81dabece23 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -287,13 +287,6 @@ #endif -// -// Define scumm_stricmp and scumm_strnicmp -// -extern int scumm_stricmp(const char *s1, const char *s2); -extern int scumm_strnicmp(const char *s1, const char *s2, uint n); - - // // Overlay color type (FIXME: shouldn't be declared here) // diff --git a/common/str.h b/common/str.h index b85c3812a7a4..7b97dfe94565 100644 --- a/common/str.h +++ b/common/str.h @@ -378,4 +378,7 @@ size_t strlcat(char *dst, const char *src, size_t size); } // End of namespace Common +extern int scumm_stricmp(const char *s1, const char *s2); +extern int scumm_strnicmp(const char *s1, const char *s2, uint n); + #endif From 811b257014c9e30a2fea9b189b2d37751cdb2e07 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 14:22:19 +0200 Subject: [PATCH 301/369] COMMON: Simplify OverlayColor definition This typedef still should be moved somewhere else. Maybe a header file of its own? --- common/scummsys.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index 7b81dabece23..18e21a2bc3b6 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -290,13 +290,7 @@ // // Overlay color type (FIXME: shouldn't be declared here) // -#if defined(NEWGUI_256) - // 256 color only on PalmOS - typedef byte OverlayColor; -#else - // 15/16 bit color mode everywhere else... - typedef uint16 OverlayColor; -#endif +typedef uint16 OverlayColor; #include "common/forbidden.h" From 42fa23ff1626e3232ce6ec240dc93b119c079c60 Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Tue, 31 May 2011 15:15:19 +0200 Subject: [PATCH 302/369] CONFIGURE: move some libs required by n64 port Some system libs weren't found during link stage, this should fix it --- configure | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/configure b/configure index c8cb45554d9c..fe5784caed44 100755 --- a/configure +++ b/configure @@ -2249,7 +2249,7 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(N64SDK)/hkz-libn64' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs" - LIBS="$LIBS -lm -lstdc++ -lc -lgcc -lz -lnosys" + LIBS="$LIBS -lm -lstdc++ -lz" ;; null) DEFINES="$DEFINES -DUSE_NULL_DRIVER" @@ -3208,6 +3208,11 @@ case $_backend in # than pick up anything unhygenic from the Android libs. LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" ;; + n64) + # Move some libs down here, otherwise some symbols requires by libvorbis aren't found + # during linking stage + LIBS="$LIBS -lc -lgcc -lnosys" + ;; esac From 05ac17f7b95dd9a5d7d65791835eb6b356f05460 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Tue, 31 May 2011 16:13:26 +0200 Subject: [PATCH 303/369] SCI: Fix up start/end points when pathfinding with opt == 0. Fixes bug #3304901: "SCI: Freddy Pharkas - Stuck in the brothel door". --- engines/sci/engine/kpathing.cpp | 94 +++++++++++++++++---------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 0a4e2380a854..8904a4897823 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -34,6 +34,8 @@ namespace Sci { +// TODO: Code cleanup + #define AVOIDPATH_DYNMEM_STRING "AvoidPath polyline" #define POLY_LAST_POINT 0x7777 @@ -1174,7 +1176,6 @@ static void change_polygons_opt_0(PathfindingState *s) { static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Common::Point start, Common::Point end, int width, int height, int opt) { SegManager *segMan = s->_segMan; Polygon *polygon; - int err; int count = 0; PathfindingState *pf_s = new PathfindingState(width, height); @@ -1197,50 +1198,53 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co } } - if (opt == 0) { - Common::Point intersection; - - // Keyboard support - // FIXME: We don't need to dijkstra for keyboard support as we currently do + if (opt == 0) change_polygons_opt_0(pf_s); - // Find nearest intersection - err = nearest_intersection(pf_s, start, end, &intersection); - - if (err == PF_FATAL) { - warning("AvoidPath: fatal error finding nearest intersection"); - delete pf_s; - return NULL; - } - - if (err == PF_OK) { - // Intersection was found, prepend original start position after pathfinding - pf_s->_prependPoint = new Common::Point(start); - // Merge new start point into polygon set - pf_s->vertex_start = merge_point(pf_s, intersection); - } else { - // Otherwise we proceed with the original start point - pf_s->vertex_start = merge_point(pf_s, start); - } - // Merge end point into polygon set - pf_s->vertex_end = merge_point(pf_s, end); - } else { - Common::Point *new_start = fixup_start_point(pf_s, start); + Common::Point *new_start = fixup_start_point(pf_s, start); + + if (!new_start) { + warning("AvoidPath: Couldn't fixup start position for pathfinding"); + delete pf_s; + return NULL; + } - if (!new_start) { - warning("AvoidPath: Couldn't fixup start position for pathfinding"); - delete pf_s; - return NULL; - } + Common::Point *new_end = fixup_end_point(pf_s, end); + + if (!new_end) { + warning("AvoidPath: Couldn't fixup end position for pathfinding"); + delete new_start; + delete pf_s; + return NULL; + } - Common::Point *new_end = fixup_end_point(pf_s, end); + if (opt == 0) { + // Keyboard support. Only the first edge of the path we compute + // here matches the path returned by SSCI. This is assumed to be + // sufficient as all known use cases only use the first two + // vertices of the returned path. + // Pharkas uses this mode for a secondary polygon set containing + // rectangular polygons used to block an actor's path. + + // If we have a prepended point, we do nothing here as the + // actor is in barred territory and should be moved outside of + // it ASAP. This matches the behavior of SSCI. + if (!pf_s->_prependPoint) { + // Actor position is OK, find nearest obstacle. + int err = nearest_intersection(pf_s, start, *new_end, new_start); + + if (err == PF_FATAL) { + warning("AvoidPath: error finding nearest intersection"); + delete new_start; + delete new_end; + delete pf_s; + return NULL; + } - if (!new_end) { - warning("AvoidPath: Couldn't fixup end position for pathfinding"); - delete pf_s; - return NULL; + if (err == PF_OK) + pf_s->_prependPoint = new Common::Point(start); } - + } else { // WORKAROUND LSL5 room 660. Priority glitch due to us choosing a different path // than SSCI. Happens when Patti walks to the control room. if (g_sci->getGameId() == GID_LSL5 && (s->currentRoomNumber() == 660) && (Common::Point(67, 131) == *new_start) && (Common::Point(229, 101) == *new_end)) { @@ -1248,14 +1252,14 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co pf_s->_prependPoint = new_start; new_start = new Common::Point(77, 107); } + } - // Merge start and end points into polygon set - pf_s->vertex_start = merge_point(pf_s, *new_start); - pf_s->vertex_end = merge_point(pf_s, *new_end); + // Merge start and end points into polygon set + pf_s->vertex_start = merge_point(pf_s, *new_start); + pf_s->vertex_end = merge_point(pf_s, *new_end); - delete new_start; - delete new_end; - } + delete new_start; + delete new_end; // Allocate and build vertex index pf_s->vertex_index = (Vertex**)malloc(sizeof(Vertex *) * (count + 2)); From c86a6c466fabe31fbf36363aa8d0ac8ea6001b9f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 31 May 2011 18:08:15 +0200 Subject: [PATCH 304/369] COMMON: Include SDL_endian.h instead of SDL_byteorder.h --- common/scummsys.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/scummsys.h b/common/scummsys.h index 18e21a2bc3b6..62e244585ad6 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -145,7 +145,7 @@ #if !defined(HAVE_CONFIG_H) #if defined(SDL_BACKEND) /* need this for the SDL_BYTEORDER define */ - #include + #include #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define SCUMM_LITTLE_ENDIAN From bf8cfcb6b742566308085126e99ab1338370a14e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 31 May 2011 13:58:05 -0400 Subject: [PATCH 305/369] AUDIO: Plug MPEG-4/QuickTime audio into openStreamFile --- audio/audiostream.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp index 776f904e77aa..0cfbabf53bd6 100644 --- a/audio/audiostream.cpp +++ b/audio/audiostream.cpp @@ -33,6 +33,7 @@ #include "audio/audiostream.h" #include "audio/decoders/flac.h" #include "audio/decoders/mp3.h" +#include "audio/decoders/quicktime.h" #include "audio/decoders/raw.h" #include "audio/decoders/vorbis.h" @@ -51,7 +52,7 @@ struct StreamFileFormat { }; static const StreamFileFormat STREAM_FILEFORMATS[] = { - /* decoderName, fileExt, openStreamFuntion */ + /* decoderName, fileExt, openStreamFunction */ #ifdef USE_FLAC { "FLAC", ".flac", makeFLACStream }, { "FLAC", ".fla", makeFLACStream }, @@ -62,6 +63,7 @@ static const StreamFileFormat STREAM_FILEFORMATS[] = { #ifdef USE_MAD { "MPEG Layer 3", ".mp3", makeMP3Stream }, #endif + { "MPEG-4 Audio", ".m4a", makeQuickTimeStream }, { NULL, NULL, NULL } // Terminator }; From d3ea9ab2a9334747eb445c1b45aa30cb17ffdf1b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 31 May 2011 14:06:46 -0400 Subject: [PATCH 306/369] GROOVIE: Use openStreamFile() to open iOS audio files Now MP3, FLAC, Vorbis, and QuickTime/MPEG-4 audio files can be used interchangeably. --- engines/groovie/music.cpp | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 20353f4276c5..70e3abd55ff0 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -36,8 +36,6 @@ #include "common/textconsole.h" #include "audio/audiostream.h" #include "audio/midiparser.h" -#include "audio/decoders/mp3.h" -#include "audio/decoders/quicktime.h" namespace Groovie { @@ -234,20 +232,18 @@ void MusicPlayer::unload() { } void MusicPlayer::playCreditsIOS() { -#ifdef USE_MAD - Common::File *f = new Common::File(); - f->open("7th_Guest_Dolls_from_Hell_OC_ReMix.mp3"); - Audio::AudioStream *stream = Audio::makeMP3Stream(f, DisposeAfterUse::YES); + Audio::AudioStream *stream = Audio::SeekableAudioStream::openStreamFile("7th_Guest_Dolls_from_Hell_OC_ReMix"); + + if (!stream) { + warning("Could not find '7th_Guest_Dolls_from_Hell_OC_ReMix' audio file"); + return; + } + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_handleCreditsIOS, stream); -#else - warning("MAD library required for credits music"); -#endif } void MusicPlayer::stopCreditsIOS() { -#ifdef USE_MAD _vm->_system->getMixer()->stopHandle(_handleCreditsIOS); -#endif } // MusicPlayerMidi @@ -829,21 +825,22 @@ bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { // iOS port provides alternative intro sequence music if (info.filename == "gu39.xmi") { - info.filename = "intro.m4a"; + info.filename = "intro"; } else if (info.filename == "gu32.xmi") { - info.filename = "foyer.m4a"; + info.filename = "foyer"; } else { - // RL still says xmi, but we're after external m4a - info.filename.setChar('m', len-3); - info.filename.setChar('4', len-2); - info.filename.setChar('a', len-1); + // Remove the extension + info.filename.deleteLastChar(); + info.filename.deleteLastChar(); + info.filename.deleteLastChar(); + info.filename.deleteLastChar(); } // Create the audio stream - Audio::AudioStream *audStream = Audio::makeQuickTimeStream(info.filename); + Audio::AudioStream *audStream = Audio::SeekableAudioStream::openStreamFile(info.filename); if (!audStream) { - warning("Could not play MPEG-4 sound '%s'", info.filename.c_str()); + warning("Could not play audio file '%s'", info.filename.c_str()); return false; } From 5bb4ef13c518ac090036b57b8e6c7eea468768bd Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 31 May 2011 14:25:20 -0400 Subject: [PATCH 307/369] GROOVIE: Rename MusicPlayerMPEG4 to MusicPlayerIOS More fitting now that other music formats can be used now --- engines/groovie/groovie.cpp | 2 +- engines/groovie/music.cpp | 10 +++++----- engines/groovie/music.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 9027262a0cea..8b6ee2ca425e 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -158,7 +158,7 @@ Common::Error GroovieEngine::run() { _musicPlayer = new MusicPlayerMac(this); break; case Common::kPlatformIOS: - _musicPlayer = new MusicPlayerMPEG4(this); + _musicPlayer = new MusicPlayerIOS(this); break; default: _musicPlayer = new MusicPlayerXMI(this, _gameDescription->version == kGroovieT7G ? "fat" : "sample"); diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 26b345803765..9a3903e9dc93 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -765,26 +765,26 @@ Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadS return new Common::MemoryReadStream(output, size, DisposeAfterUse::YES); } -MusicPlayerMPEG4::MusicPlayerMPEG4(GroovieEngine *vm) : MusicPlayer(vm) { +MusicPlayerIOS::MusicPlayerIOS(GroovieEngine *vm) : MusicPlayer(vm) { vm->getTimerManager()->installTimerProc(&onTimer, 50 * 1000, this); } -MusicPlayerMPEG4::~MusicPlayerMPEG4() { +MusicPlayerIOS::~MusicPlayerIOS() { _vm->getTimerManager()->removeTimerProc(&onTimer); } -void MusicPlayerMPEG4::updateVolume() { +void MusicPlayerIOS::updateVolume() { // Just set the mixer volume for the music sound type _vm->_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, _userVolume * _gameVolume / 100); } -void MusicPlayerMPEG4::unload() { +void MusicPlayerIOS::unload() { MusicPlayer::unload(); _vm->_system->getMixer()->stopHandle(_handle); } -bool MusicPlayerMPEG4::load(uint32 fileref, bool loop) { +bool MusicPlayerIOS::load(uint32 fileref, bool loop) { // Find correct filename ResInfo info; _vm->_resMan->getResInfo(fileref, info); diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 5ef6a8e076cb..7af482e45d4b 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -163,10 +163,10 @@ class MusicPlayerMac : public MusicPlayerMidi { Common::SeekableReadStream *decompressMidi(Common::SeekableReadStream *stream); }; -class MusicPlayerMPEG4 : public MusicPlayer { +class MusicPlayerIOS : public MusicPlayer { public: - MusicPlayerMPEG4(GroovieEngine *vm); - ~MusicPlayerMPEG4(); + MusicPlayerIOS(GroovieEngine *vm); + ~MusicPlayerIOS(); protected: void updateVolume(); From a4d105c902ce1b24c4edd1f3eb43b995bc46c0dd Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 10:43:02 +0200 Subject: [PATCH 308/369] COMMON: Move SDL endian check a bit down --- common/scummsys.h | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index 62e244585ad6..b69125041915 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -143,19 +143,8 @@ // Determine the host endianess and whether memory alignment is required. // #if !defined(HAVE_CONFIG_H) - #if defined(SDL_BACKEND) - /* need this for the SDL_BYTEORDER define */ - #include - - #if SDL_BYTEORDER == SDL_LIL_ENDIAN - #define SCUMM_LITTLE_ENDIAN - #elif SDL_BYTEORDER == SDL_BIG_ENDIAN - #define SCUMM_BIG_ENDIAN - #else - #error Neither SDL_BIG_ENDIAN nor SDL_LIL_ENDIAN is set. - #endif - #elif defined(__DC__) || \ + #if defined(__DC__) || \ defined(__DS__) || \ defined(__GP32__) || \ defined(IPHONE) || \ @@ -175,6 +164,20 @@ #define SCUMM_BIG_ENDIAN #define SCUMM_NEED_ALIGNMENT + #elif defined(SDL_BACKEND) + // On SDL based ports, we try to use SDL_BYTEORDER to determine the + // endianess. We explicitly do this as the *last* thing we try, so that + // platform specific settings have precedence. + #include + + #if SDL_BYTEORDER == SDL_LIL_ENDIAN + #define SCUMM_LITTLE_ENDIAN + #elif SDL_BYTEORDER == SDL_BIG_ENDIAN + #define SCUMM_BIG_ENDIAN + #else + #error Neither SDL_BIG_ENDIAN nor SDL_LIL_ENDIAN is set. + #endif + #else #error No system type defined, host endianess unknown. From 90f2cde9fa27b06fe7753d68d4166bc10c833942 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 15:48:44 +0200 Subject: [PATCH 309/369] PS2: Do not add RELEASE_BUILD First merge screw up: I meant to comment these lines out (as they area now -- in fact, these lines did not exist pre-merge at all, I moved the -DRELEASE_BUILD additions manually to their own lines, so I could comment them out, and then promptly forgot. *sigh*) On the pro side, it was very easy to spot and correct this mistake! --- backends/platform/ps2/Makefile.gdb | 3 ++- backends/platform/ps2/Makefile.ps2 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backends/platform/ps2/Makefile.gdb b/backends/platform/ps2/Makefile.gdb index 1009f0fe4efd..1e2510d3f48f 100644 --- a/backends/platform/ps2/Makefile.gdb +++ b/backends/platform/ps2/Makefile.gdb @@ -62,7 +62,8 @@ INCDIR = ../../../ # DEPDIR = .deps DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -D__PS2_DEBUG__ -g -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR -DEFINES += -DRELEASE_BUILD +# for release builds: +#DEFINES += -DRELEASE_BUILD INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) INCLUDES += -I $(PS2GDB)/ee -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines diff --git a/backends/platform/ps2/Makefile.ps2 b/backends/platform/ps2/Makefile.ps2 index ea966ec236da..77cc735c5ff7 100644 --- a/backends/platform/ps2/Makefile.ps2 +++ b/backends/platform/ps2/Makefile.ps2 @@ -62,7 +62,8 @@ INCDIR = ../../../ # DEPDIR = .deps DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -G2 -O2 -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR -DEFINES += -DRELEASE_BUILD +# for release builds: +#DEFINES += -DRELEASE_BUILD INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) INCLUDES += -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines From dfb682288699e84321c14cc5d52cbd3fdaeba40c Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Wed, 1 Jun 2011 23:20:12 +0930 Subject: [PATCH 310/369] GROOVIE: Detect iOS platform based on binary existence Change to choice of music file encoding means the gu16.m4a may not exist --- engines/groovie/detection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index 87ad534c96d6..0dd510abca4a 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -116,7 +116,7 @@ static const GroovieGameDescription gameDescriptions[] = { "t7g", "", { { "script.grv", 0, "d1b8033b40aa67c076039881eccce90d", 16659}, - { "gu16.m4a", 0, NULL, 2051214 }, + { "SeventhGuest", 0, NULL, -1}, { NULL, 0, NULL, 0} }, Common::EN_ANY, Common::kPlatformIOS, ADGF_NO_FLAGS, From 136ffb5e0a07daa7a091053e60b3c128201f7769 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 15:58:19 +0200 Subject: [PATCH 311/369] DETECTOR: Get rid of unused kADFlagDontAugmentPreferredTarget It doesn't seem very useful to keep this around for future uses, either, at least I couldn't think of a convincing argument. If we really need something like this one day again, it is trivial enough to add it back. --- engines/advancedDetector.cpp | 8 +++----- engines/advancedDetector.h | 5 ----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 6874806bc7a3..ece435af1c47 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -196,12 +196,10 @@ static void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription * desc["gameid"] = params.singleid; } - if (!(params.flags & kADFlagDontAugmentPreferredTarget)) { - if (!desc.contains("preferredtarget")) - desc["preferredtarget"] = desc["gameid"]; + if (!desc.contains("preferredtarget")) + desc["preferredtarget"] = desc["gameid"]; - desc["preferredtarget"] = generatePreferredTarget(desc["preferredtarget"], realDesc); - } + desc["preferredtarget"] = generatePreferredTarget(desc["preferredtarget"], realDesc); if (params.flags & kADFlagUseExtraAsHint) desc["extra"] = realDesc->extra; diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 6ee0822f47ee..408c46556d55 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -100,11 +100,6 @@ struct ADFileBasedFallback { enum ADFlags { - /** - * Generate/augment preferred target with information on the language (if - * not equal to english) and platform (if not equal to PC). - */ - kADFlagDontAugmentPreferredTarget = (1 << 0), /** * Warn user about new variant if his version was detected with fallback */ From 48dac6ab7fa306d7ff499340d5678d74900e6c26 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 16:04:55 +0200 Subject: [PATCH 312/369] DETECTOR: Clarify warning a bit --- engines/advancedDetector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index ece435af1c47..d093c958e716 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -224,7 +224,7 @@ bool cleanupPirated(ADGameDescList &matched) { // We ruled out all variants and now have nothing if (matched.empty()) { - warning("Illegitimate copy of the game detected. We give no support in such cases %d", matched.size()); + warning("Illegitimate game copy detected. We give no support in such cases %d", matched.size()); return true; } From 29ed72115ef842247a8a0f4df571b216264312c8 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 16:45:18 +0200 Subject: [PATCH 313/369] ANDROID: Revert stable-only changes from commit cf41ac0f which I accidentally merged --- backends/platform/android/jni.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index b38dc518eedc..c4daf24e16f1 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -602,12 +602,10 @@ void JNI::setPause(JNIEnv *env, jobject self, jboolean value) { g_engine->pauseEngine(value); -#if 0 if (value && g_engine->hasFeature(Engine::kSupportsSavingDuringRuntime) && g_engine->canSaveGameStateCurrently()) g_engine->saveGameState(0, "Android parachute"); -#endif } pause = value; From 2f8e9b954ef94fbdf48ec5c2a1a0801d651da7e6 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 1 Jun 2011 17:28:59 +0200 Subject: [PATCH 314/369] COMMON: Add comment about MSVC's _snprintf. This includes a FIXME, since _snprintf behaves differently to snprintf. Not only in the return value (which is a minor difference, since we usually do not use it), but also since it does not always include a terminating null. --- common/scummsys.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index b69125041915..8ed61c2c53a5 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -44,8 +44,18 @@ #if (_MSC_VER < 1500) #define vsnprintf _vsnprintf #endif - // FIXME: Is this actually necessary for WinCE or Windows? - // If yes, please add corresponding comments. Otherwise, let's get rid of it! + // Visual Studio does not include snprintf in its standard C library. + // Instead it includes a function called _snprintf with somewhat + // similar semantics. The minor difference is that the return value in + // case the formatted string exceeds the buffer size is different. + // A much more dangerous one is that _snprintf does not always include + // a terminating null (Whoops!). + // + // FIXME: Provide a proper snprintf function for MSVC. It should at + // least always include a terminating null! + // + // See here for more details: + // http://msdn.microsoft.com/en-us/library/2ts7cx93%28v=VS.100%29.aspx #define snprintf _snprintf #endif From 007a33515f532bea20f13ed07c1c5340c58046ba Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 1 Jun 2011 17:31:33 +0200 Subject: [PATCH 315/369] COMMON: Add note about us defining vsnprintf as _vsnprintf for older MSVC versions. --- common/scummsys.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/scummsys.h b/common/scummsys.h index 8ed61c2c53a5..b6d5263791ca 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -40,7 +40,10 @@ #if defined(WIN32) #ifdef _MSC_VER - // vsnprintf is already defined in Visual Studio 2008 + // vnsprintf was introduced with Visual Studio 2008. The 2003 edition + // only included a function called _vsnprintf. We do not officially + // support MSVC 2003 anymore, but it should not hurt to still have + // this around here. #if (_MSC_VER < 1500) #define vsnprintf _vsnprintf #endif From b0a460e849fbad76e973fce57efd3d15a419e0f5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 18:17:01 +0200 Subject: [PATCH 316/369] DC: Use 'noserial' for release builds --- configure | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 5d371c067960..9bb1e113e050 100755 --- a/configure +++ b/configure @@ -1945,8 +1945,9 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" DEFINES="$DEFINES -DDISABLE_COMMAND_LINE" - # for release builds: - #DEFINES="$DEFINES -DNOSERIAL" + if test "$_release_build" = yes; then + DEFINES="$DEFINES -DNOSERIAL" + fi CXXFLAGS="$CXXFLAGS -O3" CXXFLAGS="$CXXFLAGS -funroll-loops" CXXFLAGS="$CXXFLAGS -fschedule-insns2" @@ -2233,7 +2234,11 @@ case $_backend in LDFLAGS="$LDFLAGS -nostartfiles" LDFLAGS="$LDFLAGS "'$(ronindir)/lib/crt0.o' LDFLAGS="$LDFLAGS "'-L$(ronindir)/lib' - LIBS="$LIBS -lronin -lm" + if test "$_release_build" = yes; then + LIBS="$LIBS -lronin-noserial -lm" + else + LIBS="$LIBS -lronin -lm" + fi ;; dingux) DEFINES="$DEFINES -DDINGUX" From 4bfd23783af5ec60a20872e0b34aab55efe74ea6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 18:17:35 +0200 Subject: [PATCH 317/369] DC: Clarify comment --- backends/platform/dc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/dc/Makefile b/backends/platform/dc/Makefile index 00d408fdaf2a..6da32a904999 100644 --- a/backends/platform/dc/Makefile +++ b/backends/platform/dc/Makefile @@ -12,7 +12,7 @@ LD = $(CXX) CXXFLAGS= -O3 -Wno-multichar -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks -fno-exceptions DEFINES = -D__DC__ -DNONSTANDARD_PORT -DUSE_MAD -DUSE_ZLIB -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DUSE_RGB_COLOR # For release builds: -#DEFINES := -DNOSERIAL +#DEFINES += -DNOSERIAL LDFLAGS = -Wl,-Ttext,0x8c010000 -nostartfiles $(ronindir)/lib/crt0.o INCLUDES= -I./ -I$(srcdir) -I$(ronindir)/include/ -I$(srcdir)/engines LIBS = -L$(ronindir)/lib -lmad -lronin -lz -lm From a2cad5a3d0fad607176c67eda26d6b12b01f5abf Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 1 Jun 2011 19:01:48 +0200 Subject: [PATCH 318/369] TSAGE: Little modification in order to match the executable in scene 6100 --- engines/tsage/ringworld_scenes1.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index b6daadbef775..82f0153d8f19 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -2999,6 +2999,13 @@ void Scene6100::Action5::dispatch() { if ((idx != 3) && (scene->_fadePercent == 100) && (tempSet.sqrt(zeroSet) < 150.0)) { switch (scene->_hitCount++) { + case 0: + scene->_soundHandler.startSound(233); + scene->showMessage(NULL, 0, NULL); + + if (!_globals->getFlag(76)) + scene->_probe.setAction(&scene->_action1); + break; case 1: scene->_soundHandler.startSound(233); scene->showMessage(NULL, 0, NULL); @@ -3006,7 +3013,6 @@ void Scene6100::Action5::dispatch() { if (!_globals->getFlag(76)) scene->_probe.setAction(&scene->_action2); break; - case 2: scene->_soundHandler.startSound(234); scene->showMessage(NULL, 0, NULL); @@ -3015,14 +3021,6 @@ void Scene6100::Action5::dispatch() { scene->_probe.setAction(NULL); scene->setAction(&scene->_action3); break; - - default: - scene->_soundHandler.startSound(233); - scene->showMessage(NULL, 0, NULL); - - if (!_globals->getFlag(76)) - scene->_probe.setAction(&scene->_action1); - break; } _globals->_scenePalette.clearListeners(); From c0d70b6dbb4dc18b74e810015472eae30785ec69 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 1 Jun 2011 19:04:38 +0200 Subject: [PATCH 319/369] TSAGE: Fix a valgrind warning in SceneObject initialization --- engines/tsage/core.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 8c1bd2fd3992..ae337765a206 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1688,6 +1688,7 @@ SceneObject::SceneObject() : SceneHotspot() { _flags |= OBJFLAG_PANES; _frameChange = 0; + _visage = 0; } SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() { From d2a8e8023e0f1173746c31eb7232d24cc544d2c9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 1 Jun 2011 22:04:31 +0200 Subject: [PATCH 320/369] COMMON: Implement two simple workaround wrappers for _vsnprintf and _snprintf for MSVC. This should assure vsnprintf and snprintf will now also always null terminate the result even for MSVC. Currently the functions are placed in scummsys.h, but that causes us to include two standard C library headers there (for MSVC at least). This is not particulary nice, so we should think of a better solution here. --- common/scummsys.h | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index b6d5263791ca..a425befecf14 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -40,26 +40,42 @@ #if defined(WIN32) #ifdef _MSC_VER - // vnsprintf was introduced with Visual Studio 2008. The 2003 edition - // only included a function called _vsnprintf. We do not officially - // support MSVC 2003 anymore, but it should not hurt to still have - // this around here. - #if (_MSC_VER < 1500) - #define vsnprintf _vsnprintf - #endif + + // FIXME: The placement of the workaround functions for MSVC below + // require us to include stdio.h and stdarg.h for MSVC here. This + // is not exactly nice... + // We should think of a better way of doing this. + #include + #include + + // MSVC's vsnprintf is either non-existant (2003) or bugged since it + // does not always include a terminating NULL (2005+). To work around + // that we fix up the _vsnprintf included. Note that the return value + // will still not match C99's specs! + inline int vsnprintf_msvc(char *str, size_t size, const char *format, va_list args) { + // We do not pass size - 1 here, to ensure we would get the same + // return value as when we would use _vsnprintf directly, since + // for example Common::String::format relies on this. + int retValue = _vsnprintf(str, size, format, args); + str[size - 1] = 0; + return retValue; + } + + #define vsnprintf vsnprintf_msvc + // Visual Studio does not include snprintf in its standard C library. // Instead it includes a function called _snprintf with somewhat // similar semantics. The minor difference is that the return value in // case the formatted string exceeds the buffer size is different. // A much more dangerous one is that _snprintf does not always include - // a terminating null (Whoops!). - // - // FIXME: Provide a proper snprintf function for MSVC. It should at - // least always include a terminating null! - // - // See here for more details: - // http://msdn.microsoft.com/en-us/library/2ts7cx93%28v=VS.100%29.aspx - #define snprintf _snprintf + // a terminating null (Whoops!). Instead we map to our fixed vsnprintf. + inline int snprintf(char *str, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int len = vsnprintf(str, size, format, args); + va_end(args); + return len; + } #endif #if !defined(_WIN32_WCE) From 6f5c18c661cc11827549206f823aa63502500355 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 1 Jun 2011 16:28:21 -0400 Subject: [PATCH 321/369] GIT: Ignore XCode user data --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 906c6a8a83f6..1219121b3596 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ lib*.a /.project /.cproject /.settings +/Icon.* /build @@ -147,3 +148,7 @@ ipch/ #Ignore default Visual Studio build folders [Dd]ebug/ [Rr]elease/ + +#Ignore XCode user data +xcuserdata +project.xcworkspace From 4c64cfc213a68fb03f84b40bc900247d2f89ed3e Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 1 Jun 2011 16:35:15 -0400 Subject: [PATCH 322/369] CREATE_PROJECT: Add Xcode project --- .../create_project.xcodeproj/project.pbxproj | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj diff --git a/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..a14f53b3f0c0 --- /dev/null +++ b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj @@ -0,0 +1,235 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + F9A66C691396D4DF00CEE494 /* codeblocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C5F1396D4DF00CEE494 /* codeblocks.cpp */; }; + F9A66C6A1396D4DF00CEE494 /* create_project.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C621396D4DF00CEE494 /* create_project.cpp */; }; + F9A66C6B1396D4DF00CEE494 /* msbuild.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C651396D4DF00CEE494 /* msbuild.cpp */; }; + F9A66C6C1396D4DF00CEE494 /* msvc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C671396D4DF00CEE494 /* msvc.cpp */; }; + F9A66C6F1396D4E800CEE494 /* visualstudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + F9A66C251396D36100CEE494 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + F9A66C271396D36100CEE494 /* create_project */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = create_project; sourceTree = BUILT_PRODUCTS_DIR; }; + F9A66C491396D47500CEE494 /* installer.vbs */ = {isa = PBXFileReference; lastKnownFileType = text; name = installer.vbs; path = ../scripts/installer.vbs; sourceTree = ""; }; + F9A66C4A1396D47500CEE494 /* postbuild.cmd */ = {isa = PBXFileReference; lastKnownFileType = text; name = postbuild.cmd; path = ../scripts/postbuild.cmd; sourceTree = ""; }; + F9A66C4B1396D47500CEE494 /* prebuild.cmd */ = {isa = PBXFileReference; lastKnownFileType = text; name = prebuild.cmd; path = ../scripts/prebuild.cmd; sourceTree = ""; }; + F9A66C4C1396D47500CEE494 /* revision.vbs */ = {isa = PBXFileReference; lastKnownFileType = text; name = revision.vbs; path = ../scripts/revision.vbs; sourceTree = ""; }; + F9A66C5F1396D4DF00CEE494 /* codeblocks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = codeblocks.cpp; path = ../codeblocks.cpp; sourceTree = ""; }; + F9A66C601396D4DF00CEE494 /* codeblocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = codeblocks.h; path = ../codeblocks.h; sourceTree = ""; }; + F9A66C611396D4DF00CEE494 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../config.h; sourceTree = ""; }; + F9A66C621396D4DF00CEE494 /* create_project.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = create_project.cpp; path = ../create_project.cpp; sourceTree = ""; }; + F9A66C631396D4DF00CEE494 /* create_project.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = create_project.h; path = ../create_project.h; sourceTree = ""; }; + F9A66C641396D4DF00CEE494 /* module.mk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = module.mk; path = ../module.mk; sourceTree = ""; }; + F9A66C651396D4DF00CEE494 /* msbuild.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = msbuild.cpp; path = ../msbuild.cpp; sourceTree = ""; }; + F9A66C661396D4DF00CEE494 /* msbuild.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msbuild.h; path = ../msbuild.h; sourceTree = ""; }; + F9A66C671396D4DF00CEE494 /* msvc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = msvc.cpp; path = ../msvc.cpp; sourceTree = ""; }; + F9A66C681396D4DF00CEE494 /* msvc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msvc.h; path = ../msvc.h; sourceTree = ""; }; + F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = visualstudio.cpp; path = ../visualstudio.cpp; sourceTree = ""; }; + F9A66C6E1396D4E800CEE494 /* visualstudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visualstudio.h; path = ../visualstudio.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F9A66C241396D36100CEE494 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F9A66C1C1396D36100CEE494 = { + isa = PBXGroup; + children = ( + F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */, + F9A66C6E1396D4E800CEE494 /* visualstudio.h */, + F9A66C5F1396D4DF00CEE494 /* codeblocks.cpp */, + F9A66C601396D4DF00CEE494 /* codeblocks.h */, + F9A66C611396D4DF00CEE494 /* config.h */, + F9A66C621396D4DF00CEE494 /* create_project.cpp */, + F9A66C631396D4DF00CEE494 /* create_project.h */, + F9A66C641396D4DF00CEE494 /* module.mk */, + F9A66C651396D4DF00CEE494 /* msbuild.cpp */, + F9A66C661396D4DF00CEE494 /* msbuild.h */, + F9A66C671396D4DF00CEE494 /* msvc.cpp */, + F9A66C681396D4DF00CEE494 /* msvc.h */, + F9A66C481396D45D00CEE494 /* Scripts */, + F9A66C281396D36100CEE494 /* Products */, + ); + sourceTree = ""; + }; + F9A66C281396D36100CEE494 /* Products */ = { + isa = PBXGroup; + children = ( + F9A66C271396D36100CEE494 /* create_project */, + ); + name = Products; + sourceTree = ""; + }; + F9A66C481396D45D00CEE494 /* Scripts */ = { + isa = PBXGroup; + children = ( + F9A66C491396D47500CEE494 /* installer.vbs */, + F9A66C4A1396D47500CEE494 /* postbuild.cmd */, + F9A66C4B1396D47500CEE494 /* prebuild.cmd */, + F9A66C4C1396D47500CEE494 /* revision.vbs */, + ); + name = Scripts; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F9A66C261396D36100CEE494 /* create_project */ = { + isa = PBXNativeTarget; + buildConfigurationList = F9A66C301396D36100CEE494 /* Build configuration list for PBXNativeTarget "create_project" */; + buildPhases = ( + F9A66C231396D36100CEE494 /* Sources */, + F9A66C241396D36100CEE494 /* Frameworks */, + F9A66C251396D36100CEE494 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = create_project; + productName = create_project; + productReference = F9A66C271396D36100CEE494 /* create_project */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F9A66C1E1396D36100CEE494 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = F9A66C211396D36100CEE494 /* Build configuration list for PBXProject "create_project" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = F9A66C1C1396D36100CEE494; + productRefGroup = F9A66C281396D36100CEE494 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F9A66C261396D36100CEE494 /* create_project */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + F9A66C231396D36100CEE494 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9A66C691396D4DF00CEE494 /* codeblocks.cpp in Sources */, + F9A66C6A1396D4DF00CEE494 /* create_project.cpp in Sources */, + F9A66C6B1396D4DF00CEE494 /* msbuild.cpp in Sources */, + F9A66C6C1396D4DF00CEE494 /* msvc.cpp in Sources */, + F9A66C6F1396D4E800CEE494 /* visualstudio.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + F9A66C2E1396D36100CEE494 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.5; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + F9A66C2F1396D36100CEE494 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.5; + SDKROOT = macosx; + }; + name = Release; + }; + F9A66C311396D36100CEE494 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + F9A66C321396D36100CEE494 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F9A66C211396D36100CEE494 /* Build configuration list for PBXProject "create_project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9A66C2E1396D36100CEE494 /* Debug */, + F9A66C2F1396D36100CEE494 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F9A66C301396D36100CEE494 /* Build configuration list for PBXNativeTarget "create_project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9A66C311396D36100CEE494 /* Debug */, + F9A66C321396D36100CEE494 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F9A66C1E1396D36100CEE494 /* Project object */; +} From 5eae0e1a5c35c4c8453b90d6fa7230c9e51ede6a Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 1 Jun 2011 16:36:47 -0400 Subject: [PATCH 323/369] CREATE_PROJECT: Fix type conversion warning --- devtools/create_project/create_project.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index 17b3d29d0bbc..b7b63a789bb5 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -113,7 +113,7 @@ enum ProjectType { int main(int argc, char *argv[]) { #ifndef USE_WIN32_API // Initialize random number generator for UUID creation - std::srand(std::time(0)); + std::srand((uint)std::time(0)); #endif if (argc < 2) { From 9db33ea544afd2c24857b8229e97e532881383ca Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 23:17:43 +0200 Subject: [PATCH 324/369] ALL: Removed last traces of the MPEG2 code --- README | 5 +- .../gph/build/caanoo-config-alleng.sh | 4 +- backends/platform/gph/build/caanoo-config.sh | 4 +- .../platform/gph/build/gp2x-config-alleng.sh | 8 +- backends/platform/gph/build/gp2x-config.sh | 8 +- .../gph/build/gp2xwiz-config-alleng.sh | 5 +- backends/platform/gph/build/gp2xwiz-config.sh | 5 +- .../openpandora/build/config-alleng.sh | 1 - backends/platform/openpandora/build/config.sh | 1 - .../BuildPackageUpload_LocalSettings.pl | 7 - backends/platform/symbian/README | 3 - backends/platform/wince/Makefile | 6 - configure | 53 -- devtools/create_project/create_project.cpp | 1 - .../iphone/scummvm.xcodeproj/project.pbxproj | 16 - dists/redhat/README | 13 +- ports.mk | 4 - video/module.mk | 1 - video/mpeg_player.cpp | 622 ------------------ video/mpeg_player.h | 169 ----- 20 files changed, 32 insertions(+), 904 deletions(-) delete mode 100644 video/mpeg_player.cpp delete mode 100644 video/mpeg_player.h diff --git a/README b/README index 5f7c7ed2c66d..e13a8c9a01cf 100644 --- a/README +++ b/README @@ -2052,8 +2052,7 @@ compiler. Several compilers, including GCC, mingw and recent versions of Microsoft Visual C++ are supported. If you wish to use MP3-compressed CD tracks or .SOU files, you will need to install the MAD library; likewise you will need the appropriate libraries for Ogg Vorbis and FLAC -compressed sound. For MPEG2 support, libmpeg2 is required. For -compressed save states, zlib is required. +compressed sound. For compressed save states, zlib is required. Some parts of ScummVM, particularly scalers, have highly optimized versions written in assembler. If you wish to use this option, you will @@ -2137,7 +2136,7 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). Maemo: * Get Scratchbox environment with Maemo 2.2 rootstrap (2.2 is for 770 and up) - * Install libmad, Tremor, FLAC, libmpeg2 from source + * Install libmad, Tremor, FLAC from source * patch scummvm source (some stuff is currently too dirty to be in svn directly) patch -p1 < backends/platform/maemo/scummvm-[currentversion]-maemo.patch * update debian/changelog diff --git a/backends/platform/gph/build/caanoo-config-alleng.sh b/backends/platform/gph/build/caanoo-config-alleng.sh index 97fed942fa92..b7836508ed4c 100644 --- a/backends/platform/gph/build/caanoo-config-alleng.sh +++ b/backends/platform/gph/build/caanoo-config-alleng.sh @@ -8,10 +8,10 @@ echo and let all the build work be done from the backend/build folder. # Edit the configure line to suit. cd ../../../.. -./configure --backend=caanoo --disable-mt32emu --host=caanoo --disable-alsa --disable-flac \ +./configure --backend=caanoo --disable-mt32emu --host=caanoo \ + --disable-alsa --disable-flac \ --disable-nasm --disable-vorbis --disable-hq-scalers \ --with-sdl-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr/bin \ - --with-mpeg2-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-tremor --with-tremor-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-zlib --with-zlib-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-mad --with-mad-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ diff --git a/backends/platform/gph/build/caanoo-config.sh b/backends/platform/gph/build/caanoo-config.sh index 11d597481a50..fe191647e6cd 100644 --- a/backends/platform/gph/build/caanoo-config.sh +++ b/backends/platform/gph/build/caanoo-config.sh @@ -8,10 +8,10 @@ echo and let all the build work be done from the backend/build folder. # Edit the configure line to suit. cd ../../../.. -./configure --backend=caanoo --disable-mt32emu --host=caanoo --disable-alsa --disable-flac \ +./configure --backend=caanoo --disable-mt32emu --host=caanoo \ + --disable-alsa --disable-flac \ --disable-nasm --disable-vorbis --disable-hq-scalers \ --with-sdl-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr/bin \ - --with-mpeg2-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-tremor --with-tremor-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-zlib --with-zlib-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ --enable-mad --with-mad-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr \ diff --git a/backends/platform/gph/build/gp2x-config-alleng.sh b/backends/platform/gph/build/gp2x-config-alleng.sh index 4a3526d50c2c..83a4fe204623 100644 --- a/backends/platform/gph/build/gp2x-config-alleng.sh +++ b/backends/platform/gph/build/gp2x-config-alleng.sh @@ -17,7 +17,13 @@ export DEFINES=-DNDEBUG # Edit the configure line to suit. cd ../../../.. -./configure --backend=gp2x --disable-mt32emu --host=gp2x --disable-flac --disable-nasm --disable-hq-scalers --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-all-engines --enable-vkeybd +./configure --backend=gp2x --disable-mt32emu --host=gp2x \ + --disable-flac --disable-nasm --disable-hq-scalers \ + --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin \ + --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-all-engines --enable-vkeybd #--enable-plugins --default-dynamic echo Generating config for GP2X complete. Check for errors. diff --git a/backends/platform/gph/build/gp2x-config.sh b/backends/platform/gph/build/gp2x-config.sh index 9092b0b1ea34..f474c4d0d4eb 100644 --- a/backends/platform/gph/build/gp2x-config.sh +++ b/backends/platform/gph/build/gp2x-config.sh @@ -17,7 +17,13 @@ export DEFINES=-DNDEBUG # Edit the configure line to suit. cd ../../../.. -./configure --backend=gp2x --disable-mt32emu --host=gp2x --disable-flac --disable-nasm --disable-hq-scalers --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-vkeybd --enable-plugins --default-dynamic +./configure --backend=gp2x --disable-mt32emu --host=gp2x \ + --disable-flac --disable-nasm --disable-hq-scalers \ + --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin \ + --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ + --enable-vkeybd --enable-plugins --default-dynamic # --disable-release --enable-debug # --enable-plugins --default-dynamic diff --git a/backends/platform/gph/build/gp2xwiz-config-alleng.sh b/backends/platform/gph/build/gp2xwiz-config-alleng.sh index 9ec8a09cd244..ff905d05858d 100644 --- a/backends/platform/gph/build/gp2xwiz-config-alleng.sh +++ b/backends/platform/gph/build/gp2xwiz-config-alleng.sh @@ -16,8 +16,9 @@ export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib # Edit the configure line to suit. cd ../../../.. -./configure --backend=gph --disable-mt32emu --host=gp2xwiz --disable-flac --disable-nasm --disable-hq-scalers \ - --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ +./configure --backend=gph --disable-mt32emu --host=gp2xwiz \ + --disable-flac --disable-nasm --disable-hq-scalers \ + --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin \ --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ diff --git a/backends/platform/gph/build/gp2xwiz-config.sh b/backends/platform/gph/build/gp2xwiz-config.sh index ac7c34ad121d..7be103602b0a 100644 --- a/backends/platform/gph/build/gp2xwiz-config.sh +++ b/backends/platform/gph/build/gp2xwiz-config.sh @@ -16,8 +16,9 @@ export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib # Edit the configure line to suit. cd ../../../.. -./configure --backend=gph --disable-mt32emu --host=gp2xwiz --disable-flac --disable-nasm --disable-hq-scalers \ - --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ +./configure --backend=gph --disable-mt32emu --host=gp2xwiz \ + --disable-flac --disable-nasm --disable-hq-scalers \ + --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin \ --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 \ diff --git a/backends/platform/openpandora/build/config-alleng.sh b/backends/platform/openpandora/build/config-alleng.sh index f3fa1a0f943f..4028f5f4deaf 100755 --- a/backends/platform/openpandora/build/config-alleng.sh +++ b/backends/platform/openpandora/build/config-alleng.sh @@ -19,7 +19,6 @@ export DEFINES=-DNDEBUG cd ../../../.. ./configure --backend=openpandora --host=openpandora --disable-nasm \ --with-sdl-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/bin \ - --with-mpeg2-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --disable-vorbis --enable-tremor --with-tremor-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --enable-zlib --with-zlib-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --enable-mad --with-mad-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ diff --git a/backends/platform/openpandora/build/config.sh b/backends/platform/openpandora/build/config.sh index 9bc52a9bc4b2..92476c55256a 100755 --- a/backends/platform/openpandora/build/config.sh +++ b/backends/platform/openpandora/build/config.sh @@ -19,7 +19,6 @@ export DEFINES=-DNDEBUG cd ../../../.. ./configure --backend=openpandora --host=openpandora --disable-nasm \ --with-sdl-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/bin \ - --with-mpeg2-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --disable-vorbis --enable-tremor --with-tremor-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --enable-zlib --with-zlib-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ --enable-mad --with-mad-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr \ diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl index cb1c508fa1f6..82c15ec3db3a 100644 --- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl +++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl @@ -104,9 +104,6 @@ #$SDK_LibraryDirs{'S90'}{'esdl.lib'} = "$SdlBase\\S90"; #$SDK_LibraryDirs{'UIQ2'}{'esdl.lib'} = "$SdlBase\\UIQ2" #$SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "$SdlBase\\UIQ3"; - - ## HardlySupported(TM) :P - #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "$DevBase\\mpeg2dec-0.4.0\\epoc"; } # now you can add $VariationSets only built on this PC below this line :) @@ -145,7 +142,6 @@ # $SDK_LibraryDirs{'S60v1'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v2'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S60"; # $SDK_LibraryDirs{'S80'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S80"; # $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S90"; - #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "C:\\S\\mpeg2dec-0.4.0\\epoc"; } # now you can add $VariationSets only built on this PC below this line :) @@ -183,7 +179,6 @@ $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S90"; $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60\\S60V3"; $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ\\UIQ3"; - #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "C:\\S\\mpeg2dec-0.4.0\\epoc"; } # now you can add $VariationSets only built on this PC below this line :) @@ -221,7 +216,6 @@ $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S90"; $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60\\S60V3"; $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ\\UIQ3"; - #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "C:\\S\\mpeg2dec-0.4.0\\epoc"; } # now you can add $VariationSets only built on this PC below this line :) @@ -259,7 +253,6 @@ $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S90"; $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60\\S60V3"; $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ\\UIQ3"; - #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "C:\\S\\mpeg2dec-0.4.0\\epoc"; } # now you can add $VariationSets only built on this PC below this line :) diff --git a/backends/platform/symbian/README b/backends/platform/symbian/README index 140f442fb6c9..1f49c52f0288 100644 --- a/backends/platform/symbian/README +++ b/backends/platform/symbian/README @@ -114,9 +114,6 @@ Building ScummVM - flac, the Free Lossless Audio Codec http://flac.sourceforge.net/ - - libmpeg2, a free MPEG-2 video stream decoder - http://libmpeg2.sourceforge.net - Compiling ScummVM ----------------- diff --git a/backends/platform/wince/Makefile b/backends/platform/wince/Makefile index a9741f396fbd..7f8d45b3de8e 100644 --- a/backends/platform/wince/Makefile +++ b/backends/platform/wince/Makefile @@ -47,7 +47,6 @@ ENABLE_MADE = STATIC_PLUGIN ## Pick which libraries you want to use here USE_MAD = 1 -#USE_MPEG2 = 1 #USE_TREMOR = 1 USE_TREMOLO = 1 #USE_FLAC = 1 @@ -133,11 +132,6 @@ DEFINES += -DUSE_MAD LIBS += -lmad endif -ifdef USE_MPEG2 -DEFINES += -DUSE_MPEG2 -LIBS += -lmpeg2 -endif - ifdef USE_TREMOR DEFINES += -DUSE_TREMOR -DUSE_VORBIS LIBS += -ltremorce diff --git a/configure b/configure index 9bb1e113e050..5d5d6d0c0220 100755 --- a/configure +++ b/configure @@ -130,7 +130,6 @@ _alsa=auto _seq_midi=auto _timidity=auto _zlib=auto -_mpeg2=no _png=auto _theoradec=auto _faad=auto @@ -746,9 +745,6 @@ Optional Libraries: --with-zlib-prefix=DIR Prefix where zlib is installed (optional) --disable-zlib disable zlib (compression) support [autodetect] - --with-mpeg2-prefix=DIR Prefix where libmpeg2 is installed (optional) - --enable-mpeg2 enable mpeg2 codec for cutscenes [no] - --with-opengl-prefix=DIR Prefix where OpenGL (ES) is installed (optional) --disable-opengl disable OpenGL (ES) support [autodetect] @@ -812,7 +808,6 @@ for ac_option in $@; do --disable-zlib) _zlib=no ;; --enable-nasm) _nasm=yes ;; --disable-nasm) _nasm=no ;; - --enable-mpeg2) _mpeg2=yes ;; --disable-png) _png=no ;; --enable-png) _png=yes ;; --disable-theoradec) _theoradec=no ;; @@ -842,11 +837,6 @@ for ac_option in $@; do FLUIDSYNTH_CFLAGS="-I$arg/include" FLUIDSYNTH_LIBS="-L$arg/lib" ;; - --with-mpeg2-prefix=*) - arg=`echo $ac_option | cut -d '=' -f 2` - MPEG2_CFLAGS="-I$arg/include" - MPEG2_LIBS="-L$arg/lib" - ;; --with-alsa-prefix=*) arg=`echo $ac_option | cut -d '=' -f 2` ALSA_CFLAGS="-I$arg/include" @@ -2871,49 +2861,6 @@ if test `get_engine_build sword25` = yes && test ! "$_zlib" = yes ; then engine_disable sword25 fi -# -# Check for LibMPEG2 -# -echocheck "libmpeg2 >= 0.3.2" -if test "$_mpeg2" = auto ; then - _mpeg2=no - cat > $TMPC << EOF -typedef signed $type_1_byte int8_t; -typedef signed $type_2_byte int16_t; -typedef signed $type_4_byte int32_t; - -typedef unsigned $type_1_byte uint8_t; -typedef unsigned $type_2_byte uint16_t; -typedef unsigned $type_4_byte uint32_t; - -#include -int main(void) { - /* mpeg2_state_t first appears in 0.4.0 */ - mpeg2_state_t state; - - #ifdef MPEG2_RELEASE - if (MPEG2_RELEASE >= MPEG2_VERSION(0, 3, 2)) - return 0; - #endif - return 1; -} -EOF - - if test -n "$_host"; then - # don't execute while cross compiling - cc_check $MPEG2_CFLAGS $MPEG2_LIBS -lmpeg2 && _mpeg2=yes - else - cc_check_no_clean $MPEG2_CFLAGS $MPEG2_LIBS -lmpeg2 && $TMPO$HOSTEXEEXT && _mpeg2=yes - cc_check_clean - fi -fi -if test "$_mpeg2" = yes ; then - INCLUDES="$INCLUDES $MPEG2_CFLAGS" - LIBS="$LIBS $MPEG2_LIBS -lmpeg2" -fi -define_in_config_if_yes "$_mpeg2" 'USE_MPEG2' -echo "$_mpeg2" - # # Check for libfluidsynth # diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index b7b63a789bb5..7573f115e964 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -729,7 +729,6 @@ const Feature s_features[] = { { "flac", "USE_FLAC", "libFLAC_static", true, "FLAC support" }, { "png", "USE_PNG", "libpng", true, "libpng support" }, { "theora", "USE_THEORADEC", "libtheora_static", true, "Theora decoding support" }, - { "mpeg2", "USE_MPEG2", "libmpeg2", false, "mpeg2 codec for cutscenes" }, // Feature flags { "scalers", "USE_SCALERS", "", true, "Scalers" }, diff --git a/dists/iphone/scummvm.xcodeproj/project.pbxproj b/dists/iphone/scummvm.xcodeproj/project.pbxproj index d1ab4101d7e3..b9b276d65419 100755 --- a/dists/iphone/scummvm.xcodeproj/project.pbxproj +++ b/dists/iphone/scummvm.xcodeproj/project.pbxproj @@ -2151,13 +2151,10 @@ DFAAAFFC0F0112DF003E9390 /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAAFFB0F0112DF003E9390 /* detection.cpp */; }; DFAAB0020F011392003E9390 /* thumbnail_intern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */; }; DFAAD23D0F50120E00C3A4E2 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAAD2390F50120E00C3A4E2 /* console.cpp */; }; - DFB0576811B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; DFB0576911B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; DFB0576A11B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; - DFB0576B11B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; DFB0576C11B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; DFB0576D11B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; - DFB0576E11B753AF0015AE65 /* mpeg_player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576211B753AF0015AE65 /* mpeg_player.cpp */; }; DFB0576F11B753AF0015AE65 /* qt_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576411B753AF0015AE65 /* qt_decoder.cpp */; }; DFB0577011B753AF0015AE65 /* video_decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0576611B753AF0015AE65 /* video_decoder.cpp */; }; DFB0577611B753DA0015AE65 /* rational.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0577411B753DA0015AE65 /* rational.cpp */; }; @@ -3151,7 +3148,6 @@ DFF95CBF0FB22D5700A3EC78 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A190E7BB34E00F5680E /* UIKit.framework */; }; DFF95CC00FB22D5700A3EC78 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A270E7BB37500F5680E /* AudioToolbox.framework */; }; DFF95CC10FB22D5700A3EC78 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF842A2E0E7BB39E00F5680E /* QuartzCore.framework */; }; - DFF95CCF0FB22D8500A3EC78 /* libmpeg2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD6476D0F49F7EF008E18EF /* libmpeg2.a */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -4765,8 +4761,6 @@ DFAAB0010F011392003E9390 /* thumbnail_intern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thumbnail_intern.cpp; sourceTree = ""; }; DFAAD2390F50120E00C3A4E2 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; DFAAD23A0F50120E00C3A4E2 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; - DFB0576211B753AF0015AE65 /* mpeg_player.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mpeg_player.cpp; sourceTree = ""; }; - DFB0576311B753AF0015AE65 /* mpeg_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpeg_player.h; sourceTree = ""; }; DFB0576411B753AF0015AE65 /* qt_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qt_decoder.cpp; sourceTree = ""; }; DFB0576511B753AF0015AE65 /* qt_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qt_decoder.h; sourceTree = ""; }; DFB0576611B753AF0015AE65 /* video_decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video_decoder.cpp; sourceTree = ""; }; @@ -4834,7 +4828,6 @@ DFD518B90DF34BA600854012 /* scale3x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale3x.h; sourceTree = ""; }; DFD6476B0F49F7EF008E18EF /* libFLAC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libFLAC.a; path = lib/libFLAC.a; sourceTree = ""; }; DFD6476C0F49F7EF008E18EF /* libmad.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmad.a; path = lib/libmad.a; sourceTree = ""; }; - DFD6476D0F49F7EF008E18EF /* libmpeg2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmpeg2.a; path = lib/libmpeg2.a; sourceTree = ""; }; DFD6476F0F49F7EF008E18EF /* libvorbisidec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvorbisidec.a; path = lib/libvorbisidec.a; sourceTree = ""; }; DFE470C10D81F4BA00B6D1FB /* commandLine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = commandLine.cpp; sourceTree = ""; }; DFE470C20D81F4BA00B6D1FB /* commandLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = commandLine.h; sourceTree = ""; }; @@ -5044,7 +5037,6 @@ DFF959050FB22D3000A3EC78 /* libmad.a in Frameworks */, DFF959060FB22D3100A3EC78 /* libFLAC.a in Frameworks */, DFF959080FB22D3300A3EC78 /* libvorbisidec.a in Frameworks */, - DFF95CCF0FB22D8500A3EC78 /* libmpeg2.a in Frameworks */, DF224E040FB23BC500C8E453 /* OpenGLES.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -5339,8 +5331,6 @@ DF6118610FE3A9410042AD3F /* dxa_decoder.h */, DF6118620FE3A9410042AD3F /* flic_decoder.cpp */, DF6118630FE3A9410042AD3F /* flic_decoder.h */, - DFB0576211B753AF0015AE65 /* mpeg_player.cpp */, - DFB0576311B753AF0015AE65 /* mpeg_player.h */, DFB0576411B753AF0015AE65 /* qt_decoder.cpp */, DFB0576511B753AF0015AE65 /* qt_decoder.h */, DF6118640FE3A9410042AD3F /* smk_decoder.cpp */, @@ -7107,7 +7097,6 @@ children = ( DFD6476B0F49F7EF008E18EF /* libFLAC.a */, DFD6476C0F49F7EF008E18EF /* libmad.a */, - DFD6476D0F49F7EF008E18EF /* libmpeg2.a */, DFD6476F0F49F7EF008E18EF /* libvorbisidec.a */, ); name = libs; @@ -8677,7 +8666,6 @@ DF9B9249118E46730069C19D /* error.cpp in Sources */, DF9B9254118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9263118E46FE0069C19D /* error.cpp in Sources */, - DFB0576B11B753AF0015AE65 /* mpeg_player.cpp in Sources */, DFB0576C11B753AF0015AE65 /* qt_decoder.cpp in Sources */, DFB0576D11B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577711B753DA0015AE65 /* rational.cpp in Sources */, @@ -9707,7 +9695,6 @@ DF9B924A118E46730069C19D /* error.cpp in Sources */, DF9B9256118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9264118E46FE0069C19D /* error.cpp in Sources */, - DFB0576E11B753AF0015AE65 /* mpeg_player.cpp in Sources */, DFB0576F11B753AF0015AE65 /* qt_decoder.cpp in Sources */, DFB0577011B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577811B753DA0015AE65 /* rational.cpp in Sources */, @@ -10738,7 +10725,6 @@ DF9B9248118E46730069C19D /* error.cpp in Sources */, DF9B9252118E46A00069C19D /* fontsjis.cpp in Sources */, DF9B9262118E46FE0069C19D /* error.cpp in Sources */, - DFB0576811B753AF0015AE65 /* mpeg_player.cpp in Sources */, DFB0576911B753AF0015AE65 /* qt_decoder.cpp in Sources */, DFB0576A11B753AF0015AE65 /* video_decoder.cpp in Sources */, DFB0577611B753DA0015AE65 /* rational.cpp in Sources */, @@ -11126,7 +11112,6 @@ ENABLE_TUCKER, USE_FLAC, USE_MAD, - USE_MPEG2, USE_TREMOR, USE_VORBIS, USE_ZLIB, @@ -11212,7 +11197,6 @@ ENABLE_TUCKER, USE_FLAC, USE_MAD, - USE_MPEG2, USE_TREMOR, USE_VORBIS, USE_ZLIB, diff --git a/dists/redhat/README b/dists/redhat/README index 9c1cccf6df76..d1cef0663245 100644 --- a/dists/redhat/README +++ b/dists/redhat/README @@ -8,9 +8,9 @@ adapt the below instructions where necessary. 1) Collect sources: -Place scummvm-%{version}.tar.bz2, libmad-0.15.1b.tar.bz2 and -mpeg2dec-0.4.0b.tar.bz2 in /usr/src/redhat/SOURCES . -If you have different versions of mpeg2dec or libmad, put the correct version +Place scummvm-%{version}.tar.bz2 and libmad-0.15.1b.tar.bz2 +in /usr/src/redhat/SOURCES . +If you have a different version of libmad, put the correct version numbers in the .spec file. Place scummvm.spec in /usr/src/redhat/SPECS . @@ -28,8 +28,7 @@ the source RPM in /usr/src/redhat/SRPMS -Note: libmad and mpeg2dec are statically linked into the scummvm binary -because Fedora does not carry libmad and mpeg2dec packages, so I did not +Note: libmad is statically linked into the scummvm binary +because Fedora does not carry a libmad package, so I did not want to make the scummvm package depend on them. -You can get libmad from http://www.underbit.com/products/mad/ -and mpeg2dec from http://libmpeg2.sourceforge.net/ . +You can get libmad from http://www.underbit.com/products/mad/ . diff --git a/ports.mk b/ports.mk index 8e7914dd3f6f..15dc7e854b89 100644 --- a/ports.mk +++ b/ports.mk @@ -92,10 +92,6 @@ ifdef USE_MAD OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libmad.a endif -ifdef USE_MPEG2 -OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libmpeg2.a -endif - ifdef USE_PNG OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libpng.a endif diff --git a/video/module.mk b/video/module.mk index 308b344a7502..d8132187854d 100644 --- a/video/module.mk +++ b/video/module.mk @@ -5,7 +5,6 @@ MODULE_OBJS := \ coktel_decoder.o \ dxa_decoder.o \ flic_decoder.o \ - mpeg_player.o \ qt_decoder.o \ smk_decoder.o \ video_decoder.o \ diff --git a/video/mpeg_player.cpp b/video/mpeg_player.cpp deleted file mode 100644 index fa98860a3878..000000000000 --- a/video/mpeg_player.cpp +++ /dev/null @@ -1,622 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -// The YUV to RGB conversion code is derived from SDL's YUV overlay code, which -// in turn appears to be derived from mpeg_play. The following copyright -// notices have been included in accordance with the original license. Please -// note that the term "software" in this context only applies to the -// buildLookup() and plotYUV*() functions below. - -// Copyright (c) 1995 The Regents of the University of California. -// All rights reserved. -// -// Permission to use, copy, modify, and distribute this software and its -// documentation for any purpose, without fee, and without written agreement is -// hereby granted, provided that the above copyright notice and the following -// two paragraphs appear in all copies of this software. -// -// IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR -// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT -// OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF -// CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -// ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO -// PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - -// Copyright (c) 1995 Erik Corry -// All rights reserved. -// -// Permission to use, copy, modify, and distribute this software and its -// documentation for any purpose, without fee, and without written agreement is -// hereby granted, provided that the above copyright notice and the following -// two paragraphs appear in all copies of this software. -// -// IN NO EVENT SHALL ERIK CORRY BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, -// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF -// THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF ERIK CORRY HAS BEEN ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ERIK CORRY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" -// BASIS, AND ERIK CORRY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, -// UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - -// Portions of this software Copyright (c) 1995 Brown University. -// All rights reserved. -// -// Permission to use, copy, modify, and distribute this software and its -// documentation for any purpose, without fee, and without written agreement -// is hereby granted, provided that the above copyright notice and the -// following two paragraphs appear in all copies of this software. -// -// IN NO EVENT SHALL BROWN UNIVERSITY BE LIABLE TO ANY PARTY FOR -// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT -// OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF BROWN -// UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// BROWN UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" -// BASIS, AND BROWN UNIVERSITY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, -// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - -#include "video/mpeg_player.h" -#include "common/file.h" -#include "common/system.h" -#include "common/util.h" - -namespace Video { - -BaseAnimationState::BaseAnimationState(OSystem *sys, int width, int height) - : _movieWidth(width), _movieHeight(height), _frameWidth(width), _frameHeight(height), _sys(sys) { -#ifndef BACKEND_8BIT - const int screenW = _sys->getOverlayWidth(); - const int screenH = _sys->getOverlayHeight(); - - _movieScale = MIN(screenW / _movieWidth, screenH / _movieHeight); - - assert(_movieScale >= 1); - if (_movieScale > 3) - _movieScale = 3; - - _colorTab = NULL; - _rgbToPix = NULL; - memset(&_overlayFormat, 0, sizeof(_overlayFormat)); -#endif -} - -BaseAnimationState::~BaseAnimationState() { -#ifdef USE_MPEG2 - if (_mpegDecoder) - mpeg2_close(_mpegDecoder); - delete _mpegFile; -#ifndef BACKEND_8BIT - _sys->hideOverlay(); - free(_overlay); - free(_colorTab); - free(_rgbToPix); -#endif -#endif -} - - -bool BaseAnimationState::init(const char *name) { -#ifdef USE_MPEG2 - char tempFile[512]; - - _mpegDecoder = NULL; - _mpegFile = NULL; - -#ifdef BACKEND_8BIT - - uint i, p; - - // Load lookup palettes - sprintf(tempFile, "%s.pal", name); - - Common::File f; - - if (!f.open(tempFile)) { - warning("Cutscene: %s palette missing", tempFile); - return false; - } - - p = 0; - while (!f.eos()) { - _palettes[p].end = f.readUint16LE(); - _palettes[p].cnt = f.readUint16LE(); - - for (i = 0; i < _palettes[p].cnt; i++) { - _palettes[p].pal[4 * i] = f.readByte(); - _palettes[p].pal[4 * i + 1] = f.readByte(); - _palettes[p].pal[4 * i + 2] = f.readByte(); - _palettes[p].pal[4 * i + 3] = 0; - } - for (; i < 256; i++) { - _palettes[p].pal[4 * i] = 0; - _palettes[p].pal[4 * i + 1] = 0; - _palettes[p].pal[4 * i + 2] = 0; - _palettes[p].pal[4 * i + 3] = 0; - } - - p++; - } - - f.close(); - - _palNum = 0; - _maxPalNum = p; - setPalette(_palettes[_palNum].pal); - _lut = _lut2 = _yuvLookup[0]; - _curPal = -1; - _cr = 0; - buildLookup(_palNum, 256); - _lut2 = _yuvLookup[1]; - _lutCalcNum = (BITDEPTH + _palettes[_palNum].end + 2) / (_palettes[_palNum].end + 2); -#else - buildLookup(); - _overlay = (OverlayColor *)calloc(_movieScale * _movieWidth * _movieScale * _movieHeight, sizeof(OverlayColor)); - _sys->showOverlay(); -#endif - - // Open MPEG2 stream - _mpegFile = new Common::File(); - sprintf(tempFile, "%s.mp2", name); - if (!_mpegFile->open(tempFile)) { - warning("Cutscene: Could not open %s", tempFile); - return false; - } - - // Load and configure decoder - _mpegDecoder = mpeg2_init(); - if (_mpegDecoder == NULL) { - warning("Cutscene: Could not allocate an MPEG2 decoder"); - return false; - } - - _mpegInfo = mpeg2_info(_mpegDecoder); - _frameNum = 0; - - return true; -#else /* USE_MPEG2 */ - return false; -#endif -} - -bool BaseAnimationState::decodeFrame() { -#ifdef USE_MPEG2 - mpeg2_state_t state; - const mpeg2_sequence_t *sequence_i; - size_t size = (size_t) -1; - static byte buf[BUFFER_SIZE]; - - do { - state = mpeg2_parse(_mpegDecoder); - sequence_i = _mpegInfo->sequence; - - switch (state) { - case STATE_BUFFER: - size = _mpegFile->read(buf, BUFFER_SIZE); - mpeg2_buffer(_mpegDecoder, buf, buf + size); - break; - - case STATE_SLICE: - case STATE_END: - if (_mpegInfo->display_fbuf) { - checkPaletteSwitch(); - drawYUV(sequence_i->width, sequence_i->height, _mpegInfo->display_fbuf->buf); -#ifdef BACKEND_8BIT - buildLookup(_palNum + 1, _lutCalcNum); -#endif - - _frameNum++; - return true; - } - break; - - default: - break; - } - } while (size); -#endif - return false; -} - -bool BaseAnimationState::checkPaletteSwitch() { -#ifdef BACKEND_8BIT - // if we have reached the last image with this palette, switch to new one - if (_frameNum == _palettes[_palNum].end) { - unsigned char *l = _lut2; - _palNum++; - setPalette(_palettes[_palNum].pal); - _lutCalcNum = (BITDEPTH + _palettes[_palNum].end - (_frameNum + 1) + 2) / (_palettes[_palNum].end - (_frameNum + 1) + 2); - _lut2 = _lut; - _lut = l; - return true; - } -#endif - - return false; -} - -void BaseAnimationState::handleScreenChanged() { -#ifndef BACKEND_8BIT - const int screenW = _sys->getOverlayWidth(); - const int screenH = _sys->getOverlayHeight(); - - int newScale = MIN(screenW / _movieWidth, screenH / _movieHeight); - - assert(newScale >= 1); - if (newScale > 3) - newScale = 3; - - if (newScale != _movieScale) { - // HACK: Since frames generally do not cover the entire screen, - // We need to undraw the old frame. This is a very hacky - // way of doing that. - OverlayColor *buf = (OverlayColor *)calloc(screenW * screenH, sizeof(OverlayColor)); - _sys->copyRectToOverlay(buf, screenW, 0, 0, screenW, screenH); - free(buf); - - free(_overlay); - _movieScale = newScale; - _overlay = (OverlayColor *)calloc(_movieScale * _movieWidth * _movieScale * _movieHeight, sizeof(OverlayColor)); - } - - buildLookup(); -#endif -} - -#ifdef BACKEND_8BIT - -/** - * Build 'Best-Match' RGB lookup table - */ -void BaseAnimationState::buildLookup(int p, int lines) { - int y, cb; - int r, g, b, ii; - - if (p >= _maxPalNum) - return; - - if (p != _curPal) { - _curPal = p; - _cr = 0; - _pos = 0; - } - - if (_cr > BITDEPTH) - return; - - for (ii = 0; ii < lines; ii++) { - r = (-16 * 256 + (int) (256 * 1.596) * ((_cr << SHIFT) - 128)) / 256; - for (cb = 0; cb <= BITDEPTH; cb++) { - g = (-16 * 256 - (int) (0.813 * 256) * ((_cr << SHIFT) - 128) - (int) (0.391 * 256) * ((cb << SHIFT) - 128)) / 256; - b = (-16 * 256 + (int) (2.018 * 256) * ((cb << SHIFT) - 128)) / 256; - - for (y = 0; y <= BITDEPTH; y++) { - int idx, bst = 0; - int dis = 2 * SQR(r - _palettes[p].pal[0]) + 4 * SQR(g - _palettes[p].pal[1]) + SQR(b - _palettes[p].pal[2]); - - for (idx = 1; idx < 256; idx++) { - long d2 = 2 * SQR(r - _palettes[p].pal[4 * idx]) + 4 * SQR(g - _palettes[p].pal[4 * idx + 1]) + SQR(b - _palettes[p].pal[4 * idx + 2]); - if (d2 < dis) { - bst = idx; - dis = d2; - } - } - _lut2[_pos++] = bst; - - r += (1 << SHIFT); - g += (1 << SHIFT); - b += (1 << SHIFT); - } - r -= (BITDEPTH + 1) * (1 << SHIFT); - } - _cr++; - if (_cr > BITDEPTH) - return; - } -} - -#else - -void BaseAnimationState::buildLookup() { - // Do we already have lookup tables for this bit format? - Graphics::PixelFormat format = _sys->getOverlayFormat(); - if (format == _overlayFormat && _colorTab && _rgbToPix) - return; - - free(_colorTab); - free(_rgbToPix); - - _colorTab = (int16 *)malloc(4 * 256 * sizeof(int16)); - - int16 *Cr_r_tab = &_colorTab[0 * 256]; - int16 *Cr_g_tab = &_colorTab[1 * 256]; - int16 *Cb_g_tab = &_colorTab[2 * 256]; - int16 *Cb_b_tab = &_colorTab[3 * 256]; - - _rgbToPix = (OverlayColor *)malloc(3 * 768 * sizeof(OverlayColor)); - - OverlayColor *r_2_pix_alloc = &_rgbToPix[0 * 768]; - OverlayColor *g_2_pix_alloc = &_rgbToPix[1 * 768]; - OverlayColor *b_2_pix_alloc = &_rgbToPix[2 * 768]; - - int16 CR, CB; - int i; - - // Generate the tables for the display surface - - for (i = 0; i < 256; i++) { - // Gamma correction (luminescence table) and chroma correction - // would be done here. See the Berkeley mpeg_play sources. - - CR = CB = (i - 128); - Cr_r_tab[i] = (int16) ( (0.419 / 0.299) * CR) + 0 * 768 + 256; - Cr_g_tab[i] = (int16) (-(0.299 / 0.419) * CR) + 1 * 768 + 256; - Cb_g_tab[i] = (int16) (-(0.114 / 0.331) * CB); - Cb_b_tab[i] = (int16) ( (0.587 / 0.331) * CB) + 2 * 768 + 256; - } - - // Set up entries 0-255 in rgb-to-pixel value tables. - for (i = 0; i < 256; i++) { - r_2_pix_alloc[i + 256] = format.RGBToColor(i, 0, 0); - g_2_pix_alloc[i + 256] = format.RGBToColor(0, i, 0); - b_2_pix_alloc[i + 256] = format.RGBToColor(0, 0, i); - } - - // Spread out the values we have to the rest of the array so that we do - // not need to check for overflow. - for (i = 0; i < 256; i++) { - r_2_pix_alloc[i] = r_2_pix_alloc[256]; - r_2_pix_alloc[i + 512] = r_2_pix_alloc[511]; - g_2_pix_alloc[i] = g_2_pix_alloc[256]; - g_2_pix_alloc[i + 512] = g_2_pix_alloc[511]; - b_2_pix_alloc[i] = b_2_pix_alloc[256]; - b_2_pix_alloc[i + 512] = b_2_pix_alloc[511]; - } - - _overlayFormat = format; -} - -void BaseAnimationState::plotYUV(int width, int height, byte *const *dat) { - switch (_movieScale) { - case 1: - plotYUV1x(width, height, dat); - break; - case 2: - plotYUV2x(width, height, dat); - break; - case 3: - plotYUV3x(width, height, dat); - break; - } -} - -void BaseAnimationState::plotYUV1x(int width, int height, byte *const *dat) { - byte *lum = dat[0]; - byte *cr = dat[2]; - byte *cb = dat[1]; - - byte *lum2 = lum + width; - - int16 cr_r; - int16 crb_g; - int16 cb_b; - - OverlayColor *row1 = _overlay; - OverlayColor *row2 = row1 + _movieWidth; - - int x; - - for (; height > 0; height -= 2) { - OverlayColor *r1 = row1; - OverlayColor *r2 = row2; - - for (x = width; x > 0; x -= 2) { - register OverlayColor *L; - - cr_r = _colorTab[*cr + 0 * 256]; - crb_g = _colorTab[*cr + 1 * 256] + _colorTab[*cb + 2 * 256]; - cb_b = _colorTab[*cb + 3 * 256]; - ++cr; - ++cb; - - L = &_rgbToPix[*lum++]; - *r1++ = L[cr_r] | L[crb_g] | L[cb_b]; - - L = &_rgbToPix[*lum++]; - *r1++ = L[cr_r] | L[crb_g] | L[cb_b]; - - // Now, do second row. - - L = &_rgbToPix[*lum2++]; - *r2++ = L[cr_r] | L[crb_g] | L[cb_b]; - - L = &_rgbToPix[*lum2++]; - *r2++ = L[cr_r] | L[crb_g] | L[cb_b]; - } - - lum += width; - lum2 += width; - row1 += 2 * _movieWidth; - row2 += 2 * _movieWidth; - } -} - -void BaseAnimationState::plotYUV2x(int width, int height, byte *const *dat) { - byte *lum = dat[0]; - byte *cr = dat[2]; - byte *cb = dat[1]; - - byte *lum2 = lum + width; - - int16 cr_r; - int16 crb_g; - int16 cb_b; - - OverlayColor *row1 = _overlay; - OverlayColor *row2 = row1 + 2 * 2 * _movieWidth; - - int x; - - for (; height > 0; height -= 2) { - OverlayColor *r1 = row1; - OverlayColor *r2 = row2; - - for (x = width; x > 0; x -= 2) { - register OverlayColor *L; - register OverlayColor C; - - cr_r = _colorTab[*cr + 0 * 256]; - crb_g = _colorTab[*cr + 1 * 256] + _colorTab[*cb + 2 * 256]; - cb_b = _colorTab[*cb + 3 * 256]; - ++cr; - ++cb; - - L = &_rgbToPix[*lum++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r1++ = C; - *r1++ = C; - - L = &_rgbToPix[*lum++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r1++ = C; - *r1++ = C; - - // Now, do second row. - - L = &_rgbToPix[*lum2++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r2++ = C; - *r2++ = C; - - L = &_rgbToPix[*lum2++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r2++ = C; - *r2++ = C; - } - - memcpy(row1 + 2 * _movieWidth, row1, 2 * _movieWidth * sizeof(OverlayColor)); - memcpy(row2 + 2 * _movieWidth, row2, 2 * _movieWidth * sizeof(OverlayColor)); - - lum += width; - lum2 += width; - row1 += 4 * 2 * _movieWidth; - row2 += 4 * 2 * _movieWidth; - } -} - -void BaseAnimationState::plotYUV3x(int width, int height, byte *const *dat) { - byte *lum = dat[0]; - byte *cr = dat[2]; - byte *cb = dat[1]; - - byte *lum2 = lum + width; - - int16 cr_r; - int16 crb_g; - int16 cb_b; - - OverlayColor *row1 = _overlay; - OverlayColor *row2 = row1 + 3 * 3 * _movieWidth; - - int x; - - for (; height > 0; height -= 2) { - OverlayColor *r1 = row1; - OverlayColor *r2 = row2; - - for (x = width; x > 0; x -= 2) { - register OverlayColor *L; - register OverlayColor C; - - cr_r = _colorTab[*cr + 0 * 256]; - crb_g = _colorTab[*cr + 1 * 256] + _colorTab[*cb + 2 * 256]; - cb_b = _colorTab[*cb + 3 * 256]; - ++cr; - ++cb; - - L = &_rgbToPix[*lum++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r1++ = C; - *r1++ = C; - *r1++ = C; - - L = &_rgbToPix[*lum++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r1++ = C; - *r1++ = C; - *r1++ = C; - - // Now, do second row. - - L = &_rgbToPix[*lum2++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r2++ = C; - *r2++ = C; - *r2++ = C; - - L = &_rgbToPix[*lum2++]; - C = L[cr_r] | L[crb_g] | L[cb_b]; - *r2++ = C; - *r2++ = C; - *r2++ = C; - } - - memcpy(row1 + 3 * _movieWidth, row1, 3 * _movieWidth * sizeof(OverlayColor)); - memcpy(row1 + 2 * 3 * _movieWidth, row1, 3 * _movieWidth * sizeof(OverlayColor)); - memcpy(row2 + 3 * _movieWidth, row2, 3 * _movieWidth * sizeof(OverlayColor)); - memcpy(row2 + 2 * 3 * _movieWidth, row2, 3 * _movieWidth * sizeof(OverlayColor)); - - lum += width; - lum2 += width; - row1 += 6 * 3 * _movieWidth; - row2 += 6 * 3 * _movieWidth; - } -} - -#endif - -void BaseAnimationState::updateScreen() { -#ifndef BACKEND_8BIT - int width = _movieScale * _frameWidth; - int height = _movieScale * _frameHeight; - int pitch = _movieScale * _movieWidth; - - const int screenW = _sys->getOverlayWidth(); - const int screenH = _sys->getOverlayHeight(); - - int x = (screenW - _movieScale * _frameWidth) / 2; - int y = (screenH - _movieScale * _frameHeight) / 2; - - _sys->copyRectToOverlay(_overlay, pitch, x, y, width, height); -#endif - _sys->updateScreen(); -} - -} // End of namespace Video diff --git a/video/mpeg_player.h b/video/mpeg_player.h deleted file mode 100644 index dca0a98a2f8b..000000000000 --- a/video/mpeg_player.h +++ /dev/null @@ -1,169 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef VIDEO_MPEG_PLAYER_H -#define VIDEO_MPEG_PLAYER_H - -#include "common/scummsys.h" -#include "graphics/pixelformat.h" - -// Uncomment this if you are using libmpeg2 0.3.1. -// #define USE_MPEG2_0_3_1 - -#ifdef USE_MPEG2 - -#if defined(__PLAYSTATION2__) - typedef uint8 uint8_t; - typedef uint16 uint16_t; - typedef uint32 uint32_t; -#elif defined(_WIN32_WCE) - typedef signed char int8_t; - typedef signed short int16_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; -#elif defined(_MSC_VER) - typedef signed char int8_t; - typedef signed short int16_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - #if !defined(SDL_COMPILEDVERSION) || (SDL_COMPILEDVERSION < 1210) - typedef signed long int32_t; - typedef unsigned long uint32_t; - #endif -#else -# include -#endif - -extern "C" { - #include -} - -#ifdef USE_MPEG2_0_3_1 -typedef int mpeg2_state_t; -typedef sequence_t mpeg2_sequence_t; -#define STATE_BUFFER -1 -#endif - -#endif - -#ifdef BACKEND_8BIT -#define SQR(x) ((x) * (x)) -#define SHIFT 3 -#else -#define SHIFT 1 -#endif - -#define BITDEPTH (1 << (8 - SHIFT)) -#define ROUNDADD (1 << (SHIFT - 1)) - -#define BUFFER_SIZE 4096 - -namespace Common { -class File; -} - -class OSystem; - -namespace Video { - -class BaseAnimationState { -protected: - const int _movieWidth; - const int _movieHeight; - - int _frameWidth; - int _frameHeight; - -#ifndef BACKEND_8BIT - int _movieScale; -#endif - - OSystem *_sys; - - uint _frameNum; - -#ifdef USE_MPEG2 - mpeg2dec_t *_mpegDecoder; - const mpeg2_info_t *_mpegInfo; -#endif - - Common::File *_mpegFile; - -#ifdef BACKEND_8BIT - int _palNum; - int _maxPalNum; - - byte _yuvLookup[2][(BITDEPTH+1) * (BITDEPTH+1) * (BITDEPTH+1)]; - byte *_lut; - byte *_lut2; - int _lutCalcNum; - - int _curPal; - int _cr; - int _pos; - - struct { - uint cnt; - uint end; - byte pal[4 * 256]; - } _palettes[50]; -#else - OverlayColor *_overlay; - Graphics::PixelFormat _overlayFormat; - int16 *_colorTab; - OverlayColor *_rgbToPix; -#endif - -public: - BaseAnimationState(OSystem *sys, int width, int height); - virtual ~BaseAnimationState(); - - bool init(const char *name); - bool decodeFrame(); - void handleScreenChanged(); - void updateScreen(); - -#ifndef BACKEND_8BIT - void buildLookup(); -#endif - - int getFrameWidth() { return _frameWidth; } - int getFrameHeight() { return _frameHeight; } - -protected: - bool checkPaletteSwitch(); - virtual void drawYUV(int width, int height, byte *const *dat) = 0; - -#ifdef BACKEND_8BIT - void buildLookup(int p, int lines); - virtual void setPalette(byte *pal) = 0; -#else - void plotYUV(int width, int height, byte *const *dat); - void plotYUV1x(int width, int height, byte *const *dat); - void plotYUV2x(int width, int height, byte *const *dat); - void plotYUV3x(int width, int height, byte *const *dat); -#endif -}; - -} // End of namespace Video - -#endif From 9717d5be6f416a36dfb81e1c47c9cea518b5d018 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 1 Jun 2011 17:34:32 -0400 Subject: [PATCH 325/369] CREATE_PROJECT: Add stubs for Xcode provider --- devtools/README | 2 +- .../codeblocks/create_project.cbp | 2 + devtools/create_project/create_project.cpp | 41 ++++++++++++- devtools/create_project/module.mk | 3 +- .../msvc10/create_project.vcxproj | 8 ++- .../msvc10/create_project.vcxproj.filters | 6 ++ .../msvc8/create_project.vcproj | 8 +++ .../msvc9/create_project.vcproj | 8 +++ devtools/create_project/xcode.cpp | 61 +++++++++++++++++++ devtools/create_project/xcode.h | 54 ++++++++++++++++ .../create_project.xcodeproj/project.pbxproj | 6 ++ dists/iphone/readme.txt | 7 +++ 12 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 devtools/create_project/xcode.cpp create mode 100644 devtools/create_project/xcode.h create mode 100644 dists/iphone/readme.txt diff --git a/devtools/README b/devtools/README index b1c0f21cb00a..7db5259e7ca2 100644 --- a/devtools/README +++ b/devtools/README @@ -65,7 +65,7 @@ create_lure (dreammaster) create_project (LordHoto, Littleboy) -------------- - Creates project files for Visual Studio 2005, 2008, 2010 and + Creates project files for Visual Studio 2005, 2008, 2010, Xcode and Code::Blocks out of the configure / Makefile based build system. It also offers a way to enable or disable certain engines and the use of external libraries similar to configure. Run the tool without diff --git a/devtools/create_project/codeblocks/create_project.cbp b/devtools/create_project/codeblocks/create_project.cbp index 25b12d8cc27d..1b592d5e96af 100644 --- a/devtools/create_project/codeblocks/create_project.cbp +++ b/devtools/create_project/codeblocks/create_project.cbp @@ -47,6 +47,8 @@ + + diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index 7573f115e964..29bc5bfcd539 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -28,11 +28,12 @@ #include "config.h" #include "create_project.h" -#include "codeblocks.h" +#include "codeblocks.h" #include "msvc.h" #include "visualstudio.h" #include "msbuild.h" +#include "xcode.h" #include #include @@ -107,7 +108,8 @@ typedef std::list FileList; enum ProjectType { kProjectNone, kProjectCodeBlocks, - kProjectMSVC + kProjectMSVC, + kProjectXcode }; int main(int argc, char *argv[]) { @@ -175,6 +177,14 @@ int main(int argc, char *argv[]) { projectType = kProjectMSVC; + } else if (!std::strcmp(argv[i], "--xcode")) { + if (projectType != kProjectNone) { + std::cerr << "ERROR: You cannot pass more than one project type!\n"; + return -1; + } + + projectType = kProjectXcode; + } else if (!std::strcmp(argv[i], "--msvc-version")) { if (i + 1 >= argc) { std::cerr << "ERROR: Missing \"version\" parameter for \"--msvc-version\"!\n"; @@ -463,6 +473,32 @@ int main(int argc, char *argv[]) { provider = new CreateProjectTool::MSBuildProvider(globalWarnings, projectWarnings, msvcVersion); break; + + case kProjectXcode: + //////////////////////////////////////////////////////////////////////////// + // Xcode is also using GCC behind the scenes. See Code::Blocks comment + // for info on all warnings + //////////////////////////////////////////////////////////////////////////// + globalWarnings.push_back("-Wall"); + globalWarnings.push_back("-Wno-long-long"); + globalWarnings.push_back("-Wno-multichar"); + globalWarnings.push_back("-Wno-unknown-pragmas"); + globalWarnings.push_back("-Wno-reorder"); + globalWarnings.push_back("-Wpointer-arith"); + globalWarnings.push_back("-Wcast-qual"); + globalWarnings.push_back("-Wcast-align"); + globalWarnings.push_back("-Wshadow"); + globalWarnings.push_back("-Wimplicit"); + globalWarnings.push_back("-Wnon-virtual-dtor"); + globalWarnings.push_back("-Wwrite-strings"); + // The following are not warnings at all... We should consider adding them to + // a different list of parameters. + globalWarnings.push_back("-fno-rtti"); + globalWarnings.push_back("-fno-exceptions"); + globalWarnings.push_back("-fcheck-new"); + + provider = new CreateProjectTool::XCodeProvider(globalWarnings, projectWarnings); + break; } provider->createProject(setup); @@ -501,6 +537,7 @@ void displayHelp(const char *exe) { "Project specific settings:\n" " --codeblock build Code::Blocks project files\n" " --msvc build Visual Studio project files\n" + " --xcode build XCode project files\n" " --file-prefix prefix allow overwriting of relative file prefix in the\n" " MSVC project files. By default the prefix is the\n" " \"path\\to\\source\" argument\n" diff --git a/devtools/create_project/module.mk b/devtools/create_project/module.mk index 4238452c5de8..025cbf4ba37c 100644 --- a/devtools/create_project/module.mk +++ b/devtools/create_project/module.mk @@ -6,7 +6,8 @@ MODULE_OBJS := \ codeblocks.o \ msvc.o \ visualstudio.o \ - msbuild.o + msbuild.o \ + xcode.o # Set the name of the executable TOOL_EXECUTABLE := create_project diff --git a/devtools/create_project/msvc10/create_project.vcxproj b/devtools/create_project/msvc10/create_project.vcxproj index bf5e415b5dde..3d7f8fdd3db7 100644 --- a/devtools/create_project/msvc10/create_project.vcxproj +++ b/devtools/create_project/msvc10/create_project.vcxproj @@ -58,10 +58,12 @@ MachineX86 - xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc10\ + @echo off +xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc10\ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc9\ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\msvc8\ -xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\ +xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\ +xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\iphone\ @@ -98,6 +100,7 @@ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\ + @@ -106,6 +109,7 @@ xcopy /Y $(TargetPath) $(SolutionDir)\..\..\..\dists\codeblocks\ + diff --git a/devtools/create_project/msvc10/create_project.vcxproj.filters b/devtools/create_project/msvc10/create_project.vcxproj.filters index b5e870824ee4..5ecd6c3dde83 100644 --- a/devtools/create_project/msvc10/create_project.vcxproj.filters +++ b/devtools/create_project/msvc10/create_project.vcxproj.filters @@ -27,6 +27,9 @@ Header Files + + Header Files + Header Files @@ -47,6 +50,9 @@ Source Files + + Source Files + diff --git a/devtools/create_project/msvc8/create_project.vcproj b/devtools/create_project/msvc8/create_project.vcproj index 639b23d6e782..6e9e0d5cb038 100644 --- a/devtools/create_project/msvc8/create_project.vcproj +++ b/devtools/create_project/msvc8/create_project.vcproj @@ -184,6 +184,10 @@ RelativePath="..\visualstudio.cpp" > + + + + + + + + +#include + +#if defined(_WIN32) || defined(WIN32) +#include +#else +#include +#include +#include +#include +#endif + +namespace CreateProjectTool { + +XCodeProvider::XCodeProvider(StringList &global_warnings, std::map &project_warnings, const int version) + : ProjectProvider(global_warnings, project_warnings, version) { +} + +void XCodeProvider::createWorkspace(const BuildSetup &setup) { + // TODO +} + +void XCodeProvider::createOtherBuildFiles(const BuildSetup &setup) { + // TODO +} + +void XCodeProvider::createProjectFile(const std::string &, const std::string &, const BuildSetup &setup, const std::string &moduleDir, + const StringList &includeList, const StringList &excludeList) { + // TODO +} + +void XCodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, + const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + // TODO +} + +} // End of CreateProjectTool namespace diff --git a/devtools/create_project/xcode.h b/devtools/create_project/xcode.h new file mode 100644 index 000000000000..a5810dbe0eb1 --- /dev/null +++ b/devtools/create_project/xcode.h @@ -0,0 +1,54 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + + +#ifndef TOOLS_CREATE_PROJECT_XCODE_H +#define TOOLS_CREATE_PROJECT_XCODE_H + +#include "create_project.h" + +#include +#include + +namespace CreateProjectTool { + + class XCodeProvider : public ProjectProvider { + public: + XCodeProvider(StringList &global_warnings, std::map &project_warnings, const int version = 0); + + protected: + + void createWorkspace(const BuildSetup &setup); + + void createOtherBuildFiles(const BuildSetup &setup); + + void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, + const StringList &includeList, const StringList &excludeList); + + void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, + const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + + }; + +} // End of CreateProjectTool namespace + +#endif // TOOLS_CREATE_PROJECT_XCODE_H diff --git a/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj index a14f53b3f0c0..3a3f6b1d4ddd 100644 --- a/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj +++ b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ F9A66C6B1396D4DF00CEE494 /* msbuild.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C651396D4DF00CEE494 /* msbuild.cpp */; }; F9A66C6C1396D4DF00CEE494 /* msvc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C671396D4DF00CEE494 /* msvc.cpp */; }; F9A66C6F1396D4E800CEE494 /* visualstudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */; }; + F9A66C871396E2F500CEE494 /* xcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C861396E2F500CEE494 /* xcode.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -44,6 +45,8 @@ F9A66C681396D4DF00CEE494 /* msvc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = msvc.h; path = ../msvc.h; sourceTree = ""; }; F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = visualstudio.cpp; path = ../visualstudio.cpp; sourceTree = ""; }; F9A66C6E1396D4E800CEE494 /* visualstudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visualstudio.h; path = ../visualstudio.h; sourceTree = ""; }; + F9A66C841396E2D800CEE494 /* xcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xcode.h; path = ../xcode.h; sourceTree = ""; }; + F9A66C861396E2F500CEE494 /* xcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = xcode.cpp; path = ../xcode.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -60,6 +63,8 @@ F9A66C1C1396D36100CEE494 = { isa = PBXGroup; children = ( + F9A66C861396E2F500CEE494 /* xcode.cpp */, + F9A66C841396E2D800CEE494 /* xcode.h */, F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */, F9A66C6E1396D4E800CEE494 /* visualstudio.h */, F9A66C5F1396D4DF00CEE494 /* codeblocks.cpp */, @@ -148,6 +153,7 @@ F9A66C6B1396D4DF00CEE494 /* msbuild.cpp in Sources */, F9A66C6C1396D4DF00CEE494 /* msvc.cpp in Sources */, F9A66C6F1396D4E800CEE494 /* visualstudio.cpp in Sources */, + F9A66C871396E2F500CEE494 /* xcode.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/dists/iphone/readme.txt b/dists/iphone/readme.txt new file mode 100644 index 000000000000..b115ed335c9e --- /dev/null +++ b/dists/iphone/readme.txt @@ -0,0 +1,7 @@ +The Xcode project files can now be created automatically from the GCC +files using the create_project tool inside the /tools/create_project folder. + +To create the default project files, build create_project.exe, copy it inside +this folder and run the create_xcode.bat file for a default build. You can +run create_project.exe with no parameters to check the possible command-line +options. From 3429a14c119752daa8d17c499dbffb27a3fe23a5 Mon Sep 17 00:00:00 2001 From: sylvaintv Date: Wed, 1 Jun 2011 23:49:19 +0200 Subject: [PATCH 326/369] TOON: Fix crash #3308220 Bug #3308220: "Crashes" Added clipping to magnifier effect --- engines/toon/toon.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 44c747c4c49c..e5c2cc0952bb 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -466,20 +466,24 @@ void ToonEngine::doMagnifierEffect() { byte tempBuffer[25 * 25]; for (int32 y = -12; y <= 12; y++) { + int32 cy = CLIP(posY + y, 0, TOON_BACKBUFFER_HEIGHT-1); for (int32 x = -12; x <= 12; x++) { + int32 cx = CLIP(posX + x, 0, TOON_BACKBUFFER_WIDTH-1); int32 destPitch = surface.pitch; - uint8 *curRow = (uint8 *)surface.pixels + (posY + y) * destPitch + (posX + x); + uint8 *curRow = (uint8 *)surface.pixels + cy * destPitch + cx; tempBuffer[(y + 12) * 25 + x + 12] = *curRow; } } for (int32 y = -12; y <= 12; y++) { + int32 cy = CLIP(posY + y, 0, TOON_BACKBUFFER_HEIGHT-1); for (int32 x = -12; x <= 12; x++) { int32 dist = y * y + x * x; if (dist > 144) continue; + int32 cx = CLIP(posX + x, 0, TOON_BACKBUFFER_WIDTH-1); int32 destPitch = surface.pitch; - uint8 *curRow = (uint8 *)surface.pixels + (posY + y) * destPitch + (posX + x); + uint8 *curRow = (uint8 *)surface.pixels + cy * destPitch + cx; int32 lerp = (512 + intSqrt[dist] * 256 / 12); *curRow = tempBuffer[(y * lerp / 1024 + 12) * 25 + x * lerp / 1024 + 12]; } From 70d5da3bc4362894c875b00ced1b289d18898258 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 23:50:27 +0200 Subject: [PATCH 327/369] DEVTOOLS: Link create_kyradat against libcommon.a, for scumm_stricmp --- devtools/create_kyradat/module.mk | 3 +++ rules.mk | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/devtools/create_kyradat/module.mk b/devtools/create_kyradat/module.mk index fb458b43ff63..4241f82e34c0 100644 --- a/devtools/create_kyradat/module.mk +++ b/devtools/create_kyradat/module.mk @@ -14,5 +14,8 @@ MODULE_OBJS := \ # Set the name of the executable TOOL_EXECUTABLE := create_kyradat +# Link against common code (for scumm_stricmp) +TOOL_DEPS := common/libcommon.a + # Include common rules include $(srcdir)/rules.mk diff --git a/rules.mk b/rules.mk index d03f549405d2..5ab3754768c3 100644 --- a/rules.mk +++ b/rules.mk @@ -20,11 +20,12 @@ ifdef TOOL_EXECUTABLE # TODO: Refactor this, so that even our master executable can use this rule? ################################################ TOOL-$(MODULE) := $(MODULE)/$(TOOL_EXECUTABLE)$(EXEEXT) -$(TOOL-$(MODULE)): $(MODULE_OBJS-$(MODULE)) +$(TOOL-$(MODULE)): $(MODULE_OBJS-$(MODULE)) $(TOOL_DEPS) $(QUIET_CXX)$(CXX) $(LDFLAGS) $+ -o $@ -# Reset TOOL_EXECUTABLE var +# Reset TOOL_* vars TOOL_EXECUTABLE:= +TOOL_DEPS:= # Add to "devtools" target devtools: $(TOOL-$(MODULE)) From 8f36c52e5866bde77a5f79ac6c1ea96152e5e22f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Jun 2011 23:57:12 +0200 Subject: [PATCH 328/369] DEVTOOLS: Do not use -Wglobal-constructors on create_project.o --- devtools/create_project/module.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/devtools/create_project/module.mk b/devtools/create_project/module.mk index 025cbf4ba37c..0db070fa7c77 100644 --- a/devtools/create_project/module.mk +++ b/devtools/create_project/module.mk @@ -12,6 +12,11 @@ MODULE_OBJS := \ # Set the name of the executable TOOL_EXECUTABLE := create_project +# Set custom build flags for create_project.o: It uses C++ iostreams, +# which make use of global constructors. So we don't want warnings for +# that. +$(srcdir)/devtools/create_project/create_project.o: CXXFLAGS:=$(filter-out -Wglobal-constructors,$(CXXFLAGS)) + # Include common rules include $(srcdir)/rules.mk From 333be9c072bf8972aa63bc4fb572956261f981cf Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 00:07:18 +0200 Subject: [PATCH 329/369] GUI: Replace some s(n)printf uses by Common::String::format --- gui/launcher.cpp | 9 ++------- gui/massadd.cpp | 10 +++++----- gui/options.cpp | 10 ++-------- gui/widget.cpp | 4 +--- gui/widgets/list.cpp | 7 ++----- 5 files changed, 12 insertions(+), 28 deletions(-) diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 86ca3162cb3e..6920e0ccd2da 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -685,10 +685,7 @@ void LauncherDialog::updateListing() { } if (description.empty()) { - char tmp[200]; - - snprintf(tmp, 200, "Unknown (target %s, gameid %s)", iter->_key.c_str(), gameid.c_str()); - description = tmp; + description = Common::String::format("Unknown (target %s, gameid %s)", iter->_key.c_str(), gameid.c_str()); } if (!gameid.empty() && !description.empty()) { @@ -841,12 +838,10 @@ Common::String addGameToConf(const GameDescriptor &result) { assert(!domain.empty()); if (ConfMan.hasGameDomain(domain)) { int suffixN = 1; - char suffix[16]; Common::String gameid(domain); while (ConfMan.hasGameDomain(domain)) { - snprintf(suffix, 16, "-%d", suffixN); - domain = gameid + suffix; + domain = gameid + Common::String::format("-%d", suffixN); suffixN++; } } diff --git a/gui/massadd.cpp b/gui/massadd.cpp index 861be970c486..b0adce3f4789 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -234,23 +234,23 @@ void MassAddDialog::handleTickle() { // Update the dialog - char buf[256]; + Common::String buf; if (_scanStack.empty()) { // Enable the OK button _okButton->setEnabled(true); - snprintf(buf, sizeof(buf), "%s", _("Scan complete!")); + buf = _("Scan complete!"); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), _("Discovered %d new games, ignored %d previously added games."), _games.size(), _oldGamesCount); + buf = Common::String::format(_("Discovered %d new games, ignored %d previously added games."), _games.size(), _oldGamesCount); _gameProgressText->setLabel(buf); } else { - snprintf(buf, sizeof(buf), _("Scanned %d directories ..."), _dirsScanned); + buf = Common::String::format(_("Scanned %d directories ..."), _dirsScanned); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), _("Discovered %d new games, ignored %d previously added games ..."), _games.size(), _oldGamesCount); + buf = Common::String::format(_("Discovered %d new games, ignored %d previously added games ..."), _games.size(), _oldGamesCount); _gameProgressText->setLabel(buf); } diff --git a/gui/options.cpp b/gui/options.cpp index 0c9d03af0c35..5022b808c4a9 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -241,11 +241,8 @@ void OptionsDialog::open() { } // MIDI gain setting - char buf[10]; - _midiGainSlider->setValue(ConfMan.getInt("midi_gain", _domain)); - sprintf(buf, "%.2f", (double)_midiGainSlider->getValue() / 100.0); - _midiGainLabel->setLabel(buf); + _midiGainLabel->setLabel(Common::String::format("%.2f", (double)_midiGainSlider->getValue() / 100.0)); } // MT-32 options @@ -530,12 +527,9 @@ void OptionsDialog::close() { } void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { - char buf[10]; - switch (cmd) { case kMidiGainChanged: - sprintf(buf, "%.2f", (double)_midiGainSlider->getValue() / 100.0); - _midiGainLabel->setLabel(buf); + _midiGainLabel->setLabel(Common::String::format("%.2f", (double)_midiGainSlider->getValue() / 100.0)); _midiGainLabel->draw(); break; case kMusicVolumeChanged: diff --git a/gui/widget.cpp b/gui/widget.cpp index 29838961dfed..8420391a3ff3 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -240,9 +240,7 @@ StaticTextWidget::StaticTextWidget(GuiObject *boss, const Common::String &name, } void StaticTextWidget::setValue(int value) { - char buf[256]; - sprintf(buf, "%d", value); - _label = buf; + _label = Common::String::format("%d", value); } void StaticTextWidget::setLabel(const Common::String &label) { diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp index a0877fc68adf..2a0d4afff065 100644 --- a/gui/widgets/list.cpp +++ b/gui/widgets/list.cpp @@ -499,9 +499,7 @@ void ListWidget::drawWidget() { // If in numbering mode, we first print a number prefix if (_numberingMode != kListNumberingOff) { - char temp[10]; - sprintf(temp, "%2d. ", (pos + _numberingMode)); - buffer = temp; + buffer = Common::String::format("%2d. ", (pos + _numberingMode)); g_gui.theme()->drawText(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2), buffer, _state, Graphics::kTextAlignLeft, inverted, _leftPadding, true); pad = 0; @@ -543,9 +541,8 @@ Common::Rect ListWidget::getEditRect() const { r.bottom += offset; if (_numberingMode != kListNumberingOff) { - char temp[10]; // FIXME: Assumes that all digits have the same width. - sprintf(temp, "%2d. ", (_list.size() - 1 + _numberingMode)); + Common::String temp = Common::String::format("%2d. ", (_list.size() - 1 + _numberingMode)); r.left += g_gui.getStringWidth(temp) + _leftPadding; } From c720f463e444c2835cea4e9fadb256378eaaab36 Mon Sep 17 00:00:00 2001 From: Arnaud Boutonne Date: Thu, 2 Jun 2011 00:53:19 +0200 Subject: [PATCH 330/369] TSAGE: Add workaround in order to fix crash in scene 5100 when Quinn forgets the Stasis Box Also present in the original! --- engines/tsage/ringworld_scenes6.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index 6c4b62ccd739..9e5766d65639 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -614,6 +614,7 @@ void Scene5000::dispatch() { *--------------------------------------------------------------------------*/ void Scene5100::Action1::signal() { + // Quinn enters the cave for the first time Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -663,6 +664,7 @@ void Scene5100::Action1::signal() { } void Scene5100::Action2::signal() { + // Quinn and Seeker exit the cave Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -824,7 +826,7 @@ void Scene5100::Action5::signal() { break; case 3: scene->_sceneMode = 5106; - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); break; } } @@ -1086,7 +1088,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _globals->_player.animate(ANIM_MODE_1, NULL); _globals->_player.disableControl(); - if (!_globals->getFlag(66)) { + if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { _hotspot14.postInit(); _hotspot14.setVisage(5101); _hotspot14.setPosition(Common::Point(498, 147)); From 092142d8800f4b7f136098d9cbad6ee8d5ffbe8b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 2 Jun 2011 03:03:50 +0200 Subject: [PATCH 331/369] BUILD: Enable Lands of Lore by default. --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 5d5d6d0c0220..b436a3822db8 100755 --- a/configure +++ b/configure @@ -88,7 +88,7 @@ add_engine groovie "Groovie" yes "groovie2" add_engine groovie2 "Groovie 2 games" no add_engine hugo "Hugo Trilogy" yes add_engine kyra "Legend of Kyrandia" yes "lol" -add_engine lol "Lands of Lore" no +add_engine lol "Lands of Lore" yes add_engine lastexpress "The Last Express" no add_engine lure "Lure of the Temptress" yes add_engine m4 "M4/MADS" no From 8356656575b4c07229dc0e9bd97fa2f67573de73 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 02:20:51 +0100 Subject: [PATCH 332/369] GOB: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/gob/resources.cpp | 5 +---- engines/gob/save/savehandler.cpp | 3 +-- engines/gob/sound/sound.cpp | 6 ++---- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/engines/gob/resources.cpp b/engines/gob/resources.cpp index 92eec0ee255d..d5497c25be65 100644 --- a/engines/gob/resources.cpp +++ b/engines/gob/resources.cpp @@ -603,10 +603,7 @@ bool Resources::dumpResource(const Resource &resource, uint16 id, Common::String fileName = _fileBase; - char idStr[7]; - - snprintf(idStr, 7, "_%05d", id); - fileName += idStr; + fileName += Common::String::format("_%05d", id); fileName += "."; fileName += ext; diff --git a/engines/gob/save/savehandler.cpp b/engines/gob/save/savehandler.cpp index 9e46f1db6f2f..71de629f9364 100644 --- a/engines/gob/save/savehandler.cpp +++ b/engines/gob/save/savehandler.cpp @@ -154,8 +154,7 @@ Common::String SlotFileIndexed::build(int slot) const { if ((slot < 0) || (((uint32) slot) >= _slotCount)) return Common::String(); - char buf[4]; - snprintf(buf, sizeof(buf), "%02d", slot); + Common::String buf = Common::String::format("%02d", slot); return _base + "." + _ext + buf; } diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index 0ad17c1e33a8..212116f689d1 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -667,15 +667,13 @@ void Sound::bgPlay(const char *base, const char *ext, SoundType type, int count) _bgatmos->stopBA(); _bgatmos->queueClear(); - int length = strlen(base) + 7; - char *fileName = new char[length]; SoundDesc *sndDesc; for (int i = 1; i <= count; i++) { - snprintf(fileName, length, "%s%02d.%s", base, i, ext); + Common::String fileName = Common::String::format("%s%02d.%s", base, i, ext); sndDesc = new SoundDesc; - if (sampleLoad(sndDesc, type, fileName)) + if (sampleLoad(sndDesc, type, fileName.c_str())) _bgatmos->queueSample(*sndDesc); else delete sndDesc; From 889f5d119a419b5f7f98341a8ae8d0159f9cf820 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 02:53:48 +0100 Subject: [PATCH 333/369] DRASCULA: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/drascula/drascula.cpp | 6 +++--- engines/drascula/drascula.h | 2 +- engines/drascula/saveload.cpp | 31 +++++++++++++++---------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index cac7f93f1285..b4f009eb4471 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -893,9 +893,9 @@ bool DrasculaEngine::loadDrasculaDat() { ver = in.readByte(); if (ver != DRASCULA_DAT_VER) { - snprintf(buf, 256, "File 'drascula.dat' is wrong version. Expected %d but got %d. Get it from the ScummVM website", DRASCULA_DAT_VER, ver); - GUIErrorMessage(buf); - warning("%s", buf); + Common::String errorMessage = Common::String::format("File 'drascula.dat' is wrong version. Expected %d but got %d. Get it from the ScummVM website", DRASCULA_DAT_VER, ver); + GUIErrorMessage(errorMessage); + warning("%s", errorMessage.c_str()); return false; } diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index f9dcbe2810df..2b6aa0f291da 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -588,7 +588,7 @@ class DrasculaEngine : public Engine { void quadrant_2(); void quadrant_3(); void quadrant_4(); - void saveGame(char[]); + void saveGame(const char *gameName); void increaseFrameNum(); int whichObject(); bool checkMenuFlags(); diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp index 15f5855bdcaa..664a082eb4c0 100644 --- a/engines/drascula/saveload.cpp +++ b/engines/drascula/saveload.cpp @@ -28,24 +28,23 @@ namespace Drascula { bool DrasculaEngine::saveLoadScreen() { char names[10][23]; - char file[50]; - char fileEpa[50]; + Common::String file; int n, n2, num_sav = 0, y = 27; Common::InSaveFile *sav; clearRoom(); - snprintf(fileEpa, 50, "%s.epa", _targetName.c_str()); + Common::String fileEpa = Common::String::format("%s.epa", _targetName.c_str()); if (!(sav = _saveFileMan->openForLoading(fileEpa))) { Common::OutSaveFile *epa; if (!(epa = _saveFileMan->openForSaving(fileEpa))) - error("Can't open %s file", fileEpa); + error("Can't open %s file", fileEpa.c_str()); for (n = 0; n < NUM_SAVES; n++) epa->writeString("*\n"); epa->finalize(); delete epa; if (!(sav = _saveFileMan->openForLoading(fileEpa))) { - error("Can't open %s file", fileEpa); + error("Can't open %s file", fileEpa.c_str()); } } for (n = 0; n < NUM_SAVES; n++) { @@ -88,11 +87,11 @@ bool DrasculaEngine::saveLoadScreen() { enterName(); strcpy(names[n], select); if (selectionMade == 1) { - snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); - saveGame(file); + file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); + saveGame(file.c_str()); Common::OutSaveFile *tsav; if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { - error("Can't open %s file", fileEpa); + error("Can't open %s file", fileEpa.c_str()); } for (n = 0; n < NUM_SAVES; n++) { tsav->writeString(names[n]); @@ -110,7 +109,7 @@ bool DrasculaEngine::saveLoadScreen() { y = y + 9; } if (selectionMade == 1) { - snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); + file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); } num_sav = n; } @@ -127,11 +126,11 @@ bool DrasculaEngine::saveLoadScreen() { } if (selectionMade == 1) { - snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); - saveGame(file); + file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); + saveGame(file.c_str()); Common::OutSaveFile *tsav; if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { - error("Can't open %s file", fileEpa); + error("Can't open %s file", fileEpa.c_str()); } for (n = 0; n < NUM_SAVES; n++) { tsav->writeString(names[n]); @@ -143,16 +142,16 @@ bool DrasculaEngine::saveLoadScreen() { } if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149 && selectionMade == 1) { - if (!loadGame(file)) { + if (!loadGame(file.c_str())) { _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); return false; } break; } else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && selectionMade == 1) { - saveGame(file); + saveGame(file.c_str()); Common::OutSaveFile *tsav; if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { - error("Can't open %s file", fileEpa); + error("Can't open %s file", fileEpa.c_str()); } for (n = 0; n < NUM_SAVES; n++) { tsav->writeString(names[n]); @@ -229,7 +228,7 @@ bool DrasculaEngine::loadGame(const char *gameName) { return true; } -void DrasculaEngine::saveGame(char gameName[]) { +void DrasculaEngine::saveGame(const char *gameName) { Common::OutSaveFile *out; int l; From 37886ba7bb53b1df1bf69c3e43c13b01639a6f80 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 03:03:21 +0100 Subject: [PATCH 334/369] CRUISE: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/cruise/menu.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/engines/cruise/menu.cpp b/engines/cruise/menu.cpp index 407858574c20..bb817972161d 100644 --- a/engines/cruise/menu.cpp +++ b/engines/cruise/menu.cpp @@ -225,13 +225,10 @@ static void handleSaveLoad(bool saveFlag) { Common::String result(dialog->getResultString()); if (result.empty()) { // If the user was lazy and entered no save name, come up with a default name. - char buf[20]; - snprintf(buf, 20, "Save %d", slot + 1); - - _vm->saveGameState(slot, buf); - } else { - _vm->saveGameState(slot, result.c_str()); + result = Common::String::format("Save %d", slot + 1); } + + _vm->saveGameState(slot, result.c_str()); } } From 9607aae5be260666656a35ef3468f9669555f9e7 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 03:17:34 +0100 Subject: [PATCH 335/369] TOUCHE: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/touche/saveload.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp index 82ed03ad45ab..334f75a0e897 100644 --- a/engines/touche/saveload.cpp +++ b/engines/touche/saveload.cpp @@ -380,9 +380,7 @@ Common::String generateGameStateFileName(const char *target, int slot, bool pref if (prefixOnly) { name += ".*"; } else { - char slotStr[16]; - snprintf(slotStr, sizeof(slotStr), ".%d", slot); - name += slotStr; + name += Common::String::format(".%d", slot); } return name; } From 4b6c1a0c2b53fdb71090759fbd89a6852d84af4b Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 03:27:44 +0100 Subject: [PATCH 336/369] DRACI: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/draci/music.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/engines/draci/music.cpp b/engines/draci/music.cpp index 6f3e3c8384b2..3179c79ca4c6 100644 --- a/engines/draci/music.cpp +++ b/engines/draci/music.cpp @@ -80,9 +80,8 @@ void MusicPlayer::playSMF(int track, bool loop) { // Load MIDI resource data Common::File musicFile; - char musicFileName[40]; - snprintf(musicFileName, sizeof(musicFileName), _pathMask.c_str(), track); - musicFile.open(musicFileName); + Common::String musicFileName = Common::String::format(_pathMask.c_str(), track); + musicFile.open(musicFileName.c_str()); if (!musicFile.isOpen()) { debugC(2, kDraciSoundDebugLevel, "Cannot open track %d", track); return; From 0d379b3783e368160476c78d31b05a9e9914e782 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 03:44:31 +0100 Subject: [PATCH 337/369] CINE: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/cine/detection.cpp | 16 +++++----------- engines/cine/saveload.cpp | 5 +---- engines/cine/various.cpp | 7 +++---- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index 0ef2c87288d2..64eee4574f97 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -185,10 +185,7 @@ void CineMetaEngine::removeSaveState(const char *target, int slot) const { memset(saveNames, 0, sizeof(saveNames)); Common::InSaveFile *in; - char tmp[80]; - - snprintf(tmp, 80, "%s.dir", target); - in = g_system->getSavefileManager()->openForLoading(tmp); + in = g_system->getSavefileManager()->openForLoading(Common::String::format("%s.dir", target)); if (!in) return; @@ -202,12 +199,10 @@ void CineMetaEngine::removeSaveState(const char *target, int slot) const { strncpy(saveNames[slot], slotName, 20); // Update savegame descriptions - char indexFile[80]; - snprintf(indexFile, 80, "%s.dir", target); - + Common::String indexFile = Common::String::format("%s.dir", target); Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(indexFile); if (!out) { - warning("Unable to open file %s for saving", indexFile); + warning("Unable to open file %s for saving", indexFile.c_str()); return; } @@ -246,12 +241,11 @@ Common::Error CineEngine::saveGameState(int slot, const char *desc) { currentSaveName[slot][sizeof(CommandeType) - 1] = 0; // Update savegame descriptions - char indexFile[80]; - snprintf(indexFile, 80, "%s.dir", _targetName.c_str()); + Common::String indexFile = Common::String::format("%s.dir", _targetName.c_str()); Common::OutSaveFile *fHandle = _saveFileMan->openForSaving(indexFile); if (!fHandle) { - warning("Unable to open file %s for saving", indexFile); + warning("Unable to open file %s for saving", indexFile.c_str()); return Common::kUnknownError; } diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index 700875e30277..e51d07b1a573 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -460,10 +460,7 @@ void saveSeqList(Common::OutSaveFile &out) { bool CineEngine::loadSaveDirectory() { Common::InSaveFile *fHandle; - char tmp[80]; - - snprintf(tmp, 80, "%s.dir", _targetName.c_str()); - fHandle = _saveFileMan->openForLoading(tmp); + fHandle = _saveFileMan->openForLoading(Common::String::format("%s.dir", _targetName.c_str())); if (!fHandle) { return false; diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 1892a78cca4d..81e72d69054e 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -440,13 +440,12 @@ void CineEngine::makeSystemMenu() { getMouseData(mouseUpdateStatus, (uint16 *)&mouseButton, (uint16 *)&mouseX, (uint16 *)&mouseY); if (!makeMenuChoice(confirmMenu, 2, mouseX, mouseY + 8, 100)) { - char saveString[256], tmp[80]; - - snprintf(tmp, 80, "%s.dir", _targetName.c_str()); + char saveString[256]; + Common::String tmp = Common::String::format("%s.dir", _targetName.c_str()); Common::OutSaveFile *fHandle = _saveFileMan->openForSaving(tmp); if (!fHandle) { - warning("Unable to open file %s for saving", tmp); + warning("Unable to open file %s for saving", tmp.c_str()); break; } From c9156d369f386645a28e2d845bb6b6969e91f1bc Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 03:58:27 +0100 Subject: [PATCH 338/369] TINSEL: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/tinsel/tinsel.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 6c1898b08cf0..80f02ff8d10f 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -886,9 +886,7 @@ TinselEngine::~TinselEngine() { } Common::String TinselEngine::getSavegameFilename(int16 saveNum) const { - char filename[256]; - snprintf(filename, 256, "%s.%03d", getTargetName().c_str(), saveNum); - return filename; + return Common::String::format("%s.%03d", getTargetName().c_str(), saveNum); } Common::Error TinselEngine::run() { From 24ac81ead8b5bcee8ee7ded4f7b1ed7f2f263e65 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 04:21:48 +0100 Subject: [PATCH 339/369] SWORD1: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/sword1/animation.cpp | 22 +++++++++++----------- engines/sword1/detection.cpp | 8 ++------ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index b66cc6b5a73f..7e9d1142bec0 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -85,7 +85,7 @@ MoviePlayer::~MoviePlayer() { */ bool MoviePlayer::load(uint32 id) { Common::File f; - char filename[20]; + Common::String filename; if (_decoderType == kVideoDecoderDXA) _bgSoundStream = Audio::SeekableAudioStream::openStreamFile(sequenceList[id]); @@ -93,7 +93,7 @@ bool MoviePlayer::load(uint32 id) { _bgSoundStream = NULL; if (SwordEngine::_systemVars.showText) { - sprintf(filename, "%s.txt", sequenceList[id]); + filename = Common::String::format("%s.txt", sequenceList[id]); if (f.open(filename)) { Common::String line; int lineNo = 0; @@ -117,12 +117,12 @@ bool MoviePlayer::load(uint32 id) { ptr++; if (startFrame > endFrame) { - warning("%s:%d: startFrame (%d) > endFrame (%d)", filename, lineNo, startFrame, endFrame); + warning("%s:%d: startFrame (%d) > endFrame (%d)", filename.c_str(), lineNo, startFrame, endFrame); continue; } if (startFrame <= lastEnd) { - warning("%s:%d startFrame (%d) <= lastEnd (%d)", filename, lineNo, startFrame, lastEnd); + warning("%s:%d startFrame (%d) <= lastEnd (%d)", filename.c_str(), lineNo, startFrame, lastEnd); continue; } @@ -135,14 +135,14 @@ bool MoviePlayer::load(uint32 id) { switch (_decoderType) { case kVideoDecoderDXA: - snprintf(filename, sizeof(filename), "%s.dxa", sequenceList[id]); + filename = Common::String::format("%s.dxa", sequenceList[id]); break; case kVideoDecoderSMK: - snprintf(filename, sizeof(filename), "%s.smk", sequenceList[id]); + filename = Common::String::format("%s.smk", sequenceList[id]); break; } - return _decoder->loadFile(filename); + return _decoder->loadFile(filename.c_str()); } void MoviePlayer::play() { @@ -323,18 +323,18 @@ uint32 DXADecoderWithSound::getElapsedTime() const { /////////////////////////////////////////////////////////////////////////////// MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, Audio::Mixer *snd, OSystem *system) { - char filename[20]; + Common::String filename; char buf[60]; Audio::SoundHandle *bgSoundHandle = new Audio::SoundHandle; - snprintf(filename, sizeof(filename), "%s.smk", sequenceList[id]); + filename = Common::String::format("%s.smk", sequenceList[id]); if (Common::File::exists(filename)) { Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(snd); return new MoviePlayer(vm, textMan, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); } - snprintf(filename, sizeof(filename), "%s.dxa", sequenceList[id]); + filename = Common::String::format("%s.dxa", sequenceList[id]); if (Common::File::exists(filename)) { #ifdef USE_ZLIB @@ -348,7 +348,7 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, Audio::M } // Old MPEG2 cutscenes - snprintf(filename, sizeof(filename), "%s.mp2", sequenceList[id]); + filename = Common::String::format("%s.mp2", sequenceList[id]); if (Common::File::exists(filename)) { GUI::MessageDialog dialog("MPEG2 cutscenes are no longer supported", "OK"); diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp index 8ffd96d30817..b02cadc6db48 100644 --- a/engines/sword1/detection.cpp +++ b/engines/sword1/detection.cpp @@ -249,15 +249,11 @@ SaveStateList SwordMetaEngine::listSaves(const char *target) const { int SwordMetaEngine::getMaximumSaveSlot() const { return 999; } void SwordMetaEngine::removeSaveState(const char *target, int slot) const { - char fileName[12]; - snprintf(fileName, 12, "sword1.%03d", slot); - - g_system->getSavefileManager()->removeSavefile(fileName); + g_system->getSavefileManager()->removeSavefile(Common::String::format("sword1.%03d", slot)); } SaveStateDescriptor SwordMetaEngine::querySaveMetaInfos(const char *target, int slot) const { - char fileName[12]; - snprintf(fileName, 12, "sword1.%03d", slot); + Common::String fileName = Common::String::format("sword1.%03d", slot); char name[40]; uint32 playTime = 0; byte versionSave; From d3b53d4c5002171bf2050f495354bff7e1435ed1 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 04:38:47 +0100 Subject: [PATCH 340/369] SWORD2: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/sword2/animation.cpp | 16 ++++++++-------- engines/sword2/saveload.cpp | 15 ++++++--------- engines/sword2/sword2.cpp | 5 +---- engines/sword2/sword2.h | 2 +- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 5c5ff6c7ee26..11ee4a98fd68 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -72,17 +72,17 @@ bool MoviePlayer::load(const char *name) { _textSurface = NULL; - char filename[20]; + Common::String filename; switch (_decoderType) { case kVideoDecoderDXA: - snprintf(filename, sizeof(filename), "%s.dxa", name); + filename = Common::String::format("%s.dxa", name); break; case kVideoDecoderSMK: - snprintf(filename, sizeof(filename), "%s.smk", name); + filename = Common::String::format("%s.smk", name); break; } - return _decoder->loadFile(filename); + return _decoder->loadFile(filename.c_str()); } void MoviePlayer::play(MovieText *movieTexts, uint32 numMovieTexts, uint32 leadIn, uint32 leadOut) { @@ -358,18 +358,18 @@ uint32 DXADecoderWithSound::getElapsedTime() const { /////////////////////////////////////////////////////////////////////////////// MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *snd, OSystem *system) { - char filename[20]; + Common::String filename; char buf[60]; Audio::SoundHandle *bgSoundHandle = new Audio::SoundHandle; - snprintf(filename, sizeof(filename), "%s.smk", name); + filename = Common::String::format("%s.smk", name); if (Common::File::exists(filename)) { Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(snd); return new MoviePlayer(vm, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); } - snprintf(filename, sizeof(filename), "%s.dxa", name); + filename = Common::String::format("%s.dxa", name); if (Common::File::exists(filename)) { #ifdef USE_ZLIB @@ -383,7 +383,7 @@ MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *s } // Old MPEG2 cutscenes - snprintf(filename, sizeof(filename), "%s.mp2", name); + filename = Common::String::format("%s.mp2", name); if (Common::File::exists(filename)) { GUI::MessageDialog dialog("MPEG2 cutscenes are no longer supported", "OK"); diff --git a/engines/sword2/saveload.cpp b/engines/sword2/saveload.cpp index 870170e37804..34f99923f764 100644 --- a/engines/sword2/saveload.cpp +++ b/engines/sword2/saveload.cpp @@ -49,11 +49,8 @@ namespace Sword2 { -char *Sword2Engine::getSaveFileName(uint16 slotNo) { - static char buf[128]; - - snprintf(buf, sizeof(buf), "%s.%.3d", _targetName.c_str(), slotNo); - return buf; +Common::String Sword2Engine::getSaveFileName(uint16 slotNo) { + return Common::String::format("%s.%.3d", _targetName.c_str(), slotNo); } /** @@ -128,7 +125,7 @@ uint32 Sword2Engine::saveGame(uint16 slotNo, const byte *desc) { } uint32 Sword2Engine::saveData(uint16 slotNo, byte *buffer, uint32 bufferSize) { - char *saveFileName = getSaveFileName(slotNo); + Common::String saveFileName = getSaveFileName(slotNo); Common::OutSaveFile *out; @@ -206,7 +203,7 @@ uint32 Sword2Engine::restoreGame(uint16 slotNo) { } uint32 Sword2Engine::restoreData(uint16 slotNo, byte *buffer, uint32 bufferSize) { - char *saveFileName = getSaveFileName(slotNo); + Common::String saveFileName = getSaveFileName(slotNo); Common::InSaveFile *in; @@ -371,7 +368,7 @@ uint32 Sword2Engine::restoreFromBuffer(byte *buffer, uint32 size) { */ uint32 Sword2Engine::getSaveDescription(uint16 slotNo, byte *description) { - char *saveFileName = getSaveFileName(slotNo); + Common::String saveFileName = getSaveFileName(slotNo); Common::InSaveFile *in; @@ -394,7 +391,7 @@ bool Sword2Engine::saveExists() { } bool Sword2Engine::saveExists(uint16 slotNo) { - char *saveFileName = getSaveFileName(slotNo); + Common::String saveFileName = getSaveFileName(slotNo); Common::InSaveFile *in; if (!(in = _saveFileMan->openForLoading(saveFileName))) { diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 62a391923dd7..99ffd5586ef9 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -210,11 +210,8 @@ SaveStateList Sword2MetaEngine::listSaves(const char *target) const { int Sword2MetaEngine::getMaximumSaveSlot() const { return 999; } void Sword2MetaEngine::removeSaveState(const char *target, int slot) const { - char extension[6]; - snprintf(extension, sizeof(extension), ".%03d", slot); - Common::String filename = target; - filename += extension; + filename += Common::String::format(".%03d", slot); g_system->getSavefileManager()->removeSavefile(filename); } diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h index e4c9dcca3c85..ee9ea9f27b3a 100644 --- a/engines/sword2/sword2.h +++ b/engines/sword2/sword2.h @@ -224,7 +224,7 @@ class Sword2Engine : public Engine { bool saveExists(); bool saveExists(uint16 slotNo); uint32 restoreFromBuffer(byte *buffer, uint32 size); - char *getSaveFileName(uint16 slotNo); + Common::String getSaveFileName(uint16 slotNo); uint32 findBufferSize(); void startGame(); From 263ef4549996e40cdac1ec22b4cbda8ca94b482f Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 04:52:34 +0100 Subject: [PATCH 341/369] M4: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/m4/globals.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index 8787f89d04af..bf2c3abe1c6e 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -154,24 +154,24 @@ void Kernel::loadGlobalScriptFunctions() { } void Kernel::loadSectionScriptFunctions() { - char tempFnName[128]; - snprintf(tempFnName, 128, "section_init_%d", currentSection); + Common::String tempFnName; + tempFnName = Common::String::format("section_init_%d", currentSection); _sectionInitFn = _vm->_script->loadFunction(tempFnName); - snprintf(tempFnName, 128, "section_daemon_%d", currentSection); + tempFnName = Common::String::format("section_daemon_%d", currentSection); _sectionDaemonFn = _vm->_script->loadFunction(tempFnName); - snprintf(tempFnName, 128, "section_parser_%d", currentSection); + tempFnName = Common::String::format("section_parser_%d", currentSection); _sectionParserFn = _vm->_script->loadFunction(tempFnName); } void Kernel::loadRoomScriptFunctions() { - char tempFnName[128]; - snprintf(tempFnName, 128, "room_init_%d", currentRoom); + Common::String tempFnName; + tempFnName = Common::String::format("room_init_%d", currentRoom); _roomInitFn = _vm->_script->loadFunction(tempFnName); - snprintf(tempFnName, 128, "room_daemon_%d", currentRoom); + tempFnName = Common::String::format("room_daemon_%d", currentRoom); _roomDaemonFn = _vm->_script->loadFunction(tempFnName); - snprintf(tempFnName, 128, "room_pre_parser_%d", currentRoom); + tempFnName = Common::String::format("room_pre_parser_%d", currentRoom); _roomPreParserFn = _vm->_script->loadFunction(tempFnName); - snprintf(tempFnName, 128, "room_parser_%d", currentRoom); + tempFnName = Common::String::format("room_parser_%d", currentRoom); _roomParserFn = _vm->_script->loadFunction(tempFnName); } From 59dfd6e85962eb7d296bd076400bbe6c14d9ca2c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 10:22:23 +0200 Subject: [PATCH 342/369] TOON: Remove all instances of s(n)printf --- engines/toon/script_func.cpp | 6 ++--- engines/toon/toon.cpp | 47 +++++++++++++++++------------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp index 693f308707e4..005a29950232 100644 --- a/engines/toon/script_func.cpp +++ b/engines/toon/script_func.cpp @@ -312,13 +312,13 @@ int32 ScriptFunc::sys_Cmd_Flip_Screens(EMCState *state) { int32 ScriptFunc::sys_Cmd_Play_Flic(EMCState *state) { - char name[256]; + Common::String name; // workaround for the video of the beginning if (strstr(GetText(0, state), "209")) - sprintf(name, "%s", GetText(0, state)); + name = GetText(0, state); else - strcpy(name, _vm->createRoomFilename(GetText(0, state)).c_str()); + name = _vm->createRoomFilename(GetText(0, state)); int32 stopMusic = stackPos(2); _vm->getMoviePlayer()->play(name, stopMusic); diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index e5c2cc0952bb..93da20fb47f8 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -215,15 +215,13 @@ void ToonEngine::parseInput() { if (slotNum >= 0 && slotNum <= 9 && canSaveGameStateCurrently()) { if (saveGame(slotNum, Common::String())) { // ok - char buf[256]; - snprintf(buf, 256, "Saved game in slot #%d ", slotNum); + Common::String buf = Common::String::format("Saved game in slot #%d ", slotNum); GUI::TimedMessageDialog dialog(buf, 1000); dialog.runModal(); } else { - char buf[256]; - snprintf(buf, 256, "Could not quick save into slot #%d", slotNum); - GUI::MessageDialog dialog2(buf, "OK", 0); - dialog2.runModal(); + Common::String buf = Common::String::format("Could not quick save into slot #%d", slotNum); + GUI::MessageDialog dialog(buf, "OK", 0); + dialog.runModal(); } } @@ -234,15 +232,13 @@ void ToonEngine::parseInput() { if (slotNum >= 0 && slotNum <= 9 && canLoadGameStateCurrently()) { if (loadGame(slotNum)) { // ok - char buf[256]; - snprintf(buf, 256, "Savegame #%d quick loaded", slotNum); + Common::String buf = Common::String::format("Savegame #%d quick loaded", slotNum); GUI::TimedMessageDialog dialog(buf, 1000); dialog.runModal(); } else { - char buf[256]; - snprintf(buf, 256, "Could not quick load the savegame #%d", slotNum); + Common::String buf = Common::String::format("Could not quick load the savegame #%d", slotNum); GUI::MessageDialog dialog(buf, "OK", 0); - warning("%s", buf); + warning("%s", buf.c_str()); dialog.runModal(); } } @@ -404,15 +400,15 @@ void ToonEngine::render() { //_drew->plotPath(*_mainSurface); // used to debug path finding #if 0 - char test[256]; if (_mouseX > 0 && _mouseX < 640 && _mouseY > 0 && _mouseY < 400) { - sprintf(test, "%d %d / mask %d layer %d z %d", _mouseX, _mouseY, getMask()->getData(_mouseX, _mouseY), getLayerAtPoint(_mouseX, _mouseY), getZAtPoint(_mouseX, _mouseY)); + Common::String test; + test = Common::String::format("%d %d / mask %d layer %d z %d", _mouseX, _mouseY, getMask()->getData(_mouseX, _mouseY), getLayerAtPoint(_mouseX, _mouseY), getZAtPoint(_mouseX, _mouseY)); int32 c = *(uint8 *)_mainSurface->getBasePtr(_mouseX, _mouseY); - sprintf(test, "%d %d / color id %d %d,%d,%d", _mouseX, _mouseY, c, _finalPalette[c * 3 + 0], _finalPalette[c * 3 + 1], _finalPalette[c * 3 + 2]); + test = Common::String::format("%d %d / color id %d %d,%d,%d", _mouseX, _mouseY, c, _finalPalette[c * 3 + 0], _finalPalette[c * 3 + 1], _finalPalette[c * 3 + 2]); _fontRenderer->setFont(_fontToon); - _fontRenderer->renderText(40, 150, Common::String(test), 0); + _fontRenderer->renderText(40, 150, test, 0); } #endif @@ -4570,26 +4566,27 @@ void ToonEngine::createShadowLUT() { bool ToonEngine::loadToonDat() { Common::File in; - char buf[256]; + Common::String msg; int majVer, minVer; in.open("toon.dat"); if (!in.isOpen()) { - Common::String errorMessage = "You're missing the 'toon.dat' file. Get it from the ScummVM website"; - GUIErrorMessage(errorMessage); - warning("%s", errorMessage.c_str()); + msg = "You're missing the 'toon.dat' file. Get it from the ScummVM website"; + GUIErrorMessage(msg); + warning("%s", msg.c_str()); return false; } // Read header + char buf[4+1]; in.read(buf, 4); buf[4] = '\0'; if (strcmp(buf, "TOON")) { - Common::String errorMessage = "File 'toon.dat' is corrupt. Get it from the ScummVM website"; - GUIErrorMessage(errorMessage); - warning("%s", errorMessage.c_str()); + msg = "File 'toon.dat' is corrupt. Get it from the ScummVM website"; + GUIErrorMessage(msg); + warning("%s", msg.c_str()); return false; } @@ -4597,9 +4594,9 @@ bool ToonEngine::loadToonDat() { minVer = in.readByte(); if ((majVer != TOON_DAT_VER_MAJ) || (minVer != TOON_DAT_VER_MIN)) { - snprintf(buf, 256, "File 'toon.dat' is wrong version. Expected %d.%d but got %d.%d. Get it from the ScummVM website", TOON_DAT_VER_MAJ, TOON_DAT_VER_MIN, majVer, minVer); - GUIErrorMessage(buf); - warning("%s", buf); + msg = Common::String::format("File 'toon.dat' is wrong version. Expected %d.%d but got %d.%d. Get it from the ScummVM website", TOON_DAT_VER_MAJ, TOON_DAT_VER_MIN, majVer, minVer); + GUIErrorMessage(msg); + warning("%s", msg.c_str()); return false; } From 668ae0363e8f0c823a43a83b4b9682140ffb8eff Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 10:46:29 +0200 Subject: [PATCH 343/369] DRACI: Remove all instances of s(n)printf --- engines/draci/draci.cpp | 6 ++---- engines/draci/draci.h | 2 +- engines/draci/game.cpp | 9 ++++----- engines/draci/saveload.cpp | 2 +- engines/draci/sound.cpp | 5 ++--- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index cdc91e8d9f52..a5236b58355b 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -439,10 +439,8 @@ void DraciEngine::syncSoundSettings() { _music->syncVolume(); } -const char *DraciEngine::getSavegameFile(int saveGameIdx) { - static char buffer[20]; - sprintf(buffer, "draci.s%02d", saveGameIdx); - return buffer; +Common::String DraciEngine::getSavegameFile(int saveGameIdx) { + return Common::String::format("draci.s%02d", saveGameIdx); } Common::Error DraciEngine::loadGameState(int slot) { diff --git a/engines/draci/draci.h b/engines/draci/draci.h index 83e69ca33284..f99bdd5b8e6d 100644 --- a/engines/draci/draci.h +++ b/engines/draci/draci.h @@ -67,7 +67,7 @@ class DraciEngine : public Engine { void handleEvents(); - static const char *getSavegameFile(int saveGameIdx); + static Common::String getSavegameFile(int saveGameIdx); virtual Common::Error loadGameState(int slot); virtual bool canLoadGameStateCurrently(); virtual Common::Error saveGameState(int slot, const char *desc); diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 657e38198697..893e321b79b0 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -934,13 +934,12 @@ void Game::inventorySwitch(int keycode) { void Game::dialogueMenu(int dialogueID) { int oldLines, hit; - char tmp[5]; - sprintf(tmp, "%d", dialogueID+1); - Common::String ext(tmp); - _dialogueArchive = new BArchive(dialoguePath + ext + ".dfw"); + Common::String name; + name = dialoguePath + Common::String::format("%d.dfw", dialogueID + 1); + _dialogueArchive = new BArchive(name); debugC(4, kDraciLogicDebugLevel, "Starting dialogue (ID: %d, Archive: %s)", - dialogueID, (dialoguePath + ext + ".dfw").c_str()); + dialogueID, name.c_str()); _currentDialogue = dialogueID; oldLines = 255; diff --git a/engines/draci/saveload.cpp b/engines/draci/saveload.cpp index ffb1ed7ff4de..1479dd3c7766 100644 --- a/engines/draci/saveload.cpp +++ b/engines/draci/saveload.cpp @@ -86,7 +86,7 @@ void writeSavegameHeader(Common::OutSaveFile *out, const DraciSavegameHeader &he } Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName, DraciEngine &vm) { - const char *filename = vm.getSavegameFile(saveGameIdx); + Common::String filename = vm.getSavegameFile(saveGameIdx); Common::SaveFileManager *saveMan = g_system->getSavefileManager(); Common::OutSaveFile *f = saveMan->openForSaving(filename); if (f == NULL) diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index bbba9d9cc061..106167ef8a6e 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -240,9 +240,8 @@ SoundSample *ZipSoundArchive::getSample(int i, uint freq) { sample._frequency = freq ? freq : _defaultFreq; sample._format = _format; // Read in the file (without the file header) - char file_name[20]; - sprintf(file_name, "%d.%s", i+1, _extension); - sample._stream = _archive->createReadStreamForMember(file_name); + Common::String filename = Common::String::format("%d.%s", i+1, _extension); + sample._stream = _archive->createReadStreamForMember(filename); if (!sample._stream) { debugC(2, kDraciArchiverDebugLevel, "Doesn't exist"); return NULL; From 080b590261a41ae487446675bfbf545fd4801728 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 10:49:09 +0200 Subject: [PATCH 344/369] MADE: Remove all instances of s(n)printf --- engines/made/database.cpp | 6 ++---- engines/made/database.h | 2 +- engines/made/made.cpp | 4 +--- engines/made/script.cpp | 15 ++++++++------- engines/made/scriptfuncs.cpp | 16 ++++++++-------- 5 files changed, 20 insertions(+), 23 deletions(-) diff --git a/engines/made/database.cpp b/engines/made/database.cpp index 6e5a3228f303..1151339d496b 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -106,7 +106,7 @@ void Object::setVectorItem(int16 index, int16 value) { } } -void Object::dump(const char *filename) { +void Object::dump(const Common::String &filename) { /* FILE *o = fopen(filename, "wb"); fwrite(_objData, _objSize, 1, o); @@ -373,9 +373,7 @@ int16 GameDatabase::setObjectProperty(int16 objectIndex, int16 propertyId, int16 void GameDatabase::dumpObject(int16 index) { Object *obj = getObject(index); - char fn[512]; - sprintf(fn, "obj%04X.0", index); - obj->dump(fn); + obj->dump(Common::String::format("obj%04X.0", index)); } diff --git a/engines/made/database.h b/engines/made/database.h index 94acef98cd27..3bf69ca116d9 100644 --- a/engines/made/database.h +++ b/engines/made/database.h @@ -62,7 +62,7 @@ class Object { int16 getVectorItem(int16 index); void setVectorItem(int16 index, int16 value); - void dump(const char *filename); + void dump(const Common::String &filename); protected: bool _freeData; diff --git a/engines/made/made.cpp b/engines/made/made.cpp index a9c4587b4c46..75d39fa20511 100644 --- a/engines/made/made.cpp +++ b/engines/made/made.cpp @@ -181,9 +181,7 @@ void MadeEngine::resetAllTimers() { } Common::String MadeEngine::getSavegameFilename(int16 saveNum) { - char filename[256]; - snprintf(filename, 256, "%s.%03d", getTargetName().c_str(), saveNum); - return filename; + return Common::String::format("%s.%03d", getTargetName().c_str(), saveNum); } void MadeEngine::handleEvents() { diff --git a/engines/made/script.cpp b/engines/made/script.cpp index 85e1a6ec6b3d..277600882860 100644 --- a/engines/made/script.cpp +++ b/engines/made/script.cpp @@ -639,10 +639,9 @@ void ScriptInterpreter::dumpScript(int16 objectIndex, int *opcodeStats, int *ext const char *sig = _commands[opcode - 1].sig; int valueType; /* 0: dec; 1: hex; 2: extended function */ int16 value; - char tempStr[32]; opcodeStats[opcode - 1]++; - snprintf(tempStr, 32, "[%04X] ", (uint16)(code - codeStart - 1)); - codeLine += tempStr; + + codeLine += Common::String::format("[%04X] ", (uint16)(code - codeStart - 1)); codeLine += desc; for (; *sig != '\0'; sig++) { codeLine += " "; @@ -670,19 +669,21 @@ void ScriptInterpreter::dumpScript(int16 objectIndex, int *opcodeStats, int *ext value = *code++; break; } + + Common::String tempStr; switch (valueType) { case 0: - snprintf(tempStr, 32, "%d", value); + tempStr = Common::String::format("%d", value); break; case 1: - snprintf(tempStr, 32, "0x%X", value); + tempStr = Common::String::format("0x%X", value); break; case 2: if (value < _functions->getCount()) { - snprintf(tempStr, 32, "%s", _functions->getFuncName(value)); + tempStr = Common::String::format("%s", _functions->getFuncName(value)); externStats[value]++; } else { - snprintf(tempStr, 32, "invalid: %d", value); + tempStr = Common::String::format("invalid: %d", value); } break; } diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index 98cfb647ac1d..aa172bbe74f7 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -502,28 +502,28 @@ int16 ScriptFunctions::sfDrawText(int16 argc, int16 *argv) { } if (text) { - char finalText[1024]; + Common::String finalText; switch (argc) { case 1: - snprintf(finalText, 1024, "%s", text); + finalText = text; break; case 2: - snprintf(finalText, 1024, text, argv[0]); + finalText = Common::String::format(text, argv[0]); break; case 3: - snprintf(finalText, 1024, text, argv[1], argv[0]); + finalText = Common::String::format(text, argv[1], argv[0]); break; case 4: - snprintf(finalText, 1024, text, argv[2], argv[1], argv[0]); + finalText = Common::String::format(text, argv[2], argv[1], argv[0]); break; case 5: - snprintf(finalText, 1024, text, argv[3], argv[2], argv[1], argv[0]); + finalText = Common::String::format(text, argv[3], argv[2], argv[1], argv[0]); break; default: - finalText[0] = '\0'; + // Leave it empty break; } - _vm->_screen->printText(finalText); + _vm->_screen->printText(finalText.c_str()); } return 0; From d61dc2574b2a54283d95184b4f53cf339841ff80 Mon Sep 17 00:00:00 2001 From: athrxx Date: Mon, 30 May 2011 18:34:27 +0200 Subject: [PATCH 345/369] AUDIO: fix some typos in comments --- audio/mididrv.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/audio/mididrv.cpp b/audio/mididrv.cpp index 7beb76352cac..5839f5b9d708 100644 --- a/audio/mididrv.cpp +++ b/audio/mididrv.cpp @@ -197,7 +197,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // detected since they are hard coded and cannot be disabled. for (int l = (flags & (MDT_PREFER_GM | MDT_PREFER_MT32)) ? 1 : 0; l < 2; ++l) { if ((flags & MDT_MIDI) && (l == 1)) { - // If a preferred MT32 or GM device has been selected that device gets returned + // If a preferred MT32 or GM device has been selected that device gets returned. if (flags & MDT_PREFER_MT32) hdl = getDeviceHandle(ConfMan.get("mt32_device")); else if (flags & MDT_PREFER_GM) @@ -207,20 +207,20 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { const MusicType type = getMusicType(hdl); - // If have a "Don't use GM/MT-32" setting we skip this part and jump + // If we have a "Don't use GM/MT-32" setting we skip this part and jump // to AdLib, PC Speaker etc. detection right away. if (type != MT_NULL) { if (type != MT_AUTO && type != MT_INVALID) { if (flags & MDT_PREFER_MT32) - // If we have a preferred MT32 device we disable the gm/mt32 mapping (more about this in mididrv.h) + // If we have a preferred MT32 device we disable the gm/mt32 mapping (more about this in mididrv.h). _forceTypeMT32 = true; return hdl; } - // If we have no specific device selected (neither in the scummvm nor in the game domain) - // and no preferred MT32 or GM device selected we arrive here. - // If MT32 is preferred we try for the first available device with music type 'MT_MT32' (usually the mt32 emulator) + // If no specific device is selected (neither in the scummvm nor in the game domain) + // and there is no preferred MT32 or GM device selected either we arrive here. + // If MT32 is preferred we try for the first available device with music type 'MT_MT32' (usually the mt32 emulator). if (flags & MDT_PREFER_MT32) { for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); @@ -260,7 +260,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { else if (flags & MDT_APPLEIIGS) tp = MT_APPLEIIGS; else if (l == 0) - // if we haven't tried to find a MIDI device yet we do this now. + // If we haven't tried to find a MIDI device yet we do this now. continue; else tp = MT_AUTO; @@ -292,7 +292,7 @@ MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &ident const MusicPlugin::List p = MusicMan.getPlugins(); if (p.begin() == p.end()) - error("Music plugins must be loaded prior to calling this method"); + error("MidiDriver::getDeviceHandle: Music plugins must be loaded prior to calling this method"); for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); From 4b77a5a12e42e11270d32ac1d92fd1c67a6da789 Mon Sep 17 00:00:00 2001 From: athrxx Date: Thu, 2 Jun 2011 02:36:49 +0200 Subject: [PATCH 346/369] FM-TOWNS AUDIO: cleanup (move some stuff from TownsAudioInterfaceInternal to TownsAudio_PcmChannel) --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 752 ++++++++++--------- 1 file changed, 399 insertions(+), 353 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 786e3ee1d2e6..8c087025047f 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -28,77 +28,108 @@ #include "common/textconsole.h" #include "backends/audiocd/audiocd.h" +class TownsAudio_WaveTable { +friend class TownsAudioInterfaceInternal; +friend class TownsAudio_PcmChannel; +public: + TownsAudio_WaveTable(); + ~TownsAudio_WaveTable(); + +private: + void readHeader(const uint8 *buffer); + void readData(const uint8 *buffer); + void clear(); + + char name[9]; + int32 id; + uint32 size; + uint32 loopStart; + uint32 loopLen; + uint16 rate; + uint16 rateOffs; + uint16 baseNote; + int8 *data; +}; class TownsAudio_PcmChannel { -friend class TownsAudioInterfaceInternal; public: TownsAudio_PcmChannel(); ~TownsAudio_PcmChannel(); -private: - void loadExtData(uint8 *buffer, uint32 size); - void setupLoop(uint32 start, uint32 len); void clear(); + void loadData(TownsAudio_WaveTable *w); + void loadData(uint8 *buffer, uint32 size); + + int initInstrument(uint8 ¬e, TownsAudio_WaveTable *&tables, int numTables); + void keyOn(uint8 note, uint8 velo, TownsAudio_WaveTable *w); + void keyOff(); + + void updateEnvelopeGenerator(); + + void setInstrument(uint8 *instr); + void setLevel(uint8 lvl); + void setPitch(uint32 pt); + void setBalance(uint8 blc); + + void updateOutput(); + int32 currentSampleLeft(); + int32 currentSampleRight(); + + bool _keyPressed; + bool _reserved; + bool _activeKey; + bool _activeEffect; + bool _activeOutput; + +private: + void setupLoop(uint32 loopStart, uint32 len); + void setNote(uint8 note, TownsAudio_WaveTable *w, bool stepLimit = false); + void setVelo(uint8 velo); + void envAttack(); void envDecay(); void envSustain(); void envRelease(); - uint8 *curInstrument; - uint8 note; - uint8 velo; + uint8 *_curInstrument; - int8 *data; - int8 *dataEnd; + uint8 _note; - int8 *loopEnd; - uint32 loopLen; + uint8 _velo; + uint8 _level; + uint8 _tl; - uint16 stepNote; - uint16 stepPitch; - uint16 step; + uint8 _panLeft; + uint8 _panRight; - uint8 panLeft; - uint8 panRight; + int8 *_data; + int8 *_dataEnd; - uint32 pos; + int8 *_loopEnd; + uint32 _loopLen; - uint8 envTotalLevel; - uint8 envAttackRate; - uint8 envDecayRate; - uint8 envSustainLevel; - uint8 envSustainRate; - uint8 envReleaseRate; + uint16 _stepNote; + uint16 _stepPitch; + uint16 _step; - int16 envStep; - int16 envCurrentLevel; + uint32 _pos; - EnvelopeState envState; + uint8 _envTotalLevel; + uint8 _envAttackRate; + uint8 _envDecayRate; + uint8 _envSustainLevel; + uint8 _envSustainRate; + uint8 _envReleaseRate; + int16 _envStep; + int16 _envCurrentLevel; - int8 *extData; -}; + EnvelopeState _envState; -class TownsAudio_WaveTable { -friend class TownsAudioInterfaceInternal; -public: - TownsAudio_WaveTable(); - ~TownsAudio_WaveTable(); + int8 *_extData; -private: - void readHeader(const uint8 *buffer); - void readData(const uint8 *buffer); - void clear(); - - char name[9]; - int32 id; - uint32 size; - uint32 loopStart; - uint32 loopLen; - uint16 rate; - uint16 rateOffs; - uint16 baseNote; - int8 *data; + static const uint16 _pcmPhase1[]; + static const uint16 _pcmPhase2[]; }; class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { @@ -202,18 +233,8 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { int pcmLoadInstrument(int instrId, const uint8 *data); int pcmSetPitch(int chan, int pitch); int pcmSetLevel(int chan, int lvl); - void pcmUpdateEnvelopeGenerator(int chan); TownsAudio_PcmChannel *_pcmChan; - uint8 _pcmChanOut; - uint8 _pcmChanReserved; - uint8 _pcmChanKeyPressed; - uint8 _pcmChanEffectPlaying; - uint8 _pcmChanKeyPlaying; - - uint8 _pcmChanNote[8]; - uint8 _pcmChanVelo[8]; - uint8 _pcmChanLevel[8]; uint8 _numReservedChannels; uint8 *_pcmInstruments; @@ -222,8 +243,6 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { uint8 _numWaveTables; uint32 _waveTablesTotalDataSize; - void pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w); - void updateOutputVolume(); void updateOutputVolumeInternal(); uint8 _outputVolumeFlags; @@ -251,8 +270,6 @@ class TownsAudioInterfaceInternal : public TownsPC98_FmSynth { static const uint16 _frequency[]; static const uint8 _carrier[]; static const uint8 _fmDefaultInstrument[]; - static const uint16 _pcmPhase1[]; - static const uint16 _pcmPhase2[]; }; TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, TownsAudioInterface *owner, TownsAudioInterfacePluginDriver *driver, bool externalMutexHandling) : @@ -260,8 +277,7 @@ TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, To _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _drvOwner(owner), _pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), - _outputVolumeFlags(0), _pcmChanOut(0), _pcmChanReserved(0), _pcmChanKeyPressed(0), - _pcmChanEffectPlaying(0), _pcmChanKeyPlaying(0), _fmChanPlaying(0), + _outputVolumeFlags(0), _fmChanPlaying(0), _numReservedChannels(0), _numWaveTables(0), _updateOutputVol(false), _ready(false) { #define INTCB(x) &TownsAudioInterfaceInternal::intf_##x @@ -377,9 +393,6 @@ TownsAudioInterfaceInternal::TownsAudioInterfaceInternal(Audio::Mixer *mixer, To memset(_fmSaveReg, 0, sizeof(_fmSaveReg)); memset(_fmChanNote, 0, sizeof(_fmChanNote)); memset(_fmChanPitch, 0, sizeof(_fmChanPitch)); - memset(_pcmChanNote, 0, sizeof(_pcmChanNote)); - memset(_pcmChanVelo, 0, sizeof(_pcmChanVelo)); - memset(_pcmChanLevel, 0, sizeof(_pcmChanLevel)); memset(_outputLevel, 0, sizeof(_outputLevel)); memset(_outputMute, 0, sizeof(_outputMute)); @@ -530,40 +543,30 @@ void TownsAudioInterfaceInternal::nextTickEx(int32 *buffer, uint32 bufferSize) { while (_timer > 0x514767) { _timer -= 0x514767; - for (int ii = 0; ii < 8; ii++) { - if ((_pcmChanKeyPlaying & _chanFlags[ii]) || (_pcmChanEffectPlaying & _chanFlags[ii])) { - TownsAudio_PcmChannel *s = &_pcmChan[ii]; - s->pos += s->step; - - if (&s->data[s->pos >> 11] >= s->loopEnd) { - if (s->loopLen) { - s->pos -= s->loopLen; - } else { - s->pos = 0; - _pcmChanEffectPlaying &= ~_chanFlags[ii]; - _pcmChanKeyPlaying &= ~_chanFlags[ii]; - } - } - } - } + for (int ii = 0; ii < 8; ii++) + _pcmChan[ii].updateOutput(); } int32 finOutL = 0; int32 finOutR = 0; for (int ii = 0; ii < 8; ii++) { - if (_pcmChanOut & _chanFlags[ii]) { - int32 o = _pcmChan[ii].data[_pcmChan[ii].pos >> 11] * _pcmChan[ii].velo; - if ((1 << ii) & (~_pcmSfxChanMask)) - o = (o * _musicVolume) / Audio::Mixer::kMaxMixerVolume; - if ((1 << ii) & _pcmSfxChanMask) - o = (o * _sfxVolume) / Audio::Mixer::kMaxMixerVolume; - if (_pcmChan[ii].panLeft) - finOutL += ((o * _pcmChan[ii].panLeft) >> 3); - if (_pcmChan[ii].panRight) - finOutR += ((o * _pcmChan[ii].panRight) >> 3); - if (!((_pcmChanKeyPlaying & _chanFlags[ii]) || (_pcmChanEffectPlaying & _chanFlags[ii]))) - _pcmChanOut &= ~_chanFlags[ii]; + if (_pcmChan[ii]._activeOutput) { + int32 oL = _pcmChan[ii].currentSampleLeft(); + int32 oR = _pcmChan[ii].currentSampleRight(); + if ((1 << ii) & (~_pcmSfxChanMask)) { + oL = (oR * _musicVolume) / Audio::Mixer::kMaxMixerVolume; + oR = (oR * _musicVolume) / Audio::Mixer::kMaxMixerVolume; + } + if ((1 << ii) & _pcmSfxChanMask) { + oL = (oL * _sfxVolume) / Audio::Mixer::kMaxMixerVolume; + oR = (oR * _sfxVolume) / Audio::Mixer::kMaxMixerVolume; + } + finOutL += oL; + finOutR += oR; + + if (!(_pcmChan[ii]._activeKey || _pcmChan[ii]._activeEffect)) + _pcmChan[ii]._activeOutput = false; } } @@ -750,22 +753,19 @@ int TownsAudioInterfaceInternal::intf_reserveEffectChannels(va_list &args) { if (numChan < _numReservedChannels) { int c = 8 - _numReservedChannels; - for (int i = numChan; i; i--) { - uint8 f = ~_chanFlags[c--]; - _pcmChanEffectPlaying &= f; - } + for (int i = numChan; i; i--) + _pcmChan[c--]._activeEffect = false; } else { int c = 7 - _numReservedChannels; for (int i = numChan - _numReservedChannels; i; i--) { - uint8 f = ~_chanFlags[c--]; - _pcmChanKeyPressed &= f; - _pcmChanKeyPlaying &= f; + _pcmChan[c]._keyPressed = false; + _pcmChan[c--]._activeKey = false; } } - static const uint8 reserveChanFlags[] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF }; _numReservedChannels = numChan; - _pcmChanReserved = reserveChanFlags[_numReservedChannels]; + for (int i = 0; i < 8; i++) + _pcmChan[i]._reserved = i >= (8 - _numReservedChannels) ? true : false; return 0; } @@ -838,10 +838,10 @@ int TownsAudioInterfaceInternal::intf_pcmPlayEffect(va_list &args) { chan -= 0x40; - if (!(_pcmChanReserved & _chanFlags[chan])) + if (!_pcmChan[chan]._reserved) return 7; - if ((_pcmChanEffectPlaying & _chanFlags[chan])) + if (_pcmChan[chan]._activeEffect) return 2; TownsAudio_WaveTable w; @@ -855,21 +855,8 @@ int TownsAudioInterfaceInternal::intf_pcmPlayEffect(va_list &args) { TownsAudio_PcmChannel *p = &_pcmChan[chan]; - _pcmChanNote[chan] = note; - _pcmChanVelo[chan] = velo; - - p->note = note; - p->velo = velo << 1; - - p->loadExtData(data + 32, w.size); - p->setupLoop(w.loopStart, w.loopLen); - - pcmCalcPhaseStep(p, &w); - if (p->step > 2048) - p->step = 2048; - - _pcmChanEffectPlaying |= _chanFlags[chan]; - _pcmChanOut |= _chanFlags[chan]; + p->loadData(data + 32, w.size); + p->keyOn(note, velo, &w); return 0; } @@ -885,7 +872,7 @@ int TownsAudioInterfaceInternal::intf_pcmEffectPlaying(va_list &args) { if (chan < 0x40 || chan > 0x47) return 1; chan -= 0x40; - return (_pcmChanEffectPlaying & _chanFlags[chan]) ? 1 : 0; + return _pcmChan[chan]._activeEffect ? 1 : 0; } int TownsAudioInterfaceInternal::intf_fmKeyOn(va_list &args) { @@ -1044,7 +1031,7 @@ int TownsAudioInterfaceInternal::intf_getOutputMute (va_list &args) { int TownsAudioInterfaceInternal::intf_pcmUpdateEnvelopeGenerator(va_list &args) { for (int i = 0; i < 8; i++) - pcmUpdateEnvelopeGenerator(i); + _pcmChan[i].updateEnvelopeGenerator(); return 0; } @@ -1375,14 +1362,8 @@ void TownsAudioInterfaceInternal::bufferedWriteReg(uint8 part, uint8 regAddress, } void TownsAudioInterfaceInternal::pcmReset() { - _pcmChanOut = 0; - _pcmChanReserved = _pcmChanKeyPressed = _pcmChanEffectPlaying = _pcmChanKeyPlaying = 0; _numReservedChannels = 0; - memset(_pcmChanNote, 0, 8); - memset(_pcmChanVelo, 0, 8); - memset(_pcmChanLevel, 0, 8); - for (int i = 0; i < 8; i++) _pcmChan[i].clear(); @@ -1410,65 +1391,19 @@ int TownsAudioInterfaceInternal::pcmKeyOn(int chan, int note, int velo) { return 3; chan -= 0x40; - - if ((_pcmChanReserved & _chanFlags[chan]) || (_pcmChanKeyPressed & _chanFlags[chan])) - return 2; - - _pcmChanNote[chan] = note; - _pcmChanVelo[chan] = velo; - + uint8 noteT = note; TownsAudio_PcmChannel *p = &_pcmChan[chan]; - p->note = note; - - uint8 *instr = _pcmChan[chan].curInstrument; - int i = 0; - for (; i < 8; i++) { - if (note <= instr[16 + 2 * i]) - break; - } - - if (i == 8) - return 8; - - int il = i << 3; - p->note += instr[il + 70]; - - p->envTotalLevel = instr[il + 64]; - p->envAttackRate = instr[il + 65]; - p->envDecayRate = instr[il + 66]; - p->envSustainLevel = instr[il + 67]; - p->envSustainRate = instr[il + 68]; - p->envReleaseRate = instr[il + 69]; - p->envStep = 0; - - int32 id = (int32)READ_LE_UINT32(&instr[i * 4 + 32]); - - for (i = 0; i < _numWaveTables; i++) { - if (id == _waveTables[i].id) - break; - } - if (i == _numWaveTables) - return 9; - - TownsAudio_WaveTable *w = &_waveTables[i]; - - p->data = w->data; - p->dataEnd = w->data + w->size; - p->setupLoop(w->loopStart, w->loopLen); - - pcmCalcPhaseStep(p, w); - - uint32 lvl = _pcmChanLevel[chan] * _pcmChanVelo[chan]; - p->envTotalLevel = ((p->envTotalLevel * lvl) >> 14) & 0xff; - p->envSustainLevel = ((p->envSustainLevel * lvl) >> 14) & 0xff; + if (p->_reserved || p->_keyPressed) + return 2; - p->envAttack(); - p->velo = (p->envCurrentLevel >> 8) << 1; + TownsAudio_WaveTable *w = _waveTables; + int res = p->initInstrument(noteT, w, _numWaveTables); + if (res) + return res; - _pcmChanKeyPressed |= _chanFlags[chan]; - _pcmChanKeyPlaying |= _chanFlags[chan]; - _pcmChanOut |= _chanFlags[chan]; + p->loadData(w); + p->keyOn(noteT, velo, w); return 0; } @@ -1478,8 +1413,7 @@ int TownsAudioInterfaceInternal::pcmKeyOff(int chan) { return 1; chan -= 0x40; - _pcmChanKeyPressed &= ~_chanFlags[chan]; - _pcmChan[chan].envRelease(); + _pcmChan[chan].keyOff(); return 0; } @@ -1488,11 +1422,7 @@ int TownsAudioInterfaceInternal::pcmChanOff(int chan) { return 1; chan -= 0x40; - - _pcmChanKeyPressed &= ~_chanFlags[chan]; - _pcmChanEffectPlaying &= ~_chanFlags[chan]; - _pcmChanKeyPlaying &= ~_chanFlags[chan]; - _pcmChanOut &= ~_chanFlags[chan]; + _pcmChan[chan]._keyPressed = _pcmChan[chan]._activeEffect = _pcmChan[chan]._activeKey = _pcmChan[chan]._activeOutput = false; return 0; } @@ -1514,8 +1444,7 @@ int TownsAudioInterfaceInternal::pcmSetPanPos(int chan, int mode) { blc = ((119 + mode) ^ (mode << 4)) & 0xff; } - _pcmChan[chan].panLeft = blc & 0x0f; - _pcmChan[chan].panRight = blc >> 4; + _pcmChan[chan].setBalance(blc); return 0; } @@ -1526,7 +1455,8 @@ int TownsAudioInterfaceInternal::pcmSetInstrument(int chan, int instrId) { if (instrId > 31) return 3; chan -= 0x40; - _pcmChan[chan].curInstrument = &_pcmInstruments[instrId * 128]; + _pcmChan[chan].setInstrument(&_pcmInstruments[instrId * 128]); + return 0; } @@ -1555,15 +1485,7 @@ int TownsAudioInterfaceInternal::pcmSetPitch(int chan, int pitch) { else if (pitch > 0) pts = (((pitch + 0x2001) << 16) / 0x2000) >> 2; - p->stepPitch = pts & 0xffff; - p->step = (p->stepNote * p->stepPitch) >> 14; - -// if (_pcmChanUnkFlag & _chanFlags[chan]) -// unk[chan] = (((p->step * 1000) << 11) / 98) / 20833; - - /*else*/ - if ((_pcmChanEffectPlaying & _chanFlags[chan]) && (p->step > 2048)) - p->step = 2048; + p->setPitch(pts); return 0; } @@ -1576,98 +1498,11 @@ int TownsAudioInterfaceInternal::pcmSetLevel(int chan, int lvl) { return 3; chan -= 0x40; - TownsAudio_PcmChannel *p = &_pcmChan[chan]; - - if (_pcmChanReserved & _chanFlags[chan]) { - _pcmChanVelo[chan] = lvl; - p->velo = lvl << 1; - } else { - int32 t = p->envStep * lvl; - if (_pcmChanLevel[chan]) - t /= _pcmChanLevel[chan]; - p->envStep = t; - t = p->envCurrentLevel * lvl; - if (_pcmChanLevel[chan]) - t /= _pcmChanLevel[chan]; - p->envCurrentLevel = t; - _pcmChanLevel[chan] = lvl; - p->velo = p->envCurrentLevel >> 8; - } + _pcmChan[chan].setLevel(lvl); return 0; } -void TownsAudioInterfaceInternal::pcmUpdateEnvelopeGenerator(int chan) { - TownsAudio_PcmChannel *p = &_pcmChan[chan]; - if (!p->envCurrentLevel) { - _pcmChanKeyPlaying &= ~_chanFlags[chan]; - p->envState = kEnvReady; - } - - if (!(_pcmChanKeyPlaying & _chanFlags[chan])) - return; - - switch (p->envState) { - case kEnvAttacking: - if (((p->envCurrentLevel + p->envStep) >> 8) > p->envTotalLevel) { - p->envDecay(); - return; - } else { - p->envCurrentLevel += p->envStep; - } - break; - - case kEnvDecaying: - if (((p->envCurrentLevel - p->envStep) >> 8) < p->envSustainLevel) { - p->envSustain(); - return; - } else { - p->envCurrentLevel -= p->envStep; - } - break; - - case kEnvSustaining: - case kEnvReleasing: - p->envCurrentLevel -= p->envStep; - if (p->envCurrentLevel <= 0) - p->envCurrentLevel = 0; - break; - - default: - break; - } - p->velo = (p->envCurrentLevel >> 8) << 1; -} - -void TownsAudioInterfaceInternal::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w) { - int8 diff = p->note - w->baseNote; - uint16 r = w->rate + w->rateOffs; - uint16 bl = 0; - uint32 s = 0; - - if (diff < 0) { - diff *= -1; - bl = diff % 12; - diff /= 12; - s = (r >> diff); - if (bl) - s = (s * _pcmPhase2[bl]) >> 16; - - } else if (diff > 0) { - bl = diff % 12; - diff /= 12; - s = (r << diff); - if (bl) - s += ((s * _pcmPhase1[bl]) >> 16); - - } else { - s = r; - } - - p->stepNote = s & 0xffff; - p->step = (s * p->stepPitch) >> 14; -} - void TownsAudioInterfaceInternal::updateOutputVolume() { // Avoid calls to g_system->getAudioCDManager() functions from the main thread // since this can cause mutex lockups. @@ -1717,16 +1552,8 @@ const uint8 TownsAudioInterfaceInternal::_fmDefaultInstrument[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const uint16 TownsAudioInterfaceInternal::_pcmPhase1[] = { - 0x879B, 0x0F37, 0x1F58, 0x306E, 0x4288, 0x55B6, 0x6A08, 0x7F8F, 0x965E, 0xAE88, 0xC882, 0xE341 -}; - -const uint16 TownsAudioInterfaceInternal::_pcmPhase2[] = { - 0xFEFE, 0xF1A0, 0xE411, 0xD744, 0xCB2F, 0xBFC7, 0xB504, 0xAAE2, 0xA144, 0x9827, 0x8FAC -}; - TownsAudio_PcmChannel::TownsAudio_PcmChannel() { - extData = 0; + _extData = 0; clear(); } @@ -1734,97 +1561,316 @@ TownsAudio_PcmChannel::~TownsAudio_PcmChannel() { clear(); } -void TownsAudio_PcmChannel::loadExtData(uint8 *buffer, uint32 size) { - delete[] extData; - extData = new int8[size]; +void TownsAudio_PcmChannel::clear() { + _curInstrument = 0; + _note = _tl = _level = _velo = 0; + + _data = 0; + _dataEnd = 0; + _loopLen = 0; + + _pos = 0; + _loopEnd = 0; + + _step = 0; + _stepNote = 0x4000; + _stepPitch = 0x4000; + + _panLeft = _panRight = 7; + + _envTotalLevel = _envAttackRate = _envDecayRate = _envSustainLevel = _envSustainRate = _envReleaseRate = 0; + _envStep = _envCurrentLevel = 0; + + _envState = kEnvReady; + + _activeKey = _activeEffect = _activeOutput = _keyPressed = _reserved = false; + + delete[] _extData; + _extData = 0; +} + +void TownsAudio_PcmChannel::loadData(TownsAudio_WaveTable *w) { + _data = w->data; + _dataEnd = w->data + w->size; +} + +void TownsAudio_PcmChannel::loadData(uint8 *buffer, uint32 size) { + delete[] _extData; + _extData = new int8[size]; int8 *src = (int8 *)buffer; - int8 *dst = extData; + int8 *dst = _extData; for (uint32 i = 0; i < size; i++) *dst++ = *src & 0x80 ? (*src++ & 0x7f) : -*src++; - data = extData; - dataEnd = extData + size; - pos = 0; + _data = _extData; + _dataEnd = _extData + size; + _pos = 0; } -void TownsAudio_PcmChannel::setupLoop(uint32 start, uint32 len) { - loopLen = len << 11; - loopEnd = loopLen ? &data[(start + loopLen) >> 11] : dataEnd; - pos = start; +int TownsAudio_PcmChannel::initInstrument(uint8 ¬e, TownsAudio_WaveTable *&tables, int numTables) { + int i = 0; + for (; i < 8; i++) { + if (note <= _curInstrument[16 + 2 * i]) + break; + } + + if (i == 8) + return 8; + + int il = i << 3; + note += _curInstrument[il + 70]; + + uint8 *d = &_curInstrument[il + 64]; + _envTotalLevel = d[0]; + _envAttackRate = d[1]; + _envDecayRate = d[2]; + _envSustainLevel = d[3]; + _envSustainRate = d[4]; + _envReleaseRate = d[5]; + _envStep = 0; + note += d[6]; + + int32 id = (int32)READ_LE_UINT32(&_curInstrument[i * 4 + 32]); + + for (i = 0; i < numTables; i++) { + if (id == tables[i].id) + break; + } + + if (i == numTables) + return 9; + + tables = &tables[i]; + return 0; } -void TownsAudio_PcmChannel::clear() { - curInstrument = 0; - note = 0; - velo = 0; +void TownsAudio_PcmChannel::keyOn(uint8 note, uint8 velo, TownsAudio_WaveTable *w) { + setupLoop(w->loopStart, w->loopLen); + setNote(note, w, _reserved); + setVelo(velo); - data = 0; - dataEnd = 0; - loopLen = 0; + if (_reserved) + _activeEffect = true; + else + _keyPressed = _activeKey = true; + + _activeOutput = true; +} + +void TownsAudio_PcmChannel::keyOff() { + _keyPressed = false; + envRelease(); +} + +void TownsAudio_PcmChannel::updateEnvelopeGenerator() { + if (!_envCurrentLevel) { + _activeKey = false; + _envState = kEnvReady; + } + + if (!_activeKey) + return; + + switch (_envState) { + case kEnvAttacking: + if (((_envCurrentLevel + _envStep) >> 8) > _envTotalLevel) { + envDecay(); + return; + } else { + _envCurrentLevel += _envStep; + } + break; + + case kEnvDecaying: + if (((_envCurrentLevel - _envStep) >> 8) < _envSustainLevel) { + envSustain(); + return; + } else { + _envCurrentLevel -= _envStep; + } + break; + + case kEnvSustaining: + case kEnvReleasing: + _envCurrentLevel -= _envStep; + if (_envCurrentLevel <= 0) + _envCurrentLevel = 0; + break; + + default: + break; + } + _tl = (_envCurrentLevel >> 8) << 1; +} + +void TownsAudio_PcmChannel::setInstrument(uint8 *instr) { + _curInstrument = instr; +} + +void TownsAudio_PcmChannel::setLevel(uint8 lvl) { + if (_reserved) { + _velo = lvl; + _tl = lvl << 1; + } else { + int32 t = _envStep * lvl; + if (_level) + t /= _level; + _envStep = t; + t = _envCurrentLevel * lvl; + if (_level) + t /= _level; + _envCurrentLevel = t; + _level = lvl; + _tl = _envCurrentLevel >> 8; + } +} + +void TownsAudio_PcmChannel::setPitch(uint32 pt) { + _stepPitch = pt & 0xffff; + _step = (_stepNote * _stepPitch) >> 14; + +// if (_pcmChanUnkFlag & _chanFlags[chan]) +// unk[chan] = (((p->step * 1000) << 11) / 98) / 20833; + + /*else*/ + if (_activeEffect && (_step > 2048)) + _step = 2048; +} + +void TownsAudio_PcmChannel::setBalance(uint8 blc) { + _panLeft = blc & 0x0f; + _panRight = blc >> 4; +} + +void TownsAudio_PcmChannel::updateOutput() { + if (_activeKey || _activeEffect) { + _pos += _step; + + if (&_data[_pos >> 11] >= _loopEnd) { + if (_loopLen) { + _pos -= _loopLen; + } else { + _pos = 0; + _activeKey = _activeEffect = false; + } + } + } +} - pos = 0; - loopEnd = 0; +int32 TownsAudio_PcmChannel::currentSampleLeft() { + return (_activeOutput && _panLeft) ? (((_data[_pos >> 11] * _tl) * _panLeft) >> 3) : 0; +} - step = 0; - stepNote = 0x4000; - stepPitch = 0x4000; +int32 TownsAudio_PcmChannel::currentSampleRight() { + return (_activeOutput && _panRight) ? (((_data[_pos >> 11] * _tl) * _panRight) >> 3) : 0; +} - panLeft = panRight = 7; +void TownsAudio_PcmChannel::setupLoop(uint32 loopStart, uint32 len) { + _loopLen = len << 11; + _loopEnd = _loopLen ? &_data[(loopStart + _loopLen) >> 11] : _dataEnd; + _pos = loopStart; +} - envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = envSustainRate = envReleaseRate = 0; - envStep = envCurrentLevel = 0; +void TownsAudio_PcmChannel::setNote(uint8 note, TownsAudio_WaveTable *w, bool stepLimit) { + _note = note; + int8 diff = _note - w->baseNote; + uint16 r = w->rate + w->rateOffs; + uint16 bl = 0; + uint32 s = 0; - envState = kEnvReady; + if (diff < 0) { + diff *= -1; + bl = diff % 12; + diff /= 12; + s = (r >> diff); + if (bl) + s = (s * _pcmPhase2[bl]) >> 16; - delete[] extData; - extData = 0; + } else if (diff > 0) { + bl = diff % 12; + diff /= 12; + s = (r << diff); + if (bl) + s += ((s * _pcmPhase1[bl]) >> 16); + + } else { + s = r; + } + + _stepNote = s & 0xffff; + _step = (s * _stepPitch) >> 14; + + if (stepLimit && _step > 2048) + _step = 2048; +} + +void TownsAudio_PcmChannel::setVelo(uint8 velo) { + if (_reserved) { + _velo = velo; + _tl = velo << 1; + } else { + _velo = velo; + uint32 lvl = _level * _velo; + _envTotalLevel = ((_envTotalLevel * lvl) >> 14) & 0xff; + _envSustainLevel = ((_envSustainLevel * lvl) >> 14) & 0xff; + envAttack(); + _tl = (_envCurrentLevel >> 8) << 1; + } } void TownsAudio_PcmChannel::envAttack() { - envState = kEnvAttacking; - int16 t = envTotalLevel << 8; - if (envAttackRate == 127) { - envStep = 0; - } else if (envAttackRate) { - envStep = t / envAttackRate; - envCurrentLevel = 1; + _envState = kEnvAttacking; + int16 t = _envTotalLevel << 8; + if (_envAttackRate == 127) { + _envStep = 0; + } else if (_envAttackRate) { + _envStep = t / _envAttackRate; + _envCurrentLevel = 1; } else { - envCurrentLevel = t; + _envCurrentLevel = t; envDecay(); } } void TownsAudio_PcmChannel::envDecay() { - envState = kEnvDecaying; - int16 t = envTotalLevel - envSustainLevel; - if (t < 0 || envDecayRate == 127) { - envStep = 0; - } else if (envDecayRate) { - envStep = (t << 8) / envDecayRate; + _envState = kEnvDecaying; + int16 t = _envTotalLevel - _envSustainLevel; + if (t < 0 || _envDecayRate == 127) { + _envStep = 0; + } else if (_envDecayRate) { + _envStep = (t << 8) / _envDecayRate; } else { - envCurrentLevel = envSustainLevel << 8; + _envCurrentLevel = _envSustainLevel << 8; envSustain(); } } void TownsAudio_PcmChannel::envSustain() { - envState = kEnvSustaining; - if (envSustainLevel && envSustainRate) - envStep = (envSustainRate == 127) ? 0 : (envCurrentLevel / envSustainRate) >> 1; + _envState = kEnvSustaining; + if (_envSustainLevel && _envSustainRate) + _envStep = (_envSustainRate == 127) ? 0 : (_envCurrentLevel / _envSustainRate) >> 1; else - envStep = envCurrentLevel = 1; + _envStep = _envCurrentLevel = 1; } void TownsAudio_PcmChannel::envRelease() { - envState = kEnvReleasing; - if (envReleaseRate == 127) - envStep = 0; - else if (envReleaseRate) - envStep = envCurrentLevel / envReleaseRate; + _envState = kEnvReleasing; + if (_envReleaseRate == 127) + _envStep = 0; + else if (_envReleaseRate) + _envStep = _envCurrentLevel / _envReleaseRate; else - envStep = envCurrentLevel = 1; + _envStep = _envCurrentLevel = 1; } +const uint16 TownsAudio_PcmChannel::_pcmPhase1[] = { + 0x879B, 0x0F37, 0x1F58, 0x306E, 0x4288, 0x55B6, 0x6A08, 0x7F8F, 0x965E, 0xAE88, 0xC882, 0xE341 +}; + +const uint16 TownsAudio_PcmChannel::_pcmPhase2[] = { + 0xFEFE, 0xF1A0, 0xE411, 0xD744, 0xCB2F, 0xBFC7, 0xB504, 0xAAE2, 0xA144, 0x9827, 0x8FAC +}; + TownsAudio_WaveTable::TownsAudio_WaveTable() { data = 0; clear(); From c1f00b1e8b0e868ba97a9154d2d7c2986d5d9be3 Mon Sep 17 00:00:00 2001 From: athrxx Date: Thu, 2 Jun 2011 16:51:54 +0200 Subject: [PATCH 347/369] FM-TOWNS AUDIO: fix regression --- audio/softsynth/fmtowns_pc98/towns_audio.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp index 8c087025047f..beee5f1cad74 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp @@ -1617,10 +1617,7 @@ int TownsAudio_PcmChannel::initInstrument(uint8 ¬e, TownsAudio_WaveTable *&ta if (i == 8) return 8; - int il = i << 3; - note += _curInstrument[il + 70]; - - uint8 *d = &_curInstrument[il + 64]; + uint8 *d = &_curInstrument[(i << 3) + 64]; _envTotalLevel = d[0]; _envAttackRate = d[1]; _envDecayRate = d[2]; @@ -1822,7 +1819,7 @@ void TownsAudio_PcmChannel::envAttack() { _envState = kEnvAttacking; int16 t = _envTotalLevel << 8; if (_envAttackRate == 127) { - _envStep = 0; + _envCurrentLevel = _envStep = 0; } else if (_envAttackRate) { _envStep = t / _envAttackRate; _envCurrentLevel = 1; From d21ddbce7988bdc1e611ab21cdac365fe9206134 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 2 Jun 2011 17:05:48 +0200 Subject: [PATCH 348/369] TSAGE: Add comments on actions and hotspots of scene 4000. The buggy sequence is clearly identified, for potential future fix. --- engines/tsage/ringworld_scenes5.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index 8cdb0a46fb52..8b95e40abe98 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -34,6 +34,7 @@ namespace tSage { *--------------------------------------------------------------------------*/ void Scene4000::Action1::signal() { + // Quinn has the peg. Everybody enter the screen. Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -124,6 +125,8 @@ void Scene4000::Action1::signal() { } void Scene4000::Action2::signal() { + // Quinn, Seeker and Miranda walks down to the village + // Then, they talk to Rock, and enter the priest hut Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -179,6 +182,7 @@ void Scene4000::Action2::signal() { } void Scene4000::Action3::signal() { + // The guard walks to the left and exits the screen Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -197,6 +201,7 @@ void Scene4000::Action3::signal() { } void Scene4000::Action4::signal() { + // Quinn ties the rope to the rock Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -235,6 +240,7 @@ void Scene4000::Action4::signal() { } void Scene4000::Action5::signal() { + // Chat with Miranda Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -261,6 +267,8 @@ void Scene4000::Action5::signal() { } void Scene4000::Action6::signal() { + // Quinn and Miranda enter the screen and walk to the village. + // Rock comes and notices the alcohol. They all enter his hut. Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -363,6 +371,7 @@ void Scene4000::Action8::signal() { } void Scene4000::Action9::signal() { + // Villager animations switch (_actionIndex++) { case 0: setDelay(_globals->_randomSource.getRandomNumber(119) + 240); @@ -375,6 +384,7 @@ void Scene4000::Action9::signal() { } void Scene4000::Action10::signal() { + // Villager animations switch (_actionIndex++) { case 0: setDelay(_globals->_randomSource.getRandomNumber(119) + 240); @@ -433,6 +443,7 @@ void Scene4000::Action11::signal() { } void Scene4000::Action12::signal() { + // Quinn enter Rock's hut Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -474,6 +485,7 @@ void Scene4000::Action12::signal() { } void Scene4000::Action13::signal() { + // Lander is landing Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (_actionIndex++) { @@ -539,6 +551,7 @@ void Scene4000::Miranda::doAction(int action) { } void Scene4000::Hotspot8::doAction(int action) { + // Guard Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (action) { @@ -653,7 +666,7 @@ void Scene4000::TheTech::doAction(int action) { } void Scene4000::Hotspot13::doAction(int action) { - // Rock + // Rock between the two chimneys Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (action) { @@ -673,6 +686,7 @@ void Scene4000::Hotspot13::doAction(int action) { } void Scene4000::Hotspot::doAction(int action) { + // Wall between the two doors Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; switch (action) { @@ -753,6 +767,7 @@ void Scene4000::Hotspot18::doAction(int action) { } void Scene4000::Hotspot23::doAction(int action) { + // Door of the temple switch (action) { case CURSOR_LOOK: SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9); @@ -997,6 +1012,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _miranda.setPosition(Common::Point(246, 146)); if (_globals->getFlag(39)) { + // Ollo follows Quinn and gives explanations on the Tech. _globals->clearFlag(39); _olo.postInit(); @@ -1007,6 +1023,8 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _sceneMode = 4010; _globals->_player.disableControl(); + // This is the buggy animation where Miranda comments the Tech even + // if she's not in the room but in the lander. setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL); } From 86240bb0dc0103e5099d23770cc04cfd907d2c61 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 13:49:54 +0200 Subject: [PATCH 349/369] ENGINES: Get rid of some s(n)printf calls --- engines/dialogs.cpp | 6 +++--- engines/engine.cpp | 8 ++------ engines/savestate.cpp | 12 ++++++------ engines/savestate.h | 4 +--- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 75b2ca9296cd..f9b1c1e8b5a7 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -227,9 +227,9 @@ void MainMenuDialog::save() { Common::String result(_saveDialog->getResultString()); if (result.empty()) { // If the user was lazy and entered no save name, come up with a default name. - char buf[20]; - snprintf(buf, 20, "Save %d", slot + 1); - _engine->saveGameState(slot, buf); + Common::String buf; + buf = Common::String::format("Save %d", slot + 1); + _engine->saveGameState(slot, buf.c_str()); } else { _engine->saveGameState(slot, result.c_str()); } diff --git a/engines/engine.cpp b/engines/engine.cpp index b3cb8bea065c..6c153310b68b 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -206,12 +206,8 @@ void initGraphics(int width, int height, bool defaultTo1xScaler, const Graphics: // Error out on size switch failure if (gfxError & OSystem::kTransactionSizeChangeFailed) { - char buffer[16]; - snprintf(buffer, 16, "%dx%d", width, height); - - Common::String message = "Could not switch to resolution: '"; - message += buffer; - message += "'."; + Common::String message; + message = Common::String::format("Could not switch to resolution: '%dx%d'.", width, height); GUIErrorMessage(message); error("%s", message.c_str()); diff --git a/engines/savestate.cpp b/engines/savestate.cpp index 9ed8356d3be8..551c39b88043 100644 --- a/engines/savestate.cpp +++ b/engines/savestate.cpp @@ -52,20 +52,20 @@ void SaveStateDescriptor::setWriteProtectedFlag(bool state) { } void SaveStateDescriptor::setSaveDate(int year, int month, int day) { - char buffer[32]; - snprintf(buffer, 32, "%.2d.%.2d.%.4d", day, month, year); + Common::String buffer; + buffer = Common::String::format("%.2d.%.2d.%.4d", day, month, year); setVal("save_date", buffer); } void SaveStateDescriptor::setSaveTime(int hour, int min) { - char buffer[32]; - snprintf(buffer, 32, "%.2d:%.2d", hour, min); + Common::String buffer; + buffer = Common::String::format("%.2d:%.2d", hour, min); setVal("save_time", buffer); } void SaveStateDescriptor::setPlayTime(int hours, int minutes) { - char buffer[32]; - snprintf(buffer, 32, "%.2d:%.2d", hours, minutes); + Common::String buffer; + buffer = Common::String::format("%.2d:%.2d", hours, minutes); setVal("play_time", buffer); } diff --git a/engines/savestate.h b/engines/savestate.h index ce78bc4ba385..df017320584a 100644 --- a/engines/savestate.h +++ b/engines/savestate.h @@ -49,9 +49,7 @@ class SaveStateDescriptor : public Common::StringMap { } SaveStateDescriptor(int s, const Common::String &d) : _thumbnail() { - char buf[16]; - sprintf(buf, "%d", s); - setVal("save_slot", buf); + setVal("save_slot", Common::String::format("%d", s)); setVal("description", d); } From 477d6233c3672d9a60cceea3570bc775df3d9253 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Jun 2011 14:11:38 +0200 Subject: [PATCH 350/369] ENGINES: Change 2nd param of Engine::saveGameState to Common::String --- engines/agi/agi.h | 2 +- engines/agi/saveload.cpp | 4 ++-- engines/cine/cine.h | 4 ++-- engines/cine/detection.cpp | 6 +++--- engines/cine/saveload.cpp | 2 +- engines/cruise/cruise.cpp | 2 +- engines/cruise/cruise.h | 3 +-- engines/cruise/menu.cpp | 2 +- engines/dialogs.cpp | 4 ++-- engines/draci/draci.cpp | 2 +- engines/draci/draci.h | 2 +- engines/engine.cpp | 2 +- engines/engine.h | 2 +- engines/hugo/hugo.cpp | 2 +- engines/hugo/hugo.h | 2 +- engines/lure/lure.h | 2 +- engines/mohawk/myst.cpp | 2 +- engines/mohawk/myst.h | 2 +- engines/mohawk/riven.cpp | 2 +- engines/mohawk/riven.h | 2 +- engines/queen/queen.cpp | 4 ++-- engines/queen/queen.h | 2 +- engines/saga/detection.cpp | 4 ++-- engines/saga/saga.h | 2 +- engines/sci/detection.cpp | 2 +- engines/sci/engine/savegame.cpp | 2 +- engines/sci/engine/savegame.h | 2 +- engines/sci/sci.h | 2 +- engines/scumm/input.cpp | 2 +- engines/scumm/saveload.cpp | 19 +++++++++---------- engines/scumm/scumm.cpp | 3 +-- engines/scumm/scumm.h | 6 +++--- engines/sky/detection.cpp | 2 +- engines/sky/sky.h | 2 +- engines/sword1/detection.cpp | 4 ++-- engines/sword1/sword1.h | 2 +- engines/sword2/sword2.cpp | 4 ++-- engines/sword2/sword2.h | 2 +- engines/sword25/sword25.h | 2 +- engines/teenagent/teenagent.cpp | 4 ++-- engines/teenagent/teenagent.h | 2 +- engines/tinsel/detection.cpp | 2 +- engines/tinsel/tinsel.h | 2 +- engines/toon/toon.h | 2 +- engines/touche/saveload.cpp | 4 ++-- engines/touche/touche.h | 2 +- engines/tsage/tsage.cpp | 2 +- engines/tsage/tsage.h | 2 +- engines/tucker/saveload.cpp | 2 +- engines/tucker/tucker.h | 2 +- 50 files changed, 71 insertions(+), 74 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index a42148b1ef05..0155caf11dbc 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -807,7 +807,7 @@ class AgiEngine : public AgiBase { virtual ~AgiEngine(); Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); private: uint32 _lastTick; diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp index deda186439a8..7eaf13d889a7 100644 --- a/engines/agi/saveload.cpp +++ b/engines/agi/saveload.cpp @@ -1017,10 +1017,10 @@ Common::Error AgiEngine::loadGameState(int slot) { } } -Common::Error AgiEngine::saveGameState(int slot, const char *desc) { +Common::Error AgiEngine::saveGameState(int slot, const Common::String &desc) { char saveLoadSlot[12]; sprintf(saveLoadSlot, "%s.%.3d", _targetName.c_str(), slot); - if (saveGame(saveLoadSlot, desc) == errOK) + if (saveGame(saveLoadSlot, desc.c_str()) == errOK) return Common::kNoError; else return Common::kUnknownError; diff --git a/engines/cine/cine.h b/engines/cine/cine.h index 371ea0dd1f92..55376dce29de 100644 --- a/engines/cine/cine.h +++ b/engines/cine/cine.h @@ -126,7 +126,7 @@ class CineEngine : public Engine { int modifyGameSpeed(int speedChange); int getTimerDelay() const; Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canLoadGameStateCurrently(); bool canSaveGameStateCurrently(); @@ -148,7 +148,7 @@ class CineEngine : public Engine { void resetEngine(); bool loadPlainSaveFW(Common::SeekableReadStream &in, CineSaveGameFormat saveGameFormat); bool loadTempSaveOS(Common::SeekableReadStream &in); - bool makeLoad(char *saveName); + bool makeLoad(const Common::String &saveName); void makeSaveFW(Common::OutSaveFile &out); void makeSaveOS(Common::OutSaveFile &out); void makeSave(char *saveFileName); diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index 64eee4574f97..738366124c5d 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -232,16 +232,16 @@ Common::Error CineEngine::loadGameState(int slot) { return gameLoaded ? Common::kNoError : Common::kUnknownError; } -Common::Error CineEngine::saveGameState(int slot, const char *desc) { +Common::Error CineEngine::saveGameState(int slot, const Common::String &desc) { // Load savegame descriptions from index file loadSaveDirectory(); // Set description for selected slot making sure it ends with a trailing zero - strncpy(currentSaveName[slot], desc, 20); + strncpy(currentSaveName[slot], desc.c_str(), 20); currentSaveName[slot][sizeof(CommandeType) - 1] = 0; // Update savegame descriptions - Common::String indexFile = Common::String::format("%s.dir", _targetName.c_str()); + Common::String indexFile = _targetName + ".dir"; Common::OutSaveFile *fHandle = _saveFileMan->openForSaving(indexFile); if (!fHandle) { diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index e51d07b1a573..0ea1a23e8fb6 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -765,7 +765,7 @@ bool CineEngine::loadPlainSaveFW(Common::SeekableReadStream &in, CineSaveGameFor return !(in.eos() || in.err()); } -bool CineEngine::makeLoad(char *saveName) { +bool CineEngine::makeLoad(const Common::String &saveName) { Common::SharedPtr saveFile(_saveFileMan->openForLoading(saveName)); if (!saveFile) { diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp index b57e0ab1885e..cf01d9bdbcc9 100644 --- a/engines/cruise/cruise.cpp +++ b/engines/cruise/cruise.cpp @@ -209,7 +209,7 @@ bool CruiseEngine::canLoadGameStateCurrently() { return playerMenuEnabled != 0; } -Common::Error CruiseEngine::saveGameState(int slot, const char *desc) { +Common::Error CruiseEngine::saveGameState(int slot, const Common::String &desc) { return saveSavegameData(slot, desc); } diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h index 44e3f26d9d24..900f677975e1 100644 --- a/engines/cruise/cruise.h +++ b/engines/cruise/cruise.h @@ -71,7 +71,6 @@ class CruiseEngine: public Engine { void initialize(); void deinitialize(); bool loadLanguageStrings(); - bool makeLoad(char *saveName); void mainLoop(); int processInput(); protected: @@ -100,7 +99,7 @@ class CruiseEngine: public Engine { static const char *getSavegameFile(int saveGameIdx); virtual Common::Error loadGameState(int slot); virtual bool canLoadGameStateCurrently(); - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); virtual bool canSaveGameStateCurrently(); virtual void syncSoundSettings(); diff --git a/engines/cruise/menu.cpp b/engines/cruise/menu.cpp index bb817972161d..e763e2b8a12b 100644 --- a/engines/cruise/menu.cpp +++ b/engines/cruise/menu.cpp @@ -228,7 +228,7 @@ static void handleSaveLoad(bool saveFlag) { result = Common::String::format("Save %d", slot + 1); } - _vm->saveGameState(slot, result.c_str()); + _vm->saveGameState(slot, result); } } diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index f9b1c1e8b5a7..3fd8671e55da 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -229,9 +229,9 @@ void MainMenuDialog::save() { // If the user was lazy and entered no save name, come up with a default name. Common::String buf; buf = Common::String::format("Save %d", slot + 1); - _engine->saveGameState(slot, buf.c_str()); + _engine->saveGameState(slot, buf); } else { - _engine->saveGameState(slot, result.c_str()); + _engine->saveGameState(slot, result); } close(); diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index a5236b58355b..67e043632e3f 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -461,7 +461,7 @@ bool DraciEngine::canLoadGameStateCurrently() { (_game->getLoopSubstatus() == kOuterLoop); } -Common::Error DraciEngine::saveGameState(int slot, const char *desc) { +Common::Error DraciEngine::saveGameState(int slot, const Common::String &desc) { return saveSavegameData(slot, desc, *this); } diff --git a/engines/draci/draci.h b/engines/draci/draci.h index f99bdd5b8e6d..55ebff083e72 100644 --- a/engines/draci/draci.h +++ b/engines/draci/draci.h @@ -70,7 +70,7 @@ class DraciEngine : public Engine { static Common::String getSavegameFile(int saveGameIdx); virtual Common::Error loadGameState(int slot); virtual bool canLoadGameStateCurrently(); - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); virtual bool canSaveGameStateCurrently(); GUI::Debugger *getDebugger() { return _console; } diff --git a/engines/engine.cpp b/engines/engine.cpp index 6c153310b68b..210b0b46a377 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -470,7 +470,7 @@ bool Engine::canLoadGameStateCurrently() { return false; } -Common::Error Engine::saveGameState(int slot, const char *desc) { +Common::Error Engine::saveGameState(int slot, const Common::String &desc) { // Do nothing by default return Common::kNoError; } diff --git a/engines/engine.h b/engines/engine.h index 375df2b0a353..d7d971ad97fa 100644 --- a/engines/engine.h +++ b/engines/engine.h @@ -196,7 +196,7 @@ class Engine { * @param desc a description for the savestate, entered by the user * @return returns kNoError on success, else an error code. */ - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); /** * Indicates whether a game state can be saved. diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index a08dbc094b30..10d61f25a2dd 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -130,7 +130,7 @@ void HugoEngine::setMaxScore(const int newScore) { _maxscore = newScore; } -Common::Error HugoEngine::saveGameState(int slot, const char *desc) { +Common::Error HugoEngine::saveGameState(int slot, const Common::String &desc) { return (_file->saveGame(slot, desc) ? Common::kWritingFailed : Common::kNoError); } diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h index b5b8d5ea6182..81d194f1d60a 100644 --- a/engines/hugo/hugo.h +++ b/engines/hugo/hugo.h @@ -301,7 +301,7 @@ class HugoEngine : public Engine { void adjustScore(const int adjustment); int getMaxScore() const; void setMaxScore(const int newScore); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); Common::Error loadGameState(int slot); bool hasFeature(EngineFeature f) const; const char *getCopyrightString() const; diff --git a/engines/lure/lure.h b/engines/lure/lure.h index 7a67c8b85544..34bb9f16392a 100644 --- a/engines/lure/lure.h +++ b/engines/lure/lure.h @@ -123,7 +123,7 @@ class LureEngine : public Engine { virtual Common::Error loadGameState(int slot) { return loadGame(slot) ? Common::kReadingFailed : Common::kNoError; } - virtual Common::Error saveGameState(int slot, const char *desc) { + virtual Common::Error saveGameState(int slot, const Common::String &desc) { Common::String s(desc); return saveGame(slot, s) ? Common::kReadingFailed : Common::kNoError; } diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 4f9c3a893ed4..b60f8bd1ee8f 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -1168,7 +1168,7 @@ Common::Error MohawkEngine_Myst::loadGameState(int slot) { return Common::kUnknownError; } -Common::Error MohawkEngine_Myst::saveGameState(int slot, const char *desc) { +Common::Error MohawkEngine_Myst::saveGameState(int slot, const Common::String &desc) { Common::StringArray saveList = _gameState->generateSaveGameList(); if ((uint)slot < saveList.size()) diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index 5edf774ed0c1..ebcc3b445cbe 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -193,7 +193,7 @@ class MohawkEngine_Myst : public MohawkEngine { bool canLoadGameStateCurrently(); bool canSaveGameStateCurrently(); Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool hasFeature(EngineFeature f) const; private: diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index f407e650f616..57a0ac717db1 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -727,7 +727,7 @@ Common::Error MohawkEngine_Riven::loadGameState(int slot) { return _saveLoad->loadGame(_saveLoad->generateSaveGameList()[slot]) ? Common::kNoError : Common::kUnknownError; } -Common::Error MohawkEngine_Riven::saveGameState(int slot, const char *desc) { +Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc) { Common::StringArray saveList = _saveLoad->generateSaveGameList(); if ((uint)slot < saveList.size()) diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index e01e03895ccc..c80f497e3746 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -126,7 +126,7 @@ class MohawkEngine_Riven : public MohawkEngine { bool canLoadGameStateCurrently() { return true; } bool canSaveGameStateCurrently() { return true; } Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool hasFeature(EngineFeature f) const; typedef void (*TimerProc)(MohawkEngine_Riven *vm); diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 3c1826cd69ee..bd0dea45bbf5 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -318,7 +318,7 @@ bool QueenEngine::canLoadOrSave() const { return !_input->cutawayRunning() && !(_resource->isDemo() || _resource->isInterview()); } -Common::Error QueenEngine::saveGameState(int slot, const char *desc) { +Common::Error QueenEngine::saveGameState(int slot, const Common::String &desc) { debug(3, "Saving game to slot %d", slot); char name[20]; Common::Error err = Common::kNoError; @@ -341,7 +341,7 @@ Common::Error QueenEngine::saveGameState(int slot, const char *desc) { file->writeUint32BE(0); file->writeUint32BE(dataSize); char description[32]; - Common::strlcpy(description, desc, sizeof(description)); + Common::strlcpy(description, desc.c_str(), sizeof(description)); file->write(description, sizeof(description)); // write save data diff --git a/engines/queen/queen.h b/engines/queen/queen.h index 5affe8e01a00..bb299e2a801f 100644 --- a/engines/queen/queen.h +++ b/engines/queen/queen.h @@ -112,7 +112,7 @@ class QueenEngine : public Engine { void update(bool checkPlayerInput = false); bool canLoadOrSave() const; - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); Common::Error loadGameState(int slot); void makeGameStateName(int slot, char *buf) const; int getGameStateSlot(const char *filename) const; diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index b23baf4cc3ae..4e544e4e5df7 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -363,8 +363,8 @@ Common::Error SagaEngine::loadGameState(int slot) { return Common::kNoError; // TODO: return success/failure } -Common::Error SagaEngine::saveGameState(int slot, const char *desc) { - save(calcSaveFileName((uint)slot), desc); +Common::Error SagaEngine::saveGameState(int slot, const Common::String &desc) { + save(calcSaveFileName((uint)slot), desc.c_str()); return Common::kNoError; // TODO: return success/failure } diff --git a/engines/saga/saga.h b/engines/saga/saga.h index 6d33979028b0..23258e127744 100644 --- a/engines/saga/saga.h +++ b/engines/saga/saga.h @@ -654,7 +654,7 @@ class SagaEngine : public Engine { const Common::Rect &getDisplayClip() const { return _displayClip;} Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canLoadGameStateCurrently(); bool canSaveGameStateCurrently(); const GameDisplayInfo &getDisplayInfo(); diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 61e6cc9d09ad..100b71efa7d8 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -748,7 +748,7 @@ Common::Error SciEngine::loadGameState(int slot) { } } -Common::Error SciEngine::saveGameState(int slot, const char *desc) { +Common::Error SciEngine::saveGameState(int slot, const Common::String &desc) { Common::String fileName = Common::String::format("%s.%03d", _targetName.c_str(), slot); Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); Common::OutSaveFile *out = saveFileMan->openForSaving(fileName); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 65b5e602ffa0..e43c7097ed68 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -805,7 +805,7 @@ void SegManager::reconstructClones() { #pragma mark - -bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename, const char *version) { +bool gamestate_save(EngineState *s, Common::WriteStream *fh, const Common::String &savename, const Common::String &version) { TimeDate curTime; g_system->getTimeAndDate(curTime); diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index ff5bc5204b42..fbd77eb076b1 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -79,7 +79,7 @@ struct SavegameMetadata { * @param savename The description of the savegame * @return 0 on success, 1 otherwise */ -bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version); +bool gamestate_save(EngineState *s, Common::WriteStream *save, const Common::String &savename, const Common::String &version); /** * Restores a game state from a directory. diff --git a/engines/sci/sci.h b/engines/sci/sci.h index a34044735425..77718e4b3792 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -221,7 +221,7 @@ class SciEngine : public Engine { virtual GUI::Debugger *getDebugger(); Console *getSciDebugger(); Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canLoadGameStateCurrently(); bool canSaveGameStateCurrently(); void syncSoundSettings(); diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp index ff85bd0a619d..07c52578c362 100644 --- a/engines/scumm/input.cpp +++ b/engines/scumm/input.cpp @@ -117,7 +117,7 @@ void ScummEngine::parseEvent(Common::Event event) { if (_saveLoadSlot == 0) _saveLoadSlot = 10; - sprintf(_saveLoadName, "Quicksave %d", _saveLoadSlot); + _saveLoadDescription = Common::String::format("Quicksave %d", _saveLoadSlot); _saveLoadFlag = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2; _saveTemporaryState = false; } else if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_f) { diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index f5d219c7213b..19834cb35dd0 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -103,7 +103,7 @@ bool ScummEngine::canLoadGameStateCurrently() { return (VAR_MAINMENU_KEY == 0xFF || VAR(VAR_MAINMENU_KEY) != 0); } -Common::Error ScummEngine::saveGameState(int slot, const char *desc) { +Common::Error ScummEngine::saveGameState(int slot, const Common::String &desc) { requestSave(slot, desc); return Common::kNoError; } @@ -135,13 +135,11 @@ bool ScummEngine::canSaveGameStateCurrently() { } -void ScummEngine::requestSave(int slot, const char *name) { +void ScummEngine::requestSave(int slot, const Common::String &name) { _saveLoadSlot = slot; _saveTemporaryState = false; _saveLoadFlag = 1; // 1 for save - assert(name); - strncpy(_saveLoadName, name, sizeof(_saveLoadName)); - _saveLoadName[sizeof(_saveLoadName) - 1] = 0; + _saveLoadDescription = name; } void ScummEngine::requestLoad(int slot) { @@ -166,7 +164,7 @@ bool ScummEngine::saveState(Common::OutSaveFile *out, bool writeHeader) { SaveGameHeader hdr; if (writeHeader) { - memcpy(hdr.name, _saveLoadName, sizeof(hdr.name)); + Common::strlcpy(hdr.name, _saveLoadDescription.c_str(), sizeof(hdr.name)); saveSaveGameHeader(out, hdr); } #if !defined(__DS__) && !defined(__N64__) /* && !defined(__PLAYSTATION2__) */ @@ -387,7 +385,8 @@ bool ScummEngine::loadState(int slot, bool compat) { if (hdr.ver == VER(7)) hdr.ver = VER(8); - memcpy(_saveLoadName, hdr.name, sizeof(hdr.name)); + hdr.name[sizeof(hdr.name)-1] = 0; + _saveLoadDescription = hdr.name; // Unless specifically requested with _saveSound, we do not save the iMUSE // state for temporary state saves - such as certain cutscenes in DOTT, @@ -589,9 +588,9 @@ bool ScummEngine::loadState(int slot, bool compat) { } Common::String ScummEngine::makeSavegameName(const Common::String &target, int slot, bool temporary) { - char extension[6]; - snprintf(extension, sizeof(extension), ".%c%02d", temporary ? 'c' : 's', slot); - return (target + extension); + Common::String extension; + extension = Common::String::format(".%c%02d", temporary ? 'c' : 's', slot); + return target + extension; } void ScummEngine::listSavegames(bool *marks, int num) { diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index e8dd6cb548b7..c0c477a59770 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -213,7 +213,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _saveLoadSlot = 0; _lastSaveTime = 0; _saveTemporaryState = false; - memset(_saveLoadName, 0, sizeof(_saveLoadName)); memset(_localScriptOffsets, 0, sizeof(_localScriptOffsets)); _scriptPointer = NULL; _scriptOrgPointer = NULL; @@ -2056,7 +2055,7 @@ void ScummEngine::scummLoop(int delta) { // Trigger autosave if necessary. if (!_saveLoadFlag && shouldPerformAutoSave(_lastSaveTime) && canSaveGameStateCurrently()) { _saveLoadSlot = 0; - sprintf(_saveLoadName, "Autosave %d", _saveLoadSlot); + _saveLoadDescription = Common::String::format("Autosave %d", _saveLoadSlot); _saveLoadFlag = 1; _saveTemporaryState = false; } diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index d1804d323e7b..6e75f47d77ca 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -401,7 +401,7 @@ class ScummEngine : public Engine { virtual Common::Error loadGameState(int slot); virtual bool canLoadGameStateCurrently(); - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); virtual bool canSaveGameStateCurrently(); virtual void pauseEngineIntern(bool pause); @@ -572,7 +572,7 @@ class ScummEngine : public Engine { uint32 _lastSaveTime; bool _saveTemporaryState; Common::String _saveLoadFileName; - char _saveLoadName[32]; + Common::String _saveLoadDescription; bool saveState(Common::OutSaveFile *out, bool writeHeader = true); bool saveState(int slot, bool compat); @@ -594,7 +594,7 @@ class ScummEngine : public Engine { bool getSavegameName(int slot, Common::String &desc); void listSavegames(bool *marks, int num); - void requestSave(int slot, const char *name); + void requestSave(int slot, const Common::String &name); void requestLoad(int slot); // thumbnail + info stuff diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp index 6844d2eacb09..e974f5ae3e93 100644 --- a/engines/sky/detection.cpp +++ b/engines/sky/detection.cpp @@ -282,7 +282,7 @@ Common::Error SkyEngine::loadGameState(int slot) { return (result == GAME_RESTORED) ? Common::kNoError : Common::kUnknownError; } -Common::Error SkyEngine::saveGameState(int slot, const char *desc) { +Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc) { if (slot == 0) return Common::kWritePermissionDenied; // we can't overwrite the auto save diff --git a/engines/sky/sky.h b/engines/sky/sky.h index 0b5f4c5c1cc8..cd8a650d6079 100644 --- a/engines/sky/sky.h +++ b/engines/sky/sky.h @@ -87,7 +87,7 @@ class SkyEngine : public Engine { static bool isCDVersion(); Common::Error loadGameState(int slot); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canLoadGameStateCurrently(); bool canSaveGameStateCurrently(); diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp index b02cadc6db48..48c3a0d14db7 100644 --- a/engines/sword1/detection.cpp +++ b/engines/sword1/detection.cpp @@ -336,8 +336,8 @@ bool SwordEngine::canLoadGameStateCurrently() { return (mouseIsActive() && !_control->isPanelShown()); // Disable GMM loading when game panel is shown } -Common::Error SwordEngine::saveGameState(int slot, const char *desc) { - _control->setSaveDescription(slot, desc); +Common::Error SwordEngine::saveGameState(int slot, const Common::String &desc) { + _control->setSaveDescription(slot, desc.c_str()); _control->saveGameToFile(slot); return Common::kNoError; // TODO: return success/failure } diff --git a/engines/sword1/sword1.h b/engines/sword1/sword1.h index c83cb7646121..2d6db21d1940 100644 --- a/engines/sword1/sword1.h +++ b/engines/sword1/sword1.h @@ -110,7 +110,7 @@ class SwordEngine : public Engine { Common::Error loadGameState(int slot); bool canLoadGameStateCurrently(); - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canSaveGameStateCurrently(); private: diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 99ffd5586ef9..87c7c12ad64f 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -773,8 +773,8 @@ uint32 Sword2Engine::getMillis() { return _system->getMillis(); } -Common::Error Sword2Engine::saveGameState(int slot, const char *desc) { - uint32 saveVal = saveGame(slot, (const byte *)desc); +Common::Error Sword2Engine::saveGameState(int slot, const Common::String &desc) { + uint32 saveVal = saveGame(slot, (const byte *)desc.c_str()); if (saveVal == SR_OK) return Common::kNoError; diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h index ee9ea9f27b3a..ef5c2b215eaa 100644 --- a/engines/sword2/sword2.h +++ b/engines/sword2/sword2.h @@ -164,7 +164,7 @@ class Sword2Engine : public Engine { void setSubtitles(bool b) { _useSubtitles = b; } // GMM Loading/Saving - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); bool canSaveGameStateCurrently(); Common::Error loadGameState(int slot); bool canLoadGameStateCurrently(); diff --git a/engines/sword25/sword25.h b/engines/sword25/sword25.h index 5d11aa69e549..1254ea177b15 100644 --- a/engines/sword25/sword25.h +++ b/engines/sword25/sword25.h @@ -82,7 +82,7 @@ class Sword25Engine : public Engine { // void pauseEngineIntern(bool pause); // TODO: Implement this!!! // void syncSoundSettings(); // TODO: Implement this!!! // Common::Error loadGameState(int slot); // TODO: Implement this? -// Common::Error saveGameState(int slot, const char *desc); // TODO: Implement this? +// Common::Error saveGameState(int slot, const Common::String &desc); // TODO: Implement this? // bool canLoadGameStateCurrently(); // TODO: Implement this? // bool canSaveGameStateCurrently(); // TODO: Implement this? diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index f076dbc0a167..ce8862ffd09e 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -240,7 +240,7 @@ Common::Error TeenAgentEngine::loadGameState(int slot) { return Common::kNoError; } -Common::Error TeenAgentEngine::saveGameState(int slot, const char *desc) { +Common::Error TeenAgentEngine::saveGameState(int slot, const Common::String &desc) { debug(0, "saving to slot %d", slot); Common::ScopedPtr out(_saveFileMan->openForSaving(Common::String::format("teenagent.%02d", slot))); if (!out) @@ -253,7 +253,7 @@ Common::Error TeenAgentEngine::saveGameState(int slot, const char *desc) { res->dseg.set_word(0x64B1, pos.y); assert(res->dseg.size() >= 0x6478 + 0x777a); - strncpy((char *)res->dseg.ptr(0x6478), desc, 0x16); + strncpy((char *)res->dseg.ptr(0x6478), desc.c_str(), 0x16); out->write(res->dseg.ptr(0x6478), 0x777a); if (!Graphics::saveThumbnail(*out)) warning("saveThumbnail failed"); diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h index bc802da8bcbb..a054f72d25ae 100644 --- a/engines/teenagent/teenagent.h +++ b/engines/teenagent/teenagent.h @@ -56,7 +56,7 @@ class TeenAgentEngine : public Engine { virtual Common::Error run(); virtual Common::Error loadGameState(int slot); - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); virtual bool canLoadGameStateCurrently() { return true; } virtual bool canSaveGameStateCurrently() { return !scene_busy; } virtual bool hasFeature(EngineFeature f) const; diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 27b16c5b93ed..0f0e3cd1ef34 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -410,7 +410,7 @@ Common::Error TinselEngine::loadGameState(int slot) { } #if 0 -Common::Error TinselEngine::saveGameState(int slot, const char *desc) { +Common::Error TinselEngine::saveGameState(int slot, const Common::String &desc) { Common::String saveName = _vm->getSavegameFilename((int16)(slot + 1)); char saveDesc[SG_DESC_LEN]; Common::strlcpy(saveDesc, desc, SG_DESC_LEN); diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index d0875f9fdfdf..30b060766e38 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -169,7 +169,7 @@ class TinselEngine : public Engine { virtual bool hasFeature(EngineFeature f) const; Common::Error loadGameState(int slot); #if 0 - Common::Error saveGameState(int slot, const char *desc); + Common::Error saveGameState(int slot, const Common::String &desc); #endif bool canLoadGameStateCurrently(); #if 0 diff --git a/engines/toon/toon.h b/engines/toon/toon.h index 1eaa5022a9f1..02828f26d16a 100644 --- a/engines/toon/toon.h +++ b/engines/toon/toon.h @@ -318,7 +318,7 @@ class ToonEngine : public Engine { return _shouldQuit; } - Common::Error saveGameState(int slot, const char *desc) { + Common::Error saveGameState(int slot, const Common::String &desc) { return (saveGame(slot, desc) ? Common::kWritingFailed : Common::kNoError); } diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp index 334f75a0e897..7732c6deb9fd 100644 --- a/engines/touche/saveload.cpp +++ b/engines/touche/saveload.cpp @@ -319,7 +319,7 @@ void ToucheEngine::loadGameStateData(Common::ReadStream *stream) { debug(0, "Loaded state, current episode %d", _currentEpisodeNum); } -Common::Error ToucheEngine::saveGameState(int num, const char *description) { +Common::Error ToucheEngine::saveGameState(int num, const Common::String &description) { bool saveOk = false; Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num); Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName); @@ -328,7 +328,7 @@ Common::Error ToucheEngine::saveGameState(int num, const char *description) { f->writeUint16LE(0); char headerDescription[kGameStateDescriptionLen]; memset(headerDescription, 0, kGameStateDescriptionLen); - strncpy(headerDescription, description, kGameStateDescriptionLen - 1); + strncpy(headerDescription, description.c_str(), kGameStateDescriptionLen - 1); f->write(headerDescription, kGameStateDescriptionLen); saveGameStateData(f); f->finalize(); diff --git a/engines/touche/touche.h b/engines/touche/touche.h index c8d750475463..7e1aa3ac44bc 100644 --- a/engines/touche/touche.h +++ b/engines/touche/touche.h @@ -513,7 +513,7 @@ class ToucheEngine: public Engine { void saveGameStateData(Common::WriteStream *stream); void loadGameStateData(Common::ReadStream *stream); - virtual Common::Error saveGameState(int num, const char *description); + virtual Common::Error saveGameState(int num, const Common::String &description); virtual Common::Error loadGameState(int num); virtual bool canLoadGameStateCurrently(); virtual bool canSaveGameStateCurrently(); diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 6fae9785c048..50ce0ce4becb 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -124,7 +124,7 @@ Common::Error TSageEngine::loadGameState(int slot) { /** * Save the game to the given slot index, and with the given name */ -Common::Error TSageEngine::saveGameState(int slot, const char *desc) { +Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc) { return _saver->save(slot, desc); } diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index e3d37257cdec..563fdfcc2161 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -83,7 +83,7 @@ class TSageEngine : public Engine { virtual bool canLoadGameStateCurrently(); virtual bool canSaveGameStateCurrently(); virtual Common::Error loadGameState(int slot); - virtual Common::Error saveGameState(int slot, const char *desc); + virtual Common::Error saveGameState(int slot, const Common::String &desc); Common::String generateSaveName(int slot); void initialize(); diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp index 754e8deae980..9a2e97986ac0 100644 --- a/engines/tucker/saveload.cpp +++ b/engines/tucker/saveload.cpp @@ -101,7 +101,7 @@ Common::Error TuckerEngine::loadGameState(int num) { return ret; } -Common::Error TuckerEngine::saveGameState(int num, const char *description) { +Common::Error TuckerEngine::saveGameState(int num, const Common::String &description) { Common::Error ret = Common::kNoError; Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num); Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName); diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h index b011d65cbb80..e67636942706 100644 --- a/engines/tucker/tucker.h +++ b/engines/tucker/tucker.h @@ -565,7 +565,7 @@ class TuckerEngine: public Engine { template void saveOrLoadGameStateData(S &s); virtual Common::Error loadGameState(int num); - virtual Common::Error saveGameState(int num, const char *description); + virtual Common::Error saveGameState(int num, const Common::String &description); virtual bool canLoadGameStateCurrently(); virtual bool canSaveGameStateCurrently(); From 5015d12142ea80aec251e7fd4953019df964c0ff Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 18:02:12 +0100 Subject: [PATCH 351/369] TUCKER: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/tucker/detection.cpp | 3 +- engines/tucker/resource.cpp | 113 ++++++++++++++++------------------- engines/tucker/saveload.cpp | 4 +- engines/tucker/sequences.cpp | 21 ++++--- 4 files changed, 65 insertions(+), 76 deletions(-) diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp index 9b466d682d7f..31d9caef7370 100644 --- a/engines/tucker/detection.cpp +++ b/engines/tucker/detection.cpp @@ -201,8 +201,7 @@ class TuckerMetaEngine : public AdvancedMetaEngine { } for (int slot = 0; slot <= Tucker::kLastSaveSlot; ++slot) { if (slotsTable[slot]) { - char description[64]; - snprintf(description, sizeof(description), "savegm.%02d", slot); + Common::String description = Common::String::format("savegm.%02d", slot); saveList.push_back(SaveStateDescriptor(slot, description)); } } diff --git a/engines/tucker/resource.cpp b/engines/tucker/resource.cpp index 467500b12129..bee09f7391f7 100644 --- a/engines/tucker/resource.cpp +++ b/engines/tucker/resource.cpp @@ -160,39 +160,37 @@ class DataTokenizer { }; uint8 *TuckerEngine::loadFile(const char *fname, uint8 *p) { - char filename[80]; - strcpy(filename, fname); + Common::String filename; + filename = fname; if (_gameLang == Common::DE_DEU) { - if (strcmp(filename, "bgtext.c") == 0) { - strcpy(filename, "bgtextgr.c"); - } else if (strcmp(filename, "charname.c") == 0) { - strcpy(filename, "charnmgr.c"); - } else if (strcmp(filename, "data5.c") == 0) { - strcpy(filename, "data5gr.c"); - } else if (strcmp(filename, "infobar.txt") == 0) { - strcpy(filename, "infobrgr.txt"); - } else if (strcmp(filename, "charsize.dta") == 0) { - strcpy(filename, "charszgr.dta"); - } else if (strncmp(filename, "objtxt", 6) == 0) { - const char num = filename[6]; - snprintf(filename, sizeof(filename), "objtx%cgr.c", num); - } else if (strncmp(filename, "pt", 2) == 0) { - const char num = filename[2]; - snprintf(filename, sizeof(filename), "pt%ctxtgr.c", num); + if (filename == "bgtext.c") { + filename = "bgtextgr.c"; + } else if (filename == "charname.c") { + filename = "charnmgr.c"; + } else if (filename == "data5.c") { + filename = "data5gr.c"; + } else if (filename == "infobar.txt") { + filename = "infobrgr.txt"; + } else if (filename == "charsize.dta") { + filename = "charszgr.dta"; + } else if (filename.hasPrefix("objtxt")) { + filename = Common::String::format("objtx%cgr.c", filename[6]); + } else if (filename.hasPrefix("pt")) { + filename = Common::String::format("pt%ctxtgr.c", filename[2]); } } _fileLoadSize = 0; bool decode = false; if (_gameFlags & kGameFlagEncodedData) { - char *ext = strrchr(filename, '.'); - if (ext && strcmp(ext + 1, "c") == 0) { - strcpy(ext + 1, "enc"); + if (filename.hasSuffix(".c")) { + filename.deleteLastChar(); + filename += "enc"; decode = true; } } Common::File f; if (!f.open(filename)) { - warning("Unable to open '%s'", filename); + warning("Unable to open '%s'", filename.c_str()); return 0; } const int sz = f.size(); @@ -389,23 +387,23 @@ void TuckerEngine::loadBudSpr(int startOffset) { int spriteOffset = 0; for (int i = startOffset; i < endOffset; ++i) { if (framesCount[frame] == i) { - char filename[40]; + Common::String filename; switch (_flagsTable[137]) { case 0: if ((_gameFlags & kGameFlagDemo) != 0) { - snprintf(filename, sizeof(filename), "budl00_%d.pcx", frame + 1); + filename = Common::String::format("budl00_%d.pcx", frame + 1); } else { - snprintf(filename, sizeof(filename), "bud_%d.pcx", frame + 1); + filename = Common::String::format("bud_%d.pcx", frame + 1); } break; case 1: - snprintf(filename, sizeof(filename), "peg_%d.pcx", frame + 1); + filename = Common::String::format("peg_%d.pcx", frame + 1); break; default: - snprintf(filename, sizeof(filename), "mac_%d.pcx", frame + 1); + filename = Common::String::format("mac_%d.pcx", frame + 1); break; } - loadImage(filename, _loadTempBuf, 0); + loadImage(filename.c_str(), _loadTempBuf, 0); ++frame; } int sz = Graphics::encodeRLE(_loadTempBuf + _spriteFramesTable[i].sourceOffset, _spritesGfxBuf + spriteOffset, _spriteFramesTable[i].xSize, _spriteFramesTable[i].ySize); @@ -479,30 +477,30 @@ void TuckerEngine::loadCTable02(int fl) { } void TuckerEngine::loadLoc() { - char filename[40]; + Common::String filename; int i = _locationWidthTable[_locationNum]; _locationHeight = (_locationNum < 73) ? 140 : 200; - snprintf(filename, sizeof(filename), (i == 1) ? "loc%02d.pcx" : "loc%02da.pcx", _locationNum); - copyLocBitmap(filename, 0, false); + filename = Common::String::format((i == 1) ? "loc%02d.pcx" : "loc%02da.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 0, false); Graphics::copyRect(_quadBackgroundGfxBuf, 320, _locationBackgroundGfxBuf, 640, 320, _locationHeight); if (_locationHeight == 200) { return; } - snprintf(filename, sizeof(filename), (i != 2) ? "path%02d.pcx" : "path%02da.pcx", _locationNum); - copyLocBitmap(filename, 0, true); + filename = Common::String::format((i != 2) ? "path%02d.pcx" : "path%02da.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 0, true); if (i > 1) { - snprintf(filename, sizeof(filename), "loc%02db.pcx", _locationNum); - copyLocBitmap(filename, 320, false); + filename = Common::String::format("loc%02db.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 320, false); Graphics::copyRect(_quadBackgroundGfxBuf + 44800, 320, _locationBackgroundGfxBuf + 320, 640, 320, _locationHeight); if (i == 2) { - snprintf(filename, sizeof(filename), "path%02db.pcx", _locationNum); - copyLocBitmap(filename, 320, true); + filename = Common::String::format("path%02db.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 320, true); } } if (i > 2) { - snprintf(filename, sizeof(filename), "loc%02dc.pcx", _locationNum); - copyLocBitmap(filename, 0, false); + filename = Common::String::format("loc%02dc.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 0, false); Graphics::copyRect(_quadBackgroundGfxBuf + 89600, 320, _locationBackgroundGfxBuf, 640, 320, 140); } if (_locationNum == 1) { @@ -510,8 +508,8 @@ void TuckerEngine::loadLoc() { loadImage("rochpath.pcx", _loadLocBufPtr, 0); } if (i > 3) { - snprintf(filename, sizeof(filename), "loc%02dd.pcx", _locationNum); - copyLocBitmap(filename, 0, false); + filename = Common::String::format("loc%02dd.pcx", _locationNum); + copyLocBitmap(filename.c_str(), 0, false); Graphics::copyRect(_quadBackgroundGfxBuf + 134400, 320, _locationBackgroundGfxBuf + 320, 640, 320, 140); } _fullRedraw = true; @@ -540,13 +538,13 @@ void TuckerEngine::loadObj() { } _currentPartNum = _partNum; - char filename[40]; - snprintf(filename, sizeof(filename), "objtxt%d.c", _partNum); + Common::String filename; + filename = Common::String::format("objtxt%d.c", _partNum); free(_objTxtBuf); - _objTxtBuf = loadFile(filename, 0); - snprintf(filename, sizeof(filename), "pt%dtext.c", _partNum); + _objTxtBuf = loadFile(filename.c_str(), 0); + filename = Common::String::format("pt%dtext.c", _partNum); free(_ptTextBuf); - _ptTextBuf = loadFile(filename, 0); + _ptTextBuf = loadFile(filename.c_str(), 0); _characterSpeechDataPtr = _ptTextBuf; loadData(); loadPanObj(); @@ -584,9 +582,8 @@ void TuckerEngine::loadData() { _dataCount = maxCount; int offset = 0; for (int i = 0; i < count; ++i) { - char filename[40]; - snprintf(filename, sizeof(filename), "scrobj%d%d.pcx", _partNum, i); - loadImage(filename, _loadTempBuf, 0); + Common::String filename = Common::String::format("scrobj%d%d.pcx", _partNum, i); + loadImage(filename.c_str(), _loadTempBuf, 0); offset = loadDataHelper(offset, i); } } @@ -603,9 +600,8 @@ int TuckerEngine::loadDataHelper(int offset, int index) { } void TuckerEngine::loadPanObj() { - char filename[40]; - snprintf(filename, sizeof(filename), "panobjs%d.pcx", _partNum); - loadImage(filename, _loadTempBuf, 0); + Common::String filename = Common::String::format("panobjs%d.pcx", _partNum); + loadImage(filename.c_str(), _loadTempBuf, 0); int offset = 0; for (int y = 0; y < 5; ++y) { for (int x = 0; x < 10; ++x) { @@ -812,9 +808,8 @@ void TuckerEngine::loadSprA02_01() { unloadSprA02_01(); const int count = _sprA02LookupTable[_locationNum]; for (int i = 1; i < count + 1; ++i) { - char filename[40]; - snprintf(filename, sizeof(filename), "sprites/a%02d_%02d.spr", _locationNum, i); - _sprA02Table[i] = loadFile(filename, 0); + Common::String filename = Common::String::format("sprites/a%02d_%02d.spr", _locationNum, i); + _sprA02Table[i] = loadFile(filename.c_str(), 0); } _sprA02Table[0] = _sprA02Table[1]; } @@ -831,9 +826,8 @@ void TuckerEngine::loadSprC02_01() { unloadSprC02_01(); const int count = _sprC02LookupTable[_locationNum]; for (int i = 1; i < count + 1; ++i) { - char filename[40]; - snprintf(filename, sizeof(filename), "sprites/c%02d_%02d.spr", _locationNum, i); - _sprC02Table[i] = loadFile(filename, 0); + Common::String filename = Common::String::format("sprites/c%02d_%02d.spr", _locationNum, i); + _sprC02Table[i] = loadFile(filename.c_str(), 0); } _sprC02Table[0] = _sprC02Table[1]; _spritesCount = _sprC02LookupTable2[_locationNum]; @@ -942,8 +936,7 @@ void TuckerEngine::loadSound(Audio::Mixer::SoundType type, int num, int volume, default: return; } - char fileName[64]; - snprintf(fileName, sizeof(fileName), fmt, num); + Common::String fileName = Common::String::format(fmt, num); Common::File *f = new Common::File; if (f->open(fileName)) { stream = Audio::makeWAVStream(f, DisposeAfterUse::YES); diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp index 9a2e97986ac0..5bc51acf84f4 100644 --- a/engines/tucker/saveload.cpp +++ b/engines/tucker/saveload.cpp @@ -36,9 +36,7 @@ Common::String generateGameStateFileName(const char *target, int slot, bool pref if (prefixOnly) { name += ".*"; } else { - char slotStr[16]; - snprintf(slotStr, sizeof(slotStr), ".%d", slot); - name += slotStr; + name += Common::String::format(".%d", slot); } return name; } diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp index 23ae3380cd34..775fd6f1a05d 100644 --- a/engines/tucker/sequences.cpp +++ b/engines/tucker/sequences.cpp @@ -115,31 +115,31 @@ void TuckerEngine::handleCreditsSequence() { _fadePaletteCounter = 0; clearSprites(); ++num; - char filename[40]; + Common::String filename; if (num == 6) { for (int i = 0; i < 16; ++i) { - snprintf(filename, sizeof(filename), "cogs%04d.pcx", i + 1); - loadImage(filename, imgBuf + i * 64000, 2); + filename = Common::String::format("cogs%04d.pcx", i + 1); + loadImage(filename.c_str(), imgBuf + i * 64000, 2); } } else { switch (num) { case 1: - strcpy(filename, "loc75.pcx"); + filename = "loc75.pcx"; break; case 2: - strcpy(filename, "loc76.pcx"); + filename = "loc76.pcx"; break; case 3: - strcpy(filename, "paper-3.pcx"); + filename = "paper-3.pcx"; break; case 4: - strcpy(filename, "loc77.pcx"); + filename = "loc77.pcx"; break; case 5: - strcpy(filename, "loc78.pcx"); + filename = "loc78.pcx"; break; } - loadImage(filename, _quadBackgroundGfxBuf, 2); + loadImage(filename.c_str(), _quadBackgroundGfxBuf, 2); } _spritesCount = _creditsSequenceSpriteCounts[num]; ++_flagsTable[236]; @@ -584,8 +584,7 @@ Audio::RewindableAudioStream *AnimationSequencePlayer::loadSound(int index, Anim if (stream) return stream; - char fileName[64]; - snprintf(fileName, sizeof(fileName), "audio/%s", _audioFileNamesTable[index]); + Common::String fileName = Common::String::format("audio/%s", _audioFileNamesTable[index]); Common::File f; if (f.open(fileName)) { int size = 0, rate = 0; From da1f4e431d09721a4937241ef529ba5b6a26ca33 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 18:31:04 +0100 Subject: [PATCH 352/369] LURE: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/lure/detection.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp index 4d03148e310c..ced0be0cfb9d 100644 --- a/engines/lure/detection.cpp +++ b/engines/lure/detection.cpp @@ -271,11 +271,8 @@ SaveStateList LureMetaEngine::listSaves(const char *target) const { int LureMetaEngine::getMaximumSaveSlot() const { return 999; } void LureMetaEngine::removeSaveState(const char *target, int slot) const { - char extension[6]; - snprintf(extension, sizeof(extension), ".%03d", slot); - Common::String filename = target; - filename += extension; + filename += Common::String::format(".%03d", slot); g_system->getSavefileManager()->removeSavefile(filename); } From 9e86b0bea1cbff921cef1036f67a9a7d259f4b20 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 19:35:28 +0100 Subject: [PATCH 353/369] QUEEN: Replace snprintf() instance with Common::String::format() Safer and less portability issues. --- engines/queen/queen.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index bd0dea45bbf5..a10e74bfd86c 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -168,11 +168,8 @@ SaveStateList QueenMetaEngine::listSaves(const char *target) const { } void QueenMetaEngine::removeSaveState(const char *target, int slot) const { - char extension[6]; - snprintf(extension, sizeof(extension), ".s%02d", slot); - Common::String filename = target; - filename += extension; + filename += Common::String::format(".s%02d", slot); g_system->getSavefileManager()->removeSavefile(filename); } From 305c6b4d8372178fc2dcd6e55a49ef3774766cf6 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 19:46:55 +0100 Subject: [PATCH 354/369] AGI: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/agi/saveload.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp index 7eaf13d889a7..dae3dd42c18d 100644 --- a/engines/agi/saveload.cpp +++ b/engines/agi/saveload.cpp @@ -551,11 +551,8 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) { #define NUM_VISIBLE_SLOTS 12 const char *AgiEngine::getSavegameFilename(int num) { - static Common::String saveLoadSlot; - char extension[5]; - snprintf(extension, sizeof(extension), ".%.3d", num); - - saveLoadSlot = _targetName + extension; + Common::String saveLoadSlot = _targetName; + saveLoadSlot += Common::String::format(".%.3d", num); return saveLoadSlot.c_str(); } @@ -987,14 +984,12 @@ void AgiEngine::releaseImageStack() { void AgiEngine::checkQuickLoad() { if (ConfMan.hasKey("save_slot")) { - char saveNameBuffer[256]; - - snprintf(saveNameBuffer, 256, "%s.%03d", _targetName.c_str(), ConfMan.getInt("save_slot")); + Common::String saveNameBuffer = Common::String::format("%s.%03d", _targetName.c_str(), ConfMan.getInt("save_slot")); _sprites->eraseBoth(); _sound->stopSound(); - if (loadGame(saveNameBuffer, false) == errOK) { // Do not check game id + if (loadGame(saveNameBuffer.c_str(), false) == errOK) { // Do not check game id _game.exitAllLogics = 1; _menu->enableAll(); } From 3a506073c33db6743c63023424d0638088a9fab5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 2 Jun 2011 15:25:03 -0400 Subject: [PATCH 355/369] GROOVIE: Ensure the final character of the resource name is a null Some filenames are exactly 12 bytes long ie. keyboard.vdx --- engines/groovie/resource.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/groovie/resource.cpp b/engines/groovie/resource.cpp index 10cf24a589d3..05b43b7d3cf6 100644 --- a/engines/groovie/resource.cpp +++ b/engines/groovie/resource.cpp @@ -170,8 +170,9 @@ bool ResMan_t7g::getResInfo(uint32 fileRef, ResInfo &resInfo) { } // Read the resource name (just for debugging purposes) - char resname[12]; + char resname[13]; rlFile->read(resname, 12); + resname[12] = 0; debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %12s", resname); resInfo.filename = resname; From 9c2759c1a74eee69b0b161c381adcd34d9709fd4 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 20:54:49 +0100 Subject: [PATCH 356/369] SAGA: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/saga/detection.cpp | 5 +---- engines/saga/objectmap.cpp | 6 +++--- engines/saga/script.cpp | 18 +++++++++--------- engines/saga/sfuncs.cpp | 11 ++++------- engines/saga/sfuncs_ihnm.cpp | 5 ++--- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index 4e544e4e5df7..23bdc736665a 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -223,11 +223,8 @@ SaveStateList SagaMetaEngine::listSaves(const char *target) const { int SagaMetaEngine::getMaximumSaveSlot() const { return MAX_SAVES - 1; } void SagaMetaEngine::removeSaveState(const char *target, int slot) const { - char extension[6]; - snprintf(extension, sizeof(extension), ".s%02d", slot); - Common::String filename = target; - filename += extension; + filename += Common::String::format(".s%02d", slot);; g_system->getSavefileManager()->removeSavefile(filename); } diff --git a/engines/saga/objectmap.cpp b/engines/saga/objectmap.cpp index b9594625e118..b300a247e914 100644 --- a/engines/saga/objectmap.cpp +++ b/engines/saga/objectmap.cpp @@ -191,7 +191,7 @@ void ObjectMap::clear() { #ifdef SAGA_DEBUG void ObjectMap::draw(const Point& testPoint, int color, int color2) { int hitZoneIndex; - char txtBuf[32]; + Common::String txtBuf; Point pickPoint; Point textPoint; Location pickLocation; @@ -210,10 +210,10 @@ void ObjectMap::draw(const Point& testPoint, int color, int color2) { } if (hitZoneIndex != -1) { - snprintf(txtBuf, sizeof(txtBuf), "hitZone %d", hitZoneIndex); + txtBuf = Common::String::format("hitZone %d", hitZoneIndex); textPoint.x = 2; textPoint.y = 2; - _vm->_font->textDraw(kKnownFontSmall, txtBuf, textPoint, kITEColorBrightWhite, kITEColorBlack, kFontOutline); + _vm->_font->textDraw(kKnownFontSmall, txtBuf.c_str(), textPoint, kITEColorBrightWhite, kITEColorBlack, kFontOutline); } } #endif diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp index 9502631f37f9..f4902b6c1169 100644 --- a/engines/saga/script.cpp +++ b/engines/saga/script.cpp @@ -1154,7 +1154,7 @@ void Script::showVerb(int statusColor) { const char *verbName; const char *object1Name; const char *object2Name; - char statusString[STATUS_TEXT_LEN]; + Common::String statusString; if (_leftButtonVerb == getVerbType(kVerbNone)) { _vm->_interface->setStatusText(""); @@ -1174,8 +1174,8 @@ void Script::showVerb(int statusColor) { object1Name = _vm->getObjectName(_currentObject[0]); if (!_secondObjectNeeded) { - snprintf(statusString, STATUS_TEXT_LEN, "%s %s", verbName, object1Name); - _vm->_interface->setStatusText(statusString, statusColor); + statusString = Common::String::format("%s %s", verbName, object1Name); + _vm->_interface->setStatusText(statusString.c_str(), statusColor); return; } @@ -1187,15 +1187,15 @@ void Script::showVerb(int statusColor) { } if (_leftButtonVerb == getVerbType(kVerbGive)) { - snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextGiveTo), object1Name, object2Name); - _vm->_interface->setStatusText(statusString, statusColor); + statusString = Common::String::format(_vm->getTextString(kTextGiveTo), object1Name, object2Name); + _vm->_interface->setStatusText(statusString.c_str(), statusColor); } else { if (_leftButtonVerb == getVerbType(kVerbUse)) { - snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextUseWidth), object1Name, object2Name); - _vm->_interface->setStatusText(statusString, statusColor); + statusString = Common::String::format(_vm->getTextString(kTextUseWidth), object1Name, object2Name); + _vm->_interface->setStatusText(statusString.c_str(), statusColor); } else { - snprintf(statusString, STATUS_TEXT_LEN, "%s %s", verbName, object1Name); - _vm->_interface->setStatusText(statusString, statusColor); + statusString = Common::String::format("%s %s", verbName, object1Name); + _vm->_interface->setStatusText(statusString.c_str(), statusColor); } } } diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp index 70f987a12952..c623349b7a1a 100644 --- a/engines/saga/sfuncs.cpp +++ b/engines/saga/sfuncs.cpp @@ -1553,18 +1553,15 @@ void Script::sfNull(SCRIPTFUNC_PARAMS) { } void Script::sfStub(const char *name, ScriptThread *thread, int nArgs) { - char buf[256], buf1[100]; - - snprintf(buf, 256, "STUB: %s(", name); + debugN(0, "STUB: %s(", name); for (int i = 0; i < nArgs; i++) { - snprintf(buf1, 100, "%d", thread->pop()); - strncat(buf, buf1, sizeof(buf) - strlen(buf) - 1); + debugN(0, "%d", thread->pop()); if (i + 1 < nArgs) - strncat(buf, ", ", sizeof(buf) - strlen(buf) - 1); + debugN(0, ", "); } - debug(0, "%s)", buf); + debug(0, ")"); } } // End of namespace Saga diff --git a/engines/saga/sfuncs_ihnm.cpp b/engines/saga/sfuncs_ihnm.cpp index 1a736778465e..3fbf3b6e67cb 100644 --- a/engines/saga/sfuncs_ihnm.cpp +++ b/engines/saga/sfuncs_ihnm.cpp @@ -389,11 +389,10 @@ void Script::sfSetSpeechBox(SCRIPTFUNC_PARAMS) { void Script::sfDebugShowData(SCRIPTFUNC_PARAMS) { int16 param = thread->pop(); - char buf[50]; - snprintf(buf, 50, "Reached breakpoint %d", param); + Common::String buf = Common::String::format("Reached breakpoint %d", param); - _vm->_interface->setStatusText(buf); + _vm->_interface->setStatusText(buf.c_str()); } void Script::sfWaitFramesEsc(SCRIPTFUNC_PARAMS) { From bd58c9459dc3509dcefbe1ee7462eb5ab3954f6f Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Jun 2011 21:14:58 +0100 Subject: [PATCH 357/369] SKY: Replace snprintf() usage with Common::String::format() Safer and less portability issues. --- engines/sky/detection.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp index e974f5ae3e93..f3cce06ad6f1 100644 --- a/engines/sky/detection.cpp +++ b/engines/sky/detection.cpp @@ -151,9 +151,7 @@ GameList SkyMetaEngine::detectGames(const Common::FSList &fslist) const { while (sv->dinnerTableEntries) { if (dinnerTableEntries == sv->dinnerTableEntries && (sv->dataDiskSize == dataDiskSize || sv->dataDiskSize == -1)) { - char buf[32]; - snprintf(buf, sizeof(buf), "v0.0%d %s", sv->version, sv->extraDesc); - dg.updateDesc(buf); + dg.updateDesc(Common::String::format("v0.0%d %s", sv->version, sv->extraDesc).c_str()); dg.setGUIOptions(sv->guioptions); break; } From 76c1cdb3c26756ff78495683d2acb98e3a07a495 Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 13:45:23 -0400 Subject: [PATCH 358/369] GIT: Ignore XCode workspaces in iphone & macosx dists folders --- .gitignore | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 1219121b3596..ef404048c000 100644 --- a/.gitignore +++ b/.gitignore @@ -72,9 +72,15 @@ lib*.a /dists/codeblocks/*.layout /dists/codeblocks/scummvm* +#Ignore XCode user data and build files +xcuserdata +project.xcworkspace /dists/iphone/build -/dists/iphone/scummvm.xcodeproj/*.mode1v3 -/dists/iphone/scummvm.xcodeproj/*.pbxuser +/dists/iphone/scummvm.xcodeproj +/dists/iphone/create_project +/dists/macosx/build +/dists/macosx/scummvm.xcodeproj +/dists/macosx/create_project /dists/msvc*/[Dd]ebug*/ /dists/msvc*/[Rr]elease*/ @@ -148,7 +154,3 @@ ipch/ #Ignore default Visual Studio build folders [Dd]ebug/ [Rr]elease/ - -#Ignore XCode user data -xcuserdata -project.xcworkspace From 9854f1b48667b082f9ee1c377dcba5b44e92827b Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 14:09:46 -0400 Subject: [PATCH 359/369] CREATE_PROJECT: Implement basic XCode provider This only outputs a skeleton project with no files and targets yet --- devtools/create_project/xcode.cpp | 515 +++++++++++++++++- devtools/create_project/xcode.h | 287 +++++++++- .../create_project.xcodeproj/project.pbxproj | 20 +- 3 files changed, 799 insertions(+), 23 deletions(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index f26c847c83c1..65491d2f877c 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -36,26 +36,535 @@ namespace CreateProjectTool { +#define DEBUG_XCODE_HASH 0 + +#define ADD_DEFINE(defines, name) \ + defines.push_back(name); + +#define ADD_SETTING(config, key, value) \ + config.settings[key] = Setting(value, "", SettingsNoQuote); + +#define ADD_SETTING_ORDER(config, key, value, order) \ + config.settings[key] = Setting(value, "", SettingsNoQuote, 0, order); + +#define ADD_SETTING_ORDER_NOVALUE(config, key, comment, order) \ + config.settings[key] = Setting("", comment, SettingsNoValue, 0, order); + +#define ADD_SETTING_QUOTE(config, key, value) \ + config.settings[key] = Setting(value); + +#define ADD_SETTING_QUOTE_VAR(config, key, value) \ + config.settings[key] = Setting(value, "", SettingsQuoteVariable); + +#define ADD_SETTING_LIST(config, key, values, flags, indent) \ + config.settings[key] = Setting(values, flags, indent); + +#define REMOVE_SETTING(config, key) \ + config.settings.erase(key); + +#define ADD_BUILD_FILE(id, name, comment) { \ + Object *buildFile = new Object(this, id, name, "PBXBuildFile", "PBXBuildFile", comment); \ + buildFile->addProperty("fileRef", getHash(name), name, SettingsNoValue); \ + _buildFile.add(buildFile); \ + _buildFile.flags = SettingsSingleItem; \ +} + +#define ADD_FILE_REFERENCE(name, properties) { \ + Object *fileRef = new Object(this, name, name, "PBXFileReference", "PBXFileReference", name); \ + if (!properties.fileEncoding.empty()) fileRef->addProperty("fileEncoding", properties.fileEncoding, "", SettingsNoValue); \ + if (!properties.lastKnownFileType.empty()) fileRef->addProperty("lastKnownFileType", properties.lastKnownFileType, "", SettingsNoValue); \ + if (!properties.fileName.empty()) fileRef->addProperty("name", properties.fileName, "", SettingsNoValue); \ + if (!properties.filePath.empty()) fileRef->addProperty("path", properties.filePath, "", SettingsNoValue); \ + if (!properties.sourceTree.empty()) fileRef->addProperty("sourceTree", properties.sourceTree, "", SettingsNoValue); \ + _fileReference.add(fileRef); \ + _fileReference.flags = SettingsSingleItem; \ +} + XCodeProvider::XCodeProvider(StringList &global_warnings, std::map &project_warnings, const int version) : ProjectProvider(global_warnings, project_warnings, version) { } void XCodeProvider::createWorkspace(const BuildSetup &setup) { - // TODO + // Create project folder + std::string workspace = setup.outputDir + '/' + "scummvm.xcodeproj"; + +#if defined(_WIN32) || defined(WIN32) + if (!CreateDirectory(workspace.c_str(), NULL)) + if (GetLastError() != ERROR_ALREADY_EXISTS) + error("Could not create folder \"" + setup.outputDir + '/' + "scummvm.xcodeproj\""); +#else + if (mkdir(workspace.c_str(), 0777) == -1) { + if (errno == EEXIST) { + // Try to open as a folder (might be a file / symbolic link) + DIR *dirp = opendir(workspace.c_str()); + if (dirp == NULL) { + error("Could not create folder \"" + setup.outputDir + '/' + "scummvm.xcodeproj\""); + } else { + // The folder exists, just close the stream and return + closedir(dirp); + } + } else { + error("Could not create folder \"" + setup.outputDir + '/' + "scummvm.xcodeproj\""); + } + } +#endif + + // Setup global objects + setupDefines(setup); + _targets.push_back("ScummVM-iPhone"); + _targets.push_back("ScummVM-OS X"); + _targets.push_back("ScummVM-Simulator"); + + setupCopyFilesBuildPhase(); + setupFrameworksBuildPhase(); + setupNativeTarget(); + setupProject(); + setupResourcesBuildPhase(); + setupBuildConfiguration(); } +// We are done with constructing all the object graph and we got through every project, output the main project file +// (this is kind of a hack since other providers use separate project files) void XCodeProvider::createOtherBuildFiles(const BuildSetup &setup) { - // TODO + // This needs to be done at the end when all build files have been accounted for + setupSourcesBuildPhase(); + + ouputMainProjectFile(setup); } +// Store information about a project here, for use at the end void XCodeProvider::createProjectFile(const std::string &, const std::string &, const BuildSetup &setup, const std::string &moduleDir, const StringList &includeList, const StringList &excludeList) { - // TODO + std::string modulePath; + if (!moduleDir.compare(0, setup.srcDir.size(), setup.srcDir)) { + modulePath = moduleDir.substr(setup.srcDir.size()); + if (!modulePath.empty() && modulePath.at(0) == '/') + modulePath.erase(0, 1); + } + + std::ofstream project; + if (modulePath.size()) + addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); + else + addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); +} + +////////////////////////////////////////////////////////////////////////// +// Main Project file +////////////////////////////////////////////////////////////////////////// +void XCodeProvider::ouputMainProjectFile(const BuildSetup &setup) { + std::ofstream project((setup.outputDir + '/' + "scummvm.xcodeproj" + '/' + "project.pbxproj").c_str()); + if (!project) + error("Could not open \"" + setup.outputDir + '/' + "scummvm.xcodeproj" + '/' + "project.pbxproj\" for writing"); + + ////////////////////////////////////////////////////////////////////////// + // Header + project << "// !$*UTF8*$!\n" + "{\n" + "\t" << writeSetting("archiveVersion", "1", "", SettingsNoQuote) << ";\n" + "\tclasses = {\n" + "\t};\n" + "\t" << writeSetting("objectVersion", "46", "", SettingsNoQuote) << ";\n" + "\tobjects = {\n"; + + ////////////////////////////////////////////////////////////////////////// + // List of objects + project << _buildFile.toString(); + project << _copyFilesBuildPhase.toString(); + project << _fileReference.toString(); + project << _frameworksBuildPhase.toString(); + project << _groups.toString(); + project << _nativeTarget.toString(); + project << _project.toString(); + project << _resourcesBuildPhase.toString(); + project << _sourcesBuildPhase.toString(); + project << _buildConfiguration.toString(); + project << _configurationList.toString(); + + ////////////////////////////////////////////////////////////////////////// + // Footer + project << "\t};\n" + "\t" << writeSetting("rootObject", getHash("PBXProject"), "Project object", SettingsNoQuote) << ";\n" + "}\n"; + } +////////////////////////////////////////////////////////////////////////// +// Files +////////////////////////////////////////////////////////////////////////// void XCodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + + // Init root group + _groups.comment = "PBXGroup"; + Object *group = new Object(this, "PBXGroup", "PBXGroup", "PBXGroup", "", ""); + + //Property children; + //children.flags = SettingsAsList; + //group->properties["children"] = children; + group->addProperty("children", "", "", SettingsNoValue|SettingsAsList); + + group->addProperty("sourceTree", "", "", SettingsNoValue|SettingsQuoteVariable); + + _groups.add(group); + + // TODO Add files +} + +////////////////////////////////////////////////////////////////////////// +// Setup functions +////////////////////////////////////////////////////////////////////////// +void XCodeProvider::setupCopyFilesBuildPhase() { // TODO } +/** + * Sets up the frameworks build phase. + * + * (each native target has different build rules) + */ +void XCodeProvider::setupFrameworksBuildPhase() { + // TODO +} + +void XCodeProvider::setupNativeTarget() { + // TODO +} + +void XCodeProvider::setupProject() { + _project.comment = "PBXProject"; + + Object *project = new Object(this, "PBXProject", "PBXProject", "PBXProject", "", "Project object"); + + project->addProperty("buildConfigurationList", getHash("XCConfigurationList_scummvm"), "Build configuration list for PBXProject \"scummvm\"", SettingsNoValue); + project->addProperty("compatibilityVersion", "Xcode 3.2", "", SettingsNoValue|SettingsQuoteVariable); + project->addProperty("developmentRegion", "English", "", SettingsNoValue); + project->addProperty("hasScannedForEncodings", "1", "", SettingsNoValue); + + // List of known regions + Property regions; + regions.flags = SettingsAsList; + ADD_SETTING_ORDER_NOVALUE(regions, "English", "", 0); + ADD_SETTING_ORDER_NOVALUE(regions, "Japanese", "", 1); + ADD_SETTING_ORDER_NOVALUE(regions, "French", "", 2); + ADD_SETTING_ORDER_NOVALUE(regions, "German", "", 3); + project->properties["knownRegions"] = regions; + + project->addProperty("mainGroup", getHash("PBXGroup_CustomTemplate"), "CustomTemplate", SettingsNoValue); + project->addProperty("projectDirPath", "", "", SettingsNoValue|SettingsQuoteVariable); + project->addProperty("projectRoot", "", "", SettingsNoValue|SettingsQuoteVariable); + + // List of targets + //Property targets; + //targets.flags = SettingsAsList; + // TODO + //project->properties["targets"] = targets; + project->addProperty("targets", "", "", SettingsNoValue|SettingsAsList); + + _project.add(project); +} + +void XCodeProvider::setupResourcesBuildPhase() { + // TODO +} + +void XCodeProvider::setupSourcesBuildPhase() { + // TODO +} + +// Setup all build configurations +void XCodeProvider::setupBuildConfiguration() { + + _buildConfiguration.comment = "XCBuildConfiguration"; + _buildConfiguration.flags = SettingsAsList; + + ///**************************************** + // * iPhone + // ****************************************/ + + //// Debug + Object *iPhone_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-iPhone_Debug", _targets[0] /* ScummVM-iPhone */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); + Property iPhone_Debug; + iPhone_Debug.flags = SettingsSingleItem; + // TODO Add settings + + iPhone_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); + iPhone_Debug_Object->properties["buildSettings"] = iPhone_Debug; + + //// Release + Object *iPhone_Release_Object = new Object(this, "XCBuildConfiguration_ScummVM-iPhone_Release", _targets[0] /* ScummVM-iPhone */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); + Property iPhone_Release(iPhone_Debug); + // TODO Add settings + + iPhone_Release_Object->addProperty("name", "Release", "", SettingsNoValue); + iPhone_Release_Object->properties["buildSettings"] = iPhone_Release; + + _buildConfiguration.add(iPhone_Debug_Object); + _buildConfiguration.add(iPhone_Release_Object); + + /**************************************** + * scummvm + ****************************************/ + + // Debug + Object *scummvm_Debug_Object = new Object(this, "XCBuildConfiguration_scummvm_Debug", "scummvm", "XCBuildConfiguration", "PBXProject", "Debug"); + Property scummvm_Debug; + scummvm_Debug.flags = SettingsSingleItem; + // TODO Add settings + + scummvm_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); + scummvm_Debug_Object->properties["buildSettings"] = scummvm_Debug; + + // Release + Object *scummvm_Release_Object = new Object(this, "XCBuildConfiguration_scummvm_Release", "scummvm", "XCBuildConfiguration", "PBXProject", "Release"); + Property scummvm_Release(scummvm_Debug); + // TODO Add settings + + scummvm_Release_Object->addProperty("name", "Release", "", SettingsNoValue); + scummvm_Release_Object->properties["buildSettings"] = scummvm_Release; + + _buildConfiguration.add(scummvm_Debug_Object); + _buildConfiguration.add(scummvm_Release_Object); + + /**************************************** + * ScummVM-OS X + ****************************************/ + + // Debug + Object *scummvmOSX_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-OSX_Debug", _targets[1] /* ScummVM-OS X */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); + Property scummvmOSX_Debug; + scummvmOSX_Debug.flags = SettingsSingleItem; + // TODO Add settings + + scummvmOSX_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); + scummvmOSX_Debug_Object->properties["buildSettings"] = scummvmOSX_Debug; + + // Release + Object *scummvmOSX_Release_Object = new Object(this, "XCBuildConfiguration_ScummVMOSX_Release", _targets[1] /* ScummVM-OS X */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); + Property scummvmOSX_Release(scummvmOSX_Debug); + // TODO Add settings + + scummvmOSX_Release_Object->addProperty("name", "Release", "", SettingsNoValue); + scummvmOSX_Release_Object->properties["buildSettings"] = scummvmOSX_Release; + + _buildConfiguration.add(scummvmOSX_Debug_Object); + _buildConfiguration.add(scummvmOSX_Release_Object); + + /**************************************** + * ScummVM-Simulator + ****************************************/ + + // Debug + Object *scummvmSimulator_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-Simulator_Debug", _targets[2] /* ScummVM-Simulator */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); + Property scummvmSimulator_Debug(iPhone_Debug); + // TODO Add settings + + scummvmSimulator_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); + scummvmSimulator_Debug_Object->properties["buildSettings"] = scummvmSimulator_Debug; + + // Release + Object *scummvmSimulator_Release_Object = new Object(this, "XCBuildConfiguration_ScummVM-Simulator_Release", _targets[2] /* ScummVM-Simulator */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); + Property scummvmSimulator_Release(scummvmSimulator_Debug); + /// TODO Add settings + + scummvmSimulator_Release_Object->addProperty("name", "Release", "", SettingsNoValue); + scummvmSimulator_Release_Object->properties["buildSettings"] = scummvmSimulator_Release; + + _buildConfiguration.add(scummvmSimulator_Debug_Object); + _buildConfiguration.add(scummvmSimulator_Release_Object); + + //////////////////////////////////////////////////////////////////////////// + //// Configuration List + _configurationList.comment = "XCConfigurationList"; + _configurationList.flags = SettingsAsList; + + // Warning: This assumes we have all configurations with a Debug & Release pair + for (std::vector::iterator config = _buildConfiguration.objects.begin(); config != _buildConfiguration.objects.end(); config++) { + + Object *configList = new Object(this, "XCConfigurationList_" + (*config)->name, (*config)->name, "XCConfigurationList", "", "Build configuration list for " + (*config)->refType + " \"" + (*config)->name + "\""); + + Property buildConfigs; + buildConfigs.flags = SettingsAsList; + + buildConfigs.settings[getHash((*config)->id)] = Setting("", "Debug", SettingsNoValue, 0, 0); + buildConfigs.settings[getHash((*(++config))->id)] = Setting("", "Release", SettingsNoValue, 0, 1); + + configList->properties["buildConfigurations"] = buildConfigs; + + configList->addProperty("defaultConfigurationIsVisible", "0", "", SettingsNoValue); + configList->addProperty("defaultConfigurationName", "Release", "", SettingsNoValue); + + _configurationList.add(configList); + } +} + +////////////////////////////////////////////////////////////////////////// +// Misc +////////////////////////////////////////////////////////////////////////// + +// Setup global defines +void XCodeProvider::setupDefines(const BuildSetup &setup) { + + for (StringList::const_iterator i = setup.defines.begin(); i != setup.defines.end(); ++i) { + if (*i == "HAVE_NASM") // Not supported on Mac (TODO: change how it's handled in main class or add it only in MSVC/CodeBlocks providers?) + continue; + + ADD_DEFINE(_defines, *i); + } + // Add special defines for Mac support + ADD_DEFINE(_defines, "CONFIG_H"); + ADD_DEFINE(_defines, "SCUMM_NEED_ALIGNMENT"); + ADD_DEFINE(_defines, "SCUMM_LITTLE_ENDIAN"); + ADD_DEFINE(_defines, "UNIX"); + ADD_DEFINE(_defines, "SCUMMVM"); + ADD_DEFINE(_defines, "USE_TREMOR"); +} + +////////////////////////////////////////////////////////////////////////// +// Object hash +////////////////////////////////////////////////////////////////////////// + +// TODO use md5 to compute a file hash (and fall back to standard key generation if not passed a file) +std::string XCodeProvider::getHash(std::string key) { + +#if DEBUG_XCODE_HASH + return key; +#else + // Check to see if the key is already in the dictionary + std::map::iterator hashIterator = _hashDictionnary.find(key); + if (hashIterator != _hashDictionnary.end()) + return hashIterator->second; + + // Generate a new key from the file hash and insert it into the dictionary + std::string hash = newHash(); + _hashDictionnary[key] = hash; + + return hash; +#endif +} + +bool isSeparator (char s) { return (s == '-'); } + +std::string XCodeProvider::newHash() const { + std::string hash = createUUID(); + + // Remove { and - from UUID and resize to 96-bits uppercase hex string + hash.erase(remove_if(hash.begin(), hash.end(), isSeparator), hash.end()); + + hash.resize(24); + std::transform(hash.begin(), hash.end(), hash.begin(), toupper); + + return hash; +} + +////////////////////////////////////////////////////////////////////////// +// Output +////////////////////////////////////////////////////////////////////////// + +std::string replace(std::string input, const std::string find, std::string replaceStr) { + std::string::size_type pos = 0; + std::string::size_type findLen = find.length(); + std::string::size_type replaceLen = replaceStr.length(); + + if (findLen == 0 ) + return input; + + for (;(pos = input.find(find, pos)) != std::string::npos;) { + input.replace(pos, findLen, replaceStr); + pos += replaceLen; + } + + return input; +} + +std::string XCodeProvider::writeProperty(const std::string &variable, Property &prop, int flags) const { + std::string output; + + output += (flags & SettingsSingleItem ? "" : "\t\t\t") + variable + " = "; + + if (prop.settings.size() > 1 || (prop.flags & SettingsSingleItem)) + output += (prop.flags & SettingsAsList) ? "(\n" : "{\n"; + + OrderedSettingList settings = prop.getOrderedSettingList(); + for (OrderedSettingList::const_iterator setting = settings.begin(); setting != settings.end(); ++setting) { + if (settings.size() > 1 || (prop.flags & SettingsSingleItem)) + output += (flags & SettingsSingleItem ? " " : "\t\t\t\t"); + + output += writeSetting((*setting).first, (*setting).second); + + if ((prop.flags & SettingsAsList) && prop.settings.size() > 1) { + output += (prop.settings.size() > 0) ? ",\n" : "\n"; + } else { + output += ";"; + output += (flags & SettingsSingleItem ? " " : "\n"); + } + } + + if (prop.settings.size() > 1 || (prop.flags & SettingsSingleItem)) + output += (prop.flags & SettingsAsList) ? "\t\t\t);\n" : "\t\t\t};\n"; + + return output; +} + +std::string XCodeProvider::writeSetting(const std::string &variable, std::string value, std::string comment, int flags, int indent) const { + return writeSetting(variable, Setting(value, comment, flags, indent)); +} +// Heavily modified (not in a good way) function, imported from QMake XCode project generator (licensed under the QT license) +std::string XCodeProvider::writeSetting(const std::string &variable, const Setting &setting) const { + std::string output; + const std::string quote = (setting.flags & SettingsNoQuote) ? "" : "\""; + const std::string escape_quote = quote.empty() ? "" : "\\" + quote; + std::string newline = "\n"; + + // Get indent level + for (int i = 0; i < setting.indent; ++i) + newline += "\t"; + + // Setup variable + std::string var = (setting.flags & SettingsQuoteVariable) ? "\"" + variable + "\"" : variable; + + // Output a list + if (setting.flags & SettingsAsList) { + + output += var + ((setting.flags & SettingsNoValue) ? "(" : " = (") + newline; + + for (unsigned int i = 0, count = 0; i < setting.entries.size(); ++i) { + + std::string value = setting.entries.at(i).value; + if(!value.empty()) { + if (count++ > 0) + output += "," + newline; + + output += quote + replace(value, quote, escape_quote) + quote; + + std::string comment = setting.entries.at(i).comment; + if (!comment.empty()) + output += " /* " + comment + " */"; + } + + } + // Add closing ")" on new line + newline.resize(newline.size() - 1); + output += (setting.flags & SettingsNoValue) ? "\t\t\t)" : "," + newline + ")"; + } else { + output += var; + + output += (setting.flags & SettingsNoValue) ? "" : " = " + quote; + + for(unsigned int i = 0; i < setting.entries.size(); ++i) { + std::string value = setting.entries.at(i).value; + if(i) + output += " "; + output += value; + + std::string comment = setting.entries.at(i).comment; + if (!comment.empty()) + output += " /* " + comment + " */"; + } + + output += (setting.flags & SettingsNoValue) ? "" : quote; + } + return output; +} + } // End of CreateProjectTool namespace diff --git a/devtools/create_project/xcode.h b/devtools/create_project/xcode.h index a5810dbe0eb1..f86e7c555c48 100644 --- a/devtools/create_project/xcode.h +++ b/devtools/create_project/xcode.h @@ -20,7 +20,6 @@ * */ - #ifndef TOOLS_CREATE_PROJECT_XCODE_H #define TOOLS_CREATE_PROJECT_XCODE_H @@ -30,25 +29,279 @@ #include namespace CreateProjectTool { - - class XCodeProvider : public ProjectProvider { + +class XCodeProvider : public ProjectProvider { +public: + XCodeProvider(StringList &global_warnings, std::map &project_warnings, const int version = 0); + +protected: + + void createWorkspace(const BuildSetup &setup); + + void createOtherBuildFiles(const BuildSetup &setup); + + void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, + const StringList &includeList, const StringList &excludeList); + + void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, + const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + +private: + enum { + SettingsAsList = 0x01, + SettingsSingleItem = 0x02, + SettingsNoQuote = 0x04, + SettingsQuoteVariable = 0x08, + SettingsNoValue = 0x10 + }; + + // File properties + struct FileProperty { + std::string fileEncoding; + std::string lastKnownFileType; + std::string fileName; + std::string filePath; + std::string sourceTree; + + FileProperty(std::string fileType = "", std::string name = "", std::string path = "", std::string source = "") : + fileEncoding(""), lastKnownFileType(fileType), fileName(name), filePath(path), sourceTree(source) + { + } + }; + + ////////////////////////////////////////////////////////////////////////// + // XCObject and children + typedef std::vector ValueList; + + struct Entry { + std::string value; + std::string comment; + + Entry(std::string val, std::string cmt) : value(val), comment(cmt) {} + }; + + typedef std::vector EntryList; + + struct Setting { + EntryList entries; + int flags; + int indent; + int order; + + explicit Setting(std::string value = "", std::string comment = "", int flgs = 0, int idt = 0, int ord = -1) : flags(flgs), indent(idt), order(ord) { + entries.push_back(Entry(value, comment)); + } + + explicit Setting(ValueList values, int flgs = 0, int idt = 0, int ord = -1) : flags(flgs), indent(idt), order(ord) { + for (unsigned int i = 0; i < values.size(); i++) + entries.push_back(Entry(values[i], "")); + } + + explicit Setting(EntryList ents, int flgs = 0, int idt = 0, int ord = -1) : entries(ents), flags(flgs), indent(idt), order(ord) {} + + void addEntry(std::string value, std::string comment = "") { + entries.push_back(Entry(value, comment)); + } + }; + + typedef std::map SettingList; + typedef std::pair SettingPair; + typedef std::vector OrderedSettingList; + + static bool OrderSortPredicate(const SettingPair& s1, const SettingPair& s2) { + return s1.second.order < s2.second.order; + } + + struct Property { public: - XCodeProvider(StringList &global_warnings, std::map &project_warnings, const int version = 0); - - protected: - - void createWorkspace(const BuildSetup &setup); - - void createOtherBuildFiles(const BuildSetup &setup); - - void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, - const StringList &includeList, const StringList &excludeList); - - void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + SettingList settings; + int flags; + bool hasOrder; + + Property() : flags(0), hasOrder(false) {} + + // Constructs a simple Property + explicit Property(std::string name, std::string value = "", std::string comment = "", int flgs = 0, int indent = 0, bool order = false) : flags(flgs), hasOrder(order) { + Setting setting(value, comment, flags, indent); + + settings[name] = setting; + } + Property(std::string name, ValueList values, int flgs = 0, int indent = 0, bool order = false) : flags(flgs), hasOrder(order) { + Setting setting(values, flags, indent); + + settings[name] = setting; + } + + // Copy constructor + Property(const Property &rhs) { + settings = rhs.settings; + flags = rhs.flags; + } + + OrderedSettingList getOrderedSettingList() { + OrderedSettingList list; + + // Prepare vector to sort + for (SettingList::const_iterator setting = settings.begin(); setting != settings.end(); ++setting) + list.push_back(SettingPair(setting->first, setting->second)); + + // Sort vector using setting order + if (hasOrder) + std::sort(list.begin(), list.end(), OrderSortPredicate); + + return list; + } }; - + + typedef std::map PropertyList; + + // Main object struct + // This is all a big hack unfortunately, but making everything all properly abstracted would + // be overkill since we only have to generate a single project + struct Object { + public: + std::string id; // Unique identifier for this object + std::string name; // Name (may not be unique - for ex. configuration entries) + std::string refType; // Type of object this references (if any) + std::string comment; // Main comment (empty for no comment) + + PropertyList properties; // List of object properties, including output configuration + + // Constructs an object and add a default type property + Object(XCodeProvider *objectParent, std::string objectId, std::string objectName, std::string objectType, std::string objectRefType = "", std::string objectComment = "") + : id(objectId), name(objectName), refType(objectRefType), comment(objectComment), parent(objectParent) { + assert(objectParent); + assert(!objectId.empty()); + assert(!objectName.empty()); + assert(!objectType.empty()); + + addProperty("isa", objectType, "", SettingsNoQuote|SettingsNoValue); + } + + // Add a simple Property with just a name and a value + void addProperty(std::string propName, std::string propValue, std::string propComment = "", int propFlags = 0, int propIndent = 0) { + properties[propName] = Property(propValue, "", propComment, propFlags, propIndent); + } + + std::string toString(int flags = 0) { + std::string output; + output = "\t\t" + parent->getHash(id) + (comment.empty() ? "" : " /* " + comment + " */") + " = {"; + + if (flags & SettingsAsList) + output += "\n"; + + // Special case: always output the isa property first + output += parent->writeProperty("isa", properties["isa"], flags); + + // Write each property + for (PropertyList::iterator property = properties.begin(); property != properties.end(); ++property) { + if ((*property).first == "isa") + continue; + + output += parent->writeProperty((*property).first, (*property).second, flags); + } + + if (flags & SettingsAsList) + output += "\t\t"; + + output += "};\n"; + + return output; + } + + private: + XCodeProvider *parent; + + // Returns the type property (should always be the first in the properties map) + std::string getType() { + assert(!properties.empty()); + assert(!properties["isa"].settings.empty()); + + SettingList::iterator it = properties["isa"].settings.begin(); + + return (*it).first; + } + }; + + struct ObjectList { + private: + std::map objectMap; + + public: + std::vector objects; + std::string comment; + int flags; + + void add(Object *obj) { + std::map::iterator it = objectMap.find(obj->id); + if (it != objectMap.end() && it->second == true) + return; + + objects.push_back(obj); + objectMap[obj->id] = true; + } + + std::string toString() { + std::string output; + + if (!comment.empty()) + output = "\n/* Begin " + comment + " section */\n"; + + for (std::vector::iterator object = objects.begin(); object != objects.end(); ++object) + output += (*object)->toString(flags); + + if (!comment.empty()) + output += "/* End " + comment + " section */\n"; + + return output; + } + }; + + // All objects + std::map _hashDictionnary; + ValueList _defines; + + // Targets + ValueList _targets; + + // Lists of objects + ObjectList _buildFile; + ObjectList _copyFilesBuildPhase; + ObjectList _fileReference; + ObjectList _frameworksBuildPhase; + ObjectList _groups; + ObjectList _nativeTarget; + ObjectList _project; + ObjectList _resourcesBuildPhase; + ObjectList _sourcesBuildPhase; + ObjectList _buildConfiguration; + ObjectList _configurationList; + + void ouputMainProjectFile(const BuildSetup &setup); + + // Setup objects + void setupCopyFilesBuildPhase(); + void setupFrameworksBuildPhase(); + void setupNativeTarget(); + void setupProject(); + void setupResourcesBuildPhase(); + void setupSourcesBuildPhase(); + void setupBuildConfiguration(); + + // Misc + void setupDefines(const BuildSetup &setup); // Setup the list of defines to be used on build configurations + + // Hash generation + std::string getHash(std::string key); + std::string newHash() const; + + // Output + std::string writeProperty(const std::string &variable, Property &property, int flags = 0) const; + std::string writeSetting(const std::string &variable, std::string name, std::string comment = "", int flags = 0, int indent = 0) const; + std::string writeSetting(const std::string &variable, const Setting &setting) const; +}; + } // End of CreateProjectTool namespace #endif // TOOLS_CREATE_PROJECT_XCODE_H diff --git a/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj index 3a3f6b1d4ddd..f13bcf696950 100644 --- a/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj +++ b/devtools/create_project/xcode/create_project.xcodeproj/project.pbxproj @@ -13,17 +13,30 @@ F9A66C6C1396D4DF00CEE494 /* msvc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C671396D4DF00CEE494 /* msvc.cpp */; }; F9A66C6F1396D4E800CEE494 /* visualstudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C6D1396D4E800CEE494 /* visualstudio.cpp */; }; F9A66C871396E2F500CEE494 /* xcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9A66C861396E2F500CEE494 /* xcode.cpp */; }; + F9A66C91139704A400CEE494 /* create_project in CopyFiles */ = {isa = PBXBuildFile; fileRef = F9A66C271396D36100CEE494 /* create_project */; }; + F9BA99141398064E00C276C2 /* create_project in CopyFiles */ = {isa = PBXBuildFile; fileRef = F9A66C271396D36100CEE494 /* create_project */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ F9A66C251396D36100CEE494 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ../../../../../dists/iphone; + dstSubfolderSpec = 16; + files = ( + F9A66C91139704A400CEE494 /* create_project in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9BA99131398063A00C276C2 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; + dstPath = ../../../../../dists/macosx; + dstSubfolderSpec = 16; files = ( + F9BA99141398064E00C276C2 /* create_project in CopyFiles */, ); - runOnlyForDeploymentPostprocessing = 1; + runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ @@ -111,6 +124,7 @@ F9A66C231396D36100CEE494 /* Sources */, F9A66C241396D36100CEE494 /* Frameworks */, F9A66C251396D36100CEE494 /* CopyFiles */, + F9BA99131398063A00C276C2 /* CopyFiles */, ); buildRules = ( ); From c0ef09f5466402183d71948ad4621d6554ff5a94 Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 15:53:21 -0400 Subject: [PATCH 360/369] CREATE_PROJECT: Add NativeTarget output to XCode provider --- devtools/create_project/xcode.cpp | 41 +++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 65491d2f877c..9e80e3e7f248 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -215,7 +215,7 @@ void XCodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &p // Setup functions ////////////////////////////////////////////////////////////////////////// void XCodeProvider::setupCopyFilesBuildPhase() { - // TODO + // Nothing to do here } /** @@ -228,7 +228,33 @@ void XCodeProvider::setupFrameworksBuildPhase() { } void XCodeProvider::setupNativeTarget() { - // TODO + _nativeTarget.comment = "PBXNativeTarget"; + + // Output native target section + for (unsigned int i = 0; i < _targets.size(); i++) { + Object *target = new Object(this, "PBXNativeTarget_" + _targets[i], "PBXNativeTarget", "PBXNativeTarget", "", _targets[i]); + + target->addProperty("buildConfigurationList", getHash("XCConfigurationList_" + _targets[i]), "Build configuration list for PBXNativeTarget \"" + _targets[i] + "\"", SettingsNoValue); + + Property buildPhases; + buildPhases.hasOrder = true; + buildPhases.flags = SettingsAsList; + buildPhases.settings[getHash("PBXResourcesBuildPhase_" + _targets[i])] = Setting("", "Resources", SettingsNoValue, 0, 0); + buildPhases.settings[getHash("PBXSourcesBuildPhase_" + _targets[i])] = Setting("", "Sources", SettingsNoValue, 0, 1); + buildPhases.settings[getHash("PBXFrameworksBuildPhase_" + _targets[i])] = Setting("", "Frameworks", SettingsNoValue, 0, 2); + target->properties["buildPhases"] = buildPhases; + + target->addProperty("buildRules", "", "", SettingsNoValue|SettingsAsList); + + target->addProperty("dependencies", "", "", SettingsNoValue|SettingsAsList); + + target->addProperty("name", _targets[i], "", SettingsNoValue|SettingsQuoteVariable); + target->addProperty("productName", "scummvm", "", SettingsNoValue); + target->addProperty("productReference", getHash("PBXFileReference_ScummVM.app_" + _targets[i]), "ScummVM.app", SettingsNoValue); + target->addProperty("productType", "com.apple.product-type.application", "", SettingsNoValue|SettingsQuoteVariable); + + _nativeTarget.add(target); + } } void XCodeProvider::setupProject() { @@ -255,11 +281,12 @@ void XCodeProvider::setupProject() { project->addProperty("projectRoot", "", "", SettingsNoValue|SettingsQuoteVariable); // List of targets - //Property targets; - //targets.flags = SettingsAsList; - // TODO - //project->properties["targets"] = targets; - project->addProperty("targets", "", "", SettingsNoValue|SettingsAsList); + Property targets; + targets.flags = SettingsAsList; + targets.settings[getHash("PBXNativeTarget_" + _targets[0])] = Setting("", _targets[0], SettingsNoValue, 0, 0); + targets.settings[getHash("PBXNativeTarget_" + _targets[1])] = Setting("", _targets[1], SettingsNoValue, 0, 1); + targets.settings[getHash("PBXNativeTarget_" + _targets[2])] = Setting("", _targets[2], SettingsNoValue, 0, 2); + project->properties["targets"] = targets; _project.add(project); } From d4d857738ad9cd9e965be136e5c2b983ec23a761 Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 16:51:51 -0400 Subject: [PATCH 361/369] CREATE_PROJECT: Add FrameworkBuildPhase output to XCode provider --- devtools/create_project/xcode.cpp | 141 +++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 1 deletion(-) mode change 100644 => 100755 devtools/create_project/xcode.cpp diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp old mode 100644 new mode 100755 index 9e80e3e7f248..7ecdf3df1682 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -224,7 +224,146 @@ void XCodeProvider::setupCopyFilesBuildPhase() { * (each native target has different build rules) */ void XCodeProvider::setupFrameworksBuildPhase() { - // TODO + _frameworksBuildPhase.comment = "PBXFrameworksBuildPhase"; + + // Setup framework file properties + std::map properties; + + // Frameworks + properties["ApplicationServices.framework"] = FileProperty("wrapper.framework", "ApplicationServices.framework", "System/Library/Frameworks/ApplicationServices.framework", "SDKROOT"); + properties["AudioToolbox.framework"] = FileProperty("wrapper.framework", "AudioToolbox.framework", "System/Library/Frameworks/AudioToolbox.framework", "SDKROOT"); + properties["AudioUnit.framework"] = FileProperty("wrapper.framework", "AudioUnit.framework", "System/Library/Frameworks/AudioUnit.framework", "SDKROOT"); + properties["Carbon.framework"] = FileProperty("wrapper.framework", "Carbon.framework", "System/Library/Frameworks/Carbon.framework", "SDKROOT"); + properties["Cocoa.framework"] = FileProperty("wrapper.framework", "Cocoa.framework", "System/Library/Frameworks/Cocoa.framework", "SDKROOT"); + properties["CoreAudio.framework"] = FileProperty("wrapper.framework", "CoreAudio.framework", "System/Library/Frameworks/CoreAudio.framework", "SDKROOT"); + properties["CoreFoundation.framework"] = FileProperty("wrapper.framework", "CoreFoundation.framework", "System/Library/Frameworks/CoreFoundation.framework", "SDKROOT"); + properties["CoreMIDI.framework"] = FileProperty("wrapper.framework", "CoreMIDI.framework", "System/Library/Frameworks/CoreMIDI.framework", "SDKROOT"); + properties["Foundation.framework"] = FileProperty("wrapper.framework", "Foundation.framework", "System/Library/Frameworks/Foundation.framework", "SDKROOT"); + properties["IOKit.framework"] = FileProperty("wrapper.framework", "IOKit.framework", "System/Library/Frameworks/IOKit.framework", "SDKROOT"); + properties["OpenGLES.framework"] = FileProperty("wrapper.framework", "OpenGLES.framework", "System/Library/Frameworks/OpenGLES.framework", "SDKROOT"); + properties["QuartzCore.framework"] = FileProperty("wrapper.framework", "QuartzCore.framework", "System/Library/Frameworks/QuartzCore.framework", "SDKROOT"); + properties["QuickTime.framework"] = FileProperty("wrapper.framework", "QuickTime.framework", "System/Library/Frameworks/QuickTime.framework", "SDKROOT"); + properties["UIKit.framework"] = FileProperty("wrapper.framework", "UIKit.framework", "System/Library/Frameworks/UIKit.framework", "SDKROOT"); + + // Local libraries + properties["libFLAC.a"] = FileProperty("archive.ar", "libFLAC.a", "lib/libFLAC.a", "\"\""); + properties["libmad.a"] = FileProperty("archive.ar", "libmad.a", "lib/libmad.a", "\"\""); + //properties["libmpeg2.a"] = FileProperty("archive.ar", "libmpeg2.a", "lib/libmpeg2.a", "\"\""); + properties["libvorbisidec.a"] = FileProperty("archive.ar", "libvorbisidec.a", "lib/libvorbisidec.a", "\"\""); + + ////////////////////////////////////////////////////////////////////////// + // iPhone + Object *framework_iPhone = new Object(this, "PBXFrameworksBuildPhase_" + _targets[0], "PBXFrameworksBuildPhase", "PBXFrameworksBuildPhase", "", "Frameworks"); + + framework_iPhone->addProperty("buildActionMask", "2147483647", "", SettingsNoValue); + framework_iPhone->addProperty("runOnlyForDeploymentPostprocessing", "0", "", SettingsNoValue); + + // List of frameworks + Property iPhone_files; + iPhone_files.hasOrder = true; + iPhone_files.flags = SettingsAsList; + + ValueList frameworks_iPhone; + frameworks_iPhone.push_back("CoreAudio.framework"); + frameworks_iPhone.push_back("CoreFoundation.framework"); + frameworks_iPhone.push_back("Foundation.framework"); + frameworks_iPhone.push_back("UIKit.framework"); + frameworks_iPhone.push_back("AudioToolbox.framework"); + frameworks_iPhone.push_back("QuartzCore.framework"); + frameworks_iPhone.push_back("libmad.a"); + //frameworks_iPhone.push_back("libmpeg2.a"); + frameworks_iPhone.push_back("libFLAC.a"); + frameworks_iPhone.push_back("libvorbisidec.a"); + frameworks_iPhone.push_back("OpenGLES.framework"); + + int order = 0; + for (ValueList::iterator framework = frameworks_iPhone.begin(); framework != frameworks_iPhone.end(); framework++) { + std::string id = "Frameworks_" + *framework + "_iphone"; + std::string comment = *framework + " in Frameworks"; + + ADD_SETTING_ORDER_NOVALUE(iPhone_files, getHash(id), comment, order++); + ADD_BUILD_FILE(id, *framework, comment); + ADD_FILE_REFERENCE(*framework, properties[*framework]); + } + + framework_iPhone->properties["files"] = iPhone_files; + + _frameworksBuildPhase.add(framework_iPhone); + + ////////////////////////////////////////////////////////////////////////// + // ScummVM-OS X + Object *framework_OSX = new Object(this, "PBXFrameworksBuildPhase_" + _targets[1], "PBXFrameworksBuildPhase", "PBXFrameworksBuildPhase", "", "Frameworks"); + + framework_OSX->addProperty("buildActionMask", "2147483647", "", SettingsNoValue); + framework_OSX->addProperty("runOnlyForDeploymentPostprocessing", "0", "", SettingsNoValue); + + // List of frameworks + Property osx_files; + osx_files.hasOrder = true; + osx_files.flags = SettingsAsList; + + ValueList frameworks_osx; + frameworks_osx.push_back("CoreFoundation.framework"); + frameworks_osx.push_back("Foundation.framework"); + frameworks_osx.push_back("AudioToolbox.framework"); + frameworks_osx.push_back("QuickTime.framework"); + frameworks_osx.push_back("CoreMIDI.framework"); + frameworks_osx.push_back("CoreAudio.framework"); + frameworks_osx.push_back("QuartzCore.framework"); + frameworks_osx.push_back("Carbon.framework"); + frameworks_osx.push_back("ApplicationServices.framework"); + frameworks_osx.push_back("IOKit.framework"); + frameworks_osx.push_back("Cocoa.framework"); + frameworks_osx.push_back("AudioUnit.framework"); + + order = 0; + for (ValueList::iterator framework = frameworks_osx.begin(); framework != frameworks_osx.end(); framework++) { + std::string id = "Frameworks_" + *framework + "_osx"; + std::string comment = *framework + " in Frameworks"; + + ADD_SETTING_ORDER_NOVALUE(osx_files, getHash(id), comment, order++); + ADD_BUILD_FILE(id, *framework, comment); + ADD_FILE_REFERENCE(*framework, properties[*framework]); + } + + framework_OSX->properties["files"] = osx_files; + + _frameworksBuildPhase.add(framework_OSX); + + ////////////////////////////////////////////////////////////////////////// + // Simulator + Object *framework_simulator = new Object(this, "PBXFrameworksBuildPhase_" + _targets[2], "PBXFrameworksBuildPhase", "PBXFrameworksBuildPhase", "", "Frameworks"); + + framework_simulator->addProperty("buildActionMask", "2147483647", "", SettingsNoValue); + framework_simulator->addProperty("runOnlyForDeploymentPostprocessing", "0", "", SettingsNoValue); + + // List of frameworks + Property simulator_files; + simulator_files.hasOrder = true; + simulator_files.flags = SettingsAsList; + + ValueList frameworks_simulator; + frameworks_simulator.push_back("CoreAudio.framework"); + frameworks_simulator.push_back("CoreFoundation.framework"); + frameworks_simulator.push_back("Foundation.framework"); + frameworks_simulator.push_back("UIKit.framework"); + frameworks_simulator.push_back("AudioToolbox.framework"); + frameworks_simulator.push_back("QuartzCore.framework"); + frameworks_simulator.push_back("OpenGLES.framework"); + + order = 0; + for (ValueList::iterator framework = frameworks_simulator.begin(); framework != frameworks_simulator.end(); framework++) { + std::string id = "Frameworks_" + *framework + "_simulator"; + std::string comment = *framework + " in Frameworks"; + + ADD_SETTING_ORDER_NOVALUE(simulator_files, getHash(id), comment, order++); + ADD_BUILD_FILE(id, *framework, comment); + ADD_FILE_REFERENCE(*framework, properties[*framework]); + } + + framework_simulator->properties["files"] = simulator_files; + + _frameworksBuildPhase.add(framework_simulator); } void XCodeProvider::setupNativeTarget() { From aba5a5a6eea3c04caf82552fa7a34ef36532fae2 Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 17:17:52 -0400 Subject: [PATCH 362/369] CREATE_PROJECT: Add ResourcesBuildPhase output to Xcode provider --- devtools/create_project/xcode.cpp | 81 ++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 7ecdf3df1682..8ffb079d51e6 100755 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -195,6 +195,10 @@ void XCodeProvider::ouputMainProjectFile(const BuildSetup &setup) { void XCodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + // Add comments for shared lists + _buildFile.comment = "PBXBuildFile"; + _fileReference.comment = "PBXFileReference"; + // Init root group _groups.comment = "PBXGroup"; Object *group = new Object(this, "PBXGroup", "PBXGroup", "PBXGroup", "", ""); @@ -431,7 +435,82 @@ void XCodeProvider::setupProject() { } void XCodeProvider::setupResourcesBuildPhase() { - // TODO + _resourcesBuildPhase.comment = "PBXResourcesBuildPhase"; + + // Setup resource file properties + std::map properties; + properties["scummclassic.zip"] = FileProperty("archive.zip", "", "scummclassic.zip", "\"\""); + properties["scummmodern.zip"] = FileProperty("archive.zip", "", "scummmodern.zip", "\"\""); + + properties["kyra.dat"] = FileProperty("file", "", "kyra.dat", "\"\""); + properties["lure.dat"] = FileProperty("file", "", "lure.dat", "\"\""); + properties["queen.tbl"] = FileProperty("file", "", "queen.tbl", "\"\""); + properties["sky.cpt"] = FileProperty("file", "", "sky.cpt", "\"\""); + properties["drascula.dat"] = FileProperty("file", "", "drascula.dat", "\"\""); + properties["hugo.dat"] = FileProperty("file", "", "hugo.dat", "\"\""); + properties["m4.dat"] = FileProperty("file", "", "m4.dat", "\"\""); + properties["teenagent.dat"] = FileProperty("file", "", "teenagent.dat", "\"\""); + properties["toon.dat"] = FileProperty("file", "", "toon.dat", "\"\""); + + properties["Default.png"] = FileProperty("image.png", "", "Default.png", "\"\""); + properties["icon.png"] = FileProperty("image.png", "", "icon.png", "\"\""); + properties["icon-72.png"] = FileProperty("image.png", "", "icon-72.png", "\"\""); + properties["icon4.png"] = FileProperty("image.png", "", "icon4.png", "\"\""); + + // Same as for containers: a rule for each native target + for (unsigned int i = 0; i < _targets.size(); i++) { + Object *resource = new Object(this, "PBXResourcesBuildPhase_" + _targets[i], "PBXResourcesBuildPhase", "PBXResourcesBuildPhase", "", "Resources"); + + resource->addProperty("buildActionMask", "2147483647", "", SettingsNoValue); + + // Add default files + Property files; + files.hasOrder = true; + files.flags = SettingsAsList; + + ValueList files_list; + files_list.push_back("scummclassic.zip"); + files_list.push_back("scummmodern.zip"); + files_list.push_back("kyra.dat"); + files_list.push_back("lure.dat"); + files_list.push_back("queen.tbl"); + files_list.push_back("sky.cpt"); + files_list.push_back("Default.png"); + files_list.push_back("icon.png"); + files_list.push_back("icon-72.png"); + files_list.push_back("icon4.png"); + files_list.push_back("drascula.dat"); + files_list.push_back("hugo.dat"); + files_list.push_back("m4.dat"); + files_list.push_back("teenagent.dat"); + files_list.push_back("toon.dat"); + + int order = 0; + for (ValueList::iterator file = files_list.begin(); file != files_list.end(); file++) { + std::string id = "PBXResources_" + *file; + std::string comment = *file + " in Resources"; + + ADD_SETTING_ORDER_NOVALUE(files, getHash(id), comment, order++); + // TODO Fix crash when adding build file for data + //ADD_BUILD_FILE(id, *file, comment); + ADD_FILE_REFERENCE(*file, properties[*file]); + } + + // Add custom files depending on the target + if (_targets[i] == "ScummVM-OS X") { + files.settings[getHash("PBXResources_scummvm.icns")] = Setting("", "scummvm.icns in Resources", SettingsNoValue, 0, 6); + + // Remove 2 iphone icon files + files.settings.erase(getHash("PBXResources_Default.png")); + files.settings.erase(getHash("PBXResources_icon.png")); + } + + resource->properties["files"] = files; + + resource->addProperty("runOnlyForDeploymentPostprocessing", "0", "", SettingsNoValue); + + _resourcesBuildPhase.add(resource); + } } void XCodeProvider::setupSourcesBuildPhase() { From 3db8abca689127989c95e3285bed26716ceb845a Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 2 Jun 2011 17:27:17 -0400 Subject: [PATCH 363/369] CREATE_PROJECT: Add complete build configuration output to XCode provider --- devtools/create_project/xcode.cpp | 148 +++++++++++++++++++++++++++--- 1 file changed, 133 insertions(+), 15 deletions(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 8ffb079d51e6..77ac88f85d9b 100755 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -527,19 +527,55 @@ void XCodeProvider::setupBuildConfiguration() { // * iPhone // ****************************************/ - //// Debug + // Debug Object *iPhone_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-iPhone_Debug", _targets[0] /* ScummVM-iPhone */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); Property iPhone_Debug; - iPhone_Debug.flags = SettingsSingleItem; - // TODO Add settings + ADD_SETTING_QUOTE(iPhone_Debug, "ARCHS", "$(ARCHS_UNIVERSAL_IPHONE_OS)"); + ADD_SETTING_QUOTE(iPhone_Debug, "CODE_SIGN_IDENTITY", "iPhone Developer"); + ADD_SETTING_QUOTE_VAR(iPhone_Debug, "CODE_SIGN_IDENTITY[sdk=iphoneos*]", "iPhone Developer"); + ADD_SETTING(iPhone_Debug, "COMPRESS_PNG_FILES", "NO"); + ADD_SETTING(iPhone_Debug, "COPY_PHASE_STRIP", "NO"); + ADD_SETTING_QUOTE(iPhone_Debug, "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym"); + ValueList iPhone_FrameworkSearchPaths; + iPhone_FrameworkSearchPaths.push_back("$(inherited)"); + iPhone_FrameworkSearchPaths.push_back("\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\""); + ADD_SETTING_LIST(iPhone_Debug, "FRAMEWORK_SEARCH_PATHS", iPhone_FrameworkSearchPaths, SettingsAsList, 5); + ADD_SETTING(iPhone_Debug, "GCC_DYNAMIC_NO_PIC", "NO"); + ADD_SETTING(iPhone_Debug, "GCC_ENABLE_CPP_EXCEPTIONS", "NO"); + ADD_SETTING(iPhone_Debug, "GCC_ENABLE_FIX_AND_CONTINUE", "NO"); + ADD_SETTING(iPhone_Debug, "GCC_OPTIMIZATION_LEVEL", "0"); + ADD_SETTING(iPhone_Debug, "GCC_PRECOMPILE_PREFIX_HEADER", "NO"); + ADD_SETTING_QUOTE(iPhone_Debug, "GCC_PREFIX_HEADER", ""); + ADD_SETTING(iPhone_Debug, "GCC_THUMB_SUPPORT", "NO"); + ADD_SETTING(iPhone_Debug, "GCC_UNROLL_LOOPS", "YES"); + ValueList iPhone_HeaderSearchPaths; + iPhone_HeaderSearchPaths.push_back("../../engines/"); + iPhone_HeaderSearchPaths.push_back("../../"); + iPhone_HeaderSearchPaths.push_back("include/"); + ADD_SETTING_LIST(iPhone_Debug, "HEADER_SEARCH_PATHS", iPhone_HeaderSearchPaths, SettingsAsList|SettingsNoQuote, 5); + ADD_SETTING(iPhone_Debug, "INFOPLIST_FILE", "Info.plist"); + ValueList iPhone_LibPaths; + iPhone_LibPaths.push_back("$(inherited)"); + iPhone_LibPaths.push_back("\"$(SRCROOT)/lib\""); + ADD_SETTING_LIST(iPhone_Debug, "LIBRARY_SEARCH_PATHS", iPhone_LibPaths, SettingsAsList, 5); + ADD_SETTING(iPhone_Debug, "ONLY_ACTIVE_ARCH", "YES"); + ADD_SETTING(iPhone_Debug, "PREBINDING", "NO"); + ADD_SETTING(iPhone_Debug, "PRODUCT_NAME", "ScummVM"); + ADD_SETTING_QUOTE(iPhone_Debug, "PROVISIONING_PROFILE", "EF590570-5FAC-4346-9071-D609DE2B28D8"); + ADD_SETTING_QUOTE_VAR(iPhone_Debug, "PROVISIONING_PROFILE[sdk=iphoneos*]", ""); + ADD_SETTING(iPhone_Debug, "SDKROOT", "iphoneos4.0"); + ADD_SETTING_QUOTE(iPhone_Debug, "TARGETED_DEVICE_FAMILY", "1,2"); iPhone_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); iPhone_Debug_Object->properties["buildSettings"] = iPhone_Debug; - //// Release + // Release Object *iPhone_Release_Object = new Object(this, "XCBuildConfiguration_ScummVM-iPhone_Release", _targets[0] /* ScummVM-iPhone */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); Property iPhone_Release(iPhone_Debug); - // TODO Add settings + ADD_SETTING(iPhone_Release, "GCC_OPTIMIZATION_LEVEL", "3"); + ADD_SETTING(iPhone_Release, "COPY_PHASE_STRIP", "YES"); + REMOVE_SETTING(iPhone_Release, "GCC_DYNAMIC_NO_PIC"); + ADD_SETTING(iPhone_Release, "WRAPPER_EXTENSION", "app"); iPhone_Release_Object->addProperty("name", "Release", "", SettingsNoValue); iPhone_Release_Object->properties["buildSettings"] = iPhone_Release; @@ -554,8 +590,36 @@ void XCodeProvider::setupBuildConfiguration() { // Debug Object *scummvm_Debug_Object = new Object(this, "XCBuildConfiguration_scummvm_Debug", "scummvm", "XCBuildConfiguration", "PBXProject", "Debug"); Property scummvm_Debug; - scummvm_Debug.flags = SettingsSingleItem; - // TODO Add settings + ADD_SETTING(scummvm_Debug, "ALWAYS_SEARCH_USER_PATHS", "NO"); + ADD_SETTING_QUOTE(scummvm_Debug, "ARCHS", "$(ARCHS_STANDARD_32_BIT)"); + ADD_SETTING_QUOTE(scummvm_Debug, "CODE_SIGN_IDENTITY", "Don't Code Sign"); + ADD_SETTING_QUOTE_VAR(scummvm_Debug, "CODE_SIGN_IDENTITY[sdk=iphoneos*]", "Don't Code Sign"); + ADD_SETTING_QUOTE(scummvm_Debug, "FRAMEWORK_SEARCH_PATHS", ""); + ADD_SETTING(scummvm_Debug, "GCC_C_LANGUAGE_STANDARD", "c99"); + ADD_SETTING(scummvm_Debug, "GCC_ENABLE_CPP_EXCEPTIONS", "NO"); + ADD_SETTING(scummvm_Debug, "GCC_ENABLE_CPP_RTTI", "NO"); + ADD_SETTING(scummvm_Debug, "GCC_INPUT_FILETYPE", "automatic"); + ADD_SETTING(scummvm_Debug, "GCC_OPTIMIZATION_LEVEL", "0"); + ValueList scummvm_defines(_defines); + ADD_DEFINE(scummvm_defines, "IPHONE"); + ADD_DEFINE(scummvm_defines, "XCODE"); + ADD_DEFINE(scummvm_defines, "IPHONE_OFFICIAL"); + ADD_SETTING_LIST(scummvm_Debug, "GCC_PREPROCESSOR_DEFINITIONS", scummvm_defines, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING(scummvm_Debug, "GCC_THUMB_SUPPORT", "NO"); + ADD_SETTING(scummvm_Debug, "GCC_USE_GCC3_PFE_SUPPORT", "NO"); + ADD_SETTING(scummvm_Debug, "GCC_WARN_ABOUT_RETURN_TYPE", "YES"); + ADD_SETTING(scummvm_Debug, "GCC_WARN_UNUSED_VARIABLE", "YES"); + ValueList scummvm_HeaderPaths; + scummvm_HeaderPaths.push_back("include/"); + scummvm_HeaderPaths.push_back("../../engines/"); + scummvm_HeaderPaths.push_back("../../"); + ADD_SETTING_LIST(scummvm_Debug, "HEADER_SEARCH_PATHS", scummvm_HeaderPaths, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING_QUOTE(scummvm_Debug, "LIBRARY_SEARCH_PATHS", ""); + ADD_SETTING(scummvm_Debug, "ONLY_ACTIVE_ARCH", "YES"); + ADD_SETTING_QUOTE(scummvm_Debug, "OTHER_CFLAGS", ""); + ADD_SETTING_QUOTE(scummvm_Debug, "OTHER_LDFLAGS", "-lz"); + ADD_SETTING(scummvm_Debug, "PREBINDING", "NO"); + ADD_SETTING(scummvm_Debug, "SDKROOT", "macosx10.6"); scummvm_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); scummvm_Debug_Object->properties["buildSettings"] = scummvm_Debug; @@ -563,7 +627,10 @@ void XCodeProvider::setupBuildConfiguration() { // Release Object *scummvm_Release_Object = new Object(this, "XCBuildConfiguration_scummvm_Release", "scummvm", "XCBuildConfiguration", "PBXProject", "Release"); Property scummvm_Release(scummvm_Debug); - // TODO Add settings + REMOVE_SETTING(scummvm_Release, "GCC_C_LANGUAGE_STANDARD"); // Not sure why we remove that, or any of the other warnings + REMOVE_SETTING(scummvm_Release, "GCC_WARN_ABOUT_RETURN_TYPE"); + REMOVE_SETTING(scummvm_Release, "GCC_WARN_UNUSED_VARIABLE"); + REMOVE_SETTING(scummvm_Release, "ONLY_ACTIVE_ARCH"); scummvm_Release_Object->addProperty("name", "Release", "", SettingsNoValue); scummvm_Release_Object->properties["buildSettings"] = scummvm_Release; @@ -578,8 +645,51 @@ void XCodeProvider::setupBuildConfiguration() { // Debug Object *scummvmOSX_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-OSX_Debug", _targets[1] /* ScummVM-OS X */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); Property scummvmOSX_Debug; - scummvmOSX_Debug.flags = SettingsSingleItem; - // TODO Add settings + ADD_SETTING_QUOTE(scummvmOSX_Debug, "ARCHS", "$(NATIVE_ARCH)"); + ADD_SETTING(scummvmOSX_Debug, "COMPRESS_PNG_FILES", "NO"); + ADD_SETTING(scummvmOSX_Debug, "COPY_PHASE_STRIP", "NO"); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym"); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "FRAMEWORK_SEARCH_PATHS", ""); + ADD_SETTING(scummvmOSX_Debug, "GCC_C_LANGUAGE_STANDARD", "c99"); + ADD_SETTING(scummvmOSX_Debug, "GCC_ENABLE_CPP_EXCEPTIONS", "NO"); + ADD_SETTING(scummvmOSX_Debug, "GCC_ENABLE_CPP_RTTI", "NO"); + ADD_SETTING(scummvmOSX_Debug, "GCC_DYNAMIC_NO_PIC", "NO"); + ADD_SETTING(scummvmOSX_Debug, "GCC_ENABLE_FIX_AND_CONTINUE", "NO"); + ADD_SETTING(scummvmOSX_Debug, "GCC_OPTIMIZATION_LEVEL", "0"); + ADD_SETTING(scummvmOSX_Debug, "GCC_PRECOMPILE_PREFIX_HEADER", "NO"); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "GCC_PREFIX_HEADER", ""); + ValueList scummvmOSX_defines(_defines); + ADD_DEFINE(scummvmOSX_defines, "SDL_BACKEND"); + ADD_DEFINE(scummvmOSX_defines, "MACOSX"); + ADD_SETTING_LIST(scummvmOSX_Debug, "GCC_PREPROCESSOR_DEFINITIONS", scummvmOSX_defines, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "GCC_VERSION", ""); + ValueList scummvmOSX_HeaderPaths; + scummvmOSX_HeaderPaths.push_back("/opt/local/include/SDL"); + scummvmOSX_HeaderPaths.push_back("/opt/local/include"); + scummvmOSX_HeaderPaths.push_back("include/"); + scummvmOSX_HeaderPaths.push_back("../../engines/"); + scummvmOSX_HeaderPaths.push_back("../../"); + ADD_SETTING_LIST(scummvmOSX_Debug, "HEADER_SEARCH_PATHS", scummvmOSX_HeaderPaths, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "INFOPLIST_FILE", "$(SRCROOT)/../macosx/Info.plist"); + ValueList scummvmOSX_LibPaths; + scummvmOSX_LibPaths.push_back("/sw/lib"); + scummvmOSX_LibPaths.push_back("/opt/local/lib"); + scummvmOSX_LibPaths.push_back("\"$(inherited)\""); + scummvmOSX_LibPaths.push_back("\"\\\\\\\"$(SRCROOT)/lib\\\\\\\"\""); // mmmh, all those slashes, it's almost Christmas \o/ + ADD_SETTING_LIST(scummvmOSX_Debug, "LIBRARY_SEARCH_PATHS", scummvmOSX_LibPaths, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING_QUOTE(scummvmOSX_Debug, "OTHER_CFLAGS", ""); + ValueList scummvmOSX_LdFlags; + scummvmOSX_LdFlags.push_back("-lSDLmain"); + scummvmOSX_LdFlags.push_back("-logg"); + scummvmOSX_LdFlags.push_back("-lvorbisfile"); + scummvmOSX_LdFlags.push_back("-lvorbis"); + scummvmOSX_LdFlags.push_back("-lmad"); + scummvmOSX_LdFlags.push_back("-lFLAC"); + scummvmOSX_LdFlags.push_back("-lSDL"); + scummvmOSX_LdFlags.push_back("-lz"); + ADD_SETTING_LIST(scummvmOSX_Debug, "OTHER_LDFLAGS", scummvmOSX_LdFlags, SettingsAsList, 5); + ADD_SETTING(scummvmOSX_Debug, "PREBINDING", "NO"); + ADD_SETTING(scummvmOSX_Debug, "PRODUCT_NAME", "ScummVM"); scummvmOSX_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); scummvmOSX_Debug_Object->properties["buildSettings"] = scummvmOSX_Debug; @@ -587,7 +697,10 @@ void XCodeProvider::setupBuildConfiguration() { // Release Object *scummvmOSX_Release_Object = new Object(this, "XCBuildConfiguration_ScummVMOSX_Release", _targets[1] /* ScummVM-OS X */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); Property scummvmOSX_Release(scummvmOSX_Debug); - // TODO Add settings + ADD_SETTING(scummvmOSX_Release, "COPY_PHASE_STRIP", "YES"); + REMOVE_SETTING(scummvmOSX_Release, "GCC_DYNAMIC_NO_PIC"); + REMOVE_SETTING(scummvmOSX_Release, "GCC_OPTIMIZATION_LEVEL"); + ADD_SETTING(scummvmOSX_Release, "WRAPPER_EXTENSION", "app"); scummvmOSX_Release_Object->addProperty("name", "Release", "", SettingsNoValue); scummvmOSX_Release_Object->properties["buildSettings"] = scummvmOSX_Release; @@ -602,7 +715,10 @@ void XCodeProvider::setupBuildConfiguration() { // Debug Object *scummvmSimulator_Debug_Object = new Object(this, "XCBuildConfiguration_ScummVM-Simulator_Debug", _targets[2] /* ScummVM-Simulator */, "XCBuildConfiguration", "PBXNativeTarget", "Debug"); Property scummvmSimulator_Debug(iPhone_Debug); - // TODO Add settings + ADD_SETTING_QUOTE(scummvmSimulator_Debug, "FRAMEWORK_SEARCH_PATHS", "$(inherited)"); + ADD_SETTING_LIST(scummvmSimulator_Debug, "GCC_PREPROCESSOR_DEFINITIONS", scummvm_defines, SettingsNoQuote|SettingsAsList, 5); + ADD_SETTING(scummvmSimulator_Debug, "SDKROOT", "iphonesimulator3.2"); + REMOVE_SETTING(scummvmSimulator_Debug, "TARGETED_DEVICE_FAMILY"); scummvmSimulator_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); scummvmSimulator_Debug_Object->properties["buildSettings"] = scummvmSimulator_Debug; @@ -610,7 +726,9 @@ void XCodeProvider::setupBuildConfiguration() { // Release Object *scummvmSimulator_Release_Object = new Object(this, "XCBuildConfiguration_ScummVM-Simulator_Release", _targets[2] /* ScummVM-Simulator */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); Property scummvmSimulator_Release(scummvmSimulator_Debug); - /// TODO Add settings + ADD_SETTING(scummvmSimulator_Release, "COPY_PHASE_STRIP", "YES"); + REMOVE_SETTING(scummvmSimulator_Release, "GCC_DYNAMIC_NO_PIC"); + ADD_SETTING(scummvmSimulator_Release, "WRAPPER_EXTENSION", "app"); scummvmSimulator_Release_Object->addProperty("name", "Release", "", SettingsNoValue); scummvmSimulator_Release_Object->properties["buildSettings"] = scummvmSimulator_Release; @@ -618,8 +736,8 @@ void XCodeProvider::setupBuildConfiguration() { _buildConfiguration.add(scummvmSimulator_Debug_Object); _buildConfiguration.add(scummvmSimulator_Release_Object); - //////////////////////////////////////////////////////////////////////////// - //// Configuration List + ////////////////////////////////////////////////////////////////////////// + // Configuration List _configurationList.comment = "XCConfigurationList"; _configurationList.flags = SettingsAsList; From eb9ea8fee679382fdab3778bf99b1bb718d89a08 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Fri, 3 Jun 2011 00:03:56 +0200 Subject: [PATCH 364/369] AUDIO: Fix custom AdLib percussion instruments. The struct wasn't being zeroed out, a regression from b22ca4ff. --- audio/softsynth/adlib.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/audio/softsynth/adlib.cpp b/audio/softsynth/adlib.cpp index 60de8fad6093..4025a667acd8 100644 --- a/audio/softsynth/adlib.cpp +++ b/audio/softsynth/adlib.cpp @@ -857,6 +857,7 @@ void AdLibPercussionChannel::sysEx_customInstrument(uint32 type, const byte *ins // Allocate memory for the new instruments if (!_customInstruments[note]) { _customInstruments[note] = new AdLibInstrument; + memset(_customInstruments[note], 0, sizeof(AdLibInstrument)); } // Save the new instrument data From be7064c25ed2702457ea8c3e84a1a8a7f397c5c5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Thu, 2 Jun 2011 18:22:59 -0400 Subject: [PATCH 365/369] LASTEXPRESS: Remove unused LastExpressEngine::errorString() --- engines/lastexpress/lastexpress.cpp | 4 ---- engines/lastexpress/lastexpress.h | 1 - 2 files changed, 5 deletions(-) diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp index d195fcfad34e..6fdd18413bfe 100644 --- a/engines/lastexpress/lastexpress.cpp +++ b/engines/lastexpress/lastexpress.cpp @@ -314,8 +314,4 @@ bool LastExpressEngine::hasFeature(EngineFeature f) const { return (f == kSupportsRTL); } -void LastExpressEngine::errorString(const char *buf_input, char *buf_output, int buf_output_size) { - snprintf(buf_output, (uint)buf_output_size, "%s", buf_input); -} - } // End of namespace LastExpress diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h index 270ab655a158..d78bba36f09f 100644 --- a/engines/lastexpress/lastexpress.h +++ b/engines/lastexpress/lastexpress.h @@ -71,7 +71,6 @@ class LastExpressEngine : public Engine { protected: // Engine APIs Common::Error run(); - virtual void errorString(const char *buf_input, char *buf_output, int buf_output_size); virtual bool hasFeature(EngineFeature f) const; virtual Debugger *getDebugger() { return _debugger; } From b384bb4a861b08dbbb42b14019f5b991a52a1b0f Mon Sep 17 00:00:00 2001 From: Littleboy Date: Thu, 2 Jun 2011 18:26:37 -0400 Subject: [PATCH 366/369] LASTEXPRESS: Replace sprintf() usage with Common::String::format() --- engines/lastexpress/game/sound.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/engines/lastexpress/game/sound.cpp b/engines/lastexpress/game/sound.cpp index 81ed97481cec..63efd182a806 100644 --- a/engines/lastexpress/game/sound.cpp +++ b/engines/lastexpress/game/sound.cpp @@ -821,12 +821,8 @@ void SoundManager::playSoundEvent(EntityIndex entity, byte action, byte a3) { break; } - if (_action) { - sprintf((char *)&filename, "LIB%03d.SND", _action); - - if (flag) - playSoundWithSubtitles((char*)&filename, flag, kEntityPlayer, a3); - } + if (_action && flag) + playSoundWithSubtitles(Common::String::format("LIB%03d.SND", _action), flag, kEntityPlayer, a3); } void SoundManager::playSteam(CityIndex index) { @@ -885,10 +881,8 @@ void SoundManager::playFightSound(byte action, byte a4) { break; } - if (_action) { - sprintf((char *)&filename, "LIB%03d.SND", _action); - playSound(kEntityTrain, (char*)&filename, kFlagDefault, a4); - } + if (_action) + playSound(kEntityTrain, Common::String::format("LIB%03d.SND", _action), kFlagDefault, a4); } void SoundManager::playDialog(EntityIndex entity, EntityIndex entityDialog, FlagType flag, byte a4) { From 717248e1625bc42fc7f777ca9d3029f6ef8978e6 Mon Sep 17 00:00:00 2001 From: athrxx Date: Fri, 3 Jun 2011 00:39:07 +0200 Subject: [PATCH 367/369] KYRA: improve readability of key mapping code --- engines/kyra/kyra_v1.cpp | 44 +++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 75df1d148b0e..f108082e13b9 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -350,23 +350,43 @@ int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop, int eventFlag) } void KyraEngine_v1::setupKeyMap() { - static const Common::KeyCode keyboardEvents[] = { - Common::KEYCODE_SPACE, Common::KEYCODE_RETURN, Common::KEYCODE_UP, Common::KEYCODE_KP8, - Common::KEYCODE_RIGHT, Common::KEYCODE_KP6, Common::KEYCODE_DOWN, Common::KEYCODE_KP2, - Common::KEYCODE_KP5, Common::KEYCODE_LEFT, Common::KEYCODE_KP4, Common::KEYCODE_HOME, - Common::KEYCODE_KP7, Common::KEYCODE_PAGEUP, Common::KEYCODE_KP9, Common::KEYCODE_F1, - Common::KEYCODE_F2, Common::KEYCODE_F3, Common::KEYCODE_o, Common::KEYCODE_r, - Common::KEYCODE_SLASH, Common::KEYCODE_ESCAPE + struct KeyMapEntry { + Common::KeyCode kcScummVM; + int16 kcDOS; + int16 kcPC98; }; - static const int16 keyCodesDOS[] = { 61, 43, 96, 96, 102, 102, 98, 98, 97, 92, 92, 91, 91, 101, 101, 112, 113, 114, 25, 20, 55, 110}; - static const int16 keyCodesPC98[] = { 53, 29, 68, 68, 73, 73, 76, 76, 72, 71, 71, 67, 67, 69, 69, 99, 100, 101, 25, 20, 55, 1 }; +#define KC(x) Common::KEYCODE_##x + static const KeyMapEntry keys[] = { + { KC(SPACE), 61, 53 }, + { KC(RETURN), 43, 29 }, + { KC(UP), 96, 68 }, + { KC(KP8), 96, 68 }, + { KC(RIGHT), 102, 73 }, + { KC(KP6), 102, 73 }, + { KC(DOWN), 98, 76 }, + { KC(KP2), 98, 76 }, + { KC(KP5), 97, 72 }, + { KC(LEFT), 92, 71 }, + { KC(KP4), 92, 71 }, + { KC(HOME), 91, 67 }, + { KC(KP7), 91, 67 }, + { KC(PAGEUP), 101, 69 }, + { KC(KP9), 101, 69 }, + { KC(F1), 112, 99 }, + { KC(F2), 113, 100 }, + { KC(F3), 114, 101 }, + { KC(o), 25, 25 }, + { KC(r), 20, 20 }, + { KC(SLASH), 55, 55 }, + { KC(ESCAPE), 110, 1 }, + }; +#undef KC - const int16 *keyCodes = _flags.platform == Common::kPlatformPC98 ? keyCodesPC98 : keyCodesDOS; _keyMap.clear(); - for (int i = 0; i < ARRAYSIZE(keyboardEvents); i++) - _keyMap[keyboardEvents[i]] = keyCodes[i]; + for (int i = 0; i < ARRAYSIZE(keys); i++) + _keyMap[keys[i].kcScummVM] = (_flags.platform == Common::kPlatformPC98) ? keys[i].kcPC98 : keys[i].kcDOS; } void KyraEngine_v1::updateInput() { From 2e066816983935b8e365fc555f953bdce9f64e46 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 2 Jun 2011 18:40:49 -0400 Subject: [PATCH 368/369] COMMON: Begin objectifying QuickTimeParser::SampleDesc further This is preparation for multiple video and audio tracks --- audio/decoders/quicktime.cpp | 235 +++++++++++++++--------------- audio/decoders/quicktime_intern.h | 33 +++-- common/quicktime.cpp | 8 +- common/quicktime.h | 14 +- video/qt_decoder.cpp | 139 +++++++++--------- video/qt_decoder.h | 17 ++- 6 files changed, 230 insertions(+), 216 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index bdde9db8831f..a22f0399ade8 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -79,13 +79,13 @@ void QuickTimeAudioDecoder::init() { if (_audioStreamIndex >= 0) { AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - if (checkAudioCodecSupport(entry->codecTag, _streams[_audioStreamIndex]->objectTypeMP4)) { - _audStream = makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + if (entry->isAudioCodecSupported()) { + _audStream = makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2); _curAudioChunk = 0; // Make sure the bits per sample transfers to the sample size - if (entry->codecTag == MKTAG('r', 'a', 'w', ' ') || entry->codecTag == MKTAG('t', 'w', 'o', 's')) - _streams[_audioStreamIndex]->sample_size = (entry->bitsPerSample / 8) * entry->channels; + if (entry->getCodecTag() == MKTAG('r', 'a', 'w', ' ') || entry->getCodecTag() == MKTAG('t', 'w', 'o', 's')) + _streams[_audioStreamIndex]->sample_size = (entry->_bitsPerSample / 8) * entry->_channels; } } } @@ -94,32 +94,31 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt if (st->codec_type == CODEC_TYPE_AUDIO) { debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); - AudioSampleDesc *entry = new AudioSampleDesc(); - entry->codecTag = format; + AudioSampleDesc *entry = new AudioSampleDesc(st, format); uint16 stsdVersion = _fd->readUint16BE(); _fd->readUint16BE(); // revision level _fd->readUint32BE(); // vendor - entry->channels = _fd->readUint16BE(); // channel count - entry->bitsPerSample = _fd->readUint16BE(); // sample size + entry->_channels = _fd->readUint16BE(); // channel count + entry->_bitsPerSample = _fd->readUint16BE(); // sample size _fd->readUint16BE(); // compression id = 0 _fd->readUint16BE(); // packet size = 0 - entry->sampleRate = (_fd->readUint32BE() >> 16); + entry->_sampleRate = (_fd->readUint32BE() >> 16); debug(0, "stsd version =%d", stsdVersion); if (stsdVersion == 0) { // Not used, except in special cases. See below. - entry->samplesPerFrame = entry->bytesPerFrame = 0; + entry->_samplesPerFrame = entry->_bytesPerFrame = 0; } else if (stsdVersion == 1) { // Read QT version 1 fields. In version 0 these dont exist. - entry->samplesPerFrame = _fd->readUint32BE(); - debug(0, "stsd samples_per_frame =%d",entry->samplesPerFrame); + entry->_samplesPerFrame = _fd->readUint32BE(); + debug(0, "stsd samples_per_frame =%d",entry->_samplesPerFrame); _fd->readUint32BE(); // bytes per packet - entry->bytesPerFrame = _fd->readUint32BE(); - debug(0, "stsd bytes_per_frame =%d", entry->bytesPerFrame); + entry->_bytesPerFrame = _fd->readUint32BE(); + debug(0, "stsd bytes_per_frame =%d", entry->_bytesPerFrame); _fd->readUint32BE(); // bytes per sample } else { warning("Unsupported QuickTime STSD audio version %d", stsdVersion); @@ -130,12 +129,12 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt // Version 0 videos (such as the Riven ones) don't have this set, // but we need it later on. Add it in here. if (format == MKTAG('i', 'm', 'a', '4')) { - entry->samplesPerFrame = 64; - entry->bytesPerFrame = 34 * entry->channels; + entry->_samplesPerFrame = 64; + entry->_bytesPerFrame = 34 * entry->_channels; } - if (entry->sampleRate == 0 && st->time_scale > 1) - entry->sampleRate = st->time_scale; + if (entry->_sampleRate == 0 && st->time_scale > 1) + entry->_sampleRate = st->time_scale; return entry; } @@ -143,91 +142,6 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt return 0; } -bool QuickTimeAudioDecoder::checkAudioCodecSupport(uint32 tag, byte objectTypeMP4) { - // Check if the codec is a supported codec - if (tag == MKTAG('t', 'w', 'o', 's') || tag == MKTAG('r', 'a', 'w', ' ') || tag == MKTAG('i', 'm', 'a', '4')) - return true; - -#ifdef AUDIO_QDM2_H - if (tag == MKTAG('Q', 'D', 'M', '2')) - return true; -#endif - - if (tag == MKTAG('m', 'p', '4', 'a')) { - Common::String audioType; - switch (objectTypeMP4) { - case 0x40: // AAC -#ifdef USE_FAAD - return true; -#else - audioType = "AAC"; - break; -#endif - default: - audioType = "Unknown"; - break; - } - warning("No MPEG-4 audio (%s) support", audioType.c_str()); - } else - warning("Audio Codec Not Supported: \'%s\'", tag2str(tag)); - - return false; -} - -AudioStream *QuickTimeAudioDecoder::createAudioStream(Common::SeekableReadStream *stream) { - if (!stream || _audioStreamIndex < 0) - return NULL; - - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - - if (entry->codecTag == MKTAG('t', 'w', 'o', 's') || entry->codecTag == MKTAG('r', 'a', 'w', ' ')) { - // Fortunately, most of the audio used in Myst videos is raw... - uint16 flags = 0; - if (entry->codecTag == MKTAG('r', 'a', 'w', ' ')) - flags |= FLAG_UNSIGNED; - if (entry->channels == 2) - flags |= FLAG_STEREO; - if (entry->bitsPerSample == 16) - flags |= FLAG_16BITS; - uint32 dataSize = stream->size(); - byte *data = (byte *)malloc(dataSize); - stream->read(data, dataSize); - delete stream; - return makeRawStream(data, dataSize, entry->sampleRate, flags); - } else if (entry->codecTag == MKTAG('i', 'm', 'a', '4')) { - // Riven uses this codec (as do some Myst ME videos) - return makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), kADPCMApple, entry->sampleRate, entry->channels, 34); - } else if (entry->codecTag == MKTAG('m', 'p', '4', 'a')) { - // The 7th Guest iOS uses an MPEG-4 codec -#ifdef USE_FAAD - if (_streams[_audioStreamIndex]->objectTypeMP4 == 0x40) - return makeAACStream(stream, DisposeAfterUse::YES, _streams[_audioStreamIndex]->extradata); -#endif -#ifdef AUDIO_QDM2_H - } else if (entry->codecTag == MKTAG('Q', 'D', 'M', '2')) { - // Myst ME uses this codec for many videos - return makeQDM2Stream(stream, _streams[_audioStreamIndex]->extradata); -#endif - } - - error("Unsupported audio codec"); - - return NULL; -} - -uint32 QuickTimeAudioDecoder::getAudioChunkSampleCount(uint chunk) { - if (_audioStreamIndex < 0) - return 0; - - uint32 sampleCount = 0; - - for (uint32 j = 0; j < _streams[_audioStreamIndex]->sample_to_chunk_sz; j++) - if (chunk >= _streams[_audioStreamIndex]->sample_to_chunk[j].first) - sampleCount = _streams[_audioStreamIndex]->sample_to_chunk[j].count; - - return sampleCount; -} - bool QuickTimeAudioDecoder::isOldDemuxing() const { assert(_audioStreamIndex >= 0); return _streams[_audioStreamIndex]->stts_count == 1 && _streams[_audioStreamIndex]->stts_data[0].duration == 1; @@ -240,7 +154,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { _fd->seek(_streams[_audioStreamIndex]->chunk_offsets[_curAudioChunk]); // First, we have to get the sample count - uint32 sampleCount = getAudioChunkSampleCount(_curAudioChunk); + uint32 sampleCount = entry->getAudioChunkSampleCount(_curAudioChunk); assert(sampleCount); if (isOldDemuxing()) { @@ -250,12 +164,12 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { while (sampleCount > 0) { uint32 samples = 0, size = 0; - if (entry->samplesPerFrame >= 160) { - samples = entry->samplesPerFrame; - size = entry->bytesPerFrame; - } else if (entry->samplesPerFrame > 1) { - samples = MIN((1024 / entry->samplesPerFrame) * entry->samplesPerFrame, sampleCount); - size = (samples / entry->samplesPerFrame) * entry->bytesPerFrame; + if (entry->_samplesPerFrame >= 160) { + samples = entry->_samplesPerFrame; + size = entry->_bytesPerFrame; + } else if (entry->_samplesPerFrame > 1) { + samples = MIN((1024 / entry->_samplesPerFrame) * entry->_samplesPerFrame, sampleCount); + size = (samples / entry->_samplesPerFrame) * entry->_bytesPerFrame; } else { samples = MIN(1024, sampleCount); size = samples * _streams[_audioStreamIndex]->sample_size; @@ -274,7 +188,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { // Find our starting sample uint32 startSample = 0; for (uint32 i = 0; i < _curAudioChunk; i++) - startSample += getAudioChunkSampleCount(i); + startSample += entry->getAudioChunkSampleCount(i); for (uint32 i = 0; i < sampleCount; i++) { uint32 size = (_streams[_audioStreamIndex]->sample_size != 0) ? _streams[_audioStreamIndex]->sample_size : _streams[_audioStreamIndex]->sample_sizes[i + startSample]; @@ -288,7 +202,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { } // Now queue the buffer - _audStream->queueAudioStream(createAudioStream(new Common::MemoryReadStream(wStream->getData(), wStream->size(), DisposeAfterUse::YES))); + _audStream->queueAudioStream(entry->createAudioStream(new Common::MemoryReadStream(wStream->getData(), wStream->size(), DisposeAfterUse::YES))); delete wStream; _curAudioChunk++; @@ -301,7 +215,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { // Re-create the audio stream delete _audStream; Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; - _audStream = Audio::makeQueuingAudioStream(entry->sampleRate, entry->channels == 2); + _audStream = Audio::makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2); // First, we need to track down what audio sample we need Audio::Timestamp curAudioTime = where.convertToFramerate(_streams[_audioStreamIndex]->time_scale); @@ -325,7 +239,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { uint32 totalSamples = 0; _curAudioChunk = 0; for (uint32 i = 0; i < _streams[_audioStreamIndex]->chunk_count; i++, _curAudioChunk++) { - uint32 chunkSampleCount = getAudioChunkSampleCount(i); + uint32 chunkSampleCount = entry->getAudioChunkSampleCount(i); if (seekSample < totalSamples + chunkSampleCount) break; @@ -338,7 +252,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { if (sample != totalSamples) { // HACK: Skip a certain amount of samples from the stream // (There's got to be a better way to do this!) - int skipSamples = (sample - totalSamples) * entry->channels; + int skipSamples = (sample - totalSamples) * entry->_channels; int16 *tempBuffer = new int16[skipSamples]; _audStream->readBuffer(tempBuffer, skipSamples); @@ -346,11 +260,92 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { } } -QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc() : Common::QuickTimeParser::SampleDesc() { - channels = 0; - sampleRate = 0; - samplesPerFrame = 0; - bytesPerFrame = 0; +QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentStream, codecTag) { + _channels = 0; + _sampleRate = 0; + _samplesPerFrame = 0; + _bytesPerFrame = 0; + _bitsPerSample = 0; +} + +bool QuickTimeAudioDecoder::AudioSampleDesc::isAudioCodecSupported() const { + // Check if the codec is a supported codec + if (_codecTag == MKTAG('t', 'w', 'o', 's') || _codecTag == MKTAG('r', 'a', 'w', ' ') || _codecTag == MKTAG('i', 'm', 'a', '4')) + return true; + +#ifdef AUDIO_QDM2_H + if (_codecTag == MKTAG('Q', 'D', 'M', '2')) + return true; +#endif + + if (_codecTag == MKTAG('m', 'p', '4', 'a')) { + Common::String audioType; + switch (_parentStream->objectTypeMP4) { + case 0x40: // AAC +#ifdef USE_FAAD + return true; +#else + audioType = "AAC"; + break; +#endif + default: + audioType = "Unknown"; + break; + } + warning("No MPEG-4 audio (%s) support", audioType.c_str()); + } else + warning("Audio Codec Not Supported: \'%s\'", tag2str(_codecTag)); + + return false; +} + +uint32 QuickTimeAudioDecoder::AudioSampleDesc::getAudioChunkSampleCount(uint chunk) const { + uint32 sampleCount = 0; + + for (uint32 j = 0; j < _parentStream->sample_to_chunk_sz; j++) + if (chunk >= _parentStream->sample_to_chunk[j].first) + sampleCount = _parentStream->sample_to_chunk[j].count; + + return sampleCount; +} + +AudioStream *QuickTimeAudioDecoder::AudioSampleDesc::createAudioStream(Common::SeekableReadStream *stream) const { + if (!stream) + return 0; + + if (_codecTag == MKTAG('t', 'w', 'o', 's') || _codecTag == MKTAG('r', 'a', 'w', ' ')) { + // Fortunately, most of the audio used in Myst videos is raw... + uint16 flags = 0; + if (_codecTag == MKTAG('r', 'a', 'w', ' ')) + flags |= FLAG_UNSIGNED; + if (_channels == 2) + flags |= FLAG_STEREO; + if (_bitsPerSample == 16) + flags |= FLAG_16BITS; + uint32 dataSize = stream->size(); + byte *data = (byte *)malloc(dataSize); + stream->read(data, dataSize); + delete stream; + return makeRawStream(data, dataSize, _sampleRate, flags); + } else if (_codecTag == MKTAG('i', 'm', 'a', '4')) { + // Riven uses this codec (as do some Myst ME videos) + return makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), kADPCMApple, _sampleRate, _channels, 34); + } else if (_codecTag == MKTAG('m', 'p', '4', 'a')) { + // The 7th Guest iOS uses an MPEG-4 codec +#ifdef USE_FAAD + if (_parentStream->objectTypeMP4 == 0x40) + return makeAACStream(stream, DisposeAfterUse::YES, _parentStream->extradata); +#endif +#ifdef AUDIO_QDM2_H + } else if (_codecTag == MKTAG('Q', 'D', 'M', '2')) { + // Myst ME uses this codec for many videos + return makeQDM2Stream(stream, _parentStream->extradata); +#endif + } + + error("Unsupported audio codec"); + + return NULL; } /** diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h index 691ef7b58c2b..3279ad805404 100644 --- a/audio/decoders/quicktime_intern.h +++ b/audio/decoders/quicktime_intern.h @@ -65,30 +65,33 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle); protected: - struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { - AudioSampleDesc(); - - uint16 channels; - uint32 sampleRate; - uint32 samplesPerFrame; - uint32 bytesPerFrame; + class AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { + public: + AudioSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag); + + bool isAudioCodecSupported() const; + uint32 getAudioChunkSampleCount(uint chunk) const; + AudioStream *createAudioStream(Common::SeekableReadStream *stream) const; + + // TODO: Make private in the long run + uint16 _bitsPerSample; + uint16 _channels; + uint32 _sampleRate; + uint32 _samplesPerFrame; + uint32 _bytesPerFrame; }; // Common::QuickTimeParser API virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); - AudioStream *createAudioStream(Common::SeekableReadStream *stream); - bool checkAudioCodecSupport(uint32 tag, byte objectTypeMP4); void init(); - + void setAudioStreamPos(const Timestamp &where); + bool isOldDemuxing() const; void queueNextAudioChunk(); - uint32 getAudioChunkSampleCount(uint chunk); - int8 _audioStreamIndex; + + int _audioStreamIndex; uint _curAudioChunk; QueuingAudioStream *_audStream; - - void setAudioStreamPos(const Timestamp &where); - bool isOldDemuxing() const; }; } // End of namespace Audio diff --git a/common/quicktime.cpp b/common/quicktime.cpp index cf50584cc624..606e1bb9e681 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -686,7 +686,7 @@ int QuickTimeParser::readWAVE(MOVatom atom) { if (atom.size > (1 << 30)) return -1; - if (st->sampleDescs[0]->codecTag == MKTAG('Q', 'D', 'M', '2')) // Read extradata for QDM2 + if (st->sampleDescs[0]->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extradata for QDM2 st->extradata = _fd->readStream(atom.size - 8); else if (atom.size > 8) return readDefault(atom); @@ -773,9 +773,9 @@ void QuickTimeParser::close() { _fd = 0; } -QuickTimeParser::SampleDesc::SampleDesc() { - codecTag = 0; - bitsPerSample = 0; +QuickTimeParser::SampleDesc::SampleDesc(MOVStreamContext *parentStream, uint32 codecTag) { + _parentStream = parentStream; + _codecTag = codecTag; } QuickTimeParser::MOVStreamContext::MOVStreamContext() { diff --git a/common/quicktime.h b/common/quicktime.h index a5903bc0f642..2bd461e38961 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -116,12 +116,18 @@ class QuickTimeParser { Common::Rational mediaRate; }; - struct SampleDesc { - SampleDesc(); + struct MOVStreamContext; + + class SampleDesc { + public: + SampleDesc(MOVStreamContext *parentStream, uint32 codecTag); virtual ~SampleDesc() {} - uint32 codecTag; - uint16 bitsPerSample; + uint32 getCodecTag() const { return _codecTag; } + + protected: + MOVStreamContext *_parentStream; + uint32 _codecTag; }; enum CodecType { diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 328c3fb21b44..dbf860373523 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -203,38 +203,6 @@ void QuickTimeDecoder::seekToTime(Audio::Timestamp time) { seekToFrame(frame); } -Codec *QuickTimeDecoder::createCodec(uint32 codecTag, byte bitsPerPixel) { - if (codecTag == MKTAG('c','v','i','d')) { - // Cinepak: As used by most Myst and all Riven videos as well as some Myst ME videos. "The Chief" videos also use this. - return new CinepakDecoder(bitsPerPixel); - } else if (codecTag == MKTAG('r','p','z','a')) { - // Apple Video ("Road Pizza"): Used by some Myst videos. - return new RPZADecoder(getWidth(), getHeight()); - } else if (codecTag == MKTAG('r','l','e',' ')) { - // QuickTime RLE: Used by some Myst ME videos. - return new QTRLEDecoder(getWidth(), getHeight(), bitsPerPixel); - } else if (codecTag == MKTAG('s','m','c',' ')) { - // Apple SMC: Used by some Myst videos. - return new SMCDecoder(getWidth(), getHeight()); - } else if (codecTag == MKTAG('S','V','Q','1')) { - // Sorenson Video 1: Used by some Myst ME videos. - warning("Sorenson Video 1 not yet supported"); - } else if (codecTag == MKTAG('S','V','Q','3')) { - // Sorenson Video 3: Used by some Myst ME videos. - warning("Sorenson Video 3 not yet supported"); - } else if (codecTag == MKTAG('j','p','e','g')) { - // Motion JPEG: Used by some Myst ME 10th Anniversary videos. - return new JPEGDecoder(); - } else if (codecTag == MKTAG('Q','k','B','k')) { - // CDToons: Used by most of the Broderbund games. - return new CDToonsDecoder(getWidth(), getHeight()); - } else { - warning("Unsupported codec \'%s\'", tag2str(codecTag)); - } - - return NULL; -} - void QuickTimeDecoder::startAudio() { if (_audStream) { updateAudioBuffer(); @@ -256,7 +224,7 @@ Codec *QuickTimeDecoder::findDefaultVideoCodec() const { if (_videoStreamIndex < 0 || _streams[_videoStreamIndex]->sampleDescs.empty()) return 0; - return ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[0])->videoCodec; + return ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[0])->_videoCodec; } const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { @@ -282,22 +250,22 @@ const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { // Find which video description entry we want VideoSampleDesc *entry = (VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[descId - 1]; - if (!entry->videoCodec) + if (!entry->_videoCodec) return 0; - const Graphics::Surface *frame = entry->videoCodec->decodeImage(frameData); + const Graphics::Surface *frame = entry->_videoCodec->decodeImage(frameData); delete frameData; // Update the palette - if (entry->videoCodec->containsPalette()) { + if (entry->_videoCodec->containsPalette()) { // The codec itself contains a palette - if (entry->videoCodec->hasDirtyPalette()) { - _palette = entry->videoCodec->getPalette(); + if (entry->_videoCodec->hasDirtyPalette()) { + _palette = entry->_videoCodec->getPalette(); _dirtyPalette = true; } } else { // Check if the video description has been updated - byte *palette = entry->palette; + byte *palette = entry->_palette; if (palette != _palette) { _palette = palette; @@ -381,10 +349,8 @@ void QuickTimeDecoder::init() { // Initialize video, if present if (_videoStreamIndex >= 0) { - for (uint32 i = 0; i < _streams[_videoStreamIndex]->sampleDescs.size(); i++) { - VideoSampleDesc *entry = (VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[i]; - entry->videoCodec = createCodec(entry->codecTag, entry->bitsPerSample & 0x1F); - } + for (uint32 i = 0; i < _streams[_videoStreamIndex]->sampleDescs.size(); i++) + ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[i])->initCodec(); if (getScaleFactorX() != 1 || getScaleFactorY() != 1) { // We have to initialize the scaled surface @@ -398,8 +364,7 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC if (st->codec_type == CODEC_TYPE_VIDEO) { debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); - VideoSampleDesc *entry = new VideoSampleDesc(); - entry->codecTag = format; + VideoSampleDesc *entry = new VideoSampleDesc(st, format); _fd->readUint16BE(); // version _fd->readUint16BE(); // revision level @@ -426,24 +391,24 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC byte codec_name[32]; _fd->read(codec_name, 32); // codec name, pascal string (FIXME: true for mp4?) if (codec_name[0] <= 31) { - memcpy(entry->codecName, &codec_name[1], codec_name[0]); - entry->codecName[codec_name[0]] = 0; + memcpy(entry->_codecName, &codec_name[1], codec_name[0]); + entry->_codecName[codec_name[0]] = 0; } - entry->bitsPerSample = _fd->readUint16BE(); // depth - entry->colorTableId = _fd->readUint16BE(); // colortable id + entry->_bitsPerSample = _fd->readUint16BE(); // depth + entry->_colorTableId = _fd->readUint16BE(); // colortable id // figure out the palette situation - byte colorDepth = entry->bitsPerSample & 0x1F; - bool colorGreyscale = (entry->bitsPerSample & 0x20) != 0; + byte colorDepth = entry->_bitsPerSample & 0x1F; + bool colorGreyscale = (entry->_bitsPerSample & 0x20) != 0; debug(0, "color depth: %d", colorDepth); // if the depth is 2, 4, or 8 bpp, file is palettized if (colorDepth == 2 || colorDepth == 4 || colorDepth == 8) { // Initialize the palette - entry->palette = new byte[256 * 3]; - memset(entry->palette, 0, 256 * 3); + entry->_palette = new byte[256 * 3]; + memset(entry->_palette, 0, 256 * 3); if (colorGreyscale) { debug(0, "Greyscale palette"); @@ -453,12 +418,12 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC int16 colorIndex = 255; byte colorDec = 256 / (colorCount - 1); for (byte j = 0; j < colorCount; j++) { - entry->palette[j * 3] = entry->palette[j * 3 + 1] = entry->palette[j * 3 + 2] = colorIndex; + entry->_palette[j * 3] = entry->_palette[j * 3 + 1] = entry->_palette[j * 3 + 2] = colorIndex; colorIndex -= colorDec; if (colorIndex < 0) colorIndex = 0; } - } else if (entry->colorTableId & 0x08) { + } else if (entry->_colorTableId & 0x08) { // if flag bit 3 is set, use the default palette //uint16 colorCount = 1 << colorDepth; @@ -476,11 +441,11 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC // up front _fd->readByte(); _fd->readByte(); - entry->palette[j * 3] = _fd->readByte(); + entry->_palette[j * 3] = _fd->readByte(); _fd->readByte(); - entry->palette[j * 3 + 1] = _fd->readByte(); + entry->_palette[j * 3 + 1] = _fd->readByte(); _fd->readByte(); - entry->palette[j * 3 + 2] = _fd->readByte(); + entry->_palette[j * 3 + 2] = _fd->readByte(); _fd->readByte(); } } @@ -581,10 +546,10 @@ void QuickTimeDecoder::updateAudioBuffer() { uint32 curAudioChunk = _curAudioChunk - _audStream->numQueuedStreams(); for (; timeFilled < timeToNextFrame && curAudioChunk < _streams[_audioStreamIndex]->chunk_count; numberOfChunksNeeded++, curAudioChunk++) { - uint32 sampleCount = getAudioChunkSampleCount(curAudioChunk); + uint32 sampleCount = entry->getAudioChunkSampleCount(curAudioChunk); assert(sampleCount); - timeFilled += sampleCount * 1000 / entry->sampleRate; + timeFilled += sampleCount * 1000 / entry->_sampleRate; } // Add a couple extra to ensure we don't underrun @@ -596,16 +561,56 @@ void QuickTimeDecoder::updateAudioBuffer() { queueNextAudioChunk(); } -QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc() : Common::QuickTimeParser::SampleDesc() { - memset(codecName, 0, 32); - colorTableId = 0; - palette = 0; - videoCodec = 0; +QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentStream, codecTag) { + memset(_codecName, 0, 32); + _colorTableId = 0; + _palette = 0; + _videoCodec = 0; + _bitsPerSample = 0; } QuickTimeDecoder::VideoSampleDesc::~VideoSampleDesc() { - delete[] palette; - delete videoCodec; + delete[] _palette; + delete _videoCodec; +} + +void QuickTimeDecoder::VideoSampleDesc::initCodec() { + switch (_codecTag) { + case MKTAG('c','v','i','d'): + // Cinepak: As used by most Myst and all Riven videos as well as some Myst ME videos. "The Chief" videos also use this. + _videoCodec = new CinepakDecoder(_bitsPerSample & 0x1f); + break; + case MKTAG('r','p','z','a'): + // Apple Video ("Road Pizza"): Used by some Myst videos. + _videoCodec = new RPZADecoder(_parentStream->width, _parentStream->height); + break; + case MKTAG('r','l','e',' '): + // QuickTime RLE: Used by some Myst ME videos. + _videoCodec = new QTRLEDecoder(_parentStream->width, _parentStream->height, _bitsPerSample & 0x1f); + break; + case MKTAG('s','m','c',' '): + // Apple SMC: Used by some Myst videos. + _videoCodec = new SMCDecoder(_parentStream->width, _parentStream->height); + break; + case MKTAG('S','V','Q','1'): + // Sorenson Video 1: Used by some Myst ME videos. + warning("Sorenson Video 1 not yet supported"); + break; + case MKTAG('S','V','Q','3'): + // Sorenson Video 3: Used by some Myst ME videos. + warning("Sorenson Video 3 not yet supported"); + break; + case MKTAG('j','p','e','g'): + // Motion JPEG: Used by some Myst ME 10th Anniversary videos. + _videoCodec = new JPEGDecoder(); + break; + case MKTAG('Q','k','B','k'): + // CDToons: Used by most of the Broderbund games. + _videoCodec = new CDToonsDecoder(_parentStream->width, _parentStream->height); + break; + default: + warning("Unsupported codec \'%s\'", tag2str(_codecTag)); + } } } // End of namespace Video diff --git a/video/qt_decoder.h b/video/qt_decoder.h index d8beda0f83bf..e3955d7d3bcf 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -114,14 +114,19 @@ class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAud uint32 getDuration() const { return _duration * 1000 / _timeScale; } protected: - struct VideoSampleDesc : public Common::QuickTimeParser::SampleDesc { - VideoSampleDesc(); + class VideoSampleDesc : public Common::QuickTimeParser::SampleDesc { + public: + VideoSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag); ~VideoSampleDesc(); - char codecName[32]; - uint16 colorTableId; - byte *palette; - Codec *videoCodec; + void initCodec(); + + // TODO: Make private in the long run + uint16 _bitsPerSample; + char _codecName[32]; + uint16 _colorTableId; + byte *_palette; + Codec *_videoCodec; }; Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); From 547fd1bdcabcba0e741eb31100ba99ff73399d24 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 3 Jun 2011 00:54:30 -0400 Subject: [PATCH 369/369] COMMON: Cleanup QuickTime variable and struct naming --- audio/decoders/quicktime.cpp | 70 +++---- audio/decoders/quicktime_intern.h | 6 +- common/quicktime.cpp | 299 +++++++++++++++--------------- common/quicktime.h | 93 +++++----- video/qt_decoder.cpp | 156 ++++++++-------- video/qt_decoder.h | 6 +- 6 files changed, 312 insertions(+), 318 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index a22f0399ade8..0f2e76658bab 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -68,16 +68,16 @@ bool QuickTimeAudioDecoder::loadAudioStream(Common::SeekableReadStream *stream, void QuickTimeAudioDecoder::init() { Common::QuickTimeParser::init(); - _audioStreamIndex = -1; + _audioTrackIndex = -1; // Find an audio stream - for (uint32 i = 0; i < _numStreams; i++) - if (_streams[i]->codec_type == CODEC_TYPE_AUDIO && _audioStreamIndex < 0) - _audioStreamIndex = i; + for (uint32 i = 0; i < _tracks.size(); i++) + if (_tracks[i]->codecType == CODEC_TYPE_AUDIO && _audioTrackIndex < 0) + _audioTrackIndex = i; // Initialize audio, if present - if (_audioStreamIndex >= 0) { - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + if (_audioTrackIndex >= 0) { + AudioSampleDesc *entry = (AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0]; if (entry->isAudioCodecSupported()) { _audStream = makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2); @@ -85,16 +85,16 @@ void QuickTimeAudioDecoder::init() { // Make sure the bits per sample transfers to the sample size if (entry->getCodecTag() == MKTAG('r', 'a', 'w', ' ') || entry->getCodecTag() == MKTAG('t', 'w', 'o', 's')) - _streams[_audioStreamIndex]->sample_size = (entry->_bitsPerSample / 8) * entry->_channels; + _tracks[_audioTrackIndex]->sampleSize = (entry->_bitsPerSample / 8) * entry->_channels; } } } -Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVStreamContext *st, uint32 format) { - if (st->codec_type == CODEC_TYPE_AUDIO) { +Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(Track *track, uint32 format) { + if (track->codecType == CODEC_TYPE_AUDIO) { debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); - AudioSampleDesc *entry = new AudioSampleDesc(st, format); + AudioSampleDesc *entry = new AudioSampleDesc(track, format); uint16 stsdVersion = _fd->readUint16BE(); _fd->readUint16BE(); // revision level @@ -133,8 +133,8 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt entry->_bytesPerFrame = 34 * entry->_channels; } - if (entry->_sampleRate == 0 && st->time_scale > 1) - entry->_sampleRate = st->time_scale; + if (entry->_sampleRate == 0 && track->timeScale > 1) + entry->_sampleRate = track->timeScale; return entry; } @@ -143,15 +143,15 @@ Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(MOVSt } bool QuickTimeAudioDecoder::isOldDemuxing() const { - assert(_audioStreamIndex >= 0); - return _streams[_audioStreamIndex]->stts_count == 1 && _streams[_audioStreamIndex]->stts_data[0].duration == 1; + assert(_audioTrackIndex >= 0); + return _tracks[_audioTrackIndex]->timeToSampleCount == 1 && _tracks[_audioTrackIndex]->timeToSample[0].duration == 1; } void QuickTimeAudioDecoder::queueNextAudioChunk() { - AudioSampleDesc *entry = (AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + AudioSampleDesc *entry = (AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0]; Common::MemoryWriteStreamDynamic *wStream = new Common::MemoryWriteStreamDynamic(); - _fd->seek(_streams[_audioStreamIndex]->chunk_offsets[_curAudioChunk]); + _fd->seek(_tracks[_audioTrackIndex]->chunkOffsets[_curAudioChunk]); // First, we have to get the sample count uint32 sampleCount = entry->getAudioChunkSampleCount(_curAudioChunk); @@ -172,7 +172,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { size = (samples / entry->_samplesPerFrame) * entry->_bytesPerFrame; } else { samples = MIN(1024, sampleCount); - size = samples * _streams[_audioStreamIndex]->sample_size; + size = samples * _tracks[_audioTrackIndex]->sampleSize; } // Now, we read in the data for this data and output it @@ -191,7 +191,7 @@ void QuickTimeAudioDecoder::queueNextAudioChunk() { startSample += entry->getAudioChunkSampleCount(i); for (uint32 i = 0; i < sampleCount; i++) { - uint32 size = (_streams[_audioStreamIndex]->sample_size != 0) ? _streams[_audioStreamIndex]->sample_size : _streams[_audioStreamIndex]->sample_sizes[i + startSample]; + uint32 size = (_tracks[_audioTrackIndex]->sampleSize != 0) ? _tracks[_audioTrackIndex]->sampleSize : _tracks[_audioTrackIndex]->sampleSizes[i + startSample]; // Now, we read in the data for this data and output it byte *data = (byte *)malloc(size); @@ -214,31 +214,31 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { // Re-create the audio stream delete _audStream; - Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0]; _audStream = Audio::makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2); // First, we need to track down what audio sample we need - Audio::Timestamp curAudioTime = where.convertToFramerate(_streams[_audioStreamIndex]->time_scale); + Audio::Timestamp curAudioTime = where.convertToFramerate(_tracks[_audioTrackIndex]->timeScale); uint32 sample = curAudioTime.totalNumberOfFrames(); uint32 seekSample = sample; if (!isOldDemuxing()) { // We shouldn't have audio samples that are a different duration // That would be quite bad! - if (_streams[_audioStreamIndex]->stts_count != 1) { + if (_tracks[_audioTrackIndex]->timeToSampleCount != 1) { warning("Failed seeking"); return; } // Note that duration is in terms of *one* channel // This eases calculation a bit - seekSample /= _streams[_audioStreamIndex]->stts_data[0].duration; + seekSample /= _tracks[_audioTrackIndex]->timeToSample[0].duration; } // Now to track down what chunk it's in uint32 totalSamples = 0; _curAudioChunk = 0; - for (uint32 i = 0; i < _streams[_audioStreamIndex]->chunk_count; i++, _curAudioChunk++) { + for (uint32 i = 0; i < _tracks[_audioTrackIndex]->chunkCount; i++, _curAudioChunk++) { uint32 chunkSampleCount = entry->getAudioChunkSampleCount(i); if (seekSample < totalSamples + chunkSampleCount) @@ -260,7 +260,7 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { } } -QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentStream, codecTag) { +QuickTimeAudioDecoder::AudioSampleDesc::AudioSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentTrack, codecTag) { _channels = 0; _sampleRate = 0; _samplesPerFrame = 0; @@ -280,7 +280,7 @@ bool QuickTimeAudioDecoder::AudioSampleDesc::isAudioCodecSupported() const { if (_codecTag == MKTAG('m', 'p', '4', 'a')) { Common::String audioType; - switch (_parentStream->objectTypeMP4) { + switch (_parentTrack->objectTypeMP4) { case 0x40: // AAC #ifdef USE_FAAD return true; @@ -302,9 +302,9 @@ bool QuickTimeAudioDecoder::AudioSampleDesc::isAudioCodecSupported() const { uint32 QuickTimeAudioDecoder::AudioSampleDesc::getAudioChunkSampleCount(uint chunk) const { uint32 sampleCount = 0; - for (uint32 j = 0; j < _parentStream->sample_to_chunk_sz; j++) - if (chunk >= _parentStream->sample_to_chunk[j].first) - sampleCount = _parentStream->sample_to_chunk[j].count; + for (uint32 j = 0; j < _parentTrack->sampleToChunkCount; j++) + if (chunk >= _parentTrack->sampleToChunk[j].first) + sampleCount = _parentTrack->sampleToChunk[j].count; return sampleCount; } @@ -333,13 +333,13 @@ AudioStream *QuickTimeAudioDecoder::AudioSampleDesc::createAudioStream(Common::S } else if (_codecTag == MKTAG('m', 'p', '4', 'a')) { // The 7th Guest iOS uses an MPEG-4 codec #ifdef USE_FAAD - if (_parentStream->objectTypeMP4 == 0x40) - return makeAACStream(stream, DisposeAfterUse::YES, _parentStream->extradata); + if (_parentTrack->objectTypeMP4 == 0x40) + return makeAACStream(stream, DisposeAfterUse::YES, _parentTrack->extraData); #endif #ifdef AUDIO_QDM2_H } else if (_codecTag == MKTAG('Q', 'D', 'M', '2')) { // Myst ME uses this codec for many videos - return makeQDM2Stream(stream, _parentStream->extradata); + return makeQDM2Stream(stream, _parentTrack->extraData); #endif } @@ -357,11 +357,11 @@ class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDe ~QuickTimeAudioStream() {} bool openFromFile(const Common::String &filename) { - return QuickTimeAudioDecoder::loadAudioFile(filename) && _audioStreamIndex >= 0 && _audStream; + return QuickTimeAudioDecoder::loadAudioFile(filename) && _audioTrackIndex >= 0 && _audStream; } bool openFromStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { - return QuickTimeAudioDecoder::loadAudioStream(stream, disposeFileHandle) && _audioStreamIndex >= 0 && _audStream; + return QuickTimeAudioDecoder::loadAudioStream(stream, disposeFileHandle) && _audioTrackIndex >= 0 && _audStream; } // AudioStream API @@ -380,7 +380,7 @@ class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDe bool isStereo() const { return _audStream->isStereo(); } int getRate() const { return _audStream->getRate(); } - bool endOfData() const { return _curAudioChunk >= _streams[_audioStreamIndex]->chunk_count && _audStream->endOfData(); } + bool endOfData() const { return _curAudioChunk >= _tracks[_audioTrackIndex]->chunkCount && _audStream->endOfData(); } // SeekableAudioStream API bool seek(const Timestamp &where) { @@ -392,7 +392,7 @@ class QuickTimeAudioStream : public SeekableAudioStream, public QuickTimeAudioDe } Timestamp getLength() const { - return Timestamp(0, _streams[_audioStreamIndex]->duration, _streams[_audioStreamIndex]->time_scale); + return Timestamp(0, _tracks[_audioTrackIndex]->duration, _tracks[_audioTrackIndex]->timeScale); } }; diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h index 3279ad805404..f288d5604bf5 100644 --- a/audio/decoders/quicktime_intern.h +++ b/audio/decoders/quicktime_intern.h @@ -67,7 +67,7 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { protected: class AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { public: - AudioSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag); + AudioSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag); bool isAudioCodecSupported() const; uint32 getAudioChunkSampleCount(uint chunk) const; @@ -82,14 +82,14 @@ class QuickTimeAudioDecoder : public Common::QuickTimeParser { }; // Common::QuickTimeParser API - virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); + virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format); void init(); void setAudioStreamPos(const Timestamp &where); bool isOldDemuxing() const; void queueNextAudioChunk(); - int _audioStreamIndex; + int _audioTrackIndex; uint _curAudioChunk; QueuingAudioStream *_audStream; }; diff --git a/common/quicktime.cpp b/common/quicktime.cpp index 606e1bb9e681..57534b301a97 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -48,7 +48,6 @@ namespace Common { QuickTimeParser::QuickTimeParser() { _beginOffset = 0; - _numStreams = 0; _fd = 0; _scaleFactorX = 1; _scaleFactorY = 1; @@ -68,10 +67,9 @@ bool QuickTimeParser::parseFile(const Common::String &filename) { return false; _foundMOOV = false; - _numStreams = 0; _disposeFileHandle = DisposeAfterUse::YES; - MOVatom atom = { 0, 0, 0xffffffff }; + Atom atom = { 0, 0, 0xffffffff }; if (_resFork->hasResFork()) { // Search for a 'moov' resource @@ -104,10 +102,9 @@ bool QuickTimeParser::parseFile(const Common::String &filename) { bool QuickTimeParser::parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { _fd = stream; _foundMOOV = false; - _numStreams = 0; _disposeFileHandle = disposeFileHandle; - MOVatom atom = { 0, 0, 0xffffffff }; + Atom atom = { 0, 0, 0xffffffff }; if (readDefault(atom) < 0 || !_foundMOOV) { close(); @@ -119,21 +116,19 @@ bool QuickTimeParser::parseStream(Common::SeekableReadStream *stream, DisposeAft } void QuickTimeParser::init() { - // Remove unknown/unhandled streams - for (uint32 i = 0; i < _numStreams;) { - if (_streams[i]->codec_type == CODEC_TYPE_MOV_OTHER) { - delete _streams[i]; - for (uint32 j = i + 1; j < _numStreams; j++) - _streams[j - 1] = _streams[j]; - _numStreams--; - } else - i++; + // Remove unknown/unhandled tracks + for (uint32 i = 0; i < _tracks.size(); i++) { + if (_tracks[i]->codecType == CODEC_TYPE_MOV_OTHER) { + delete _tracks[i]; + _tracks.remove_at(i); + i--; + } } // Adjust time scale - for (uint32 i = 0; i < _numStreams; i++) - if (!_streams[i]->time_scale) - _streams[i]->time_scale = _timeScale; + for (uint32 i = 0; i < _tracks.size(); i++) + if (!_tracks[i]->timeScale) + _tracks[i]->timeScale = _timeScale; } void QuickTimeParser::initParseTable() { @@ -170,9 +165,9 @@ void QuickTimeParser::initParseTable() { _parseTable = p; } -int QuickTimeParser::readDefault(MOVatom atom) { +int QuickTimeParser::readDefault(Atom atom) { uint32 total_size = 0; - MOVatom a; + Atom a; int err = 0; a.offset = atom.offset; @@ -240,14 +235,14 @@ int QuickTimeParser::readDefault(MOVatom atom) { return err; } -int QuickTimeParser::readLeaf(MOVatom atom) { +int QuickTimeParser::readLeaf(Atom atom) { if (atom.size > 1) _fd->seek(atom.size, SEEK_SET); return 0; } -int QuickTimeParser::readMOOV(MOVatom atom) { +int QuickTimeParser::readMOOV(Atom atom) { if (readDefault(atom) < 0) return -1; @@ -256,7 +251,7 @@ int QuickTimeParser::readMOOV(MOVatom atom) { return 1; } -int QuickTimeParser::readCMOV(MOVatom atom) { +int QuickTimeParser::readCMOV(Atom atom) { #ifdef USE_ZLIB // Read in the dcom atom _fd->readUint32BE(); @@ -294,7 +289,7 @@ int QuickTimeParser::readCMOV(MOVatom atom) { _fd = new Common::MemoryReadStream(uncompressedData, uncompressedSize, DisposeAfterUse::YES); // Read the contents of the uncompressed data - MOVatom a = { MKTAG('m', 'o', 'o', 'v'), 0, uncompressedSize }; + Atom a = { MKTAG('m', 'o', 'o', 'v'), 0, uncompressedSize }; int err = readDefault(a); // Assign the file handle back to the original handle @@ -309,7 +304,7 @@ int QuickTimeParser::readCMOV(MOVatom atom) { #endif } -int QuickTimeParser::readMVHD(MOVatom atom) { +int QuickTimeParser::readMVHD(Atom atom) { byte version = _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags @@ -358,21 +353,21 @@ int QuickTimeParser::readMVHD(MOVatom atom) { return 0; } -int QuickTimeParser::readTRAK(MOVatom atom) { - MOVStreamContext *sc = new MOVStreamContext(); +int QuickTimeParser::readTRAK(Atom atom) { + Track *track = new Track(); - if (!sc) + if (!track) return -1; - sc->codec_type = CODEC_TYPE_MOV_OTHER; - sc->start_time = 0; // XXX: check - _streams[_numStreams++] = sc; + track->codecType = CODEC_TYPE_MOV_OTHER; + track->startTime = 0; // XXX: check + _tracks.push_back(track); return readDefault(atom); } -int QuickTimeParser::readTKHD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readTKHD(Atom atom) { + Track *track = _tracks.back(); byte version = _fd->readByte(); _fd->readByte(); _fd->readByte(); @@ -392,9 +387,9 @@ int QuickTimeParser::readTKHD(MOVatom atom) { _fd->readUint32BE(); // modification time } - /* st->id = */_fd->readUint32BE(); // track id (NOT 0 !) + /* track->id = */_fd->readUint32BE(); // track id (NOT 0 !) _fd->readUint32BE(); // reserved - //st->start_time = 0; // check + //track->startTime = 0; // check (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // highlevel (considering edits) duration in movie timebase _fd->readUint32BE(); // reserved _fd->readUint32BE(); // reserved @@ -411,11 +406,11 @@ int QuickTimeParser::readTKHD(MOVatom atom) { uint32 yMod = _fd->readUint32BE(); _fd->skip(16); - st->scaleFactorX = Common::Rational(0x10000, xMod); - st->scaleFactorY = Common::Rational(0x10000, yMod); + track->scaleFactorX = Common::Rational(0x10000, xMod); + track->scaleFactorY = Common::Rational(0x10000, yMod); - st->scaleFactorX.debugPrint(1, "readTKHD(): scaleFactorX ="); - st->scaleFactorY.debugPrint(1, "readTKHD(): scaleFactorY ="); + track->scaleFactorX.debugPrint(1, "readTKHD(): scaleFactorX ="); + track->scaleFactorY.debugPrint(1, "readTKHD(): scaleFactorY ="); // these are fixed-point, 16:16 // uint32 tkWidth = _fd->readUint32BE() >> 16; // track width @@ -425,33 +420,33 @@ int QuickTimeParser::readTKHD(MOVatom atom) { } // edit list atom -int QuickTimeParser::readELST(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readELST(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->editCount = _fd->readUint32BE(); - st->editList = new EditListEntry[st->editCount]; + track->editCount = _fd->readUint32BE(); + track->editList = new EditListEntry[track->editCount]; - debug(2, "Track %d edit list count: %d", _numStreams - 1, st->editCount); + debug(2, "Track %d edit list count: %d", _tracks.size() - 1, track->editCount); - for (uint32 i = 0; i < st->editCount; i++){ - st->editList[i].trackDuration = _fd->readUint32BE(); - st->editList[i].mediaTime = _fd->readSint32BE(); - st->editList[i].mediaRate = Common::Rational(_fd->readUint32BE(), 0x10000); - debugN(3, "\tDuration = %d, Media Time = %d, ", st->editList[i].trackDuration, st->editList[i].mediaTime); - st->editList[i].mediaRate.debugPrint(3, "Media Rate ="); + for (uint32 i = 0; i < track->editCount; i++){ + track->editList[i].trackDuration = _fd->readUint32BE(); + track->editList[i].mediaTime = _fd->readSint32BE(); + track->editList[i].mediaRate = Common::Rational(_fd->readUint32BE(), 0x10000); + debugN(3, "\tDuration = %d, Media Time = %d, ", track->editList[i].trackDuration, track->editList[i].mediaTime); + track->editList[i].mediaRate.debugPrint(3, "Media Rate ="); } - if (st->editCount != 1) + if (track->editCount != 1) warning("Multiple edit list entries. Things may go awry"); return 0; } -int QuickTimeParser::readHDLR(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readHDLR(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags @@ -469,9 +464,9 @@ int QuickTimeParser::readHDLR(MOVatom atom) { debug(0, "MPEG-4 detected"); if (type == MKTAG('v', 'i', 'd', 'e')) - st->codec_type = CODEC_TYPE_VIDEO; + track->codecType = CODEC_TYPE_VIDEO; else if (type == MKTAG('s', 'o', 'u', 'n')) - st->codec_type = CODEC_TYPE_AUDIO; + track->codecType = CODEC_TYPE_AUDIO; _fd->readUint32BE(); // component manufacture _fd->readUint32BE(); // component flags @@ -489,8 +484,8 @@ int QuickTimeParser::readHDLR(MOVatom atom) { return 0; } -int QuickTimeParser::readMDHD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readMDHD(Atom atom) { + Track *track = _tracks.back(); byte version = _fd->readByte(); if (version > 1) @@ -507,8 +502,8 @@ int QuickTimeParser::readMDHD(MOVatom atom) { _fd->readUint32BE(); // modification time } - st->time_scale = _fd->readUint32BE(); - st->duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // duration + track->timeScale = _fd->readUint32BE(); + track->duration = (version == 1) ? (_fd->readUint32BE(), _fd->readUint32BE()) : _fd->readUint32BE(); // duration _fd->readUint16BE(); // language _fd->readUint16BE(); // quality @@ -516,17 +511,17 @@ int QuickTimeParser::readMDHD(MOVatom atom) { return 0; } -int QuickTimeParser::readSTSD(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTSD(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags uint32 entryCount = _fd->readUint32BE(); - st->sampleDescs.resize(entryCount); + track->sampleDescs.resize(entryCount); for (uint32 i = 0; i < entryCount; i++) { // Parsing Sample description table - MOVatom a = { 0, 0, 0 }; + Atom a = { 0, 0, 0 }; uint32 start_pos = _fd->pos(); int size = _fd->readUint32BE(); // size uint32 format = _fd->readUint32BE(); // data format @@ -535,11 +530,11 @@ int QuickTimeParser::readSTSD(MOVatom atom) { _fd->readUint16BE(); // reserved _fd->readUint16BE(); // index - st->sampleDescs[i] = readSampleDesc(st, format); + track->sampleDescs[i] = readSampleDesc(track, format); - debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), st->codec_type); + debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), track->codecType); - if (!st->sampleDescs[i]) { + if (!track->sampleDescs[i]) { // other codec type, just skip (rtp, mp4s, tmcd ...) _fd->seek(size - (_fd->pos() - start_pos), SEEK_CUR); } @@ -555,139 +550,139 @@ int QuickTimeParser::readSTSD(MOVatom atom) { return 0; } -int QuickTimeParser::readSTSC(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTSC(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->sample_to_chunk_sz = _fd->readUint32BE(); + track->sampleToChunkCount = _fd->readUint32BE(); - debug(0, "track[%i].stsc.entries = %i", _numStreams - 1, st->sample_to_chunk_sz); + debug(0, "track[%i].stsc.entries = %i", _tracks.size() - 1, track->sampleToChunkCount); - st->sample_to_chunk = new MOVstsc[st->sample_to_chunk_sz]; + track->sampleToChunk = new SampleToChunkEntry[track->sampleToChunkCount]; - if (!st->sample_to_chunk) + if (!track->sampleToChunk) return -1; - for (uint32 i = 0; i < st->sample_to_chunk_sz; i++) { - st->sample_to_chunk[i].first = _fd->readUint32BE() - 1; - st->sample_to_chunk[i].count = _fd->readUint32BE(); - st->sample_to_chunk[i].id = _fd->readUint32BE(); - //warning("Sample to Chunk[%d]: First = %d, Count = %d", i, st->sample_to_chunk[i].first, st->sample_to_chunk[i].count); + for (uint32 i = 0; i < track->sampleToChunkCount; i++) { + track->sampleToChunk[i].first = _fd->readUint32BE() - 1; + track->sampleToChunk[i].count = _fd->readUint32BE(); + track->sampleToChunk[i].id = _fd->readUint32BE(); + //warning("Sample to Chunk[%d]: First = %d, Count = %d", i, track->sampleToChunk[i].first, track->sampleToChunk[i].count); } return 0; } -int QuickTimeParser::readSTSS(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTSS(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->keyframe_count = _fd->readUint32BE(); + track->keyframeCount = _fd->readUint32BE(); - debug(0, "keyframe_count = %d", st->keyframe_count); + debug(0, "keyframeCount = %d", track->keyframeCount); - st->keyframes = new uint32[st->keyframe_count]; + track->keyframes = new uint32[track->keyframeCount]; - if (!st->keyframes) + if (!track->keyframes) return -1; - for (uint32 i = 0; i < st->keyframe_count; i++) { - st->keyframes[i] = _fd->readUint32BE() - 1; // Adjust here, the frames are based on 1 - debug(6, "keyframes[%d] = %d", i, st->keyframes[i]); + for (uint32 i = 0; i < track->keyframeCount; i++) { + track->keyframes[i] = _fd->readUint32BE() - 1; // Adjust here, the frames are based on 1 + debug(6, "keyframes[%d] = %d", i, track->keyframes[i]); } return 0; } -int QuickTimeParser::readSTSZ(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTSZ(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->sample_size = _fd->readUint32BE(); - st->sample_count = _fd->readUint32BE(); + track->sampleSize = _fd->readUint32BE(); + track->sampleCount = _fd->readUint32BE(); - debug(5, "sample_size = %d sample_count = %d", st->sample_size, st->sample_count); + debug(5, "sampleSize = %d sampleCount = %d", track->sampleSize, track->sampleCount); - if (st->sample_size) + if (track->sampleSize) return 0; // there isn't any table following - st->sample_sizes = new uint32[st->sample_count]; + track->sampleSizes = new uint32[track->sampleCount]; - if (!st->sample_sizes) + if (!track->sampleSizes) return -1; - for(uint32 i = 0; i < st->sample_count; i++) { - st->sample_sizes[i] = _fd->readUint32BE(); - debug(6, "sample_sizes[%d] = %d", i, st->sample_sizes[i]); + for(uint32 i = 0; i < track->sampleCount; i++) { + track->sampleSizes[i] = _fd->readUint32BE(); + debug(6, "sampleSizes[%d] = %d", i, track->sampleSizes[i]); } return 0; } -int QuickTimeParser::readSTTS(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTTS(Atom atom) { + Track *track = _tracks.back(); uint32 totalSampleCount = 0; _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->stts_count = _fd->readUint32BE(); - st->stts_data = new MOVstts[st->stts_count]; + track->timeToSampleCount = _fd->readUint32BE(); + track->timeToSample = new TimeToSampleEntry[track->timeToSampleCount]; - debug(0, "track[%d].stts.entries = %d", _numStreams - 1, st->stts_count); + debug(0, "track[%d].stts.entries = %d", _tracks.size() - 1, track->timeToSampleCount); - for (int32 i = 0; i < st->stts_count; i++) { - st->stts_data[i].count = _fd->readUint32BE(); - st->stts_data[i].duration = _fd->readUint32BE(); + for (int32 i = 0; i < track->timeToSampleCount; i++) { + track->timeToSample[i].count = _fd->readUint32BE(); + track->timeToSample[i].duration = _fd->readUint32BE(); - debug(1, "\tCount = %d, Duration = %d", st->stts_data[i].count, st->stts_data[i].duration); + debug(1, "\tCount = %d, Duration = %d", track->timeToSample[i].count, track->timeToSample[i].duration); - totalSampleCount += st->stts_data[i].count; + totalSampleCount += track->timeToSample[i].count; } - st->nb_frames = totalSampleCount; + track->frameCount = totalSampleCount; return 0; } -int QuickTimeParser::readSTCO(MOVatom atom) { - MOVStreamContext *st = _streams[_numStreams - 1]; +int QuickTimeParser::readSTCO(Atom atom) { + Track *track = _tracks.back(); _fd->readByte(); // version _fd->readByte(); _fd->readByte(); _fd->readByte(); // flags - st->chunk_count = _fd->readUint32BE(); - st->chunk_offsets = new uint32[st->chunk_count]; + track->chunkCount = _fd->readUint32BE(); + track->chunkOffsets = new uint32[track->chunkCount]; - if (!st->chunk_offsets) + if (!track->chunkOffsets) return -1; - for (uint32 i = 0; i < st->chunk_count; i++) { + for (uint32 i = 0; i < track->chunkCount; i++) { // WORKAROUND/HACK: The offsets in Riven videos (ones inside the Mohawk archives themselves) // have offsets relative to the archive and not the video. This is quite nasty. We subtract // the initial offset of the stream to get the correct value inside of the stream. - st->chunk_offsets[i] = _fd->readUint32BE() - _beginOffset; + track->chunkOffsets[i] = _fd->readUint32BE() - _beginOffset; } return 0; } -int QuickTimeParser::readWAVE(MOVatom atom) { - if (_numStreams < 1) +int QuickTimeParser::readWAVE(Atom atom) { + if (_tracks.empty()) return 0; - MOVStreamContext *st = _streams[_numStreams - 1]; + Track *track = _tracks.back(); if (atom.size > (1 << 30)) return -1; - if (st->sampleDescs[0]->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extradata for QDM2 - st->extradata = _fd->readStream(atom.size - 8); + if (track->sampleDescs[0]->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extra data for QDM2 + track->extraData = _fd->readStream(atom.size - 8); else if (atom.size > 8) return readDefault(atom); else @@ -723,11 +718,11 @@ static void readMP4Desc(Common::SeekableReadStream *stream, byte &tag, int &leng length = readMP4DescLength(stream); } -int QuickTimeParser::readESDS(MOVatom atom) { - if (_numStreams < 1) +int QuickTimeParser::readESDS(Atom atom) { + if (_tracks.empty()) return 0; - MOVStreamContext *st = _streams[_numStreams - 1]; + Track *track = _tracks.back(); _fd->readUint32BE(); // version + flags @@ -744,7 +739,7 @@ int QuickTimeParser::readESDS(MOVatom atom) { if (tag != kMP4DecConfigDescTag) return 0; - st->objectTypeMP4 = _fd->readByte(); + track->objectTypeMP4 = _fd->readByte(); _fd->readByte(); // stream type _fd->readUint16BE(); _fd->readByte(); // buffer size _fd->readUint32BE(); // max bitrate @@ -755,17 +750,17 @@ int QuickTimeParser::readESDS(MOVatom atom) { if (tag != kMP4DecSpecificDescTag) return 0; - st->extradata = _fd->readStream(length); + track->extraData = _fd->readStream(length); - debug(0, "MPEG-4 object type = %02x", st->objectTypeMP4); + debug(0, "MPEG-4 object type = %02x", track->objectTypeMP4); return 0; } void QuickTimeParser::close() { - for (uint32 i = 0; i < _numStreams; i++) - delete _streams[i]; + for (uint32 i = 0; i < _tracks.size(); i++) + delete _tracks[i]; - _numStreams = 0; + _tracks.clear(); if (_disposeFileHandle == DisposeAfterUse::YES) delete _fd; @@ -773,44 +768,44 @@ void QuickTimeParser::close() { _fd = 0; } -QuickTimeParser::SampleDesc::SampleDesc(MOVStreamContext *parentStream, uint32 codecTag) { - _parentStream = parentStream; +QuickTimeParser::SampleDesc::SampleDesc(Track *parentTrack, uint32 codecTag) { + _parentTrack = parentTrack; _codecTag = codecTag; } -QuickTimeParser::MOVStreamContext::MOVStreamContext() { - chunk_count = 0; - chunk_offsets = 0; - stts_count = 0; - stts_data = 0; - sample_to_chunk_sz = 0; - sample_to_chunk = 0; - sample_size = 0; - sample_count = 0; - sample_sizes = 0; - keyframe_count = 0; +QuickTimeParser::Track::Track() { + chunkCount = 0; + chunkOffsets = 0; + timeToSampleCount = 0; + timeToSample = 0; + sampleToChunkCount = 0; + sampleToChunk = 0; + sampleSize = 0; + sampleCount = 0; + sampleSizes = 0; + keyframeCount = 0; keyframes = 0; - time_scale = 0; + timeScale = 0; width = 0; height = 0; - codec_type = CODEC_TYPE_MOV_OTHER; + codecType = CODEC_TYPE_MOV_OTHER; editCount = 0; editList = 0; - extradata = 0; - nb_frames = 0; + extraData = 0; + frameCount = 0; duration = 0; - start_time = 0; + startTime = 0; objectTypeMP4 = 0; } -QuickTimeParser::MOVStreamContext::~MOVStreamContext() { - delete[] chunk_offsets; - delete[] stts_data; - delete[] sample_to_chunk; - delete[] sample_sizes; +QuickTimeParser::Track::~Track() { + delete[] chunkOffsets; + delete[] timeToSample; + delete[] sampleToChunk; + delete[] sampleSizes; delete[] keyframes; delete[] editList; - delete extradata; + delete extraData; for (uint32 i = 0; i < sampleDescs.size(); i++) delete sampleDescs[i]; diff --git a/common/quicktime.h b/common/quicktime.h index 2bd461e38961..cb2bed1202ed 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -88,23 +88,23 @@ class QuickTimeParser { DisposeAfterUse::Flag _disposeFileHandle; - struct MOVatom { + struct Atom { uint32 type; uint32 offset; uint32 size; }; struct ParseTable { - int (QuickTimeParser::*func)(MOVatom atom); + int (QuickTimeParser::*func)(Atom atom); uint32 type; }; - struct MOVstts { + struct TimeToSampleEntry { int count; int duration; }; - struct MOVstsc { + struct SampleToChunkEntry { uint32 first; uint32 count; uint32 id; @@ -116,17 +116,17 @@ class QuickTimeParser { Common::Rational mediaRate; }; - struct MOVStreamContext; + struct Track; class SampleDesc { public: - SampleDesc(MOVStreamContext *parentStream, uint32 codecTag); + SampleDesc(Track *parentTrack, uint32 codecTag); virtual ~SampleDesc() {} uint32 getCodecTag() const { return _codecTag; } protected: - MOVStreamContext *_parentStream; + Track *_parentTrack; uint32 _codecTag; }; @@ -136,77 +136,76 @@ class QuickTimeParser { CODEC_TYPE_AUDIO }; - struct MOVStreamContext { - MOVStreamContext(); - ~MOVStreamContext(); - - uint32 chunk_count; - uint32 *chunk_offsets; - int stts_count; - MOVstts *stts_data; - uint32 sample_to_chunk_sz; - MOVstsc *sample_to_chunk; - uint32 sample_size; - uint32 sample_count; - uint32 *sample_sizes; - uint32 keyframe_count; + struct Track { + Track(); + ~Track(); + + uint32 chunkCount; + uint32 *chunkOffsets; + int timeToSampleCount; + TimeToSampleEntry *timeToSample; + uint32 sampleToChunkCount; + SampleToChunkEntry *sampleToChunk; + uint32 sampleSize; + uint32 sampleCount; + uint32 *sampleSizes; + uint32 keyframeCount; uint32 *keyframes; - int32 time_scale; + int32 timeScale; uint16 width; uint16 height; - CodecType codec_type; + CodecType codecType; Common::Array sampleDescs; uint32 editCount; EditListEntry *editList; - Common::SeekableReadStream *extradata; + Common::SeekableReadStream *extraData; - uint32 nb_frames; + uint32 frameCount; uint32 duration; - uint32 start_time; + uint32 startTime; Common::Rational scaleFactorX; Common::Rational scaleFactorY; byte objectTypeMP4; }; - virtual SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format) = 0; + virtual SampleDesc *readSampleDesc(Track *track, uint32 format) = 0; const ParseTable *_parseTable; bool _foundMOOV; uint32 _timeScale; uint32 _duration; - uint32 _numStreams; Common::Rational _scaleFactorX; Common::Rational _scaleFactorY; - MOVStreamContext *_streams[20]; + Common::Array _tracks; uint32 _beginOffset; Common::MacResManager *_resFork; void initParseTable(); void init(); - int readDefault(MOVatom atom); - int readLeaf(MOVatom atom); - int readELST(MOVatom atom); - int readHDLR(MOVatom atom); - int readMDHD(MOVatom atom); - int readMOOV(MOVatom atom); - int readMVHD(MOVatom atom); - int readTKHD(MOVatom atom); - int readTRAK(MOVatom atom); - int readSTCO(MOVatom atom); - int readSTSC(MOVatom atom); - int readSTSD(MOVatom atom); - int readSTSS(MOVatom atom); - int readSTSZ(MOVatom atom); - int readSTTS(MOVatom atom); - int readCMOV(MOVatom atom); - int readWAVE(MOVatom atom); - int readESDS(MOVatom atom); + int readDefault(Atom atom); + int readLeaf(Atom atom); + int readELST(Atom atom); + int readHDLR(Atom atom); + int readMDHD(Atom atom); + int readMOOV(Atom atom); + int readMVHD(Atom atom); + int readTKHD(Atom atom); + int readTRAK(Atom atom); + int readSTCO(Atom atom); + int readSTSC(Atom atom); + int readSTSD(Atom atom); + int readSTSS(Atom atom); + int readSTSZ(Atom atom); + int readSTTS(Atom atom); + int readCMOV(Atom atom); + int readWAVE(Atom atom); + int readESDS(Atom atom); }; } // End of namespace Common diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index dbf860373523..9575845cd344 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -69,50 +69,50 @@ QuickTimeDecoder::~QuickTimeDecoder() { } uint16 QuickTimeDecoder::getWidth() const { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 0; - return (Common::Rational(_streams[_videoStreamIndex]->width) / getScaleFactorX()).toInt(); + return (Common::Rational(_tracks[_videoTrackIndex]->width) / getScaleFactorX()).toInt(); } uint16 QuickTimeDecoder::getHeight() const { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 0; - return (Common::Rational(_streams[_videoStreamIndex]->height) / getScaleFactorY()).toInt(); + return (Common::Rational(_tracks[_videoTrackIndex]->height) / getScaleFactorY()).toInt(); } uint32 QuickTimeDecoder::getFrameCount() const { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 0; - return _streams[_videoStreamIndex]->nb_frames; + return _tracks[_videoTrackIndex]->frameCount; } Common::Rational QuickTimeDecoder::getScaleFactorX() const { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 1; - return (_scaleFactorX * _streams[_videoStreamIndex]->scaleFactorX); + return (_scaleFactorX * _tracks[_videoTrackIndex]->scaleFactorX); } Common::Rational QuickTimeDecoder::getScaleFactorY() const { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 1; - return (_scaleFactorY * _streams[_videoStreamIndex]->scaleFactorY); + return (_scaleFactorY * _tracks[_videoTrackIndex]->scaleFactorY); } uint32 QuickTimeDecoder::getFrameDuration() { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return 0; uint32 curFrameIndex = 0; - for (int32 i = 0; i < _streams[_videoStreamIndex]->stts_count; i++) { - curFrameIndex += _streams[_videoStreamIndex]->stts_data[i].count; + for (int32 i = 0; i < _tracks[_videoTrackIndex]->timeToSampleCount; i++) { + curFrameIndex += _tracks[_videoTrackIndex]->timeToSample[i].count; if ((uint32)_curFrame < curFrameIndex) { // Ok, now we have what duration this frame has. - return _streams[_videoStreamIndex]->stts_data[i].duration; + return _tracks[_videoTrackIndex]->timeToSample[i].duration; } } @@ -131,17 +131,17 @@ Graphics::PixelFormat QuickTimeDecoder::getPixelFormat() const { } uint32 QuickTimeDecoder::findKeyFrame(uint32 frame) const { - for (int i = _streams[_videoStreamIndex]->keyframe_count - 1; i >= 0; i--) - if (_streams[_videoStreamIndex]->keyframes[i] <= frame) - return _streams[_videoStreamIndex]->keyframes[i]; + for (int i = _tracks[_videoTrackIndex]->keyframeCount - 1; i >= 0; i--) + if (_tracks[_videoTrackIndex]->keyframes[i] <= frame) + return _tracks[_videoTrackIndex]->keyframes[i]; // If none found, we'll assume the requested frame is a key frame return frame; } void QuickTimeDecoder::seekToFrame(uint32 frame) { - assert(_videoStreamIndex >= 0); - assert(frame < _streams[_videoStreamIndex]->nb_frames); + assert(_videoTrackIndex >= 0); + assert(frame < _tracks[_videoTrackIndex]->frameCount); // Stop all audio (for now) stopAudio(); @@ -155,20 +155,20 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { _nextFrameStartTime = 0; uint32 curFrame = 0; - for (int32 i = 0; i < _streams[_videoStreamIndex]->stts_count && curFrame < frame; i++) { - for (int32 j = 0; j < _streams[_videoStreamIndex]->stts_data[i].count && curFrame < frame; j++) { + for (int32 i = 0; i < _tracks[_videoTrackIndex]->timeToSampleCount && curFrame < frame; i++) { + for (int32 j = 0; j < _tracks[_videoTrackIndex]->timeToSample[i].count && curFrame < frame; j++) { curFrame++; - _nextFrameStartTime += _streams[_videoStreamIndex]->stts_data[i].duration; + _nextFrameStartTime += _tracks[_videoTrackIndex]->timeToSample[i].duration; } } // Adjust the video starting point - const Audio::Timestamp curVideoTime(0, _nextFrameStartTime, _streams[_videoStreamIndex]->time_scale); + const Audio::Timestamp curVideoTime(0, _nextFrameStartTime, _tracks[_videoTrackIndex]->timeScale); _startTime = g_system->getMillis() - curVideoTime.msecs(); resetPauseStartTime(); // Adjust the audio starting point - if (_audioStreamIndex >= 0) { + if (_audioTrackIndex >= 0) { _audioStartOffset = curVideoTime; // Seek to the new audio location @@ -181,17 +181,17 @@ void QuickTimeDecoder::seekToFrame(uint32 frame) { void QuickTimeDecoder::seekToTime(Audio::Timestamp time) { // Use makeQuickTimeStream() instead - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) error("Audio-only seeking not supported"); // Try to find the last frame that should have been decoded uint32 frame = 0; - Audio::Timestamp totalDuration(0, _streams[_videoStreamIndex]->time_scale); + Audio::Timestamp totalDuration(0, _tracks[_videoTrackIndex]->timeScale); bool done = false; - for (int32 i = 0; i < _streams[_videoStreamIndex]->stts_count && !done; i++) { - for (int32 j = 0; j < _streams[_videoStreamIndex]->stts_data[i].count; j++) { - totalDuration = totalDuration.addFrames(_streams[_videoStreamIndex]->stts_data[i].duration); + for (int32 i = 0; i < _tracks[_videoTrackIndex]->timeToSampleCount && !done; i++) { + for (int32 j = 0; j < _tracks[_videoTrackIndex]->timeToSample[i].count; j++) { + totalDuration = totalDuration.addFrames(_tracks[_videoTrackIndex]->timeToSample[i].duration); if (totalDuration > time) { done = true; break; @@ -221,14 +221,14 @@ void QuickTimeDecoder::pauseVideoIntern(bool pause) { } Codec *QuickTimeDecoder::findDefaultVideoCodec() const { - if (_videoStreamIndex < 0 || _streams[_videoStreamIndex]->sampleDescs.empty()) + if (_videoTrackIndex < 0 || _tracks[_videoTrackIndex]->sampleDescs.empty()) return 0; - return ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[0])->_videoCodec; + return ((VideoSampleDesc *)_tracks[_videoTrackIndex]->sampleDescs[0])->_videoCodec; } const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { - if (_videoStreamIndex < 0 || _curFrame >= (int32)getFrameCount() - 1) + if (_videoTrackIndex < 0 || _curFrame >= (int32)getFrameCount() - 1) return 0; if (_startTime == 0) @@ -244,11 +244,11 @@ const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { uint32 descId; Common::SeekableReadStream *frameData = getNextFramePacket(descId); - if (!frameData || !descId || descId > _streams[_videoStreamIndex]->sampleDescs.size()) + if (!frameData || !descId || descId > _tracks[_videoTrackIndex]->sampleDescs.size()) return 0; // Find which video description entry we want - VideoSampleDesc *entry = (VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[descId - 1]; + VideoSampleDesc *entry = (VideoSampleDesc *)_tracks[_videoTrackIndex]->sampleDescs[descId - 1]; if (!entry->_videoCodec) return 0; @@ -305,7 +305,7 @@ uint32 QuickTimeDecoder::getTimeToNextFrame() const { return 0; // Convert from the QuickTime rate base to 1000 - uint32 nextFrameStartTime = _nextFrameStartTime * 1000 / _streams[_videoStreamIndex]->time_scale; + uint32 nextFrameStartTime = _nextFrameStartTime * 1000 / _tracks[_videoTrackIndex]->timeScale; uint32 elapsedTime = getElapsedTime(); if (nextFrameStartTime <= elapsedTime) @@ -333,13 +333,13 @@ bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { void QuickTimeDecoder::init() { Audio::QuickTimeAudioDecoder::init(); - _videoStreamIndex = -1; + _videoTrackIndex = -1; _startTime = 0; // Find video streams - for (uint32 i = 0; i < _numStreams; i++) - if (_streams[i]->codec_type == CODEC_TYPE_VIDEO && _videoStreamIndex < 0) - _videoStreamIndex = i; + for (uint32 i = 0; i < _tracks.size(); i++) + if (_tracks[i]->codecType == CODEC_TYPE_VIDEO && _videoTrackIndex < 0) + _videoTrackIndex = i; // Start the audio codec if we've got one that we can handle if (_audStream) { @@ -348,9 +348,9 @@ void QuickTimeDecoder::init() { } // Initialize video, if present - if (_videoStreamIndex >= 0) { - for (uint32 i = 0; i < _streams[_videoStreamIndex]->sampleDescs.size(); i++) - ((VideoSampleDesc *)_streams[_videoStreamIndex]->sampleDescs[i])->initCodec(); + if (_videoTrackIndex >= 0) { + for (uint32 i = 0; i < _tracks[_videoTrackIndex]->sampleDescs.size(); i++) + ((VideoSampleDesc *)_tracks[_videoTrackIndex]->sampleDescs[i])->initCodec(); if (getScaleFactorX() != 1 || getScaleFactorY() != 1) { // We have to initialize the scaled surface @@ -360,11 +360,11 @@ void QuickTimeDecoder::init() { } } -Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamContext *st, uint32 format) { - if (st->codec_type == CODEC_TYPE_VIDEO) { +Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Track *track, uint32 format) { + if (track->codecType == CODEC_TYPE_VIDEO) { debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); - VideoSampleDesc *entry = new VideoSampleDesc(st, format); + VideoSampleDesc *entry = new VideoSampleDesc(track, format); _fd->readUint16BE(); // version _fd->readUint16BE(); // revision level @@ -378,21 +378,21 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC // The width is most likely invalid for entries after the first one // so only set the overall width if it is not zero here. if (width) - st->width = width; + track->width = width; if (height) - st->height = height; + track->height = height; _fd->readUint32BE(); // horiz resolution _fd->readUint32BE(); // vert resolution _fd->readUint32BE(); // data size, always 0 _fd->readUint16BE(); // frames per samples - byte codec_name[32]; - _fd->read(codec_name, 32); // codec name, pascal string (FIXME: true for mp4?) - if (codec_name[0] <= 31) { - memcpy(entry->_codecName, &codec_name[1], codec_name[0]); - entry->_codecName[codec_name[0]] = 0; + byte codecName[32]; + _fd->read(codecName, 32); // codec name, pascal string (FIXME: true for mp4?) + if (codecName[0] <= 31) { + memcpy(entry->_codecName, &codecName[1], codecName[0]); + entry->_codecName[codecName[0]] = 0; } entry->_bitsPerSample = _fd->readUint16BE(); // depth @@ -455,7 +455,7 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(MOVStreamC } // Pass it on up - return Audio::QuickTimeAudioDecoder::readSampleDesc(st, format); + return Audio::QuickTimeAudioDecoder::readSampleDesc(track, format); } void QuickTimeDecoder::close() { @@ -472,7 +472,7 @@ void QuickTimeDecoder::close() { } Common::SeekableReadStream *QuickTimeDecoder::getNextFramePacket(uint32 &descId) { - if (_videoStreamIndex < 0) + if (_videoTrackIndex < 0) return NULL; // First, we have to track down which chunk holds the sample and which sample in the chunk contains the frame we are looking for. @@ -480,22 +480,22 @@ Common::SeekableReadStream *QuickTimeDecoder::getNextFramePacket(uint32 &descId) int32 sampleInChunk = 0; int32 actualChunk = -1; - for (uint32 i = 0; i < _streams[_videoStreamIndex]->chunk_count; i++) { + for (uint32 i = 0; i < _tracks[_videoTrackIndex]->chunkCount; i++) { int32 sampleToChunkIndex = -1; - for (uint32 j = 0; j < _streams[_videoStreamIndex]->sample_to_chunk_sz; j++) - if (i >= _streams[_videoStreamIndex]->sample_to_chunk[j].first) + for (uint32 j = 0; j < _tracks[_videoTrackIndex]->sampleToChunkCount; j++) + if (i >= _tracks[_videoTrackIndex]->sampleToChunk[j].first) sampleToChunkIndex = j; if (sampleToChunkIndex < 0) error("This chunk (%d) is imaginary", sampleToChunkIndex); - totalSampleCount += _streams[_videoStreamIndex]->sample_to_chunk[sampleToChunkIndex].count; + totalSampleCount += _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].count; if (totalSampleCount > getCurFrame()) { actualChunk = i; - descId = _streams[_videoStreamIndex]->sample_to_chunk[sampleToChunkIndex].id; - sampleInChunk = _streams[_videoStreamIndex]->sample_to_chunk[sampleToChunkIndex].count - totalSampleCount + getCurFrame(); + descId = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].id; + sampleInChunk = _tracks[_videoTrackIndex]->sampleToChunk[sampleToChunkIndex].count - totalSampleCount + getCurFrame(); break; } } @@ -506,23 +506,23 @@ Common::SeekableReadStream *QuickTimeDecoder::getNextFramePacket(uint32 &descId) } // Next seek to that frame - _fd->seek(_streams[_videoStreamIndex]->chunk_offsets[actualChunk]); + _fd->seek(_tracks[_videoTrackIndex]->chunkOffsets[actualChunk]); // Then, if the chunk holds more than one frame, seek to where the frame we want is located for (int32 i = getCurFrame() - sampleInChunk; i < getCurFrame(); i++) { - if (_streams[_videoStreamIndex]->sample_size != 0) - _fd->skip(_streams[_videoStreamIndex]->sample_size); + if (_tracks[_videoTrackIndex]->sampleSize != 0) + _fd->skip(_tracks[_videoTrackIndex]->sampleSize); else - _fd->skip(_streams[_videoStreamIndex]->sample_sizes[i]); + _fd->skip(_tracks[_videoTrackIndex]->sampleSizes[i]); } // Finally, read in the raw data for the frame - //printf ("Frame Data[%d]: Offset = %d, Size = %d\n", getCurFrame(), _fd->pos(), _streams[_videoStreamIndex]->sample_sizes[getCurFrame()]); + //printf ("Frame Data[%d]: Offset = %d, Size = %d\n", getCurFrame(), _fd->pos(), _tracks[_videoTrackIndex]->sampleSizes[getCurFrame()]); - if (_streams[_videoStreamIndex]->sample_size != 0) - return _fd->readStream(_streams[_videoStreamIndex]->sample_size); + if (_tracks[_videoTrackIndex]->sampleSize != 0) + return _fd->readStream(_tracks[_videoTrackIndex]->sampleSize); - return _fd->readStream(_streams[_videoStreamIndex]->sample_sizes[getCurFrame()]); + return _fd->readStream(_tracks[_videoTrackIndex]->sampleSizes[getCurFrame()]); } void QuickTimeDecoder::updateAudioBuffer() { @@ -531,21 +531,21 @@ void QuickTimeDecoder::updateAudioBuffer() { uint32 numberOfChunksNeeded = 0; - if (_videoStreamIndex < 0 || _curFrame == (int32)_streams[_videoStreamIndex]->nb_frames - 1) { + if (_videoTrackIndex < 0 || _curFrame == (int32)_tracks[_videoTrackIndex]->frameCount - 1) { // If we have no video, there's nothing to base our buffer against // However, one must ask why a QuickTimeDecoder is being used instead of the nice makeQuickTimeStream() function // If we're on the last frame, make sure all audio remaining is buffered - numberOfChunksNeeded = _streams[_audioStreamIndex]->chunk_count; + numberOfChunksNeeded = _tracks[_audioTrackIndex]->chunkCount; } else { - Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_streams[_audioStreamIndex]->sampleDescs[0]; + Audio::QuickTimeAudioDecoder::AudioSampleDesc *entry = (Audio::QuickTimeAudioDecoder::AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0]; // Calculate the amount of chunks we need in memory until the next frame uint32 timeToNextFrame = getTimeToNextFrame(); uint32 timeFilled = 0; uint32 curAudioChunk = _curAudioChunk - _audStream->numQueuedStreams(); - for (; timeFilled < timeToNextFrame && curAudioChunk < _streams[_audioStreamIndex]->chunk_count; numberOfChunksNeeded++, curAudioChunk++) { + for (; timeFilled < timeToNextFrame && curAudioChunk < _tracks[_audioTrackIndex]->chunkCount; numberOfChunksNeeded++, curAudioChunk++) { uint32 sampleCount = entry->getAudioChunkSampleCount(curAudioChunk); assert(sampleCount); @@ -557,11 +557,11 @@ void QuickTimeDecoder::updateAudioBuffer() { } // Keep three streams in buffer so that if/when the first two end, it goes right into the next - while (_audStream->numQueuedStreams() < numberOfChunksNeeded && _curAudioChunk < _streams[_audioStreamIndex]->chunk_count) + while (_audStream->numQueuedStreams() < numberOfChunksNeeded && _curAudioChunk < _tracks[_audioTrackIndex]->chunkCount) queueNextAudioChunk(); } -QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentStream, codecTag) { +QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentTrack, codecTag) { memset(_codecName, 0, 32); _colorTableId = 0; _palette = 0; @@ -582,15 +582,15 @@ void QuickTimeDecoder::VideoSampleDesc::initCodec() { break; case MKTAG('r','p','z','a'): // Apple Video ("Road Pizza"): Used by some Myst videos. - _videoCodec = new RPZADecoder(_parentStream->width, _parentStream->height); + _videoCodec = new RPZADecoder(_parentTrack->width, _parentTrack->height); break; case MKTAG('r','l','e',' '): // QuickTime RLE: Used by some Myst ME videos. - _videoCodec = new QTRLEDecoder(_parentStream->width, _parentStream->height, _bitsPerSample & 0x1f); + _videoCodec = new QTRLEDecoder(_parentTrack->width, _parentTrack->height, _bitsPerSample & 0x1f); break; case MKTAG('s','m','c',' '): // Apple SMC: Used by some Myst videos. - _videoCodec = new SMCDecoder(_parentStream->width, _parentStream->height); + _videoCodec = new SMCDecoder(_parentTrack->width, _parentTrack->height); break; case MKTAG('S','V','Q','1'): // Sorenson Video 1: Used by some Myst ME videos. @@ -606,7 +606,7 @@ void QuickTimeDecoder::VideoSampleDesc::initCodec() { break; case MKTAG('Q','k','B','k'): // CDToons: Used by most of the Broderbund games. - _videoCodec = new CDToonsDecoder(_parentStream->width, _parentStream->height); + _videoCodec = new CDToonsDecoder(_parentTrack->width, _parentTrack->height); break; default: warning("Unsupported codec \'%s\'", tag2str(_codecTag)); diff --git a/video/qt_decoder.h b/video/qt_decoder.h index e3955d7d3bcf..b51fd043e7e5 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -116,7 +116,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAud protected: class VideoSampleDesc : public Common::QuickTimeParser::SampleDesc { public: - VideoSampleDesc(Common::QuickTimeParser::MOVStreamContext *parentStream, uint32 codecTag); + VideoSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag); ~VideoSampleDesc(); void initCodec(); @@ -129,7 +129,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAud Codec *_videoCodec; }; - Common::QuickTimeParser::SampleDesc *readSampleDesc(MOVStreamContext *st, uint32 format); + Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format); private: Common::SeekableReadStream *getNextFramePacket(uint32 &descId); @@ -146,7 +146,7 @@ class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAud Codec *createCodec(uint32 codecTag, byte bitsPerPixel); Codec *findDefaultVideoCodec() const; uint32 _nextFrameStartTime; - int8 _videoStreamIndex; + int _videoTrackIndex; uint32 findKeyFrame(uint32 frame) const; bool _dirtyPalette;