aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2014-04-21 19:12:28 -0400
committerPaul Gilbert2014-04-21 19:12:28 -0400
commitff70186855bec22fe77043d89917b189218ff856 (patch)
tree66825eebb4ced6fa945596387717672a676ebd81
parent0e6c4abd13e7bea64ce36537cc8c4ebb03ccfbfc (diff)
downloadscummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.tar.gz
scummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.tar.bz2
scummvm-rg350-ff70186855bec22fe77043d89917b189218ff856.zip
MADS: Improve background user interface sprite animations
-rw-r--r--engines/mads/msurface.cpp44
-rw-r--r--engines/mads/msurface.h8
-rw-r--r--engines/mads/user_interface.cpp49
-rw-r--r--engines/mads/user_interface.h11
4 files changed, 58 insertions, 54 deletions
diff --git a/engines/mads/msurface.cpp b/engines/mads/msurface.cpp
index 75aad01ee1..2c9d093877 100644
--- a/engines/mads/msurface.cpp
+++ b/engines/mads/msurface.cpp
@@ -418,50 +418,6 @@ void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
}
}
-void MSurface::mergeFrom(MSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos) {
- // 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 *)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 (srcPtr[xCtr] < 8 || srcPtr[xCtr] > 15)
- destPtr[xCtr] = srcPtr[xCtr];
- }
-
- srcPtr += src->getWidth();
- destPtr += getWidth();
- }
-}
-
void MSurface::scrollX(int xAmount) {
if (xAmount == 0)
return;
diff --git a/engines/mads/msurface.h b/engines/mads/msurface.h
index f590bac2e5..7cf2bbe15b 100644
--- a/engines/mads/msurface.h
+++ b/engines/mads/msurface.h
@@ -188,14 +188,6 @@ public:
}
/**
- * Merges a sub-section of another surface into the current one.
- * @param src Source surface
- * @param srcBounds Area to copy/merge from
- * @param destPos Destination position to draw in current surface
- */
- void mergeFrom(MSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos);
-
- /**
* Scroll the screen horizontally by a given amount
* @param xAmount Horizontal amount
*/
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);
diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h
index 7541bb8661..a29a0e6de0 100644
--- a/engines/mads/user_interface.h
+++ b/engines/mads/user_interface.h
@@ -229,6 +229,17 @@ public:
void drawTextElements();
/**
+ * Merges a sub-section of another surface into the user interface without
+ * destroying any on-screen text
+ * @param src Source surface
+ * @param srcBounds Area to copy/merge from
+ * @param destPos Destination position to draw in current surface
+ * @param transparencyIndex Transparency color
+ */
+ void mergeFrom(MSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos,
+ int transparencyIndex = -1);
+
+ /**
* Loads the animation sprite data for a given inventory object
*/
void loadInventoryAnim(int objectId);