"Fossies" - the Fresh Open Source Software Archive

Member "libcaca-0.99.beta20/python/caca/dither.py" (21 Apr 2017, 12172 Bytes) of package /linux/privat/libcaca-0.99.beta20.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 # -*- coding: utf-8 -*-
    2 #
    3 # libcaca       Colour ASCII-Art library
    4 #               Python language bindings
    5 # Copyright (c) 2010 Alex Foulon <alxf@lavabit.com>
    6 #               All Rights Reserved
    7 #
    8 # This library is free software. It comes without any warranty, to
    9 # the extent permitted by applicable law. You can redistribute it
   10 # and/or modify it under the terms of the Do What the Fuck You Want
   11 # to Public License, Version 2, as published by Sam Hocevar. See
   12 # http://www.wtfpl.net/ for more details.
   13 #
   14 
   15 """ Libcaca Python bindings """
   16 
   17 import ctypes
   18 
   19 from caca import _lib
   20 from caca.canvas import _Canvas
   21 
   22 
   23 class _DitherStruct(ctypes.Structure):
   24     pass
   25 
   26 class _Dither(object):
   27     """ Model for Dither object.
   28     """
   29     def __init__(self):
   30         self._dither = None
   31 
   32     def from_param(self):
   33         """ Required by ctypes module to call object as parameter of
   34             a C function.
   35         """
   36         return self._dither
   37 
   38     def __del__(self):
   39         if self._dither:
   40             self._free()
   41 
   42     def __str__(self):
   43         return "<CacaDither>"
   44 
   45     def _free(self):
   46         """ Free a libcaca dither.
   47         """
   48         _lib.caca_free_dither.argtypes = [_Dither]
   49         _lib.caca_free_dither.restype = ctypes.c_int
   50 
   51         return _lib.caca_free_dither(self)
   52 
   53 class Dither(_Dither):
   54     """ Dither object, methods are libcaca functions with caca_dither_t as first
   55         argument.
   56     """
   57     def __init__(self, bpp, width, height, pitch, rmask, gmask, bmask, amask):
   58         """ Dither constructor
   59 
   60             bpp     -- bitmap depth in bits per pixels
   61             width   -- bitmap width in pixels
   62             height  -- bitmap height in pixels
   63             pitch   -- bitmap pitch in bytes
   64             rmask   -- bitmask for red values
   65             gmask   -- bitmask for green values
   66             bmask   -- bitmask for blue values
   67             amask   -- bitmask for alpha values
   68         """
   69         _lib.caca_create_dither.argtypes = [
   70             ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int,
   71             ctypes.c_uint, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint,
   72         ]
   73         _lib.caca_create_dither.restype = ctypes.POINTER(_DitherStruct)
   74 
   75         self._dither = _lib.caca_create_dither(bpp, width, height, pitch,
   76                                                rmask, gmask, bmask, amask)
   77 
   78         if self._dither == 0:
   79             raise DitherError("Failed to create dither object")
   80 
   81     def set_palette(self, red, green, blue, alpha):
   82         """ Set the palette of an 8 bits per pixel bitmap. Values should be
   83         between 0 and 4095 (0xfff).
   84 
   85             red     -- array of 256 red values
   86             green   -- array of 256 green values
   87             blue    -- array of 256 blue values
   88             alpha   -- array of 256 alpha values
   89         """
   90         raise DitherError("Not implemented")
   91 
   92     def set_brightness(self, brightness):
   93         """ Set the brightness of the dither object.
   94 
   95             brightness  -- brightness value
   96         """
   97         if isinstance(brightness, int):
   98             brightness = float(brightness)
   99 
  100         _lib.caca_set_dither_brightness.argtypes = [_Dither, ctypes.c_float]
  101         _lib.caca_set_dither_brightness.restype  = ctypes.c_int
  102 
  103         return _lib.caca_set_dither_brightness(self, brightness)
  104 
  105     def get_brightness(self):
  106         """ Get the brightness of the dither object.
  107         """
  108         _lib.caca_get_dither_brightness.argtypes = [_Dither]
  109         _lib.caca_get_dither_brightness.restype  = ctypes.c_float
  110 
  111         return _lib.caca_get_dither_brightness(self)
  112 
  113     def set_gamma(self, gamma):
  114         """ Set the gamma of the dither object. A negative value causes colour
  115         inversion.
  116 
  117             gamma -- gamma value
  118         """
  119         if isinstance(gamma, int):
  120             gamma = float(gamma)
  121 
  122         _lib.caca_set_dither_gamma.argtypes = [_Dither, ctypes.c_float]
  123         _lib.caca_set_dither_gamma.restype  = ctypes.c_int
  124 
  125         return _lib.caca_set_dither_gamma(self, gamma)
  126 
  127     def get_gamma(self):
  128         """ Get the gamma of the dither object.
  129         """
  130         _lib.caca_get_dither_gamma.argtypes = [_Dither]
  131         _lib.caca_get_dither_gamma.restype  = ctypes.c_float
  132 
  133         return _lib.caca_get_dither_gamma(self)
  134 
  135     def set_contrast(self, contrast):
  136         """ Set the contrast of dither.
  137 
  138             contrast -- contrast value
  139         """
  140         if isinstance(contrast, int):
  141             contrast = float(contrast)
  142 
  143         _lib.caca_set_dither_contrast.argtypes = [_Dither, ctypes.c_float]
  144         _lib.caca_set_dither_contrast.restype  = ctypes.c_int
  145 
  146         return _lib.caca_set_dither_contrast(self, contrast)
  147 
  148     def get_contrast(self):
  149         """ Get the contrast of the dither object.
  150         """
  151         _lib.caca_get_dither_contrast.argtypes = [_Dither]
  152         _lib.caca_get_dither_contrast.restype  = ctypes.c_float
  153 
  154         return _lib.caca_get_dither_contrast(self)
  155 
  156     def set_antialias(self, value):
  157         """ Set dither antialiasing.
  158 
  159             value -- A string describing the antialiasing method that will
  160                      be used for the dithering.
  161 
  162                      + "none": no antialiasing
  163                      + "prefilter" or "default": simple prefilter antialiasing. (default)
  164         """
  165         _lib.caca_set_dither_antialias.argtypes = [_Dither, ctypes.c_char_p]
  166         _lib.caca_set_dither_antialias.restype  = ctypes.c_int
  167 
  168         return _lib.caca_set_dither_antialias(self, value)
  169 
  170     def get_antialias(self):
  171         """ Return the dither's current antialiasing method.
  172         """
  173         _lib.caca_get_dither_antialias.argtypes = [_Dither]
  174         _lib.caca_get_dither_antialias.restype  = ctypes.c_char_p
  175 
  176         return _lib.caca_get_dither_antialias(self)
  177 
  178     def get_antialias_list(self):
  179         """ Get available antialiasing methods.
  180         """
  181         lst = []
  182 
  183         _lib.caca_get_dither_antialias_list.argtypes = [_Dither]
  184         _lib.caca_get_dither_antialias_list.restype  = ctypes.POINTER(ctypes.c_char_p)
  185 
  186         for item in _lib.caca_get_dither_antialias_list(self):
  187             if item is not None and item != "":
  188                 lst.append(item)
  189             else:
  190                 #memory occurs otherwise
  191                 break
  192 
  193         return lst
  194 
  195     def set_color(self, value):
  196         """ Choose colours used for dithering.
  197 
  198             value -- A string describing the colour set that will be
  199                      used for the dithering.
  200 
  201                      + "mono": use light gray on a black background
  202                      + "gray": use white and two shades of gray on a black background
  203                      + "8": use the 8 ANSI colours on a black background
  204                      + "16": use the 16 ANSI colours on a black background
  205                      + "fullgray": use black, white and two shades of gray
  206                        for both the characters and the background
  207                      + "full8": use the 8 ANSI colours for both the characters and
  208                        the background
  209                      + "full16" or "default": use the 16 ANSI colours for both the
  210                        characters and the background (default)
  211         """
  212         _lib.caca_set_dither_color.argtypes = [_Dither, ctypes.c_char_p]
  213         _lib.caca_set_dither_color.restype  = ctypes.c_int
  214 
  215         return _lib.caca_set_dither_color(self, value)
  216 
  217     def get_color(self):
  218         """ Get current colour mode.
  219         """
  220         _lib.caca_get_dither_color.argtypes = [_Dither]
  221         _lib.caca_get_dither_color.restype  = ctypes.c_char_p
  222 
  223         return _lib.caca_get_dither_color(self)
  224 
  225     def get_color_list(self):
  226         """ Get available colour modes.
  227         """
  228         lst = []
  229 
  230         _lib.caca_get_dither_color_list.argtypes = [_Dither]
  231         _lib.caca_get_dither_color_list.restype  = ctypes.POINTER(ctypes.c_char_p)
  232 
  233         for item in _lib.caca_get_dither_color_list(self):
  234             if item is not None and item != "":
  235                 lst.append(item)
  236             else:
  237                 #memory occurs otherwise
  238                 break
  239 
  240         return lst
  241 
  242     def set_charset(self, value):
  243         """ Choose characters used for dithering.
  244 
  245             value -- A string describing the characters that need to be
  246                      used for the dithering.
  247 
  248                      + "ascii" or "default": use only ASCII characters (default).
  249                      + "shades": use Unicode characters "U+2591 LIGHT SHADE",
  250                        "U+2592 MEDIUM SHADE" and "U+2593 DARK SHADE". These characters are
  251                        also present in the CP437 codepage available on DOS and VGA.
  252                      + "blocks": use Unicode quarter-cell block combinations.
  253                        These characters are only found in the Unicode set.
  254         """
  255         _lib.caca_set_dither_charset.argtypes = [_Dither, ctypes.c_char_p]
  256         _lib.caca_set_dither_charset.restype  = ctypes.c_int
  257 
  258         return _lib.caca_set_dither_charset(self, value)
  259 
  260     def get_charset(self):
  261         """ Get current character set.
  262         """
  263         _lib.caca_get_dither_charset.argtypes = [_Dither]
  264         _lib.caca_get_dither_charset.restype  = ctypes.c_char_p
  265 
  266         return _lib.caca_get_dither_charset(self)
  267 
  268     def get_charset_list(self):
  269         """ Get available dither character sets.
  270         """
  271         lst = []
  272 
  273         _lib.caca_get_dither_color_list.argtypes = [_Dither]
  274         _lib.caca_get_dither_color_list.restype  = ctypes.POINTER(ctypes.c_char_p)
  275 
  276         for item in _lib.caca_get_dither_color_list(self):
  277             if item is not None and item != "":
  278                 lst.append(item)
  279             else:
  280                 #memory occurs otherwise
  281                 break
  282 
  283         return lst
  284 
  285     def set_algorithm(self, value):
  286         """ Set dithering algorithm.
  287 
  288             value -- A string describing the algorithm that needs to be
  289                      used for the dithering.
  290 
  291                      + "none": no dithering is used, the nearest matching colour is used.
  292                      + "ordered2": use a 2x2 Bayer matrix for dithering.
  293                      + "ordered4": use a 4x4 Bayer matrix for dithering.
  294                      + "ordered8": use a 8x8 Bayer matrix for dithering.
  295                      + "random": use random dithering.
  296                      + "fstein": use Floyd-Steinberg dithering (default).
  297         """
  298         _lib.caca_set_dither_algorithm.argtypes = [_Dither, ctypes.c_char_p]
  299         _lib.caca_set_dither_algorithm.restype  = ctypes.c_int
  300 
  301         return _lib.caca_set_dither_algorithm(self, value)
  302 
  303     def get_algorithm(self):
  304         """ Get dithering algorithms.
  305         """
  306         _lib.caca_get_dither_algorithm.argtypes = [_Dither]
  307         _lib.caca_get_dither_algorithm.restype  = ctypes.c_char_p
  308 
  309         return _lib.caca_get_dither_algorithm(self)
  310 
  311     def get_algorithm_list(self):
  312         """ Get dithering algorithms.
  313         """
  314         lst = []
  315 
  316         _lib.caca_get_dither_color_list.argtypes = [_Dither]
  317         _lib.caca_get_dither_color_list.restype  = ctypes.POINTER(ctypes.c_char_p)
  318 
  319         for item in _lib.caca_get_dither_color_list(self):
  320             if item is not None and item != "":
  321                 lst.append(item)
  322             else:
  323                 #memory occurs otherwise
  324                 break
  325 
  326         return lst
  327 
  328     def bitmap(self, canvas, x, y, width, height, pixels):
  329         """ Dither a bitmap on the canvas.
  330 
  331             canvas  -- a handle to libcaca canvas
  332             x       -- X coordinate of the upper-left corner of the drawing area
  333             y       -- Y coordinate of the upper-left corner of the drawing area
  334             width   -- width of the drawing area
  335             height  -- height of the drawing area
  336             pixels  -- bitmap's pixels
  337         """
  338         _lib.caca_dither_bitmap.argtypes = [
  339             _Canvas, ctypes.c_int, ctypes.c_int,
  340             ctypes.c_int, ctypes.c_int, _Dither,
  341             ctypes.c_char_p
  342         ]
  343         _lib.caca_dither_bitmap.restype  = ctypes.c_int
  344 
  345         return _lib.caca_dither_bitmap(canvas, x, y, width, height, self, pixels)
  346 
  347 class DitherError(Exception):
  348     pass
  349