aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/coktelvideo.cpp3
-rw-r--r--engines/gob/coktelvideo.h10
-rw-r--r--engines/gob/demoplayer.cpp54
-rw-r--r--engines/gob/demoplayer.h3
-rw-r--r--engines/gob/driver_vga.cpp37
-rw-r--r--engines/gob/driver_vga.h2
-rw-r--r--engines/gob/video.cpp6
-rw-r--r--engines/gob/video.h3
-rw-r--r--engines/gob/videoplayer.cpp44
-rw-r--r--engines/gob/videoplayer.h8
10 files changed, 159 insertions, 11 deletions
diff --git a/engines/gob/coktelvideo.cpp b/engines/gob/coktelvideo.cpp
index 1c19e4b513..55b5e61c31 100644
--- a/engines/gob/coktelvideo.cpp
+++ b/engines/gob/coktelvideo.cpp
@@ -1006,6 +1006,9 @@ bool Vmd::load(Common::SeekableReadStream &stream) {
}
}
+ if (_externalCodec && _codecIndeo3)
+ _features |= kFeaturesSupportsDouble;
+
_soundFreq = _stream->readSint16LE();
_soundSliceSize = _stream->readSint16LE();
_soundSlicesCount = _stream->readSint16LE();
diff --git a/engines/gob/coktelvideo.h b/engines/gob/coktelvideo.h
index 54a72f0623..c2590dc503 100644
--- a/engines/gob/coktelvideo.h
+++ b/engines/gob/coktelvideo.h
@@ -56,7 +56,9 @@ public:
/** Has video. */
kFeaturesVideo = 0x400,
/** Is a full color (non-paletted) video. */
- kFeaturesFullColor = 0x4000
+ kFeaturesFullColor = 0x4000,
+ /** Supports automatic doubling. */
+ kFeaturesSupportsDouble = 0x40000000
};
enum StateFlags {
@@ -95,7 +97,7 @@ public:
virtual ~CoktelVideo() { }
/** Returns the features the loaded video possesses. */
- virtual uint16 getFeatures() const = 0;
+ virtual uint32 getFeatures() const = 0;
/** Returns the flags the loaded video possesses. */
virtual uint16 getFlags() const = 0;
/** Returns the x coordinate of the video. */
@@ -196,7 +198,7 @@ public:
Imd();
~Imd();
- uint16 getFeatures() const { return _features; }
+ uint32 getFeatures() const { return _features; }
uint16 getFlags() const { return _flags; }
int16 getX() const { return _x; }
int16 getY() const { return _y; }
@@ -255,7 +257,7 @@ protected:
Common::SeekableReadStream *_stream;
uint16 _version;
- uint16 _features;
+ uint32 _features;
uint16 _flags;
int16 _x, _y, _width, _height;
int16 _stdX, _stdY, _stdWidth, _stdHeight;
diff --git a/engines/gob/demoplayer.cpp b/engines/gob/demoplayer.cpp
index cbc65dfed7..4f6327aeed 100644
--- a/engines/gob/demoplayer.cpp
+++ b/engines/gob/demoplayer.cpp
@@ -93,19 +93,67 @@ void DemoPlayer::playVideo(const char *fileName) {
debugC(1, kDebugDemo, "Playing video \"%s\"", file);
- // Playing the video
if (_vm->_vidPlayer->primaryOpen(file)) {
- _vm->_vidPlayer->slotSetDoubleMode(-1, _doubleMode);
- _vm->_vidPlayer->primaryPlay();
+ bool videoSupportsDouble =
+ ((_vm->_vidPlayer->getFeatures() & CoktelVideo::kFeaturesSupportsDouble) != 0);
+
+ if (_doubleMode) {
+ if (videoSupportsDouble) {
+ _vm->_vidPlayer->slotSetDoubleMode(-1, true);
+ playVideoNormal();
+ } else
+ playVideoDoubled();
+ } else
+ playVideoNormal();
+
_vm->_vidPlayer->primaryClose();
if (waitTime > 0)
_vm->_util->longDelay(waitTime);
}
+
delete[] filePtr;
}
+void DemoPlayer::playVideoNormal() {
+ _vm->_vidPlayer->primaryPlay();
+}
+
+void DemoPlayer::playVideoDoubled() {
+ const char *fileNameOpened;
+ char *fileName;
+
+ fileNameOpened = _vm->_vidPlayer->getFileName();
+
+ fileName = new char[strlen(fileNameOpened) + 1];
+ strcpy(fileName, fileNameOpened);
+
+ _vm->_vidPlayer->primaryClose();
+
+ if (_vm->_vidPlayer->primaryOpen(fileName, 0, -1, VideoPlayer::kFlagOtherSurface)) {
+ for (int i = 0; i < _vm->_vidPlayer->getFramesCount(); i++) {
+ if (_vm->_vidPlayer->primaryPlay(i, i))
+ break;
+
+ CoktelVideo::State state = _vm->_vidPlayer->getState();
+
+ int16 w = state.right - state.left + 1;
+ int16 h = state.bottom - state.top + 1;
+ int16 wD = (state.left * 2) + (w * 2);
+ int16 hD = (state.top * 2) + (h * 2);
+
+ _vm->_video->drawSpriteDouble(_vm->_draw->_spritesArray[0], _vm->_draw->_frontSurface,
+ state.left, state.top, state.right, state.bottom, state.left, state.top, 0);
+ _vm->_draw->dirtiedRect(_vm->_draw->_frontSurface,
+ state.left * 2, state.top * 2, wD, hD);
+ _vm->_video->retrace();
+ }
+ }
+
+ delete[] fileName;
+}
+
void DemoPlayer::evaluateVideoMode(const char *mode) {
debugC(2, kDebugDemo, "Video mode \"%s\"", mode);
diff --git a/engines/gob/demoplayer.h b/engines/gob/demoplayer.h
index 8663426649..c26ecacaa9 100644
--- a/engines/gob/demoplayer.h
+++ b/engines/gob/demoplayer.h
@@ -52,6 +52,9 @@ protected:
void evaluateVideoMode(const char *mode);
void clearScreen();
void playVideo(const char *fileName);
+
+ void playVideoNormal();
+ void playVideoDoubled();
};
} // End of namespace Gob
diff --git a/engines/gob/driver_vga.cpp b/engines/gob/driver_vga.cpp
index b182700dba..24c2d8e37b 100644
--- a/engines/gob/driver_vga.cpp
+++ b/engines/gob/driver_vga.cpp
@@ -163,6 +163,43 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest,
}
}
+void VGAVideoDriver::drawSpriteDouble(SurfaceDesc *source, SurfaceDesc *dest,
+ int16 left, int16 top, int16 right, int16 bottom,
+ int16 x, int16 y, int16 transp) {
+
+ if ((x >= dest->getWidth()) || (x < 0) ||
+ (y >= dest->getHeight()) || (y < 0))
+ return;
+
+ int16 width = MIN<int>((right - left) + 1, dest->getWidth() / 2);
+ int16 height = MIN<int>((bottom - top) + 1, dest->getHeight() / 2);
+
+ if ((width < 1) || (height < 1))
+ return;
+
+ const byte *srcPos = source->getVidMem() + (top * source->getWidth()) + left;
+ byte *destPos = dest->getVidMem() + ((y * 2) * dest->getWidth()) + (x * 2);
+
+ while (height--) {
+ const byte *srcBak = srcPos;
+
+ for (int i = 0; i < 2; i++) {
+ srcPos = srcBak;
+
+ for (int16 j = 0; j < width; j++) {
+ if (!transp || srcPos[i]) {
+ destPos[2 * j + 0] = srcPos[j];
+ destPos[2 * j + 1] = srcPos[j];
+ }
+ }
+
+ destPos += dest->getWidth();
+ }
+
+ srcPos = srcBak + source->getWidth();
+ }
+}
+
void VGAVideoDriver::drawPackedSprite(byte *sprBuf, int16 width, int16 height,
int16 x, int16 y, byte transp, SurfaceDesc *dest) {
int destRight = x + width;
diff --git a/engines/gob/driver_vga.h b/engines/gob/driver_vga.h
index 79c2cb513b..c67fd1cb2f 100644
--- a/engines/gob/driver_vga.h
+++ b/engines/gob/driver_vga.h
@@ -45,6 +45,8 @@ public:
byte transp, SurfaceDesc *dest);
void drawSprite(SurfaceDesc *source, SurfaceDesc *dest, int16 left,
int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp);
+ void drawSpriteDouble(SurfaceDesc *source, SurfaceDesc *dest, int16 left,
+ int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp);
void drawPackedSprite(byte *sprBuf, int16 width, int16 height,
int16 x, int16 y, byte transp, SurfaceDesc *dest);
};
diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp
index ab39c5e7e7..7901ec223a 100644
--- a/engines/gob/video.cpp
+++ b/engines/gob/video.cpp
@@ -378,6 +378,12 @@ void Video::drawSprite(SurfaceDesc *source, SurfaceDesc *dest,
_videoDriver->drawSprite(source, dest, left, top, right, bottom, x, y, transp);
}
+void Video::drawSpriteDouble(SurfaceDesc *source, SurfaceDesc *dest,
+ int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp) {
+
+ _videoDriver->drawSpriteDouble(source, dest, left, top, right, bottom, x, y, transp);
+}
+
void Video::drawLetter(int16 item, int16 x, int16 y, FontDesc *fontDesc,
int16 color1, int16 color2, int16 transp, SurfaceDesc *dest) {
byte *dataPtr;
diff --git a/engines/gob/video.h b/engines/gob/video.h
index 14bae430f1..38fdb2bf6f 100644
--- a/engines/gob/video.h
+++ b/engines/gob/video.h
@@ -149,6 +149,8 @@ public:
void drawSprite(SurfaceDesc *source, SurfaceDesc *dest,
int16 left, int16 top, int16 right, int16 bottom,
int16 x, int16 y, int16 transp);
+ void drawSpriteDouble(SurfaceDesc *source, SurfaceDesc *dest,
+ int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp);
void drawLetter(int16 item, int16 x, int16 y, FontDesc *fontDesc,
int16 color1, int16 color2, int16 transp, SurfaceDesc *dest);
void drawPackedSprite(byte *sprBuf, int16 width, int16 height,
@@ -258,6 +260,7 @@ public:
VideoDriver() {}
virtual ~VideoDriver() {}
virtual void drawSprite(SurfaceDesc *source, SurfaceDesc *dest, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp) = 0;
+ virtual void drawSpriteDouble(SurfaceDesc *source, SurfaceDesc *dest, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, int16 transp) = 0;
virtual void fillRect(SurfaceDesc *dest, int16 left, int16 top, int16 right, int16 bottom, byte color) = 0;
virtual void putPixel(int16 x, int16 y, byte color, SurfaceDesc *dest) = 0;
virtual void drawLetter(unsigned char item, int16 x, int16 y, Video::FontDesc *fontDesc, byte color1, byte color2, byte transp, SurfaceDesc *dest) = 0;
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index ba34e675ec..76b574f44f 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -114,6 +114,10 @@ const CoktelVideo *VideoPlayer::Video::getVideo() const {
return _video;
}
+uint32 VideoPlayer::Video::getFeatures() const {
+ return _video->getFeatures();
+}
+
CoktelVideo::State VideoPlayer::Video::getState() const {
return _state;
}
@@ -286,12 +290,12 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y,
return true;
}
-void VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
+bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
uint16 palCmd, int16 palStart, int16 palEnd,
int16 palFrame, int16 endFrame, bool fade, int16 reverseTo, bool forceSeek) {
if (!_primaryVideo->isOpen())
- return;
+ return false;
CoktelVideo &video = *(_primaryVideo->getVideo());
@@ -318,9 +322,13 @@ void VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
if (fade)
_vm->_palAnim->fade(0, -2, 0);
+ bool canceled = false;
+
while (startFrame <= lastFrame) {
- if (doPlay(startFrame, breakKey, palCmd, palStart, palEnd, palFrame, endFrame))
+ if (doPlay(startFrame, breakKey, palCmd, palStart, palEnd, palFrame, endFrame)) {
+ canceled = true;
break;
+ }
evalBgShading(video);
@@ -355,6 +363,8 @@ void VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
}
evalBgShading(video);
+
+ return canceled;
}
void VideoPlayer::primaryClose() {
@@ -493,6 +503,15 @@ VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) {
return 0;
}
+const char *VideoPlayer::getFileName(int slot) const {
+ const Video *video = getVideoBySlot(slot);
+
+ if (video)
+ return video->getFileName();
+
+ return "";
+}
+
uint16 VideoPlayer::getFlags(int slot) const {
const Video *video = getVideoBySlot(slot);
@@ -556,6 +575,25 @@ int16 VideoPlayer::getDefaultY(int slot) const {
return 0;
}
+uint32 VideoPlayer::getFeatures(int slot) const {
+ const Video *video = getVideoBySlot(slot);
+
+ if (video)
+ return video->getFeatures();
+
+ return 0;
+}
+
+CoktelVideo::State VideoPlayer::getState(int slot) const {
+ const Video *video = getVideoBySlot(slot);
+ CoktelVideo::State state;
+
+ if (video)
+ state = video->getState();
+
+ return state;
+}
+
bool VideoPlayer::hasExtraData(const char *fileName, int slot) const {
const Video *video = getVideoBySlot(slot);
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 61f264975a..07837eb6c2 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -57,7 +57,7 @@ public:
bool primaryOpen(const char *videoFile, int16 x = -1, int16 y = -1,
int16 flags = kFlagFrontSurface, Type which = kVideoTypeTry);
- void primaryPlay(int16 startFrame = -1, int16 lastFrame = -1, int16 breakKey = 27,
+ bool primaryPlay(int16 startFrame = -1, int16 lastFrame = -1, int16 breakKey = 27,
uint16 palCmd = 8, int16 palStart = 0, int16 palEnd = 255,
int16 palFrame = -1, int16 endFrame = -1, bool fade = false,
int16 reverseTo = -1, bool forceSeek = false);
@@ -76,6 +76,7 @@ public:
bool slotIsOpen(int slot) const;
+ const char *getFileName(int slot = -1) const;
uint16 getFlags(int slot = -1) const;
int16 getFramesCount(int slot = -1) const;
int16 getCurrentFrame(int slot = -1) const;
@@ -84,6 +85,9 @@ public:
int16 getDefaultX(int slot = -1) const;
int16 getDefaultY(int slot = -1) const;
+ CoktelVideo::State getState(int slot = -1) const;
+ uint32 getFeatures(int slot = -1) const;
+
bool hasExtraData(const char *fileName, int slot = -1) const;
Common::MemoryReadStream *getExtraData(const char *fileName, int slot = -1);
@@ -106,7 +110,9 @@ private:
const char *getFileName() const;
CoktelVideo *getVideo();
const CoktelVideo *getVideo() const;
+
CoktelVideo::State getState() const;
+ uint32 getFeatures() const;
int16 getDefaultX() const;
int16 getDefaultY() const;