""" Android graphics.fonts 包 — Font, FontFamily, FontStyle, FontVariationAxis, Typeface 方法签名完全对齐 Android SDK """ from __future__ import annotations import os import sys from typing import Any, Dict, List, Optional, Tuple from .._core import Stub, AndroidOnlyError from ..java.lang import RuntimeException IllegalArgumentException = type("IllegalArgumentException", (RuntimeException,), {}) __all__ = [ "Font", "FontFamily", "FontStyle", "FontVariationAxis", "Typeface", ] # ═══════════════════════════════════════════════════════════════ # FontStyle # ═══════════════════════════════════════════════════════════════ class FontStyle(Stub): """FontStyle — 字体样式""" FONT_SLANT_UPRIGHT = 0 FONT_SLANT_ITALIC = 1 FONT_WIDTH_NORMAL = 100 FONT_WIDTH_CONDENSED = 75 FONT_WIDTH_EXTENDED = 125 def __init__(self, weight: int = 400, slant: int = FONT_SLANT_UPRIGHT, width: int = FONT_WIDTH_NORMAL): super().__init__() self._weight = weight self._slant = slant self._width = width def getWeight(self) -> int: """获取字重""" return self._weight def getSlant(self) -> int: """获取倾斜""" return self._slant def getWidth(self) -> int: """获取宽度""" return self._width def toString(self) -> str: return f"FontStyle(weight={self._weight}, slant={self._slant}, width={self._width})" # ═══════════════════════════════════════════════════════════════ # FontVariationAxis # ═══════════════════════════════════════════════════════════════ class FontVariationAxis(Stub): """FontVariationAxis — 字体变体轴""" def __init__(self, tag: str = "", style_value: float = 0.0): super().__init__() self._tag = tag self._style_value = style_value def getTag(self) -> str: """获取标签""" return self._tag def getStyleValue(self) -> float: """获取样式值""" return self._style_value def toString(self) -> str: return f"FontVariationAxis(tag={self._tag}, value={self._style_value})" def equals(self, other: Any) -> bool: if not isinstance(other, FontVariationAxis): return False return self._tag == other._tag and self._style_value == other._style_value def hashCode(self) -> int: return hash((self._tag, self._style_value)) & 0x7FFFFFFF # ═══════════════════════════════════════════════════════════════ # Font # ═══════════════════════════════════════════════════════════════ class Font(Stub): """Font — 字体 (桌面存根,包装系统字体)""" _SYSTEM_FONT_DIRS = [ "/usr/share/fonts", "/System/Library/Fonts", "C:\\Windows\\Fonts", ] def __init__(self, file: Optional[str] = None, buffer: Optional[Any] = None, weight: int = 400, italic: bool = False, ttc_index: int = 0, axes: Optional[List[FontVariationAxis]] = None): super().__init__() self._file = file self._buffer = buffer self._weight = weight self._italic = italic self._ttc_index = ttc_index self._axes = axes or [] self._native_ptr = 0 self._font_size = 12.0 self._obb = None self._source = file or "default" def getStyle(self) -> FontStyle: """获取字体样式""" return FontStyle(self._weight, FontStyle.FONT_SLANT_ITALIC if self._italic else FontStyle.FONT_SLANT_UPRIGHT) def getBuffer(self) -> Optional[Any]: """获取缓冲区""" return self._buffer def getNativePtr(self) -> int: """获取原生指针""" return self._native_ptr def getFontSize(self) -> float: """获取字号""" return self._font_size def getObb(self) -> Optional[Any]: """获取 OBB""" return self._obb def getSource(self) -> str: """获取来源""" return self._source def getTtcIndex(self) -> int: """获取 TTC 索引""" return self._ttc_index def getWeight(self) -> int: """获取字重""" return self._weight def getItalic(self) -> bool: """获取斜体""" return self._italic def getAxes(self) -> List[FontVariationAxis]: """获取变体轴列表""" return self._axes.copy() def getFile(self) -> Optional[str]: """获取文件路径""" return self._file @staticmethod def buildNativeTypeface(font: "Font") -> int: """构建原生字体类型""" return 0 @staticmethod def load(file: str, weight: int = 400, italic: bool = False, ttc_index: int = 0) -> Optional["Font"]: """从文件加载字体""" if os.path.exists(file): return Font(file=file, weight=weight, italic=italic, ttc_index=ttc_index) return None def toString(self) -> str: return f"Font(file={self._file}, weight={self._weight}, italic={self._italic})" # ═══════════════════════════════════════════════════════════════ # FontFamily # ═══════════════════════════════════════════════════════════════ class FontFamily(Stub): """FontFamily — 字体家族""" def __init__(self, fonts: Optional[List[Font]] = None): super().__init__() self._fonts = fonts or [] def addFont(self, font: Font) -> None: """添加字体""" self._fonts.append(font) def getFont(self, index: int) -> Optional[Font]: """获取指定索引的字体""" if 0 <= index < len(self._fonts): return self._fonts[index] return None def getSize(self) -> int: """获取字体数量""" return len(self._fonts) def toString(self) -> str: return f"FontFamily(size={len(self._fonts)})" # ═══════════════════════════════════════════════════════════════ # Typeface (fonts package version) # ═══════════════════════════════════════════════════════════════ class Typeface(Stub): """Typeface — 字体类型 (图形字体包版本)""" DEFAULT: "Typeface" = None DEFAULT_BOLD: "Typeface" = None MONOSPACE: "Typeface" = None SANS_SERIF: "Typeface" = None SERIF: "Typeface" = None NORMAL = 0 BOLD = 1 ITALIC = 2 BOLD_ITALIC = 3 def __init__(self, family_name: str = "sans-serif", style: int = NORMAL): super().__init__() self._family_name = family_name self._style = style self._weight = 400 if style in (Typeface.BOLD, Typeface.BOLD_ITALIC): self._weight = 700 @staticmethod def defaultFromStyle(style: int) -> "Typeface": """从样式获取默认字体""" names = {0: "sans-serif", 1: "sans-serif", 2: "serif", 3: "serif"} return Typeface(names.get(style, "sans-serif"), style) @staticmethod def create(family_name: str, style: int) -> "Typeface": """创建字体""" return Typeface(family_name, style) @staticmethod def load(file_path: str, style: int = NORMAL) -> "Typeface": """从文件加载字体""" return Typeface("custom", style) def getStyle(self) -> int: """获取字体样式""" return self._style def isBold(self) -> bool: """检查是否粗体""" return self._style in (Typeface.BOLD, Typeface.BOLD_ITALIC) def isItalic(self) -> bool: """检查是否斜体""" return self._style in (Typeface.ITALIC, Typeface.BOLD_ITALIC) def getWeight(self) -> int: """获取字重""" return self._weight @staticmethod def getSystemFontMap() -> Dict[str, "Typeface"]: """获取系统字体映射""" return { "sans-serif": Typeface.SANS_SERIF, "serif": Typeface.SERIF, "monospace": Typeface.MONOSPACE, } @staticmethod def getSystemFontSettings(weight: int, italic: bool) -> Optional[Font]: """获取系统字体设置""" return Font(weight=weight, italic=italic) @staticmethod def setSystemFontSettings(font: Font) -> None: """设置系统字体设置""" pass def toString(self) -> str: return f"Typeface({self._family_name}, style={self._style})" # Initialize Typeface constants Typeface.DEFAULT = Typeface("sans-serif", Typeface.NORMAL) Typeface.DEFAULT_BOLD = Typeface("sans-serif", Typeface.BOLD) Typeface.MONOSPACE = Typeface("monospace", Typeface.NORMAL) Typeface.SANS_SERIF = Typeface("sans-serif", Typeface.NORMAL) Typeface.SERIF = Typeface("serif", Typeface.NORMAL)