aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/user_interface.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2014-04-21 19:12:28 -0400
committerPaul Gilbert2014-04-21 19:12:28 -0400
commitff70186855bec22fe77043d89917b189218ff856 (patch)
tree66825eebb4ced6fa945596387717672a676ebd81 /engines/mads/user_interface.cpp
parent0e6c4abd13e7bea64ce36537cc8c4ebb03ccfbfc (diff)
downloadscummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.tar.gz
scummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.tar.bz2
scummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.zip
MADS: Improve background user interface sprite animations
Diffstat (limited to 'engines/mads/user_interface.cpp')
-rw-r--r--engines/mads/user_interface.cpp49
1 files changed, 47 insertions, 2 deletions
diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp
index a5e8a844f9..f775e459b5 100644
--- a/engines/mads/user_interface.cpp
+++ b/engines/mads/user_interface.cpp
@@ -162,10 +162,12 @@ void UISlots::draw(bool updateFlag, bool delFlag) {
if (flipped) {
MSurface *spr = sprite->flipHorizontal();
- spr->copyTo(&userInterface, slot._position, sprite->getTransparencyIndex());
+ userInterface.mergeFrom(spr, spr->getBounds(), slot._position,
+ sprite->getTransparencyIndex());
delete spr;
} else {
- sprite->copyTo(&userInterface, slot._position, sprite->getTransparencyIndex());
+ userInterface.mergeFrom(sprite, sprite->getBounds(), slot._position,
+ sprite->getTransparencyIndex());
}
}
}
@@ -407,6 +409,49 @@ void UserInterface::drawTextElements() {
}
}
+void UserInterface::mergeFrom(MSurface *src, const Common::Rect &srcBounds,
+ const Common::Point &destPos, int transparencyIndex) {
+ // Validation of the rectangle and position
+ int destX = destPos.x, destY = destPos.y;
+ if ((destX >= w) || (destY >= h))
+ return;
+
+ Common::Rect copyRect = srcBounds;
+ if (destX < 0) {
+ copyRect.left += -destX;
+ destX = 0;
+ } else if (destX + copyRect.width() > w) {
+ copyRect.right -= destX + copyRect.width() - w;
+ }
+ if (destY < 0) {
+ copyRect.top += -destY;
+ destY = 0;
+ } else if (destY + copyRect.height() > h) {
+ copyRect.bottom -= destY + copyRect.height() - h;
+ }
+
+ if (!copyRect.isValidRect())
+ return;
+
+ // Copy the specified area
+
+ byte *data = src->getData();
+ byte *srcPtr = data + (src->getWidth() * copyRect.top + copyRect.left);
+ byte *destPtr = (byte *)this->pixels + (destY * getWidth()) + destX;
+
+ for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) {
+ // Process each line of the area
+ for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr) {
+ // Check for the range used for on-screen text, which should be kept intact
+ if ((destPtr[xCtr] >= 8 && destPtr[xCtr] <= 15) && (int)srcPtr[xCtr] != transparencyIndex)
+ destPtr[xCtr] = srcPtr[xCtr];
+ }
+
+ srcPtr += src->getWidth();
+ destPtr += getWidth();
+ }
+}
+
void UserInterface::drawActions() {
for (int idx = 0; idx < 10; ++idx) {
writeVocab(CAT_COMMAND, idx);