mirror of
https://github.com/esphome/esphome.git
synced 2025-03-31 16:08:15 +01:00
[font] More robust handling of fixed font sizes. (#8443)
Co-authored-by: Keith Burzinski <kbx81x@gmail.com>
This commit is contained in:
parent
6cfe3ac44d
commit
bc999b50b3
@ -7,7 +7,15 @@ from pathlib import Path
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
import esphome_glyphsets as glyphsets
|
import esphome_glyphsets as glyphsets
|
||||||
from freetype import Face, ft_pixel_mode_grays, ft_pixel_mode_mono
|
|
||||||
|
# pylint: disable=no-name-in-module
|
||||||
|
from freetype import (
|
||||||
|
FT_LOAD_NO_BITMAP,
|
||||||
|
FT_LOAD_RENDER,
|
||||||
|
Face,
|
||||||
|
ft_pixel_mode_grays,
|
||||||
|
ft_pixel_mode_mono,
|
||||||
|
)
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from esphome import external_files
|
from esphome import external_files
|
||||||
@ -204,7 +212,7 @@ def validate_font_config(config):
|
|||||||
if font.get_char_index(x) != 0
|
if font.get_char_index(x) != 0
|
||||||
]
|
]
|
||||||
|
|
||||||
if font.has_fixed_sizes:
|
if not font.is_scalable:
|
||||||
sizes = [pt_to_px(x.size) for x in font.available_sizes]
|
sizes = [pt_to_px(x.size) for x in font.available_sizes]
|
||||||
if not sizes:
|
if not sizes:
|
||||||
raise cv.Invalid(
|
raise cv.Invalid(
|
||||||
@ -507,10 +515,16 @@ async def to_code(config):
|
|||||||
# create the data array for all glyphs
|
# create the data array for all glyphs
|
||||||
for codepoint in codepoints:
|
for codepoint in codepoints:
|
||||||
font = point_font_map[codepoint]
|
font = point_font_map[codepoint]
|
||||||
format = font.get_format().decode("utf-8")
|
if not font.is_scalable:
|
||||||
if format != "PCF":
|
sizes = [pt_to_px(x.size) for x in font.available_sizes]
|
||||||
|
if size in sizes:
|
||||||
|
font.select_size(sizes.index(size))
|
||||||
|
else:
|
||||||
font.set_pixel_sizes(size, 0)
|
font.set_pixel_sizes(size, 0)
|
||||||
font.load_char(codepoint)
|
flags = FT_LOAD_RENDER
|
||||||
|
if bpp != 1:
|
||||||
|
flags |= FT_LOAD_NO_BITMAP
|
||||||
|
font.load_char(codepoint, flags)
|
||||||
font.glyph.render(mode)
|
font.glyph.render(mode)
|
||||||
width = font.glyph.bitmap.width
|
width = font.glyph.bitmap.width
|
||||||
height = font.glyph.bitmap.rows
|
height = font.glyph.bitmap.rows
|
||||||
@ -535,7 +549,7 @@ async def to_code(config):
|
|||||||
pos += 1
|
pos += 1
|
||||||
ascender = pt_to_px(font.size.ascender)
|
ascender = pt_to_px(font.size.ascender)
|
||||||
if ascender == 0:
|
if ascender == 0:
|
||||||
if font.has_fixed_sizes:
|
if not font.is_scalable:
|
||||||
ascender = size
|
ascender = size
|
||||||
else:
|
else:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
@ -585,7 +599,7 @@ async def to_code(config):
|
|||||||
font_height = pt_to_px(base_font.size.height)
|
font_height = pt_to_px(base_font.size.height)
|
||||||
ascender = pt_to_px(base_font.size.ascender)
|
ascender = pt_to_px(base_font.size.ascender)
|
||||||
if font_height == 0:
|
if font_height == 0:
|
||||||
if base_font.has_fixed_sizes:
|
if not base_font.is_scalable:
|
||||||
font_height = size
|
font_height = size
|
||||||
ascender = font_height
|
ascender = font_height
|
||||||
else:
|
else:
|
||||||
|
3246
tests/components/font/Tamzen5x9b.bdf
Normal file
3246
tests/components/font/Tamzen5x9b.bdf
Normal file
File diff suppressed because it is too large
Load Diff
@ -43,6 +43,9 @@ font:
|
|||||||
id: default_font
|
id: default_font
|
||||||
- file: $component_dir/x11.pcf
|
- file: $component_dir/x11.pcf
|
||||||
id: pcf_font
|
id: pcf_font
|
||||||
|
- file: $component_dir/Tamzen5x9b.bdf
|
||||||
|
id: bdf_font
|
||||||
|
size: 7
|
||||||
|
|
||||||
i2c:
|
i2c:
|
||||||
scl: ${i2c_scl}
|
scl: ${i2c_scl}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user