pyrocommander

Dependencies:   Fonts LCD_DISCO_F746NG TS_DISCO_F746NG debug mbed

Committer:
rondekoster
Date:
Mon Mar 14 19:12:12 2016 +0000
Revision:
4:84d7423a6bf4
Parent:
1:e46a729c44db
pyrocommander

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rondekoster 1:e46a729c44db 1 //
rondekoster 1:e46a729c44db 2 // use http://www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/ to create the font definitions
rondekoster 1:e46a729c44db 3 // plus modify output:
rondekoster 1:e46a729c44db 4 // - char height: in bits
rondekoster 1:e46a729c44db 5 // - font height: don't display
rondekoster 1:e46a729c44db 6 // - generate space bitmap
rondekoster 1:e46a729c44db 7 //
rondekoster 1:e46a729c44db 8 // - remove \ comment from const FONT_CHAR_INFO xxxDescriptors[]
rondekoster 1:e46a729c44db 9 // - rename fontxxx.c to fontxxx.cpp file
rondekoster 1:e46a729c44db 10 //
rondekoster 1:e46a729c44db 11
rondekoster 1:e46a729c44db 12 #include "FontX.h"
rondekoster 1:e46a729c44db 13
rondekoster 1:e46a729c44db 14 #include "stm32746g_discovery_lcd.h"
rondekoster 1:e46a729c44db 15 #include "debug.h"
rondekoster 1:e46a729c44db 16
rondekoster 1:e46a729c44db 17 #define CHAR_SPACE 2
rondekoster 1:e46a729c44db 18
rondekoster 1:e46a729c44db 19 static bool useAlias=true;
rondekoster 1:e46a729c44db 20
rondekoster 1:e46a729c44db 21 uint32_t FontX_GetLength(char *Text,const FONT_INFO *pFont)
rondekoster 1:e46a729c44db 22 {
rondekoster 1:e46a729c44db 23 uint32_t length;
rondekoster 1:e46a729c44db 24 uint32_t index;
rondekoster 1:e46a729c44db 25
rondekoster 1:e46a729c44db 26 length=0;
rondekoster 1:e46a729c44db 27
rondekoster 1:e46a729c44db 28 while ((*Text)!='\0')
rondekoster 1:e46a729c44db 29 {
rondekoster 1:e46a729c44db 30 if (((*Text)>=pFont->StartCharacter) && (((*Text)<=pFont->EndCharacter) || ((pFont->EndCharacter>0x80)))) // mbed used a different character table than TheDotFactory.exe
rondekoster 1:e46a729c44db 31 {
rondekoster 1:e46a729c44db 32 index=(*Text)-pFont->StartCharacter;
rondekoster 1:e46a729c44db 33 length+=pFont->Descriptors[index].Charwidth;
rondekoster 1:e46a729c44db 34 }
rondekoster 1:e46a729c44db 35
rondekoster 1:e46a729c44db 36 length+=CHAR_SPACE;
rondekoster 1:e46a729c44db 37
rondekoster 1:e46a729c44db 38 if (useAlias==true)
rondekoster 1:e46a729c44db 39 length+=CHAR_SPACE;
rondekoster 1:e46a729c44db 40
rondekoster 1:e46a729c44db 41 Text++;
rondekoster 1:e46a729c44db 42 }
rondekoster 1:e46a729c44db 43
rondekoster 1:e46a729c44db 44 if (useAlias==true)
rondekoster 1:e46a729c44db 45 length/=2;
rondekoster 1:e46a729c44db 46
rondekoster 1:e46a729c44db 47 return length;
rondekoster 1:e46a729c44db 48 }
rondekoster 1:e46a729c44db 49
rondekoster 1:e46a729c44db 50 uint32_t FontX_GetHeight(const FONT_INFO *pFont)
rondekoster 1:e46a729c44db 51 {
rondekoster 1:e46a729c44db 52 uint32_t height;
rondekoster 1:e46a729c44db 53
rondekoster 1:e46a729c44db 54 height=pFont->Descriptors[0].Charheight;
rondekoster 1:e46a729c44db 55
rondekoster 1:e46a729c44db 56 if (useAlias==true)
rondekoster 1:e46a729c44db 57 height/=2;
rondekoster 1:e46a729c44db 58
rondekoster 1:e46a729c44db 59 return height;
rondekoster 1:e46a729c44db 60 }
rondekoster 1:e46a729c44db 61
rondekoster 1:e46a729c44db 62 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)
rondekoster 1:e46a729c44db 63 {
rondekoster 1:e46a729c44db 64 uint32_t xsize = 0;
rondekoster 1:e46a729c44db 65
rondekoster 1:e46a729c44db 66 /* get pixel length */
rondekoster 1:e46a729c44db 67 xsize = FontX_GetLength(Text,pFont);
rondekoster 1:e46a729c44db 68
rondekoster 1:e46a729c44db 69 switch (Alignment)
rondekoster 1:e46a729c44db 70 {
rondekoster 1:e46a729c44db 71 case ALIGN_CENTER:
rondekoster 1:e46a729c44db 72 Xpos+=(width-xsize)/2;
rondekoster 1:e46a729c44db 73 break;
rondekoster 1:e46a729c44db 74
rondekoster 1:e46a729c44db 75 case ALIGN_RIGHT:
rondekoster 1:e46a729c44db 76 Xpos=width-xsize-Xpos;
rondekoster 1:e46a729c44db 77 break;
rondekoster 1:e46a729c44db 78
rondekoster 1:e46a729c44db 79 case ALIGN_LEFT:
rondekoster 1:e46a729c44db 80 default:
rondekoster 1:e46a729c44db 81 break;
rondekoster 1:e46a729c44db 82 }
rondekoster 1:e46a729c44db 83
rondekoster 1:e46a729c44db 84 /* send the string character by character on LCD */
rondekoster 1:e46a729c44db 85 while ((*Text)!='\0')
rondekoster 1:e46a729c44db 86 {
rondekoster 1:e46a729c44db 87 /* display one character on LCD */
rondekoster 1:e46a729c44db 88 Xpos+=FontX_DisplayChar(Xpos,Ypos,*Text,pFont,colorText,colorBack);
rondekoster 1:e46a729c44db 89
rondekoster 1:e46a729c44db 90 /* point on the next character */
rondekoster 1:e46a729c44db 91 Text++;
rondekoster 1:e46a729c44db 92 }
rondekoster 1:e46a729c44db 93 }
rondekoster 1:e46a729c44db 94
rondekoster 1:e46a729c44db 95 uint32_t FontX_DisplayChar(uint16_t Xpos,uint16_t Ypos,char Ascii,const FONT_INFO *pFont,uint32_t colorText,uint32_t colorBack)
rondekoster 1:e46a729c44db 96 {
rondekoster 1:e46a729c44db 97 uint32_t line;
rondekoster 1:e46a729c44db 98 uint32_t line2;
rondekoster 1:e46a729c44db 99 uint32_t index;
rondekoster 1:e46a729c44db 100 uint32_t offset;
rondekoster 1:e46a729c44db 101 uint32_t lineOffset;
rondekoster 1:e46a729c44db 102 uint32_t i;
rondekoster 1:e46a729c44db 103 uint32_t j;
rondekoster 1:e46a729c44db 104 uint32_t bits;
rondekoster 1:e46a729c44db 105 uint32_t color;
rondekoster 1:e46a729c44db 106 uint32_t red;
rondekoster 1:e46a729c44db 107 uint32_t green;
rondekoster 1:e46a729c44db 108 uint32_t blue;
rondekoster 1:e46a729c44db 109 uint32_t transparency;
rondekoster 1:e46a729c44db 110
rondekoster 1:e46a729c44db 111 if (Ascii<pFont->StartCharacter)
rondekoster 1:e46a729c44db 112 return 0;
rondekoster 1:e46a729c44db 113 if ((Ascii>pFont->EndCharacter) && (pFont->EndCharacter<0x80)) // mbed used a different character table than TheDotFactory.exe
rondekoster 1:e46a729c44db 114 return 0;
rondekoster 1:e46a729c44db 115
rondekoster 1:e46a729c44db 116 index=Ascii-pFont->StartCharacter;
rondekoster 1:e46a729c44db 117
rondekoster 1:e46a729c44db 118 lineOffset=8 * ((pFont->Descriptors[index].Charwidth + 7) / 8) - pFont->Descriptors[index].Charwidth;
rondekoster 1:e46a729c44db 119
rondekoster 1:e46a729c44db 120 offset=pFont->Descriptors[index].Offset;
rondekoster 1:e46a729c44db 121
rondekoster 1:e46a729c44db 122 for (i=0;i<pFont->Descriptors[index].Charheight;i++)
rondekoster 1:e46a729c44db 123 {
rondekoster 1:e46a729c44db 124 if (useAlias==true)
rondekoster 1:e46a729c44db 125 {
rondekoster 1:e46a729c44db 126 // get average of 2x2 pixel array
rondekoster 1:e46a729c44db 127 for (j=0;j<pFont->Descriptors[index].Charwidth;j+=2)
rondekoster 1:e46a729c44db 128 {
rondekoster 1:e46a729c44db 129 line=pFont->Bitmaps[offset+(j /8)];
rondekoster 1:e46a729c44db 130 line2=pFont->Bitmaps[offset+(j /8) + ((pFont->Descriptors[index].Charwidth + 7)/8)];
rondekoster 1:e46a729c44db 131
rondekoster 1:e46a729c44db 132 bits=0;
rondekoster 1:e46a729c44db 133 if (line & (1 << ((pFont->Descriptors[index].Charwidth - j + lineOffset - 1) % 8)))
rondekoster 1:e46a729c44db 134 bits++;
rondekoster 1:e46a729c44db 135 if (line & (1 << ((pFont->Descriptors[index].Charwidth - (j+1) + lineOffset - 1) % 8)))
rondekoster 1:e46a729c44db 136 bits++;
rondekoster 1:e46a729c44db 137 if (line2 & (1 << ((pFont->Descriptors[index].Charwidth - j + lineOffset - 1) % 8)))
rondekoster 1:e46a729c44db 138 bits++;
rondekoster 1:e46a729c44db 139 if (line2 & (1 << ((pFont->Descriptors[index].Charwidth - (j+1) + lineOffset - 1) % 8)))
rondekoster 1:e46a729c44db 140 bits++;
rondekoster 1:e46a729c44db 141
rondekoster 1:e46a729c44db 142 // alpha blend it to the current screen
rondekoster 1:e46a729c44db 143 if ((colorBack==0x00000000) || (colorBack==0x00000001))
rondekoster 1:e46a729c44db 144 color=BSP_LCD_ReadPixel((Xpos+(j/2)),Ypos);
rondekoster 1:e46a729c44db 145 else
rondekoster 1:e46a729c44db 146 color=colorBack;
rondekoster 1:e46a729c44db 147
rondekoster 1:e46a729c44db 148 if (colorBack==0x00000000)
rondekoster 1:e46a729c44db 149 transparency=255;
rondekoster 1:e46a729c44db 150 else if (colorBack==0x00000001)
rondekoster 1:e46a729c44db 151 transparency=255*bits/4;
rondekoster 1:e46a729c44db 152 else
rondekoster 1:e46a729c44db 153 transparency=255;
rondekoster 1:e46a729c44db 154
rondekoster 1:e46a729c44db 155 red=((color >> 16) & 0xFF)*(4-bits)/4;
rondekoster 1:e46a729c44db 156 green=((color >> 8) & 0xFF)*(4-bits)/4;
rondekoster 1:e46a729c44db 157 blue=(color & 0xFF)*(4-bits)/4;
rondekoster 1:e46a729c44db 158
rondekoster 1:e46a729c44db 159 red+=(((colorText >> 16) & 0xFF)*bits/4);
rondekoster 1:e46a729c44db 160 if (red>255)
rondekoster 1:e46a729c44db 161 red=255;
rondekoster 1:e46a729c44db 162 green+=(((colorText >> 8) & 0xFF)*bits/4);
rondekoster 1:e46a729c44db 163 if (green>255)
rondekoster 1:e46a729c44db 164 green=255;
rondekoster 1:e46a729c44db 165 blue+=((colorText & 0xFF)*bits/4);
rondekoster 1:e46a729c44db 166 if (blue>255)
rondekoster 1:e46a729c44db 167 blue=255;
rondekoster 1:e46a729c44db 168
rondekoster 1:e46a729c44db 169 // write pixel
rondekoster 1:e46a729c44db 170 BSP_LCD_DrawPixel((Xpos+(j/2)),Ypos,(transparency << 24) | (red << 16) | (green << 8) | blue);
rondekoster 1:e46a729c44db 171 }
rondekoster 1:e46a729c44db 172 }
rondekoster 1:e46a729c44db 173 else
rondekoster 1:e46a729c44db 174 {
rondekoster 1:e46a729c44db 175 for (j=0;j<pFont->Descriptors[index].Charwidth;j++)
rondekoster 1:e46a729c44db 176 {
rondekoster 1:e46a729c44db 177 if (line & (1 << (pFont->Descriptors[index].Charwidth - j + lineOffset - 1)))
rondekoster 1:e46a729c44db 178 {
rondekoster 1:e46a729c44db 179 BSP_LCD_DrawPixel((Xpos+j),Ypos,colorText);
rondekoster 1:e46a729c44db 180 }
rondekoster 1:e46a729c44db 181 else
rondekoster 1:e46a729c44db 182 {
rondekoster 1:e46a729c44db 183 if ((colorBack!=0x00000000) && (colorBack!=0x00000001))
rondekoster 1:e46a729c44db 184 BSP_LCD_DrawPixel((Xpos+j),Ypos,colorBack);
rondekoster 1:e46a729c44db 185 }
rondekoster 1:e46a729c44db 186 }
rondekoster 1:e46a729c44db 187 }
rondekoster 1:e46a729c44db 188
rondekoster 1:e46a729c44db 189 // fill char space area
rondekoster 1:e46a729c44db 190 if ((colorBack!=0x00000000) && (colorBack!=0x00000001))
rondekoster 1:e46a729c44db 191 {
rondekoster 1:e46a729c44db 192 for (j=0;j<CHAR_SPACE;j++)
rondekoster 1:e46a729c44db 193 BSP_LCD_DrawPixel((Xpos+(pFont->Descriptors[index].Charwidth/2)+j),Ypos,colorBack);
rondekoster 1:e46a729c44db 194 }
rondekoster 1:e46a729c44db 195
rondekoster 1:e46a729c44db 196 Ypos++;
rondekoster 1:e46a729c44db 197
rondekoster 1:e46a729c44db 198 offset+=((pFont->Descriptors[index].Charwidth + 7)/8);
rondekoster 1:e46a729c44db 199 if (useAlias==true)
rondekoster 1:e46a729c44db 200 offset+=((pFont->Descriptors[index].Charwidth + 7)/8);
rondekoster 1:e46a729c44db 201
rondekoster 1:e46a729c44db 202 if (useAlias==true)
rondekoster 1:e46a729c44db 203 i++;
rondekoster 1:e46a729c44db 204 }
rondekoster 1:e46a729c44db 205
rondekoster 1:e46a729c44db 206 i=pFont->Descriptors[index].Charwidth;
rondekoster 1:e46a729c44db 207
rondekoster 1:e46a729c44db 208 if (useAlias==true)
rondekoster 1:e46a729c44db 209 i/=2;
rondekoster 1:e46a729c44db 210
rondekoster 1:e46a729c44db 211 return i+CHAR_SPACE;
rondekoster 1:e46a729c44db 212 }