You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.9 KiB
Python

4 weeks ago
""":mod:`wand.font` --- Fonts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. versionadded:: 0.3.0
:class:`Font` is an object which takes the :attr:`~Font.path` of font file,
:attr:`~Font.size`, :attr:`~Font.color`, and whether to use
:attr:`~Font.antialias`\\ ing. If you want to use font by its name rather
than the file path, use TTFQuery_ package. The font path resolution by its
name is a very complicated problem to achieve.
.. seealso::
TTFQuery_ --- Find and Extract Information from TTF Files
TTFQuery builds on the `FontTools-TTX`_ package to allow the Python
programmer to accomplish a number of tasks:
- query the system to find installed fonts
- retrieve metadata about any TTF font file
- this includes the glyph outlines (shape) of individual code-points,
which allows for rendering the glyphs in 3D (such as is done in
OpenGLContext)
- lookup/find fonts by:
- abstract family type
- proper font name
- build simple metadata registries for run-time font matching
.. _TTFQuery: http://ttfquery.sourceforge.net/
.. _FontTools-TTX: http://sourceforge.net/projects/fonttools/
"""
from . import assertions
from .color import Color
from .compat import string_type, text
__all__ = ('Font',)
class Font(tuple):
"""Font struct which is a subtype of :class:`tuple`.
:param path: the path of the font file
:type path: :class:`str`, :class:`basestring`
:param size: the size of typeface. 0 by default which means *autosized*
:type size: :class:`numbers.Real`
:param color: the color of typeface. black by default
:type color: :class:`~wand.color.Color`
:param antialias: whether to use antialiasing. :const:`True` by default
:type antialias: :class:`bool`
:param stroke_color: optional color to outline typeface.
:type stroke_color: :class:`~wand.color.Color`
:param stroke_width: optional thickness of typeface outline.
:type stroke_width: :class:`numbers.Real`
.. versionchanged:: 0.3.9
The ``size`` parameter becomes optional. Its default value is
0, which means *autosized*.
.. versionchanged:: 0.5.0
Added ``stroke_color`` & ``stoke_width`` parameters.
"""
def __new__(cls, path, size=0, color=None, antialias=True,
stroke_color=None, stroke_width=None):
assertions.assert_string(path=path)
assertions.assert_real(size=size)
if color is None:
color = Color('black')
elif isinstance(color, string_type):
color = Color(color)
assertions.assert_color(color=color)
if stroke_color:
if isinstance(stroke_color, string_type):
stroke_color = Color(stroke_color)
assertions.assert_color(stroke_color=stroke_color)
if stroke_width is not None:
assertions.assert_real(stroke_width=stroke_width)
path = text(path)
return tuple.__new__(cls, (path, size, color, bool(antialias),
stroke_color, stroke_width))
@property
def path(self):
"""(:class:`basestring`) The path of font file."""
return self[0]
@property
def size(self):
"""(:class:`numbers.Real`) The font size in pixels."""
return self[1]
@property
def color(self):
"""(:class:`wand.color.Color`) The font color."""
return self[2]
@property
def antialias(self):
"""(:class:`bool`) Whether to apply antialiasing (``True``)
or not (``False``).
"""
return self[3]
@property
def stroke_color(self):
"""(:class:`wand.color.Color`) The stroke color."""
return self[4]
@property
def stroke_width(self):
"""(:class:`numbers.Real`) The width of the stroke line."""
return self[5]
def __repr__(self):
return '{0.__module__}.{0.__name__}({1})'.format(
type(self),
tuple.__repr__(self)
)