From 424e802bb92119ce9a8f95b2399a23d911d061e7 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Aug 2010 00:54:24 +0000 Subject: GOB: Add copyFrame svn-id: r51893 --- engines/gob/videoplayer.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++ engines/gob/videoplayer.h | 3 +++ 2 files changed, 63 insertions(+) (limited to 'engines') 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(width , surface->w); + int32 h = MIN(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; diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h index 6f9d927739..2e7e3f396a 100644 --- a/engines/gob/videoplayer.h +++ b/engines/gob/videoplayer.h @@ -124,6 +124,9 @@ public: void writeVideoInfo(const Common::String &file, int16 varX, int16 varY, int16 varFrames, int16 varWidth, int16 varHeight); + bool copyFrame(int slot, byte *dest, + uint16 left, uint16 top, uint16 width, uint16 height, + uint16 x, uint16 y, uint16 pitch, int16 transp = -1) const; // Obsolete, to be deleted -- cgit v1.2.3