1 /*
2  *  JLib - Jacob's Library.
3  *  Copyright (C) 2003, 2004  Juan Carlos Seijo P�rez
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public
16  *  License along with this library; if not, write to the Free
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  *  Juan Carlos Seijo P�rez
20  *  jacob@mainreactor.net
21  */
22 
23 /** Imagen gen�rica
24  * @file    JImage.h.
25  * @author  Juan Carlos Seijo P�rez
26  * @date    14/10/2003
27  * @version 0.0.1 - 14/10/2003 - Primera varsi�n.
28  * @version 0.0.2 - 01/06/2004 - Adici�n de m�todos de referencia y copia.
29  * @version 0.0.3 - 04/04/2005 - Adici�n de m�todos de manejo de JRW.
30  */
31 
32 #ifndef _JIMAGE_INCLUDED
33 #define _JIMAGE_INCLUDED
34 
35 #include <JLib/Util/JTypes.h>
36 #include <JLib/Graphics/JDrawable.h>
37 #include <JLib/Util/JString.h>
38 #include <JLib/Util/JUtil.h>
39 #include <SDL.h>
40 #include <SDL_image.h>
41 
42 /** Im�gen gen�rica.
43  */
44 class JImage : public JDrawable
45 {
46  protected:
47   SDL_Surface *surface;             /**< Superficie SDL. */
48 
49 public:
50   /** Crea una imagen vac�a.
51    */
52   JImage();
53 
54   /** Crea una imagen de anchura altura y profundidad dadas.
55    * Si la profundidad es cero, se toma la del framebuffer.
56    * @param  w Anchura.
57    * @param  h Altura.
58    * @param  _bpp Profundidad en bits por pixel.
59    */
60   JImage(u32 w, u32 h, u32 _bpp = 0);
61 
62   /** Crea la imagen a partir de la superficie SDL dada.
63 	 * No hace una copia, establece esta como la superficie interna.
64 	 * @param  surf Superficie SDL con los datos.
65    */
JImage(SDL_Surface * surf)66   JImage(SDL_Surface *surf) {surface = surf;}
67 
68   /** Crea una imagen copia de la imagen dada.
69 	 * @param  img Imagen que se quiere copiar.
70 	 * @see Ref().
71    */
72   JImage(JImage &img);
73 
74   /** Libera la memoria asociada.
75    */
~JImage()76   virtual ~JImage() {Destroy();}
77 
78   /** Libera la memoria asociada.
79    */
80   void Destroy();
81 
82   /** Carga la imagen desde fichero.
83    * @param  filename Nombre del fichero con la imagen.
84    * @param  toDisplayFormat Indica si se debe convertir al formato de pantalla.
85 	 * @param  cKey Color transparente.
86    * @return <b>true</b> si todo fue bien, <b>false</b> en caso contrario.
87    */
88   bool Load(const char *filename, bool toDisplayFormat = true, u32 cKey = 0x00000000);
89 
90   /** Crea la superficie de imagen vac�a.
91    * Si data no es cero carga una copia en la superficie.
92    * @param  w Anchura.
93    * @param  h Altura.
94    * @param  _bpp Profundidad en bits por pixel.
95    * @param  data Datos de la superficie en el formato correcto o cero para crearla vac�a.
96    * @param  rMask M�scara de bits para el rojo.
97    * @param  gMask M�scara de bits para el verde.
98    * @param  bMask M�scara de bits para el azul.
99    * @param  aMask M�scara de bits para el alfa.
100 	 */
101   bool Create(u32 w, u32 h, u32 _bpp, void *data = 0, u32 rMask = 0, u32 gMask = 0, u32 bMask = 0, u32 aMask = 0);
102 
103   /** Devuelve la anchura.
104    * @return Anchura.
105    */
Width()106   s32 Width() {return surface->w;};
107 
108   /** Devuelve la altura.
109    * @return Altura.
110    */
Height()111   s32 Height() {return surface->h;};
112 
113   /** Devuelve la profundidad de color en bits
114    * @return Profundidad de color en bits.
115    */
BitsPP()116   s32 BitsPP() {return surface->format->BitsPerPixel;};
117 
118   /** Devuelve la profundidad de color en bytes
119    * @return Profundidad de color en bytes.
120    */
BytesPP()121   s32 BytesPP() {return surface->format->BytesPerPixel;};
122 
123   /** Devuelve los datos.
124    * @return Datos asociados.
125    */
Pixels()126   u8 * Pixels() {return ((u8 *)surface->pixels);};
127 
128   /** Devuelve el tama�o de l�nea, en bytes.
129    * @return El tama�o de l�nea, en bytes.
130    */
Pitch()131   s32 Pitch() {return surface->pitch;};
132 
133   /** Devuelve un puntero a la l�nea dada
134    * @param  nRow L�nea (coordenada y) a obtener un puntero a su comienzo.
135    * @return puntero a la l�nea dada.
136    */
Line(u32 nRow)137   u8 * Line(u32 nRow) {return (Pixels() + (surface->pitch * nRow));};
138 
139   /** Devuelve el tama�o total en bytes de la imagen.
140    * @return Tama�o total en bytes de la imagen.
141    */
Size()142   u32 Size() {return Width() * Height() * BytesPP();};
143 
144   /** Bloquea la superficie.
145    * @return 0 si todo va bien, -1 en caso de error.
146    */
Lock()147   inline s32 Lock() {if (SDL_MUSTLOCK(surface)) return SDL_LockSurface(surface); return 0;}
148 
149   /** Desbloquea la superficie.
150    */
Unlock()151   void Unlock() {if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface);}
152 
153   /** Establece el alfa global de la superficie, habilita el flag de alfa de superficie y deshabilita el alfa por p�xel.
154    * @param alpha Nuevo valor de transparencia.
155    * @return 0 si todo va bien, -1 en caso de error.
156    */
157   s32 Alpha(u8 alpha, u32 flags = SDL_SRCALPHA | SDL_RLEACCEL) {return SDL_SetAlpha(surface, flags, alpha);}
158 
159   /** Devuelve el alfa asociado a la superficie
160    * @return Alfa de la superficie.
161    */
Alpha()162   u8 Alpha() {return surface->format->alpha;}
163 
164   /** Establece el color transparente y habilita el uso de color transparente en la superficie.
165    * @param  key Color transparente.
166    * @return 0 si todo va bien, -1 en caso de error.
167    */
168   s32 ColorKey(u32 key, u32 flags = SDL_SRCCOLORKEY | SDL_RLEACCEL) {return SDL_SetColorKey(surface, flags, key);}
169 
170 	/** Devuelve el color transparente
171    * @return Color transparente.
172    */
ColorKey()173   u32 ColorKey() {return surface->format->colorkey;}
174 
175   /** Pega el contenido de una imagen en esta. No comprueba que
176    * no se sobrepasen los l�mites de la imagen.
177    * @return <b>true</b> si todo fue bien, <b>false</b> en caso contrario.
178    */
179   bool Paste(JImage *srcImg, s32 xSrc, s32 ySrc, s32 wSrc, s32 hSrc, s32 xDst = 0, s32 yDst = 0);
180 
181   /** Devuelve la superficie.
182    * @return Superficie de datos de la imagen.
183    */
Surface()184   SDL_Surface * Surface() const {return surface;}
185 
186 	/** Devuelve el formato de pixel de esta imagen.
187 	 * @return Formato de pixel de esta imagen.
188 	 */
Format()189 	SDL_PixelFormat * Format() {return surface->format;}
190 
191   /** Dibuja la imagen.
192    */
193   virtual void Draw();
194 
195   /** Dibuja la imagen en la posici�n dada.
196    * @param  x Posici�n x en pantalla.
197    * @param  y Posici�n y en pantalla.
198    */
199   virtual void Draw(s32 x, s32 y);
200 
201   /** Devuelve el valor del pixel en la posici�n dada.
202    * La imagen debe estar bloqueada.
203    * @param  x Posici�n x desde la esquina superior izquierda.
204    * @param  y Posici�n y desde la esquina superior izquierda.
205    * @return Color del pixel pedido.
206    */
207   u32 GetPixel(s32 x, s32 y);
208 
209   /** Establece el valor del pixel en la posici�n dada.
210    * La imagen debe estar bloqueada.
211    * @param  x Posici�n x desde la esquina superior izquierda.
212    * @param  y Posici�n y desde la esquina superior izquierda.
213    * @param  color Color del pixel dado.
214    */
215   void PutPixel(s32 x, s32 y, u32 color);
216 
217   /** Guarda la imagen como BMP
218    * @param file Nombre del fichero donde se guardar�.
219    * @return <b>true</b> si todo fue bien, <b>false</b> en caso contrario.
220    */
221   bool SaveAsBMP(const char *file);
222 
223   /** Carga la imagen.
224    * @param  f Fichero abierto y posicionado para cargar el objeto.
225    * @return 0 si todo va bien, 1 en caso de error de E/S.
226    * 2 en caso de incoherencia de los datos.
227    */
228   virtual u32 Load(JRW &f);
229 
230   /** Salva la imagen.
231    * @param  f Fichero abierto y posicionado para salvar el objeto.
232    * @return 0 si todo va bien, 1 en caso de error de E/S.
233    * 2 en caso de incoherencia de los datos.
234    */
235   virtual u32 Save(JRW &f);
236 
237   /** Carga el objeto desde la posici�n actual del fichero dado. El objeto debe contener los datos de fichero
238 	 * en formato de imagen est�ndar de SDL_Image (TGA, BMP, JPG, etc.)
239    * @param  jrw Objeto JRW posicionado correctamente.
240    * @return 0 si todo va bien, 1 en caso de error de E/S.
241    * 2 en caso de incoherencia de los datos.
242    */
243   virtual u32 LoadImage(JRW &jrw);
244 
245 	/** Crea una referencia de la imagen dada. Los datos apuntan al mismo sitio
246 	 * y cualquier modificaci�n en una se reflejar� en la otra. La imagen no
247 	 * se destruye hasta que se borran todas las referencias. Si la imagen dada
248 	 * est� vac�a, no crea la referencia.
249 	 */
250 	void Ref(JImage &img);
251 
252 	/** Devuelve una referencia de la imagen asignada. Los datos apuntan al mismo sitio
253 	 * y cualquier modificaci�n en una se reflejar� en la otra. La imagen no
254 	 * se destruye hasta que se borran todas las referencias. Si la imagen dada
255 	 * est� vac�a, no crea la referencia.
256 	 */
257 	void operator =(JImage &img);
258 
259 	/** Devuelve una copia de la imagen dada. Es equivalente al constructor copia.
260 	 */
261 	void Copy(JImage &img);
262 
263 	/** Rellena la imagen con el color dado.
264 	 * @param  color Color con el que rellenar.
265 	 */
Fill(u32 color)266 	void Fill(u32 color) {SDL_FillRect(surface, &surface->clip_rect, color);}
267 
268 	/** Escala la imagen el porcentaje dado en cada direcci�n. No altera esta imagen.
269 	 * @param  xp Porcentaje de escalado en la direcci�n x.
270 	 * @param  yp Porcentaje de escalado en la direcci�n y.
271 	 * @return Nueva imagen escalada.
272 	 */
273 	JImage * Scale(float xp, float yp);
274 
275 	/** Convierte esta imagen al formato de la dada. Tambi�n toma sus flags.
276 	 * @param fmt Formato de pixel al que convertir.
277 	 * @param flags Flags a asignar.
278 	 * @return <b>true</b> si se pudo convertir, <b>false</b> si no.
279 	 */
280 	bool Convert(SDL_PixelFormat *fmt, u32 flags);
281 
282 	/** Retruns a string with information about this image.
283 	 * @return String with information about this image.
284 	 */
Dump()285 	JString Dump() {return DumpFromSurface(surface);}
286 
287 	/** Retruns a string with information about an sdl surface.
288 	 * @return String with information about an sdl surface.
289 	 */
290 	static JString DumpFromSurface(SDL_Surface *s);
291 };
292 
293 #endif  // _JIMAGE_INCLUDED
294