aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/tsage/core.cpp18
-rw-r--r--engines/tsage/core.h1
-rw-r--r--engines/tsage/graphics.cpp25
-rw-r--r--engines/tsage/graphics.h3
4 files changed, 36 insertions, 11 deletions
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 040dbc8c25..a281354f0d 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -2707,6 +2707,9 @@ GfxSurface SceneObject::getFrame() {
_visageImages.setVisage(_visage, _strip);
GfxSurface frame = _visageImages.getFrame(_frame);
+ // Reset any centroid adjustment flags
+ _visageImages.getFrameFlags(_frame) &= ~(FRAME_FLIP_CENTROID_X | FRAME_FLIP_CENTROID_Y);
+
// If shading is needed, post apply the shadiing onto the frame
if ((g_vm->getGameID() == GType_Ringworld2) && (_shade >= 1)) {
Graphics::Surface s = frame.lockSurface();
@@ -2727,6 +2730,7 @@ GfxSurface SceneObject::getFrame() {
void SceneObject::reposition() {
GfxSurface frame = getFrame();
+
_bounds.resize(frame, _position.x, _position.y - _yDiff, _percent);
_xs = _bounds.left;
_xe = _bounds.right;
@@ -3296,6 +3300,20 @@ GfxSurface Visage::getFrame(int frameNum) {
return result;
}
+byte &Visage::getFrameFlags(int frameNum) {
+ int numFrames = READ_LE_UINT16(_data);
+ if (frameNum > numFrames)
+ frameNum = numFrames;
+ if (frameNum > 0)
+ --frameNum;
+
+ int offset = READ_LE_UINT32(_data + 2 + frameNum * 4);
+ byte *frameData = _data + offset;
+
+ return *(frameData + 9);
+}
+
+
int Visage::getFrameCount() const {
return READ_LE_UINT16(_data);
}
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 05f6f4b3a0..62f4cf2c7e 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -490,6 +490,7 @@ public:
void setVisage(int resNum, int rlbNum = 9999);
GfxSurface getFrame(int frameNum);
+ byte &getFrameFlags(int frameNum);
int getFrameCount() const;
Visage &operator=(const Visage &gfxSurface);
};
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index 446c56662a..33ddb8bcec 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -71,19 +71,14 @@ GfxSurface surfaceFromRes(const byte *imgData) {
s._transColor = *(imgData + 8);
byte flags = imgData[9];
+ s._flags = (g_vm->getGameID() != GType_Ringworld) ? flags : 0;
+
bool rleEncoded = (flags & 2) != 0;
// Figure out the centroid
s._centroid.x = READ_LE_UINT16(imgData + 4);
s._centroid.y = READ_LE_UINT16(imgData + 6);
- if (g_vm->getGameID() != GType_Ringworld) {
- if (flags & 4)
- s._centroid.x = r.width() - (s._centroid.x + 1);
- if (flags & 8)
- s._centroid.y = r.height() - (s._centroid.y + 1);
- }
-
const byte *srcP = imgData + 10;
Graphics::Surface destSurface = s.lockSurface();
byte *destP = (byte *)destSurface.getPixels();
@@ -194,8 +189,9 @@ void Rect::contain(const Rect &r) {
* @percent Scaling percentage
*/
void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) {
- int xe = surface.getBounds().width() * percent / 100;
- int ye = surface.getBounds().height() * percent / 100;
+ const Rect &bounds = surface.getBounds();
+ int xe = bounds.width() * percent / 100;
+ int ye = bounds.height() * percent / 100;
this->set(0, 0, xe, ye);
if (!right) ++right;
@@ -203,8 +199,13 @@ void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) {
this->moveTo(xp, yp);
- int xd = surface._centroid.x * percent / 100;
- int yd = surface._centroid.y * percent / 100;
+ int xa = (surface._flags & FRAME_FLIP_CENTROID_X) == 0 ? surface._centroid.x :
+ bounds.width() - (surface._centroid.x + 1);
+ int ya = (surface._flags & FRAME_FLIP_CENTROID_Y) == 0 ? surface._centroid.y :
+ bounds.height() - (surface._centroid.y + 1);
+
+ int xd = xa * percent / 100;
+ int yd = ya * percent / 100;
this->translate(-xd, -yd);
}
@@ -234,6 +235,7 @@ GfxSurface::GfxSurface() : _bounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) {
_customSurface = NULL;
_transColor = -1;
_trackDirtyRects = false;
+ _flags = 0;
}
GfxSurface::GfxSurface(const GfxSurface &s) {
@@ -417,6 +419,7 @@ GfxSurface &GfxSurface::operator=(const GfxSurface &s) {
_bounds = s._bounds;
_centroid = s._centroid;
_transColor = s._transColor;
+ _flags = s._flags;
if (_customSurface) {
// Surface owns the internal data, so replicate it so new surface owns it's own
diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h
index 858731a1ac..47961dd02a 100644
--- a/engines/tsage/graphics.h
+++ b/engines/tsage/graphics.h
@@ -71,6 +71,8 @@ public:
LineSlice(int xStart, int xEnd) { xs = xStart; xe = xEnd; }
};
+enum FrameFlag { FRAME_FLIP_CENTROID_X = 4, FRAME_FLIP_CENTROID_Y = 8 };
+
class GfxSurface {
private:
Graphics::Surface *_customSurface;
@@ -89,6 +91,7 @@ public:
Common::Point _centroid;
int _transColor;
Rect _clipRect;
+ byte _flags;
public:
GfxSurface();
GfxSurface(const GfxSurface &s);