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