aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/image/image.h
blob: 0404c50d6ff0663b2b1d4a15a4d320485b7d5bf6 (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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/* 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.
 *
 * $URL$
 * $Id$
 *
 */

/*
 * This code is based on Broken Sword 2.5 engine
 *
 * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
 *
 * Licensed under GNU GPL v2
 *
 */

/*
    BS_Image
    --------

    Autor: Malte Thiesen
*/

#ifndef SWORD25_IMAGE_H
#define SWORD25_IMAGE_H

// Includes
#include "sword25/kernel/common.h"
#include "common/rect.h"
#include "sword25/gfx/graphicengine.h"

namespace Sword25 {

class Image {
public:
	virtual ~Image() {};

	// Enums
	/**
	    @brief Die m�glichen Flippingparameter f�r die Blit-Methode.
	*/
	enum FLIP_FLAGS {
		/// Das Bild wird nicht gespiegelt.
		FLIP_NONE = 0,
		/// Das Bild wird an der horizontalen Achse gespiegelt.
		FLIP_H = 1,
		/// Das Bild wird an der vertikalen Achse gespiegelt.
		FLIP_V = 2,
		/// Das Bild wird an der horizontalen und vertikalen Achse gespiegelt.
		FLIP_HV = FLIP_H | FLIP_V,
		/// Das Bild wird an der horizontalen und vertikalen Achse gespiegelt.
		FLIP_VH = FLIP_H | FLIP_V
	};

	//@{
	/** @name Accessor-Methoden */

	/**
	    @brief Gibt die Breite des Bildes in Pixeln zur�ck
	*/
	virtual int GetWidth() const = 0;

	/**
	    @brief Gibt die H�he des Bildes in Pixeln zur�ck
	*/
	virtual int GetHeight() const = 0;

	/**
	    @brief Gibt das Farbformat des Bildes zur�ck
	*/
	virtual GraphicEngine::COLOR_FORMATS GetColorFormat() const = 0;

	//@}

	//@{
	/** @name Render-Methoden */

	/**
	    @brief Rendert das Bild in den Framebuffer.
	    @param pDest ein Pointer auf das Zielbild. In den meisten F�llen ist dies der Framebuffer.
	    @param PosX die Position auf der X-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br>
	                Der Standardwert ist 0.
	    @param PosY die Position auf der Y-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br>
	                Der Standardwert ist 0.
	    @param Flipping gibt an, wie das Bild gespiegelt werden soll.<br>
	                    Der Standardwert ist BS_Image::FLIP_NONE (keine Spiegelung)
	    @param pSrcPartRect Pointer auf ein Common::Rect, welches den Ausschnitt des Quellbildes spezifiziert, der gerendert
	                        werden soll oder NULL, falls das gesamte Bild gerendert werden soll.<br>
	                        Dieser Ausschnitt bezieht sich auf das ungespiegelte und unskalierte Bild.<br>
	                        Der Standardwert ist NULL.
	    @param Color ein ARGB Farbwert, der die Parameter f�r die Farbmodulation und f�rs Alphablending festlegt.<br>
	                 Die Alpha-Komponente der Farbe bestimmt den Alphablending Parameter (0 = keine Deckung, 255 = volle Deckung).<br>
	                 Die Farbkomponenten geben die Farbe f�r die Farbmodulation an.<br>
	                 Der Standardwert is BS_ARGB(255, 255, 255, 255) (volle Deckung, keine Farbmodulation).
	                 Zum Erzeugen des Farbwertes k�nnen die Makros BS_RGB und BS_ARGB benutzt werden.
	    @param Width gibt die Ausgabebreite des Bildausschnittes an.
	                 Falls diese von der Breite des Bildausschnittes abweicht wird
	                 das Bild entsprechend Skaliert.<br>
	                 Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br>
	                 Der Standardwert ist -1.
	    @param Width gibt die Ausgabeh�he des Bildausschnittes an.
	                 Falls diese von der H�he des Bildauschnittes abweicht, wird
	                 das Bild entsprechend Skaliert.<br>
	                 Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br>
	                 Der Standardwert ist -1.
	    @return Gibt false zur�ck, falls das Rendern fehlgeschlagen ist.
	    @remark Er werden nicht alle Blitting-Operationen von allen BS_Image-Klassen unterst�tzt.<br>
	            Mehr Informationen gibt es in der Klassenbeschreibung von BS_Image und durch folgende Methoden:
	            - IsBlitTarget()
	            - IsScalingAllowed()
	            - IsFillingAllowed()
	            - IsAlphaAllowed()
	            - IsColorModulationAllowed()
	            - IsSetContentAllowed()
	*/
	virtual bool Blit(int PosX = 0, int PosY = 0,
	                  int Flipping = FLIP_NONE,
	                  Common::Rect *pPartRect = NULL,
	                  uint Color = BS_ARGB(255, 255, 255, 255),
	                  int Width = -1, int Height = -1) = 0;

	/**
	    @brief F�llt einen Rechteckigen Bereich des Bildes mit einer Farbe.
	    @param pFillRect Pointer auf ein Common::Rect, welches den Ausschnitt des Bildes spezifiziert, der gef�llt
	                      werden soll oder NULL, falls das gesamte Bild gef�llt werden soll.<br>
	                      Der Standardwert ist NULL.
	    @param Color der 32 Bit Farbwert mit dem der Bildbereich gef�llt werden soll.
	    @remark Es ist m�glich �ber die Methode transparente Rechtecke darzustellen, indem man eine Farbe mit einem Alphawert ungleich
	            255 angibt.
	    @remark Unabh�ngig vom Farbformat des Bildes muss ein 32 Bit Farbwert angegeben werden. Zur Erzeugung, k�nnen die Makros
	            BS_RGB und BS_ARGB benutzt werden.
	    @remark Falls das Rechteck nicht v�llig innerhalb des Bildschirms ist, wird es automatisch zurechtgestutzt.
	*/
	virtual bool Fill(const Common::Rect *pFillRect = 0, uint Color = BS_RGB(0, 0, 0)) = 0;

	/**
	    @brief F�llt den Inhalt des Bildes mit Pixeldaten.
	    @param Pixeldata ein Vector der die Pixeldaten enth�lt. Sie m�ssen in dem Farbformat des Bildes vorliegen und es m�ssen gen�gend Daten
	           vorhanden sein, um das ganze Bild zu f�llen.
	    @param Offset der Offset in Byte im Pixeldata-Vector an dem sich der erste zu schreibende Pixel befindet.<br>
	           Der Standardwert ist 0.
	    @param Stride der Abstand in Byte zwischen dem Zeilenende und dem Beginn einer neuen Zeile im Pixeldata-Vector.<br>
	           Der Standardwert ist 0.
	    @return Gibt false zur�ck, falls der Aufruf fehlgeschlagen ist.
	    @remark Ein Aufruf dieser Methode ist nur erlaubt, wenn IsSetContentAllowed() true zur�ckgibt.
	*/
	virtual bool SetContent(const byte *Pixeldata, uint size, uint Offset, uint Stride) = 0;

	/**
	    @brief Liest einen Pixel des Bildes.
	    @param X die X-Koordinate des Pixels.
	    @param Y die Y-Koordinate des Pixels
	    @return Gibt den 32-Bit Farbwert des Pixels an der �bergebenen Koordinate zur�ck.
	    @remark Diese Methode sollte auf keine Fall benutzt werden um gr��ere Teile des Bildes zu lesen, da sie sehr langsam ist. Sie ist
	            eher daf�r gedacht einzelne Pixel des Bildes auszulesen.
	*/
	virtual uint GetPixel(int X, int Y) = 0;

	//@{
	/** @name Auskunfts-Methoden */

	/**
	    @brief �berpr�ft, ob an dem BS_Image Blit() aufgerufen werden darf.
	    @return Gibt false zur�ck, falls ein Blit()-Aufruf an diesem Objekt nicht gestattet ist.
	*/
	virtual bool IsBlitSource() const = 0;

	/**
	    @brief �berpr�ft, ob das BS_Image ein Zielbild f�r einen Blit-Aufruf sein kann.
	    @return Gibt false zur�ck, falls ein Blit-Aufruf mit diesem Objekt als Ziel nicht gestattet ist.
	*/
	virtual bool IsBlitTarget() const = 0;

	/**
	    @brief Gibt true zur�ck, falls das BS_Image bei einem Aufruf von Blit() skaliert dargestellt werden kann.
	*/
	virtual bool IsScalingAllowed() const = 0;

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image mit einem Aufruf von Fill() gef�llt werden kann.
	*/
	virtual bool IsFillingAllowed() const = 0;

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image bei einem Aufruf von Blit() mit einem Alphawert dargestellt werden kann.
	*/
	virtual bool IsAlphaAllowed() const = 0;

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image bei einem Aufruf von Blit() mit Farbmodulation dargestellt werden kann.
	*/
	virtual bool IsColorModulationAllowed() const = 0;

	/**
	    @brief Gibt true zur�ck, wenn der Inhalt des BS_Image durch eine Aufruf von SetContent() ausgetauscht werden kann.
	*/
	virtual bool IsSetContentAllowed() const = 0;

	//@}
};

} // End of namespace Sword25

#endif