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; }