diff options
author | Torbjörn Andersson | 2006-02-12 21:41:34 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2006-02-12 21:41:34 +0000 |
commit | 441ead453ad59680ceb34826904c8b753b23dee2 (patch) | |
tree | 493c78e497ea51ba2f124394ae8aa4819c4fd5c7 | |
parent | d1a5345169f36ea9f86ff3b0cf4cff8f911d5acf (diff) | |
download | scummvm-rg350-441ead453ad59680ceb34826904c8b753b23dee2.tar.gz scummvm-rg350-441ead453ad59680ceb34826904c8b753b23dee2.tar.bz2 scummvm-rg350-441ead453ad59680ceb34826904c8b753b23dee2.zip |
Merged _mouse.cpp and mouse.cpp into mouse.cpp
svn-id: r20659
-rw-r--r-- | engines/sword2/_mouse.cpp | 247 | ||||
-rw-r--r-- | engines/sword2/module.mk | 1 | ||||
-rw-r--r-- | engines/sword2/mouse.cpp | 217 |
3 files changed, 217 insertions, 248 deletions
diff --git a/engines/sword2/_mouse.cpp b/engines/sword2/_mouse.cpp deleted file mode 100644 index db0cf00f73..0000000000 --- a/engines/sword2/_mouse.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* Copyright (C) 1994-1998 Revolution Software Ltd. - * Copyright (C) 2003-2006 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#include "common/stdafx.h" -#include "common/system.h" -#include "common/stream.h" - -#include "sword2/sword2.h" -#include "sword2/defs.h" -#include "sword2/mouse.h" - -namespace Sword2 { - -// This is the maximum mouse cursor size in the SDL backend -#define MAX_MOUSE_W 80 -#define MAX_MOUSE_H 80 - -#define MOUSEFLASHFRAME 6 - -void Mouse::decompressMouse(byte *decomp, byte *comp, uint8 frame, int width, int height, int pitch, int xOff, int yOff) { - int32 size = width * height; - int32 i = 0; - int x = 0; - int y = 0; - - comp = comp + READ_LE_UINT32(comp + frame * 4) - MOUSE_ANIM_HEADER_SIZE; - - while (i < size) { - if (*comp > 183) { - decomp[(y + yOff) * pitch + x + xOff] = *comp++; - if (++x >= width) { - x = 0; - y++; - } - i++; - } else { - x += *comp; - while (x >= width) { - y++; - x -= width; - } - i += *comp++; - } - } -} - -void Mouse::drawMouse() { - byte mouseData[MAX_MOUSE_W * MAX_MOUSE_H]; - - if (!_mouseAnim.data && !_luggageAnim.data) - return; - - // When an object is used in the game, the mouse cursor should be a - // combination of a standard mouse cursor and a luggage cursor. - // - // However, judging by the original code luggage cursors can also - // appear on their own. I have no idea which cases though. - - uint16 mouse_width = 0; - uint16 mouse_height = 0; - uint16 hotspot_x = 0; - uint16 hotspot_y = 0; - int deltaX = 0; - int deltaY = 0; - - if (_mouseAnim.data) { - hotspot_x = _mouseAnim.xHotSpot; - hotspot_y = _mouseAnim.yHotSpot; - mouse_width = _mouseAnim.mousew; - mouse_height = _mouseAnim.mouseh; - } - - if (_luggageAnim.data) { - if (!_mouseAnim.data) { - hotspot_x = _luggageAnim.xHotSpot; - hotspot_y = _luggageAnim.yHotSpot; - } - if (_luggageAnim.mousew > mouse_width) - mouse_width = _luggageAnim.mousew; - if (_luggageAnim.mouseh > mouse_height) - mouse_height = _luggageAnim.mouseh; - } - - if (_mouseAnim.data && _luggageAnim.data) { - deltaX = _mouseAnim.xHotSpot - _luggageAnim.xHotSpot; - deltaY = _mouseAnim.yHotSpot - _luggageAnim.yHotSpot; - } - - assert(deltaX >= 0); - assert(deltaY >= 0); - - // HACK for maximum cursor size. (The SDL backend imposes this - // restriction) - - if (mouse_width + deltaX > MAX_MOUSE_W) - deltaX = 80 - mouse_width; - if (mouse_height + deltaY > MAX_MOUSE_H) - deltaY = 80 - mouse_height; - - mouse_width += deltaX; - mouse_height += deltaY; - - if ((uint32)(mouse_width * mouse_height) > sizeof(mouseData)) { - warning("Mouse cursor too large"); - return; - } - - memset(mouseData, 0, mouse_width * mouse_height); - - if (_luggageAnim.data) - decompressMouse(mouseData, _luggageAnim.data, 0, - _luggageAnim.mousew, _luggageAnim.mouseh, - mouse_width, deltaX, deltaY); - - if (_mouseAnim.data) - decompressMouse(mouseData, _mouseAnim.data, _mouseFrame, - _mouseAnim.mousew, _mouseAnim.mouseh, mouse_width); - - _vm->_system->setMouseCursor(mouseData, mouse_width, mouse_height, hotspot_x, hotspot_y, 0); -} - -/** - * Animates the current mouse pointer - */ - -int32 Mouse::animateMouse() { - uint8 prevMouseFrame = _mouseFrame; - - if (!_mouseAnim.data) - return RDERR_UNKNOWN; - - if (++_mouseFrame == _mouseAnim.noAnimFrames) - _mouseFrame = MOUSEFLASHFRAME; - - if (_mouseFrame != prevMouseFrame) - drawMouse(); - - return RD_OK; -} - -/** - * Sets the mouse cursor animation. - * @param ma a pointer to the animation data, or NULL to clear the current one - * @param size the size of the mouse animation data - * @param mouseFlash RDMOUSE_FLASH or RDMOUSE_NOFLASH, depending on whether - * or not there is a lead-in animation - */ - -int32 Mouse::setMouseAnim(byte *ma, int32 size, int32 mouseFlash) { - free(_mouseAnim.data); - _mouseAnim.data = NULL; - - if (ma) { - if (mouseFlash == RDMOUSE_FLASH) - _mouseFrame = 0; - else - _mouseFrame = MOUSEFLASHFRAME; - - Common::MemoryReadStream readS(ma, size); - - _mouseAnim.runTimeComp = readS.readByte(); - _mouseAnim.noAnimFrames = readS.readByte(); - _mouseAnim.xHotSpot = readS.readSByte(); - _mouseAnim.yHotSpot = readS.readSByte(); - _mouseAnim.mousew = readS.readByte(); - _mouseAnim.mouseh = readS.readByte(); - - _mouseAnim.data = (byte *)malloc(size - MOUSE_ANIM_HEADER_SIZE); - if (!_mouseAnim.data) - return RDERR_OUTOFMEMORY; - - readS.read(_mouseAnim.data, size - MOUSE_ANIM_HEADER_SIZE); - - animateMouse(); - drawMouse(); - - _vm->_system->showMouse(true); - } else { - if (_luggageAnim.data) - drawMouse(); - else - _vm->_system->showMouse(false); - } - - return RD_OK; -} - -/** - * Sets the "luggage" animation to accompany the mouse animation. Luggage - * sprites are of the same format as mouse sprites. - * @param ma a pointer to the animation data, or NULL to clear the current one - * @param size the size of the animation data - */ - -int32 Mouse::setLuggageAnim(byte *ma, int32 size) { - free(_luggageAnim.data); - _luggageAnim.data = NULL; - - if (ma) { - Common::MemoryReadStream readS(ma, size); - - _luggageAnim.runTimeComp = readS.readByte(); - _luggageAnim.noAnimFrames = readS.readByte(); - _luggageAnim.xHotSpot = readS.readSByte(); - _luggageAnim.yHotSpot = readS.readSByte(); - _luggageAnim.mousew = readS.readByte(); - _luggageAnim.mouseh = readS.readByte(); - - _luggageAnim.data = (byte *)malloc(size - MOUSE_ANIM_HEADER_SIZE); - if (!_luggageAnim.data) - return RDERR_OUTOFMEMORY; - - readS.read(_luggageAnim.data, size - MOUSE_ANIM_HEADER_SIZE); - - animateMouse(); - drawMouse(); - - _vm->_system->showMouse(true); - } else { - if (_mouseAnim.data) - drawMouse(); - else - _vm->_system->showMouse(false); - } - - return RD_OK; -} - -} // End of namespace Sword2 diff --git a/engines/sword2/module.mk b/engines/sword2/module.mk index bbc7f41eee..7cdd0a976d 100644 --- a/engines/sword2/module.mk +++ b/engines/sword2/module.mk @@ -1,7 +1,6 @@ MODULE := engines/sword2 MODULE_OBJS := \ - _mouse.o \ animation.o \ anims.o \ console.o \ diff --git a/engines/sword2/mouse.cpp b/engines/sword2/mouse.cpp index 83a8b1faf2..81419c39e0 100644 --- a/engines/sword2/mouse.cpp +++ b/engines/sword2/mouse.cpp @@ -20,6 +20,8 @@ */ #include "common/stdafx.h" +#include "common/system.h" + #include "sword2/sword2.h" #include "sword2/console.h" #include "sword2/controls.h" @@ -1434,4 +1436,219 @@ void Mouse::unpauseGame() { setLuggage(_realLuggageItem); } +// This is the maximum mouse cursor size in the SDL backend +#define MAX_MOUSE_W 80 +#define MAX_MOUSE_H 80 + +#define MOUSEFLASHFRAME 6 + +void Mouse::decompressMouse(byte *decomp, byte *comp, uint8 frame, int width, int height, int pitch, int xOff, int yOff) { + int32 size = width * height; + int32 i = 0; + int x = 0; + int y = 0; + + comp = comp + READ_LE_UINT32(comp + frame * 4) - MOUSE_ANIM_HEADER_SIZE; + + while (i < size) { + if (*comp > 183) { + decomp[(y + yOff) * pitch + x + xOff] = *comp++; + if (++x >= width) { + x = 0; + y++; + } + i++; + } else { + x += *comp; + while (x >= width) { + y++; + x -= width; + } + i += *comp++; + } + } +} + +void Mouse::drawMouse() { + byte mouseData[MAX_MOUSE_W * MAX_MOUSE_H]; + + if (!_mouseAnim.data && !_luggageAnim.data) + return; + + // When an object is used in the game, the mouse cursor should be a + // combination of a standard mouse cursor and a luggage cursor. + // + // However, judging by the original code luggage cursors can also + // appear on their own. I have no idea which cases though. + + uint16 mouse_width = 0; + uint16 mouse_height = 0; + uint16 hotspot_x = 0; + uint16 hotspot_y = 0; + int deltaX = 0; + int deltaY = 0; + + if (_mouseAnim.data) { + hotspot_x = _mouseAnim.xHotSpot; + hotspot_y = _mouseAnim.yHotSpot; + mouse_width = _mouseAnim.mousew; + mouse_height = _mouseAnim.mouseh; + } + + if (_luggageAnim.data) { + if (!_mouseAnim.data) { + hotspot_x = _luggageAnim.xHotSpot; + hotspot_y = _luggageAnim.yHotSpot; + } + if (_luggageAnim.mousew > mouse_width) + mouse_width = _luggageAnim.mousew; + if (_luggageAnim.mouseh > mouse_height) + mouse_height = _luggageAnim.mouseh; + } + + if (_mouseAnim.data && _luggageAnim.data) { + deltaX = _mouseAnim.xHotSpot - _luggageAnim.xHotSpot; + deltaY = _mouseAnim.yHotSpot - _luggageAnim.yHotSpot; + } + + assert(deltaX >= 0); + assert(deltaY >= 0); + + // HACK for maximum cursor size. (The SDL backend imposes this + // restriction) + + if (mouse_width + deltaX > MAX_MOUSE_W) + deltaX = 80 - mouse_width; + if (mouse_height + deltaY > MAX_MOUSE_H) + deltaY = 80 - mouse_height; + + mouse_width += deltaX; + mouse_height += deltaY; + + if ((uint32)(mouse_width * mouse_height) > sizeof(mouseData)) { + warning("Mouse cursor too large"); + return; + } + + memset(mouseData, 0, mouse_width * mouse_height); + + if (_luggageAnim.data) + decompressMouse(mouseData, _luggageAnim.data, 0, + _luggageAnim.mousew, _luggageAnim.mouseh, + mouse_width, deltaX, deltaY); + + if (_mouseAnim.data) + decompressMouse(mouseData, _mouseAnim.data, _mouseFrame, + _mouseAnim.mousew, _mouseAnim.mouseh, mouse_width); + + _vm->_system->setMouseCursor(mouseData, mouse_width, mouse_height, hotspot_x, hotspot_y, 0); +} + +/** + * Animates the current mouse pointer + */ + +int32 Mouse::animateMouse() { + uint8 prevMouseFrame = _mouseFrame; + + if (!_mouseAnim.data) + return RDERR_UNKNOWN; + + if (++_mouseFrame == _mouseAnim.noAnimFrames) + _mouseFrame = MOUSEFLASHFRAME; + + if (_mouseFrame != prevMouseFrame) + drawMouse(); + + return RD_OK; +} + +/** + * Sets the mouse cursor animation. + * @param ma a pointer to the animation data, or NULL to clear the current one + * @param size the size of the mouse animation data + * @param mouseFlash RDMOUSE_FLASH or RDMOUSE_NOFLASH, depending on whether + * or not there is a lead-in animation + */ + +int32 Mouse::setMouseAnim(byte *ma, int32 size, int32 mouseFlash) { + free(_mouseAnim.data); + _mouseAnim.data = NULL; + + if (ma) { + if (mouseFlash == RDMOUSE_FLASH) + _mouseFrame = 0; + else + _mouseFrame = MOUSEFLASHFRAME; + + Common::MemoryReadStream readS(ma, size); + + _mouseAnim.runTimeComp = readS.readByte(); + _mouseAnim.noAnimFrames = readS.readByte(); + _mouseAnim.xHotSpot = readS.readSByte(); + _mouseAnim.yHotSpot = readS.readSByte(); + _mouseAnim.mousew = readS.readByte(); + _mouseAnim.mouseh = readS.readByte(); + + _mouseAnim.data = (byte *)malloc(size - MOUSE_ANIM_HEADER_SIZE); + if (!_mouseAnim.data) + return RDERR_OUTOFMEMORY; + + readS.read(_mouseAnim.data, size - MOUSE_ANIM_HEADER_SIZE); + + animateMouse(); + drawMouse(); + + _vm->_system->showMouse(true); + } else { + if (_luggageAnim.data) + drawMouse(); + else + _vm->_system->showMouse(false); + } + + return RD_OK; +} + +/** + * Sets the "luggage" animation to accompany the mouse animation. Luggage + * sprites are of the same format as mouse sprites. + * @param ma a pointer to the animation data, or NULL to clear the current one + * @param size the size of the animation data + */ + +int32 Mouse::setLuggageAnim(byte *ma, int32 size) { + free(_luggageAnim.data); + _luggageAnim.data = NULL; + + if (ma) { + Common::MemoryReadStream readS(ma, size); + + _luggageAnim.runTimeComp = readS.readByte(); + _luggageAnim.noAnimFrames = readS.readByte(); + _luggageAnim.xHotSpot = readS.readSByte(); + _luggageAnim.yHotSpot = readS.readSByte(); + _luggageAnim.mousew = readS.readByte(); + _luggageAnim.mouseh = readS.readByte(); + + _luggageAnim.data = (byte *)malloc(size - MOUSE_ANIM_HEADER_SIZE); + if (!_luggageAnim.data) + return RDERR_OUTOFMEMORY; + + readS.read(_luggageAnim.data, size - MOUSE_ANIM_HEADER_SIZE); + + animateMouse(); + drawMouse(); + + _vm->_system->showMouse(true); + } else { + if (_mouseAnim.data) + drawMouse(); + else + _vm->_system->showMouse(false); + } + + return RD_OK; +} + } // End of namespace Sword2 |