Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions common/fonts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# This file is part of pi-stomp.
#
# pi-stomp is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pi-stomp is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with pi-stomp. If not, see <https://www.gnu.org/licenses/>.

from pathlib import Path

FONTS_DIR = Path(__file__).parent.parent / "fonts"


def font_path(name: str) -> str:
"""Return the absolute path to a bundled font by filename."""
return str(FONTS_DIR / name)
5 changes: 3 additions & 2 deletions emulator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
from pathlib import Path
from PIL import ImageFont

_FONTS_DIR = Path(__file__).parent.parent / "fonts"
from common.fonts import FONTS_DIR

_orig_truetype = ImageFont.truetype


def _resolve_truetype(font=None, size=10, **kwargs):
if isinstance(font, str) and not Path(font).is_absolute() and not Path(font).exists():
candidate = _FONTS_DIR / font
candidate = FONTS_DIR / font
if candidate.exists():
font = str(candidate)
return _orig_truetype(font, size, **kwargs)
Expand Down
4 changes: 3 additions & 1 deletion pistomp-testui.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

import random

from common.fonts import font_path

lcd = LcdIli9341(board.SPI(),
digitalio.DigitalInOut(board.CE0),
digitalio.DigitalInOut(board.D6),
Expand Down Expand Up @@ -81,7 +83,7 @@ def do_param_dialog(event, data):

def do_main_screen():

title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 26)
title_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 26)
display_width = 320
display_height = 240
plugin_width = 79
Expand Down
15 changes: 9 additions & 6 deletions pistomp/lcd128x64.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@

from pistomp.footswitch import Footswitch

from common.fonts import font_path


class Lcd(ABC):

def __init__(self, cwd):
Expand Down Expand Up @@ -91,12 +94,12 @@ def __init__(self, cwd):
ImageDraw.Draw(self.images[6]), ImageDraw.Draw(self.images[7])]

# Load fonts
self.splash_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 18)
self.title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 11)
self.label_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 10)
self.small_bold_font = ImageFont.truetype("DejaVuSansMono-Bold.ttf", 8)
self.small_font = ImageFont.truetype("DejaVuSansMono.ttf", 8)
#self.small_font = ImageFont.truetype(os.path.join(cwd, "fonts", "EtBt6001-JO47.ttf"), 6)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 18)
self.title_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 11)
self.label_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 10)
self.small_bold_font = ImageFont.truetype(font_path("DejaVuSansMono-Bold.ttf"), 8)
self.small_font = ImageFont.truetype(font_path("DejaVuSansMono.ttf"), 8)
#self.small_font = ImageFont.truetype(font_path("EtBt6001-JO47.ttf"), 6)

# Splash
text_im = Image.new('L', (103, 63))
Expand Down
7 changes: 5 additions & 2 deletions pistomp/lcd135x240.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import adafruit_rgb_display.st7789 as st7789


from common.fonts import font_path


class Lcd(ABC):

def __init__(self, cwd):
Expand Down Expand Up @@ -69,9 +72,9 @@ def __init__(self, cwd):

# Font
self.font_size = 30
self.font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', self.font_size)
self.font = ImageFont.truetype(font_path("DejaVuSans.ttf"), self.font_size)
self.splash_font_size = 40
self.splash_font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', self.splash_font_size)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), self.splash_font_size)

# Splash
self.splash_show()
Expand Down
11 changes: 7 additions & 4 deletions pistomp/lcd320x240.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@

#import traceback

from common.fonts import font_path


class Lcd(abstract_lcd.Lcd):

def __init__(self, cwd, handler=None, flip=False, display=None, spi_speed_mhz=24):
Expand Down Expand Up @@ -84,10 +87,10 @@ def __init__(self, cwd, handler=None, flip=False, display=None, spi_speed_mhz=24
}

# TODO get fonts from config.json
self.title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 26)
self.splash_font = ImageFont.truetype('DejaVuSans.ttf', 48)
self.small_font = ImageFont.truetype("DejaVuSans.ttf", 20)
self.tiny_font = ImageFont.truetype("DejaVuSans.ttf", 16)
self.title_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 26)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 48)
self.small_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 20)
self.tiny_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 16)
self.title_split_orig = 190
self.title_split = self.title_split_orig
self.display_width = 320
Expand Down
14 changes: 8 additions & 6 deletions pistomp/lcdgfx.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@

