U
    gC#                     @   s   d dl Z d dlZd dlmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZ G dd deZG dd	 d	eZeeeeee d
ddZdS )    N)ListOptional)	BaseImage)
PdfContent)rdc                   @   sf   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	dd Z
dd Zdd ZdddZdd Zdd ZdS )PdfStreamQRImagezc
    Quick-and-dirty implementation of the Image interface required
    by the qrcode package.
    PDF)r   )r   r   r   c                 K   s   g S N )selfkwargsr
   r
   8/tmp/pip-unpacked-wheel-owvgwkas/pyhanko/pdf_utils/qr.py	new_image   s    zPdfStreamQRImage.new_imagec                 C   s   | j ||f d S r	   )_imgappendr   rowcolr
   r
   r   drawrect   s    zPdfStreamQRImage.drawrectc                 C   s   | d||f  d S )Ns   %g %g 1 1 re)r   r   command_streamr   r   r
   r
   r   append_single_rect   s    z#PdfStreamQRImage.append_single_rectc                 C   s   d| j  d| j   S )Ns   %g %g %g rg
s   %g %g %g RG)qr_colorr   r
   r
   r   format_qr_color   s    z PdfStreamQRImage.format_qr_colorc                 C   sd   t | j| j }t | j| j }t | j dt | j  d| d||  d}d|  |df S )N 0 0   cms   %s
%sascii)r   borderbox_sizewidthr   encode)r   ZbrdZydiffcmr
   r
   r   setup_drawing_area$   s    .z#PdfStreamQRImage.setup_drawing_areac                 C   s<   |   g}| jD ]\}}| ||| q|d d|S )N   f   
)r$   r   r   r   joinr   r
   r
   r   render_command_stream,   s
    

z&PdfStreamQRImage.render_command_streamNc                 C   s   t d S r	   NotImplementedErrorr   streamkindr
   r
   r   save4   s    zPdfStreamQRImage.savec                 C   s   t d S r	   r)   r   r
   r
   r   process7   s    zPdfStreamQRImage.processc                 C   s   |  ||S r	   )r   )r   r   r   activecontextr
   r
   r   drawrect_context:   s    z!PdfStreamQRImage.drawrect_context)N)__name__
__module____qualname____doc__r-   Zallowed_kindsr   r   r   r   r   r$   r(   r.   r/   r2   r
   r
   r
   r   r      s   
r   c                       s   e Zd ZdZddee d fddZdddZdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Z fddZ fddZ  ZS )PdfFancyQRImageg?N)center_imagec                   s$   t  j|||f| || _|| _d S r	   )super__init___version_centerpiece)r   r   r!   r    versionr8   _argsr   	__class__r
   r   r:   A   s    
zPdfFancyQRImage.__init__c                 C   s   t d S r	   r)   r+   r
   r
   r   r.   O   s    zPdfFancyQRImage.savec                 C   s   t d S r	   r)   r   r
   r
   r   r/   R   s    zPdfFancyQRImage.processc                 C   s(   |  ||rd S |t||dd d S )Ng?g333333?)is_position_patternextendrounded_squarer   r
   r
   r   r   U   s    z"PdfFancyQRImage.append_single_rectc                 C   s<   |dk r|dk p:|| j d kr&|dk p:|dk o:|| j d kS )N      )r!   r   r
   r
   r   is_major_position_patternZ   s
    z)PdfFancyQRImage.is_major_position_patternc                 c   s@   t j| j}t||D ] \}}| ||r0q||fV  qd S r	   )qrcodeutilZpattern_positionr;   	itertoolsproductrF   )r   Zadj_ptnsprpcr
   r
   r   _enumerate_alignment_patternsa   s
    z-PdfFancyQRImage._enumerate_alignment_patternsc                    s,   |   rdS t fdd|  D S )NTc                 3   s2   | ]*\}}t | d ko(t  | d kV  qdS )   N)abs).0rK   rL   r   r   r
   r   	<genexpr>n   s   z6PdfFancyQRImage.is_position_pattern.<locals>.<genexpr>)rF   anyrM   r   r
   rQ   r   rA   j   s
    z#PdfFancyQRImage.is_position_patternc                 C   s  dg}| j }|tdddd |td|d dd |t|d ddd |  D ]$\}}|t|d |d dd qX|d	 |tddd
