U
    &^                     @   sz   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                   @   sF   e Zd ZdZ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   sv   || _ d | _|p$ttdt| j  | _i | _d | _|dkrTt| j d t| jksj|dkrr|t| jkrrtdd S )N   r   zwrong palette size)	moderawmode	bytearrayrangelenpalettecolorsdirty
ValueError)selfr
   r   size r   4/tmp/pip-install-a1j0c_p1/Pillow/PIL/ImagePalette.py__init__'   s     zImagePalette.__init__c                 C   sH   t  }| j|_| j|_| jd k	r0| jd d  |_| j |_| j|_|S )N)r   r
   r   r   r   copyr   )r   newr   r   r   r   2   s    
zImagePalette.copyc                 C   s$   | j r| j | jfS | jd |  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   sH   | j rtdt| jtr | jS td| j}t|dr@| S | S )zUConvert palette to bytes.

        .. warning:: This method is experimental.
        !palette contains raw palette dataBr   )	r   r   
isinstancer   bytesarrayhasattrr   tostring)r   Zarrr   r   r   r   I   s    
zImagePalette.tobytesc                 C   s   | j rtdt|trz| j| W S  tk
r   t| jtrLt| j| _t	| j}|dkrftd|| j|< |d | j|< |d | j|d < |d | j|d < d| _
| Y S X ntd| d	S )
zgGiven an rgb tuple, allocate palette entry.

        .. warning:: This method is experimental.
        r   r	   z$cannot allocate more than 256 colorsr   r      i   zunknown color specifier: %rN)r   r   r   tupler   KeyErrorr   r   r   r   r   )r   colorindexr   r   r   getcolorZ   s$    


zImagePalette.getcolorc              
   C   s   | j rtdt|tr"t|d}|d |d| j  tdD ]|}|d|  t|t| j |d t| j D ]<}z|d| j	|   W qx t
k
r   |d	 Y qxX qx|d
 qD|  dS )zVSave palette to text file.

        .. warning:: This method is experimental.
        r   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   savet   s    


&zImagePalette.save)r   Nr   )__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   s6   g }| dkr.t dD ]}||| d  qnt|S )Nr   r	      )r   appendNotImplementedError)Zblackwhitelutr1   r   r   r   make_linear_lut   s    r?   c                 C   s4   g }t dD ]"}|t|d |  d d  q|S )Nr	   g     o@g      ?)r   r;   int)expr>   r1   r   r   r   make_gamma_lut   s     rB   r   c                 C   s&   t td}|  t| |t|  S Nr	   )listr   reverser   r   )r
   r   r   r   r   negative   s    rF   c                 C   s@   ddl m} g }tdt|  D ]}||dd q t| |S )Nr   )randintr	   r:   )randomrG   r   r   r;   r   )r
   rG   r   r1   r   r   r   rH      s
    rH   #fff0c0c                 C   s@   t | \}}}td|}td|}td|}td|| | S )Nr   r   )r   Zgetrgbr?   r   )r=   rgbr   r   r   sepia   s
    


rM   c                 C   s   t | ttdt|  S rC   )r   rD   r   r   )r
   r   r   r   wedge   s    rN   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)filenamer0   ZpaletteHandlerr>   r   r   r   load   s    

rT   )r   )r   )rI   )r   )r     r   r   r   r   r   r9   r?   rB   rF   rH   rM   rN   rT   r   r   r   r   <module>   s   v


	

