Adding a font to ebook.py (Badger)

I’ve made a few changes to ebook.py to make the badger more usable for me as an ereader, but am really struggling to add a more legible font.

The best I can get from the pre-installed fonts is 8-bit double sized (so it’s very pixellated).

Any simple way to get a pixel font that’s designed to be larger on ebook.py? For example the larger python fonts here: Fonts — st7789py 0.1.0 documentation

Thanks for your help.

@Tonygo2 is the guy to talk to about fonts. I bet he can help you out with this.

1 Like

So you would like a 16x16 bit font?

1 Like

Hi Tony. Yes please :)

Do not hold your breath. I’ve no idea how to do this at the moment.

1 Like

Progress! Did it on the Display 2 as more people have access to these.

# vga1 16x16 pixel font
# For Pimoroni Pico display 2 320x240 pixels in RGB332 mode
# Uses Pimoroni Pico Graphics system
# Tony Goodhew 24th Feb 2023

import machine
import time
import math
from pimoroni import Button
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY_2, PEN_P4
from pimoroni import RGBLED
led = RGBLED(6, 7, 8)
led.set_rgb(0,0,0)     # Turn RGBLED OFF
# https://github.com/russhughes/ili9342c_mpy/blob/main/fonts/bitmap/vga1_16x16.py
WIDTH = 16
HEIGHT = 16
FIRST = 0x20
LAST = 0x7f
_FONT = \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x01\x80\x0f\xf0\x39\x9c\x71\x8e\x71\x80\x39\x80\x0f\xf0\x01\x9c\x01\x8e\x71\x8e\x39\x9c\x0f\xf0\x01\x80\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x1c\x1e\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x3c\x1c\x3c\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xc0\x1c\x70\x38\x38\x1c\x70\x07\xc0\x0f\xce\x38\xfc\x70\x78\x70\x78\x38\xfc\x0f\xce\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x38\x03\xe0\x3f\xfe\x03\xe0\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\x80\x07\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xe0\x1c\x38\x38\x3c\x38\x7c\x38\xdc\x39\x9c\x3b\x1c\x3e\x1c\x3c\x1c\x1c\x38\x07\xe0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x03\xc0\x0f\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x00\x0e\x00\x0e\x00\x1c\x00\x70\x01\xc0\x07\x00\x1c\x00\x38\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x00\x0e\x00\x0e\x00\x1c\x01\xf0\x00\x1c\x00\x0e\x00\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xf0\x03\xf0\x07\x70\x0e\x70\x1c\x70\x38\x70\x3f\xfc\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xfe\x38\x00\x38\x00\x38\x00\x3f\xf0\x00\x1c\x00\x0e\x00\x0e\x00\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xf8\x00\x38\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x0e\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x0e\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x70\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xe0\x1c\x38\x38\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x70\x0e\x71\xfe\x73\x8e\x73\x8e\x73\x8e\x71\xfc\x70\x00\x38\x00\x0f\xfc\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x38\x1c\x3f\xfc\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x3e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xfe\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x1c\x1c\x0e\x38\x03\xe0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x1c\x38\x1c\x70\x1c\xe0\x1d\xc0\x1f\x80\x1f\x80\x1d\xc0\x1c\xe0\x1c\x70\x1c\x38\x1c\x1c\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x78\x1e\x7c\x3e\x7e\x7e\x77\xee\x73\xce\x71\x8e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x0e\x3c\x0e\x3e\x0e\x3f\x0e\x3b\x8e\x39\xce\x38\xee\x38\x7e\x38\x3e\x38\x1e\x38\x0e\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\xee\x1c\x7c\x07\xf8\x00\x1c\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\xe0\x38\x70\x38\x38\x38\x1c\x38\x0e\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x70\x0e\x70\x00\x38\x00\x0f\xf0\x00\x1c\x00\x0e\x70\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x71\x8e\x73\xce\x77\xee\x3e\x7c\x1c\x38\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x1c\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x0e\x1c\x1c\x0e\x38\x07\x70\x03\xe0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x3f\xfe\x00\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x1c\x00\x0e\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x70\x00\x38\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\xf0\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00'\
b'\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x00\x0e\x0f\xfe\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xf8\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x0e\x0f\xf8\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x07\xfe\x1c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x0e\x3f\xfe\x38\x00\x38\x00\x0f\xfc\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\xf8\x03\x80\x03\x80\x03\x80\x03\x80\x0f\xf0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x0e\x00\x0e\x1f\xf8\x00\x00'\
b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3b\xf8\x3c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x70\x00\x70\x00\x00\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\xe0\x0f\x80\x00\x00'\
b'\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x38\x0e\x70\x0e\xe0\x0f\xc0\x0e\xe0\x0e\x70\x0e\x38\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x78\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xe0\x38\x38\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x00\x38\x00\x38\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xfe\x1c\x0e\x38\x0e\x38\x0e\x1c\x0e\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfc\x38\x00\x38\x00\x0f\xf8\x00\x0e\x00\x0e\x1f\xf8\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x1f\xfc\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x0f\xfc\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x0e\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x01\x80\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x39\xce\x3b\xee\x1f\x7c\x0e\x38\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x1c\x1c\x0e\x38\x07\x70\x03\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x00\x1c\x00\x70\x01\xc0\x07\x00\x1c\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\xf8\x01\xc0\x03\x80\x03\x80\x03\x80\x1e\x00\x03\x80\x03\x80\x03\x80\x01\xc0\x00\xf8\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x1f\x00\x03\x80\x01\xc0\x01\xc0\x01\xc0\x00\x78\x01\xc0\x01\xc0\x01\xc0\x03\x80\x1f\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x07\x9e\x3c\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x07\x70\x1c\x1c\x70\x07\x70\x07\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\