d |td|d d d
d |t|d d dd
d |  D ]\}}|t||dd q|d d|S )Ns   q
1 0 0 1 0.5 0.5 cm
0.7 wr         rD   rN      gffffff?s   S
Q   g333333?g?r%   r&   )r!   rB   rC   rM   r   r'   )r   r   szrK   rL   r
   r
   r   draw_position_patternss   s    

z&PdfFancyQRImage.draw_position_patternsc                 C   s   |   \}}}| jjj}| jjj}ddg}|t|||| j|  |d t	|| }t	|| }d}	t	d|	 | d }
t	d|	 | d }|||	  d| |	  d||
|   d|| ||   d	
d
 || j  |d d|S )N   q   0.2 ws   S
Q
qg333333?rU   rN   r   r   r   r      Qr&   )_measure_out_centerpiecer<   Zboxr!   heightrB   rC   centerpiece_corner_radiusr   r   r"   renderr'   )r   c_xc_yc_szZc_wZc_hZcenterpiece_commandsZx_scaleZy_scaleshrinkZx_shiftZy_shiftr
   r
   r   draw_centerpiece   s4    

   
:
z PdfFancyQRImage.draw_centerpiecec                 C   s<   d| j  }| j | d }| j | d }t|t|t|fS )NgQ?rN   )r!   r   )r   rc   ra   rb   r
   r
   r   r]      s    
z(PdfFancyQRImage._measure_out_centerpiecec                    s   t   }|g}| jd k	rt| j}|d |d |d| d| d| d| d	d |  \}}}|t	|||| j
|  |d d	|S )
NrZ   r[   z0 0 m 0 z l r   z 0 l hr   s   W nr&   )r9   r$   r<   r   r!   r   r"   r]   rB   rC   r_   r'   )r   Zbasic_setupcommandswra   rb   rc   r?   r
   r   r$      s(    




"   
z"PdfFancyQRImage.setup_drawing_areac                    s:   t   |  g}| jr0|d ||   d|S )Nr\   r&   )r9   r(   rY   r<   r   re   r'   )r   partsr?   r
   r   r(      s
    
z%PdfFancyQRImage.render_command_stream)N)r3   r4   r5   r_   r   r   r:   r.   r/   r   rF   rM   rA   rY   re   r]   r$   r(   __classcell__r
   r
   r?   r   r7   >   s    	
		%r7   )x_posy_posrX   radreturnc                    s(  dt dd  d | }g fdd td fdd	fd
d}||dd ||| dd || df||f||fgd |||| d ||| f|| |f|| |fgd |||d ||fd|| fd|| fgd |d|d d|f|df|dfgd d S )a  
    Add a subpath of a square with rounded corners at the given position.
    Doesn't include any painting or clipping operations.

    The path is drawn counterclockwise.

    :param x_pos:
        The x-coordinate of the enveloping square's lower left corner.
    :param y_pos:
        The y-coordinate of the enveloping square's lower left corner.
    :param sz:
        The side length of the enveloping square.
    :param rad:
        The corner radius.

    :return:
        A list of graphics operators.
    rV   rN   rU   rW   c                    s8   t |  }t | } | d| dd d S )Nr   r   )r   r   r"   )xyZpxpy)resultrj   rk   r
   r   fmt   s    zrounded_square.<locals>.fmt)opcc                    s,   | D ]\}} || q |d d S )Nr   )r   r"   )Zptsrs   rn   ro   )rr   rq   r
   r   op   s    zrounded_square.<locals>.opc                    s    | |fg| d S r	   r
   )rn   ro   rs   )rt   r
   r   uop   s    zrounded_square.<locals>.uopr   mlc   h)mathsqrtstrr   )rj   rk   rX   rl   Zc_offru   r
   )rr   rt   rq   rj   rk   r   rC      s      ($
rC   )rI   rz   typingr   r   Zqrcode.utilrG   Zqrcode.image.baser   Zpyhanko.pdf_utils.contentr   Zpyhanko.pdf_utils.miscr   r   r7   floatbytesrC   r
   r
   r
   r   <module>   s   2    