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 /** Fuente para mostrar texto en pantalla.
24  * @file    JFont.h
25  * @author  Juan Carlos Seijo P�rez
26  * @date    27/03/2004
27  * @version 0.0.1 - 27/03/2004 - Primera versi�n.
28  */
29 
30 #ifndef _JFONT_INCLUDED
31 #define _JFONT_INCLUDED
32 
33 #include <JLib/Graphics/JImage.h>
34 #include <SDL_ttf.h>
35 #include <stdarg.h>
36 
37 /** Alineaci�n del texto a renderizar.
38  */
39 typedef enum JFontAlign
40 {
41 	JFONTALIGN_LEFT = 0,                  /**< Alineado a la izquierda. */
42 	JFONTALIGN_RIGHT,                     /**< Alineado a la derecha. */
43 	JFONTALIGN_CENTER,                    /**< Centrado. */
44 };
45 
46 /** Clase wrapper de la clase SDL_Font de la librer�a SDL_ttf.
47  * Permite mostrar texto en pantalla.
48  */
49 class JFont
50 {
51 	/** Tipo de renderizado a usar
52 	 */
53 	typedef enum JFontRenderType
54 	{
55 		JFONTRENDERTYPE_SOLID = 0,          /**< S�lido con colorkey. */
56 		JFONTRENDERTYPE_SHADED,             /**< Con antialiasing en fondo s�lido. */
57 		JFONTRENDERTYPE_BLENDED,            /**< Con antializasing en fondo transparente. */
58 	};
59 
60 	TTF_Font *font;
61 
62 	/** Funci�n de renderizado de las PrintfXXX.
63    * @param  type Tipo de render a emplear.
64 	 * @param  align Alineaci�n del texto.
65 	 * @param  fg Color de fuente.
66 	 * @param  bg Color de fondo (s�lo para JFONTRENDERTYPE_SHADED).
67 	 * @param  str Texto a renderizar.
68 	 */
69 	JImage * Printf(JFontRenderType type, JFontAlign align, SDL_Color &fg, SDL_Color &bg, char *str);
70 
71  public:
72 	/** Crea una fuente vac�a.
73 	 */
JFont()74 	JFont() : font(0)
75 	{}
76 
77   /** Recupera la versi�n de ejecuci�n de SDL_ttf. El objeto devuelto tiene
78    * tres campos: major, minor y patch, que identifican la versi�n.
79    * @return La versi�n de ejecuci�n SDL_ttf.
80    */
GetLinkedVersion()81   const SDL_version * GetLinkedVersion() {return TTF_Linked_Version();}
82 
83 	/** Inicializa el subsistema de fuentes. S�lo es necesaria la primera vez.
84 	 * @return <b>true</b> si todo va bien, <b>false</b> en caso contrario.
85 	 */
Init()86 	static bool Init()
87 	{
88 		if (TTF_WasInit() == 0)
89 		{
90 			return (-1 != TTF_Init());
91 		}
92 
93 		return true;
94 	}
95 
96 	/** Devuelve la cadena de error del �ltimo error.
97 	 * @return Cadena de error del �ltimo error.
98 	 */
GetError()99 	static const char * GetError()
100 	{
101 		return TTF_GetError();
102 	}
103 
104 	/** Abre la fuente del fichero indicado.
105 	 * @param  filename Nombre del fichero .ttf o .fon.
106 	 * @param  size Tama�o en pixels (aproximado).
107 	 * @return <b>true</b> si se pudo abrir, <b>false</b> si no.
108 	 */
Open(const char * filename,s32 size)109 	bool Open(const char * filename, s32 size)
110 	{
111 		Destroy();
112 		return (0 != (font = TTF_OpenFont(filename, size)));
113 	}
114 
115 	/** Establece el estilo.
116 	 * @param  style Nuevo estilo. Puede ser una combinaci�n de
117 	 * TTF_STYLE_NORMAL, TTF_STYLE_BOLD, TTF_STYLE_ITALIC o TTF_STYLE_UNDERLINE.
118 	 */
Style(s32 style)119 	void Style(s32 style)
120 	{
121 		TTF_SetFontStyle(font, style);
122 	}
123 
124 	/** Recupera el estilo.
125 	 * @return  Estilo actual como combinaci�n de TTF_STYLE_NORMAL,
126 	 * TTF_STYLE_BOLD, TTF_STYLE_ITALIC y TTF_STYLE_UNDERLINE.
127 	 */
Style()128 	s32 Style()
129 	{
130 		return TTF_GetFontStyle(font);
131 	}
132 
133 	/** Devuelve la altura m�xima de la fuente.
134 	 * @return Altura m�xima de la fuente.
135 	 */
Height()136 	s32 Height()
137 	{
138 		return TTF_FontHeight(font);
139 	}
140 
141 	/** Devuelve el ascenso de la fuente.
142 	 * @return Ascenso de la fuente.
143 	 */
Ascent()144 	s32 Ascent()
145 	{
146 		return TTF_FontAscent(font);
147 	}
148 
149 	/** Devuelve el descenso de la fuente.
150 	 * @return Descenso de la fuente.
151 	 */
Descent()152 	s32 Descent()
153 	{
154 		return TTF_FontDescent(font);
155 	}
156 
157 	/** Devuelve la separaci�n recomendada de l�nea.
158 	 * @return Separaci�n recomendada de l�nea.
159 	 */
LineDistance()160 	s32 LineDistance()
161 	{
162 		return TTF_FontLineSkip(font);
163 	}
164 
165 	/** Renderiza el texto dado de forma r�pida.
166 	 * @param  text Texto a renderizar.
167 	 * @param  fg Color de fuente.
168 	 */
RenderTextSolid(const char * text,SDL_Color & fg)169 	JImage * RenderTextSolid(const char * text, SDL_Color &fg)
170 	{
171 		SDL_Surface *s = TTF_RenderUTF8_Solid(font, text, fg);
172 		return s != 0 ? new JImage(s) : 0;
173 	}
174 
175 	/** Renderiza el texto UNICODE dado de forma r�pida.
176 	 * @param  text Texto a renderizar.
177 	 * @param  fg Color de fuente.
178 	 */
RenderUNICODESolid(const u16 * text,SDL_Color & fg)179 	JImage * RenderUNICODESolid(const u16 *text, SDL_Color &fg)
180 	{
181 		SDL_Surface *s = TTF_RenderUNICODE_Solid(font, text, fg);
182 		return s != 0 ? new JImage(s) : 0;
183 	}
184 
185 	/** Renderiza el caracter dado de forma r�pida.
186 	 * @param  c Caracter a renderizar.
187 	 * @param  fg Color de fuente.
188 	 */
RenderGlyphSolid(char c,SDL_Color & fg)189 	JImage * RenderGlyphSolid(char c, SDL_Color &fg)
190 	{
191 		SDL_Surface *s = TTF_RenderGlyph_Solid(font, c, fg);
192 		return s != 0 ? new JImage(s) : 0;
193 	}
194 
195 	/** Renderiza el texto dado suavizado sobre fondo s�lido.
196 	 * @param  text Texto a renderizar.
197 	 * @param  fg Color de fuente.
198 	 * @param  bg Color de fondo.
199 	 */
RenderTextShaded(const char * text,SDL_Color & fg,SDL_Color & bg)200 	JImage * RenderTextShaded(const char * text, SDL_Color &fg, SDL_Color &bg)
201 	{
202 		SDL_Surface *s = TTF_RenderUTF8_Shaded(font, text, fg, bg);
203 		return s != 0 ? new JImage(s) : 0;
204 	}
205 
206 	/** Renderiza el texto UNICODE dado suavizado sobre fondo s�lido.
207 	 * @param  text Texto a renderizar.
208 	 * @param  fg Color de fuente.
209 	 * @param  bg Color de fondo.
210 	 */
RenderUNICODEShaded(const u16 * text,SDL_Color & fg,SDL_Color & bg)211 	JImage * RenderUNICODEShaded(const u16 *text, SDL_Color &fg, SDL_Color &bg)
212 	{
213 		SDL_Surface *s = TTF_RenderUNICODE_Shaded(font, text, fg, bg);
214 		return s != 0 ? new JImage(s) : 0;
215 	}
216 
217 	/** Renderiza el caracter dado suavizado sobre fondo s�lido.
218 	 * @param  c Caracter a renderizar.
219 	 * @param  fg Color de fuente.
220 	 * @param  bg Color de fondo.
221 	 */
RenderGlyphShaded(char c,SDL_Color & fg,SDL_Color & bg)222 	JImage * RenderGlyphShaded(char c, SDL_Color &fg, SDL_Color &bg)
223 	{
224 		SDL_Surface *s = TTF_RenderGlyph_Shaded(font, c, fg, bg);
225 		return s != 0 ? new JImage(s) : 0;
226 	}
227 
228 	/** Renderiza el texto dado suavizado sobre fondo transparente.
229 	 * @param  text Texto a renderizar.
230 	 * @param  fg Color de fuente.
231 	 */
RenderTextBlended(const char * text,SDL_Color & fg)232 	JImage * RenderTextBlended(const char * text, SDL_Color &fg)
233 	{
234 		SDL_Surface *s = TTF_RenderUTF8_Blended(font, text, fg);
235 		return s != 0 ? new JImage(s) : 0;
236 	}
237 
238 	/** Renderiza el texto dado suavizado sobre fondo transparente.
239 	 * @param  text Texto a renderizar.
240 	 * @param  fg Color de fuente.
241 	 */
RenderUNICODEBlended(const u16 * text,SDL_Color & fg)242 	JImage * RenderUNICODEBlended(const u16 * text, SDL_Color &fg)
243 	{
244 		SDL_Surface *s = TTF_RenderUNICODE_Blended(font, text, fg);
245 		return s != 0 ? new JImage(s) : 0;
246 	}
247 
248 	/** Renderiza el caracter dado suavizado sobre fondo transparente.
249 	 * @param  c Caracter a renderizar.
250 	 * @param  fg Color de fuente.
251 	 */
RenderGlyphBlended(char c,SDL_Color & fg)252 	JImage * RenderGlyphBlended(char c, SDL_Color &fg)
253 	{
254 		SDL_Surface *s = TTF_RenderGlyph_Blended(font, c, fg);
255 		return s != 0 ? new JImage(s) : 0;
256 	}
257 
258 	/** Destruye el objeto, liberando la memoria asociada.
259 	 */
Destroy()260 	void Destroy()
261 	{
262 		if (font != 0)
263 		{
264 			TTF_CloseFont(font);
265 			font = 0;
266 		}
267 	}
268 
269 	/** Renderiza el texto con formato dado de forma r�pida.
270 	 * @param  align Alineaci�n del texto.
271 	 * @param  fg Color de fuente.
272 	 * @param  strFormat Texto a renderizar.
273 	 * @param  ... Argumentos adicionales tipo printf().
274 	 */
275 	JImage * PrintfSolid(JFontAlign align, SDL_Color &fg, const char *strFormat, ...);
276 
277 	/** Renderiza el texto con formato suavizado sobre fondo s�lido.
278 	 * @param  align Alineaci�n del texto.
279 	 * @param  fg Color de fuente.
280 	 * @param  bg Color de fondo.
281 	 * @param  strFormat Texto a renderizar.
282 	 * @param  ... Argumentos adicionales tipo printf().
283 	 */
284 	JImage * PrintfShaded(JFontAlign align, SDL_Color &fg, SDL_Color &bg, const char *strFormat, ...);
285 
286 	/** Renderiza el texto con formato suavizado sobre fondo transparente.
287 	 * @param  align Alineaci�n del texto.
288 	 * @param  fg Color de fuente.
289 	 * @param  strFormat Texto a renderizar.
290 	 * @param  ... Argumentos adicionales tipo printf().
291 	 */
292 	JImage * PrintfBlended(JFontAlign align, SDL_Color &fg, const char *strFormat, ...);
293 
294 	/** Destruye el objeto, liberando la memoria asociada.
295 	 */
~JFont()296 	~JFont()
297 	{
298 		Destroy();
299 	}
300 };
301 
302 #endif // _JFONT_INCLUDED
303