1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-15 15:18:16 +00:00

Disallow size for bitmap font.

File caching improvements
This commit is contained in:
clydebarrow 2025-02-24 05:52:04 +11:00
parent 8be54bf0fd
commit a0f9b62dae

View File

@ -146,7 +146,12 @@ def check_missing_glyphs(file, codepoints, warning: bool = False):
raise cv.Invalid(message) raise cv.Invalid(message)
def validate_glyphs(config): def validate_font_config(config):
if config[CONF_FILE][CONF_TYPE] == TYPE_LOCAL_BITMAP and CONF_SIZE in config:
raise cv.Invalid(
"Size is not a valid option for bitmap fonts, which are inherently fixed size"
)
""" """
Check for duplicate codepoints, then check that all requested codepoints actually Check for duplicate codepoints, then check that all requested codepoints actually
have glyphs defined in the appropriate font file. have glyphs defined in the appropriate font file.
@ -302,9 +307,8 @@ def download_gfont(value):
external_files.compute_local_file_dir(DOMAIN) external_files.compute_local_file_dir(DOMAIN)
/ f"{value[CONF_FAMILY]}@{value[CONF_WEIGHT]}@{value[CONF_ITALIC]}@v1.ttf" / f"{value[CONF_FAMILY]}@{value[CONF_WEIGHT]}@{value[CONF_ITALIC]}@v1.ttf"
) )
_LOGGER.debug("download_gfont: path=%s", path)
if not external_files.is_file_recent(str(path), value[CONF_REFRESH]): if not external_files.is_file_recent(str(path), value[CONF_REFRESH]):
_LOGGER.debug("download_gfont: path=%s", path)
try: try:
req = requests.get(url, timeout=external_files.NETWORK_TIMEOUT) req = requests.get(url, timeout=external_files.NETWORK_TIMEOUT)
req.raise_for_status() req.raise_for_status()
@ -324,6 +328,9 @@ def download_gfont(value):
_LOGGER.debug("download_gfont: ttf_url=%s", ttf_url) _LOGGER.debug("download_gfont: ttf_url=%s", ttf_url)
external_files.download_content(ttf_url, path) external_files.download_content(ttf_url, path)
# In case the remote file is not modified, the download_content function will return the existing file,
# so update the modification time to now.
path.touch()
FONT_CACHE[value] = path FONT_CACHE[value] = path
return value return value
@ -444,7 +451,7 @@ FONT_SCHEMA = cv.Schema(
cv.one_of(*glyphsets.defined_glyphsets()) cv.one_of(*glyphsets.defined_glyphsets())
), ),
cv.Optional(CONF_IGNORE_MISSING_GLYPHS, default=False): cv.boolean, cv.Optional(CONF_IGNORE_MISSING_GLYPHS, default=False): cv.boolean,
cv.Optional(CONF_SIZE, default=20): cv.int_range(min=1), cv.Optional(CONF_SIZE): cv.int_range(min=1),
cv.Optional(CONF_BPP, default=1): cv.one_of(1, 2, 4, 8), cv.Optional(CONF_BPP, default=1): cv.one_of(1, 2, 4, 8),
cv.Optional(CONF_EXTRAS, default=[]): cv.ensure_list( cv.Optional(CONF_EXTRAS, default=[]): cv.ensure_list(
cv.Schema( cv.Schema(
@ -459,7 +466,7 @@ FONT_SCHEMA = cv.Schema(
}, },
) )
CONFIG_SCHEMA = cv.All(FONT_SCHEMA, validate_glyphs) CONFIG_SCHEMA = cv.All(FONT_SCHEMA, validate_font_config)
class EFont: class EFont:
@ -495,7 +502,6 @@ async def to_code(config):
} }
# get the codepoints from the glyphs key, flatten to a list of chrs and combine with the points from glyphsets # get the codepoints from the glyphs key, flatten to a list of chrs and combine with the points from glyphsets
point_set.update(flatten(config[CONF_GLYPHS])) point_set.update(flatten(config[CONF_GLYPHS]))
size = config[CONF_SIZE]
# Create the codepoint to font file map # Create the codepoint to font file map
base_font = FONT_CACHE[config[CONF_FILE]] base_font = FONT_CACHE[config[CONF_FILE]]
point_font_map: dict[str, Face] = {c: base_font for c in point_set} point_font_map: dict[str, Face] = {c: base_font for c in point_set}
@ -517,7 +523,7 @@ async def to_code(config):
for codepoint in codepoints: for codepoint in codepoints:
font = point_font_map[codepoint] font = point_font_map[codepoint]
if not font.has_fixed_sizes: if not font.has_fixed_sizes:
font.set_pixel_sizes(size, 0) font.set_pixel_sizes(config.get(CONF_SIZE, 20), 0)
font.load_char(codepoint) font.load_char(codepoint)
font.glyph.render(mode) font.glyph.render(mode)
width = font.glyph.bitmap.width width = font.glyph.bitmap.width