aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/wintermute/base/base_sub_frame.cpp2
-rw-r--r--engines/wintermute/base/gfx/osystem/render_ticket.cpp4
-rw-r--r--engines/wintermute/graphics/transform_tools.cpp21
-rw-r--r--engines/wintermute/graphics/transform_tools.h2
-rw-r--r--engines/wintermute/graphics/transparent_surface.cpp23
-rw-r--r--engines/wintermute/graphics/transparent_surface.h2
6 files changed, 30 insertions, 24 deletions
diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp
index eb1c859c2f..dbf46eae2e 100644
--- a/engines/wintermute/base/base_sub_frame.cpp
+++ b/engines/wintermute/base/base_sub_frame.cpp
@@ -269,7 +269,7 @@ bool BaseSubFrame::draw(int x, int y, BaseObject *registerOwner, float zoomX, fl
Rect32 oldRect = getRect();
Point32 newHotspot;
TransformStruct transform = TransformStruct(zoomX, zoomY, rotate, _hotspotX, _hotspotY, blendMode, alpha, _mirrorX, _mirrorY, 0, 0);
- Rect32 newRect = TransformTools::newRect (oldRect, transform, &newHotspot);
+ Rect32 newRect = TransformTools::newRect (oldRect, &transform, &newHotspot);
newOrigin = origin - newHotspot;
res = _surface->displayTransform(newOrigin.x, newOrigin.y, oldRect, newRect, transform);
} else {
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
index 3f94c2e500..8ea4f18605 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@ -53,7 +53,7 @@ RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *s
// Then scale it if necessary
if (_transform._angle != 0) {
TransparentSurface src(*_surface, false);
- Graphics::Surface *temp = src.rotate(transform);
+ Graphics::Surface *temp = src.rotate(&transform);
_surface->free();
delete _surface;
_surface = temp;
@@ -70,7 +70,7 @@ RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *s
if (transform._angle != 0) { // Make sure comparison-tickets get the correct width
Rect32 dstRect;
Point32 newHotspot;
- dstRect = TransformTools::newRect(_srcRect, transform, &newHotspot);
+ dstRect = TransformTools::newRect(_srcRect, &transform, &newHotspot);
_dstRect.setWidth(dstRect.right-dstRect.left);
_dstRect.setHeight(dstRect.bottom-dstRect.top);
}
diff --git a/engines/wintermute/graphics/transform_tools.cpp b/engines/wintermute/graphics/transform_tools.cpp
index f0a092a31b..2388b88236 100644
--- a/engines/wintermute/graphics/transform_tools.cpp
+++ b/engines/wintermute/graphics/transform_tools.cpp
@@ -43,7 +43,10 @@ namespace Wintermute {
return newPoint;
}
- Rect32 TransformTools::newRect (Rect32 oldRect, TransformStruct transform, Point32 *newHotspot) {
+ Rect32 TransformTools::newRect (Rect32 oldRect, TransformStruct *transform, Point32 *newHotspot) {
+
+ assert (transform);
+
Point32 nw(oldRect.left, oldRect.top);
Point32 ne(oldRect.right, oldRect.top);
Point32 sw(oldRect.left, oldRect.bottom);
@@ -51,10 +54,10 @@ namespace Wintermute {
FloatPoint nw1, ne1, sw1, se1;
- nw1 = transformPoint(nw - transform._hotspot, transform._angle, transform._zoom);
- ne1 = transformPoint(ne - transform._hotspot, transform._angle, transform._zoom);
- sw1 = transformPoint(sw - transform._hotspot, transform._angle, transform._zoom);
- se1 = transformPoint(se - transform._hotspot, transform._angle, transform._zoom);
+ nw1 = transformPoint(nw - transform->_hotspot, transform->_angle, transform->_zoom);
+ ne1 = transformPoint(ne - transform->_hotspot, transform->_angle, transform->_zoom);
+ sw1 = transformPoint(sw - transform->_hotspot, transform->_angle, transform->_zoom);
+ se1 = transformPoint(se - transform->_hotspot, transform->_angle, transform->_zoom);
float top = MIN(nw1.y, MIN(ne1.y, MIN(sw1.y, se1.y)));
float bottom = MAX(nw1.y, MAX(ne1.y, MAX(sw1.y, se1.y)));
@@ -65,10 +68,10 @@ namespace Wintermute {
newHotspot->y = -floor(top);
newHotspot->x = -floor(left);
- res.top = floor(top) + transform._hotspot.y;
- res.bottom = ceil(bottom) + transform._hotspot.y;
- res.left = floor(left) + transform._hotspot.x;
- res.right = ceil(right) + transform._hotspot.x;
+ res.top = floor(top) + transform->_hotspot.y;
+ res.bottom = ceil(bottom) + transform->_hotspot.y;
+ res.left = floor(left) + transform->_hotspot.x;
+ res.right = ceil(right) + transform->_hotspot.x;
return res;
}
diff --git a/engines/wintermute/graphics/transform_tools.h b/engines/wintermute/graphics/transform_tools.h
index fbc0653e64..ae60e5ab32 100644
--- a/engines/wintermute/graphics/transform_tools.h
+++ b/engines/wintermute/graphics/transform_tools.h
@@ -41,7 +41,7 @@ public:
* and, as a side-effect, "newHotspot" will tell you where the hotspot will
* have ended up in the new rect, for centering.
*/
- static Rect32 newRect (Rect32 oldRect, TransformStruct transform, Point32 *newHotspot);
+ static Rect32 newRect (Rect32 oldRect, TransformStruct *transform, Point32 *newHotspot);
};
} // end of namespace Wintermute
#endif
diff --git a/engines/wintermute/graphics/transparent_surface.cpp b/engines/wintermute/graphics/transparent_surface.cpp
index 5606d41ae6..1139b08199 100644
--- a/engines/wintermute/graphics/transparent_surface.cpp
+++ b/engines/wintermute/graphics/transparent_surface.cpp
@@ -496,7 +496,10 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
return retSize;
}
-TransparentSurface *TransparentSurface::rotate(TransformStruct transform) const {
+TransparentSurface *TransparentSurface::rotate(TransformStruct *transform) const {
+
+ assert (transform);
+
Point32 newHotspot;
Common::Rect srcRect(0, 0, (int16)w, (int16)h);
Rect32 rect = TransformTools::newRect(Rect32 (srcRect), transform, &newHotspot);
@@ -510,7 +513,7 @@ TransparentSurface *TransparentSurface::rotate(TransformStruct transform) const
target->create((uint16)dstW, (uint16)dstH, this->format);
- uint32 invAngle = (360 - transform._angle) % 360;
+ uint32 invAngle = (360 - transform->_angle) % 360;
float invCos = cos(invAngle * M_PI / 180.0);
float invSin = sin(invAngle * M_PI / 180.0);
float targX;
@@ -522,11 +525,11 @@ TransparentSurface *TransparentSurface::rotate(TransformStruct transform) const
int x1 = x - newHotspot.x;
int y1 = y - newHotspot.y;
- targX = ((x1 * invCos - y1 * invSin)) * 100.0 / transform._zoom.x + srcRect.left;
- targY = ((x1 * invSin + y1 * invCos)) * 100.0 / transform._zoom.y + srcRect.top;
+ targX = ((x1 * invCos - y1 * invSin)) * 100.0 / transform->_zoom.x + srcRect.left;
+ targY = ((x1 * invSin + y1 * invCos)) * 100.0 / transform->_zoom.y + srcRect.top;
- targX += transform._hotspot.x;
- targY += transform._hotspot.y;
+ targX += transform->_hotspot.x;
+ targY += transform->_hotspot.y;
copyPixelNearestNeighbor(targX, targY, x, y, srcRect, dstRect, this, target);
}
@@ -537,11 +540,11 @@ TransparentSurface *TransparentSurface::rotate(TransformStruct transform) const
int x1 = x - newHotspot.x;
int y1 = y - newHotspot.y;
- targX = ((x1 * invCos - y1 * invSin)) * 100.0 / transform._zoom.x + srcRect.left;
- targY = ((x1 * invSin + y1 * invCos)) * 100.0 / transform._zoom.y + srcRect.top;
+ targX = ((x1 * invCos - y1 * invSin)) * 100.0 / transform->_zoom.x + srcRect.left;
+ targY = ((x1 * invSin + y1 * invCos)) * 100.0 / transform->_zoom.y + srcRect.top;
- targX += transform._hotspot.x;
- targY += transform._hotspot.y;
+ targX += transform->_hotspot.x;
+ targY += transform->_hotspot.y;
copyPixelBilinear(targX, targY, x, y, srcRect, dstRect, this, target);
}
diff --git a/engines/wintermute/graphics/transparent_surface.h b/engines/wintermute/graphics/transparent_surface.h
index f9486d1b25..c01b10d96f 100644
--- a/engines/wintermute/graphics/transparent_surface.h
+++ b/engines/wintermute/graphics/transparent_surface.h
@@ -111,7 +111,7 @@ struct TransparentSurface : public Graphics::Surface {
void applyColorKey(uint8 r, uint8 g, uint8 b, bool overwriteAlpha = false);
TransparentSurface *scale (uint16 newWidth, uint16 newHeight) const;
- TransparentSurface *rotate(TransformStruct transform) const;
+ TransparentSurface *rotate(TransformStruct *transform) const;
static byte *_lookup;
static void destroyLookup();
private: