aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/videoplayer.cpp
diff options
context:
space:
mode:
authorSven Hesse2010-08-08 00:54:24 +0000
committerSven Hesse2010-08-08 00:54:24 +0000
commit424e802bb92119ce9a8f95b2399a23d911d061e7 (patch)
tree2e62e86fbfbdd0a35562665e86be78f2a49089b1 /engines/gob/videoplayer.cpp
parent3c5e02900f6397add6365bea819987bf9d6e89e6 (diff)
downloadscummvm-rg350-424e802bb92119ce9a8f95b2399a23d911d061e7.tar.gz
scummvm-rg350-424e802bb92119ce9a8f95b2399a23d911d061e7.tar.bz2
scummvm-rg350-424e802bb92119ce9a8f95b2399a23d911d061e7.zip
GOB: Add copyFrame
svn-id: r51893
Diffstat (limited to 'engines/gob/videoplayer.cpp')
-rw-r--r--engines/gob/videoplayer.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index a2450e1847..1fe05dfbf0 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -513,6 +513,66 @@ void VideoPlayer::writeVideoInfo(const Common::String &file, int16 varX, int16 v
}
}
+bool VideoPlayer::copyFrame(int slot, byte *dest,
+ uint16 left, uint16 top, uint16 width, uint16 height,
+ uint16 x, uint16 y, uint16 pitch, int16 transp) const {
+
+ const Video *video = getVideoBySlot(slot);
+ if (!video)
+ return false;
+
+ const Graphics::Surface *surface = video->decoder->getSurface();
+ if (!surface)
+ return false;
+
+ int32 w = MIN<int32>(width , surface->w);
+ int32 h = MIN<int32>(height, surface->h);
+
+ const byte *src = (byte*)surface->pixels + (top * surface->pitch) + left;
+ byte *dst = dest + (y * pitch) + x;
+
+ if (transp < 0) {
+ // No transparency
+
+ if ((x == 0) && (left == 0) && (pitch == surface->pitch) && (width == surface->w)) {
+ // Dimensions fit, we can copy everything at once
+
+ memcpy(dst, src, w * h);
+ return true;
+ }
+
+ // Copy row-by-row
+
+ while (h-- > 0) {
+ const byte *srcRow = src;
+ byte *dstRow = dst;
+
+ memcpy(dst, src, w);
+
+ srcRow += surface->pitch;
+ dstRow += pitch;
+ }
+
+ return true;
+ }
+
+ // Copy pixel-by-pixel
+
+ while (h-- > 0) {
+ const byte *srcRow = src;
+ byte *dstRow = dst;
+
+ for (int32 i = 0; i < w; i++, srcRow++, dstRow++)
+ if (*srcRow != transp)
+ *dstRow = *srcRow;
+
+ srcRow += surface->pitch;
+ dstRow += pitch;
+ }
+
+ return true;
+}
+
const VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) const {
if ((slot < 0) || (slot >= kVideoSlotCount))
return 0;