aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock
diff options
context:
space:
mode:
authorPaul Gilbert2015-05-28 21:47:52 -0400
committerPaul Gilbert2015-05-28 21:47:52 -0400
commita6607ff2d60e7951594a6a2ad8fd319fb776e35b (patch)
tree986b35f3ba4641f9f3c24a974f414892ea8f075c /engines/sherlock
parent88d245814314b9e452d02ce8ce8e2aa89bc3ecea (diff)
downloadscummvm-rg350-a6607ff2d60e7951594a6a2ad8fd319fb776e35b.tar.gz
scummvm-rg350-a6607ff2d60e7951594a6a2ad8fd319fb776e35b.tar.bz2
scummvm-rg350-a6607ff2d60e7951594a6a2ad8fd319fb776e35b.zip
SHERLOCK: Implemented flushScaleImage and scale calculations
Diffstat (limited to 'engines/sherlock')
-rw-r--r--engines/sherlock/resources.cpp24
-rw-r--r--engines/sherlock/resources.h6
-rw-r--r--engines/sherlock/screen.cpp26
-rw-r--r--engines/sherlock/screen.h12
4 files changed, 61 insertions, 7 deletions
diff --git a/engines/sherlock/resources.cpp b/engines/sherlock/resources.cpp
index 961286fcf4..f1c705b522 100644
--- a/engines/sherlock/resources.cpp
+++ b/engines/sherlock/resources.cpp
@@ -469,11 +469,31 @@ void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) {
/*----------------------------------------------------------------*/
int ImageFrame::sDrawXSize(int scaleVal) const {
- error("TODO: sDrawXSize");
+ int width = _width;
+ int scale = scaleVal == 0 ? 1 : scaleVal;
+
+ if (scaleVal >= 256)
+ --width;
+
+ int result = width * 256 / scale;
+ if (scaleVal >= 256)
+ ++result;
+
+ return result;
}
int ImageFrame::sDrawYSize(int scaleVal) const {
- error("TODO: sDrawYSize");
+ int height = _height;
+ int scale = scaleVal == 0 ? 1 : scaleVal;
+
+ if (scaleVal >= 256)
+ --height;
+
+ int result = height * 256 / scale;
+ if (scaleVal >= 256)
+ ++result;
+
+ return result;
}
} // End of namespace Sherlock
diff --git a/engines/sherlock/resources.h b/engines/sherlock/resources.h
index c5b76ac151..5c071e3922 100644
--- a/engines/sherlock/resources.h
+++ b/engines/sherlock/resources.h
@@ -174,8 +174,14 @@ struct ImageFrame {
byte _rleMarker;
Graphics::Surface _frame;
+ /**
+ * Return the frame width adjusted by a specified scale amount
+ */
int sDrawXSize(int scaleVal) const;
+ /**
+ * Return the frame height adjusted by a specified scale amount
+ */
int sDrawYSize(int scaleVal) const;
};
diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp
index e826a10fc0..a3af5559c7 100644
--- a/engines/sherlock/screen.cpp
+++ b/engines/sherlock/screen.cpp
@@ -283,7 +283,31 @@ void Screen::flushImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, i
void Screen::flushScaleImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, int16 *yp,
int16 *width, int16 *height, int scaleVal) {
- error("TODO");
+ Common::Point imgPos = pt + frame->_offset;
+ Common::Rect newBounds(imgPos.x, imgPos.y, imgPos.x + frame->sDrawXSize(scaleVal),
+ imgPos.y + frame->sDrawYSize(scaleVal));
+ Common::Rect oldBounds(*xp, *yp, *xp + *width, *yp + *height);
+
+ if (!_flushScreen) {
+ // See if the areas of the old and new overlap, and if so combine the areas
+ if (newBounds.intersects(oldBounds)) {
+ Common::Rect mergedBounds = newBounds;
+ mergedBounds.extend(oldBounds);
+ mergedBounds.right += 1;
+ mergedBounds.bottom += 1;
+
+ slamRect(mergedBounds);
+ } else {
+ // The two areas are independent, so copy them both
+ slamRect(newBounds);
+ slamRect(oldBounds);
+ }
+ }
+
+ *xp = newBounds.left;
+ *yp = newBounds.top;
+ *width = newBounds.width();
+ *height = newBounds.height();
}
void Screen::print(const Common::Point &pt, byte color, const char *formatStr, ...) {
diff --git a/engines/sherlock/screen.h b/engines/sherlock/screen.h
index 949f9debf8..8fda9cbb9c 100644
--- a/engines/sherlock/screen.h
+++ b/engines/sherlock/screen.h
@@ -181,11 +181,15 @@ public:
* Copy an image from the back buffer to the screen, taking care of both the
* new area covered by the shape as well as the old area, which must be restored
*/
- void flushImage(ImageFrame *frame, const Common::Point &pt,
- int16 *xp, int16 *yp, int16 *width, int16 *height);
+ void flushImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, int16 *yp,
+ int16 *width, int16 *height);
- void flushScaleImage(ImageFrame *frame, const Common::Point &pt,
- int16 *xp, int16 *yp, int16 *width, int16 *height, int scaleVal);
+ /**
+ * Similar to flushImage, this method takes in an extra parameter for the scale proporation,
+ * which affects the calculated bounds accordingly
+ */
+ void flushScaleImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, int16 *yp,
+ int16 *width, int16 *height, int scaleVal);
/**
* Returns the width of a string in pixels