Wakeup Light with touch user interface, anti-aliased Font, SD card access and RTC usage on STM32F746NG-DISCO board

Dependencies:   BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG TS_DISCO_F746NG FATFileSystem TinyJpgDec_interwork mbed-src

FontX/FontX.cpp

Committer:
the_sz
Date:
2016-01-31
Revision:
13:811a5c5b3fd6
Child:
14:2044ad5cd3fe

File content as of revision 13:811a5c5b3fd6:

//
// use http://www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/ to create the font definitions
// plus modify output:
//   - char height: in bits
//   - font height: don't display
//   - generate space bitmap
//
//   - remove \ comment from const FONT_CHAR_INFO xxxDescriptors[]
//   - rename fontxxx.c to fontxxx.cpp file
//

#include "FontX.h"

#include "stm32746g_discovery_lcd.h"

#define CHAR_SPACE      2

static bool             useAlias=true;

uint32_t FontX_GetLength(char *Text,const FONT_INFO *pFont)
{
    uint32_t            length;
    uint32_t            index;

    length=0;
    
    while ((*Text)!='\0')
    {
        if (((*Text)>=pFont->StartCharacter) && ((*Text)<=pFont->EndCharacter))
        {
            index=(*Text)-pFont->StartCharacter;
            length+=pFont->Descriptors[index].Charwidth;
        }

        length+=CHAR_SPACE;

        Text++;
    }
    
    return length;
}

uint32_t FontX_GetHeight(const FONT_INFO *pFont)
{
    return pFont->Descriptors[0].Charheight;
}

void FontX_DisplayStringAt(uint16_t Xpos,uint16_t Ypos,uint16_t width,char *Text,FONTX_ALIGNMENT_ENUM Alignment,const FONT_INFO *pFont,uint32_t colorText,uint32_t colorBack)
{
    uint32_t xsize = 0; 
    
    /* get pixel length */
    xsize = FontX_GetLength(Text,pFont);
    
    switch (Alignment)
    {
        case ALIGN_CENTER:
            Xpos+=(width-xsize)/2;
            break;

        case ALIGN_RIGHT:
            Xpos=width-xsize-Xpos;
            break;

        case ALIGN_LEFT:
        default:
            break;
    }
    
    /* send the string character by character on LCD */
    while ((*Text)!='\0')
    {
        /* display one character on LCD */
        Xpos+=FontX_DisplayChar(Xpos,Ypos,*Text,pFont,colorText,colorBack);

        /* point on the next character */
        Text++;
    }  
}

uint32_t FontX_DisplayChar(uint16_t Xpos,uint16_t Ypos,char Ascii,const FONT_INFO *pFont,uint32_t colorText,uint32_t colorBack)
{
    uint32_t        line;
    uint32_t        index;
    uint32_t        offset;
    uint32_t        lineOffset;
    uint32_t        i;
    uint32_t        j;

    if (Ascii<pFont->StartCharacter)
        return 0;
    if (Ascii>pFont->EndCharacter)
        return 0;

    index=Ascii-pFont->StartCharacter;

    lineOffset=8 * ((pFont->Descriptors[index].Charwidth + 7) / 8) -  pFont->Descriptors[index].Charwidth;

    offset=pFont->Descriptors[index].Offset;
    for (i=0;i<pFont->Descriptors[index].Charheight;i++)
    {
        switch(((pFont->Descriptors[index].Charwidth + 7)/8))
        {
            case 1:
                line=pFont->Bitmaps[offset];
                offset++;
                break;

            case 2:
                line=(pFont->Bitmaps[offset]<<8) | pFont->Bitmaps[offset+1];
                offset+=2;
                break;

            case 3:
            default:
                line=(pFont->Bitmaps[offset]<<16) | (pFont->Bitmaps[offset+1]<<8) | pFont->Bitmaps[offset+2];
                offset+=3;
                break;
        }

        if (useAlias==true)
        {
xxxx
            // get average of 2x2 pixel array
            for (j=0;j<pFont->Descriptors[index].Charwidth;j++)
            {
                if (line & (1 << (pFont->Descriptors[index].Charwidth - j + lineOffset - 1)))
                {
                    BSP_LCD_DrawPixel((Xpos+j),Ypos,colorText);
                }
                else
                {
                    if (colorBack!=0x00000000)
                        BSP_LCD_DrawPixel((Xpos+j),Ypos,colorBack);
                }
            }

            // alpha blend it to the current screen
                    if (colorBack!=0x00000000)

            // write pixel
uint32_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos);
xxxxx
        }
        else
        {
            for (j=0;j<pFont->Descriptors[index].Charwidth;j++)
            {
                if (line & (1 << (pFont->Descriptors[index].Charwidth - j + lineOffset - 1)))
                {
                    BSP_LCD_DrawPixel((Xpos+j),Ypos,colorText);
                }
                else
                {
                    if (colorBack!=0x00000000)
                        BSP_LCD_DrawPixel((Xpos+j),Ypos,colorBack);
                }
            }
        }

        // fill char space area
        if (colorBack!=0x00000000)
        {
            for (j=0;j<CHAR_SPACE;j++)
                BSP_LCD_DrawPixel((Xpos+pFont->Descriptors[index].Charwidth+j),Ypos,colorBack);
        }

        Ypos++;
    }

    return pFont->Descriptors[index].Charwidth+CHAR_SPACE;
}