scummvm/engines/prince/cursor.cpp
2018-05-05 23:17:34 +02:00

154 lines
3.9 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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.
*
*/
#include "graphics/cursorman.h"
#include "prince/prince.h"
#include "prince/cursor.h"
#include "prince/debugger.h"
#include "prince/script.h"
#include "common/debug.h"
namespace Prince {
Cursor::Cursor() : _surface(nullptr) {
}
Cursor::~Cursor() {
if (_surface != nullptr) {
_surface->free();
delete _surface;
_surface = nullptr;
}
}
bool Cursor::loadStream(Common::SeekableReadStream &stream) {
stream.skip(4);
uint16 width = stream.readUint16LE();
uint16 height = stream.readUint16LE();
_surface = new Graphics::Surface();
_surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
for (int h = 0; h < height; h++) {
stream.read(_surface->getBasePtr(0, h), width);
}
return true;
}
void PrinceEngine::changeCursor(uint16 curId) {
_debugger->_cursorNr = curId;
_mouseFlag = curId;
_flags->setFlagValue(Flags::MOUSEENABLED, curId);
const Graphics::Surface *curSurface = nullptr;
switch (curId) {
default:
error("Unknown cursor Id: %d", curId);
case 0:
CursorMan.showMouse(false);
_optionsFlag = 0;
_selectedMob = -1;
return;
case 1:
curSurface = _cursor1->getSurface();
break;
case 2:
curSurface = _cursor2;
break;
case 3:
curSurface = _cursor3->getSurface();
Common::Point mousePos = _system->getEventManager()->getMousePos();
mousePos.x = CLIP(mousePos.x, (int16) 315, (int16) 639);
mousePos.y = CLIP(mousePos.y, (int16) 0, (int16) 170);
_system->warpMouse(mousePos.x, mousePos.y);
break;
}
CursorMan.replaceCursorPalette(_roomBmp->getPalette(), 0, 255);
CursorMan.replaceCursor(
curSurface->getBasePtr(0, 0),
curSurface->w, curSurface->h,
0, 0,
255, false,
&curSurface->format
);
CursorMan.showMouse(true);
}
void PrinceEngine::makeInvCursor(int itemNr) {
const Graphics::Surface *cur1Surface = _cursor1->getSurface();
int cur1W = cur1Surface->w;
int cur1H = cur1Surface->h;
const Common::Rect cur1Rect(0, 0, cur1W, cur1H);
const Graphics::Surface *itemSurface = _allInvList[itemNr].getSurface();
int itemW = itemSurface->w;
int itemH = itemSurface->h;
int cur2W = cur1W + itemW / 2;
int cur2H = cur1H + itemH / 2;
if (_cursor2 != nullptr) {
_cursor2->free();
delete _cursor2;
}
_cursor2 = new Graphics::Surface();
_cursor2->create(cur2W, cur2H, Graphics::PixelFormat::createFormatCLUT8());
Common::Rect cur2Rect(0, 0, cur2W, cur2H);
_cursor2->fillRect(cur2Rect, 255);
_cursor2->copyRectToSurface(*cur1Surface, 0, 0, cur1Rect);
const byte *src1 = (const byte *)itemSurface->getBasePtr(0, 0);
byte *dst1 = (byte *)_cursor2->getBasePtr(cur1W, cur1H);
if (itemH % 2) {
itemH--;
}
if (itemW % 2) {
itemW--;
}
for (int y = 0; y < itemH; y++) {
const byte *src2 = src1;
byte *dst2 = dst1;
if (y % 2 == 0) {
for (int x = 0; x < itemW; x++, src2++) {
if (x % 2 == 0) {
if (*src2) {
*dst2 = *src2;
} else {
*dst2 = 255;
}
dst2++;
}
}
dst1 += _cursor2->pitch;
}
src1 += itemSurface->pitch;
}
}
} // End of namespace Prince