@@ -6,7 +6,6 @@ Sam Hocevar <sam@hocevar.net> | |||||
Jean-Yves Lamoureux <jylam@lnxscene.org> | Jean-Yves Lamoureux <jylam@lnxscene.org> | ||||
- cacaball | - cacaball | ||||
- OpenGL driver | - OpenGL driver | ||||
- Pypycaca Python wrapper | |||||
- exporters | - exporters | ||||
- network driver | - network driver | ||||
- C# bindings | - C# bindings | ||||
@@ -29,4 +28,7 @@ Nicolas Vion <nico@picapo.net> | |||||
Adrien Grand <jpountz@dinauz.org> | Adrien Grand <jpountz@dinauz.org> | ||||
- Java bindings | - Java bindings | ||||
Alex Foulon <alxf@lavabit.com> | |||||
- Python bindings | |||||
*/ | */ |
@@ -85,6 +85,8 @@ AC_ARG_ENABLE(java, | |||||
[ --enable-java Java bindings (autodetected)]) | [ --enable-java Java bindings (autodetected)]) | ||||
AC_ARG_ENABLE(cxx, | AC_ARG_ENABLE(cxx, | ||||
[ --enable-cxx C++ bindings (autodetected)]) | [ --enable-cxx C++ bindings (autodetected)]) | ||||
AC_ARG_ENABLE(python, | |||||
[ --enable-python Python bindings (autodetected)]) | |||||
AC_ARG_ENABLE(ruby, | AC_ARG_ENABLE(ruby, | ||||
[ --enable-ruby Ruby bindings (autodetected)]) | [ --enable-ruby Ruby bindings (autodetected)]) | ||||
@@ -464,6 +466,13 @@ if test "${enable_java}" != "no" -a "${ac_cv_my_have_kernel}" != "yes"; then | |||||
fi | fi | ||||
AM_CONDITIONAL(USE_JAVA, test "${ac_cv_my_have_java}" = "yes") | AM_CONDITIONAL(USE_JAVA, test "${ac_cv_my_have_java}" = "yes") | ||||
# Build the Python bindings? | |||||
ac_cv_my_have_python="no" | |||||
if test "${enable_python}" != "no"; then | |||||
AM_PATH_PYTHON(2.2, ac_cv_my_have_python="yes", :) | |||||
fi | |||||
AM_CONDITIONAL(USE_PYTHON, test "${ac_cv_my_have_python}" = "yes") | |||||
# Build the Ruby bindings? | # Build the Ruby bindings? | ||||
ac_cv_my_have_ruby="no" | ac_cv_my_have_ruby="no" | ||||
if test "${enable_ruby}" != "no"; then | if test "${enable_ruby}" != "no"; then | ||||
@@ -1,22 +1,17 @@ | |||||
EXTRA_DIST = caca.txt pypycaca.c pypycaca.h snake.py test1.py test2.py | |||||
if USE_PYTHON | |||||
python_PYTHON = \ | |||||
caca/__init__.py \ | |||||
caca/canvas.py \ | |||||
caca/common.py \ | |||||
caca/display.py \ | |||||
caca/dither.py \ | |||||
caca/font.py | |||||
endif | |||||
EXTRA_DIST = \ | |||||
setup.py \ | |||||
examples/cacainfo.py \ | |||||
examples/drawing.py \ | |||||
examples/gol.py | |||||
CC = gcc | |||||
RM = rm -f | |||||
CACAFLAGS = `caca-config --cflags` | |||||
CACALIBS = `caca-config --libs` | |||||
PYTHONFLAGS = -I/usr/include/python2.4 | |||||
PYTHONLIBS = -lpython2.4 | |||||
NAME = caca.so | |||||
all: | |||||
python: | |||||
$(CC) pypycaca.c -c $(CACAFLAGS) $(PYTHONFLAGS) -Wall | |||||
$(LD) pypycaca.o -o $(NAME) $(CACALIBS) $(PYTHONLIBS) -shared | |||||
clean: | |||||
$(RM) *.o $(NAME) |
@@ -1,16 +0,0 @@ | |||||
Pypycaca - libcaca bindings for Python | |||||
(c) 2006 Jean-Yves Lamoureux <jylam@lnxscene.org> | |||||
No warranty blaaah blaaah | |||||
These Python bindings will work with either Python 2.3 or 2.4, not tested previous versions. | |||||
Don't forget to change Makefile options in case you are not using Python 2.4. | |||||
No documentation yet, functions are all the same, with same arguments (using arrays or lists instead of C pointers, of course). | |||||
It hasn't been tested on anything else than IA32 yet. | |||||
I eat beef tonight, that was cool. Thanks. |
@@ -1,26 +0,0 @@ | |||||
12 6 6 3 | |||||
, | |||||
` ,_ , | |||||
` _( )_ | |||||
_( ` )_ | |||||
( `-. ' ) | |||||
`-.____,-' | |||||
h | |||||
h gg h | |||||
h gggggg | |||||
gggggggggg | |||||
gggggggggggg | |||||
gggggggggg | |||||
12 6 6 3 | |||||
. , | |||||
` ,_ | |||||
_( )_ ' | |||||
_( ` )_ | |||||
( `-. ' ) | |||||
`-.____,-' | |||||
h h | |||||
h gg | |||||
gggggg h | |||||
gggggggggg | |||||
gggggggggggg | |||||
gggggggggg |
@@ -0,0 +1,27 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from ctypes.util import find_library | |||||
if find_library('caca') is not None: | |||||
_lib = ctypes.cdll.LoadLibrary(find_library('caca')) | |||||
else: | |||||
raise ImportError, \ | |||||
"Can't find shared library, you need to install libcaca in your path !" | |||||
from common import * | |||||
@@ -0,0 +1,812 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from caca import _lib | |||||
class _Canvas(object): | |||||
""" Model for Canvas objects. | |||||
""" | |||||
def __init__(self): | |||||
self._cv = 0 | |||||
def from_param(self): | |||||
""" Required by ctypes module to call object as parameter of | |||||
a C function. | |||||
""" | |||||
return self._cv | |||||
def __str__(self): | |||||
return "<CacaCanvas %dx%d>" % (self.get_width(), self.get_height()) | |||||
def __del__(self): | |||||
if self._cv > 0: | |||||
self._free() | |||||
def _free(self): | |||||
""" Free a libcaca canvas. | |||||
""" | |||||
_lib.caca_free_canvas.argtypes = [_Canvas] | |||||
_lib.caca_free_canvas.restype = ctypes.c_int | |||||
return _lib.caca_free_canvas(self) | |||||
def get_width(self): | |||||
raise CanvasError, "You can't use model canvas directly" | |||||
def get_height(self): | |||||
raise CanvasError, "You can't use model canvas directly" | |||||
class Canvas(_Canvas): | |||||
""" Canvas object, methods are libcaca functions with canvas_t as | |||||
first parameter. | |||||
""" | |||||
def __init__(self, width=0, height=0): | |||||
""" Canvas constructor. | |||||
width -- the desired canvas width | |||||
height -- the desired canvas height | |||||
""" | |||||
_lib.caca_create_canvas.argtypes = [ctypes.c_int, ctypes.c_int] | |||||
self._cv = _lib.caca_create_canvas(width, height) | |||||
if self._cv == 0: | |||||
raise CanvasError, "Failed to create canvas" | |||||
def set_size(self, width, height): | |||||
""" Resize a canvas. | |||||
width -- the desired canvas width | |||||
height -- the desired canvas height | |||||
""" | |||||
_lib.caca_set_canvas_size.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_set_canvas_size.restype = ctypes.c_int | |||||
return _lib.caca_set_canvas_size(self, width, height) | |||||
def get_width(self): | |||||
""" Get the canvas width. | |||||
""" | |||||
_lib.caca_get_canvas_width.argtypes = [_Canvas] | |||||
_lib.caca_get_canvas_width.restype = ctypes.c_int | |||||
return _lib.caca_get_canvas_width(self) | |||||
def get_height(self): | |||||
""" Get the canvas height. | |||||
""" | |||||
_lib.caca_get_canvas_height.argtypes = [_Canvas] | |||||
_lib.caca_get_canvas_height.restype = ctypes.c_int | |||||
return _lib.caca_get_canvas_height(self) | |||||
def get_chars(self): | |||||
""" Get the canvas character array, return python list. | |||||
""" | |||||
chlist = [] | |||||
#get canvas size | |||||
w, h = self.get_width(), self.get_height() | |||||
_lib.caca_get_canvas_chars.argtypes = [_Canvas] | |||||
_lib.caca_get_canvas_chars.restype = \ | |||||
ctypes.POINTER(ctypes.c_uint8 * (w * h)) | |||||
plist = _lib.caca_get_canvas_chars(self) | |||||
#build character list | |||||
for item in plist.contents: | |||||
if item != 0: | |||||
chlist.append(chr(item)) | |||||
return chlist | |||||
def gotoxy(self, x, y): | |||||
""" Set cursor position. | |||||
x -- X cursor coordinate | |||||
y -- Y cursor coordinate | |||||
""" | |||||
_lib.caca_gotoxy.argtypes = [_Canvas, ctypes.c_int] | |||||
_lib.caca_gotoxy.restyoe = ctypes.c_int | |||||
return _lib.caca_gotoxy(self, x, y) | |||||
def wherex(self): | |||||
""" Get X cursor position. | |||||
""" | |||||
_lib.caca_wherex.argtypes = [_Canvas] | |||||
_lib.caca_wherex.restype = ctypes.c_int | |||||
return _lib.caca_wherex(self) | |||||
def wherey(self): | |||||
""" Get Y cursor position. | |||||
""" | |||||
_lib.caca_wherey.argtypes = [_Canvas] | |||||
_lib.caca_wherey.restype = ctypes.c_int | |||||
return _lib.caca_wherey(self) | |||||
def put_char(self, x, y, ch): | |||||
""" Print an ASCII or Unicode character. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
ch -- the character to print | |||||
""" | |||||
_lib.caca_put_char.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_put_char.restype = ctypes.c_int | |||||
return _lib.caca_put_char(self, x, y, ord(ch)) | |||||
def get_char(self, x, y): | |||||
""" Get the Unicode character at the given coordinates. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
""" | |||||
_lib.caca_get_char.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_get_char.restype = ctypes.c_uint32 | |||||
return _lib.caca_get_char(self, x, y) | |||||
def put_str(self, x, y, s): | |||||
""" Print a string. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
s -- the string to print | |||||
""" | |||||
_lib.caca_put_str.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_char_p | |||||
] | |||||
_lib.caca_put_str.restype = ctypes.c_int | |||||
return _lib.caca_put_str(self, x, y, s) | |||||
def printf(self, x, y, fmt, *args): | |||||
""" Print a formated string. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
fmt -- the format string to print | |||||
args -- Arguments to the format string | |||||
""" | |||||
_lib.caca_printf.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_char_p | |||||
] | |||||
_lib.caca_printf.restype = ctypes.c_int | |||||
return _lib.caca_printf(self, x, y, fmt, *args) | |||||
def clear(self): | |||||
""" Clear the canvas. | |||||
""" | |||||
_lib.caca_clear_canvas.argtypes = [_Canvas] | |||||
_lib.caca_clear_canvas.restype = ctypes.c_int | |||||
return _lib.caca_clear_canvas(self) | |||||
def set_handle(self, x, y): | |||||
""" Set cursor handle. Blitting method will use the handle value to | |||||
put the canvas at the proper coordinates. | |||||
x -- X handle coordinate | |||||
y -- Y handle coordinate | |||||
""" | |||||
_lib.caca_set_canvas_handle.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_set_canvas_handle.restype = ctypes.c_int | |||||
return _lib.caca_set_canvas_handle(self, x, y) | |||||
def get_handle_x(self): | |||||
""" Get X handle position. | |||||
""" | |||||
_lib.caca_get_canvas_handle_x.argtypes = [_Canvas] | |||||
_lib.caca_get_canvas_handle_x.restype = ctypes.c_int | |||||
return _lib.caca_get_canvas_handle_x(self) | |||||
def get_handle_y(self): | |||||
""" Get Y handle position. | |||||
""" | |||||
_lib.caca_get_canvas_handle_y.argtypes = [_Canvas] | |||||
_lib.caca_get_canvas_handle_y.restype = ctypes.c_int | |||||
return _lib.caca_get_canvas_handle_y(self) | |||||
def blit(self, x, y, cv, mask): | |||||
""" Blit canvas onto another one. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
cv -- the source canvas | |||||
mask -- the mask canvas | |||||
""" | |||||
_lib.caca_blit.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, _Canvas, _Canvas | |||||
] | |||||
_lib.caca_blit.restype = ctypes.c_int | |||||
return _lib.caca_blit(self, x, y, cv, mask) | |||||
def set_boundaries(self, x, y, width, height): | |||||
""" Set a canvas' new boundaries. | |||||
x -- X coordinate of the top-left corner | |||||
y -- Y coordinate of the top-left corner | |||||
width -- width of the box | |||||
height -- height of the box | |||||
""" | |||||
_lib.caca_set_canvas_boundaries.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_set_canvas_boundaries.restype = ctypes.c_int | |||||
return _lib.caca_set_canvas_boundaries(self, x, y, width, height) | |||||
def disable_dirty_rect(self): | |||||
""" Disable dirty rectangles. | |||||
""" | |||||
_lib.caca_disable_dirty_rect.argtypes = [_Canvas] | |||||
_lib.caca_disable_dirty_rect.restype = ctypes.c_int | |||||
return _lib.caca_disable_dirty_rect(self) | |||||
def enable_dirty_rect(self): | |||||
""" Enable dirty rectangles. | |||||
""" | |||||
_lib.caca_enable_dirty_rect.argtypes = [_Canvas] | |||||
_lib.caca_enable_dirty_rect.restype = ctypes.c_int | |||||
return _lib.caca_enable_dirty_rect(self) | |||||
def get_dirty_rect_count(self): | |||||
""" Get the number of dirty rectangles in the canvas. | |||||
""" | |||||
_lib.caca_get_dirty_rect_count.argtypes = [_Canvas] | |||||
_lib.caca_get_dirty_rect_count.restype = ctypes.c_int | |||||
return _lib.caca_get_dirty_rect_count(self) | |||||
def get_dirty_rect(self, idx): | |||||
""" Get a canvas's dirty rectangle. | |||||
idx -- the requested rectangle index | |||||
""" | |||||
x = ctypes.POINTER(ctypes.c_int) | |||||
y = ctypes.POINTER(ctypes.c_int) | |||||
w = ctypes.POINTER(ctypes.c_int) | |||||
h = ctypes.POINTER(ctypes.c_int) | |||||
_lib.caca_get_dirty_rect.argtypes = [ | |||||
_Canvas, ctypes.c_int, | |||||
ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), | |||||
ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int) | |||||
] | |||||
_lib.caca_get_dirty_rect.restype = ctypes.c_int | |||||
_lib.caca_get_dirty_rect(self, idx, x, y, w, h) | |||||
return [x.contents.value, y.contents.value, | |||||
w.contents.value, h.contents.value] | |||||
def add_dirty_rect(self, x, y, width, height): | |||||
""" Add an area to the canvas's dirty rectangle list. | |||||
x -- the leftmost edge of the additional dirty rectangle | |||||
y -- the topmost edge of the additional dirty rectangle | |||||
width -- the width of the additional dirty rectangle | |||||
height -- the height of the additional dirty rectangle | |||||
""" | |||||
_lib.caca_add_dirty_rect.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_add_dirty_rect.restype = ctypes.c_int | |||||
return _lib.caca_add_dirty_rect(self, x, y, width, height) | |||||
def remove_dirty_rect(self, x, y, width, height): | |||||
""" Remove an area from the dirty rectangle list. | |||||
x -- the leftmost edge of the additional dirty rectangle | |||||
y -- the topmost edge of the additional dirty rectangle | |||||
width -- the width of the additional rectangle | |||||
height -- the height of the additional dirty rectangle | |||||
""" | |||||
_lib.caca_remove_dirty_rect.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_remove_dirty_rect.restype = ctypes.c_int | |||||
return _lib.caca_remove_dirty_rect(self, x, y, height, width) | |||||
def clear_dirty_rect_list(self): | |||||
""" Clear a canvas's dirty rectangle list. | |||||
""" | |||||
_lib.caca_clear_dirty_rect_list.argtypes = [_Canvas] | |||||
_lib.caca_clear_dirty_rect_list.restype = ctypes.c_int | |||||
return _lib.caca_clear_dirty_rect_list(self) | |||||
def invert(self): | |||||
""" Invert a canvas' colours. | |||||
""" | |||||
_lib.caca_invert.argtypes = [_Canvas] | |||||
_lib.caca_invert.restype = ctypes.c_int | |||||
return _lib.caca_invert(self) | |||||
def flip(self): | |||||
""" Flip a canvas horizontally. | |||||
""" | |||||
_lib.caca_flip.argtypes = [_Canvas] | |||||
_lib.caca_flip.restype = ctypes.c_int | |||||
return _lib.caca_flip(self) | |||||
def flop(self): | |||||
""" Flip a canvas vertically. | |||||
""" | |||||
_lib.caca_flop.argtypes = [_Canvas] | |||||
_lib.caca_flop.restype = ctypes.c_int | |||||
return _lib.caca_flop(self) | |||||
def rotate_180(self): | |||||
""" Rotate a canvas. | |||||
""" | |||||
_lib.caca_rotate_180.argtypes = [_Canvas] | |||||
_lib.caca_rotate_180.restype = ctypes.c_int | |||||
return _lib.caca_rotate_180(self) | |||||
def rotate_left(self): | |||||
""" Rotate a canvas, 90 degrees counterclockwise. | |||||
""" | |||||
_lib.caca_rotate_left.argtypes = [_Canvas] | |||||
_lib.caca_rotate_left.restype = ctypes.c_int | |||||
return _lib.caca_rotate_left(self) | |||||
def rotate_right(self): | |||||
""" Rotate a canvas, 90 degrees clockwise. | |||||
""" | |||||
_lib.caca_rotate_right.argtypes = [_Canvas] | |||||
_lib.caca_rotate_right.restype = ctypes.c_int | |||||
return _lib.caca_rotate_right(self) | |||||
def stretch_left(self): | |||||
""" Rotate and stretch a canvas, 90 degrees counterclockwise. | |||||
""" | |||||
_lib.caca_stretch_left.argtypes = [_Canvas] | |||||
_lib.caca_stretch_left.restype = ctypes.c_int | |||||
return _lib.caca_stretch_left(self) | |||||
def stretch_right(self): | |||||
""" Rotate and stretch a canvas, 90 degrees clockwise. | |||||
""" | |||||
_lib.caca_stretch_right.argtypes = [_Canvas] | |||||
_lib.caca_stretch_right.restype = ctypes.c_int | |||||
return _lib.caca_stretch_right(self) | |||||
def get_attr(self, x, y): | |||||
""" Get the text attribute at the given coordinates. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
""" | |||||
_lib.caca_get_attr.argtypes = [_Canvas, ctypes.c_int, ctypes.c_int] | |||||
_lib.caca_get_attr.restype = ctypes.c_uint32 | |||||
return _lib.caca_get_attr(self, x, y) | |||||
def set_attr(self, attr): | |||||
""" Set the default character attribute. | |||||
attr -- the requested attribute value | |||||
""" | |||||
_lib.caca_set_attr.argtypes = [_Canvas, ctypes.c_uint32] | |||||
_lib.caca_set_attr.restype = ctypes.c_int | |||||
return _lib.caca_set_attr(self, attr) | |||||
def put_attr(self, x, y, attr): | |||||
""" Set the character attribute at the given coordinates. | |||||
x -- X coordinate | |||||
y -- Y coordinate | |||||
attr -- the requested attribute value | |||||
""" | |||||
_lib.caca_put_attr.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_put_attr.restype = ctypes.c_int | |||||
return _lib.caca_put_attr(self, x, y, attr) | |||||
def set_color_ansi(self, fg, bg): | |||||
""" Set the default colour pair for text (ANSI version). | |||||
fg -- the requested ANSI foreground colour. | |||||
bg -- the requested ANSI background colour. | |||||
""" | |||||
_lib.caca_set_color_ansi.argtypes = [_Canvas, ctypes.c_uint8, ctypes.c_uint8] | |||||
_lib.caca_set_color_ansi.restype = ctypes.c_int | |||||
return _lib.caca_set_color_ansi(self, fg, bg) | |||||
def set_color_argb(self, fg, bg): | |||||
""" Set the default colour pair for text (truecolor version). | |||||
fg -- the requested ARGB foreground colour. | |||||
bg -- the requested ARGB background colour. | |||||
""" | |||||
_lib.caca_set_color_argb.argtypes = [ | |||||
_Canvas, ctypes.c_uint16, ctypes.c_uint16 | |||||
] | |||||
_lib.caca_set_color_argb.restype = ctypes.c_int | |||||
return _lib.caca_set_color_argb(self, fg, bg) | |||||
def draw_line(self, x1, y1, x2, y2, ch): | |||||
""" Draw a line on the canvas using the given character. | |||||
x1 -- X coordinate of the first point | |||||
y1 -- Y coordinate of the first point | |||||
x2 -- X coordinate of the second point | |||||
y2 -- Y coordinate of the second point | |||||
ch -- character to be used to draw the line | |||||
""" | |||||
_lib.caca_draw_line.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_line.restype = ctypes.c_int | |||||
return _lib.caca_draw_line(self, x1, y1, x2, y2, ord(ch)) | |||||
def draw_polyline(self, array_x, array_y, n, ch): | |||||
""" Draw a polyline. | |||||
array_x -- Array of X coordinates, must have n+1 elements | |||||
array-y -- Array of Y coordinates, must have n+1 elements | |||||
n -- Number of lines to draw | |||||
ch -- character to be used to draw the line | |||||
""" | |||||
_lib.caca_draw_polyline.argtypes = [ | |||||
_Canvas, ctypes.c_int * n, ctypes.c_int * n, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_polyline.restype = ctypes.c_int | |||||
return _lib.caca_draw_polyline(self, array_x, array_y, n, ord(ch)) | |||||
def draw_thin_line(self, x1, y1, x2, y2): | |||||
""" Draw a thin line on the canvas, using ASCII art. | |||||
x1 -- X coordinate of the first point | |||||
y1 -- Y coordinate of the first point | |||||
x2 -- X coordinate of the second point | |||||
y2 -- Y coordinate of the second point | |||||
""" | |||||
_lib.caca_draw_thin_line.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_thin_line.restype = ctypes.c_int | |||||
return _lib.caca_draw_thin_line(self, x1, y1, x2, y2) | |||||
def draw_thin_polyline(self, array_x, array_y, n): | |||||
""" Draw an ASCII art thin polyline. | |||||
array_x -- Array of X coordinates, must have n+1 elements | |||||
array_y -- Array of Y coordinates, must have n+1 elements | |||||
n -- Number of lines to draw | |||||
""" | |||||
_lib.caca_draw_thin_polyline.argtypes = [ | |||||
Canvas, ctypes.c_int * n, ctypes.c_int * n, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_thin_polyline.restype = ctypes.c_int | |||||
return _lib.caca_draw_thin_polyline(self, array_x, array_y, n) | |||||
def draw_circle(self, x, y, r, ch): | |||||
""" Draw a circle on the canvas using the given character. | |||||
x -- center X coordinate | |||||
y -- center Y coordinate | |||||
r -- circle radius | |||||
ch -- the UTF-32 character to be used to draw the circle outline | |||||
""" | |||||
_lib.caca_draw_circle.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_circle.restype = ctypes.c_int | |||||
return _lib.caca_draw_circle(self, x, y, r, ord(ch)) | |||||
def draw_ellipse(self, xo, yo, a, b, ch): | |||||
""" Draw an ellipse on the canvas using the given character. | |||||
xo -- center X coordinate | |||||
yo -- center Y coordinate | |||||
a -- ellipse x radius | |||||
b -- ellipse y radius | |||||
ch -- UTF-32 character to be used to draw the ellipse outline | |||||
""" | |||||
_lib.caca_draw_ellipse.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_ellipse.restype = ctypes.c_int | |||||
return _lib.caca_draw_ellipse(self, xo, yo, a, b, ord(ch)) | |||||
def draw_thin_ellipse(self, xo, yo, a, b): | |||||
""" Draw a thin ellipse on the canvas. | |||||
xo -- center X coordinate | |||||
yo -- center Y coordinate | |||||
a -- ellipse X radius | |||||
b -- ellipse Y radius | |||||
""" | |||||
_lib.caca_draw_thin_ellipse.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_thin_ellipse.restype = ctypes.c_int | |||||
return _lib.caca_draw_thin_ellipse(self, xo, yo, a, b) | |||||
def fill_ellipse(self, xo, yo, a, b, ch): | |||||
""" Fill an ellipse on the canvas using the given character. | |||||
xo -- center X coordinate | |||||
yo -- center Y coordinate | |||||
a -- ellipse X radius | |||||
b -- ellipse Y radius | |||||
ch -- UTF-32 character to be used to fill the ellipse | |||||
""" | |||||
_lib.caca_fill_ellipse.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_fill_ellipse.restype = ctypes.c_int | |||||
return _lib.caca_fill_ellipse(self, xo, yo, a, b, ord(ch)) | |||||
def draw_box(self, x, y, width, height, ch): | |||||
""" Draw a box on the canvas using the given character. | |||||
x -- X coordinate of the upper-left corner of the box | |||||
y -- Y coordinate of the upper-left corner of the box | |||||
width -- width of the box | |||||
height -- height of the box | |||||
ch -- character to be used to draw the box | |||||
""" | |||||
_lib.caca_draw_box.argtypes = [ | |||||
Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_box.restype = ctypes.c_int | |||||
return _lib.caca_draw_box(self, x, y, width, height, ord(ch)) | |||||
def draw_thin_box(self, x, y, width, height): | |||||
""" Draw a thin box on the canvas. | |||||
x -- X coordinate of the upper-left corner of the box | |||||
y -- Y coordinate of the upper-left corner of the box | |||||
width -- width of the box | |||||
height -- height of the box | |||||
""" | |||||
_lib.caca_draw_thin_box.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_thin_box.restype = ctypes.c_int | |||||
return _lib.caca_draw_thin_box(self, x, y, width, height) | |||||
def draw_cp437_box(self, x, y, width, height): | |||||
""" Draw a box on the canvas using CP437 characters. | |||||
x -- X coordinate of the upper-left corner box | |||||
y -- Y coordinate of the upper-left corner box | |||||
width -- width of the box | |||||
height -- height of the box | |||||
""" | |||||
_lib.caca_draw_cp437_box.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_cp437_box.restype = ctypes.c_int | |||||
return _lib.caca_draw_cp437_box(self, x, y, width, height) | |||||
def fill_box(self, x, y, width, height, ch): | |||||
""" Fill a box on the canvas using the given character. | |||||
x -- X coordinate of the upper-left corner of the box | |||||
y -- Y coordinate of the upper-left corner of the box | |||||
width -- width of the box | |||||
height -- height of the box | |||||
ch -- UFT-32 character to be used to fill the box | |||||
""" | |||||
_lib.caca_fill_box.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_fill_box.restype = ctypes.c_int | |||||
return _lib.caca_fill_box(self, x, y, width, height, ord(ch)) | |||||
def draw_triangle(self, x1, y1, x2, y2, x3, y3, ch): | |||||
""" Draw a triangle on the canvas using the given character. | |||||
x1 -- X coordinate of the first point | |||||
y1 -- Y coordinate of the first point | |||||
x2 -- X coordinate of the second point | |||||
y2 -- Y coordinate of the second point | |||||
x3 -- X coordinate of the third point | |||||
y3 -- Y coordinate of the third point | |||||
ch -- UTF-32 character to be used to draw the triangle outline | |||||
""" | |||||
_lib.caca_draw_triangle.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_uint32 | |||||
] | |||||
_lib.caca_draw_triangle.restype = ctypes.c_int | |||||
return _lib.caca_draw_triangle(self, x1, y1, x2, y2, x3, y3, ord(ch)) | |||||
def draw_thin_triangle(self, x1, y1, x2, y2, x3, y3): | |||||
""" Draw a thin triangle on the canvas. | |||||
""" | |||||
_lib.caca_draw_thin_triangle.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_draw_thin_triangle.restype = ctypes.c_int | |||||
return _lib.caca_draw_thin_triangle(self, x1, y1, x2, y2, x3, y3) | |||||
def fill_triangle(self, x1, y1, x2, y2, x3, y3, ch): | |||||
""" Fill a triangle on the canvas using the given character. | |||||
x1 -- X coordinate of the first point | |||||
y1 -- Y coordinate of the first point | |||||
x2 -- X coordinate of the second point | |||||
y2 -- Y coordinate of the second point | |||||
x3 -- X coordinate of the second point | |||||
y3 -- Y coordinate of the second point | |||||
ch -- UTF-32 character to be used to fill the triangle | |||||
""" | |||||
_lib.caca_fill_triangle.argtypes = [ | |||||
_Canvas, ctypes.c_int, ctypes.c_int, ctypes.c_int, | |||||
ctypes.c_int, ctypes.c_int, ctypes.c_int | |||||
] | |||||
_lib.caca_fill_triangle.restype = ctypes.c_int | |||||
return _lib.caca_fill_triangle(self, x1, y1, x2, y2, x3, y3, ord(ch)) | |||||
def fill_triangle_textured(self, coords, tex, uv): | |||||
""" Fill a triangle on the canvas using an arbitrary-sized texture. | |||||
coords -- coordinates of the triangle (3{x,y}) | |||||
tex -- the handle of the canvas texture | |||||
uv -- coordinates of the texture (3{u,v}) | |||||
""" | |||||
_lib.caca_fill_triangle_textured.argtypes = [ | |||||
_Canvas, ctypes.c_int * 6, _Canvas, ctypes.c_int * 6 | |||||
] | |||||
_lib.caca_fill_triangle_textured.restype = ctypes.c_int | |||||
return _lib.caca_fill_triangle_textured(self, coords, tex, uv) | |||||
def get_frame_count(self): | |||||
""" Get the number of frames in a canvas. | |||||
""" | |||||
_lib.caca_get_frame_count.argtypes = [_Canvas] | |||||
_lib.caca_get_frame_count.restype = ctypes.c_int | |||||
return _lib.caca_get_frame_count(self) | |||||
def set_frame(self, idx): | |||||
""" Activate a given canvas frame. | |||||
idx -- the canvas frame to activate | |||||
""" | |||||
_lib.caca_set_frame.argtypes = [_Canvas, ctypes.c_int] | |||||
_lib.caca_set_frame.restype = ctypes.c_int | |||||
return _lib.caca_set_frame(self, idx) | |||||
def get_frame_name(self): | |||||
""" Get the current frame's name. | |||||
""" | |||||
_lib.caca_get_frame_name.argtypes = [_Canvas] | |||||
_lib.caca_get_frame_name.restype = ctypes.c_char_p | |||||
return _lib.caca_get_frame_name(self) | |||||
def set_frame_name(self, name): | |||||
""" Set the current frame's name. | |||||
name -- the name to give to the current frame | |||||
""" | |||||
_lib.caca_set_frame_name.argtypes = [_Canvas, ctypes.c_char_p] | |||||
_lib.caca_set_frame_name.restype = ctypes.c_int | |||||
return _lib.caca_set_frame_name(self, name) | |||||
def create_frame(self, idx): | |||||
""" Add a frame to a canvas. | |||||
idx -- the index where to insert the new frame | |||||
""" | |||||
_lib.caca_create_frame.argtypes = [_Canvas, ctypes.c_int] | |||||
_lib.caca_create_frame.restype = ctypes.c_int | |||||
return _lib.caca_create_frame(self, idx) | |||||
def free_frame(self, idx): | |||||
""" Remove a frame from a canvas. | |||||
idx -- the index of the frame to delete | |||||
""" | |||||
_lib.caca_free_frame.argtypes = [_Canvas, ctypes.c_int] | |||||
_lib.caca_free_frame.restype = ctypes.c_int | |||||
return _lib.caca_free_frame(self, idx) | |||||
def import_from_memory(self, data, length, fmt): | |||||
""" Import a memory buffer into the given libcaca canvas's current frame. | |||||
The current frame is resized accordingly and its contents are replaced | |||||
with the imported data. | |||||
data -- a memory area containing the data to be loaded into the canvas | |||||
length -- the size in bytes of the memory area | |||||
fmt -- a string describing the input format | |||||
""" | |||||
_lib.caca_import_canvas_from_memory.argtypes = [ | |||||
Canvas, ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p | |||||
] | |||||
_lib.caca_import_canvas_from_memory.restype = ctypes.c_int | |||||
return _lib.caca_import_canvas_from_memory(self, data, length, fmt) | |||||
class NullCanvas(_Canvas): | |||||
""" Represent a NULL canvas_t, eg to use as canvas mask for blit operations. | |||||
""" | |||||
def __str__(self): | |||||
return "<NullCanvas>" | |||||
class CanvasError(Exception): | |||||
pass | |||||
@@ -0,0 +1,335 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from caca import _lib | |||||
#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 | |||||
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 != "": | |||||
tmplst.append(item) | |||||
else: | |||||
#memory error occured otherwise | |||||
break | |||||
for i in xrange(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 != "": | |||||
tmplst.append(item) | |||||
else: | |||||
#memory error occured otherwise | |||||
break | |||||
for i in xrange(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: | |||||
tmplst.append("\"\"") | |||||
autodetect = True | |||||
else: | |||||
#memory error occured otherwise | |||||
break | |||||
else: | |||||
tmplst.append(item) | |||||
else: | |||||
#memory error occured otherwise | |||||
break | |||||
for i in xrange(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 != "": | |||||
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(2) | |||||
_lib.caca_utf32_to_utf8(buf, ch) | |||||
return buf | |||||
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) | |||||
@@ -0,0 +1,251 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from caca import _lib | |||||
from caca.canvas import _Canvas | |||||
class _Display(object): | |||||
""" Model for Display objects. | |||||
""" | |||||
def from_param(self): | |||||
""" Required by ctypes module to call object as parameter of | |||||
a C function. | |||||
""" | |||||
return self._dp | |||||
def __str__(self): | |||||
return "<CacaDisplay>" | |||||
def __del__(self): | |||||
if self._dp > 0: | |||||
self._free() | |||||
def _free(self): | |||||
""" Free a libcaca display. | |||||
""" | |||||
_lib.caca_free_display.argtypes = [_Display] | |||||
_lib.caca_free_display.restype = ctypes.c_int | |||||
return _lib.caca_free_display(self) | |||||
class Display(_Display): | |||||
""" Display objects, methods are libcaca functions with display_t as first | |||||
parameter. | |||||
""" | |||||
def __init__(self, cv, driver=None): | |||||
""" Display constructor. | |||||
cv -- canvas to attach. | |||||
driver -- caca driver to set with display | |||||
""" | |||||
if driver is None: | |||||
_lib.caca_create_display.argtypes = [_Canvas] | |||||
self._dp = _lib.caca_create_display(cv) | |||||
else: | |||||
_lib.caca_create_display_with_driver.argtypes = [ | |||||
_Canvas, ctypes.c_char_p | |||||
] | |||||
self._dp = _lib.caca_create_display_with_driver(cv, driver) | |||||
def get_driver(self): | |||||
""" Return the caca graphical context's current output driver. | |||||
""" | |||||
_lib.caca_get_display_driver.argtypes = [_Display] | |||||
_lib.caca_get_display_driver.restype = ctypes.c_char_p | |||||
return _lib.caca_get_display_driver(self) | |||||
def set_driver(self, driver=None): | |||||
""" Set the output driver. | |||||
driver -- A string describing the desired output driver or NULL | |||||
to choose the best driver automatically. | |||||
""" | |||||
_lib.caca_set_display_driver.argtypes = [_Display, ctypes.c_char_p] | |||||
_lib.caca_set_display_driver.restype = ctypes.c_int | |||||
if not driver: | |||||
driver = ctypes.c_char_p(0) | |||||
return _lib.caca_set_display_driver(self, driver) | |||||
def get_canvas(self): | |||||
""" Get the canvas attached to a caca graphical context. | |||||
""" | |||||
_lib.caca_get_canvas.argtypes = [_Display] | |||||
return _lib.caca_get_canvas(self) | |||||
def refresh(self): | |||||
""" Flush pending changes and redraw the screen. | |||||
""" | |||||
_lib.caca_refresh_display.argtypes = [_Display] | |||||
_lib.caca_refresh_display.restype = ctypes.c_int | |||||
return _lib.caca_refresh_display(self) | |||||
def set_time(self, usec): | |||||
""" Set the refresh delay. | |||||
usec -- the refresh delay in microseconds | |||||
""" | |||||
_lib.caca_set_display_time.argtypes = [_Display, ctypes.c_int] | |||||
_lib.caca_set_display_time.restype = ctypes.c_int | |||||
return _lib.caca_set_display_time(self, usec) | |||||
def get_time(self): | |||||
""" Get the display's average rendering time. | |||||
""" | |||||
_lib.caca_get_display_time.argtypes = [_Display] | |||||
_lib.caca_get_display_time.restype = ctypes.c_int | |||||
return _lib.caca_get_display_time(self) | |||||
def set_title(self, title): | |||||
""" Set the display title. | |||||
title -- the desired display title | |||||
""" | |||||
_lib.caca_set_display_title.argtypes = [_Display, ctypes.c_char_p] | |||||
_lib.caca_set_display_title.restype = ctypes.c_int | |||||
return _lib.caca_set_display_title(self, title) | |||||
def set_mouse(self, flag): | |||||
""" Show or hide the mouse pointer. This function works with the ncurses, | |||||
S-Lang and X11 drivers. | |||||
flag -- 0 hides the pointer, 1 shows the system's default pointer (usually an arrow). | |||||
""" | |||||
_lib.caca_set_mouse.argtypes = [_Display, ctypes.c_int] | |||||
_lib.caca_set_mouse.restype = ctypes.c_int | |||||
return _lib.caca_set_mouse(self, flag) | |||||
def set_cursor(self, flag): | |||||
""" Show or hide the cursor, for devices that support such a feature. | |||||
flag -- 0 hides the cursor, 1 shows the system's default cursor (usually a white rectangle). | |||||
""" | |||||
_lib.caca_set_cursor.argtypes = [Display, ctypes.c_int] | |||||
_lib.caca_set_cursor.restype = ctypes.c_int | |||||
return _lib.caca_set_cursor(self, flag) | |||||
def get_event(self, event_mask, event, timeout): | |||||
""" Poll the event queue for mouse or keyboard events matching the event mask | |||||
and return the first matching event. Non-matching events are discarded. | |||||
If event_mask is zero, the function returns immediately. | |||||
The timeout value tells how long this function needs to wait for an event. | |||||
A value of zero returns immediately and the function returns zero if no more events | |||||
are pending in the queue. A negative value causes the function to wait indefinitely | |||||
until a matching event is received. | |||||
If not null, ev will be filled with information about the event received. If null, | |||||
the function will return but no information about the event will be sent. | |||||
event_mask -- bitmask of requested events | |||||
event -- a pointer to caca_event structure or NULL | |||||
tiemout -- a timeout value in microseconds | |||||
""" | |||||
_lib.caca_get_event.argtypes = [Display, ctypes.c_int, ctypes.POINTER(Event), ctypes.c_int] | |||||
return _lib.caca_get_event(self, event_mask, ctypes.byref(event), timeout) | |||||
def get_mouse_x(self): | |||||
""" Return the X coordinate of the mouse position last time it was detected. | |||||
This function is not reliable if the ncurses or S-Lang drivers are being used, | |||||
because mouse position is only detected when the mouse is clicked. | |||||
Other drivers such as X11 work well. | |||||
""" | |||||
_lib.caca_get_mouse_x.argtypes = [Display] | |||||
_lib.caca_get_mouse_x.restype = ctypes.c_int | |||||
return _lib.caca_get_mouse_x(self) | |||||
def get_mouse_y(self): | |||||
""" Return the Y coordinate of the mouse position last time it was detected. | |||||
This function is not reliable if the ncurses or S-Lang drivers are being used, | |||||
because mouse position is only detected when the mouse is clicked. | |||||
Other drivers such as X11 work well. | |||||
""" | |||||
_lib.caca_get_mouse_y.argtypes = [Display] | |||||
_lib.caca_get_mouse_y.restype = ctypes.c_int | |||||
return _lib.caca_get_mouse_y(self) | |||||
class Event(ctypes.Structure): | |||||
""" Object to store libcaca event. | |||||
""" | |||||
_fields_ = ( | |||||
('opaque_structure', ctypes.c_char_p * 32), | |||||
) | |||||
def from_param(self): | |||||
""" Required method to pass object as parameter of a C function. | |||||
""" | |||||
return ctypes.byref(self) | |||||
def get_type(self): | |||||
""" Return the type of an event. This function may always be called | |||||
on an event after caca_get_event() was called, and its return value | |||||
indicates which other functions may be called. | |||||
""" | |||||
_lib.caca_get_event_type.argtypes = [Event] | |||||
_lib.caca_get_event_type.restype = ctypes.c_int | |||||
return _lib.caca_get_event_type(self) | |||||
def get_key_ch(self): | |||||
""" Return either the ASCII value for an event's key, or if the key is not | |||||
an ASCII character, an appropriate KEY_* value | |||||
""" | |||||
_lib.caca_get_event_key_ch.argtypes = [Event] | |||||
_lib.caca_get_event_key_ch.restype = ctypes.c_int | |||||
return _lib.caca_get_event_key_ch(self) | |||||
def get_key_utf32(self): | |||||
""" Return the UTF-32/UCS-4 value for an event's key if it resolves | |||||
to a printable character. | |||||
""" | |||||
_lib.caca_get_event_key_utf32.argtypes = [Event] | |||||
_lib.caca_get_event_key_utf32.restype = ctypes.c_uint32 | |||||
return _lib.caca_get_event_key_utf32(self) | |||||
def get_key_utf8(self): | |||||
""" Write the UTF-8 value for an event's key if it resolves to a | |||||
printable character. Up to 6 UTF-8 bytes and a null termination | |||||
are written. | |||||
""" | |||||
# set buffer for writing utf8 value | |||||
buf = ctypes.c_buffer(2) | |||||
_lib.caca_get_event_key_utf8.argtypes = [Event, ctypes.c_char_p] | |||||
_lib.caca_get_event_key_utf8.restype = ctypes.c_int | |||||
_lib.caca_get_event_key_utf8(self, buf) | |||||
return buf | |||||
@@ -0,0 +1,65 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from caca import _lib | |||||
class _Dither(object): | |||||
""" Model for Dither object. | |||||
""" | |||||
def __init__(self): | |||||
self._dither = 0 | |||||
def from_param(self): | |||||
""" Required by ctypes module to call object as parameter of | |||||
a C function. | |||||
""" | |||||
return self._dither | |||||
def __del__(self): | |||||
if self._dither > 0: | |||||
self._free() | |||||
def __str__(self): | |||||
return "<CacaDither>" | |||||
def _free(self): | |||||
""" Free a libcaca dither. | |||||
""" | |||||
_lib.caca_free_font.argtypes = [_Dither] | |||||
_lib.caca_free_font.restype = ctypes.c_int | |||||
return _lib.caca_free_font(self) | |||||
class Dither(_Dither): | |||||
""" Dither object, methods are libcaca functions with caca_dither_t as first | |||||
argument. | |||||
""" | |||||
def __init__(self, bpp, width, height, pitch, rmask, gmask, bmask, amask): | |||||
""" Dither constructor | |||||
bpp -- bitmap depth in bits per pixels | |||||
width -- bitmap width in pixels | |||||
height -- bitmap height in pixels | |||||
pitch -- bitmap pitch in bytes | |||||
rmask -- bitmask for red values | |||||
gmask -- bitmask for green values | |||||
bmask -- bitmask for blue values | |||||
amask -- bitmask for alpha values | |||||
""" | |||||
pass | |||||
@@ -0,0 +1,59 @@ | |||||
# -*- 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
from caca import _lib | |||||
class _Font(object): | |||||
""" Model for Font object. | |||||
""" | |||||
def __init__(self): | |||||
self._font = 0 | |||||
def from_param(self): | |||||
""" Required by ctypes module to call object as parameter of | |||||
a C function. | |||||
""" | |||||
return self._font | |||||
def __del__(self): | |||||
if self._font > 0: | |||||
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 | |||||
""" | |||||
pass | |||||
@@ -0,0 +1,37 @@ | |||||
#!/usr/bin/env 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import caca | |||||
if __name__ == '__main__': | |||||
print("libcaca version %s" % caca.get_version()) | |||||
print("") | |||||
print("Available drivers:") | |||||
for drv, desc in caca.get_display_driver_list(): | |||||
print(" - %s: %s" % (drv, desc)) | |||||
print("") | |||||
print("Available fonts:") | |||||
for font in caca.get_font_list(): | |||||
print(" - %s" % font) | |||||
print("") | |||||
print("Export formats:") | |||||
for fmt, desc in caca.get_export_list(): | |||||
print(" - %s: %s" % (fmt, desc)) | |||||
print("") | |||||
print("Import formats:") | |||||
for fmt, desc in caca.get_import_list(): | |||||
print(" - %s: %s" % (fmt, desc)) |
@@ -0,0 +1,118 @@ | |||||
#!/usr/bin/env 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import ctypes | |||||
import sys | |||||
import time | |||||
import caca | |||||
from caca.canvas import Canvas | |||||
from caca.display import Display, Event | |||||
class Drawing(object): | |||||
def __init__(self, canvas): | |||||
self.cv = canvas | |||||
def do_menu(self): | |||||
self.cv.put_str(0, 1, "Drawing Menu") | |||||
self.cv.put_str(0, 2, "------------") | |||||
self.cv.put_str(0, 4, "1) line") | |||||
self.cv.put_str(0, 5, "2) thin line") | |||||
self.cv.put_str(0, 6, "3) polyline") | |||||
self.cv.put_str(0, 7, "4) thin polyline") | |||||
self.cv.put_str(0, 8, "5) circle") | |||||
self.cv.put_str(0, 9, "6) ellipse") | |||||
self.cv.put_str(0, 10, "7) thin ellipse") | |||||
self.cv.put_str(0, 11, "8) box") | |||||
self.cv.put_str(0, 12, "9) thin box") | |||||
def do_line(self, thin=False): | |||||
if thin: | |||||
self.cv.draw_thin_line(0, 0, self.cv.get_width(), 1) | |||||
else: | |||||
self.cv.draw_line(0, 0, self.cv.get_width(), 1, '#') | |||||
def do_polyline(self, thin=False): | |||||
x = [0, self.cv.get_width() - 1, self.cv.get_width() - 1] | |||||
y = [0, self.cv.get_height(), 0] | |||||
array_x = ctypes.c_int * (len(x) + 1) | |||||
array_y = ctypes.c_int * (len(y) + 1) | |||||
ax = array_x(*x) | |||||
ay = array_y(*y) | |||||
if thin: | |||||
self.cv.draw_thin_polyline(ax, ay, len(x) + 1) | |||||
else: | |||||
self.cv.draw_polyline(ax, ay, len(x) + 1, '#') | |||||
def do_circle(self): | |||||
x = self.cv.get_width() / 2 | |||||
y = self.cv.get_height() / 2 | |||||
radius = 5 | |||||
self.cv.draw_circle(x, y, radius, '@') | |||||
def do_ellipse(self, thin=False): | |||||
x = self.cv.get_width() / 2 | |||||
y = self.cv.get_height() / 2 | |||||
a = 7 | |||||
b = 3 | |||||
if thin: | |||||
self.cv.draw_thin_ellipse(x, y, a, b) | |||||
else: | |||||
self.cv.draw_ellipse(x, y, a, b, '@') | |||||
def do_box(self, thin=False): | |||||
if thin: | |||||
self.cv.draw_thin_box(0, 0, self.cv.get_width(), self.cv.get_height()) | |||||
else: | |||||
self.cv.draw_box(0, 0, self.cv.get_width(), self.cv.get_height(), '#') | |||||
if __name__ == "__main__": | |||||
cv = Canvas() | |||||
dp = Display(cv) | |||||
ev = Event() | |||||
draw = Drawing(cv) | |||||
while True: | |||||
cv.clear() | |||||
draw.do_menu() | |||||
dp.refresh() | |||||
if dp.get_event(caca.EVENT_KEY_PRESS, ev, 0): | |||||
ch = ev.get_key_ch() | |||||
cv.clear() | |||||
if ch == ord('q'): | |||||
sys.exit() | |||||
elif ch == ord('1'): | |||||
draw.do_line() | |||||
elif ch == ord('2'): | |||||
draw.do_line(thin=True) | |||||
elif ch == ord('3'): | |||||
draw.do_polyline() | |||||
elif ch == ord('4'): | |||||
draw.do_polyline(thin=True) | |||||
elif ch == ord('5'): | |||||
draw.do_circle() | |||||
elif ch == ord('6'): | |||||
draw.do_ellipse() | |||||
elif ch == ord('7'): | |||||
draw.do_ellipse(thin=True) | |||||
elif ch == ord('8'): | |||||
draw.do_box() | |||||
elif ch == ord('9'): | |||||
draw.do_box(thin=True) | |||||
dp.refresh() | |||||
time.sleep(2) | |||||
@@ -0,0 +1,171 @@ | |||||
#!/usr/bin/env 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
# | |||||
""" Libcaca Python bindings """ | |||||
import random | |||||
import sys | |||||
import time | |||||
import caca | |||||
from caca.canvas import Canvas | |||||
from caca.display import Display, Event | |||||
class CellArray(object): | |||||
def __init__(self, width, height): | |||||
self.array = [] | |||||
self.width = width | |||||
self.height = height | |||||
for i in xrange(0, self.height): | |||||
self.array.append([]) | |||||
for j in xrange(0, self.width): | |||||
self.array[i].append([]) | |||||
def get(self, x, y): | |||||
return self.array[x][y] | |||||
def set(self, x, y, value): | |||||
self.array[x][y] = value | |||||
def neighbors(self, x, y): | |||||
n = 0 | |||||
h = self.height | |||||
w = self.width | |||||
if self.get((x-1)%h, (y-1)%w): | |||||
n += 1 | |||||
if self.get((x-1)%h, y): | |||||
n += 1 | |||||
if self.get((x-1)%h, (y+1)%w): | |||||
n += 1 | |||||
if self.get(x, (y-1)%w): | |||||
n += 1 | |||||
if self.get(x, (y+1)%w): | |||||
n += 1 | |||||
if self.get((x+1)%h, (y-1)%w): | |||||
n += 1 | |||||
if self.get((x+1)%h, y): | |||||
n += 1 | |||||
if self.get((x+1)%h, (y+1)%w): | |||||
n += 1 | |||||
return n | |||||
def population(self): | |||||
n = 0 | |||||
for i in xrange(0, self.height): | |||||
for j in xrange(0, self.width): | |||||
if self.get(i, j): | |||||
n += 1 | |||||
return n | |||||
class CellApp(object): | |||||
def __init__(self, width, height): | |||||
self.cycle = 0 | |||||
self.auto = False | |||||
self.width = width | |||||
self.height = height | |||||
self.ca = CellArray(self.width, self.height) | |||||
self.cbuf = CellArray(self.width, self.height) | |||||
def nextCycle(self): | |||||
self.cycle += 1 | |||||
for x in xrange(0, self.ca.height): | |||||
for y in xrange(0, self.ca.width): | |||||
if self.ca.get(x, y): | |||||
if self.ca.neighbors(x, y) >= 2 and self.ca.neighbors(x, y) <= 3: | |||||
self.cbuf.set(x, y, 1) | |||||
else: | |||||
self.cbuf.set(x, y, 0) | |||||
elif not self.ca.get(x, y): | |||||
if self.ca.neighbors(x, y) == 3: | |||||
self.cbuf.set(x, y, 1) | |||||
else: | |||||
self.cbuf.set(x, y, 0) | |||||
else: | |||||
self.cbuf.set(x, y, 0) | |||||
for x in xrange(0, self.ca.height): | |||||
for y in xrange(0, self.ca.width): | |||||
self.ca.set(x, y, self.cbuf.get(x, y)) | |||||
def resetCycle(self): | |||||
self.cycle = 0 | |||||
def randomCells(self): | |||||
for x in xrange(0, self.ca.height): | |||||
for y in xrange(0, self.ca.width): | |||||
self.ca.set(x, y, random.randint(0, 1)) | |||||
def renderCells(self, cv): | |||||
cv.clear() | |||||
cv.set_color_ansi(caca.COLOR_WHITE, caca.COLOR_BLUE) | |||||
cv.put_str(0, 0, " "*cv.get_width()) | |||||
cv.put_str(0, 0, "s: start, p: pause, n: next, r: random cells, z: reset all") | |||||
cv.put_str(0, cv.get_height()-1, " "*cv.get_width()) | |||||
cv.put_str(0, cv.get_height()-1, "generation: %d, population: %d" % (self.cycle, self.ca.population())) | |||||
cv.set_color_ansi(caca.COLOR_DEFAULT, caca.COLOR_BLACK) | |||||
posx = (cv.get_height() - self.height) / 2 | |||||
posy = (cv.get_width() - self.width) / 2 | |||||
for x in xrange(0, self.ca.height): | |||||
for y in xrange(0, self.ca.width): | |||||
if self.ca.get(x, y): | |||||
cv.put_str(posy+y, posx+x, '@') | |||||
def zeroCells(self): | |||||
for x in xrange(0, self.ca.height): | |||||
for y in xrange(0, self.ca.width): | |||||
self.ca.set(x, y, 0) | |||||
if __name__ == "__main__": | |||||
cv = Canvas() | |||||
dp = Display(cv) | |||||
ev = Event() | |||||
app = CellApp(80, 20) | |||||
app.zeroCells() | |||||
while True: | |||||
if dp.get_event(caca.EVENT_KEY_PRESS, ev, 2): | |||||
ch = ev.get_key_ch() | |||||
if ch == ord('q'): | |||||
break | |||||
elif ch == ord('s'): | |||||
app.auto = True | |||||
elif ch == ord('n'): | |||||
app.nextCycle() | |||||
elif ch == ord('r'): | |||||
app.randomCells() | |||||
elif ch == ord('p'): | |||||
if app.auto: | |||||
app.auto = False | |||||
else: | |||||
app.auto = True | |||||
elif ch == ord('z'): | |||||
app.resetCycle() | |||||
app.zeroCells() | |||||
app.auto = False | |||||
if app.auto: | |||||
app.nextCycle() | |||||
app.renderCells(cv) | |||||
dp.refresh() | |||||
time.sleep(0.2) | |||||
@@ -1,860 +0,0 @@ | |||||
/* | |||||
* PypyCaca libcaca Python bindings | |||||
* Copyright (c) 2006 Jean-Yves Lamoureux <jylam@lnxscene.org> | |||||
* 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
*/ | |||||
#include "pypycaca.h" | |||||
static PyMethodDef CacaMethods[] = { | |||||
{"init", pycaca_init, METH_VARARGS, "Init libcaca"}, | |||||
{"set_display_time", pycaca_set_display_time, METH_VARARGS, "Set display time"}, | |||||
{"get_display_time", pycaca_get_display_time, METH_NOARGS, "Get render time"}, | |||||
{"get_width", pycaca_get_width, METH_NOARGS, "Get width"}, | |||||
{"get_height", pycaca_get_height, METH_NOARGS, "Get Height"}, | |||||
{"set_size", pycaca_set_size, METH_VARARGS, "Set size"}, | |||||
{"set_width", pycaca_set_width, METH_VARARGS, "Set width"}, | |||||
{"set_height", pycaca_set_height, METH_VARARGS, "Set height"}, | |||||
{"set_display_title", pycaca_set_display_title, METH_VARARGS, "Set window titl"}, | |||||
{"get_display_width", pycaca_get_display_width, METH_NOARGS, "Get window width"}, | |||||
{"get_display_height", pycaca_get_display_height, METH_NOARGS, "Get Window height"}, | |||||
{"refresh", pycaca_refresh, METH_NOARGS, "Refresh window"}, | |||||
{"end", pycaca_end, METH_NOARGS, "End libcaca"}, | |||||
{"get_feature", pycaca_get_feature, METH_VARARGS, "Get feature"}, | |||||
{"set_feature", pycaca_set_feature, METH_VARARGS, "Set feature"}, | |||||
{"get_feature_name", pycaca_get_feature_name, METH_VARARGS, "Get feature name"}, | |||||
{"get_event", pycaca_get_event, METH_VARARGS, "Get event"}, | |||||
{"wait_event", pycaca_wait_event, METH_VARARGS, "Wait event"}, | |||||
{"get_mouse_x", pycaca_get_mouse_x, METH_NOARGS, "Get Mouse X"}, | |||||
{"get_mouse_y", pycaca_get_mouse_y, METH_NOARGS, "Get mouse Y"}, | |||||
{"draw_line", pycaca_draw_line, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_thin_line", pycaca_draw_thin_line, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_circle", pycaca_draw_circle, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_ellipse", pycaca_draw_ellipse, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_thin_ellipse", pycaca_draw_thin_ellipse, METH_VARARGS, "Init libcaca"}, | |||||
{"fill_ellipse", pycaca_fill_ellipse, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_box", pycaca_draw_box, METH_VARARGS, "Init libcaca"}, | |||||
{"fill_box", pycaca_fill_box, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_thin_box", pycaca_draw_thin_box, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_triangle", pycaca_draw_triangle, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_thin_triangle", pycaca_draw_thin_triangle, METH_VARARGS, "Init libcaca"}, | |||||
{"fill_triangle", pycaca_fill_triangle, METH_VARARGS, "Init libcaca"}, | |||||
{"draw_polyline", pycaca_draw_polyline, METH_VARARGS, ""}, | |||||
{"draw_thin_polyline", pycaca_draw_thin_polyline, METH_VARARGS, ""}, | |||||
{"set_color", pycaca_set_color, METH_VARARGS, "Init libcaca"}, | |||||
{"get_fg_color", pycaca_get_fg_color, METH_VARARGS, ""}, | |||||
{"get_bg_color", pycaca_get_bg_color, METH_VARARGS, ""}, | |||||
{"get_color_name", pycaca_get_color_name, METH_VARARGS, ""}, | |||||
{"putchar", pycaca_putchar, METH_VARARGS, ""}, | |||||
{"putstr", pycaca_putstr, METH_VARARGS, ""}, | |||||
{"printf", pycaca_printf, METH_VARARGS, ""}, | |||||
{"clear", pycaca_clear, METH_VARARGS, ""}, | |||||
{"load_sprite", pycaca_load_sprite, METH_VARARGS, ""}, | |||||
{"draw_sprite", pycaca_draw_sprite, METH_VARARGS, ""}, | |||||
{"get_sprite_frames", pycaca_get_sprite_frames, METH_VARARGS, ""}, | |||||
{"get_sprite_width", pycaca_get_sprite_width, METH_VARARGS, ""}, | |||||
{"get_sprite_height", pycaca_get_sprite_height, METH_VARARGS, ""}, | |||||
{"get_sprite_dx", pycaca_get_sprite_dx, METH_VARARGS, ""}, | |||||
{"get_sprite_dy", pycaca_get_sprite_dy, METH_VARARGS, ""}, | |||||
{"free_sprite", pycaca_free_sprite, METH_VARARGS, ""}, | |||||
{"get_html", pycaca_get_html, METH_VARARGS, ""}, | |||||
{"get_html3", pycaca_get_html3, METH_VARARGS, ""}, | |||||
{"get_irc", pycaca_get_irc, METH_VARARGS, ""}, | |||||
{"get_ansi", pycaca_get_ansi, METH_VARARGS, ""}, | |||||
{"create_bitmap", pycaca_create_bitmap, METH_VARARGS, ""}, | |||||
{"set_bitmap_palette", pycaca_set_bitmap_palette, METH_VARARGS, ""}, | |||||
{"set_bitmap_gamma", pycaca_set_bitmap_gamma, METH_VARARGS, ""}, | |||||
{"draw_bitmap", pycaca_draw_bitmap, METH_VARARGS, ""}, | |||||
{"free_bitmap", pycaca_free_bitmap, METH_VARARGS, ""}, | |||||
// {"", , METH_VARARGS, ""}, | |||||
{NULL, NULL, 0, NULL} /* Sentinel */ | |||||
}; | |||||
PyMODINIT_FUNC | |||||
initcaca(void) | |||||
{ | |||||
PyObject *obj, *dict; | |||||
obj = Py_InitModule("caca", CacaMethods); | |||||
dict = PyModule_GetDict(obj); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_NONE ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_KEY_PRESS ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_KEY_RELEASE ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_MOUSE_PRESS ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_MOUSE_RELEASE ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_MOUSE_MOTION ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_RESIZE ); | |||||
SET_INTCONSTANT(dict,CACA_EVENT_ANY ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_BLACK ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_BLUE ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_GREEN ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_CYAN ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_RED ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_MAGENTA ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_BROWN ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTGRAY ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_DARKGRAY ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTBLUE ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTGREEN ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTCYAN ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTRED ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_LIGHTMAGENTA ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_YELLOW ); | |||||
SET_INTCONSTANT(dict, CACA_COLOR_WHITE ); | |||||
SET_INTCONSTANT(dict, CACA_BACKGROUND ); | |||||
SET_INTCONSTANT(dict, CACA_BACKGROUND_BLACK ); | |||||
SET_INTCONSTANT(dict, CACA_BACKGROUND_SOLID ); | |||||
SET_INTCONSTANT(dict, CACA_BACKGROUND_MIN ); | |||||
SET_INTCONSTANT(dict, CACA_BACKGROUND_MAX ); | |||||
SET_INTCONSTANT(dict, CACA_ANTIALIASING ); | |||||
SET_INTCONSTANT(dict, CACA_ANTIALIASING_NONE ); | |||||
SET_INTCONSTANT(dict, CACA_ANTIALIASING_PREFILTER ); | |||||
SET_INTCONSTANT(dict, CACA_ANTIALIASING_MIN ); | |||||
SET_INTCONSTANT(dict, CACA_ANTIALIASING_MAX ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_NONE ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_ORDERED2 ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_ORDERED4 ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_ORDERED8 ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_RANDOM ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_FSTEIN ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_MIN ); | |||||
SET_INTCONSTANT(dict, CACA_DITHERING_MAX ); | |||||
SET_INTCONSTANT(dict, CACA_FEATURE_UNKNOWN ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_UNKNOWN ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_BACKSPACE ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_TAB ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_RETURN ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_PAUSE ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_ESCAPE ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_DELETE ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_UP ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_DOWN ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_LEFT ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_RIGHT ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_INSERT ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_HOME ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_END ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_PAGEUP ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_PAGEDOWN ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F1 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F2 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F3 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F4 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F5 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F6 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F7 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F8 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F9 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F10 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F11 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F12 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F13 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F14 ); | |||||
SET_INTCONSTANT(dict, CACA_KEY_F15 ); | |||||
} | |||||
/*******************/ | |||||
/* Basic functions */ | |||||
/*******************/ | |||||
static PyObject * | |||||
pycaca_init(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret; | |||||
ret = caca_init(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_set_display_time(PyObject *self, PyObject *args) | |||||
{ | |||||
int value=0; | |||||
if (!PyArg_ParseTuple(args, "i", &value)) | |||||
caca_set_display_time(value); | |||||
return Py_BuildValue("i", 1); /*FIXME*/ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_display_time(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_display_time(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_width(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_width(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_height(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_height(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_set_size(PyObject *self, PyObject *args) | |||||
{ | |||||
int width, height; | |||||
if (!PyArg_ParseTuple(args, "ii", &width, &height)) | |||||
caca_set_size(width, height); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_set_width(PyObject *self, PyObject *args) | |||||
{ | |||||
int width; | |||||
if (!PyArg_ParseTuple(args, "i", &width)); | |||||
caca_set_width(width); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_set_height(PyObject *self, PyObject *args) | |||||
{ | |||||
int height; | |||||
if (!PyArg_ParseTuple(args, "i", &height)); | |||||
caca_set_height(height); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_set_display_title(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret; | |||||
const char *str; | |||||
if (!PyArg_ParseTuple(args, "s", &str)); | |||||
ret = caca_set_display_title(str); | |||||
return Py_BuildValue("i", ret); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_display_width(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_display_width(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_display_height(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_display_height(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_refresh(PyObject *self, PyObject *args) | |||||
{ | |||||
caca_refresh(); | |||||
return Py_BuildValue("i", 1); /*FIXME*/ | |||||
} | |||||
static PyObject * | |||||
pycaca_end(PyObject *self, PyObject *args) | |||||
{ | |||||
caca_end(); | |||||
return Py_BuildValue("i", 1); /*FIXME*/ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_feature(PyObject *self, PyObject *args) | |||||
{ | |||||
int value, ret; | |||||
if (!PyArg_ParseTuple(args, "i", &value)); | |||||
ret = caca_get_feature(value); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_set_feature(PyObject *self, PyObject *args) | |||||
{ | |||||
int value; | |||||
if (!PyArg_ParseTuple(args, "i", &value)); | |||||
caca_set_feature(value); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_feature_name(PyObject *self, PyObject *args) | |||||
{ | |||||
int value; | |||||
char* ret; | |||||
if (!PyArg_ParseTuple(args, "i", &value)); | |||||
ret = (char* const)caca_get_feature_name(value); | |||||
return Py_BuildValue("s", ret); | |||||
} | |||||
/******************/ | |||||
/* Event handling */ | |||||
/******************/ | |||||
static PyObject * | |||||
pycaca_get_event(PyObject *self, PyObject *args) | |||||
{ | |||||
int value, ret; | |||||
if (!PyArg_ParseTuple(args, "i", &value)); | |||||
ret = caca_get_event(value); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_wait_event(PyObject *self, PyObject *args) | |||||
{ | |||||
int value, ret; | |||||
if (!PyArg_ParseTuple(args, "i", &value)); | |||||
ret = caca_get_event(value); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_mouse_x(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_mouse_x(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_mouse_y(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_mouse_y(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
/**********************/ | |||||
/* Primitives drawing */ | |||||
/**********************/ | |||||
static PyObject * | |||||
pycaca_draw_line(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2, y2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2,&c)); | |||||
caca_draw_line(x1,y1,x2,y2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_polyline(PyObject *self, PyObject *args) | |||||
{ | |||||
PyObject *list_x, *list_y, *item; | |||||
int *x, *y, n, lenx, leny, i; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "OOic", &list_x, &list_y, &n, &c)); | |||||
lenx = PySequence_Length(list_x); | |||||
leny = PySequence_Length(list_y); | |||||
x = (int*) malloc(lenx*sizeof(int)); | |||||
y = (int*) malloc(leny*sizeof(int)); | |||||
if((x == NULL) || (y==NULL)) | |||||
return NULL; /* FIXME */ | |||||
for(i=0;i<lenx;i++) | |||||
{ | |||||
item = PySequence_GetItem(list_x, i); | |||||
x[i] = PyInt_AsLong(item); | |||||
} | |||||
for(i=0;i<leny;i++) | |||||
{ | |||||
item = PySequence_GetItem(list_y, i); | |||||
y[i] = PyInt_AsLong(item); | |||||
} | |||||
caca_draw_polyline(x,y,n,c); | |||||
free(x); free(y); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_thin_line(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2, y2; | |||||
if (!PyArg_ParseTuple(args, "iiii", &x1,&y1,&x2,&y2)); | |||||
caca_draw_thin_line(x1,y1,x2,y2); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_thin_polyline(PyObject *self, PyObject *args) | |||||
{ | |||||
PyObject *list_x, *list_y, *item; | |||||
int *x, *y, n, lenx, leny, i; | |||||
if (!PyArg_ParseTuple(args, "OOi", &list_x, &list_y, &n)); | |||||
lenx = PySequence_Length(list_x); | |||||
leny = PySequence_Length(list_y); | |||||
x = (int*) malloc(lenx*sizeof(int)); | |||||
y = (int*) malloc(leny*sizeof(int)); | |||||
if((x == NULL) || (y==NULL)) | |||||
return NULL; /* FIXME */ | |||||
for(i=0;i<lenx;i++) | |||||
{ | |||||
item = PySequence_GetItem(list_x, i); | |||||
x[i] = PyInt_AsLong(item); | |||||
} | |||||
for(i=0;i<leny;i++) | |||||
{ | |||||
item = PySequence_GetItem(list_y, i); | |||||
y[i] = PyInt_AsLong(item); | |||||
} | |||||
caca_draw_thin_polyline(x,y,n); | |||||
free(x); free(y); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_circle(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiic", &x1,&y1,&x2,&c)); | |||||
caca_draw_circle(x1,y1,x2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_ellipse(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2,&c)); | |||||
caca_draw_ellipse(x1,y1,x2,y2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_thin_ellipse(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
if (!PyArg_ParseTuple(args, "iiii", &x1,&y1,&x2,&y2)); | |||||
caca_draw_thin_ellipse(x1,y1,x2,y2); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_fill_ellipse(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2,&c)); | |||||
caca_fill_ellipse(x1,y1,x2,y2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_box(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2,&c)); | |||||
caca_draw_box(x1,y1,x2,y2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_fill_box(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2,&c)); | |||||
caca_fill_box(x1,y1,x2,y2,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_thin_box(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2; | |||||
if (!PyArg_ParseTuple(args, "iiiic", &x1,&y1,&x2,&y2)); | |||||
caca_draw_thin_box(x1,y1,x2,y2); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_triangle(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2, x3, y3; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiiiic", &x1,&y1,&x2,&y2,&x3,&y3,&c)); | |||||
caca_draw_triangle(x1,y1,x2,y2,x3,y3,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_thin_triangle(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2, x3, y3; | |||||
if (!PyArg_ParseTuple(args, "iiiiii", &x1,&y1,&x2,&y2,&x3,&y3)); | |||||
caca_draw_thin_triangle(x1,y1,x2,y2,x3,y3); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_fill_triangle(PyObject *self, PyObject *args) | |||||
{ | |||||
int x1, y1, x2,y2, x3, y3; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iiiiiic", &x1,&y1,&x2,&y2,&x3,&y3,&c)); | |||||
caca_fill_triangle(x1,y1,x2,y2,x3,y3,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
/**********************/ | |||||
/* Character printing */ | |||||
/**********************/ | |||||
static PyObject * | |||||
pycaca_set_color(PyObject *self, PyObject *args) | |||||
{ | |||||
int c1,c2; | |||||
if (!PyArg_ParseTuple(args, "ii", &c1,&c2)); | |||||
caca_set_color(c1,c2); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_fg_color(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_fg_color(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_bg_color(PyObject *self, PyObject *args) | |||||
{ | |||||
int ret = caca_get_bg_color(); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_color_name(PyObject *self, PyObject *args) | |||||
{ | |||||
int c; | |||||
char *ret; | |||||
if (!PyArg_ParseTuple(args, "i", &c)); | |||||
ret = (char *)caca_get_color_name(c); | |||||
return Py_BuildValue("s", ret); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_putchar(PyObject *self, PyObject *args) | |||||
{ | |||||
int x,y; | |||||
char c; | |||||
if (!PyArg_ParseTuple(args, "iic", &x,&y,&c)); | |||||
caca_putchar(x,y,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_putstr(PyObject *self, PyObject *args) | |||||
{ | |||||
int x,y; | |||||
char *c; | |||||
if (!PyArg_ParseTuple(args, "iis", &x,&y,&c)); | |||||
caca_putstr(x,y,c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_printf(PyObject *self, PyObject *args) | |||||
{ | |||||
int x,y; | |||||
char *c; | |||||
if (!PyArg_ParseTuple(args, "iic", &x,&y,&c)); | |||||
caca_putstr(x,y,(char const*)c); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
/*static PyObject * | |||||
caca_get_screen(PyObject *self, PyObject *args);*/ | |||||
static PyObject * | |||||
pycaca_clear(PyObject *self, PyObject *args) | |||||
{ | |||||
caca_clear(); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
/********************/ | |||||
/* Sprite functions */ | |||||
/********************/ | |||||
static PyObject * | |||||
pycaca_load_sprite(PyObject *self, PyObject *args) | |||||
{ | |||||
char *filename; | |||||
struct caca_sprite *ret; | |||||
/*Quick and dirty hack. Gruik.*/ | |||||
if (!PyArg_ParseTuple(args, "s", &filename)); | |||||
ret = (struct caca_sprite*) caca_load_sprite(filename); | |||||
return Py_BuildValue("i", PyCObject_FromVoidPtr(ret, NULL)); | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_sprite(PyObject *self, PyObject *args) | |||||
{ | |||||
int x, y, sprite, frame; | |||||
if (!PyArg_ParseTuple(args, "iiii", &x, &y, &sprite,&frame)); | |||||
caca_draw_sprite(x,y, (struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite), frame); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_get_sprite_frames(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite, ret; | |||||
if (!PyArg_ParseTuple(args, "i", &sprite)); | |||||
ret = caca_get_sprite_frames((struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite)); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_sprite_width(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite, ret, i; | |||||
if (!PyArg_ParseTuple(args, "ii", &sprite, &i)); | |||||
ret = caca_get_sprite_width((struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite),i); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_sprite_height(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite, ret, i; | |||||
if (!PyArg_ParseTuple(args, "ii", &sprite, i)); | |||||
ret = caca_get_sprite_height((struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite),i); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_sprite_dx(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite, ret, i; | |||||
if (!PyArg_ParseTuple(args, "ii", &sprite), &i); | |||||
ret = caca_get_sprite_dx((struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite),i); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_sprite_dy(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite, ret, i; | |||||
if (!PyArg_ParseTuple(args, "ii", &sprite), &i); | |||||
ret = caca_get_sprite_dy((struct caca_sprite const *)PyCObject_AsVoidPtr((void*)sprite),i); | |||||
return Py_BuildValue("i", ret); | |||||
} | |||||
static PyObject * | |||||
pycaca_free_sprite(PyObject *self, PyObject *args) | |||||
{ | |||||
int sprite; | |||||
if (!PyArg_ParseTuple(args, "i", &sprite)); | |||||
caca_free_sprite((struct caca_sprite *)PyCObject_AsVoidPtr((void*)sprite)); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
/*************/ | |||||
/* Exporters */ | |||||
/*************/ | |||||
static PyObject * | |||||
pycaca_get_html(PyObject *self, PyObject *args) | |||||
{ | |||||
if (!PyArg_ParseTuple(args, "")); | |||||
return Py_BuildValue("s",caca_get_html()); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_html3(PyObject *self, PyObject *args) | |||||
{ | |||||
if (!PyArg_ParseTuple(args, "")); | |||||
return Py_BuildValue("s",caca_get_html3()); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_irc(PyObject *self, PyObject *args) | |||||
{ | |||||
if (!PyArg_ParseTuple(args, "")); | |||||
return Py_BuildValue("s",caca_get_irc()); | |||||
} | |||||
static PyObject * | |||||
pycaca_get_ansi(PyObject *self, PyObject *args) | |||||
{ | |||||
int trailing; | |||||
if (!PyArg_ParseTuple(args, "i", &trailing)); | |||||
return Py_BuildValue("s",caca_get_ansi(trailing)); | |||||
} | |||||
/**********/ | |||||
/* Bitmap */ | |||||
/**********/ | |||||
static PyObject * | |||||
pycaca_create_bitmap(PyObject *self, PyObject *args) | |||||
{ | |||||
int a,b,c,d,e,f,g,h; | |||||
struct caca_bitmap *ret; | |||||
if (!PyArg_ParseTuple(args, "iiiiiiii", &a,&b,&c,&d,&e,&f,&g,&h)); | |||||
ret = (struct caca_bitmap*) caca_create_bitmap(a,b,c,d,e,f,g,h); | |||||
return Py_BuildValue("i", PyCObject_FromVoidPtr(ret, NULL)); | |||||
} | |||||
static PyObject * | |||||
pycaca_set_bitmap_palette(PyObject *self, PyObject *args) | |||||
{ | |||||
int bitmap; | |||||
PyObject *list_r, *list_g, *list_b, *list_a, *item; | |||||
unsigned int *r,*g,*b,*a,i; | |||||
if (!PyArg_ParseTuple(args, "iOOOO", &bitmap, &list_r, &list_g, &list_b, &list_a)); | |||||
if((PySequence_Length(list_r)!=256) || | |||||
(PySequence_Length(list_g)!=256) || | |||||
(PySequence_Length(list_b)!=256) || | |||||
(PySequence_Length(list_a)!=256)) | |||||
{ | |||||
PyErr_SetString(PyExc_TypeError, "Lengths of colors lists must be 256"); | |||||
} | |||||
r = malloc(256*sizeof(unsigned int)); | |||||
g = malloc(256*sizeof(unsigned int)); | |||||
b = malloc(256*sizeof(unsigned int)); | |||||
a = malloc(256*sizeof(unsigned int)); | |||||
for(i=0;i<256;i++) | |||||
{ | |||||
item = PySequence_GetItem(list_r, i); | |||||
r[i] = PyInt_AsLong(item); | |||||
item = PySequence_GetItem(list_g, i); | |||||
g[i] = PyInt_AsLong(item); | |||||
item = PySequence_GetItem(list_b, i); | |||||
b[i] = PyInt_AsLong(item); | |||||
item = PySequence_GetItem(list_a, i); | |||||
a[i] = PyInt_AsLong(item); | |||||
} | |||||
caca_set_bitmap_palette((struct caca_bitmap *)PyCObject_AsVoidPtr((void*)bitmap), r,g,b,a); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_set_bitmap_gamma(PyObject *self, PyObject *args) | |||||
{ | |||||
int bitmap; | |||||
float value; | |||||
if (!PyArg_ParseTuple(args, "if", &bitmap, &value)); | |||||
caca_set_bitmap_gamma((struct caca_bitmap *)PyCObject_AsVoidPtr((void*)bitmap),value); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_draw_bitmap(PyObject *self, PyObject *args) | |||||
{ | |||||
PyObject *pixels, *item; | |||||
int bitmap, x1,x2,y1,y2; | |||||
unsigned char *buffer; | |||||
int i; | |||||
if (!PyArg_ParseTuple(args, "iiiiiO", &x1,&y1,&x2,&y2,&bitmap,&pixels)); | |||||
buffer = malloc(PySequence_Length(pixels)*sizeof(unsigned char)); | |||||
for(i=0;i<PySequence_Length(pixels);i++) | |||||
{ | |||||
item = PySequence_GetItem(pixels, i); | |||||
buffer[i] = (unsigned char)PyInt_AsLong(item); | |||||
} | |||||
caca_draw_bitmap(x1,y1,x2,y2, (struct caca_bitmap *)PyCObject_AsVoidPtr((void*)bitmap), (void*)buffer); | |||||
free(buffer); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
static PyObject * | |||||
pycaca_free_bitmap(PyObject *self, PyObject *args) | |||||
{ | |||||
int bitmap; | |||||
if (!PyArg_ParseTuple(args, "i", &bitmap)); | |||||
caca_free_bitmap((struct caca_bitmap *)PyCObject_AsVoidPtr((void*)bitmap)); | |||||
return Py_BuildValue("i", 1); /* FIXME */ | |||||
} | |||||
/* | |||||
void caca_draw_bitmap(int, int, int, int, struct caca_bitmap const *, void *); | |||||
*/ |
@@ -1,159 +0,0 @@ | |||||
/* | |||||
* PypyCaca libcaca Python bindings | |||||
* Copyright (c) 2006 Jean-Yves Lamoureux <jylam@lnxscene.org> | |||||
* 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://sam.zoy.org/wtfpl/COPYING for more details. | |||||
*/ | |||||
#include <Python.h> | |||||
#include <caca.h> | |||||
#define SET_INTCONSTANT(dict, value) \ | |||||
PyDict_SetItemString(dict, #value, PyInt_FromLong((long) value)) | |||||
PyMODINIT_FUNC initcaca(void); | |||||
/* Basic functions */ | |||||
static PyObject * | |||||
pycaca_init(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_display_time(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_display_time(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_width(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_height(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_size(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_width(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_height(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_display_title(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_display_width(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_display_height(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_refresh(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_end(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_feature(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_feature(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_feature_name(PyObject *self, PyObject *args); | |||||
/* Event handling */ | |||||
static PyObject * | |||||
pycaca_get_event(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_wait_event(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_mouse_x(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_mouse_y(PyObject *self, PyObject *args); | |||||
/* Primitives drawing */ | |||||
static PyObject * | |||||
pycaca_draw_line(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_polyline(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_thin_polyline(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_thin_line(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_circle(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_ellipse(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_thin_ellipse(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_fill_ellipse(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_box(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_fill_box(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_thin_box(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_triangle(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_thin_triangle(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_fill_triangle(PyObject *self, PyObject *args); | |||||
/* Charactere drawing */ | |||||
static PyObject * | |||||
pycaca_set_color(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_fg_color(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_bg_color(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_color_name(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_putchar(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_putstr(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_printf(PyObject *self, PyObject *args); | |||||
/*static PyObject * | |||||
pycaca_get_screen(PyObject *self, PyObject *args);*/ | |||||
static PyObject * | |||||
pycaca_clear(PyObject *self, PyObject *args); | |||||
/* Sprites functions */ | |||||
static PyObject * | |||||
pycaca_load_sprite(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_sprite(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_sprite_frames(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_sprite_width(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_sprite_height(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_sprite_dx(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_sprite_dy(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_free_sprite(PyObject *self, PyObject *args); | |||||
/* Exporters */ | |||||
static PyObject * | |||||
pycaca_get_html(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_html3(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_irc(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_get_ansi(PyObject *self, PyObject *args); | |||||
/* Bitmap functions */ | |||||
static PyObject * | |||||
pycaca_create_bitmap(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_bitmap_palette(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_set_bitmap_gamma(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_draw_bitmap(PyObject *self, PyObject *args); | |||||
static PyObject * | |||||
pycaca_free_bitmap(PyObject *self, PyObject *args); |
@@ -0,0 +1,12 @@ | |||||
#!/usr/bin/env python | |||||
from setuptools import setup | |||||
setup( | |||||
name='caca', | |||||
version='0.0', | |||||
packages=['caca'], | |||||
package_dir={ | |||||
'caca': 'caca', | |||||
}, | |||||
) |
@@ -1,167 +0,0 @@ | |||||
#!/usr/bin/env python | |||||
# | |||||
# snake.py | |||||
# Playing with ctypes and libcaca | |||||
# http://mornie.org/blog/2007/03/25/Playng-with-ctypes-and-libcaca/ | |||||
# | |||||
# Copyright (C) 2007 Daniele Tricoli aka Eriol <eriol@mornie.org> | |||||
# | |||||
# This program is free software; you can redistribute it and/or | |||||
# modify it under the terms of the GNU General Public License | |||||
# as published by the Free Software Foundation; either version 2 | |||||
# of the License, or (at your option) any later version. | |||||
# | |||||
# This program is distributed in the hope that it will be useful, | |||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
# GNU General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU General Public License | |||||
# along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
# | |||||
# -- Changelog | |||||
# * 23/03/07 | |||||
# Initial release | |||||
# * 20/10/07 | |||||
# Applied patch by Sam Hocevar: check for caca_get_event's return value | |||||
# and added caca_event's missing first member | |||||
# * 25/10/07 | |||||
# Updated for newer libcaca API (Sam Hocevar) | |||||
import ctypes as C | |||||
import random | |||||
import sys | |||||
import time | |||||
CANVAS_WIDTH = 80 | |||||
CANVAS_HEIGHT = 40 | |||||
CENTER_X = CANVAS_WIDTH / 2 | |||||
CENTER_Y = CANVAS_HEIGHT / 2 | |||||
UP = 273 | |||||
DOWN = 274 | |||||
LEFT = 275 | |||||
RIGHT = 276 | |||||
class ev(C.Structure): | |||||
_fields_ = [('opaque_structure', C.c_char_p * 32)] | |||||
class Snake(object): | |||||
def __init__(self, center_point, length): | |||||
self.head = center_point | |||||
self.body = [] | |||||
for y in xrange(self.head[1] + 1, self.head[1] + length + 1): | |||||
self.body.append((self.head[0], y)) | |||||
def move(self, direction): | |||||
phead = tuple(self.head) | |||||
if direction == 'UP': | |||||
self.head[1] -=1 | |||||
elif direction == 'DOWN': | |||||
self.head[1] +=1 | |||||
elif direction == 'LEFT': | |||||
self.head[0] -=1 | |||||
elif direction == 'RIGHT': | |||||
self.head[0] +=1 | |||||
self.body = [phead] + self.body[:-1] | |||||
def grow(self): | |||||
self.body += [tuple(self.head)] * 2 | |||||
def draw(self): | |||||
global cv | |||||
lcaca.caca_set_color_ansi(cv, 0x05, 0x00) | |||||
for p in self.body: | |||||
lcaca.caca_put_char(cv, p[0], p[1], ord('o')) | |||||
lcaca.caca_set_color_ansi(cv, 0x02, 0x00) | |||||
lcaca.caca_put_char(cv, self.head[0], self.head[1], ord('@')) | |||||
lcaca.caca_refresh_display(dp) | |||||
class Target(object): | |||||
def __init__(self): | |||||
self.total = 0 | |||||
def random(self, width, height): | |||||
self.x = int(random.uniform(1, width)) | |||||
self.y = int(random.uniform(1, height)) | |||||
self.value = random.choice(range(1,10)) | |||||
def sum(self): | |||||
self.total += self.value | |||||
def draw(self): | |||||
global cv | |||||
lcaca.caca_set_color_ansi(cv, 0x03, 0x00) | |||||
lcaca.caca_put_char(cv, self.x, self.y, ord(str(self.value))) | |||||
lcaca.caca_refresh_display(dp) | |||||
def draw_border(): | |||||
lcaca.caca_set_color_ansi(cv, 0x04, 0x00) | |||||
lcaca.caca_draw_box(cv, | |||||
0, | |||||
0, | |||||
CANVAS_WIDTH - 1, | |||||
CANVAS_HEIGHT - 1, | |||||
ord('#')) | |||||
event = ev() | |||||
lcaca = C.cdll.LoadLibrary('libcaca.so.0') | |||||
cv = lcaca.caca_create_canvas(CANVAS_WIDTH, CANVAS_HEIGHT) | |||||
dp = lcaca.caca_create_display(cv) | |||||
lcaca.caca_set_display_title(dp, "snake.py - playing with ctypes and libcaca") | |||||
s = Snake([CENTER_X, CENTER_Y], 5) | |||||
t = Target() | |||||
t.random(CANVAS_WIDTH - 2, CANVAS_HEIGHT - 2) | |||||
draw_border() | |||||
s.draw() | |||||
t.draw() | |||||
lcaca.caca_get_event(dp, 0x0001, C.byref(event), -1) | |||||
while True: | |||||
while lcaca.caca_get_event(dp, 0x0001, C.byref(event), 0): | |||||
ch = lcaca.caca_get_event_key_ch(C.byref(event)) | |||||
if ch == 113: # 'q' pressed | |||||
sys.exit() | |||||
elif ch == UP: | |||||
d = 'UP' | |||||
elif ch == DOWN: | |||||
d = 'DOWN' | |||||
elif ch == LEFT: | |||||
d = 'LEFT' | |||||
elif ch == RIGHT: | |||||
d = 'RIGHT' | |||||
try: | |||||
s.move(d) | |||||
except NameError: | |||||
pass | |||||
if (tuple(s.head) in s.body[1:] or | |||||
not 0 < s.head[0] < CANVAS_WIDTH - 1 or | |||||
not 0 < s.head[1] < CANVAS_HEIGHT - 1): | |||||
print 'Game Over!' | |||||
print 'Total score:', t.total | |||||
sys.exit() | |||||
elif tuple(s.head) == (t.x, t.y): | |||||
t.sum() | |||||
t.random(CANVAS_WIDTH - 2, CANVAS_HEIGHT - 2) | |||||
s.grow() | |||||
lcaca.caca_clear_canvas(cv) | |||||
draw_border() | |||||
s.draw() | |||||
t.draw() | |||||
time.sleep(0.1) |
@@ -1,114 +0,0 @@ | |||||
#!/usr/bin/python2.4 | |||||
import caca | |||||
import math | |||||
from random import Random | |||||
from math import * | |||||
ret = caca.init() | |||||
print "caca.init() returned ", ret | |||||
print "Window size is ",caca.get_window_width(),"x",caca.get_window_height() | |||||
print "Buffer size is ",caca.get_width(),"x",caca.get_height() | |||||
caca.set_size(80,25) | |||||
print "Buffer size is now",caca.get_width(),"x",caca.get_height() | |||||
print "Feature name for CACA_DITHERING_FSTEIN is "+caca.get_feature_name(caca.CACA_DITHERING_FSTEIN) | |||||
sprite = int(caca.load_sprite("./caca.txt")) | |||||
rand = Random() | |||||
i = 0 | |||||
while caca.get_event(caca.CACA_EVENT_KEY_PRESS) != caca.CACA_EVENT_KEY_PRESS|caca.CACA_KEY_ESCAPE: | |||||
i=i+1; | |||||
caca.clear(); | |||||
caca.set_color(caca.CACA_COLOR_YELLOW, caca.CACA_COLOR_BLACK); | |||||
xo = caca.get_width() / 4; | |||||
yo = caca.get_height() / 4 + 5 * sin(0.03*i); | |||||
for j in range(0,16): | |||||
xa = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + 3.1415*j/8); | |||||
ya = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + 3.1415*j/8); | |||||
caca.draw_thin_line(int(xo), int(yo), int(xa), int(ya)); | |||||
j = 15 + sin(0.03*i) * 8; | |||||
caca.set_color(caca.CACA_COLOR_WHITE, caca.CACA_COLOR_BLACK); | |||||
caca.fill_ellipse(int(xo), int(yo), int(j), int(j / 2), '#'); | |||||
caca.set_color(caca.CACA_COLOR_YELLOW, caca.CACA_COLOR_BLACK); | |||||
caca.draw_ellipse(xo, yo, j, j / 2, '0'); | |||||
xo = caca.get_width() * 5 / 8; | |||||
yo = 2; | |||||
xa = caca.get_width() / 8 + sin(0.03*i) * 5; | |||||
ya = caca.get_height() / 2 + cos(0.03*i) * 5; | |||||
xb = caca.get_width() - 10 - cos(0.02*i) * 10; | |||||
yb = caca.get_height() * 3 / 4 - 5 + sin(0.02*i) * 5; | |||||
xc = caca.get_width() / 4 - sin(0.02*i) * 5; | |||||
yc = caca.get_height() * 3 / 4 + cos(0.02*i) * 5; | |||||
caca.set_color(caca.CACA_COLOR_GREEN, caca.CACA_COLOR_BLACK); | |||||
caca.fill_triangle(xo, yo, xb, yb, xa, ya, '%'); | |||||
caca.set_color(caca.CACA_COLOR_YELLOW, caca.CACA_COLOR_BLACK); | |||||
caca.draw_thin_triangle(xo, yo, xb, yb, xa, ya); | |||||
caca.set_color(caca.CACA_COLOR_RED, caca.CACA_COLOR_BLACK); | |||||
caca.fill_triangle(xa, ya, xb, yb, xc, yc, ' '); | |||||
caca.set_color(caca.CACA_COLOR_YELLOW, caca.CACA_COLOR_BLACK); | |||||
caca.draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||||
caca.set_color(caca.CACA_COLOR_BLUE, caca.CACA_COLOR_BLACK); | |||||
caca.fill_triangle(xo, yo, xb, yb, xc, yc, '%'); | |||||
caca.set_color(caca.CACA_COLOR_YELLOW, caca.CACA_COLOR_BLACK); | |||||
caca.draw_thin_triangle(xo, yo, xb, yb, xc, yc); | |||||
xa = 2; | |||||
ya = 2; | |||||
xb = caca.get_width() - 3; | |||||
yb = caca.get_height() / 2; | |||||
xc = caca.get_width() / 3; | |||||
yc = caca.get_height() - 3; | |||||
caca.set_color(caca.CACA_COLOR_CYAN, caca.CACA_COLOR_BLACK); | |||||
caca.draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||||
xo = caca.get_width() / 2 + cos(0.027*i) * caca.get_width() / 3; | |||||
yo = caca.get_height() / 2 - sin(0.027*i) * caca.get_height() / 2; | |||||
caca.draw_thin_line(xa, ya, xo, yo); | |||||
caca.draw_thin_line(xb, yb, xo, yo); | |||||
caca.draw_thin_line(xc, yc, xo, yo); | |||||
caca.draw_sprite(xo, yo, sprite, 0); | |||||
for j in range(i - 60, i): | |||||
delta = (rand.random()*10)-5; | |||||
caca.set_color(rand.random()*15, rand.random()*15); | |||||
caca.putchar(caca.get_width() / 2 | |||||
+ cos(0.02*j) * (delta + caca.get_width() / 4), | |||||
caca.get_height() / 2 | |||||
+ sin(0.02*j) * (delta + caca.get_height() / 3), | |||||
' '); | |||||
caca.draw_sprite(caca.get_width() / 2 + cos(0.02*i) * caca.get_width() / 4, | |||||
caca.get_height() / 2 + sin(0.02*i) * caca.get_height() / 3, | |||||
int(sprite), int(0)); | |||||
caca.refresh(); | |||||
caca.end() |
@@ -1,56 +0,0 @@ | |||||
#!/usr/bin/python2.3 | |||||
import caca | |||||
import math | |||||
from random import Random | |||||
from math import * | |||||
import Numeric as N | |||||
ret = caca.init() | |||||
r = N.zeros(256) | |||||
g = N.zeros(256) | |||||
b = N.zeros(256) | |||||
a = N.zeros(256) | |||||
rand = Random() | |||||
# Our pixel array | |||||
pixels = N.zeros(32*32*4) | |||||
#pixels = pixelst.tolist() | |||||
for i in range(0,256): | |||||
r[i] = i | |||||
g[i] = i | |||||
b[i] = i | |||||
a[i] = 128 | |||||
bitmap = caca.create_bitmap(32,32,32,32*4,0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000) | |||||
#caca.set_bitmap_palette(bitmap, r, g, b, a) | |||||
color = 0 | |||||
while caca.get_event(caca.CACA_EVENT_KEY_PRESS) != caca.CACA_EVENT_KEY_PRESS|caca.CACA_KEY_ESCAPE: | |||||
for y in range(0,32): | |||||
for x in range(0,(32*4), 4): | |||||
offset = x + y * (32*4) | |||||
pixels[offset] = rand.random()*256 | |||||
pixels[offset+1] = rand.random()*256 | |||||
pixels[offset+2] = rand.random()*256 | |||||
pixels[offset+3] = 128 | |||||
color = color + 1 | |||||
caca.draw_bitmap(0,0,caca.get_width() - 1, caca.get_height() - 1, | |||||
bitmap, pixels) | |||||
caca.refresh(); | |||||
caca.end(); |