108 lines
3.0 KiB
Python
108 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# libcaca Colour ASCII-Art library
|
|
# Python language bindings
|
|
# Copyright (c) 2010 Alex Foulon <alxf@lavabit.com>
|
|
# All Rights Reserved
|
|
#
|
|
# This library is free software. It comes without any warranty, to
|
|
# the extent permitted by applicable law. You can redistribute it
|
|
# and/or modify it under the terms of the Do What the Fuck You Want
|
|
# to Public License, Version 2, as published by Sam Hocevar. See
|
|
# http://www.wtfpl.net/ for more details.
|
|
#
|
|
|
|
""" Libcaca Python bindings """
|
|
|
|
import ctypes
|
|
import errno
|
|
|
|
from caca import _lib, _PYTHON3, _str_to_bytes
|
|
|
|
|
|
class _FontStruct(ctypes.Structure):
|
|
pass
|
|
|
|
class _Font(object):
|
|
""" Model for Font object.
|
|
"""
|
|
def __init__(self):
|
|
self._font = None
|
|
|
|
def from_param(self):
|
|
""" Required by ctypes module to call object as parameter of
|
|
a C function.
|
|
"""
|
|
return self._font
|
|
|
|
def __del__(self):
|
|
if hasattr(self, "_font"):
|
|
if self._font:
|
|
self._free()
|
|
|
|
def __str__(self):
|
|
return "<CacaFont>"
|
|
|
|
def _free(self):
|
|
""" Free a libcaca font.
|
|
"""
|
|
_lib.caca_free_font.argtypes = [_Font]
|
|
_lib.caca_free_font.restype = ctypes.c_int
|
|
|
|
return _lib.caca_free_font(self)
|
|
|
|
class Font(_Font):
|
|
""" Font object, methods are libcaca functions with caca_font_t as first
|
|
argument.
|
|
"""
|
|
def __init__(self, font, size=0):
|
|
""" Font constructor
|
|
|
|
font -- the memory area containing the font or its name
|
|
size -- the size of the memory area, or 0 if the font name is given
|
|
"""
|
|
if size == 0:
|
|
_lib.caca_load_font.argtypes = [ctypes.c_char_p, ctypes.c_int]
|
|
else:
|
|
raise FontError("Unsupported method")
|
|
|
|
_lib.caca_load_font.restype = ctypes.POINTER(_FontStruct)
|
|
|
|
if _PYTHON3:
|
|
font = _str_to_bytes(font)
|
|
|
|
self._font = _lib.caca_load_font(font, size)
|
|
if self._font == 0:
|
|
err = ctypes.c_int.in_dll(_lib, "errno")
|
|
if err.value == errno.ENOENT:
|
|
raise FontError("Requested built-in font does not exist")
|
|
elif err.value == errno.EINVAL:
|
|
raise FontError("Invalid font data in memory area")
|
|
elif err.value == errno.ENOMEM:
|
|
raise FontError("Not enough memory to allocate font structure")
|
|
|
|
def get_width(self):
|
|
""" Get a font's standard glyph width.
|
|
"""
|
|
_lib.caca_get_font_width.argtypes = [_Font]
|
|
_lib.caca_get_font_width.restype = ctypes.c_int
|
|
|
|
return _lib.caca_get_font_width(self)
|
|
|
|
def get_height(self):
|
|
""" Get a font's standard glyph height.
|
|
"""
|
|
_lib.caca_get_font_height.argtypes = [_Font]
|
|
_lib.caca_get_font_height.restype = ctypes.c_int
|
|
|
|
return _lib.caca_get_font_height(self)
|
|
|
|
def get_blocks(self):
|
|
""" Get a font's list of supported glyphs.
|
|
"""
|
|
raise FontError("Not Implemented")
|
|
|
|
class FontError(Exception):
|
|
pass
|
|
|