mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-01 15:09:47 +00:00
WINTERMUTE: s/*transform/const &transform/
This commit is contained in:
parent
f014cccb94
commit
9f97ad6a3e
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user