[Scummvm-cvs-logs] SF.net SVN: scummvm:[55003] scummvm/trunk/engines/sci
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Wed Dec 22 14:51:35 CET 2010
Revision: 55003
http://scummvm.svn.sourceforge.net/scummvm/?rev=55003&view=rev
Author: thebluegr
Date: 2010-12-22 13:51:35 +0000 (Wed, 22 Dec 2010)
Log Message:
-----------
SCI: VMD video related changes
- VMD videos are now properly started from the associated play subop of the
kPlayVMD kernel call, and are now properly positioned on screen, and doubled
only if the games require them to be
- Added an enum for VMD video flags
Modified Paths:
--------------
scummvm/trunk/engines/sci/console.cpp
scummvm/trunk/engines/sci/engine/kvideo.cpp
scummvm/trunk/engines/sci/engine/state.cpp
scummvm/trunk/engines/sci/engine/state.h
Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp 2010-12-22 13:17:19 UTC (rev 55002)
+++ scummvm/trunk/engines/sci/console.cpp 2010-12-22 13:51:35 UTC (rev 55003)
@@ -226,7 +226,7 @@
_engine->pauseEngine(true);
}
-extern void playVideo(Graphics::VideoDecoder *videoDecoder);
+extern void playVideo(Graphics::VideoDecoder *videoDecoder, VideoState videoState);
void Console::postEnter() {
if (!_videoFile.empty()) {
@@ -272,7 +272,10 @@
}
#endif
- playVideo(videoDecoder);
+ VideoState emptyState;
+ emptyState.fileName = _videoFile;
+ emptyState.flags = kDoubled; // always allow the videos to be double sized
+ playVideo(videoDecoder, emptyState);
#ifdef ENABLE_SCI32
// Switch back to 8bpp if we played a duck video
Modified: scummvm/trunk/engines/sci/engine/kvideo.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kvideo.cpp 2010-12-22 13:17:19 UTC (rev 55002)
+++ scummvm/trunk/engines/sci/engine/kvideo.cpp 2010-12-22 13:51:35 UTC (rev 55003)
@@ -39,7 +39,7 @@
namespace Sci {
-void playVideo(Graphics::VideoDecoder *videoDecoder) {
+void playVideo(Graphics::VideoDecoder *videoDecoder, VideoState videoState) {
if (!videoDecoder)
return;
@@ -50,16 +50,24 @@
uint16 pitch = videoDecoder->getWidth() * bytesPerPixel;
uint16 screenWidth = g_system->getWidth();
uint16 screenHeight = g_system->getHeight();
+ bool isVMD = videoState.fileName.hasSuffix(".vmd");
- if (screenWidth == 640 && width <= 320 && height <= 240) {
+ if (screenWidth == 640 && width <= 320 && height <= 240 && ((videoState.flags & kDoubled) || !isVMD)) {
width *= 2;
height *= 2;
pitch *= 2;
scaleBuffer = new byte[width * height * bytesPerPixel];
}
- uint16 x = (screenWidth - width) / 2;
- uint16 y = (screenHeight - height) / 2;
+ uint16 x, y;
+
+ if (videoState.x > 0 && videoState.y > 0 && isVMD) {
+ x = videoState.x;
+ y = videoState.y;
+ } else {
+ x = (screenWidth - width) / 2;
+ y = (screenHeight - height) / 2;
+ }
bool skipVideo = false;
if (videoDecoder->hasDirtyPalette())
@@ -172,7 +180,7 @@
}
if (videoDecoder) {
- playVideo(videoDecoder);
+ playVideo(videoDecoder, s->_videoState);
// HACK: Switch back to 8bpp if we played a QuickTime video.
// We also won't be copying the screen to the SCI screen...
@@ -196,32 +204,17 @@
uint16 operation = argv[0].toUint16();
Graphics::VideoDecoder *videoDecoder = 0;
bool reshowCursor = g_sci->_gfxCursor->isVisible();
- Common::String fileName, warningMsg;
+ Common::String warningMsg;
switch (operation) {
case 0: // init
- // This is actually meant to init the video file, but we play it instead
- fileName = s->_segMan->derefString(argv[1]);
+ s->_videoState.reset();
+ s->_videoState.fileName = s->_segMan->derefString(argv[1]);
// TODO: argv[2] (usually null). When it exists, it points to an "Event" object,
// that holds no data initially (e.g. in the intro of Phantasmagoria 1 demo).
// Perhaps it's meant for syncing
if (argv[2] != NULL_REG)
warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x - %s)", PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]));
-
- videoDecoder = new Graphics::VMDDecoder(g_system->getMixer());
-
- if (!videoDecoder->loadFile(fileName)) {
- warning("Could not open VMD %s", fileName.c_str());
- break;
- }
-
- if (reshowCursor)
- g_sci->_gfxCursor->kernelHide();
-
- playVideo(videoDecoder);
-
- if (reshowCursor)
- g_sci->_gfxCursor->kernelShow();
break;
case 1:
{
@@ -229,17 +222,6 @@
//
// x, y, flags, gammaBoost, gammaFirst, gammaLast
//
- // Flags are as follows:
- // bit 0 doubled
- // bit 1 "drop frames"?
- // bit 2 insert black lines
- // bit 3 unknown
- // bit 4 gamma correction
- // bit 5 hold black frame
- // bit 6 hold last frame
- // bit 7 unknown
- // bit 8 stretch
-
// gammaBoost boosts palette colors in the range gammaFirst to
// gammaLast, but only if bit 4 in flags is set. Percent value such that
// 0% = no amplification These three parameters are optional if bit 4 is
@@ -247,40 +229,58 @@
// with subfx 21. The subtleness has to do with creation of temporary
// planes and positioning relative to such planes.
- int flags = argv[3].offset;
+ uint16 flags = argv[3].offset;
Common::String flagspec;
if (argc > 3) {
- if (flags & 1)
+ if (flags & kDoubled)
flagspec += "doubled ";
- if (flags & 2)
+ if (flags & kDropFrames)
flagspec += "dropframes ";
- if (flags & 4)
+ if (flags & kBlackLines)
flagspec += "blacklines ";
- if (flags & 8)
+ if (flags & kUnkBit3)
flagspec += "bit3 ";
- if (flags & 16)
+ if (flags & kGammaBoost)
flagspec += "gammaboost ";
- if (flags & 32)
+ if (flags & kHoldBlackFrame)
flagspec += "holdblack ";
- if (flags & 64)
+ if (flags & kHoldLastFrame)
flagspec += "holdlast ";
- if (flags & 128)
+ if (flags & kUnkBit7)
flagspec += "bit7 ";
- if (flags & 256)
+ if (flags & kStretch)
flagspec += "stretch";
warning("VMDFlags: %s", flagspec.c_str());
+
+ s->_videoState.flags = flags;
}
warning("x, y: %d, %d", argv[1].offset, argv[2].offset);
+ s->_videoState.x = argv[1].offset;
+ s->_videoState.y = argv[2].offset;
if (argc > 4 && flags & 16)
warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].offset, argv[5].offset, argv[6].offset);
break;
}
- case 6:
- // Play, perhaps? Or stop? This is the last call made, and takes no extra parameters
+ case 6: // Play
+ videoDecoder = new Graphics::VMDDecoder(g_system->getMixer());
+
+ if (!videoDecoder->loadFile(s->_videoState.fileName)) {
+ warning("Could not open VMD %s", s->_videoState.fileName.c_str());
+ break;
+ }
+
+ if (reshowCursor)
+ g_sci->_gfxCursor->kernelHide();
+
+ playVideo(videoDecoder, s->_videoState);
+
+ if (reshowCursor)
+ g_sci->_gfxCursor->kernelShow();
+ break;
case 14:
// Takes an additional integer parameter (e.g. 3)
case 16:
Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp 2010-12-22 13:17:19 UTC (rev 55002)
+++ scummvm/trunk/engines/sci/engine/state.cpp 2010-12-22 13:51:35 UTC (rev 55003)
@@ -116,6 +116,9 @@
scriptStepCounter = 0;
scriptGCInterval = GC_INTERVAL;
+
+ _videoState.reset();
+ _syncedAudioOptions = false;
}
void EngineState::speedThrottler(uint32 neededSleep) {
Modified: scummvm/trunk/engines/sci/engine/state.h
===================================================================
--- scummvm/trunk/engines/sci/engine/state.h 2010-12-22 13:17:19 UTC (rev 55002)
+++ scummvm/trunk/engines/sci/engine/state.h 2010-12-22 13:51:35 UTC (rev 55003)
@@ -113,6 +113,31 @@
bool isOpen() const;
};
+enum VideoFlags {
+ kNone = 0,
+ kDoubled = 1 << 0,
+ kDropFrames = 1 << 1,
+ kBlackLines = 1 << 2,
+ kUnkBit3 = 1 << 3,
+ kGammaBoost = 1 << 4,
+ kHoldBlackFrame = 1 << 5,
+ kHoldLastFrame = 1 << 6,
+ kUnkBit7 = 1 << 7,
+ kStretch = 1 << 8
+};
+
+struct VideoState {
+ Common::String fileName;
+ uint16 x;
+ uint16 y;
+ uint16 flags;
+
+ void reset() {
+ fileName = "";
+ x = y = 0;
+ }
+};
+
struct EngineState : public Common::Serializable {
public:
EngineState(SegManager *segMan);
@@ -197,7 +222,6 @@
int gcCountDown; /**< Number of kernel calls until next gc */
-public:
MessageState *_msgState;
// MemorySegment provides access to a 256-byte block of memory that remains
@@ -208,6 +232,9 @@
uint _memorySegmentSize;
byte _memorySegment[kMemorySegmentMax];
+ VideoState _videoState;
+ bool _syncedAudioOptions;
+
/**
* Resets the engine state.
*/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list