4 * Copyright 2003, 2004 Develer S.r.l. (http://www.develer.com/)
5 * Copyright 1999 Bernardo Innocenti <bernie@develer.com>
6 * This file is part of DevLib - See README.devlib for information.
9 * \brief printf-family routines for text output
12 * \author Bernardo Innocenti <bernie@develer.com>
13 * \author Stefano Fedrigo <aleph@develer.com>
18 *#* Revision 1.10 2006/07/19 12:56:26 bernie
19 *#* Convert to new Doxygen style.
21 *#* Revision 1.9 2006/04/27 05:39:24 bernie
22 *#* Enhance text rendering to arbitrary x,y coords.
24 *#* Revision 1.8 2006/03/22 09:50:11 bernie
25 *#* Don't use C99 stuff.
27 *#* Revision 1.7 2006/03/20 17:51:55 bernie
30 *#* Revision 1.6 2006/03/13 02:05:54 bernie
31 *#* Mark slow paths as UNLIKELY.
33 *#* Revision 1.5 2006/03/07 22:18:04 bernie
34 *#* Correctly compute text width for prop fonts; Make styles a per-bitmap attribute.
36 *#* Revision 1.4 2006/02/10 12:31:33 bernie
37 *#* Add multiple font support in bitmaps.
39 *#* Revision 1.3 2005/11/27 23:31:58 bernie
42 *#* Revision 1.2 2005/11/04 18:17:45 bernie
43 *#* Fix header guards and includes for new location of gfx module.
45 *#* Revision 1.1 2005/11/04 18:11:35 bernie
46 *#* Move graphics stuff from mware/ to gfx/.
48 *#* Revision 1.10 2005/11/04 16:20:02 bernie
49 *#* Fix reference to README.devlib in header.
51 *#* Revision 1.9 2004/12/31 17:47:45 bernie
52 *#* Rename UNUSED() to UNUSED_ARG().
54 *#* Revision 1.8 2004/11/16 21:16:56 bernie
55 *#* Update to new naming scheme in mware/gfx.c.
57 *#* Revision 1.7 2004/10/03 19:05:04 bernie
58 *#* text_widthf(), text_vwidthf(): New functions.
60 *#* Revision 1.6 2004/09/14 20:59:04 bernie
61 *#* text_xprintf(): Support all styles; Pixel-wise text centering.
63 *#* Revision 1.5 2004/08/25 14:12:09 rasky
64 *#* Aggiornato il comment block dei log RCS
66 *#* Revision 1.4 2004/08/05 18:46:44 bernie
67 *#* Documentation improvements.
69 *#* Revision 1.3 2004/08/03 15:57:18 aleph
70 *#* Add include to fix warning for vsprintf()
72 *#* Revision 1.2 2004/06/03 11:27:09 bernie
73 *#* Add dual-license information.
75 *#* Revision 1.1 2004/05/23 15:43:16 bernie
76 *#* Import mware modules.
78 *#* Revision 1.2 2004/03/26 18:50:50 bernie
79 *#* Move _PROGMEM stuff to compiler.h
81 *#* Revision 1.1 2004/03/19 16:52:28 bernie
82 *#* Move printf() like functions from text.c to text_format.c and add PROGMEM versions.
88 #include <mware/formatwr.h> /* _formatted_write() */
92 #include <stdio.h> /* vsprintf() */
94 #include <string.h> /* strlen() */
97 * Render string \a str in Bitmap \a bm at current cursor position
99 * \note Text formatting functions are also available with an _P suffix
100 * accepting the source string from program memory. This feature
101 * is only available (and useful) on Harvard microprocessors such
104 * \see text_putchar()
106 int PGM_FUNC(text_puts)(const char * PGM_ATTR str, struct Bitmap *bm)
110 while ((c = PGM_READ_CHAR(str++)))
118 * vprintf()-like formatter to render text in a Bitmap.
120 * Perform vprintf()-like formatting on the \a fmt format string using the
121 * variable-argument list \a ap.
122 * Render the resulting string in Bitmap \a bm starting at the current
125 * \see text_puts() text_putchar() text_printf()
127 int PGM_FUNC(text_vprintf)(struct Bitmap *bm, const char * PGM_ATTR fmt, va_list ap)
129 return PGM_FUNC(_formatted_write)(fmt, (void (*)(char, void *))text_putchar, bm, ap);
133 * printf()-like formatter to render text in a Bitmap.
135 * Perform printf()-like formatting on the \a fmt format string.
136 * Render the resulting string in Bitmap \a bm starting at the
137 * current cursor position.
139 * \see text_puts() text_putchar() text_vprintf()
141 int PGM_FUNC(text_printf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...)
147 len = PGM_FUNC(text_vprintf)(bm, fmt, ap);
154 * Render text with vprintf()-like formatting at a specified pixel position.
156 * \see text_xyprintf()
158 int PGM_FUNC(text_xyvprintf)(struct Bitmap *bm,
159 coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, va_list ap)
162 uint8_t oldstyle = 0;
164 text_setCoord(bm, x, y);
166 if (style & STYLEF_MASK)
167 oldstyle = text_style(bm, style, STYLEF_MASK);
169 if (style & (TEXT_CENTER | TEXT_RIGHT))
171 uint8_t pad = bm->width - PGM_FUNC(text_vwidthf)(bm, fmt, ap);
173 if (style & TEXT_CENTER)
176 if (style & TEXT_FILL)
177 gfx_rectFillC(bm, 0, y, pad, y + bm->font->height,
178 (style & STYLEF_INVERT) ? 0xFF : 0x00);
180 text_setCoord(bm, pad, y);
183 len = PGM_FUNC(text_vprintf)(bm, fmt, ap);
185 if (style & TEXT_FILL)
186 gfx_rectFillC(bm, bm->penX, y, bm->width, y + bm->font->height,
187 (style & STYLEF_INVERT) ? 0xFF : 0x00);
189 /* Restore old style */
190 if (style & STYLEF_MASK)
191 text_style(bm, oldstyle, STYLEF_MASK);
198 * Render text with printf()-like formatting at a specified pixel position.
200 * \param bm Bitmap where to render the text
201 * \param x [pixels] Initial X coordinate of text.
202 * \param y [pixels] Coordinate of top border of text.
203 * \param style Formatting style to use. In addition to any STYLEF_
204 * flag, it can be TEXT_NORMAL, TEXT_FILL, TEXT_INVERT or
205 * TEXT_RIGHT, or a combination of these flags ORed together.
206 * \param fmt String possibly containing printf() formatting commands.
208 * \see text_puts() text_putchar() text_printf() text_vprintf()
209 * \see text_moveTo() text_style()
211 int PGM_FUNC(text_xyprintf)(struct Bitmap *bm,
212 coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, ...)
218 len = PGM_FUNC(text_xyvprintf)(bm, x, y, style, fmt, ap);
226 * Render text with printf()-like formatting at a specified row/column position.
228 * \see text_xyprintf()
230 int PGM_FUNC(text_xprintf)(struct Bitmap *bm,
231 uint8_t row, uint8_t col, uint16_t style, const char * PGM_ATTR fmt, ...)
237 len = PGM_FUNC(text_xyvprintf)(
238 bm, col * bm->font->width, row * bm->font->height,
253 * Compute width in pixels of a character.
255 * Compute the on screen width of a character, taking the
256 * current style and font into account.
258 * The width is accumulated in the WidthData structure
259 * passed as second argument.
261 * This is a formatted_write() callback used by text_vwidthf()
262 * to compute the length of a formatted string.
264 static int text_charWidth(int c, struct TextWidthData *twd)
266 unsigned char index = (unsigned char)c;
267 Bitmap *bm = twd->bitmap;
271 if (UNLIKELY(!FONT_HAS_GLYPH(bm->font, index)))
273 if (!FONT_HAS_GLYPH(bm->font, '?'))
276 index = bm->font->first;
279 /* Make character relative to font start */
280 index -= bm->font->first;
282 if (bm->font->offset)
283 /* Proportional font */
284 glyph_width = bm->font->widths[index]; /* TODO: optimize away */
286 /* Fixed width font */
287 glyph_width = bm->font->width;
289 if (bm->styles & STYLEF_CONDENSED)
292 if (bm->styles & STYLEF_EXPANDED)
295 twd->width += glyph_width;
301 * Return the width in pixels of a vprintf()-formatted string.
303 int PGM_FUNC(text_vwidthf)(
304 UNUSED_ARG(struct Bitmap *, bm),
305 const char * PGM_ATTR fmt,
308 /* Fixed font with no styles affecting the width? */
309 if (!bm->font->offset && !(bm->styles & (STYLEF_CONDENSED | STYLEF_EXPANDED)))
310 return PGM_FUNC(vsprintf)(NULL, fmt, ap) * bm->font->width;
313 struct TextWidthData twd;
316 _formatted_write(fmt, (void (*)(char, void *))text_charWidth, &twd, ap);
323 * Return the width in pixels of a printf()-formatted string.
325 int PGM_FUNC(text_widthf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...)
331 width = PGM_FUNC(text_vwidthf)(bm, fmt, ap);