Fix unwanted type promotion.
[bertos.git] / gfx / text_format.c
old mode 100755 (executable)
new mode 100644 (file)
index 1ff86be..7c20472
@@ -1,9 +1,34 @@
-/*!
+/**
  * \file
  * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
  * Copyright 2003, 2004 Develer S.r.l. (http://www.develer.com/)
  * Copyright 1999 Bernardo Innocenti <bernie@develer.com>
- * This file is part of DevLib - See README.devlib for information.
+ *
  * -->
  *
  * \brief printf-family routines for text output
 
 /*#*
  *#* $Log$
+ *#* Revision 1.10  2006/07/19 12:56:26  bernie
+ *#* Convert to new Doxygen style.
+ *#*
+ *#* Revision 1.9  2006/04/27 05:39:24  bernie
+ *#* Enhance text rendering to arbitrary x,y coords.
+ *#*
+ *#* Revision 1.8  2006/03/22 09:50:11  bernie
+ *#* Don't use C99 stuff.
+ *#*
  *#* Revision 1.7  2006/03/20 17:51:55  bernie
  *#* Cleanups.
  *#*
 #include <stdarg.h>
 #include <string.h> /* strlen() */
 
-/*!
+/**
  * Render string \a str in Bitmap \a bm at current cursor position
  *
  * \note Text formatting functions are also available with an _P suffix
@@ -105,7 +139,7 @@ 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
@@ -120,7 +154,7 @@ int PGM_FUNC(text_vprintf)(struct Bitmap *bm, const char * PGM_ATTR fmt, va_list
        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.
@@ -141,32 +175,18 @@ int PGM_FUNC(text_printf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...)
        return len;
 }
 
-
-/*!
- * 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.
+/**
+ * Render text with vprintf()-like formatting at a specified pixel position.
  *
- * \see text_puts() text_putchar() text_printf() text_vprintf()
- * \see text_moveto() text_style()
+ * \see text_xyprintf()
  */
-int PGM_FUNC(text_xprintf)(struct Bitmap *bm,
-               uint8_t row, uint8_t col, uint16_t style, const char * PGM_ATTR fmt, ...)
+int PGM_FUNC(text_xyvprintf)(struct Bitmap *bm,
+               coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, va_list ap)
 {
        int len;
        uint8_t oldstyle = 0;
-       va_list ap;
 
-       va_start(ap, fmt);
-
-       text_moveto(bm, row, col);
+       text_setCoord(bm, x, y);
 
        if (style & STYLEF_MASK)
                oldstyle = text_style(bm, style, STYLEF_MASK);
@@ -179,17 +199,16 @@ int PGM_FUNC(text_xprintf)(struct Bitmap *bm,
                        pad /= 2;
 
                if (style & TEXT_FILL)
-                       gfx_rectFillC(bm, 0, row * bm->font->height, pad, (row + 1) * bm->font->height,
+                       gfx_rectFillC(bm, 0, y, pad, y + bm->font->height,
                                (style & STYLEF_INVERT) ? 0xFF : 0x00);
 
-               text_setcoord(bm, pad, row * bm->font->height);
+               text_setCoord(bm, pad, y);
        }
 
        len = PGM_FUNC(text_vprintf)(bm, fmt, ap);
-       va_end(ap);
 
        if (style & TEXT_FILL)
-               gfx_rectFillC(bm, bm->penX, row * bm->font->height, bm->width, (row + 1) * bm->font->height,
+               gfx_rectFillC(bm, bm->penX, y, bm->width, y + bm->font->height,
                        (style & STYLEF_INVERT) ? 0xFF : 0x00);
 
        /* Restore old style */
@@ -200,6 +219,55 @@ int PGM_FUNC(text_xprintf)(struct Bitmap *bm,
 }
 
 
+/**
+ * Render text with printf()-like formatting at a specified pixel position.
+ *
+ * \param bm Bitmap where to render the text
+ * \param x     [pixels] Initial X coordinate of text.
+ * \param y     [pixels] Coordinate of top border of text.
+ * \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_xyprintf)(struct Bitmap *bm,
+               coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, ...)
+{
+       int len;
+       va_list ap;
+
+       va_start(ap, fmt);
+       len = PGM_FUNC(text_xyvprintf)(bm, x, y, style, fmt, ap);
+       va_end(ap);
+
+       return len;
+}
+
+
+/**
+ * Render text with printf()-like formatting at a specified row/column position.
+ *
+ * \see text_xyprintf()
+ */
+int PGM_FUNC(text_xprintf)(struct Bitmap *bm,
+               uint8_t row, uint8_t col, uint16_t style, const char * PGM_ATTR fmt, ...)
+{
+       int len;
+       va_list ap;
+
+       va_start(ap, fmt);
+       len = PGM_FUNC(text_xyvprintf)(
+                       bm, col * bm->font->width, row * bm->font->height,
+                       style, fmt, ap);
+       va_end(ap);
+
+       return len;
+}
+
+
 struct TextWidthData
 {
        Bitmap *bitmap;
@@ -254,7 +322,7 @@ static int text_charWidth(int c, struct TextWidthData *twd)
        return c;
 }
 
-/*!
+/**
  * Return the width in pixels of a vprintf()-formatted string.
  */
 int PGM_FUNC(text_vwidthf)(
@@ -267,14 +335,16 @@ int PGM_FUNC(text_vwidthf)(
                return PGM_FUNC(vsprintf)(NULL, fmt, ap) * bm->font->width;
        else
        {
-               struct TextWidthData twd = { bm, 0 };
+               struct TextWidthData twd;
+               twd.bitmap = bm;
+               twd.width = 0;
                _formatted_write(fmt, (void (*)(char, void *))text_charWidth, &twd, ap);
                return twd.width;
        }
 }
 
 
-/*!
+/**
  * Return the width in pixels of a printf()-formatted string.
  */
 int PGM_FUNC(text_widthf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...)