aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKari Salminen2007-06-20 23:12:38 +0000
committerKari Salminen2007-06-20 23:12:38 +0000
commit582fa4cdf07c3c9a510b0fd9d5473f72ed133d44 (patch)
treee1e0fafe93d29c489fb737d213156130c781af0f
parentae74b067561e72f2804b39eed0cc6279efc32580 (diff)
downloadscummvm-rg350-582fa4cdf07c3c9a510b0fd9d5473f72ed133d44.tar.gz
scummvm-rg350-582fa4cdf07c3c9a510b0fd9d5473f72ed133d44.tar.bz2
scummvm-rg350-582fa4cdf07c3c9a510b0fd9d5473f72ed133d44.zip
Add AGI256 picture resource decoding support to PictureMgr::decodePicture.
svn-id: r27568
-rw-r--r--engines/agi/picture.cpp20
-rw-r--r--engines/agi/picture.h2
2 files changed, 17 insertions, 5 deletions
diff --git a/engines/agi/picture.cpp b/engines/agi/picture.cpp
index 9a16d4ab20..7a30d9c094 100644
--- a/engines/agi/picture.cpp
+++ b/engines/agi/picture.cpp
@@ -619,8 +619,9 @@ uint8 *PictureMgr::convertV3Pic(uint8 *src, uint32 len) {
* drawing.
* @param n AGI picture resource number
* @param clear clear AGI screen before drawing
+ * @param agi256 load an AGI256 picture resource
*/
-int PictureMgr::decodePicture(int n, int clear) {
+int PictureMgr::decodePicture(int n, int clear, bool agi256) {
debugC(8, kDebugLevelResources, "(%d)", n);
patCode = 0;
@@ -633,10 +634,21 @@ int PictureMgr::decodePicture(int n, int clear) {
flen = _vm->_game.dirPic[n].len;
foffs = 0;
- if (clear)
- memset(_vm->_game.sbuf, 0x4f, _WIDTH * _HEIGHT);
+ if (clear && !agi256) // 256 color pictures should always fill the whole screen, so no clearing for them.
+ memset(_vm->_game.sbuf16c, 0x4f, _WIDTH * _HEIGHT); // Clear 16 color AGI screen (Priority 4, color white).
- drawPicture();
+ if (!agi256) {
+ drawPicture(); // Draw 16 color picture.
+ } else {
+ const uint32 maxFlen = _WIDTH * _HEIGHT;
+ memcpy(_vm->_game.sbuf256c, data, MIN(flen, maxFlen)); // Draw 256 color picture.
+
+ if (flen < maxFlen) {
+ warning("Undersized AGI256 picture resource %d, using it anyway. Filling rest with white.", n);
+ memset(_vm->_game.sbuf256c + flen, 0x0f, maxFlen - flen); // Fill missing area with white.
+ } else if (flen > maxFlen)
+ warning("Oversized AGI256 picture resource %d, decoding only %ux%u part of it", n, _WIDTH, _HEIGHT);
+ }
if (clear)
_vm->clearImageStack();
diff --git a/engines/agi/picture.h b/engines/agi/picture.h
index 6a3f641eca..0f8584f3b2 100644
--- a/engines/agi/picture.h
+++ b/engines/agi/picture.h
@@ -68,7 +68,7 @@ public:
_gfx = gfx;
}
- int decodePicture(int, int);
+ int decodePicture(int n, int clear, bool agi256 = false);
int unloadPicture(int);
void showPic();
uint8 *convertV3Pic(uint8 *src, uint32 len);