X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mware%2Ftext_format.c;h=d8080a90c53d3c46727bd0f37f0f0902c2aa0d4f;hb=71f4355523bfcd350befa5d01826f990a90a83df;hp=5e73880f635024a4430cc7ad05c4b4e77d130977;hpb=cd3b99fd3642060e967f463d5ac0325eac042fe6;p=bertos.git diff --git a/mware/text_format.c b/mware/text_format.c index 5e73880f..d8080a90 100755 --- a/mware/text_format.c +++ b/mware/text_format.c @@ -1,38 +1,54 @@ /*! * \file - * * * - * \version $Id$ + * \brief printf-family routines for text output * + * \version $Id$ * \author Bernardo Innocenti * \author Stefano Fedrigo - * - * \brief printf-family routines for text output */ -/* - * $Log$ - * Revision 1.3 2004/08/03 15:57:18 aleph - * Add include to fix warning for vsprintf() - * - * Revision 1.2 2004/06/03 11:27:09 bernie - * Add dual-license information. - * - * Revision 1.1 2004/05/23 15:43:16 bernie - * Import mware modules. - * - * Revision 1.2 2004/03/26 18:50:50 bernie - * Move _PROGMEM stuff to compiler.h - * - * Revision 1.1 2004/03/19 16:52:28 bernie - * Move printf() like functions from text.c to text_format.c and add PROGMEM versions. - * - */ +/*#* + *#* $Log$ + *#* Revision 1.9 2004/12/31 17:47:45 bernie + *#* Rename UNUSED() to UNUSED_ARG(). + *#* + *#* Revision 1.8 2004/11/16 21:16:56 bernie + *#* Update to new naming scheme in mware/gfx.c. + *#* + *#* Revision 1.7 2004/10/03 19:05:04 bernie + *#* text_widthf(), text_vwidthf(): New functions. + *#* + *#* Revision 1.6 2004/09/14 20:59:04 bernie + *#* text_xprintf(): Support all styles; Pixel-wise text centering. + *#* + *#* Revision 1.5 2004/08/25 14:12:09 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.4 2004/08/05 18:46:44 bernie + *#* Documentation improvements. + *#* + *#* Revision 1.3 2004/08/03 15:57:18 aleph + *#* Add include to fix warning for vsprintf() + *#* + *#* Revision 1.2 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.1 2004/05/23 15:43:16 bernie + *#* Import mware modules. + *#* + *#* Revision 1.2 2004/03/26 18:50:50 bernie + *#* Move _PROGMEM stuff to compiler.h + *#* + *#* Revision 1.1 2004/03/19 16:52:28 bernie + *#* Move printf() like functions from text.c to text_format.c and add PROGMEM versions. + *#* + *#*/ #include "text.h" #include "formatwr.h" /* _formatted_write() */ @@ -43,7 +59,14 @@ #include /* strlen() */ /*! - * Render string str in bitmap + * Render string \a str in Bitmap \a bm at current cursor position + * + * \note Text formatting functions are also available with an _P suffix + * accepting the source string from program memory. This feature + * is only available (and useful) on Harvard microprocessors such + * as the AVR. + * + * \see text_putchar() */ int PGM_FUNC(text_puts)(const char * PGM_ATTR str, struct Bitmap *bm) { @@ -56,12 +79,30 @@ int PGM_FUNC(text_puts)(const char * PGM_ATTR str, struct Bitmap *bm) } +/*! + * vprintf()-like formatter to render text in a Bitmap. + * + * Perform vprintf()-like formatting on the \a fmt format string using the + * variable-argument list \a ap. + * Render the resulting string in Bitmap \a bm starting at the current + * cursor position. + * + * \see text_puts() text_putchar() text_printf() + */ int PGM_FUNC(text_vprintf)(struct Bitmap *bm, const char * PGM_ATTR fmt, va_list ap) { return PGM_FUNC(_formatted_write)(fmt, (void (*)(char, void *))text_putchar, bm, ap); } - +/*! + * printf()-like formatter to render text in a Bitmap. + * + * Perform printf()-like formatting on the \a fmt format string. + * Render the resulting string in Bitmap \a bm starting at the + * current cursor position. + * + * \see text_puts() text_putchar() text_vprintf() + */ int PGM_FUNC(text_printf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...) { int len; @@ -75,8 +116,23 @@ int PGM_FUNC(text_printf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...) } +/*! + * Render the result of printf()-like formatting in a specified position + * of a Bitmap. + * + * \param bm Bitmap where to render the text + * \param row Starting row in character units (zero based) + * \param col Starting column in character units (zero based) + * \param style Formatting style to use. In addition to any STYLEF_ + * flag, it can be TEXT_NORMAL, TEXT_FILL, TEXT_INVERT or + * TEXT_RIGHT, or a combination of these flags ORed together. + * \param fmt String possibly containing printf() formatting commands. + * + * \see text_puts() text_putchar() text_printf() text_vprintf() + * \see text_moveto() text_style() + */ int PGM_FUNC(text_xprintf)(struct Bitmap *bm, - uint8_t row, uint8_t col, uint8_t mode, const char * PGM_ATTR fmt, ...) + uint8_t row, uint8_t col, uint16_t style, const char * PGM_ATTR fmt, ...) { int len; uint8_t oldstyle = 0; @@ -86,32 +142,61 @@ int PGM_FUNC(text_xprintf)(struct Bitmap *bm, text_moveto(bm, row, col); - if (mode & TEXT_INVERT) - oldstyle = text_style(STYLEF_INVERT, STYLEF_INVERT); + if (style & STYLEF_MASK) + oldstyle = text_style(style, STYLEF_MASK); - if (mode & (TEXT_CENTER | TEXT_RIGHT)) + if (style & (TEXT_CENTER | TEXT_RIGHT)) { - uint8_t pad; - - pad = bm->width/FONT_WIDTH - PGM_FUNC(vsprintf)(NULL, fmt, ap); + uint8_t pad = bm->width - PGM_FUNC(text_vwidthf)(bm, fmt, ap); - if (mode & TEXT_CENTER) + if (style & TEXT_CENTER) pad /= 2; - while (pad--) - text_putchar(' ', bm); + if (style & TEXT_FILL) + gfx_rectFillC(bm, 0, row * FONT_HEIGHT, pad, (row + 1) * FONT_HEIGHT, + (style & STYLEF_INVERT) ? 0xFF : 0x00); + + text_setcoord(bm, pad, row * FONT_HEIGHT); } len = PGM_FUNC(text_vprintf)(bm, fmt, ap); va_end(ap); - if (mode & (TEXT_FILL | TEXT_CENTER)) - while (bm->penX + FONT_WIDTH < bm->width) - text_putchar(' ', bm); + if (style & TEXT_FILL) + gfx_rectFillC(bm, bm->penX, row * FONT_HEIGHT, bm->width, (row + 1) * FONT_HEIGHT, + (style & STYLEF_INVERT) ? 0xFF : 0x00); - if (mode & TEXT_INVERT) + /* Restore old style */ + if (style & STYLEF_MASK) text_style(oldstyle, STYLEF_MASK); return len; } + +/*! + * Return the width in pixels of a vprintf()-formatted string. + */ +int PGM_FUNC(text_vwidthf)( + UNUSED_ARG(struct Bitmap *, bm), + const char * PGM_ATTR fmt, + va_list ap) +{ + return PGM_FUNC(vsprintf)(NULL, fmt, ap) * FONT_WIDTH; +} + + +/*! + * Return the width in pixels of a printf()-formatted string. + */ +int PGM_FUNC(text_widthf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...) +{ + int width; + + va_list ap; + va_start(ap, fmt); + width = PGM_FUNC(text_vwidthf)(bm, fmt, ap); + va_end(ap); + + return width; +}