B
    6de&                 @   s  d dl Z d dlZy$d dlmZ dZe Zee W n: ek
rn Z zddl	m
Z
 e
e ZZW ddZ[X Y nX e eZG dd dZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeeeeeeeeeeeeeeeeedZejdkreed< eed< eed < eed!< eed"< n(eed< eed< eed < eed!< eed"< d&d$d%ZdS )'    N)FFIz|
    struct Pixel_RGBA {
        unsigned char r,g,b,a;
    };
    struct Pixel_I16 {
        unsigned char l,r;
    };
       )DeferredErrorc               @   s>   e Zd ZdddZdd Zdd Zdd	 ZeZeZd
d Z	dS )PyAccessFc             C   s   t |jj}|| _td|d | _td|d | _td|d | _|jj	\| _
| _|| _|j| _| jjdkrz|j| _|   d S )Nzunsigned char **image8zint **image32image)PPA)dictZimZunsafe_ptrsreadonlyfficastr   r   r   sizexsizeysize_img_immodeZpalette_palette
_post_init)selfimgr   vals r   0/tmp/pip-unpacked-wheel-lxgm_btu/PIL/PyAccess.py__init__1   s    zPyAccess.__init__c             C   s   d S )Nr   )r   r   r   r   r   D   s    zPyAccess._post_initc             C   s   | j rd}t||\}}|dk r,| j| }|dk r>| j| }| ||f\}}| jjdkrt|tt	frt
|dkr| jjdkrt
|dkr|d nd}|d	d }| j|| j}| jjdkr||f}| |||S )
a0  
        Modifies the pixel at x,y. The color is given as a single
        numerical value for single band images, and a tuple for
        multi-band images

        :param xy: The pixel coordinate, given as (x, y). See
           :ref:`coordinate-system`.
        :param color: The pixel value.
        z%Attempt to putpixel a read only imager   )r	   r
   )      r
   r   r      N)r   
ValueErrorr   r   check_xyr   r   
isinstancelisttuplelenr   Zgetcolorr   	set_pixel)r   xycolormsgxyalphar   r   r   __setitem__G   s&    


zPyAccess.__setitem__c             C   sJ   |\}}|dk r| j | }|dk r,| j| }| ||f\}}| ||S )aq  
        Returns the pixel at x,y. The pixel is returned as a single
        value for single band images or a tuple for multiple band
        images

        :param xy: The pixel coordinate, given as (x, y). See
          :ref:`coordinate-system`.
        :returns: a pixel value for single band images, a tuple of
          pixel values for multiband images.
        r   )r   r   r!   	get_pixel)r   r'   r*   r+   r   r   r   __getitem__j   s    

zPyAccess.__getitem__c             C   sJ   |\}}d|  kr| j k r:n nd|  kr8| jk sFn d}t||S )Nr   zpixel location out of range)r   r   r    )r   r'   r*   r+   r)   r   r   r   r!      s
    2zPyAccess.check_xyN)F)
__name__
__module____qualname__r   r   r-   r/   ZputpixelZgetpixelr!   r   r   r   r   r   0   s   
#r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccess32_2z7PA, LA, stored in first and last bytes of a 32 bit wordc             O   s   t d| j| _d S )Nzstruct Pixel_RGBA **)r   r   r   pixels)r   argskwargsr   r   r   r      s    z_PyAccess32_2._post_initc             C   s   | j | | }|j|jfS )N)r4   ra)r   r*   r+   pixelr   r   r   r.      s    z_PyAccess32_2.get_pixelc             C   s2   | j | | }t|d d|_t|d d|_d S )Nr   r   r   )r4   minr7   r8   )r   r*   r+   r(   r9   r   r   r   r&      s    z_PyAccess32_2.set_pixelN)r0   r1   r2   __doc__r   r.   r&   r   r   r   r   r3      s   r3   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccess32_3zARGB and friends, stored in the first three bytes of a 32 bit wordc             O   s   t d| j| _d S )Nzstruct Pixel_RGBA **)r   r   r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccess32_3._post_initc             C   s   | j | | }|j|j|jfS )N)r4   r7   gb)r   r*   r+   r9   r   r   r   r.      s    z_PyAccess32_3.get_pixelc             C   sH   | j | | }t|d d|_t|d d|_t|d d|_d|_d S )Nr   r   r      )r4   r:   r7   r=   r>   r8   )r   r*   r+   r(   r9   r   r   r   r&      s
    z_PyAccess32_3.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   r<      s   r<   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccess32_4z&RGBA etc, all 4 bytes of a 32 bit wordc             O   s   t d| j| _d S )Nzstruct Pixel_RGBA **)r   r   r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccess32_4._post_initc             C   s"   | j | | }|j|j|j|jfS )N)r4   r7   r=   r>   r8   )r   r*   r+   r9   r   r   r   r.      s    z_PyAccess32_4.get_pixelc             C   sR   | j | | }t|d d|_t|d d|_t|d d|_t|d d|_d S )Nr   r   r   r?   r   )r4   r:   r7   r=   r>   r8   )r   r*   r+   r(   r9   r   r   r   r&      s
    z_PyAccess32_4.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   r@      s   r@   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
