ADVERTISEMENT

znaki8px.c

[AVR] Jak efektywnie przechowywać i rysować fonty 5x, 8x, 12x na AVR 3510i?

Witam. Mam pytanie. Skąd wytrzasnąć fajne fonty wysokości 5 ; 8 ; 12 znaków o zmiennej szerokości i jak trzymać je w pamięci AVR, żeby zajmowały jak najmniej miejsca i prosto je było rysować. Puki co próbowałem czionki truetype konwertować, ale wielkość 5 i 8 jest za mała i wychodzą brzydkie. Pamiętam, że na 8 bitowe komputery była tego masa, ale jakoś nie mogę znaleźć. Co do trzymania ich w pamięci to mój pomysł na wysokość 8px jest taki że stworzyłem 2 tablicę (jedna z offsetem i szerokością znaku, a druga z właściwymi definicjami ). Definicje to kolejne bajty (1 bajt definicja pojedynczego pionowego paska znaku). W tablicy pierwszej w słowie najstarsze 4 bity to szerokość, pozostałe 12 to przesunięcie znaku w tablicy z definicjami. Zajmuje to sporo mniej niż standardowa tablica i od razu mamy szerokość każdego znaku. Definicje zaczynają się od znaku 32 ASCII. Ma ktoś jakiś ciekawszy pomysł na trzymanie czcionki 8px a także na 12px i 5px? Jakich narzędzi lub źródeł użyć do pozyskania takich czcionek do użycia w AVR C? W załączniku czcionka 8px i procedura malowania znaku//wyswietla znak na wyświetlaczu i zwraca jego szerokość uint8_t LCD_Char(uint8_t mychr, uint8_t xPos, uint8_t yPos){ uint16_t adres; uint8_t width; int8_t x; int8_t y; uint8_t linia; adres = pgm_read_word(&charAddr8x8[mychr-32]); //offset znaku width = adres>>12; adres &= 0b0000111111111111; for(x=0; x<width; x++) { linia = pgm_read_byte(&charArray8x8[adres+x]); for(y = 7; y > -1 ; y--){ if(linia&0b10000000){ //wyswietla pixel znaku LCD_Pixel(xPos+x, yPos+y); } linia = linia<<1; } } return width; }


Download file - link to post

uint16_t charAddr8x8[] PROGMEM = {
8192, 12290, 20485, 20490, 16399, 20499, 20504, 8221, 8223, 8225, 20515, 20520, 8237, 20527, 8244,
20534, 20539, 12352, 20547, 20552, 20557, 20562, 20567, 20572, 20577, 20582, 8299, 8301, 16495, 20595, 16504,
20604, 20609, 20614, 20619, 20624, 20629, 20634, 20639, 20644, 20649, 12462, 20657, 20662, 20667, 20672, 20677,
20682, 20687, 20692, 20697, 20702, 20707, 20712, 20717, 20722, 20727, 20732, 16641, 12549, 20744, 12557, 20752,
33045, 8477, 20767, 20772, 20777, 20782, 20787, 16696, 20796, 16705, 8517, 16711, 16715, 8527, 20817, 16726,
20826, 20831, 20836, 20841, 20846, 16755, 16759, 20859, 20864, 16773, 16777, 16781, 16785, 4501, 16790, 16794,
414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 20894, 419, 419,
16803, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 20903, 428, 428,
16812, 432, 432, 432, 20912, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437,
16821, 441, 441, 441, 12729, 444, 444, 444, 444, 444, 20924, 449, 449, 449, 449, 449,
16833, 453, 453, 453, 453, 453, 453, 20933, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 20938, 463, 463, 463, 20943, 468, 468, 468, 468,
468, 468, 16852, 472, 20952, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477};

//-----------------------definicja znaków -----------------------
uint8_t charArray8x8[] PROGMEM = {
0,0,
6,95,6,
7,3,0,7,3,
36,126,36,126,36,
36,43,106,18,
99,19,8,100,99,
54,73,86,32,80,
7,3,
62,65,
65,62,
8,62,28,62,8,
8,8,62,8,8,
224,96,
8,8,8,8,8,
96,96,
32,16,8,4,2,
62,81,73,69,62,
66,127,64,
98,81,73,73,70,
34,73,73,73,54,
24,20,18,127,16,
47,73,73,73,49,
60,74,73,73,48,
1,113,9,5,3,
54,73,73,73,54,
6,73,73,41,30,
108,108,
236,108,
8,20,34,65,
36,36,36,36,36,
65,34,20,8,
2,1,89,9,6,
62,65,93,85,30,
126,17,17,17,126,
127,73,73,73,54,
62,65,65,65,34,
127,65,65,65,62,
127,73,73,73,65,
127,9,9,9,1,
62,65,73,73,122,
127,8,8,8,127,
65,127,65,
48,64,64,64,63,
127,8,20,34,65,
127,64,64,64,64,
127,2,4,2,127,
127,2,4,8,127,
62,65,65,65,62,
127,9,9,9,6,
62,65,81,33,94,
127,9,9,25,102,
38,73,73,73,50,
1,1,127,1,1,
63,64,64,64,63,
31,32,64,32,31,
63,64,60,64,63,
99,20,8,20,99,
7,8,112,8,7,
113,73,69,67,
127,65,65,
2,4,8,16,32,
65,65,127,
4,2,1,2,4,
128,128,128,128,128,128,128,128 ,
3,7,
32,84,84,84,120,
127,68,68,68,56,
56,68,68,68,40,
56,68,68,68,127,
56,84,84,84,8,
8,126,9,9,
24,164,164,164,124,
127,4,4,120,
125,64,
64,128,132,125,
127,16,40,68,
127,64,
124,4,24,4,120,
124,4,4,120,
56,68,68,68,56,
252,68,68,68,56,
56,68,68,68,252,
68,120,68,4,8,
8,84,84,84,32,
4,62,68,36,
60,64,32,124,
28,32,64,32,28,
60,96,48,96,60,
108,16,16,108,
156,160,96,60,
100,84,84,76,
8,62,65,65,
119,
65,65,62,8,
2,1,2,1,
38,73,73,73,50,
113,73,69,67,
8,84,86,85,32,
100,84,86,77,
127,80,72,68,64,
113,73,69,67,
16,127,68,
32,84,84,212,184,
100,84,85,76,
62,65,65,65,34,
56,68,70,69,40,
56,84,84,212,136,
124,4,6,121,
56,68,70,69,56};