In the previous post we had discussed the framebuffer object of the C library for performing graphics on the OLED screen SSD1306 using a Raspberry Pi.
In this blog post, we demonstrate how we have used FreeType2 to draw
text on the screen using fonts that can be installed using your Raspbian distro
packages. FreeType2 provides an easy way to render any type of supported font on
the screen, and we encapsulate all of that in a single function call
ssd1306_framebuffer_draw_text()
.
UPDATE: This code is OBSOLETE as of git tag 0.6
or commit 50e836f9299f61a3fe2901f794d2131ade7c23be
. Please refer to the latest blog post on this topic.
The code in this post is as of git tag 0.51
or commit 294ffccc1004b35028406fc4281cef894f473d2a
from Github.
DRAWING TEXT
To draw a font on a framebuffer, we chose to use FreeType2 as it is open source, and supports a variety of fonts. It also lends itself well to drawing the font directly to our framebuffer memory image.
Just by following the FreeType2 tutorial we were able to implement the
ssd1306_framebuffer_draw_text()
and the
ssd1306_framebuffer_draw_text_extra()
functions.
We have abstracted out the FreeType2 usage, so that if in the future we choose to change the dependency on FreeType2, we can without exposing the APIs of the library to idiosyncrasies of FreeType2.
The simplest way to draw a string of text at (x,y) coordinates is to use the
ssd1306_framebuffer_draw_text()
function, which will start drawing the text at
(x,y) for the given font and font size, as shown below.
#include <ssd1306_graphics.h>
/* ... some initialization code ... */
/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);
// draw ABCDeF with the default font and font size 4 at (x,y) of (32, 32)
ssd1306_framebuffer_draw_text(fbp, "ABCDeF", 0, 32, 32, SSD1306_FONT_DEFAULT, 4);
ssd1306_framebuffer_bitdump(fbp);
The framebuffer now looks like:
0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0015 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0016 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0017 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0018 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0019 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0020 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0021 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0022 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0023 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0024 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0025 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0026 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0027 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0028 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0029 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0030 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0031 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0032 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0033 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0034 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0035 ..|||||. ...||||| |....... ||||||.| ||||.... ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........
0036 ..|||||. ...||||| |||...|| ||||||.| ||||||.. ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........
0037 ....|||. ....||.. .||...|| ...|||.. |...|||. ........ ....||.. ..||.... ........ ........ ........ ........ ........ ........ ........ ........
0038 ...||.|| ....||.. ..|..||. ....||.. |....||| ...||||| ....||.. |.||.... ........ ........ ........ ........ ........ ........ ........ ........
0039 ...||.|| ....||.. .||..||. ........ |.....|| ..|||.|| |...||.| |....... ........ ........ ........ ........ ........ ........ ........ ........
003A ...||.|| ....|||| |||..||. ........ |.....|| .||....| ||..|||| |....... ........ ........ ........ ........ ........ ........ ........ ........
003B ..|||||| |...||.. .|||.||. ........ |.....|| .||||||| ||..||.| |....... ........ ........ ........ ........ ........ ........ ........ ........
003C ..|||||| |...||.. ..||.||. ........ |.....|| .||||||| ||..||.. |....... ........ ........ ........ ........ ........ ........ ........ ........
003D .||..... ||..||.. ..||.||| ....||.. |....||. .|||.... ....||.. ........ ........ ........ ........ ........ ........ ........ ........ ........
003E |||||..| |||||||| ||||..|| ||||||.| |||||||. ..|||.|| ||.||||| ........ ........ ........ ........ ........ ........ ........ ........ ........
003F |||||..| |||||||| |||....| |||||..| ||||||.. ...||||| |..||||| |....... ........ ........ ........ ........ ........ ........ ........ ........
As you can see above the default font (BitStream Vera) gets rendered onto the framebuffer as expected, and in the same way gets displayed on screen on the OLED device as seen in the image below.
Figure 1. Drawing aligned text on screen using Bitstream Vera font
Here is an example of drawing a large font size on the screen.
Figure 2. Drawing a large font size on screen using the Bitstream Vera font
SUPPORTED FONT FACES
By default, the libssd1306
library supports the following fonts, and also
allows the user to load their own font file. The package requirements for the
default fonts require the user to install fonts-freefont-ttf
and
ttf-bitstream-vera
. If the user wants to have access to Microsoft®’s TrueType
fonts, they can install ttf-mscorefonts-installer
using the package manager
and get access to Microsoft® specific fonts like Arial and Comic Sans.
We shall show you examples of using the custom fonts below. Using the
ssd1306_fontface_t
enum type allows the user to not have to know where the
font file is located, since we already know that as part of the installation
packages. So we currently hard-code these locations in and map them to an enum.
If the user wants to load their own font file they can use the
SSD1306_FONT_CUSTOM
option and the ssd1306_framebuffer_draw_text_extra()
function which accepts custom options for drawing the text, including the font
file location.
The default font paths are provided in the ssd1306_graphics.h
header file.
If the user wants to draw using the Microsoft® TrueType font Comic Sans, they can use the following code example:
#include <ssd1306_graphics.h>
/* ... some initialization ... */
/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);
// setup the options
ssd1306_graphics_options_t opts;
opts.type = SSD1306_OPT_FONT_FILE;
opts.value.font_file = "/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf";
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 32, 32, SSD1306_FONT_CUSTOM, 4, &opts, 1);
The only difference between the ssd1306_framebuffer_draw_text()
and
ssd1306_framebuffer_draw_text_extra()
functions is that the latter accepts
custom options for font files, rotation of fonts and rotation of pixels.
ROTATING THE FONT
In some rare cases, we may want to draw a text at an angle such as for
displaying logos, or just rotating a text on screen by say 30°. We can do
that with the SSD1306_OPT_ROTATE_FONT
option and provide the rotation angle in
the rotation_degrees
field. This uses the font transformation functions
provided by FreeType2 internally, and is highly accurate.
Below is an example that uses both the custom font file option for Comic Sans and rotates it by 30°, as seen in the framebuffer output.
#include <ssd1306_graphics.h>
/* ... some initialization ... */
/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);
// setup the options
ssd1306_graphics_options_t opts[2];
opts[0].type = SSD1306_OPT_FONT_FILE;
opts[0].value.font_file = "/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf";
opts[1].type = SSD1306_OPT_ROTATE_FONT;
opts[1].value.rotation_degrees = 30;
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 32, 32, SSD1306_FONT_CUSTOM, 4, opts, 2);
// dump the framebuffer to screen
ssd1306_framebuffer_bitdump(fbp);
0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0015 ........ ........ ........ ........ ........ ......|| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........
0016 ........ ........ ........ ........ ........ ....|||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........
0017 ........ ........ ........ ........ ........ ...||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........
0018 ........ ........ ........ ........ ........ ..|||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0019 ........ ........ ........ ........ ........ ..||||.. .|||.... ........ ........ ........ ........ ........ ........ ........ ........ ........
001A ........ ........ ........ ........ ........ ...|||.| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........
001B ........ ........ ........ ........ ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........
001C ........ ........ ........ ........ ........ ....|||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........
001D ........ ........ ........ ........ ........ ....|||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........
001E ........ ........ ........ ........ ......|| ||...||| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
001F ........ ........ ........ ........ .....||| ||...||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........
0020 ........ ........ ........ ........ .....||| ||....|| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........
0021 ........ ........ ........ ....|||| |....||| ||.....| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........
0022 ........ ........ ........ |||||||| |||..||. ||.....| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........
0023 ........ ........ ........ |||||||| ||||.||| ||...... ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........
0024 ........ ........ ....|||| ||||.... .||||||| |.|||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0025 ........ ........ ...||||| .|||.... ..|||.|| ||||||.. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0026 ........ ........ ..|||||| .||||... ...||.|| |||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0027 ........ ........ ..|||... ..|||... ...||... |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0028 ........ ........ ..|||... ...|||.. ..|||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0029 ........ ........ .|||.... ...|||.. .||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002A ........ ........ .|||.... ....|||| |||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002B ........ ||||||.. .|||.... ....|||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002C .......| |||||||. .|||.... .....||| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002D ......|| |||||||. .|||.... .....||| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002E ......|| |...|||. ..|||... ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002F .......| ||..|||. ..||||.| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0030 |||....| ||.||||| |..||||| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0031 ||||.... |||||||| |..||||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0032 ||||.... |||||||. |.....|| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0033 |||||... .||||..| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0034 ||||||.. .|||..|| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0035 ||.|||.. ..|||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0036 ||||||.. ..|||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0037 ||||||.. ...||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0038 |||||... ...|||.. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0039 ||||...| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003A |||..... ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003B |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003C |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003D |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003E |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
All the code snippets can be found in the examples/fb_graphics.c
file.
ROTATING PIXELS
As shown in the previous post, we may want to rotate an image on the screen by using the pixel rotation function. We can absolutely use that feature for drawing text at different locations by rotating not just the font, but also the pixels.
Below is an example that uses both the custom font file option for Comic Sans and rotates it by 30°, and then rotates the drawing by 180° as seen in the framebuffer output.
Note that the SSD1306_OPT_ROTATE_PIXEL
option only accepts multiples of
90° in the rotation_degrees
field. Any other value will get ignored, and
an error statement printed to the log.
#include <ssd1306_graphics.h>
/* ... some initialization ... */
/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);
// setup the options
ssd1306_graphics_options_t opts[2];
opts[0].type = SSD1306_OPT_ROTATE_FONT;
opts[0].value.rotation_degrees = 30;
opts[1].type = SSD1306_OPT_ROTATE_PIXEL;
opts[1].value.rotation_degrees = 30;
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 0, 0, SSD1306_FONT_DEFAULT, 4, opts, 2);
// dump the framebuffer to screen
ssd1306_framebuffer_bitdump(fbp);
If you scroll to the right of this buffer dump, you can see the flip of the rotated font string.
0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......||
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....|||
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....||||
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|....||
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |||...||
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....||||
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....|||. ...|||||
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ..||||.. ...||..|
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||.||. ...|||.|
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||..||. ....||||
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |.....|| .....|||
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |...|||| |.....||
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||||.. .||||||| |.......
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||||||. .||||..| |||.....
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||| ..||.... |||.....
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| |.||..|| ||......
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...|||.. .......| |..||||| ........
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||||... .......| |....... ........
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||.||.. .......| |....... ........
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| ||..|||. .......| |....... ........
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||. ..|...|| |....... ........
0015 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||| ..|||||| ........ ........
0016 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||||..| |.....|| ..||||.. ........ ........
0017 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| ||.|||.| |......| ||.|.... ........ ........
0018 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| ...||||. ||....|| ||...... ........ ........
0019 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ..|||||. |||||||| |....... ........ ........
001A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||.... .|||.||. ..|||||. ........ ........ ........
001B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||.... .|..|||. ........ ........ ........ ........
001C ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| ||||.... .|.|||.. ........ ........ ........ ........
001D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...||... .||||... ........ ........ ........ ........
001E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...||... ........ ........ ........ ........ ........
001F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||||.. ........ ........ ........ ........ ........
0020 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||||||. ........ ........ ........ ........ ........
0021 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||..||| |....... ........ ........ ........ ........
0022 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....||| |....... ........ ........ ........ ........
0023 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |..||||. ........ ........ ........ ........ ........
0024 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||||.. ........ ........ ........ ........ ........
0025 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||.... ........ ........ ........ ........ ........
0026 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|...... ........ ........ ........ ........ ........
0027 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0028 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0029 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
002F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0030 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0031 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0032 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0033 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0034 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0035 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0036 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0037 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0038 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
0039 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
003F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
Here is an example of using Comic Sans and rotating the text.
Figure 3. Drawing Comic Sans rotated text on screen