FONT = memoryview(_FONT)
# Reduced colours to save RAM
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY_2, pen_type=PEN_P4, rotate=0)
display.set_backlight(0.8)
display.set_font("bitmap8") # Lower case included

def character(asci,xp,yp):
    a = asci-FIRST
    code = []
    start = a*32
    stop = start +32
    for i in range(start,stop):
        byte = FONT[i]
        code.append(byte)
    #print(code)
    #code = b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x00\x0e\x00\x0e\x00\x1c\x01\xf0\x00\x1c\x00\x0e\x00\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'
    bits = [1,2,4,8,16,32,64,128]
    yy = 00
    xx = 00
    y2 = yy
    x2 = xx
    display.set_pen(255)
    for i in range(32):    
        q = code[i]
        for bit in range(8):
            if (q >> bit) & 0x1:
                display.set_pen(255)
            else:
                display.set_pen(0)                   
            display.pixel(16+xp-x2-bit,yp+y2)           
        if i % 2 == 0:
            x2 = xx            
        else:
            y2 = y2+1
            x2 = x2+8

character(65,5,5)
character(88,300,5)
display.update()
def prnt_st(asci,xx,yy,):  # Text string
    for letter in(asci):
        asci = ord(letter)
        character(asci,xx,yy)
        xx = xx + 16      

prnt_st("Tony Goodhew",10,50)
prnt_st("vga 16x16",10,80)
prnt_st("0123456789",10,100)
display.set_pen(255)
display.text("Bitmap8 size 2", 50, 140, 160,2)
display.update()

    

@rowebot Is that the sort of thing you wanted?
It looks smoother than bitmap8 but take up a fair bit of memory.

Yes that looks great @Tonygo2

I’m not much of a developer though. Just tried to integrate it with ebook.py but doubt I’ll figure it out. This is my reader code (a cut-down version of the standard example)…

import badger2040
import time
import gc
import badger_os

text_file = "book.txt"
gc.collect()

# Global Constants
WIDTH = badger2040.WIDTH
HEIGHT = badger2040.HEIGHT

TEXT_PADDING = 0
TEXT_WIDTH = badger2040.WIDTH

# ------------------------------ 
#      Drawing functions
# ------------------------------


# Draw the frame of the reader
def draw_frame():
    display.pen(15)
    display.clear()
    display.pen(15)
    display.rectangle(WIDTH, 0, 0, HEIGHT)
    display.pen(15)


# ------------------------------
#        Program setup
# ------------------------------

# Global variables
state = {
    "last_offset": 0,
    "current_page": 0,
    "text_size": 1,
    "offsets": []
}
badger_os.state_load("ebook", state)

