caddit/fonts.c

341 lines
7.1 KiB
C
Executable File

#include "fonts.h"
/*Here is how a character is defined.
Each character is 7 pixels high. The length is defined by you in the length array.
Because some characters (ex: m, M) are 5 px wide, the total amount is >32 bit,
so the character is stored in an array of 2 longs. The first long is only used if
the character is >32 bit.
For example, the character 'M', of length 3, is the following in binary:
00000
10001
11011
10101
10001
10001
00000
You must not forget the "00000" at the end, else your character will be shifted down by a pixel.
Now just remove the newlines in the character. You should get: 00000100011101110101100011000100000
Put that in a binary to decimal converter and you've got your number representing the character.
Also, make sure to define the correct length, else it will display gibberish.
*/
struct Font normfont = {
{{ //letters
0 //space
},{0, 58 //!
},{0, 184320 //" replaced by 0x81
},{0, 368409920 //#
},{0, 524752832 //$
},{0, 136456 //%
},{0, 6838992 //&
},{0, 48 //'
},{0, 1700 //(
},{0, 2392 //)
},{0, 174592 //*
},{0, 11904 //+
},{0, 3 //
},{0, 3584 //-
},{0, 2 //.
},{0, 38176 ///
},{0, 252792 //0
},{0, 206008 //1
},{0, 237368 //2
},{0, 235128 //3
},{0, 187976 //4
},{0, 249464 //5
},{0, 249720 //6
},{0, 234640 //7
},{0, 253816 //8
},{0, 253560 //9
},{0, 10 //:
},{0, 11 //;
},{0, 43144 //< replaced by 0x7F
},{0, 29120 //=
},{0, 139936 //> replaced by 0x80
},{0, 201744 //?
},{0, 488035776 //@
},{0, 6922128 //A
},{0, 15329760 //B
},{0, 6916448 //C
},{0, 15309280 //D
},{0, 16312560 //E
},{0, 16312448 //F
},{0, 7911776 //G
},{0, 10090896 //H
},{0, 238776 //I
},{0, 7480000 //J
},{0, 10144400 //K
},{0, 8947952 //L
},{0, 599442976 //M
},{0, 10336656 //N
},{0, 6920544 //O
},{0, 15310464 //P
},{0, 6921072 //Q
},{0, 15310480 //R
},{0, 7889376 //S
},{0, 238736 //T
},{0, 10066288 //U
},{0, 588818560 //V
},{0, 588961088 //W
},{0, 185704 //X
},{0, 187024 //Y
},{0, 15878384 //Z
},{0, 3756 //[
},{0, 148552 //backslash
},{0, 3420 //]
},{0, 86016 //^
},{0, 7 //_
},{0, 3648 //`
},{0, 15192 //a
},{0, 158576 //b
},{0, 14616 //c
},{0, 47960 //d
},{0, 15256 //e
},{0, 118048 //f
},{0, 15310 //g
},{0, 158568 //h
},{0, 46 //i
},{0, 1111 //j
},{0, 154984 //k
},{0, 62 //l
},{0, 27973280 //m
},{0, 27496 //n
},{0, 11088 //o
},{0, 27508 //p
},{0, 15193 //q
},{0, 23840 //r
},{0, 924 //s
},{0, 2988 //t
},{0, 23416 //u
},{0, 23376 //v
},{0, 18535744 //w
},{0, 21864 //x
},{0, 23246 //y
},{0, 30008 //z
},{0, 108696 //{
},{0, 62 //|
},{0, 205488 //}
},{0, 448512 //~
},{0, 43144 //< 0x7F
},{0, 139936 //> 0x80
},{0, 184320 //" 0x81
},{0, 50022784 //look of disapproval 0x82
},{0, 496640000 //lenny face eye 0x83
},{0, 138482222 //lenny face nose/mouth 0x84
},{0, 4088 //sunglasses 0x85
},{0, 3840 //*puts on sunglasses* 0x86
},{0, 229376 //overline 0x87
},{0, 693142620 //shrug face 0x88
},{0, 801688 //é 0x89
},{0, 201744 //for some reason, when the dispStr() function seeks the character at 0x90 and above
},{0, 201744 //it actually seeks it 6 characters after. there is absolutely no logical way I can think of
},{0, 201744 //that causes this bug. 0x90 (144) is not a significant number. neither is 6.
},{0, 201744 //so rather than spending 4532 hours debugging, the fix is simple:
},{0, 201744 //just put 6 characters between 0x89 and 0x90.
},{0, 201744
},{0, 1588120 //è 0x90
},{0, 1588056 //à 0x91
},{0, 1596280 //ù 0x92
},{0, 14622 //ç 0x93
},{0, 1617408 //² 0x94
},{0, 55501872 //€ 0x95
},{0, 1048716256 //somme 0x96
}},{ //lengths
3, //space
1, //!
3, //"
5, //#
5, //$
3, //%
4, //&
1, //'
2, //(
2, //)
3, //*
3, //+
1, //,
3, //-
1, //.
3, ///
3, //0
3, //1
3, //2
3, //3
3, //4
3, //5
3, //6
3, //7
3, //8
3, //9
1, //:
1, //;
3, //<
3, //=
3, //>
3, //?
5, //@
4, //A
4, //B
4, //C
4, //D
4, //E
4, //F
4, //G
4, //H
3, //I
4, //J
4, //K
4, //L
5, //M
4, //N
4, //O
4, //P
4, //Q
4, //R
4, //S
3, //T
4, //U
5, //V
5, //W
3, //X
3, //Y
4, //Z
2, //[
3, //backslash
2, //]
3, //^
3, //_
2, //`
3, //a
3, //b
3, //c
3, //d
3, //e
3, //f
3, //g
3, //h
1, //i
2, //j
3, //k
1, //l
5, //m
3, //n
3, //o
3, //p
3, //q
3, //r
2, //s
2, //t
3, //u
3, //v
5, //w
3, //x
3, //y
3, //z
3, //{
1, //|
3, //}
5, //~
3, //<
3, //>
3, //"
5, //look of disapproval
5, //lenny face eye
5, //lenny face nose/mouth
3, //sunglasses
3, //*puts on sunglasses*
3, //overline
5, //shrug face
3, //é
3, //unused lengths, see letters comment
3,
3,
3,
3,
3,
3, //è
3, //à
3, //ù
3, //ç
3, //²
4, //€
5, //somme
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
}
};
//displays a given string, using a given font, at the given coordinates
//returns the height of the string
int dispStr(unsigned char* str, int x2, int y) {
int k = 0;
int x = x2;
int y2 = y;
do { //browses through the given string
//word wrap: if the current character isn't a space, simply display it
if (str[k] != ' ' && str[k] != '\0' && str[k] != '\n') {
if (y >= -6 && y < 68) {
int charlength = normfont.length[str[k]-32];
unsigned long j = 1 << ((7*charlength)%32)-1; //initializes a long for bit checking. The long is equal to 0b10000.. with number of zeroes being the maximum length of the character, minus 1 because there's already a 1.
char i;
for (i = 0; i < 7*charlength; i++) { //browses through the pixels of the character specified, shifting the 1 of j to the right each time, so that it makes 0b01000.., 0b001000... etc
if (normfont.ltr[str[k]-32][1-(7*charlength-i)/33] & j) { //checks if the bit that is a 1 in the j is also a 1 in the character
ML_pixel(x+i%(charlength), y+i/charlength, 1); //if so, locates the pixel at the coordinates, using modulo and division to calculate the coordinates relative to the top left of the character
}
if (j != 1)
j >>= 1;
else
j = 2147483648;
}
}
x += normfont.length[str[k]-32] + 1; //now that the character has been fully displayed, shifts the cursor right by the length of character + 1
} else if (str[k] == '\n') {
y += 8;
x = x2;
} else if (str[k] == ' ') { //the current character is a space, so see if it manages to display the word without going over x=128
int i = x+4; //initializes an int to count the number of total pixels the next word takes
int j = k+1; //initializes the char to the current char+1 (which is always another character)
while (str[j] != 32 && str[j] != '\0' && str[j] != '\n') { //as long as it doesn't encounter another space or end of string
i += normfont.length[str[j]-32]+1; //it increments i by the length of the character + 1
j++;
}
if (i > 128) { //the word can't be displayed, note that it is STRICTLY superior because we added an unnecessary pixel at the end
y += 8; //goes on next line which is 8 pixels down
x = x2; //puts cursor on beginning of line
} else {
x += 4;
}
}
k++;
} while (str[k] != '\0');
return y+8-y2;
}