from pistomp.footswitch import Footswitch # TODO would like to avoid this module knowing such details

from common.fonts import font_path


class Lcd(abstract_lcd.Lcd):
__single = None
Expand Down Expand Up @@ -95,12 +97,12 @@ def __init__(self, cwd, lcd=None, backlight=None, touch=None):
ImageDraw.Draw(self.images[6]), ImageDraw.Draw(self.images[7])]

# Load fonts
self.splash_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 18)
self.title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 11)
self.label_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 10)
self.small_bold_font = ImageFont.truetype("DejaVuSansMono-Bold.ttf", 8)
#self.small_font = ImageFont.truetype("DejaVuSansMono.ttf", 8)
self.small_font = ImageFont.truetype(os.path.join(cwd, "fonts", "EtBt6001-JO47.ttf"), 6)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 18)
self.title_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 11)
self.label_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 10)
self.small_bold_font = ImageFont.truetype(font_path("DejaVuSansMono-Bold.ttf"), 8)
#self.small_font = ImageFont.truetype(font_path("DejaVuSansMono.ttf"), 8)
self.small_font = ImageFont.truetype(font_path("EtBt6001-JO47.ttf"), 6)

# Splash
text_im = Image.new('L', (103, 63))
Expand Down
12 changes: 7 additions & 5 deletions pistomp/lcdili9341.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
# Most draw methods should be implemented in the parent class unless that needs to be overriden for this display
# All __init__ parameters from the lcdbase.py should be specified in this __init__

from common.fonts import font_path


class Lcd(lcdcolor.Lcdcolor):

Expand All @@ -50,11 +52,11 @@ def __init__(self, cwd, mod=None, flip=False):
self.init_spi_display()

# Fonts
self.title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 26)
self.splash_font = ImageFont.truetype('DejaVuSans.ttf', 48)
self.small_font = ImageFont.truetype("DejaVuSans.ttf", 20)
self.tiny_font = ImageFont.truetype("DejaVuSans.ttf", 16)
#self.tiny_font = ImageFont.truetype(os.path.join(cwd, "fonts", "EtBt6001-JO47.ttf"), 12)
self.title_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 26)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 48)
self.small_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 20)
self.tiny_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 16)
#self.tiny_font = ImageFont.truetype(font_path("EtBt6001-JO47.ttf"), 12)

# Colors
self.background = (0, 0, 0)
Expand Down
7 changes: 5 additions & 2 deletions pistomp/lcdsy7789.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@

import ST7789

from common.fonts import font_path


class Lcd(ABC):

def __init__(self, cwd):
Expand Down Expand Up @@ -61,9 +64,9 @@ def __init__(self, cwd):

# Font
self.font_size = 26
self.font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', self.font_size)
self.font = ImageFont.truetype(font_path("DejaVuSans.ttf"), self.font_size)
self.splash_font_size = 40
self.splash_font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', self.splash_font_size)
self.splash_font = ImageFont.truetype(font_path("DejaVuSans.ttf"), self.splash_font_size)

# Turn on the backlight
backlight = digitalio.DigitalInOut(board.D22)
Expand Down
4 changes: 3 additions & 1 deletion pistomp/tuner/panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from PIL import ImageFont

from common.fonts import font_path

