U
    ;gx                     @   s   d dl Z d dlmZmZmZmZmZmZmZ d dl	m
Z
 erLd dlmZmZ eeeee
 eeef f f ZG dd dZG dd deZdS )	    N)TYPE_CHECKINGAnyDictOptionalTupleTypeUnion)QRModuleDrawer)ActiveWithNeighborsQRCodec                   @   s   e Zd ZU dZdZee ed< dZee	e  ed< dZ
dZdZdd Zejd	d
 ZeeddddZdd Zejd!ddZdd ZejedddZdd Zdd Zd"ddZeeddd ZdS )#	BaseImagez)
    Base QRCode image output class.
    Nkindallowed_kindsFTc                 O   sP   || _ || _|| _| j| j d  | j | _|d| _| jf || _|   d S )N   Zqrcode_modules)	borderwidthbox_sizeZ
pixel_sizepopmodules	new_image_imginit_new_image)selfr   r   r   argskwargs r   5/tmp/pip-unpacked-wheel-ij2mbwps/qrcode/image/base.py__init__   s    zBaseImage.__init__c                 C   s   dS )z9
        Draw a single rectangle of the QR code.
        Nr   r   rowcolr   r   r   drawrect!   s    zBaseImage.drawrectr   r   r    qrc                 C   s   t ddS )zV
        Draw a single rectangle of the QR code given the surrounding context
        BaseImage.drawrect_contextNNotImplementedError)r   r   r    r#   r   r   r   drawrect_context'   s    r$   c                 C   s   t ddS )z4
        Processes QR code after completion
        zBaseImage.drawimageNr%   r   r   r   r   process-   s    zBaseImage.processc                 C   s   dS )z&
        Save the image file.
        Nr   )r   streamr   r   r   r   save3   s    zBaseImage.savec                 C   sD   || j  | j }|| j  | j }||f|| j d || j d ffS )z
        A helper method for pixel-based image generators that specifies the
        four pixel coordinates for a single rect.
           )r   r   )r   r   r    xyr   r   r   	pixel_box9   s
    zBaseImage.pixel_boxreturnc                 K   s   dS )zT
        Build the image class. Subclasses should return the class created.
        Nr   r   r   r   r   r   r   E   s    zBaseImage.new_imagec                 C   s   d S Nr   r(   r   r   r   r   K   s    zBaseImage.init_new_imagec                 K   s   | j S )z@
        Return the image class for further processing.
        )r   r2   r   r   r   	get_imageN   s    zBaseImage.get_imagec                 C   s\   |dkr| j }| j p|| jk}|r:||}|s:|| jk}|sXtdt| j d| |S )z%
        Get the image type.
        NzCannot set z	 type to )r   r   
ValueErrortype__name__)r   r   Z	transformallowedr   r   r   
check_kindT   s    
zBaseImage.check_kind)r   r    c                 C   s<   |dk r|dk p:|dk r&| j | dk p:| j | dk o:|dk S )zB
        Find whether the referenced module is in an eye.
              )r   r   r   r   r   is_eyec   s
    zBaseImage.is_eye)N)N)r7   
__module____qualname____doc__r   r   str__annotations__r   r   needs_contextZneeds_processingZneeds_drawrectr   abcabstractmethodr!   intr'   r)   r+   r/   r   r   r   r4   r9   r<   r   r   r   r   r      s(   
	

r   c                       s   e Zd ZU ee ed< i Zeed< edddZedddZ	dZ
d	ed
< d	ed< dddeeedf eeedf d fddZeeedf ee dddZ fddZeeddddZ  ZS )BaseImageWithDrawerdefault_drawer_classdrawer_aliasesr0   c                 C   s   |   S r3   rG   r(   r   r   r   get_default_module_drawerr   s    z-BaseImageWithDrawer.get_default_module_drawerc                 C   s   |   S r3   rI   r(   r   r   r   get_default_eye_draweru   s    z*BaseImageWithDrawer.get_default_eye_drawerTr	   module_drawer
eye_drawerN)rL   rM   c                   s:   |  |p|  | _|  |p$|  | _t j|| d S r3   )
get_drawerrJ   rL   rK   rM   superr   )r   rL   rM   r   r   	__class__r   r   r   }   s    zBaseImageWithDrawer.__init__)drawerr1   c                 C   s&   t |ts|S | j| \}}|f |S r3   )
isinstancer@   rH   )r   rR   Z
drawer_clsr   r   r   r   rN      s    
zBaseImageWithDrawer.get_drawerc                    s&   | j j| d | jj| d t  S )N)img)rL   Z
initializerM   rO   r   r(   rP   r   r   r      s    z"BaseImageWithDrawer.init_new_imager   r"   c                 C   sX   |  ||}| ||r| jn| j}|jr6|||nt|j| | }||| d S r3   )	r/   r<   rM   rL   Zneeds_neighborsZactive_with_neighborsboolr   r!   )r   r   r    r#   ZboxrR   Z	is_activer   r   r   r'      s    z$BaseImageWithDrawer.drawrect_context)r7   r=   r>   r   r	   rA   rH   DrawerAliasesrJ   rK   rB   r   r@   r   r   rN   r   rE   r'   __classcell__r   r   rP   r   rF   n   s$   
rF   )rC   typingr   r   r   r   r   r   r   Z&qrcode.image.styles.moduledrawers.baser	   Zqrcode.mainr
   r   r@   rV   r   rF   r   r   r   r   <module>   s   $ a