aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins/graphics.h
blob: 268db7fc2badcb1a6491fa03315ec751aaa1095f (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/* 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 HOPKINS_GRAPHICS_H
#define HOPKINS_GRAPHICS_H

#include "common/scummsys.h"
#include "common/array.h"
#include "common/endian.h"
#include "common/rect.h"
#include "common/str.h"
#include "graphics/surface.h"

namespace Hopkins {

#define DIRTY_RECTS_SIZE 250
#define PALETTE_SIZE 256
#define PALETTE_BLOCK_SIZE (PALETTE_SIZE * 3)
#define PALETTE_EXT_BLOCK_SIZE 800
static const byte kSetOffset = 251;
static const byte kByteStop = 252;
static const byte k8bVal = 253;
static const byte k16bVal = 254;

struct RGB8 {
	byte r;
	byte g;
	byte b;
};

class HopkinsEngine;

class GraphicsManager {
private:
	HopkinsEngine *_vm;

	int _lockCounter;
	bool _initGraphicsFl;
	int _screenWidth;
	int _screenHeight;
	byte *_videoPtr;
	int _width;
	int _posXClipped, _posYClipped;
	bool _clipFl;
	int _specialWidth;

	int _enlargedX, _enlargedY;
	bool _enlargedXFl, _enlargedYFl;
	int _clipX1, _clipY1;
	int _reduceX, _reducedY;
	int _zoomOutFactor;

	bool _manualScroll;

	void loadScreen(const Common::String &file);
	void loadPCX640(byte *surface, const Common::String &file, byte *palette, bool typeFlag);
	void loadPCX320(byte *surface, const Common::String &file, byte *palette);
	void fadeIn(const byte *palette, int step, const byte *surface);
	void fadeOut(const byte *palette, int step, const byte *surface);
	void changePalette(const byte *palette);
	uint16 mapRGB(byte r, byte g, byte b);
	void copy16bFromSurfaceScaleX2(const byte *surface);

	void translateSurface(byte *destP, const byte *srcP, int count, int minThreshold, int maxThreshold);
	void displayScaled8BitRect(const byte *surface, int xp, int yp, int width, int height, int destX, int destY);

	void lockScreen();
	void unlockScreen();
public:
	byte _paletteBuffer[PALETTE_SIZE * 2];
	byte _colorTable[PALETTE_EXT_BLOCK_SIZE];
	byte _palette[PALETTE_EXT_BLOCK_SIZE];
	byte _oldPalette[PALETTE_EXT_BLOCK_SIZE];
	byte *_backBuffer;
	byte *_frontBuffer;
	byte *_screenBuffer;
	byte *_backupScreen;
	bool _largeScreenFl;
	bool _noFadingFl;
	bool _fadingFl;
	bool _skipVideoLockFl;
	int _scrollOffset;
	int _scrollPosX;
	int _oldScrollPosX;
	int _scrollSpeed;
	int _lineNbr;
	int _lineNbr2;
	int _minX, _minY;
	int _maxX, _maxY;
	int _scrollStatus;
	int _fadeDefaultSpeed;
	int _screenLineSize;

	/**
	 * The _dirtyRects list contains paletted game areas that need to be redrawn.
	 * The _dstrect array is the list of areas of the screen that ScummVM needs to be redrawn.
	 * Some areas, such as the animation managers, skip the _dirtyRects and use _dstrec directly.
	 */
	Common::Array<Common::Rect> _dirtyRects;
	Common::Array<Common::Rect> _refreshRects;
	bool _showDirtyRects;
	bool _showZones;
	bool _showLines;

	byte *_palettePixels;
public:
	GraphicsManager(HopkinsEngine *vm);
	~GraphicsManager();
	
	void clearPalette();
	void clearScreen();
	void clearVesaScreen();
	void resetDirtyRects();
	void resetRefreshRects();
	void addDirtyRect(int x1, int y1, int x2, int y2);
	void addDirtyRect(const Common::Rect &r) { addDirtyRect(r.left, r.top, r.right, r.bottom); }
	void addRefreshRect(int x1, int y1, int x2, int y2);
	void addRectToArray(Common::Array<Common::Rect> &rects, const Common::Rect &newRect);
	void displayDirtyRects();
	void displayRefreshRects();
	void displayZones();
	void displayLines();
	void displayDebugRect(Graphics::Surface *surface, const Common::Rect &srcRect, uint32 color = 0xffffff);
	void copySurface(const byte *surface, int x1, int y1, int width, int height, byte *destSurface, int destX, int destY);
	void loadImage(const Common::String &file);
	void loadVgaImage(const Common::String &file);
	void fadeInLong();
	void fadeInBreakout();
	void fadeInDefaultLength(const byte *surface);
	void fadeInShort();
	void fadeOutDefaultLength(const byte *surface);
	void fadeOutBreakout();
	void fadeOutLong();
	void fadeOutShort();
	void copyWinscanVbe3(const byte *srcData, byte *destSurface);
	void copyWinscanVbe(const byte *srcP, byte *destP);
	void copyVideoVbe16(const byte *srcData);
	void copyVideoVbe16a(const byte *srcData);
	void copySurfaceRect(const byte *srcSurface, byte *destSurface, int xs, int ys, int width, int height);
	void restoreSurfaceRect(byte *destSurface, const byte *src, int xp, int yp, int width, int height);
	void displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color);
	void drawHorizontalLine(byte *surface, int xp, int yp, uint16 width, byte col);
	void drawVerticalLine(byte *surface, int xp, int yp, int height, byte col);
	void initColorTable(int minIndex, int maxIndex, byte *palette);
	void setGraphicalMode(int width, int height);
	void setPaletteVGA256(const byte *palette);
	void setPaletteVGA256WithRefresh(const byte *palette, const byte *surface);
	void scrollScreen(int amount);
	int zoomIn(int v, int percentage);
	int zoomOut(int v, int percentage);
	void initScreen(const Common::String &file, int mode, bool initializeScreen);
	void displayAllBob();
	void endDisplayBob();
	void updateScreen();
	void reduceScreenPart(const byte *srcSruface, byte *destSurface, int xp, int yp, int width, int height, int zoom);
	void setScreenWidth(int pitch);

	void setColorPercentage(int palIndex, int r, int g, int b);
	void setColorPercentage2(int palIndex, int r, int g, int b);
	void fastDisplay(const byte *spriteData, int xp, int yp, int spriteIndex, bool addSegment = true);
	void fastDisplay2(const byte *objectData, int xp, int yp, int idx, bool addSegment = true);
	void drawCompressedSprite(byte *surface, const byte *srcData, int xp300, int yp300, int frameIndex, int zoom1, int zoom2, bool flipFl);
	void copyRect(const byte *srcSurface, int x1, int y1, uint16 width, int height, byte *destSurface, int destX, int destY);
	void drawVesaSprite(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex);
	void display8BitRect(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
	void fillSurface(byte *surface, byte *col, int size);
	void displayScreen(bool initPalette);
	void backupScreen();
	void restoreScreen();
};

} // End of namespace Hopkins

#endif /* HOPKINS_GRAPHICS_H */