U
    Å½„b¡  ã                   @   s‚   d dl Z d dlZddlmZmZmZmZ G dd„ dƒ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é   )ÚGimpGradientFileÚGimpPaletteFileÚ
ImageColorÚPaletteFilec                   @   sb   e Zd ZdZd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„ 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.
    :param size: An optional palette size. If given, an error is raised
        if ``palette`` is not of equal length.
    ÚRGBNr   c                 C   sL   || _ d | _|ptƒ | _d | _|dkrHt dt¡ |t| jƒkrHt	dƒ‚d S )Nr   zOThe size parameter is deprecated and will be removed in Pillow 10 (2023-07-01).zwrong palette size)
ÚmodeÚrawmodeÚ	bytearrayÚpaletteÚdirtyÚwarningsÚwarnÚDeprecationWarningÚlenÚ
ValueError)Úselfr	   r   Úsize© r   ú4/tmp/pip-unpacked-wheel-_wxctax1/PIL/ImagePalette.pyÚ__init__'   s    ýzImagePalette.__init__c                 C   s   | j S ©N)Ú_palette©r   r   r   r   r   5   s    zImagePalette.palettec                 C   sb   || _ t| jƒ}i | _tdt| jƒ|ƒD ]4}t| j||| … ƒ}|| jkrNq(|| | j|< q(d S )Nr   )r   r   r	   ÚcolorsÚranger   Útuple)r   r   Zmode_lenÚiÚcolorr   r   r   r   9   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   s6   | j rtdƒ‚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
   r   Ú
isinstancer   ÚbytesÚarrayr"   )r   Zarrr   r   r   r"   [   s    zImagePalette.tobytesc              
   C   sà  | j rtdƒ‚t|tƒ�rÊ| jdkrJt|ƒdkrh|d dkrh|dd… }n| jdkrht|ƒdkrh|d7 }z| j| W S  tk
�rÆ } �z0t| jt	ƒs¢t	| jƒ| _
t| jƒd }d	}|rÐ|j d
¡|j d¡f}||krâ|d7 }qÐ|dk�rD|�r0ttt| ¡ ƒƒƒD ](\}}|dk�r||k�r|} �q0�q|dk�rDtdƒ|‚|| 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tdt|ƒ› �ƒ‚dS )zgGiven an rgb tuple, allocate palette entry.

        .. warning:: This method is experimental.
        r$   r   é   é   éÿ   NZRGBA)r+   r   Z
backgroundZtransparencyr   é   r   z$cannot allocate more than 256 colorszunknown color specifier: )r
   r   r&   r   r	   r   r   ÚKeyErrorr   r   r   ÚinfoÚgetÚreversedÚlistÚ	enumerateZ	histogramr'   r   Úrepr)r   r   ÚimageÚeÚindexZspecial_colorsr   Úcountr   r   r   Úgetcolorj   sT    



þ





ÿþÿzImagePalette.getcolorc              
   C   sÒ   | j rtdƒ‚t|tƒr"t|dƒ}| d¡ | d| j› d�¡ tdƒD ]|}| |› ¡ t|t| jƒ |d t| jƒ ƒD ]>}z| d| j	| › �¡ W qz t
k
r¶   | d	¡ Y qzX qz| d¡ qH| ¡  d
S )zVSave palette to text file.

        .. warning:: This method is experimental.
        r$   Úwz
# Palette
z# Mode: Ú
r,   r   ú z 0N)r
   r   r&   ÚstrÚopenÚwriter	   r   r   r   Ú
IndexErrorÚclose)r   Úfpr   Újr   r   r   Úsavež   s    


&zImagePalette.save)r   Nr   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   Úsetterr!   r#   r"   Útostringr8   rC   r   r   r   r   r      s   



4r   c                 C   s   t ƒ }| |_||_d|_|S )Nr   )r   r
   r   r   )r
   Údatar   r   r   r   Úraw¸   s
    rL   c                 C   s6   g }| dkr.t dƒD ]}| || d ¡ qnt‚|S )Nr   r,   r+   )r   ÚappendÚNotImplementedError)ZblackÚwhiteÚlutr   r   r   r   Úmake_linear_lutÄ   s    rQ   c                 C   s4   g }t dƒD ]"}| t|d |  d d ƒ¡ q|S )Nr,   g     ào@g      à?)r   rM   Úint)ÚexprP   r   r   r   r   Úmake_gamma_lutÎ   s     rT   r   c                    s4   t tdtˆ ƒ ƒƒ}| ¡  tˆ ‡ fdd„|D ƒƒS )Nr,   c                    s   g | ]}|t ˆ ƒ ‘qS r   ©r   ©Ú.0r   ©r	   r   r   Ú
<listcomp>Ø   s     znegative.<locals>.<listcomp>)r1   r   r   Úreverser   ©r	   r   r   rX   r   ÚnegativeÕ   s    r\   c                 C   s@   ddl m} g }tdt| ƒ ƒD ]}| |ddƒ¡ q t| |ƒS )Nr   )Úrandintr,   r+   )Úrandomr]   r   r   rM   r   )r	   r]   r   r   r   r   r   r^   Û   s
    r^   ú#fff0c0c                    s0   dd„ t  | ¡D ƒ‰ td‡ fdd„tdƒD ƒƒS )Nc                 S   s   g | ]}t d |ƒ‘qS )r   )rQ   )rW   Zbandr   r   r   rY   å   s     zsepia.<locals>.<listcomp>r   c                    s    g | ]}ˆ |d   |d   ‘qS )r*   r   rV   ©Zbandsr   r   rY   æ   s     i   )r   Zgetrgbr   r   )rO   r   r`   r   Úsepiaä   s    ra   c                    s,   t tdtˆ ƒ ƒƒ}tˆ ‡ fdd„|D ƒƒS )Nr,   c                    s   g | ]}|t ˆ ƒ ‘qS r   rU   rV   rX   r   r   rY   ë   s     zwedge.<locals>.<listcomp>)r1   r   r   r   r[   r   rX   r   Úwedgeé   s    rb   c                 C   sv   t | dƒ�b}tjtjtjfD ]B}z$| d¡ ||ƒ ¡ }|rBW  qhW q ttfk
r\   Y qX qtdƒ‚W 5 Q R X |S )NÚrbr   zcannot load palette)	r=   r   r   r   ÚseekZ
getpaletteÚSyntaxErrorr   ÚOSError)ÚfilenamerA   ZpaletteHandlerrP   r   r   r   Úloadî   s    ý

rh   )r   )r   )r_   )r   )r(   r   Ú r   r   r   r   r   rL   rQ   rT   r\   r^   ra   rb   rh   r   r   r   r   Ú<module>   s     


	

