aboutsummaryrefslogtreecommitdiff
path: root/engines/draci/sprite.cpp
diff options
context:
space:
mode:
authorRobert Špalek2009-09-27 20:49:59 +0000
committerRobert Špalek2009-09-27 20:49:59 +0000
commitcaa3b6707e4cd6a20f2d20d57f9748b8ece89852 (patch)
treef15e38f1b9400b5af07f896e8b0a4e331cefb6a5 /engines/draci/sprite.cpp
parent0a36b67a1f12490f84c1a6c1f03aa09f2e598c1f (diff)
downloadscummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.tar.gz
scummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.tar.bz2
scummvm-rg350-caa3b6707e4cd6a20f2d20d57f9748b8ece89852.zip
Improved the interface of Sprite and Animation concerning relative coordinates and scaling.
It is no longer needed to modify the underlying animations when drawing them on the screen or testing pixels in them. Read access is enough, because the displacement of the object is passed as a parameter. Added some more const's where they logically belong. svn-id: r44419
Diffstat (limited to 'engines/draci/sprite.cpp')
-rw-r--r--engines/draci/sprite.cpp48
1 files changed, 25 insertions, 23 deletions
diff --git a/engines/draci/sprite.cpp b/engines/draci/sprite.cpp
index 2028f7ab4b..1e3e749e1e 100644
--- a/engines/draci/sprite.cpp
+++ b/engines/draci/sprite.cpp
@@ -33,6 +33,8 @@
namespace Draci {
+const Displacement kNoDisplacement = { 0, 0, 1.0, 1.0 };
+
/**
* @brief Transforms an image from column-wise to row-wise
* @param img pointer to the buffer containing the image data
@@ -129,19 +131,19 @@ void Sprite::setMirrorOff() {
}
-int Sprite::getPixel(int x, int y) const {
+int Sprite::getPixel(int x, int y, const Displacement &displacement) const {
- Common::Rect rect = getRect();
+ Common::Rect rect = getRect(displacement);
int dy = y - rect.top;
int dx = x - rect.left;
// Calculate scaling factors
- double scaleX = double(_scaledWidth) / _width;
- double scaleY = double(_scaledHeight) / _height;
+ double scaleX = double(rect.width()) / _width;
+ double scaleY = double(rect.height()) / _height;
- int sy = scummvm_lround(dy * scaleY);
- int sx = scummvm_lround(dx * scaleX);
+ int sy = scummvm_lround(dy / scaleY);
+ int sx = scummvm_lround(dx / scaleX);
if (_mirror)
return _data[sy * _width + (_width - sx)];
@@ -150,10 +152,15 @@ int Sprite::getPixel(int x, int y) const {
}
-void Sprite::drawScaled(Surface *surface, bool markDirty) const {
+void Sprite::drawReScaled(Surface *surface, bool markDirty, const Displacement &displacement) const {
Common::Rect sourceRect(0, 0, _width, _height);
- Common::Rect destRect(_x, _y, _x + _scaledWidth, _y + _scaledHeight);
+ Common::Rect destRect(getRect(displacement));
+
+ // Calculate scaling factors
+ double scaleX = double(destRect.width()) / _width;
+ double scaleY = double(destRect.height()) / _height;
+
Common::Rect surfaceRect(0, 0, surface->w, surface->h);
Common::Rect clippedDestRect(destRect);
@@ -184,10 +191,6 @@ void Sprite::drawScaled(Surface *surface, bool markDirty) const {
int *rowIndices = new int[rows];
int *columnIndices = new int[columns];
- // Calculate scaling factors
- double scaleX = double(_scaledWidth) / _width;
- double scaleY = double(_scaledHeight) / _height;
-
// Precalculate pixel indexes
for (int i = 0; i < rows; ++i) {
rowIndices[i] = scummvm_lround(i / scaleY);
@@ -241,10 +244,10 @@ void Sprite::drawScaled(Surface *surface, bool markDirty) const {
* Draws the sprite to a Draci::Surface and marks its rectangle on the surface as dirty.
* It is safe to call it for sprites that would overflow the surface.
*/
-void Sprite::draw(Surface *surface, bool markDirty) const {
+void Sprite::draw(Surface *surface, bool markDirty, int relX, int relY) const {
Common::Rect sourceRect(0, 0, _width, _height);
- Common::Rect destRect(_x, _y, _x + _width, _y + _height);
+ Common::Rect destRect(_x + relX, _y + relY, _x + relX + _width, _y + relY + _height);
Common::Rect surfaceRect(0, 0, surface->w, surface->h);
Common::Rect clippedDestRect(destRect);
@@ -295,11 +298,10 @@ void Sprite::draw(Surface *surface, bool markDirty) const {
}
-Common::Rect Sprite::getRect(bool scaled) const {
- if (scaled)
- return Common::Rect(_x, _y, _x + _scaledWidth, _y + _scaledHeight);
- else
- return Common::Rect(_x, _y, _x + _width, _y + _height);
+Common::Rect Sprite::getRect(const Displacement &displacement) const {
+ return Common::Rect(_x + displacement.relX, _y + displacement.relY,
+ _x + displacement.relX + (int) (_scaledWidth * displacement.extraScaleX),
+ _y + displacement.relY + (int) (_scaledHeight * displacement.extraScaleY));
}
Text::Text(const Common::String &str, const Font *font, byte fontColour,
@@ -356,13 +358,13 @@ uint Text::getLength() const {
return _length;
}
-void Text::draw(Surface *surface, bool markDirty) const {
- _font->drawString(surface, _text, _x, _y, _colour, _spacing);
+void Text::draw(Surface *surface, bool markDirty, int relX, int relY) const {
+ _font->drawString(surface, _text, _x + relX, _y + relY, _colour, _spacing);
}
// TODO: Handle scaled parameter properly by implementing Text scaling
-Common::Rect Text::getRect(bool scaled) const {
- return Common::Rect(_x, _y, _x + _width, _y + _height);
+Common::Rect Text::getRect(const Displacement &displacement) const {
+ return Common::Rect(_x + displacement.relX, _y + displacement.relY, _x + displacement.relX + _width, _y + displacement.relY + _height);
}
void Text::setFont(const Font *font) {