mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 01:38:36 +00:00
GOB: Add copyFrame
svn-id: r51893
This commit is contained in:
parent
3c5e02900f
commit
424e802bb9
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user