from uilib.box import Box
from uilib.config import Config
from uilib.misc import get_text_size
Expand Down Expand Up @@ -347,7 +349,7 @@ def __init__(
super().__init__(box=Box.xywh(0, 0, _W, 240), auto_destroy=True)
self._engine = engine

note_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 56)
note_font = ImageFont.truetype(font_path("DejaVuSans-Bold.ttf"), 56)
btn_font = Config().get_font("default")
_, btn_text_h = get_text_size("Mute", btn_font)
btn_v_margin = max(0, (_BTN_H - btn_text_h) // 2)
Expand Down
6 changes: 2 additions & 4 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import pytest
from PIL import Image, ImageFont

from common.fonts import FONTS_DIR as _FONTS_DIR
from uilib.panel import LcdBase

PROJECT_ROOT = Path(__file__).parent.parent
Expand Down Expand Up @@ -54,9 +55,6 @@
# ---------------------------------------------------------------------------


_FONTS_DIR = PROJECT_ROOT / "fonts"


@pytest.fixture(autouse=True)
def force_basic_layout(monkeypatch):
original = ImageFont.truetype
Expand Down Expand Up @@ -158,7 +156,7 @@ def inject(self, raw: str) -> None:

def sent_values_for(self, instance_id: str, symbol: str) -> list[float]:
prefix = f"param_set /graph/{instance_id}/{symbol} "
return [float(m[len(prefix):]) for m in self.sent if m.startswith(prefix)]
return [float(m[len(prefix) :]) for m in self.sent if m.startswith(prefix)]


@pytest.fixture
Expand Down
4 changes: 3 additions & 1 deletion ui/wifi_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

from PIL import ImageFont

from common.fonts import font_path

import common.util as util
from modalapi.wifi import (
ConnectSavedCmd,
Expand Down Expand Up @@ -101,7 +103,7 @@ def __init__(self, ssid: str, pstack, on_submit: PasswordCallback) -> None:
self._on_submit = on_submit
self._curline = ''

font = ImageFont.truetype("DejaVuSans.ttf", 18)
font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 18)
box = Box(0, 0, 300, 80)
box = box.centre(pstack.box)
super().__init__(box=box, parent=pstack, auto_destroy=True)
Expand Down
9 changes: 6 additions & 3 deletions uilib/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import json
from PIL import ImageFont

from common.fonts import font_path, FONTS_DIR


class Config:
_instance = None
Expand All @@ -40,9 +42,9 @@ def __init__(self, config_json=None):

def _set_defaults(self):
if "default" not in self.fonts:
add_font("default", "DejaVuSans.ttf", 16)
add_font("default", font_path("DejaVuSans.ttf"), 16)
if "default_title" not in self.fonts:
add_font("default_title", "DejaVuSans-Bold.ttf", 16)
add_font("default_title", font_path("DejaVuSans-Bold.ttf"), 16)
if "default_fgnd" not in self.colors:
add_color("default_fgnd", (255, 255, 255))
if "default_bkgnd" not in self.colors:
Expand Down Expand Up @@ -90,7 +92,8 @@ def load_config(self, json_file, reset_old=True):
except KeyError as e:
print("Error loading font:", e)
else:
self.add_font(l, n, s)
candidate = FONTS_DIR / n
self.add_font(l, str(candidate) if candidate.exists() else n, s)
if "colors" in data:
colors = data["colors"]
for color_def in colors:
Expand Down
4 changes: 3 additions & 1 deletion uilib/font_with_glyphs.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

from PIL import Image, ImageDraw, ImageFont

from common.fonts import font_path


@runtime_checkable
class Glyph(Protocol):
Expand All @@ -32,7 +34,7 @@ class PillGlyph:

def __init__(self, label: str, font_size: int = 9) -> None:
self._label = label
self._font = ImageFont.truetype("DejaVuSans.ttf", font_size)
self._font = ImageFont.truetype(font_path("DejaVuSans.ttf"), font_size)
bb = self._font.getbbox(label)
self._text_w = int(bb[2] - bb[0])
self._text_h = int(bb[3] - bb[1])
Expand Down
4 changes: 3 additions & 1 deletion uilib/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
from math import log
from PIL import ImageFont

from common.fonts import font_path

from uilib.panel import *
from uilib.misc import *
from uilib.config import *
Expand Down Expand Up @@ -135,7 +137,7 @@ def __init__(self, widget):
self.set_outline(2, (255,255,255))
self.outline = 2
self.curline = widget.text
self.font = ImageFont.truetype("DejaVuSans.ttf", 18)
self.font = ImageFont.truetype(font_path("DejaVuSans.ttf"), 18)
bbox = self.font.getbbox(widget.edit_message)
msg_w, msg_h = bbox[2] - bbox[0], bbox[3]
msg_box = Box.xywh(10, 10, msg_w, msg_h)
Expand Down