esp-idf-ssd1306/BdfFontDemo/README.md

362 lines
8.3 KiB
Markdown
Raw Normal View History

2024-09-10 18:35:03 -04:00
# BdfFontDemo for SSD1306
2024-09-10 20:56:52 -04:00
![BdfFontDemo-1](https://github.com/user-attachments/assets/df733de1-b5b8-4142-8123-5a8f992246ff)
2024-09-10 18:35:03 -04:00
![BdfFontDemo-2](https://github.com/user-attachments/assets/224d12c4-8ecf-4116-868a-8f11ca480122)
![BdfFontDemo-3](https://github.com/user-attachments/assets/4dbb6f39-ae0f-4ca2-9e55-ba32476b018e)
u8g2 is a great Library for monochrome displays.
2024-09-10 18:36:24 -04:00
This library contains a lot of BDF format fonts.
2024-09-10 18:35:03 -04:00
This project is a demo that displays BDF format fonts.
# How to use BDF Font
2024-09-10 18:39:39 -04:00
- Download the BDF font file.
Thank you olikraus for releasing useful software.
2024-09-10 23:47:07 -04:00
```
2024-09-11 19:33:46 -04:00
cd $HOME
2024-09-10 23:47:07 -04:00
git clone https://github.com/olikraus/u8g2
ls $HOME/u8g2/tools/font/bdf
```
2024-09-10 18:35:03 -04:00
- Convert BDF font files to header files.
2024-09-11 00:29:34 -04:00
I based it on [this](https://github.com/pixelmatix/bdf2c).
2024-09-10 18:38:28 -04:00
Thank you Pixelmatix for releasing useful software.
2024-09-10 18:36:24 -04:00
```
2024-09-10 19:10:27 -04:00
cd esp-idf-ssd1306/BdfFontDemo
2024-09-10 18:36:24 -04:00
cc -o bdf2c bdf2c.c
2024-09-10 22:34:38 -04:00
```
2024-09-10 18:36:24 -04:00
2024-09-10 22:34:38 -04:00
Specify the font variable name with the -n option.
```
2024-09-13 23:00:54 -04:00
./bdf2c -n ncenR12 -b < $HOME/u8g2/tools/font/bdf/ncenR12.bdf > main/ncenR12.h
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -n timR12 -b < $HOME/u8g2/tools/font/bdf/timR12.bdf > main/timR12.h
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -n emoticons -b < $HOME/u8g2/tools/font/emoticons/emoticons21.bdf > main/emoticons.h
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -n Scroll_o_Sprites -b < $HOME/u8g2/tools/font/pbm/Scroll-o-Sprites.bdf > main/Scroll-o-Sprites.h
2024-09-10 18:36:24 -04:00
```
2024-09-10 18:35:03 -04:00
2024-09-10 22:39:53 -04:00
Characters that cannot be used in C language variable names will result in an error during compilation.
This is unacceptable.
```
2024-09-14 05:19:42 -04:00
./bdf2c -n Scroll-o_Sprites -b < $HOME/u8g2/tools/font/pbm/Scroll-o-Sprites.bdf > main/Scroll-o-Sprites.h
2024-09-10 22:39:53 -04:00
```
2024-09-10 22:34:38 -04:00
2024-09-10 18:35:03 -04:00
- BDF font files can be viewed with the following command.
2024-09-10 18:36:24 -04:00
```
2024-09-13 23:00:54 -04:00
./bdf2c -B < $HOME/u8g2/tools/font/bdf/ncenR12.bdf | more
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -B < $HOME/u8g2/tools/font/bdf/timR12.bdf | more
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -B < $HOME/u8g2/tools/font/emoticons/emoticons21.bdf | more
2024-09-10 18:36:24 -04:00
2024-09-13 23:00:54 -04:00
./bdf2c -B < $HOME/u8g2/tools/font/pbm/Scroll-o-Sprites.bdf | more
2024-09-10 18:36:24 -04:00
```
2024-09-10 18:35:03 -04:00
2024-09-10 18:38:28 -04:00
- Add header files to main.c.
2024-09-10 18:36:24 -04:00
```
#include "ncenR12.h"
#include "timR12.h"
#include "emoticons.h"
#include "Scroll-o-Sprites.h"
```
2024-09-10 18:35:03 -04:00
- Show BDF Font
2024-09-10 18:36:24 -04:00
```
ssd1306_clear_screen(&dev, false);
ssd1306_contrast(&dev, 0xff);
2024-09-10 18:43:20 -04:00
show_bdf_font_text(&dev, __ncenR12_bitmap__, "Hello World", 0, 0);
2024-09-10 18:36:24 -04:00
```
2024-09-10 18:43:20 -04:00
# Font display position
The font's display position starts from the upper left corner of this image.
Therefore, there will be some white space above the font.
```
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
2024-09-10 20:46:34 -04:00
______XX,X_______,________,
_____X__,_X______,________,
____X___,_XX_____,________,
____XX__,_XX_____,________,
____XX__,_XX_____,________,
________,XX______,________,
________,X_______,________,
_______X,________,________,
______X_,__X_____,________,
_____X__,__X_____,________,
____XXXX,XXX_____,________,
____XXXX,XXX_____,________,
2024-09-10 18:43:20 -04:00
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
2024-09-10 18:53:56 -04:00
```
2024-09-10 19:20:46 -04:00
# Font bounding box and character bounding box
2024-09-10 19:20:03 -04:00
BDF font file has a font bounding box (FONTBOUNDINGBOX).
2024-09-10 21:33:54 -04:00
This FONTBOUNDINGBOX value indicates that all fonts must have a 3-pixel margin to the left and a 6-pixel margin below the font.
2024-09-12 03:28:45 -04:00
By providing a FONTBOUNDINGBOX, this can omit the left edge and top and bottom whitespace from the font pattern.
2024-09-10 19:20:03 -04:00
```
FONTBOUNDINGBOX 21 26 -3 -6
```
2024-09-10 21:38:51 -04:00
Each character has a character-specific bounding box (BBX).
This BBX value indicates that there should be a 1 pixel margin to the left of this character.
2024-09-12 03:30:51 -04:00
By providing a character-specific bounding box (BBX), this can omit the leftmost whitespace.
2024-09-10 18:53:56 -04:00
```
STARTCHAR d
ENCODING 100
SWIDTH 574 0
DWIDTH 10 0
BBX 8 12 1 0
BITMAP
0E
06
06
06
3E
66
C6
C6
C6
C6
66
3B
ENDCHAR
```
2024-09-10 21:31:51 -04:00
Fonts that take character-specific bounding box (BBX) into consideration change as follows.
2024-09-12 03:30:51 -04:00
This creates a 1 pixel whitespace on the left edge.
2024-09-12 03:38:00 -04:00
DWIDTH will also change according to this change.
2024-09-10 19:02:46 -04:00
```
STARTCHAR d
ENCODING 100
SWIDTH 574 0
2024-09-10 20:46:34 -04:00
DWIDTH 11 0
2024-09-10 19:02:46 -04:00
BBX 9 12 0 0
BITMAP
07
03
03
03
1F
33
63
63
63
63
33
1D8
ENDCHAR
```
2024-09-10 21:31:51 -04:00
Fonts that take character-specific bounding box (BBX) and font bounding box (FONTBOUNDINGBOX) into consideration change as follows.
2024-09-12 03:38:00 -04:00
DWIDTH will also change according to this change.
2024-09-10 19:30:48 -04:00
```
STARTCHAR d
ENCODING 100
SWIDTH 574 0
2024-09-10 20:46:34 -04:00
DWIDTH 14 0
BBX 9 12 0 0
2024-09-10 19:30:48 -04:00
BITMAP
00
00
00
00
00
00
00
2024-09-10 19:34:23 -04:00
00
2024-09-10 20:46:34 -04:00
00E0
0060
0060
0060
03E0
0660
0C60
0C60
0C60
0C60
0660
030B
2024-09-10 19:30:48 -04:00
00
00
00
00
00
00
ENDCHAR
```
2024-09-10 21:44:52 -04:00
Both the font bounding box (FONTBOUNDINGBOX) and character-specific bounding box (BBX) determine pixels position.
2024-09-12 03:36:23 -04:00
This creates a 4 pixel whitespace on the left edge.
This creates a 6 pixel whitespace on the buttomt edge.
2024-09-10 21:31:51 -04:00
This image takes into account the font bounding box (FONTBOUNDINGBOX) and character-specific bounding box (BBX).
2024-09-10 18:53:56 -04:00
```
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
2024-09-10 19:34:23 -04:00
________,________,________,
2024-09-10 20:46:34 -04:00
________,XXX_____,________,
________,_XX_____,________,
________,_XX_____,________,
________,_XX_____,________,
______XX,XXX_____,________,
_____XX_,_XX_____,________,
____XX__,_XX_____,________,
____XX__,_XX_____,________,
____XX__,_XX_____,________,
____XX__,_XX_____,________,
_____XX_,_XX_____,________,
______XX,X_XX____,________,
2024-09-10 18:53:56 -04:00
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
________,________,________,
```
2024-09-12 03:42:40 -04:00
Font width pixel is 14 dots, so this is what is actually displayed.
```
________,______,
________,______,
________,______,
________,______,
________,______,
________,______,
________,______,
________,______,
________,XXX___,
________,_XX___,
________,_XX___,
________,_XX___,
______XX,XXX___,
_____XX_,_XX___,
____XX__,_XX___,
____XX__,_XX___,
____XX__,_XX___,
____XX__,_XX___,
_____XX_,_XX___,
______XX,X_XX__,
________,______,
________,______,
________,______,
________,______,
________,______,
________,______,
```
2024-09-12 03:59:14 -04:00
Changing FONTBOUNDINGBOX changes the character spacing.
2024-09-12 07:37:44 -04:00
```FONTBOUNDINGBOX 21 26 -3 -6```
2024-09-12 08:17:55 -04:00
A space of at least 3 pixels is generated between characters.
2024-09-12 03:57:00 -04:00
![BdfFontDemo-1](https://github.com/user-attachments/assets/df733de1-b5b8-4142-8123-5a8f992246ff)
2024-09-12 03:58:13 -04:00
2024-09-12 07:37:44 -04:00
```FONTBOUNDINGBOX 21 26 -1 -6```
2024-09-12 08:17:55 -04:00
A space of at least 1 pixels is generated between characters.
2024-09-12 04:04:09 -04:00
![BdfFontDemo-4](https://github.com/user-attachments/assets/45dd3fab-a5df-4bc1-8436-6c7883001d93)
2024-09-12 03:57:00 -04:00
2024-09-12 03:42:40 -04:00
2024-09-12 04:07:05 -04:00
# Header file format
2024-09-10 22:05:41 -04:00
This indicates the width of the FONTBOUNDINGBOX.
2024-09-10 22:06:05 -04:00
```
2024-09-10 22:05:41 -04:00
// fontboundingbox_width
21,
```
This indicates the height of the FONTBOUNDINGBOX.
```
// fontboundingbox_height
26,
```
This shows the font information for the characters.
```
// 'd'
100,14,8,12,1,0,39,8,20,0x00,0xe0,0x00,0x00,---------------,0x00,0x00,0x00,
| | | | | | | | | |
| | | | | | | | | +- Font pattern
| | | | | | | | +---- Last row in Y direction
| | | | | | | +------ First row in Y direction
| | | | | | +--------- Number of font patterns
| | | | | +----------- BBX Y offset
| | | | +------------- BBX X offset
| | | +---------------- BBX Y pixel
| | +------------------ BBX X pixel
| +--------------------- Font width pixel
+------------------------ Encoding
2024-09-10 22:09:59 -04:00
```
2024-09-10 22:11:02 -04:00
You can find out the width (in bytes) of this font using the following calculation:
2024-09-10 22:09:59 -04:00
```
{Number of font patterns} / ({Last row in Y direction} - {First row in Y direction} + 1)
```
2024-09-10 22:05:41 -04:00
2024-09-10 22:09:59 -04:00
In ths case:
2024-09-10 22:05:41 -04:00
```
2024-09-10 22:10:08 -04:00
39 / (20 - 8 + 1) = 3[bytes]
2024-09-10 22:09:59 -04:00
```
2024-09-10 22:13:59 -04:00
The font for lines 8 to 20 will be as follows:
2024-09-10 22:20:56 -04:00
This is a bitmap of 24*13 pixels.
2024-09-10 22:13:59 -04:00
```
0x00,0xe0,0x00,
0x00,0x60,0x00,
0x00,0x60,0x00,
0x00,0x60,0x00,
0x03,0xe0,0x00,
0x06,0x60,0x00,
0x0c,0x60,0x00,
0x0c,0x60,0x00,
0x0c,0x60,0x00,
0x0c,0x60,0x00,
0x06,0x60,0x00,
0x03,0xb0,0x00,
0x00,0x00,0x00,
```
2024-09-10 22:26:12 -04:00
You can display this bitmap with the following function.
```
ssd1306_bitmaps(&dev, xpos, ypos+bdf_font.y_start, bitmap, 24, 13, false);
```
2024-09-10 22:09:59 -04:00
2024-09-10 22:05:41 -04:00
This marks the end of the font.
```
// EOF
0,0,0,0,0,0,0,0,0
```
2024-09-10 23:05:07 -04:00
2024-09-10 23:08:08 -04:00
# BDF Font file editor
2024-09-10 23:05:07 -04:00
I use [this](http://hukka.ncn.fi/?fony).
2024-09-10 23:11:40 -04:00
It's work fine on Windows10.
2024-09-10 23:07:25 -04:00
There are probably many more.
2024-09-10 23:05:07 -04:00
- Open BDF font file.
File->Import->BDF Font.
2024-09-10 23:06:01 -04:00
2024-09-10 23:05:07 -04:00
![fony](https://github.com/user-attachments/assets/18c71509-9a66-4b23-a2cf-6ecc66bf5920)
- Save BDF font file.
2024-09-10 23:08:53 -04:00
File->Export->BDF Font.
2024-09-10 23:05:07 -04:00