This commit is contained in:
2025-10-13 11:15:21 +02:00
parent 9a6543c530
commit 2519b55f08
24 changed files with 498 additions and 169 deletions

View File

@@ -18,13 +18,14 @@ from .constants import (
is_free_version,
is_full_version
)
from .system import install_pillow, get_system_fonts, get_font_enum_items
from .system import install_pillow, get_system_fonts, get_font_enum_items, find_default_truetype_font
__all__ = [
'bl_info',
'install_pillow',
'get_system_fonts',
'get_font_enum_items',
'find_default_truetype_font',
'has_image_overlays',
'has_basic_utilities',
'has_presets',
@@ -38,4 +39,4 @@ __all__ = [
'has_shader_generation',
'is_free_version',
'is_full_version'
]
]

View File

@@ -7,6 +7,8 @@ import sys
import platform
import os
_DEFAULT_FONT_CACHE = None
def install_pillow():
pass
"""Install Pillow if not available"""
@@ -98,4 +100,100 @@ def get_anchor_point_matrix():
['TOP_LEFT', 'TOP_CENTER', 'TOP_RIGHT'],
['MIDDLE_LEFT', 'MIDDLE_CENTER', 'MIDDLE_RIGHT'],
['BOTTOM_LEFT', 'BOTTOM_CENTER', 'BOTTOM_RIGHT']
]
]
def find_default_truetype_font():
pass
"""Return a system font path that can act as scalable default."""
global _DEFAULT_FONT_CACHE
if _DEFAULT_FONT_CACHE is not None:
pass
return _DEFAULT_FONT_CACHE
system = platform.system().lower()
preferred_fonts = []
if system == "windows":
preferred_fonts = [
"C:/Windows/Fonts/arial.ttf",
"C:/Windows/Fonts/segoeui.ttf",
"C:/Windows/Fonts/calibri.ttf",
"C:/Windows/Fonts/tahoma.ttf",
]
elif system == "darwin":
preferred_fonts = [
"/System/Library/Fonts/SFNS.ttf",
"/System/Library/Fonts/SFNSDisplay.ttf",
"/System/Library/Fonts/Helvetica.ttc",
"/Library/Fonts/Arial.ttf",
"/Library/Fonts/HelveticaNeue.ttc",
]
else:
preferred_fonts = [
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
"/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf",
"/usr/share/fonts/truetype/freefont/FreeSans.ttf",
]
def _font_supports_basic_latin(font_path):
pass
try:
from PIL import ImageFont
except ImportError:
return False
try:
font = ImageFont.truetype(font_path, 48)
except (OSError, IOError, TypeError, ValueError):
return False
try:
bbox_upper = font.getbbox("H")
bbox_lower = font.getbbox("e")
except Exception:
return False
if not bbox_upper or not bbox_lower:
return False
try:
upper_width = float(bbox_upper[2] - bbox_upper[0])
upper_height = float(bbox_upper[3] - bbox_upper[1])
lower_width = float(bbox_lower[2] - bbox_lower[0])
lower_height = float(bbox_lower[3] - bbox_lower[1])
except (TypeError, ValueError):
return False
if min(upper_width, upper_height, lower_width, lower_height) <= 0:
return False
if lower_height > upper_height * 1.3:
return False
if lower_width > upper_width * 1.5:
return False
return True
for candidate in preferred_fonts:
if candidate and os.path.exists(candidate) and _font_supports_basic_latin(candidate):
_DEFAULT_FONT_CACHE = candidate
return _DEFAULT_FONT_CACHE
fonts = get_system_fonts()
for _, font_path in sorted(fonts.items()):
if os.path.exists(font_path) and _font_supports_basic_latin(font_path):
_DEFAULT_FONT_CACHE = font_path
return _DEFAULT_FONT_CACHE
try:
from ..ui.preview import get_system_fallback_fonts
fallback_fonts = get_system_fallback_fonts()
for font_path in fallback_fonts:
if os.path.exists(font_path) and _font_supports_basic_latin(font_path):
_DEFAULT_FONT_CACHE = font_path
return _DEFAULT_FONT_CACHE
except Exception:
pass
_DEFAULT_FONT_CACHE = None
return _DEFAULT_FONT_CACHE