|
@@ -17,6 +17,7 @@ |
|
|
import ctypes |
|
|
import ctypes |
|
|
|
|
|
|
|
|
from caca import _lib |
|
|
from caca import _lib |
|
|
|
|
|
from caca.canvas import _Canvas |
|
|
|
|
|
|
|
|
class _Dither(object): |
|
|
class _Dither(object): |
|
|
""" Model for Dither object. |
|
|
""" Model for Dither object. |
|
@@ -40,10 +41,10 @@ class _Dither(object): |
|
|
def _free(self): |
|
|
def _free(self): |
|
|
""" Free a libcaca dither. |
|
|
""" Free a libcaca dither. |
|
|
""" |
|
|
""" |
|
|
_lib.caca_free_font.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_free_font.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
_lib.caca_free_dither.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_free_dither.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
return _lib.caca_free_font(self) |
|
|
|
|
|
|
|
|
return _lib.caca_free_dither(self) |
|
|
|
|
|
|
|
|
class Dither(_Dither): |
|
|
class Dither(_Dither): |
|
|
""" Dither object, methods are libcaca functions with caca_dither_t as first |
|
|
""" Dither object, methods are libcaca functions with caca_dither_t as first |
|
@@ -61,5 +62,283 @@ class Dither(_Dither): |
|
|
bmask -- bitmask for blue values |
|
|
bmask -- bitmask for blue values |
|
|
amask -- bitmask for alpha values |
|
|
amask -- bitmask for alpha values |
|
|
""" |
|
|
""" |
|
|
pass |
|
|
|
|
|
|
|
|
_lib.caca_create_dither.argtypes = [ |
|
|
|
|
|
ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int, |
|
|
|
|
|
ctypes.c_uint, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint, |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
self._dither = _lib.caca_create_dither(bpp, width, height, pitch, |
|
|
|
|
|
bmask, gmask, rmask, amask) |
|
|
|
|
|
|
|
|
|
|
|
if self._dither == 0: |
|
|
|
|
|
raise DitherError, "Failed to create dither object" |
|
|
|
|
|
|
|
|
|
|
|
def set_palette(self, red, green, blue, alpha): |
|
|
|
|
|
""" Set the palette of an 8 bits per pixel bitmap. Values should be |
|
|
|
|
|
between 0 and 4095 (0xfff). |
|
|
|
|
|
|
|
|
|
|
|
red -- array of 256 red values |
|
|
|
|
|
green -- array of 256 green values |
|
|
|
|
|
blue -- array of 256 blue values |
|
|
|
|
|
alpha -- array of 256 alpha values |
|
|
|
|
|
""" |
|
|
|
|
|
raise DitherError, "Not implemented" |
|
|
|
|
|
|
|
|
|
|
|
def set_brightness(self, brightness): |
|
|
|
|
|
""" Set the brightness of the dither object. |
|
|
|
|
|
|
|
|
|
|
|
brightness -- brightness value |
|
|
|
|
|
""" |
|
|
|
|
|
if isinstance(brightness, int): |
|
|
|
|
|
brightness = float(brightness) |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_set_dither_brightness.argtypes = [_Dither, ctypes.c_float] |
|
|
|
|
|
_lib.caca_set_dither_brightness.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_brightness(self, brightness) |
|
|
|
|
|
|
|
|
|
|
|
def get_brightness(self): |
|
|
|
|
|
""" Get the brightness of the dither object. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_brightness.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_brightness.restype = ctypes.c_float |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_brightness(self) |
|
|
|
|
|
|
|
|
|
|
|
def set_gamma(self, gamma): |
|
|
|
|
|
""" Set the gamma of the dither object. A negative value causes colour |
|
|
|
|
|
inversion. |
|
|
|
|
|
|
|
|
|
|
|
gamma -- gamma value |
|
|
|
|
|
""" |
|
|
|
|
|
if isinstance(gamma, int): |
|
|
|
|
|
gamma = float(gamma) |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_set_dither_gamma.argtypes = [_Dither, ctypes.c_float] |
|
|
|
|
|
_lib.caca_set_dither_gamma.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_gamma(self, gamma) |
|
|
|
|
|
|
|
|
|
|
|
def get_gamma(self): |
|
|
|
|
|
""" Get the gamma of the dither object. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_gamma.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_gamma.restype = ctypes.c_float |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_gamma(self) |
|
|
|
|
|
|
|
|
|
|
|
def set_contrast(self, contrast): |
|
|
|
|
|
""" Set the contrast of dither. |
|
|
|
|
|
|
|
|
|
|
|
contrast -- contrast value |
|
|
|
|
|
""" |
|
|
|
|
|
if isinstance(contrast, int): |
|
|
|
|
|
contrast = float(contrast) |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_set_dither_contrast.argtypes = [_Dither, ctypes.c_float] |
|
|
|
|
|
_lib.caca_set_dither_contrast.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_contrast(self, contrast) |
|
|
|
|
|
|
|
|
|
|
|
def get_contrast(self): |
|
|
|
|
|
""" Get the contrast of the dither object. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_contrast.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_contrast.restype = ctypes.c_float |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_contrast(self) |
|
|
|
|
|
|
|
|
|
|
|
def set_antialias(self, value): |
|
|
|
|
|
""" Set dither antialiasing. |
|
|
|
|
|
|
|
|
|
|
|
value -- A string describing the antialiasing method that will |
|
|
|
|
|
be used for the dithering. |
|
|
|
|
|
|
|
|
|
|
|
+ "none": no antialiasing |
|
|
|
|
|
+ "prefilter" or "default": simple prefilter antialiasing. (default) |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_set_dither_antialias.argtypes = [_Dither, ctypes.c_char_p] |
|
|
|
|
|
_lib.caca_set_dither_antialias.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_antialias(self, value) |
|
|
|
|
|
|
|
|
|
|
|
def get_antialias(self): |
|
|
|
|
|
""" Return the dither's current antialiasing method. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_antialias.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_antialias.restype = ctypes.c_char_p |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_antialias(self) |
|
|
|
|
|
|
|
|
|
|
|
def get_antialias_list(self): |
|
|
|
|
|
""" Get available antialiasing methods. |
|
|
|
|
|
""" |
|
|
|
|
|
lst = [] |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_get_dither_antialias_list.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_antialias_list.restype = ctypes.POINTER(ctypes.c_char_p) |
|
|
|
|
|
|
|
|
|
|
|
for item in _lib.caca_get_dither_antialias_list(self): |
|
|
|
|
|
if item is not None and item != "": |
|
|
|
|
|
lst.append(item) |
|
|
|
|
|
else: |
|
|
|
|
|
#memory occurs otherwise |
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
return lst |
|
|
|
|
|
|
|
|
|
|
|
def set_color(self, value): |
|
|
|
|
|
""" Choose colours used for dithering. |
|
|
|
|
|
|
|
|
|
|
|
value -- A string describing the colour set that will be |
|
|
|
|
|
used for the dithering. |
|
|
|
|
|
|
|
|
|
|
|
+ "mono": use light gray on a black background |
|
|
|
|
|
+ "gray": use white and two shades of gray on a black background |
|
|
|
|
|
+ "8": use the 8 ANSI colours on a black background |
|
|
|
|
|
+ "16": use the 16 ANSI colours on a black background |
|
|
|
|
|
+ "fullgray": use black, white and two shades of gray |
|
|
|
|
|
for both the characters and the background |
|
|
|
|
|
+ "full8": use the 8 ANSI colours for both the characters and |
|
|
|
|
|
the background |
|
|
|
|
|
+ "full16" or "default": use the 16 ANSI colours for both the |
|
|
|
|
|
characters and the background (default) |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_set_dither_color.argtypes = [_Dither, ctypes.c_char_p] |
|
|
|
|
|
_lib.caca_set_dither_color.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_color(self, value) |
|
|
|
|
|
|
|
|
|
|
|
def get_color(self): |
|
|
|
|
|
""" Get current colour mode. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_color.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_color.restype = ctypes.c_char_p |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_color(self) |
|
|
|
|
|
|
|
|
|
|
|
def get_color_list(self): |
|
|
|
|
|
""" Get available colour modes. |
|
|
|
|
|
""" |
|
|
|
|
|
lst = [] |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_get_dither_color_list.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_color_list.restype = ctypes.POINTER(ctypes.c_char_p) |
|
|
|
|
|
|
|
|
|
|
|
for item in _lib.caca_get_dither_color_list(self): |
|
|
|
|
|
if item is not None and item != "": |
|
|
|
|
|
lst.append(item) |
|
|
|
|
|
else: |
|
|
|
|
|
#memory occurs otherwise |
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
return lst |
|
|
|
|
|
|
|
|
|
|
|
def set_charset(self, value): |
|
|
|
|
|
""" Choose characters used for dithering. |
|
|
|
|
|
|
|
|
|
|
|
value -- A string describing the characters that need to be |
|
|
|
|
|
used for the dithering. |
|
|
|
|
|
|
|
|
|
|
|
+ "ascii" or "default": use only ASCII characters (default). |
|
|
|
|
|
+ "shades": use Unicode characters "U+2591 LIGHT SHADE", |
|
|
|
|
|
"U+2592 MEDIUM SHADE" and "U+2593 DARK SHADE". These characters are |
|
|
|
|
|
also present in the CP437 codepage available on DOS and VGA. |
|
|
|
|
|
+ "blocks": use Unicode quarter-cell block combinations. |
|
|
|
|
|
These characters are only found in the Unicode set. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_set_dither_charset.argtypes = [_Dither, ctypes.c_char_p] |
|
|
|
|
|
_lib.caca_set_dither_charset.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_charset(self, value) |
|
|
|
|
|
|
|
|
|
|
|
def get_charset(self): |
|
|
|
|
|
""" Get current character set. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_charset.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_charset.restype = ctypes.c_char_p |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_charset(self) |
|
|
|
|
|
|
|
|
|
|
|
def get_charset_list(self): |
|
|
|
|
|
""" Get available dither character sets. |
|
|
|
|
|
""" |
|
|
|
|
|
lst = [] |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_get_dither_color_list.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_color_list.restype = ctypes.POINTER(ctypes.c_char_p) |
|
|
|
|
|
|
|
|
|
|
|
for item in _lib.caca_get_dither_color_list(self): |
|
|
|
|
|
if item is not None and item != "": |
|
|
|
|
|
lst.append(item) |
|
|
|
|
|
else: |
|
|
|
|
|
#memory occurs otherwise |
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
return lst |
|
|
|
|
|
|
|
|
|
|
|
def set_algorithm(self, value): |
|
|
|
|
|
""" Set dithering algorithm. |
|
|
|
|
|
|
|
|
|
|
|
value -- A string describing the algorithm that needs to be |
|
|
|
|
|
used for the dithering. |
|
|
|
|
|
|
|
|
|
|
|
+ "none": no dithering is used, the nearest matching colour is used. |
|
|
|
|
|
+ "ordered2": use a 2x2 Bayer matrix for dithering. |
|
|
|
|
|
+ "ordered4": use a 4x4 Bayer matrix for dithering. |
|
|
|
|
|
+ "ordered8": use a 8x8 Bayer matrix for dithering. |
|
|
|
|
|
+ "random": use random dithering. |
|
|
|
|
|
+ "fstein": use Floyd-Steinberg dithering (default). |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_set_dither_algorithm.argtypes = [_Dither, ctypes.c_char_p] |
|
|
|
|
|
_lib.caca_set_dither_algorithm.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_set_dither_algorithm(self, value) |
|
|
|
|
|
|
|
|
|
|
|
def get_algorithm(self): |
|
|
|
|
|
""" Get dithering algorithms. |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_get_dither_algorithm.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_algorithm.restype = ctypes.c_char_p |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_get_dither_algorithm(self) |
|
|
|
|
|
|
|
|
|
|
|
def get_algorithm_list(self): |
|
|
|
|
|
""" Get dithering algorithms. |
|
|
|
|
|
""" |
|
|
|
|
|
lst = [] |
|
|
|
|
|
|
|
|
|
|
|
_lib.caca_get_dither_color_list.argtypes = [_Dither] |
|
|
|
|
|
_lib.caca_get_dither_color_list.restype = ctypes.POINTER(ctypes.c_char_p) |
|
|
|
|
|
|
|
|
|
|
|
for item in _lib.caca_get_dither_color_list(self): |
|
|
|
|
|
if item is not None and item != "": |
|
|
|
|
|
lst.append(item) |
|
|
|
|
|
else: |
|
|
|
|
|
#memory occurs otherwise |
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
return lst |
|
|
|
|
|
|
|
|
|
|
|
def bitmap(self, canvas, x, y, width, height, pixels): |
|
|
|
|
|
""" Dither a bitmap on the canvas. |
|
|
|
|
|
|
|
|
|
|
|
canvas -- a handle to libcaca canvas |
|
|
|
|
|
x -- X coordinate of the upper-left corner of the drawing area |
|
|
|
|
|
y -- Y coordinate of the upper-left corner of the drawing area |
|
|
|
|
|
width -- width of the drawing area |
|
|
|
|
|
height -- height of the drawing area |
|
|
|
|
|
pixels -- bitmap's pixels |
|
|
|
|
|
""" |
|
|
|
|
|
_lib.caca_dither_bitmap.argtypes = [ |
|
|
|
|
|
_Canvas, ctypes.c_int, ctypes.c_int, |
|
|
|
|
|
ctypes.c_int, ctypes.c_int, _Dither, |
|
|
|
|
|
ctypes.c_char_p |
|
|
|
|
|
] |
|
|
|
|
|
_lib.caca_dither_bitmap.restype = ctypes.c_int |
|
|
|
|
|
|
|
|
|
|
|
return _lib.caca_dither_bitmap(canvas, x, y, width, height, self, pixels) |
|
|
|
|
|
|
|
|
|
|
|
class DitherError(Exception): |
|
|
|
|
|
pass |
|
|
|
|
|
|