WINTERMUTE: s/*transform/const &transform/

This commit is contained in:
Tobia Tesan 2013-07-10 11:42:16 +02:00
parent f014cccb94
commit 9f97ad6a3e
6 changed files with 63 additions and 66 deletions

View File

@ -270,7 +270,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 {

View File

@ -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.rotoscale(&transform);
Graphics::Surface *temp = src.rotoscale(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);
}

View File

@ -40,9 +40,7 @@ namespace Wintermute {
return newPoint;
}
Rect32 TransformTools::newRect (Rect32 oldRect, TransformStruct *transform, Point32 *newHotspot) {
assert (transform);
Rect32 TransformTools::newRect (Rect32 oldRect, const TransformStruct &transform, Point32 *newHotspot) {
Point32 nw(oldRect.left, oldRect.top);
Point32 ne(oldRect.right, oldRect.top);
@ -51,10 +49,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 +63,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;
}

View File

@ -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, const TransformStruct &transform, Point32 *newHotspot);
};
} // end of namespace Wintermute
#endif

View File

@ -496,10 +496,9 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
return retSize;
}
TransparentSurface *TransparentSurface::rotoscale(TransformStruct *transform) const {
TransparentSurface *TransparentSurface::rotoscale(const TransformStruct &transform) const {
assert (transform);
assert (transform->_angle != 0); // This would not be ideal
assert (transform._angle != 0); // This would not be ideal
Point32 newHotspot;
Common::Rect srcRect(0, 0, (int16)w, (int16)h);
@ -514,43 +513,43 @@ TransparentSurface *TransparentSurface::rotoscale(TransformStruct *transform) co
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;
float targY;
if (FAST_TRANSFORM) {
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
int x1 = x - newHotspot.x;
int y1 = y - newHotspot.y;
#if ENABLE_BILINEAR
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
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);
}
}
} else {
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
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 += transform->_hotspot.x;
targY += transform->_hotspot.y;
copyPixelBilinear(targX, targY, x, y, srcRect, dstRect, this, target);
}
copyPixelBilinear(targX, targY, x, y, srcRect, dstRect, this, target);
}
}
#else
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
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 += transform._hotspot.x;
targY += transform._hotspot.y;
copyPixelNearestNeighbor(targX, targY, x, y, srcRect, dstRect, this, target);
}
}
#endif
return target;
}
@ -570,27 +569,27 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
target->create((uint16)dstW, (uint16)dstH, this->format);
if (FAST_TRANSFORM) {
int projX;
int projY;
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
projX = x / dstW * srcW;
projY = y / dstH * srcH;
copyPixelNearestNeighbor(projX, projY, x, y, srcRect, dstRect, this, target);
}
}
} else {
float projX;
float projY;
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
projX = x / (float)dstW * srcW;
projY = y / (float)dstH * srcH;
copyPixelBilinear(projX, projY, x, y, srcRect, dstRect, this, target);
}
#if ENABLE_BILINEAR
float projX;
float projY;
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
projX = x / (float)dstW * srcW;
projY = y / (float)dstH * srcH;
copyPixelBilinear(projX, projY, x, y, srcRect, dstRect, this, target);
}
}
#else
int projX;
int projY;
for (int y = 0; y < dstH; y++) {
for (int x = 0; x < dstW; x++) {
projX = x / dstW * srcW;
projY = y / dstH * srcH;
copyPixelNearestNeighbor(projX, projY, x, y, srcRect, dstRect, this, target);
}
}
#endif
return target;
}

View File

@ -25,7 +25,7 @@
#include "graphics/surface.h"
#include "engines/wintermute/graphics/transform_struct.h"
#define FAST_TRANSFORM 0
#define ENABLE_BILINEAR 0
/*
@ -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 *rotoscale (TransformStruct *transform) const;
TransparentSurface *rotoscale (const TransformStruct &transform) const;
static byte *_lookup;
static void destroyLookup();
private: