From ea6d4579e284e10778c1703ff6a1638505697cea Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 4 Dec 2015 22:53:31 +0200 Subject: [PATCH] LAB: Merge all of the different image drawing functions --- engines/lab/graphics.cpp | 6 +- engines/lab/image.cpp | 118 +++++++++++++++------------------------ engines/lab/image.h | 2 +- engines/lab/lab.cpp | 2 +- engines/lab/special.cpp | 6 +- 5 files changed, 53 insertions(+), 81 deletions(-) diff --git a/engines/lab/graphics.cpp b/engines/lab/graphics.cpp index 614b74431b1..88b53ce3b57 100644 --- a/engines/lab/graphics.cpp +++ b/engines/lab/graphics.cpp @@ -706,7 +706,7 @@ void DisplayMan::doTransWipe(CloseDataPtr *cPtr, char *filename) { imDest._imageData = _vm->getCurrentDrawingBuffer(); - imSource.bltBitMap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 2); + imSource.blitBitmap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 2, false); _vm->overlayRect(0, 0, curY, _vm->_screenWidth - 1, curY + 1); curY += 4; linesdone++; @@ -726,9 +726,9 @@ void DisplayMan::doTransWipe(CloseDataPtr *cPtr, char *filename) { imDest._imageData = _vm->getCurrentDrawingBuffer(); if (curY == lastY) - imSource.bltBitMap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 1); + imSource.blitBitmap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 1, false); else - imSource.bltBitMap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 2); + imSource.blitBitmap(0, curY, &imDest, 0, curY, _vm->_screenWidth, 2, false); curY += 4; linesdone++; diff --git a/engines/lab/image.cpp b/engines/lab/image.cpp index 1d8b9d61f5b..45377acedac 100644 --- a/engines/lab/image.cpp +++ b/engines/lab/image.cpp @@ -50,26 +50,48 @@ Image::Image(Common::File *s) { } /*****************************************************************************/ -/* Draws an image to the screen. */ +/* Blits a piece of one image to another. */ /*****************************************************************************/ -void Image::drawImage(uint16 x, uint16 y) { - int w = _width; - int h = _height; +void Image::blitBitmap(uint16 xs, uint16 ys, Image *imDest, + uint16 xd, uint16 yd, uint16 width, uint16 height, byte masked) { + int w = width; + int h = height; + int destWidth = (imDest) ? imDest->_width : g_lab->_screenWidth; + int destHeight = (imDest) ? imDest->_height : g_lab->_screenHeight; + byte *destBuffer = (imDest) ? imDest->_imageData : g_lab->getCurrentDrawingBuffer(); - if (x + w > g_lab->_screenWidth) - w = g_lab->_screenWidth - x; + if (xd + w > destWidth) + w = destWidth - xd; - if (y + h > g_lab->_screenHeight) - h = g_lab->_screenHeight - y; + if (yd + h > destHeight) + h = destHeight - yd; - if ((w > 0) && (h > 0)) { - byte *s = _imageData; - byte *d = g_lab->getCurrentDrawingBuffer() + y * g_lab->_screenWidth + x; + if (w > 0 && h > 0) { + byte *s = _imageData + ys * _width + xs; + byte *d = destBuffer + yd * destWidth + xd; - while (h-- > 0) { - memcpy(d, s, w); - s += _width; - d += g_lab->_screenWidth; + if (!masked) { + while (h-- > 0) { + memcpy(d, s, w); + s += _width; + d += destWidth; + } + } else { + while (h-- > 0) { + byte *ss = s; + byte *dd = d; + int ww = w; + + while (ww-- > 0) { + byte c = *ss++; + + if (c) *dd++ = c - 1; + else dd++; + } + + s += _width; + d += destWidth; + } } } } @@ -77,36 +99,15 @@ void Image::drawImage(uint16 x, uint16 y) { /*****************************************************************************/ /* Draws an image to the screen. */ /*****************************************************************************/ +void Image::drawImage(uint16 x, uint16 y) { + blitBitmap(0, 0, NULL, x, y, _width, _height, false); +} + +/*****************************************************************************/ +/* Draws an image to the screen with transparency. */ +/*****************************************************************************/ void Image::drawMaskImage(uint16 x, uint16 y) { - int w = _width; - int h = _height; - - if (x + w > g_lab->_screenWidth) - w = g_lab->_screenWidth - x; - - if (y + h > g_lab->_screenHeight) - h = g_lab->_screenHeight - y; - - if ((w > 0) && (h > 0)) { - byte *s = _imageData; - byte *d = g_lab->getCurrentDrawingBuffer() + y * g_lab->_screenWidth + x; - - while (h-- > 0) { - byte *ss = s; - byte *dd = d; - int ww = w; - - while (ww-- > 0) { - byte c = *ss++; - - if (c) *dd++ = c - 1; - else dd++; - } - - s += _width; - d += g_lab->_screenWidth; - } - } + blitBitmap(0, 0, NULL, x, y, _width, _height, true); } /*****************************************************************************/ @@ -134,33 +135,4 @@ void Image::readScreenImage(uint16 x, uint16 y) { } } -/*****************************************************************************/ -/* Blits a piece of one image to another. */ -/* NOTE: for our purposes, assumes that ImDest is to be in VGA memory. */ -/*****************************************************************************/ -void Image::bltBitMap(uint16 xs, uint16 ys, Image *imDest, - uint16 xd, uint16 yd, uint16 width, uint16 height) { - // I think the old code assumed that the source image data was valid for the given box. - // I will proceed on that assumption. - int w = width; - int h = height; - - if (xd + w > imDest->_width) - w = imDest->_width - xd; - - if (yd + h > imDest->_height) - h = imDest->_height - yd; - - if (w > 0 && h > 0) { - byte *s = _imageData + ys * _width + xs; - byte *d = imDest->_imageData + yd * imDest->_width + xd; - - while (h-- > 0) { - memcpy(d, s, w); - s += _width; - d += imDest->_width; - } - } -} - } // End of namespace Lab diff --git a/engines/lab/image.h b/engines/lab/image.h index 8f4d0f844f0..f443f4c1c31 100644 --- a/engines/lab/image.h +++ b/engines/lab/image.h @@ -46,7 +46,7 @@ public: void drawImage(uint16 x, uint16 y); void drawMaskImage(uint16 x, uint16 y); void readScreenImage(uint16 x, uint16 y); - void bltBitMap(uint16 xs, uint16 ys, Image *ImDest, uint16 xd, uint16 yd, uint16 width, uint16 height); + void blitBitmap(uint16 xs, uint16 ys, Image *ImDest, uint16 xd, uint16 yd, uint16 width, uint16 height, byte masked); }; diff --git a/engines/lab/lab.cpp b/engines/lab/lab.cpp index 4a14ba63d09..2cd237c99d4 100644 --- a/engines/lab/lab.cpp +++ b/engines/lab/lab.cpp @@ -482,7 +482,7 @@ void LabEngine::changeCombination(uint16 number) { scrollDisplayY(2, _graphics->VGAScaleX(COMBINATION_X[number]), _graphics->VGAScaleY(65), _graphics->VGAScaleX(COMBINATION_X[number]) + (Images[combnum])->_width - 1, _graphics->VGAScaleY(65) + (Images[combnum])->_height); - Images[combnum]->bltBitMap(0, (Images[combnum])->_height - (2 * i), &(display), _graphics->VGAScaleX(COMBINATION_X[number]), _graphics->VGAScaleY(65), (Images[combnum])->_width, 2); + Images[combnum]->blitBitmap(0, (Images[combnum])->_height - (2 * i), &(display), _graphics->VGAScaleX(COMBINATION_X[number]), _graphics->VGAScaleY(65), (Images[combnum])->_width, 2, false); } for (uint16 i = 0; i < 6; i++) diff --git a/engines/lab/special.cpp b/engines/lab/special.cpp index 855093edeca..69a8aaedaf0 100644 --- a/engines/lab/special.cpp +++ b/engines/lab/special.cpp @@ -273,14 +273,14 @@ static void turnPage(bool FromLeft) { g_lab->_music->updateMusic(); g_lab->waitTOF(); ScreenImage._imageData = g_lab->getCurrentDrawingBuffer(); - JBackImage.bltBitMap(i, 0, &ScreenImage, i, 0, 8, g_lab->_screenHeight); + JBackImage.blitBitmap(i, 0, &ScreenImage, i, 0, 8, g_lab->_screenHeight, false); } } else { for (int i = (g_lab->_screenWidth - 8); i > 0; i -= 8) { g_lab->_music->updateMusic(); g_lab->waitTOF(); ScreenImage._imageData = g_lab->getCurrentDrawingBuffer(); - JBackImage.bltBitMap(i, 0, &ScreenImage, i, 0, 8, g_lab->_screenHeight); + JBackImage.blitBitmap(i, 0, &ScreenImage, i, 0, 8, g_lab->_screenHeight, false); } } } @@ -302,7 +302,7 @@ void LabEngine::drawJournal(uint16 wipenum, bool needFade) { ScreenImage._imageData = getCurrentDrawingBuffer(); if (wipenum == 0) - JBackImage.bltBitMap(0, 0, &ScreenImage, 0, 0, _screenWidth, _screenHeight); + JBackImage.blitBitmap(0, 0, &ScreenImage, 0, 0, _screenWidth, _screenHeight, false); else turnPage((bool)(wipenum == 1));