î
'"ìVR  ã               @   s¢   d  d l  Z  d  d l m Z Gd d „  d e ƒ Z d d „  Z d d „  Z d	 d
 „  Z d d d „ Z d d d „ Z	 d d d „ Z
 d d d „ Z d d „  Z d S)é    N)Ú
ImageColorc               @   sm   e  Z d  Z d Z d d d d d „ Z d d „  Z d	 d
 „  Z d d „  Z e Z d d „  Z	 d d „  Z
 d S)ÚImagePaletteas  
    Color palette for palette mapped images

    :param mode: The mode to use for the Palette. See:
        :ref:`concept-modes`. Defaults to "RGB"
    :param palette: An optional palette. If given, it must be a bytearray,
        an array or a list of ints between 0-255 and of length ``size``
        times the number of colors in ``mode``. The list must be aligned
        by channel (All R values must be contiguous in the list before G
        and B values.) Defaults to 0 through 255 per channel.
    :param size: An optional palette size. If given, it cannot be equal to
        or greater than 256. Defaults to 0.
    ÚRGBNr   c             C   s®   | |  _  d  |  _ | p4 t t d ƒ ƒ t |  j  ƒ |  _ i  |  _ d  |  _ | d k rz t |  j  ƒ d t |  j ƒ k s› | d k rª | t |  j ƒ k rª t d ƒ ‚ n  d  S)Né   r   zwrong palette size)	ÚmodeÚrawmodeÚlistÚrangeÚlenÚpaletteÚcolorsÚdirtyÚ
ValueError)Úselfr   r   Úsize© r   ú2/tmp/pip-build-fj3bmf4v/Pillow/PIL/ImagePalette.pyÚ__init__&   s    		(		.!zImagePalette.__init__c             C   sk   t  ƒ  } |  j | _ |  j | _ |  j d  k	 rI |  j d  d  … | _ n  |  j j ƒ  | _ |  j | _ | S)N)r   r   r   r   r   Úcopyr   )r   Únewr   r   r   r   0   s    	zImagePalette.copyc             C   s0   |  j  r |  j  |  j f S|  j d |  j ƒ  f S)z¥
        Get palette contents in format suitable # for the low-level
        ``im.putpalette`` primitive.

        .. warning:: This method is experimental.
        z;L)r   r   r   Útobytes)r   r   r   r   Úgetdata<   s    	zImagePalette.getdatac             C   si   |  j  r t d ƒ ‚ n  t |  j t ƒ r1 |  j St j d |  j ƒ } t | d ƒ r_ | j ƒ  S| j ƒ  S)zUConvert palette to bytes.

        .. warning:: This method is experimental.
        z!palette contains raw palette dataÚBr   )	r   r   Ú
isinstancer   ÚbytesÚarrayÚhasattrr   Útostring)r   Zarrr   r   r   r   G   s    	
zImagePalette.tobytesc             C   s  |  j  r t d ƒ ‚ n  t | t ƒ rû y |  j | SWqt k
 r÷ t |  j t ƒ rt d d „  |  j Dƒ |  _ n  t |  j ƒ } | d k rž t d ƒ ‚ n  | |  j | <| d |  j | <| d |  j | d <| d |  j | d	 <d |  _	 | SYqXn t d
 | ƒ ‚ d S)zgGiven an rgb tuple, allocate palette entry.

        .. warning:: This method is experimental.
        z!palette contains raw palette datac             S   s   g  |  ] } t  | ƒ ‘ q Sr   )Úint)Ú.0Úxr   r   r   ú
<listcomp>e   s   	 z)ImagePalette.getcolor.<locals>.<listcomp>r   z$cannot allocate more than 256 colorsr   é   é   i   zunknown color specifier: %rN)
r   r   r   Útupler   ÚKeyErrorr   r   r
   r   )r   ÚcolorÚindexr   r   r   ÚgetcolorX   s$    		zImagePalette.getcolorc             C   s  |  j  r t d ƒ ‚ n  t | t ƒ r9 t | d ƒ } n  | j d ƒ | j d |  j ƒ x¨ t d ƒ D]š } | j d | ƒ xs t | t |  j ƒ | d t |  j ƒ ƒ D]D } y | j d |  j	 | ƒ Wq¬ t
 k
 rï | j d	 ƒ Yq¬ Xq¬ W| j d
 ƒ qg W| j ƒ  d S)zVSave palette to text file.

        .. warning:: This method is experimental.
        z!palette contains raw palette dataÚwz
# Palette
z# Mode: %s
r   z%dr"   z %dz 0Ú
N)r   r   r   ÚstrÚopenÚwriter   r	   r
   r   Ú
IndexErrorÚclose)r   ÚfpÚiÚjr   r   r   Úsaver   s    	4zImagePalette.save)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r(   r3   r   r   r   r   r      s   
r   c             C   s(   t  ƒ  } |  | _ | | _ d | _ | S)Nr"   )r   r   r   r   )r   Údatar   r   r   r   Úraw‹   s
    				r9   c             C   sK   g  } |  d k rA x2 t  d ƒ D] } | j | | d ƒ q Wn t ‚ | S)Nr   r   éÿ   )r	   ÚappendÚNotImplementedError)ZblackÚwhiteÚlutr1   r   r   r   Úmake_linear_lut–   s    r?   c             C   sD   g  } x7 t  d ƒ D]) } | j t | d |  d d ƒ ƒ q W| S)Nr   g     ào@g      à?)r	   r;   r   )Úexpr>   r1   r   r   r   Úmake_gamma_lut    s    'rA   r   c             C   s3   t  t d ƒ ƒ } | j ƒ  t |  | t |  ƒ ƒ S)Nr   )r   r	   Úreverser   r
   )r   r   r   r   r   Únegative§   s    
rC   c             C   sZ   d d l  m } g  } x4 t d t |  ƒ ƒ D] } | j | d d ƒ ƒ q- Wt |  | ƒ S)Nr   )Úrandintr   r:   )ÚrandomrD   r	   r
   r;   r   )r   rD   r   r1   r   r   r   rE   ­   s
    rE   z#fff0c0c             C   sZ   t  j |  ƒ \ } } } t d | ƒ } t d | ƒ } t d | ƒ } t d | | | ƒ S)Nr   r   )r   Zgetrgbr?   r   )r=   ÚrÚgÚbr   r   r   Úsepiaµ   s
    rI   c             C   s#   t  |  t t d ƒ ƒ t |  ƒ ƒ S)Nr   )r   r   r	   r
   )r   r   r   r   Úwedge½   s    rJ   c             C   sN  t  |  d ƒ } d  } | su y< d d l m } | j d ƒ | j | ƒ } | j ƒ  } Wqu t t f k
 rq Yqu Xn  | sÕ y< d d l m } | j d ƒ | j | ƒ } | j ƒ  } WqÕ t t f k
 rÑ YqÕ Xn  | s5y< d d l m } | j d ƒ | j | ƒ } | j ƒ  } Wq5t t f k
 r1Yq5Xn  | sJt	 d ƒ ‚ n  | S)NÚrbr   )ÚGimpPaletteFile)ÚGimpGradientFile)ÚPaletteFilezcannot load palette)
r,   ÚPILrL   ÚseekZ
getpaletteÚSyntaxErrorr   rM   rN   ÚIOError)Úfilenamer0   r>   rL   ÚprM   rN   r   r   r   ÚloadÁ   s:    rU   )r   rO   r   Úobjectr   r9   r?   rA   rC   rE   rI   rJ   rU   r   r   r   r   Ú<module>   s   t