text_spacing = int(12 * state["text_size"])


# Create a new Badger and set it to update speed
display = badger2040.Badger2040()
display.led(1) # LED off
display.update_speed(badger2040.UPDATE_FAST)
badger2040.system_speed(4) # Highest system speed


# ------------------------------
#         Render page
# ------------------------------

def render_page():
    row = 0
    line = ""
    pos = ebook.tell()
    next_pos = pos
    add_newline = False
    display.font("bitmap8")

    while True:
        # Read a full line and split it into words
        words = ebook.readline().split(" ")

        # Take the length of the first word and advance our position
        next_word = words[0]
        if len(words) > 1:
            next_pos += len(next_word) + 1
        else:
            next_pos += len(next_word)  # This is the last word on the line

        # Advance our position further if the word contains special characters
        if '\u201c' in next_word:
            next_word = next_word.replace('\u201c', '\"')
            next_pos += 2
        if '\u201d' in next_word:
            next_word = next_word.replace('\u201d', '\"')
            next_pos += 2
        if '\u2019' in next_word:
            next_word = next_word.replace('\u2019', '\'')
            next_pos += 2

        # Rewind the file back from the line end to the start of the next word
        ebook.seek(next_pos)

        # Strip out any new line characters from the word
        next_word = next_word.strip()

        # If an empty word is encountered assume that means there was a blank line
        if len(next_word) == 0:
            add_newline = True

        # Append the word to the current line and measure its length
        appended_line = line
        if len(line) > 0 and len(next_word) > 0:
            appended_line += " "
        appended_line += next_word
        appended_length = display.measure_text(appended_line, state["text_size"])

        # Would this appended line be longer than the text display area, or was a blank line spotted?
        if appended_length >= TEXT_WIDTH or add_newline:

            # Yes, so write out the line prior to the append
            print(line)
            display.pen(0)
            display.thickness(1)
            display.text(line, TEXT_PADDING, (row * text_spacing) + (text_spacing // 2) + TEXT_PADDING, state["text_size"])

            # Clear the line and move on to the next row
            line = ""
            row += 1

            # Have we reached the end of the page?
            if (row * text_spacing) + text_spacing >= HEIGHT:
                print("+++++")
                display.update()

                # Reset the position to the start of the word that made this line too long
                ebook.seek(pos)
                return
            else:
                # Set the line to the word and advance the current position
                line = next_word
                pos = next_pos

            # A new line was spotted, so advance a row
            if add_newline:
                print("")
                row += 1
                if (row * text_spacing) + text_spacing >= HEIGHT:
                    print("+++++")
                    display.update()
                    return
                add_newline = False
        else:
            # The appended line was not too long, so set it as the line and advance the current position
            line = appended_line
            pos = next_pos


# ------------------------------
#       Main program loop
# ------------------------------

launch = True
changed = False

# Open the book file
ebook = open(text_file, "r")
if len(state["offsets"]) > state["current_page"]:
    ebook.seek(state["offsets"][state["current_page"]])
else:
    state["current_page"] = 0
    state["offsets"] = []

while True:
    # Was the next page button pressed?
    if display.pressed(badger2040.BUTTON_DOWN):
        state["current_page"] += 1

        changed = True

    # Was the previous page button pressed?
    if display.pressed(badger2040.BUTTON_UP):
        if state["current_page"] > 0:
            state["current_page"] -= 1
            if state["current_page"] == 0:
                ebook.seek(0)
            else:
                ebook.seek(state["offsets"][state["current_page"] - 1])  # Retrieve the start position of the last page
            changed = True

    if launch and not changed:
        if state["current_page"] > 0 and len(state["offsets"]) > state["current_page"] - 1:
            ebook.seek(state["offsets"][state["current_page"] - 1])
        changed = True
        launch = False

    if changed:
        draw_frame()
        render_page()

        # Is the next page one we've not displayed before?
        if state["current_page"] >= len(state["offsets"]):
            state["offsets"].append(ebook.tell())  # Add its start position to the state["offsets"] list
        badger_os.state_save("ebook", state)

        changed = False

    display.halt()

Are you using Badger or the newer Badger W?

The pre-W badger (bought about a month ago). Updated the software just before the Badger W was released.