diff options
author | Alyssa Milburn | 2010-12-01 18:21:17 +0000 |
---|---|---|
committer | Alyssa Milburn | 2010-12-01 18:21:17 +0000 |
commit | ddd691e2d3c02f9b1dfcaafd2239a4a04a7996a3 (patch) | |
tree | ec2e539dca1fef0216c4d61f02de6b656facd1aa /engines | |
parent | 77782f4eb3655d9d7b73c6158b96e369d617163b (diff) | |
download | scummvm-rg350-ddd691e2d3c02f9b1dfcaafd2239a4a04a7996a3.tar.gz scummvm-rg350-ddd691e2d3c02f9b1dfcaafd2239a4a04a7996a3.tar.bz2 scummvm-rg350-ddd691e2d3c02f9b1dfcaafd2239a4a04a7996a3.zip |
MOHAWK: add LBGraphics::copyImageSectionToScreen
svn-id: r54707
Diffstat (limited to 'engines')
-rw-r--r-- | engines/mohawk/graphics.cpp | 47 | ||||
-rw-r--r-- | engines/mohawk/graphics.h | 1 |
2 files changed, 35 insertions, 13 deletions
diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index bcb3e44148..8ffbe2f81b 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -790,29 +790,41 @@ void LBGraphics::preloadImage(uint16 image) { void LBGraphics::copyImageToScreen(uint16 image, bool useOffsets, int left, int top) { MohawkSurface *mhkSurface = findImage(image); + Graphics::Surface *surface = mhkSurface->getSurface(); if (useOffsets) { left -= mhkSurface->getOffsetX(); top -= mhkSurface->getOffsetY(); } + Common::Rect srcRect(0, 0, surface->w, surface->h); + Common::Rect dstRect(left, top, left + surface->w, top + surface->h); + copyImageSectionToScreen(image, srcRect, dstRect); +} + +void LBGraphics::copyImageSectionToScreen(uint16 image, Common::Rect srcRect, Common::Rect dstRect) { + MohawkSurface *mhkSurface = findImage(image); + uint16 startX = 0; uint16 startY = 0; + assert(srcRect.isValidRect() && dstRect.isValidRect()); + assert(srcRect.left >= 0 && srcRect.top >= 0); + // TODO: clip rect - if (left < 0) { - startX -= left; - left = 0; + if (dstRect.left < 0) { + startX -= dstRect.left; + dstRect.left = 0; } - if (top < 0) { - startY -= top; - top = 0; + if (dstRect.top < 0) { + startY -= dstRect.top; + dstRect.top = 0; } - if (left >= _vm->_system->getWidth()) + if (dstRect.left >= _vm->_system->getWidth()) return; - if (top >= _vm->_system->getHeight()) + if (dstRect.top >= _vm->_system->getHeight()) return; Graphics::Surface *surface = mhkSurface->getSurface(); @@ -821,16 +833,25 @@ void LBGraphics::copyImageToScreen(uint16 image, bool useOffsets, int left, int if (startY >= surface->h) return; - uint16 width = MIN<int>(surface->w - startX, _vm->_system->getWidth() - left); - uint16 height = MIN<int>(surface->h - startY, _vm->_system->getHeight() - top); + if (srcRect.left > surface->w) + return; + if (srcRect.top > surface->h) + return; + if (srcRect.right > surface->w) + srcRect.right = surface->w; + if (srcRect.bottom > surface->h) + srcRect.bottom = surface->h; + + uint16 width = MIN<int>(srcRect.right - srcRect.left - startX, _vm->_system->getWidth() - dstRect.left); + uint16 height = MIN<int>(srcRect.bottom - srcRect.top - startY, _vm->_system->getHeight() - dstRect.top); - byte *surf = (byte *)surface->getBasePtr(0, startY); + byte *surf = (byte *)surface->getBasePtr(0, srcRect.top + startY); Graphics::Surface *screen = _vm->_system->lockScreen(); // image and screen are always 8bpp for LB for (uint16 y = 0; y < height; y++) { - byte *dest = (byte *)screen->getBasePtr(left, top + y); - byte *src = surf + startX; + byte *dest = (byte *)screen->getBasePtr(dstRect.left, dstRect.top + y); + byte *src = surf + srcRect.left + startX; // blit, with 0 being transparent for (uint16 x = 0; x < width; x++) { if (*src) diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h index 77268d006f..ffb7143686 100644 --- a/engines/mohawk/graphics.h +++ b/engines/mohawk/graphics.h @@ -207,6 +207,7 @@ public: void preloadImage(uint16 image); void copyImageToScreen(uint16 image, bool useOffsets = false, int left = 0, int top = 0); + void copyImageSectionToScreen(uint16 image, Common::Rect src, Common::Rect dest); void setPalette(uint16 id); bool imageIsTransparentAt(uint16 image, bool useOffsets, int x, int y); |