aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/graphics/cursor.h
blob: 8d9ce7c0ab3a0023b2e398e51c5a7e02dfce81b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* 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.
 *
 */

#ifndef SCI_GRAPHICS_CURSOR_H
#define SCI_GRAPHICS_CURSOR_H

#include "common/array.h"
#include "common/hashmap.h"
#include "sci/sci.h"
#include "sci/graphics/helpers.h"
#include "sci/util.h"

namespace Sci {

enum {
	SCI_CURSOR_SCI0_HEIGHTWIDTH = 16,
	SCI_CURSOR_SCI0_RESOURCESIZE = 68,
	SCI_CURSOR_SCI0_TRANSPARENCYCOLOR = 1
};

class GfxView;
class GfxPalette;

typedef Common::HashMap<int, GfxView *> CursorCache;

struct SciCursorSetPositionWorkarounds {
	SciGameId gameId;
	int16 newPositionY;
	int16 newPositionX;
	int16 rectTop;
	int16 rectLeft;
	int16 rectBottom;
	int16 rectRight;
};

class GfxCursor {
public:
	GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *screen);
	~GfxCursor();

	void init(GfxCoordAdjuster16 *coordAdjuster, EventManager *event);

	void kernelShow();
	void kernelHide();
	bool isVisible();
	void kernelSetShape(GuiResourceId resourceId);
	void kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Common::Point *hotspot);
	void kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNum);
	void setPosition(Common::Point pos);
	Common::Point getPosition();
	void refreshPosition();

	/**
	 * Removes limit for mouse movement
	 */
	void kernelResetMoveZone();

	/**
	 * Limits the mouse movement to a given rectangle.
	 *
	 * @param[in] rect	The rectangle
	 */
	void kernelSetMoveZone(Common::Rect zone);

	/**
	 * Creates a dynamic zoom cursor, that is used to zoom on specific parts of the screen,
	 * using a separate larger picture. This was only used by two SCI1.1 games, Laura Bow 2
	 * (for examining the glyphs), and Freddy Pharkas (for examining the prescription with
	 * the whisky glass).
	 *
	 * In the Mac version of Freddy Pharkas, this was removed completely, and the scene has
	 * been redesigned to work without this functionality. There was no version of LB2 for
	 * the Macintosh platform.
	 */
	void kernelSetZoomZone(byte multiplier, Common::Rect zone, GuiResourceId viewNum, int loopNum, int celNum, GuiResourceId picNum, byte zoomColor);
	void kernelClearZoomZone();

	void kernelSetPos(Common::Point pos);
	void kernelMoveCursor(Common::Point pos);

private:
	void purgeCache();

	ResourceManager *_resMan;
	GfxScreen *_screen;
	GfxPalette *_palette;
	GfxCoordAdjuster16 *_coordAdjuster;
	EventManager *_event;

	int _upscaledHires;

	bool _moveZoneActive;
	Common::Rect _moveZone; // Rectangle in which the pointer can move

	bool _zoomZoneActive;
	Common::Rect _zoomZone;
	GfxView *_zoomCursorView;
	byte _zoomCursorLoop;
	byte _zoomCursorCel;
	GfxView *_zoomPicView;
	byte _zoomColor;
	byte _zoomMultiplier;
	Common::SpanOwner<SciSpan<byte> > _cursorSurface;

	CursorCache _cachedCursors;

	bool _isVisible;

	// KQ6 Windows has different black and white cursors. If this is true (set
	// from the windows_cursors ini setting), then we use these and don't scale
	// them by 2x like the rest of the graphics, like SSCI did. These look very
	// ugly, which is why they aren't enabled by default.
	bool _useOriginalKQ6WinCursors;

	// The CD version of SQ4 contains a complete set of silver mouse cursors.
	// If this is true (set from the silver_cursors ini setting), then we use
	// these instead and replace the game's gold cursors with their silver
	// equivalents.
	bool _useSilverSQ4CDCursors;
};

} // End of namespace Sci

#endif