_PyAccess8z%1, L, P, 8 bit images stored as uint8c             O   s   | j | _d S )N)r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccess8._post_initc             C   s   | j | | S )N)r4   )r   r*   r+   r   r   r   r.      s    z_PyAccess8.get_pixelc             C   sJ   yt |d| j| |< W n, tk
rD   t |d d| j| |< Y nX d S )Nr   r   )r:   r4   	TypeError)r   r*   r+   r(   r   r   r   r&      s    z_PyAccess8.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rA      s   rA   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccessI16_Nz0I;16 access, native bitendian without conversionc             O   s   t d| j| _d S )Nzunsigned short **)r   r   r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccessI16_N._post_initc             C   s   | j | | S )N)r4   )r   r*   r+   r   r   r   r.      s    z_PyAccessI16_N.get_pixelc             C   sJ   yt |d| j| |< W n, tk
rD   t |d d| j| |< Y nX d S )Ni  r   )r:   r4   rB   )r   r*   r+   r(   r   r   r   r&      s    z_PyAccessI16_N.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rC      s   rC   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccessI16_LzI;16L access, with conversionc             O   s   t d| j| _d S )Nzstruct Pixel_I16 **)r   r   r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccessI16_L._post_initc             C   s   | j | | }|j|jd  S )N   )r4   lr7   )r   r*   r+   r9   r   r   r   r.      s    z_PyAccessI16_L.get_pixelc             C   sX   | j | | }yt|d}W n" tk
r>   t|d d}Y nX |d@ |_|d? |_d S )Ni  r   r      )r4   r:   rB   rF   r7   )r   r*   r+   r(   r9   r   r   r   r&      s    
z_PyAccessI16_L.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rD      s   rD   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccessI16_BzI;16B access, with conversionc             O   s   t d| j| _d S )Nzstruct Pixel_I16 **)r   r   r   r4   )r   r5   r6   r   r   r   r      s    z_PyAccessI16_B._post_initc             C   s   | j | | }|jd |j S )NrE   )r4   rF   r7   )r   r*   r+   r9   r   r   r   r.      s    z_PyAccessI16_B.get_pixelc             C   sX   | j | | }yt|d}W n" tk
r>   t|d d}Y nX |d? |_|d@ |_d S )Ni  r   rG   r   )r4   r:   	ExceptionrF   r7   )r   r*   r+   r(   r9   r   r   r   r&     s    
z_PyAccessI16_B.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rH      s   rH   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_PyAccessI32_Nz"Signed Int32 access, native endianc             O   s   | j | _d S )N)r   r4   )r   r5   r6   r   r   r   r     s    z_PyAccessI32_N._post_initc             C   s   | j | | S )N)r4   )r   r*   r+   r   r   r   r.     s    z_PyAccessI32_N.get_pixelc             C   s   || j | |< d S )N)r4   )r   r*   r+   r(   r   r   r   r&     s    z_PyAccessI32_N.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rJ     s   rJ   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_PyAccessI32_Swapz,I;32L/B access, with byteswapping conversionc             O   s   | j | _d S )N)r   r4   )r   r5   r6   r   r   r   r     s    z_PyAccessI32_Swap._post_initc             C   s\   t d|}t d|}|d |d |d |d f\|d< |d< |d< |d< t d|d S )Nzint *zunsigned char *r   r?   r   r   )r   newr   )r   iorigcharsr   r   r   reverse   s    4z_PyAccessI32_Swap.reversec             C   s   |  | j| | S )N)rP   r4   )r   r*   r+   r   r   r   r.   &  s    z_PyAccessI32_Swap.get_pixelc             C   s   |  || j| |< d S )N)rP   r4   )r   r*   r+   r(   r   r   r   r&   )  s    z_PyAccessI32_Swap.set_pixelN)r0   r1   r2   r;   r   rP   r.   r&   r   r   r   r   rK     s
   rK   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
_PyAccessFz32 bit float accessc             O   s   t d| j| _d S )Nzfloat **)r   r   r   r4   )r   r5   r6   r   r   r   r   0  s    z_PyAccessF._post_initc             C   s   | j | | S )N)r4   )r   r*   r+   r   r   r   r.   3  s    z_PyAccessF.get_pixelc             C   s>   y|| j | |< W n& tk
r8   |d | j | |< Y nX d S )Nr   )r4   rB   )r   r*   r+   r(   r   r   r   r&   6  s    z_PyAccessF.set_pixelN)r0   r1   r2   r;   r   r.   r&   r   r   r   r   rQ   -  s   rQ   )1Lr	   zI;16NZLAZLar
   ZRGBZLABZHSVZYCbCrZRGBAZRGBaZRGBXZCMYKFIlittlezI;16zI;16LzI;16BzI;32LzI;32BFc             C   s.   t | jd }|s$td| j d S || |S )NzPyAccess Not Implemented: %s)mode_mapgetr   loggerdebug)r   r   Zaccess_typer   r   r   rL   c  s
    rL   )F)loggingsysZcffir   Zdefsr   ZcdefImportErrorexZ_utilr   	getLoggerr0   rY   r   r3   r<   r@   rA   rC   rD   rH   rJ   rK   rQ   rW   	byteorderrL   r   r   r   r   <module>   sd   	
X
