aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorjohndoe1232011-07-13 23:00:39 +0000
committerWillem Jan Palenstijn2013-05-08 20:38:47 +0200
commit264777893578186cb27113f5918ef5e62fcfb836 (patch)
tree0cdc8bd3f058f512fbc34a009f085c9afb4e9b90 /engines
parent436f8952bbd168c53481bd19f9d79372dd0561c9 (diff)
downloadscummvm-rg350-264777893578186cb27113f5918ef5e62fcfb836.tar.gz
scummvm-rg350-264777893578186cb27113f5918ef5e62fcfb836.tar.bz2
scummvm-rg350-264777893578186cb27113f5918ef5e62fcfb836.zip
NEVERHOOD: Fix crash/corruption in clipped sprite drawing
Diffstat (limited to 'engines')
-rw-r--r--engines/neverhood/neverhood.cpp10
-rw-r--r--engines/neverhood/scene.cpp1
-rw-r--r--engines/neverhood/screen.cpp20
3 files changed, 15 insertions, 16 deletions
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index abae6eb70a..9e1475fe03 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -89,6 +89,7 @@ Common::Error NeverhoodEngine::run() {
CursorMan.showMouse(true);
{
+ // DEBUG: Dummy cursor
byte buffer[2*2];
memset(buffer, 255, 4);
CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0);
@@ -166,22 +167,13 @@ Common::Error NeverhoodEngine::run() {
_mouseY = event.mouse.y;
_gameModule->handleMouseMove(event.mouse.x, event.mouse.y);
break;
-
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_RBUTTONDOWN:
_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
break;
-
/*
- _buttonState |= kLeftButton;
- break;
case Common::EVENT_LBUTTONUP:
- _buttonState &= ~kLeftButton;
- break;
- _buttonState |= kRightButton;
- break;
case Common::EVENT_RBUTTONUP:
- _buttonState &= ~kRightButton;
break;
case Common::EVENT_QUIT:
_system->quit();
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 7252e391a0..2b5c81b4ad 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -179,7 +179,6 @@ void Scene::update() {
if (_smkFileHash != 0) {
// TODO
- //**** ALL TODO
_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
_savedUpdateHandlerCb = _updateHandlerCb;
_savedMessageHandlerCb = _messageHandlerCb;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 7b3d4bc6e5..a88491424c 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -104,7 +104,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
else
ddRect.x2 = drawRect.width;
- if (drawRect.x <= clipRect.x1) {
+ if (drawRect.x < clipRect.x1) {
destX = clipRect.x1;
ddRect.x1 = clipRect.x1 - drawRect.x;
} else {
@@ -117,7 +117,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
else
ddRect.y2 = drawRect.height;
- if (drawRect.y <= clipRect.y1) {
+ if (drawRect.y < clipRect.y1) {
destY = clipRect.y1;
ddRect.y1 = clipRect.y1 - drawRect.y;
} else {
@@ -125,13 +125,16 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
ddRect.y1 = 0;
}
- debug(8, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
-
+ debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+
const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
int width = ddRect.x2 - ddRect.x1;
int height = ddRect.y2 - ddRect.y1;
+ if (width <= 0 || height <= 0)
+ return;
+
if (!transparent) {
while (height--) {
memcpy(dest, source, width);
@@ -146,8 +149,13 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
source += surface->pitch;
dest += _backScreen->pitch;
}
- }
-
+ }
+
+ // Useful for debugging
+ //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250);
+ //_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255);
+ //_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255);
+
}
void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {