U
    Evf                     @  s   d dl mZ d dlZd dlmZ ddlmZmZmZm	Z	 G dd dZ
dd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 )    )annotationsN)Sequence   )GimpGradientFileGimpPaletteFile
ImageColorPaletteFilec                   @  s   e Zd ZdZddddddd	Zed
d Zejdd Zedd Zejdd Zdd Z	dd Z
dd ZeZdddZd ddddZdd ZdS )!ImagePalettea  
    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. The list must consist of
        all channels for one color followed by the next color (e.g. RGBRGBRGB).
        Defaults to an empty palette.
    RGBNstrzSequence[int] | NoneNone)modepalettereturnc                 C  s"   || _ d | _|pt | _d | _d S N)r   rawmode	bytearrayr   dirty)selfr   r    r   4/tmp/pip-unpacked-wheel-ciywl2yd/PIL/ImagePalette.py__init__&   s    zImagePalette.__init__c                 C  s   | j S r   )_paletter   r   r   r   r   ,   s    zImagePalette.palettec                 C  s   d | _ || _d S r   )_colorsr   )r   r   r   r   r   r   0   s    c                 C  sh   | j d krbt| j}i | _ tdt| j|D ]4}t| j|||  }|| j krRq,|| | j |< q,| j S )Nr   )r   lenr   ranger   tuple)r   Zmode_lenicolorr   r   r   colors5   s    


zImagePalette.colorsc                 C  s
   || _ d S r   )r   )r   r    r   r   r   r    A   s    c                 C  s<   t  }| j|_| j|_| jd k	r0| jd d  |_| j|_|S r   )r	   r   r   r   r   )r   newr   r   r   copyE   s    
zImagePalette.copyc                 C  s    | j r| j | jfS | j|  fS )z
        Get palette contents in format suitable for the low-level
        ``im.putpalette`` primitive.

        .. warning:: This method is experimental.
        )r   r   r   tobytesr   r   r   r   getdataP   s    zImagePalette.getdatac                 C  s:   | j rd}t|t| jtr$| jS td| j}| S )zUConvert palette to bytes.

        .. warning:: This method is experimental.
        !palette contains raw palette dataB)r   
ValueError
isinstancer   bytesarrayr#   )r   msgZarrr   r   r   r#   [   s    zImagePalette.tobytesc                 C  s   t | jtst| j| _t| jd }d}|rX|jd|jdf}||krX|d7 }qF|dkr|rttt	|
 D ] \}}|dkrx||krx|} qqx|dkrd}t|||S )	N   r   Z
backgroundZtransparencyr      r   z$cannot allocate more than 256 colors)r(   r   r   r   r   infogetreversedlist	enumerateZ	histogramr'   )r   imageeindexZspecial_colorsr   countr+   r   r   r   _new_color_indexk   s(    



zImagePalette._new_color_indexintr   c              
   C  sB  | j rd}t|t|tr(| jdkrZt|dkrx|d dkrLd}t||dd }n| jdkrxt|dkrx|d	7 }z| j| W S  tk
r$ } z| ||}|| j|< |d t| j	k r| j	d|d  t
| | j	|d d d  | _n|  jt
|7  _d
| _| W Y S d}~X Y nX ndt| }t|dS )zgGiven an rgb tuple, allocate palette entry.

        .. warning:: This method is experimental.
        r%   r
      r,      z/cannot add non-opaque RGBA color to RGB paletteNZRGBAr;   r   zunknown color specifier: )r   r'   r(   r   r   r   r    KeyErrorr7   r   r)   r   r   repr)r   r   r3   r+   r4   r5   r   r   r   getcolor   s<    


zImagePalette.getcolorc              
   C  s   | j rd}t|t|tr&t|d}|d |d| j d tdD ]|}||  t|t| j |d t| j D ]>}z|d| j	|   W q~ t
k
r   |d	 Y q~X q~|d qL|  d
S )zVSave palette to text file.

        .. warning:: This method is experimental.
        r%   wz
# Palette
z# Mode: 
r-   r    z 0N)r   r'   r(   r   openwriter   r   r   r   
IndexErrorclose)r   fpr+   r   jr   r   r   save   s     


&zImagePalette.save)r
   N)NN)N)__name__
__module____qualname____doc__r   propertyr   setterr    r"   r$   r#   tostringr7   r?   rI   r   r   r   r   r	      s"   




&r	   r9   c                 C  s   t  }| |_||_d|_|S )Nr   )r	   r   r   r   )r   datar   r   r   r   raw   s
    rR   c                   s.   | dkr fddt dD S d}t|d S )Nr   c                   s   g | ]} | d  qS r<   r   .0r   whiter   r   
<listcomp>   s     z#make_linear_lut.<locals>.<listcomp>r-   z"unavailable when black is non-zero)r   NotImplementedError)ZblackrV   r+   r   rU   r   make_linear_lut   s    rY   c                   s    fddt dD S )Nc                   s$   g | ]}t |d    d  d qS )g     o@g      ?)r8   rS   expr   r   rW      s     z"make_gamma_lut.<locals>.<listcomp>r-   )r   rZ   r   rZ   r   make_gamma_lut   s    r\   r
   c                   s4   t tdt  }|  t  fdd|D S )Nr-   c                   s   g | ]}|t   qS r   r   rS   r   r   r   rW      s     znegative.<locals>.<listcomp>)r1   r   r   reverser	   r   r   r   r^   r   negative   s    ra   c                   s4   ddl m   fddtdt|  D }t| |S )Nr   randintc                   s   g | ]} d dqS )r   r;   r   )rT   _rb   r   r   rW      s     zrandom.<locals>.<listcomp>r-   )randomrc   r   r   r	   r`   r   rb   r   re      s    re   #fff0c0c                   s0   dd t | D  td fddtdD S )Nc                 S  s   g | ]}t d |qS )r   )rY   )rT   Zbandr   r   r   rW      s     zsepia.<locals>.<listcomp>r
   c                   s    g | ]} |d   |d   qS )r,   r   rS   Zbandsr   r   rW      s     i   )r   Zgetrgbr	   r   rU   r   rg   r   sepia   s    rh   c                   s,   t tdt  }t  fdd|D S )Nr-   c                   s   g | ]}|t   qS r   r]   rS   r^   r   r   rW      s     zwedge.<locals>.<listcomp>)r1   r   r   r	   r`   r   r^   r   wedge   s    ri   c                 C  sz   t | df}tjtjtjfD ]B}z$|d || }|rBW  qlW q ttfk
r\   Y qX qd}t|W 5 Q R X |S )Nrbr   zcannot load palette)	rC   r   r   r   seekZ
getpaletteSyntaxErrorr'   OSError)filenamerG   ZpaletteHandlerZlutr+   r   r   r   load   s    

ro   )r
   )r
   )rf   )r
   )
__future__r   r*   typingr    r   r   r   r   r	   rR   rY   r\   ra   re   rh   ri   ro   r   r   r   r   <module>   s    +



