comparison ext/guichan-0.8.1/include/guichan/imagefont.hpp @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4a0efb7baf70
1 /* _______ __ __ __ ______ __ __ _______ __ __
2 * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\
3 * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
4 * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / /
5 * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / /
6 * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
7 * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
8 *
9 * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
10 *
11 *
12 * Per Larsson a.k.a finalman
13 * Olof Naessén a.k.a jansem/yakslem
14 *
15 * Visit: http://guichan.sourceforge.net
16 *
17 * License: (BSD)
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
20 * are met:
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in
25 * the documentation and/or other materials provided with the
26 * distribution.
27 * 3. Neither the name of Guichan nor the names of its contributors may
28 * be used to endorse or promote products derived from this software
29 * without specific prior written permission.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
37 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
38 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 */
43
44 #ifndef GCN_IMAGEFONT_HPP
45 #define GCN_IMAGEFONT_HPP
46
47 #include <string>
48
49 #include "guichan/font.hpp"
50 #include "guichan/platform.hpp"
51 #include "guichan/rectangle.hpp"
52
53 namespace gcn
54 {
55 class Color;
56 class Graphics;
57 class Image;
58
59 /**
60 * A font using an image containing the font data. ImageFont can be used
61 * with any supported by the current used ImageLoader.
62 *
63 * These are two examples of an image containing a font.
64 * \image html imagefontexample.bmp
65 * \image html imagefontexample2.bmp
66 *
67 * The Image font format works like this: The first pixel, the pixal at
68 * coordinate (0,0), tells which color to look for when seperating glyphs.
69 * You create an image with your glyphs and simple separates them with
70 * the seperation color. When you create your image font you supply the
71 * constructor with the glyphs present in your image.
72 *
73 * To create an ImageFont from the first image example above the following
74 * constructor call should be made:
75 * @code gcn::ImageFont imageFont("fixedfont_big.bmp"," abcdefghijklmno\
76 pqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); @endcode
77 *
78 * Note worthy is that the first glyph actually gives the width of space.
79 * Glyphs can, as seen in the second image example above, be seperated with
80 * horizontal lines making it possible to draw glyphs on more then one
81 * line in the image. However, these vertical lines must have a height of
82 * one pixel!
83 */
84 class GCN_CORE_DECLSPEC ImageFont: public Font
85 {
86 public:
87
88 /**
89 * Constructor. Takes an image file containing the font and
90 * a string containing the glyphs. The glyphs in the string should
91 * be in the same order as they appear in the font image.
92 *
93 * @param filename The filename of the image.
94 * @param glyphs The glyphs found in the image.
95 * @throws Exception when glyph list is incorrect or the font file is
96 * corrupt or if no ImageLoader exists.
97 */
98 ImageFont(const std::string& filename, const std::string& glyphs);
99
100 /**
101 * Constructor. Takes an image containing the font and
102 * a string containing the glyphs. The glyphs in the string should
103 * be in the same order as they appear in the font image.
104 * The image will be deleted in the destructor.
105 *
106 * @param image The image with font glyphs.
107 * @param glyphs The glyphs found in the image.
108 * @throws Exception when glyph list is incorrect or the font image is
109 * is missing.
110 */
111 ImageFont(Image* image, const std::string& glyphs);
112
113 /**
114 * Constructor. Takes an image file containing the font and
115 * two boundaries of ASCII values. The font image should include
116 * all glyphs specified with the boundaries in increasing ASCII
117 * order. The boundaries are inclusive.
118 *
119 * @param filename The filename of the image.
120 * @param glyphsFrom The ASCII value of the first glyph found in the
121 * image.
122 * @param glyphsTo The ASCII value of the last glyph found in the
123 * image.
124 * @throws Exception when glyph bondaries are incorrect or the font
125 * file is corrupt or if no ImageLoader exists.
126 */
127 ImageFont(const std::string& filename,
128 unsigned char glyphsFrom=32,
129 unsigned char glyphsTo=126);
130
131 /**
132 * Destructor.
133 */
134 virtual ~ImageFont();
135
136 /**
137 * Draws a glyph.
138 *
139 * NOTE: You normally won't use this function to draw text since
140 * the Graphics class contains better functions for drawing
141 * text.
142 *
143 * @param graphics A graphics object used for drawing.
144 * @param glyph A glyph to draw.
145 * @param x The x coordinate where to draw the glyph.
146 * @param y The y coordinate where to draw the glyph.
147 * @return The width of the glyph in pixels.
148 */
149 virtual int drawGlyph(Graphics* graphics, unsigned char glyph,
150 int x, int y);
151
152 /**
153 * Sets the space between rows in pixels. Default is 0 pixels.
154 * The space can be negative.
155 *
156 * @param spacing The space between rows in pixels.
157 * @see getRowSpacing
158 */
159 virtual void setRowSpacing(int spacing);
160
161 /**
162 * Gets the space between rows in pixels.
163 *
164 * @return The space between rows in pixels.
165 * @see setRowSpacing
166 */
167 virtual int getRowSpacing();
168
169 /**
170 * Sets the spacing between glyphs in pixels. Default is 0 pixels.
171 * The space can be negative.
172 *
173 * @param spacing The glyph space in pixels.
174 * @see getGlyphSpacing
175 */
176 virtual void setGlyphSpacing(int spacing);
177
178 /**
179 * Gets the spacing between letters in pixels.
180 *
181 * @return the spacing.
182 * @see setGlyphSpacing
183 */
184 virtual int getGlyphSpacing();
185
186 /**
187 * Gets a width of a glyph in pixels.
188 *
189 * @param glyph The glyph which width will be returned.
190 * @return The width of a glyph in pixels.
191 */
192 virtual int getWidth(unsigned char glyph) const;
193
194
195 // Inherited from Font
196
197 virtual int getWidth(const std::string& text) const;
198
199 virtual void drawString(Graphics* graphics, const std::string& text,
200 int x, int y);
201
202 virtual int getHeight() const;
203
204 virtual int getStringIndexAt(const std::string& text, int x);
205
206 protected:
207 /**
208 * Scans for a certain glyph.
209 *
210 * @param glyph The glyph to scan for. Used for exception messages.
211 * @param x The x coordinate where to begin the scan. The coordinate
212 * will be updated with the end x coordinate of the glyph
213 * when the scan is complete.
214 * @param y The y coordinate where to begin the scan. The coordinate
215 * will be updated with the end y coordinate of the glyph
216 * when the scan is complete.
217 * @param separator The color separator to look for where the glyph ends.
218 * @return A rectangle with the found glyph dimension in the image
219 * with the font.
220 * @throws Exception when no glyph is found.
221 */
222 Rectangle scanForGlyph(unsigned char glyph,
223 int x,
224 int y,
225 const Color& separator);
226
227 /**
228 * Holds the glyphs areas in the image.
229 */
230 Rectangle mGlyph[256];
231
232 /**
233 * Holds the height of the image font.
234 */
235 int mHeight;
236
237 /**
238 * Holds the glyph spacing of the image font.
239 */
240 int mGlyphSpacing;
241
242 /**
243 * Holds the row spacing of the image font.
244 */
245 int mRowSpacing;
246
247 /**
248 * Holds the image with the font data.
249 */
250 Image* mImage;
251
252 /**
253 * Holds the filename of the image with the font data.
254 */
255 std::string mFilename;
256 };
257 }
258
259 #endif // end GCN_IMAGEFONT_HPP