/**************************************************************************/
-/*!
+/*!
@file aafonts.c
@author K. Townsend (microBuilder.eu)
#include "drivers/displays/tft/lcd.h"
#include "drivers/displays/tft/drawing.h"
+// Common color lookup tables for AA2 (4-color anti-aliased) fonts
+const uint16_t COLORTABLE_AA2_WHITEONBLACK[4] = { 0x0000, 0x52AA, 0xAD55, 0xFFFF};
+const uint16_t COLORTABLE_AA2_BLACKONWHITE[4] = { 0xFFFF, 0xAD55, 0x52AA, 0x0000};
+
+// Common color lookup tables for AA4 (16-color anti-aliased) fonts
+const uint16_t COLORTABLE_AA4_WHITEONBLACK[16] = { 0x0000, 0x1082, 0x2104, 0x3186, 0x4208, 0x528A, 0x630C, 0x738E, 0x8410, 0x9492, 0xA514, 0xB596, 0xC618, 0xD69A, 0xE71C, 0xFFFF};
+const uint16_t COLORTABLE_AA4_BLACKONWHITE[16] = { 0xFFFF, 0xE71C, 0xD69A, 0xC618, 0xB596, 0xA514, 0x9492, 0x8410, 0x738E, 0x630C, 0x528A, 0x4208, 0x3186, 0x2104, 0x1082, 0x0000};
+
/**************************************************************************/
/* */
/* ----------------------- Private Methods ------------------------------ */
Pointer to the 4 element color lookup table
*/
/**************************************************************************/
-int aafontsDrawCharAA2( uint16_t x, uint16_t y, uint16_t height, aafontsCharInfo_t character, const uint16_t * colorTable)
+void aafontsDrawCharAA2( uint16_t x, uint16_t y, uint16_t height, aafontsCharInfo_t character, const uint16_t * colorTable)
{
- uint16_t w, h, xp, yp, pos;
+ uint16_t w, h, pos;
uint8_t color;
for (h = 0; h < height; h++)
Pointer to the 16 element color lookup table
*/
/**************************************************************************/
-int aafontsDrawCharAA4( uint16_t x, uint16_t y, uint16_t height, aafontsCharInfo_t character, const uint16_t * colorTable)
+void aafontsDrawCharAA4( uint16_t x, uint16_t y, uint16_t height, aafontsCharInfo_t character, const uint16_t * colorTable)
{
- uint16_t w, h, xp, yp;
+ uint16_t w, h;
uint8_t color;
for (h = 0; h < height; h++)
{
uint16_t currentX, charWidth, characterToOutput;
const aafontsCharInfo_t *charInfo;
- uint16_t charOffset;
// set current x, y to that of requested
currentX = x;
{
// get character to output
characterToOutput = *str;
- uint16_t last = font->lastChar;
// Check if the character is within the font boundaries
if ((characterToOutput > font->lastChar) || (characterToOutput < font->firstChar))
}
}
+/**************************************************************************/
+/*!
+ @brief Draws a string using the supplied anti-aliased font, centering
+ it on the specified X/Y co-ordinate
+
+ @param[in] x
+ Center x co-ordinate
+ @param[in] y
+ Center y co-ordinate
+ @param[in] colorTable
+ The color lookup table to use for the antialiased pixels
+ @param[in] font
+ Pointer to the aafontsFont_t to use when drawing the string
+ @param[in] str
+ The string to render
+*/
+/**************************************************************************/
+void aafontsCenterString(uint16_t x, uint16_t y, const uint16_t * colorTable, const aafontsFont_t *font, char *str)
+{
+ uint32_t stringWidth;
+ stringWidth = aafontsGetStringWidth(font, str);
+ aafontsDrawString(x - stringWidth/2, y, colorTable, font, str);
+}
+
/**************************************************************************/
/*!
@brief Returns the width in pixels of a string when it is rendered
uint16_t width = 0;
const aafontsCharInfo_t *charInfo;
uint32_t currChar;
- uint32_t startChar = font->firstChar;
// until termination
for (currChar = *str; currChar; currChar = *(++str))
/* return the string width */
return width;
}
+
+/**************************************************************************/
+/*!
+ @brief Calculates a 4 or 16 color lookup table between the specified
+ bg and fore colors for use with anti-aliased fonts.
+
+ @note This method can be used to place anti-aliased text on any color
+ of background, as long as it's a single solid color.
+
+ @param[in] bgColor
+ The RGB565 color of the background
+ @param[in] foreColor
+ The RGB565 fore color for the anti-aliased text
+ @param[in] colorTable
+ Pointer to the 4 or 16 element array that will be
+ populated with the individual color values
+ @param[in] tableSize
+ The number of elements in the colorTable array (acceptable
+ values are 4 for AA2 or 16 for AA4).
+
+ @section Example
+
+ @code
+
+ #include "drivers/displays/tft/colors.h"
+ #include "drivers/displays/tft/drawing.h"
+ #include "drivers/displays/tft/aafonts.h"
+ #include "drivers/displays/tft/aafonts/aa2/DejaVuSansCondensed14_AA2.h"
+ #include "drivers/displays/tft/aafonts/aa2/DejaVuSansCondensedBold14_AA2.h"
+
+ uint16_t bgColor = COLOR_RED;
+ uint16_t foreColor = COLOR_YELLOW;
+ uint16_t ctable[4];
+
+ // Calculate a 4 color lookup table using the fore and bg colors
+ aafontsCalculateColorTable(bgColor, foreColor, &ctable[0], 4);
+
+ // Render a solid rectangle for the background
+ drawRectangleFilled(10, 10, 200, 50, bgColor);
+
+ // Draw some AA2 anti-aliased text using the generated color table
+ aafontsDrawString(10, 13, ctable, &DejaVuSansCondensed14_AA2, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ aafontsDrawString(10, 33, ctable, &DejaVuSansCondensedBold14_AA2, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+
+ @endcode
+*/
+/**************************************************************************/
+void aafontsCalculateColorTable(uint16_t bgColor, uint16_t foreColor, uint16_t *colorTable, size_t tableSize)
+{
+ uint16_t i, stepsize;
+
+ if ((tableSize != 4) && (tableSize != 16))
+ return;
+
+ colorTable[0] = bgColor;
+ colorTable[tableSize - 1] = foreColor;
+
+ stepsize = 100/(tableSize-1);
+
+ for (i = 1; i < tableSize - 1; i++)
+ {
+ // Gradually decrease the amount of alpha-blending from high to low
+ colorTable[i] = colorsAlphaBlend(bgColor, foreColor, 100-i*stepsize);
+ }
+}