aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/sprites.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2015-01-18 19:12:10 -0500
committerPaul Gilbert2015-01-18 19:12:10 -0500
commit07a10855be2f60ae253623c26c8bb0ac38e58af4 (patch)
treeeb8601359c50ac740a6fa529872a8fdb85938ca6 /engines/xeen/sprites.cpp
parentf18a8c364b2b2f608081bb79cad54de3abacd111 (diff)
downloadscummvm-rg350-07a10855be2f60ae253623c26c8bb0ac38e58af4.tar.gz
scummvm-rg350-07a10855be2f60ae253623c26c8bb0ac38e58af4.tar.bz2
scummvm-rg350-07a10855be2f60ae253623c26c8bb0ac38e58af4.zip
XEEN: In progress work on sprite scaling
Diffstat (limited to 'engines/xeen/sprites.cpp')
-rw-r--r--engines/xeen/sprites.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/engines/xeen/sprites.cpp b/engines/xeen/sprites.cpp
index 8a14ec0178..8ddf4ed48d 100644
--- a/engines/xeen/sprites.cpp
+++ b/engines/xeen/sprites.cpp
@@ -228,11 +228,35 @@ void SpriteResource::drawOffset(XSurface &dest, uint16 offset, const Common::Poi
dest.addDirtyRect(r);
}
-void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos, int flags) const {
- // TODO: Support the different flags
- drawOffset(dest, _index[frame]._offset1, destPos, flags);
- if (_index[frame]._offset2)
- drawOffset(dest, _index[frame]._offset2, destPos, flags);
+void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos,
+ int flags, int scale) const {
+ if (scale == 0) {
+ drawOffset(dest, _index[frame]._offset1, destPos, flags);
+ if (_index[frame]._offset2)
+ drawOffset(dest, _index[frame]._offset2, destPos, flags);
+ } else {
+ // Get the bounds for the surface and create a temporary one
+ Common::MemoryReadStream f(_data, _filesize);
+ f.seek(_index[frame]._offset1);
+ int xOffset = f.readUint16LE();
+ int width = f.readUint16LE();
+ int yOffset = f.readUint16LE();
+ int height = f.readUint16LE();
+ XSurface tempSurface(xOffset + width, yOffset + height);
+
+ // Draw sprite into temporary surface
+ tempSurface.fillRect(Common::Rect(0, 0, width, height), 0);
+ drawOffset(tempSurface, _index[frame]._offset1, Common::Point(), flags);
+ if (_index[frame]._offset2)
+ drawOffset(tempSurface, _index[frame]._offset2, Common::Point(), flags);
+
+ // TODO: I don't currently know the algorithm the original used for scaling.
+ // This is a best fit estimate that every increment of the scale field
+ // reduces the size of a sprite by approximately 6.6%
+ int newScale = MAX(100.0 - 6.6 * scale, 0.0);
+ if (newScale > 0)
+ tempSurface.transBlitTo(dest, Common::Point(), newScale, 0);
+ }
}
void SpriteResource::draw(XSurface &dest, int frame) const {