Merge branch 'master' of gitlab:wintermute/hackover2013-badge-firmware
[hackover2013-badge-firmware.git] / drivers / displays / tft / aafonts.c
index 163b677..0983c15 100644 (file)
@@ -1,5 +1,5 @@
 /**************************************************************************/
-/*! 
+/*!  
     @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 ------------------------------ */
@@ -66,9 +74,9 @@
                 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++)
@@ -121,9 +129,9 @@ int aafontsDrawCharAA2( uint16_t x, uint16_t y, uint16_t height, aafontsCharInfo
                 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++)
@@ -188,7 +196,6 @@ void aafontsDrawString(uint16_t x, uint16_t y, const uint16_t * colorTable, cons
 {
   uint16_t currentX, charWidth, characterToOutput;
   const aafontsCharInfo_t *charInfo;
-  uint16_t charOffset;
 
   // set current x, y to that of requested
   currentX = x;
@@ -198,7 +205,6 @@ void aafontsDrawString(uint16_t x, uint16_t y, const uint16_t * colorTable, cons
   {
     // 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))
@@ -233,6 +239,30 @@ void aafontsDrawString(uint16_t x, uint16_t y, const uint16_t * colorTable, cons
   }
 }
 
+/**************************************************************************/
+/*!
+    @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
@@ -263,7 +293,6 @@ uint16_t aafontsGetStringWidth(const aafontsFont_t *font, char *str)
   uint16_t width = 0;
   const aafontsCharInfo_t *charInfo;
   uint32_t currChar;
-  uint32_t startChar = font->firstChar;
 
   // until termination
   for (currChar = *str; currChar; currChar = *(++str))
@@ -286,3 +315,68 @@ uint16_t aafontsGetStringWidth(const aafontsFont_t *font, char *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);
+  }
+}
This page took 0.029417 seconds and 4 git commands to generate.