359 lines
8.9 KiB
Python
359 lines
8.9 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
|
|
|
|
from caca import _lib, _PYTHON3, _bytes_to_str
|
|
|
|
#color constants
|
|
COLOR_BLACK = 0x00
|
|
COLOR_BLUE = 0x01
|
|
COLOR_GREEN = 0x02
|
|
COLOR_CYAN = 0x03
|
|
COLOR_RED = 0x04
|
|
COLOR_MAGENTA = 0x05
|
|
COLOR_BROWN = 0x06
|
|
COLOR_LIGHTGRAY = 0x07
|
|
COLOR_DARKGRAY = 0x08
|
|
COLOR_LIGHTBLUE = 0x09
|
|
COLOR_LIGHTGREEN = 0x0a
|
|
COLOR_LIGHTCYAN = 0x0b
|
|
COLOR_LIGHTRED = 0x0c
|
|
COLOR_LIGHTMAGENTA = 0x0d
|
|
COLOR_YELLOW = 0x0e
|
|
COLOR_WHITE = 0x0f
|
|
COLOR_DEFAULT = 0x10
|
|
COLOR_TRANSPARENT = 0x20
|
|
|
|
#styles constants
|
|
STYLE_BOLD = 0x01
|
|
STYLE_ITALICS = 0x02
|
|
STYLE_UNDERLINE = 0x04
|
|
STYLE_BLINK = 0x08
|
|
|
|
#key constants
|
|
EVENT_NONE = 0x0000
|
|
EVENT_KEY_PRESS = 0x0001
|
|
EVENT_KEY_RELEASE = 0x0002
|
|
EVENT_MOUSE_PRESS = 0x0004
|
|
EVENT_MOUSE_RELEASE = 0x0008
|
|
EVENT_MOUSE_MOTION = 0x0010
|
|
EVENT_RESIZE = 0x0020
|
|
EVENT_QUIT = 0x0040
|
|
EVENT_ANY = 0xffff
|
|
|
|
#event constants
|
|
KEY_UNKNOWN = 0x00
|
|
KEY_CTRL_A = 0x01
|
|
KEY_CTRL_B = 0x02
|
|
KEY_CTRL_C = 0x03
|
|
KEY_CTRL_D = 0x04
|
|
KEY_CTRL_E = 0x05
|
|
KEY_CTRL_F = 0x06
|
|
KEY_CTRL_G = 0x07
|
|
KEY_BACKSPACE = 0x08
|
|
KEY_TAB = 0x09
|
|
KEY_CTRL_J = 0x0a
|
|
KEY_CTRL_K = 0x0b
|
|
KEY_CTRL_L = 0x0c
|
|
KEY_RETURN = 0x0d
|
|
KEY_CTRL_N = 0x0e
|
|
KEY_CTRL_O = 0x0f
|
|
KEY_CTRL_P = 0x10
|
|
KEY_CTRL_Q = 0x11
|
|
KEY_CTRL_R = 0x12
|
|
KEY_PAUSE = 0x13
|
|
KEY_CTRL_T = 0x14
|
|
KEY_CTRL_U = 0x15
|
|
KEY_CTRL_V = 0x16
|
|
KEY_CTRL_W = 0x17
|
|
KEY_CTRL_X = 0x18
|
|
KEY_CTRL_Y = 0x19
|
|
KEY_CTRL_Z = 0x1a
|
|
KEY_ESCAPE = 0x1b
|
|
KEY_DELETE = 0x7f
|
|
KEY_UP = 0x111
|
|
KEY_DOWN = 0x112
|
|
KEY_LEFT = 0x113
|
|
KEY_RIGHT = 0x114
|
|
KEY_INSERT = 0x115
|
|
KEY_HOME = 0x116
|
|
KEY_END = 0x117
|
|
KEY_PAGEUP = 0x118
|
|
KEY_PAGEDOWN = 0x119
|
|
KEY_F1 = 0x11a
|
|
KEY_F2 = 0x11b
|
|
KEY_F3 = 0x11c
|
|
KEY_F4 = 0x11d
|
|
KEY_F5 = 0x11e
|
|
KEY_F6 = 0x11f
|
|
KEY_F7 = 0x120
|
|
KEY_F8 = 0x121
|
|
KEY_F9 = 0x122
|
|
KEY_F10 = 0x123
|
|
KEY_F11 = 0x124
|
|
KEY_F12 = 0x125
|
|
KEY_F13 = 0x126
|
|
KEY_F14 = 0x127
|
|
KEY_F15 = 0x128
|
|
|
|
|
|
def get_version():
|
|
""" Return string with libcaca version information.
|
|
"""
|
|
_lib.caca_get_version.restype = ctypes.c_char_p
|
|
|
|
if _PYTHON3:
|
|
return _bytes_to_str(_lib.caca_get_version())
|
|
else:
|
|
return _lib.caca_get_version()
|
|
|
|
def get_display_driver_list():
|
|
""" Return a list of available drivers as tuple (name, description).
|
|
"""
|
|
tmplst = []
|
|
retlst = []
|
|
|
|
_lib.caca_get_display_driver_list.restype = ctypes.POINTER(ctypes.c_char_p)
|
|
|
|
for item in _lib.caca_get_display_driver_list():
|
|
if item is not None and item != "":
|
|
if _PYTHON3:
|
|
tmplst.append(_bytes_to_str(item))
|
|
else:
|
|
tmplst.append(item)
|
|
else:
|
|
#memory error occured otherwise
|
|
break
|
|
|
|
for i in range(0, len(tmplst)):
|
|
if i % 2 == 0:
|
|
retlst.append((tmplst[i], tmplst[i+1]))
|
|
|
|
del tmplst
|
|
return retlst
|
|
|
|
def get_export_list():
|
|
""" Return list of available export formats as tuple (name, description).
|
|
"""
|
|
tmplst = []
|
|
retlst = []
|
|
|
|
_lib.caca_get_export_list.restype = ctypes.POINTER(ctypes.c_char_p)
|
|
|
|
for item in _lib.caca_get_export_list():
|
|
if item is not None and item != "":
|
|
if _PYTHON3:
|
|
tmplst.append(_bytes_to_str(item))
|
|
else:
|
|
tmplst.append(item)
|
|
else:
|
|
#memory error occured otherwise
|
|
break
|
|
|
|
for i in range(0, len(tmplst)):
|
|
if i % 2 == 0:
|
|
retlst.append((tmplst[i], tmplst[i+1]))
|
|
|
|
del tmplst
|
|
return retlst
|
|
|
|
def get_import_list():
|
|
""" Return list of available import formats as tuple (name, description).
|
|
"""
|
|
tmplst = []
|
|
retlst = []
|
|
|
|
_lib.caca_get_import_list.restype = ctypes.POINTER(ctypes.c_char_p)
|
|
|
|
autodetect = False
|
|
for item in _lib.caca_get_import_list():
|
|
if item is not None:
|
|
if item == "":
|
|
if not autodetect:
|
|
if _PYTHON3:
|
|
tmplst.append(_bytes_to_str("\"\""))
|
|
else:
|
|
tmplst.append("\"\"")
|
|
autodetect = True
|
|
else:
|
|
#memory error occured otherwise
|
|
break
|
|
else:
|
|
if _PYTHON3:
|
|
tmplst.append(_bytes_to_str(item))
|
|
else:
|
|
tmplst.append(item)
|
|
else:
|
|
#memory error occured otherwise
|
|
break
|
|
|
|
for i in range(0, len(tmplst)):
|
|
if i % 2 == 0:
|
|
retlst.append((tmplst[i], tmplst[i+1]))
|
|
|
|
del tmplst
|
|
return retlst
|
|
|
|
def get_font_list():
|
|
""" Return a list of available fonts.
|
|
"""
|
|
fl = []
|
|
|
|
_lib.caca_get_font_list.restype = ctypes.POINTER(ctypes.c_char_p)
|
|
|
|
for item in _lib.caca_get_font_list():
|
|
if item is not None and item != "":
|
|
if _PYTHON3:
|
|
fl.append(_bytes_to_str(item))
|
|
else:
|
|
fl.append(item)
|
|
else:
|
|
#memory error occured otherwise
|
|
break
|
|
|
|
return fl
|
|
|
|
def rand(range_min, range_max):
|
|
""" Generate a random integer within a range.
|
|
|
|
range_min -- the lower bound of the integer range
|
|
range_max __ the upper bound of the integer range
|
|
"""
|
|
_lib.caca_rand.argtypes = [ctypes.c_int, ctypes.c_int]
|
|
_lib.caca_rand.restype = ctypes.c_int
|
|
|
|
return _lib.caca_rand(range_min, range_max)
|
|
|
|
def attr_to_ansi(attr):
|
|
""" Get DOS ANSI information from attribute.
|
|
|
|
attr -- the requested attribute value
|
|
"""
|
|
_lib.caca_attr_to_ansi.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_attr_to_ansi.restype = ctypes.c_uint8
|
|
|
|
return _lib.caca_attr_to_ansi(attr)
|
|
|
|
def attr_to_ansi_fg(attr):
|
|
""" Get ANSI foreground information from attribute.
|
|
|
|
attr -- the requested attribute value
|
|
"""
|
|
_lib.caca_attr_to_ansi_fg.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_attr_to_ansi_fg.restype = ctypes.c_uint8
|
|
|
|
return _lib.caca_attr_to_ansi_fg(attr)
|
|
|
|
def attr_to_ansi_bg(attr):
|
|
""" Get ANSI background information from attribute.
|
|
|
|
attr -- the requested attribute value
|
|
"""
|
|
_lib.caca_attr_to_ansi_bg.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_attr_to_ansi_bg.restype = ctypes.c_uint8
|
|
|
|
return _lib.caca_attr_to_ansi_bg(attr)
|
|
|
|
def attr_to_rgb12_fg(attr):
|
|
""" Get 12-bit RGB foreground information from attribute.
|
|
|
|
attr -- the requested attribute value
|
|
"""
|
|
_lib.caca_attr_to_rgb12_fg.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_attr_to_rgb12_fg.restype = ctypes.c_uint16
|
|
|
|
return _lib.caca_attr_to_rgb12_fg(attr)
|
|
|
|
def attr_to_rgb12_bg(attr):
|
|
""" Get 12-bit RGB background information from attribute.
|
|
|
|
attr -- the requested attribute value
|
|
"""
|
|
_lib.caca_attr_to_rgb12_bg.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_attr_to_rgb12_bg.restype = ctypes.c_uint16
|
|
|
|
return _lib.caca_attr_to_rgb12_bg(attr)
|
|
|
|
def utf8_to_utf32(ch):
|
|
""" Convert a UTF-8 character to UTF-32.
|
|
|
|
ch -- the character to convert
|
|
"""
|
|
_lib.caca_utf8_to_utf32.argtypes = [ctypes.c_char_p,
|
|
ctypes.POINTER(ctypes.c_size_t)
|
|
]
|
|
_lib.caca_utf8_to_utf32.restype = ctypes.c_uint32
|
|
|
|
return _lib.caca_utf8_to_utf32(ch, ctypes.c_ulong(0))
|
|
|
|
def utf32_to_utf8(ch):
|
|
""" Convert a UTF-32 character to UTF-8.
|
|
|
|
ch -- the character to convert
|
|
"""
|
|
_lib.caca_utf32_to_utf8.argtypes = [ctypes.c_char_p, ctypes.c_uint32]
|
|
_lib.caca_utf32_to_utf8.restype = ctypes.c_int
|
|
|
|
buf = ctypes.c_buffer(7)
|
|
_lib.caca_utf32_to_utf8(buf, ch)
|
|
|
|
if _PYTHON3:
|
|
return _bytes_to_str(buf.raw).replace('\x00', '')
|
|
else:
|
|
return buf.raw.replace('\x00', '')
|
|
|
|
def utf32_to_cp437(ch):
|
|
""" Convert a UTF-32 character to CP437.
|
|
|
|
ch -- the character to convert
|
|
"""
|
|
_lib.caca_utf32_to_cp437.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_utf32_to_cp437.restype = ctypes.c_uint8
|
|
|
|
return _lib.caca_utf32_to_cp437(ch)
|
|
|
|
def cp437_to_utf32(ch):
|
|
""" Convert a CP437 character to UTF-32.
|
|
|
|
ch -- the character to convert
|
|
"""
|
|
_lib.caca_cp437_to_utf8.argtypes = [ctypes.c_uint8]
|
|
_lib.caca_cp437_to_utf8.restype = ctypes.c_uint32
|
|
|
|
return _lib.caca_cp437_to_utf8(ch)
|
|
|
|
def utf32_to_ascii(ch):
|
|
""" Convert a UTF-32 character to ASCII.
|
|
|
|
ch -- the character to convert
|
|
"""
|
|
_lib.caca_utf32_to_ascii.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_utf32_to_ascii.restype = ctypes.c_uint8
|
|
|
|
return _lib.caca_utf32_to_ascii(ch)
|
|
|
|
def utf32_is_fullwidth(ch):
|
|
""" Tell whether a UTF-32 character is fullwidth.
|
|
|
|
ch -- the UTF-32 character
|
|
"""
|
|
_lib.caca_utf32_is_fullwidth.argtypes = [ctypes.c_uint32]
|
|
_lib.caca_utf32_is_fullwidth.restype = ctypes.c_int
|
|
|
|
return _lib.caca_utf32_is_fullwidth(ch)
|
|
|