U
    '1eE                     @   sR   d Z ddddddddd	d
dddddddZdZdZddlmZ G dd deZdS ))ZECC200datamatrix)   0      o   >   )   D            \      )
                  t      n   =   )                  '      <   a   x   ))         [   r   *         r       d      )   r          _   	      w   r   -         S   r   )r6      r*   r      K   B   r      r(   m      ^   r      r   Z   r8   )r   r7      r0      G   r      r8      r#         O   l   R         r5      )4      X   r   r<   r                  r   rS   rR      rM   r   |   r         `   2      )      +   r    rC   rZ   g   rL   %         5   r9   "      y      r   r   r(         r!   rb   rB   r   ]   r   )$r      r+               rX   f   r!   T         rU   P         r4   rD      r   !   e      r/   r2   s   ,   r   rY   ;      r?   b   Q   p   )*M   r\   r{         &      r#      i   z   rD   r      r+      r   r/   r*   r0      r      r   9   rg   rR      rG   r   6   rz   r      E   r[            rV   r0   rV   )0r      rM   r   rZ       u   r      r   r   r^   r   r8      W      j         v   r   ra   r@   rc   r      rP   r!   r*   r:   r   r5   r
   rJ   r}   rQ   r      r   rE   r   r   r(   r   rG   r?   r   )8r   r0   r   r   r   rh   rt      r*      r   rc      r-         r      $   r   r      r   r   r      rm      r      r      r   r   r   r      r   r            r{   r   rl   C   r   r   rS   r_   r   k   rB   rd      .   )>r+   rk      r[   r      r   r   r   r8   r      r   rI      ra   r   r   r	   r   r   ?   rT   rO   ro   r   r      r   @   r   rC      r}   r      rK   rm   3   r   r   
   (   rn   r8   rh      r   rQ   rc   rx   r   r      r>   r      rW   V   /         )Drt   r      Y   rU      r   8   r   ry   r   rA      r   I   rl   r(   rj   r      r   rT   r$   r   r   r   rk   r(   r   rE         r:      r#   r   r   r   rs   r   rt   r   rZ   r   r^   rj   r      rX   r;   r~   rN   rM   r   1   r   r]   r   r   r   rI   r#   r   r   rZ   r`   rJ   r5   )rV   r   r   r   r      r4      r   r   r   r&   r   r   r   r   (   ir   r   r
   rD   r?   r;   rd      r   r   r   r+   r_   r   r   rx   r7   r   r   r   r   r	   r         r}   r   7   r   r]   r   rV      r   rZ   r      r|   r`   r   N   r   }      r   r   rp   rA   r5   ri   r   r3   c   r   r   r   r   r2   r#         r   r%   r   L   rt      rT   r   r    rY   r"   r   r   rG   r   r   h   r\   rw   r   rH      rI      ~   rF   rj   re   r0   J      r   r   rr   r   r   r   r   r'   r   rX   rO   r   rP   r*   r   r   r^   r[   r   r   r   r   r   r!      r   r   r(   r   r   r   r   r   r   rQ   r   r   r   rW   r   rq   rm   r/      r@   r      r   r   r   rs   r&      ra   r   r   rN   r   r   r   rB   r   r   r   rK   r   q   r      r   r$   ru   r   rM   r   r<   r   r   r   rl   r   r   r:   r{   r-   #   r.   r      r9      r   r6   ry   r   r   r   U   rc      A   rL   r   r8   r   r   r1   r   r   rJ   H   rv   r   r   rU   r   r)   r   rb   rz   r>   rE   {      r   r   rR   r   r   r   r   :   r      r4   r   r   r   rh   rg   r   r=   r   rS   r~   rf   F   r   ro   r   rC   r   r,   r   r   r   rn   r   r   rk   r   r   r   (   r   rD   rx   r   r   r   r   r   r3   r@   r   r   r   r   r   r   rw   r^   r   r   rU   r   rS   rK   r   rI   r   r1   r   r   r   rY   rk   r5   r   r)   r   r   r0   r4   r   r   r   r   r   rN   r   r   ri   r   r   rt   r   r   r   r   r   r   r   r   r   r7   r   r   r   r\   r   r|   r   r?   r   r   r   r   r%   rv   r   rn   r"   rJ   r   rz   r   r   r/   rO   r   rp   r   r   r{   r   r   r.   r(   r   r   r   r   rd   r   r   r   r   r   r,   rR   r&   rr   r   r   ro   r   r   r   r   r   r   r   r   r   r   rG   r   r   r_   r   rM   r   r   rf   r   r   r   r   r}   rP   rQ   r   r   r   r[   r*   r   r   r   rL   r   r   rB   r   r]   r   r~   r   r   r   r   r   r   r   r=   r   r>   r8   r   rc   rg   r+   r   r   r6   r   r    r   r   rl   r   r   r   r   rq   r   rX   rC   r'   r   r   r   r   r`   r   r   rH   r$   rh   re   r   rj   r   r   rA   rT   r   r   r   r   r   r   rF   r   r   r   r!   r
   r   r   r   r	   ry   r:   r   ra   r   r   rV   r   r   r   ru   rE   r<   rm   r#   r   r   rW   r   r   rb   r   r   r   r   r   rZ   r-   r   r2   r   r;   r   rs   r9   r   r       )Barcodec                   @   s   e 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 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d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/S )0ECC200DataMatrixa  This code only supports a Type 12 (44x44) C40 encoded data matrix.
    This is the size and encoding that Royal Mail wants on all mail from October 1st 2015.
    see https://bitbucket.org/rptlab/reportlab/issues/69/implementations-of-code-128-auto-and-data
    rx   c                 O   s^   t j| f|| d| _d| _d| _d| _d| _d| _| j| jd  | _| j| jd  | _	d S )Nr}   rD   r   r   )
r  __init__row_modulescol_modulesrow_regionscol_regionscw_datacw_eccrow_usable_modulescol_usable_modules)selfargskwargs r  O/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/barcode/ecc200datamatrix.pyr  a   s    zECC200DataMatrix.__init__c                 C   s4   d| _ | jD ]}t|dkrd| _  q0q| j| _d S )Nr   r   r   )Zvalidvalueord	validated)r  cr  r  r  validaten   s    
zECC200DataMatrix.validatec                 C   s~  t |}g }|dks4|dkr$|dks4|dkr||dkr||dkrL||d  n.|dkrl|dkrl||d  n||d  n|d	kr|d
kr|d	 || n|dkr|dks|dkr|dkr|d |dkr|dkr||d  n||d  n~|dkr*|dkr*|d ||d  nP|dkrj|dkrj|d |d || t|d 7 }ntd||f |S )Nr   r   r   r   r@   r   r}   r   r   r   ry   r   r%   r/   r   r   rZ   rl   rD   r   r   r   zCannot encode %s (%s))r  append_encode_c40_charchr	Exception)r  charoencodedr  r  r  r  w   s2    (
 



z!ECC200DataMatrix._encode_c40_charc           	      C   s"  g }|D ]}||  |7 }qt|d r4|d qg }|d tdt|dD ]T}|||d  }|d d |d d  |d  d }||d  ||d  qR|d	 t|| jkrtd
t|| jk r|d t|| jk rdt|d  d d }|d| d	  q|S )Nr   r   r   i@  r   r   rD      r   z4Too much data to fit into a data matrix of this sizer=   r   rG   )r  lenr  ranger  r  )	r  r  r  r  Z	codewordsichunktotalrr  r  r  _encode_c40   s*    
$

zECC200DataMatrix._encode_c40c                 C   s   ||A S Nr  r  Zint1Zint2r  r  r  _gfsum   s    zECC200DataMatrix._gfsumc                 C   s0   |dks|dkrdS t t| t|  d  S d S )Nr   r   )ALOGVALLOGVALr&  r  r  r  
_gfproduct   s    zECC200DataMatrix._gfproductc                 C   s   t | }dg| }|D ]b}| ||d }t|d ddD ]<}| ||| ||< |dkr:| ||d  || ||< q:q|  |S )z
        This method is basically verbatim from "huBarcode" which is BSD licensed
        https://github.com/hudora/huBarcode/blob/master/hubarcode/datamatrix/reedsolomon.py
        r   r   )FACTORSr'  r  r*  reverse)r  dataZnum_code_wordsZ
cw_factorsZ
code_wordsZ	data_wordtmpjr  r  r  _get_reed_solomon_code   s    
 z'ECC200DataMatrix._get_reed_solomon_codec                 C   s<   | d}g }tddD ]}|||? d@  q|  |S )Nr   r   r   )popr  r  r-  )r  r.  r  bitsr   r  r  r  _get_next_bits   s    
zECC200DataMatrix._get_next_bitsc                 C   sb   |dk r(|| j 7 }|d| j d d  7 }|dk rP|| j7 }|d| jd d  7 }|| j| |< d S )Nr   rx   r   )r
  r  _matrix)r  rowcolbitr  r  r  
_place_bit   s    

zECC200DataMatrix._place_bitc                 C   s   |  |}| | jd d|d  | | jd d|d  | | jd d|d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  d S )	Nr   r   rD   r   rx   rV   r   r   r4  r9  r
  r  r  r.  r3  r  r  r  _place_bit_corner_1   s    
z$ECC200DataMatrix._place_bit_corner_1c                 C   s   |  |}| | jd d|d  | | jd d|d  | | jd d|d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  d S 	Nr   r   rD   r   rx   rV   r   r   r:  r;  r  r  r  _place_bit_corner_2   s    
z$ECC200DataMatrix._place_bit_corner_2c                 C   s   |  |}| | jd d|d  | | jd d|d  | | jd d|d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  d S r=  r:  r;  r  r  r  _place_bit_corner_3   s    
z$ECC200DataMatrix._place_bit_corner_3c                 C   s   |  |}| | jd d|d  | | jd | jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  | d| jd |d  d S )	Nr   r   r   rD   rx   rV   r   r   r:  r;  r  r  r  _place_bit_corner_4  s    
z$ECC200DataMatrix._place_bit_corner_4c                 C   s   |  |}| |d |d |d  | |d |d |d  | |d |d |d  | |d |d |d  | |d ||d  | ||d |d  | ||d |d  | |||d  d S )	NrD   r   r   r   rx   rV   r   r   )r4  r9  )r  r.  r6  r7  r3  r  r  r  _place_bit_standard  s    
z$ECC200DataMatrix._place_bit_standardc                 C   s  | j }| j}| ||| _d}d}||kr>|dkr>| | n~||d krf|dkrf|d rf| | nV||d kr|dkr|d dkr| | n*||d kr|dkr|d dkr| | ||k r|dkr| j| | dkr| ||| |d8 }|d7 }|dk s||krqq|d7 }|d7 }|dkrZ||k rZ| j| | dkrZ| ||| |d7 }|d8 }||ks|dk r$qq$|d7 }|d7 }||kr"||kr"qq"| jD ].}t	d|D ]}|| dkrd||< qq| jS )z
        This method is heavily influenced by "huBarcode" which is BSD licensed
        https://github.com/hudora/huBarcode/blob/master/hubarcode/datamatrix/placement.py
        rx   r   rD   r   Nr   r   )
r
  r  _create_empty_matrixr5  r<  r>  r?  r@  rA  r  )r  r.  rowscolsr6  r7  r   r  r  r  _create_matrix  sH      
"(
zECC200DataMatrix._create_matrixc                 C   s   g }d}d}t | j| j }t | j| j }|| jk r|| jk r|| }|| }||||  }	tdt|	D ]}
|	|
 |||  |	|
< qn||	 |d7 }q6d}|d7 }q,|S Nr   r   )intr
  r  r  r  r  r  r  )r  matrixregions
col_offset
row_offsetrC  rD  Zr_offsetZc_offsetregionr   r  r  r  _create_data_regionsY  s"    




z%ECC200DataMatrix._create_data_regionsc                 C   s(   g }t d|D ]}|d g|  q|S )Nr   )r  r  )r  r6  r7  rH  r   r  r  r  rB  o  s    z%ECC200DataMatrix._create_empty_matrixc                 C   s   g }|D ]}|  t| j| j t| j| j }t|D ].\}}t|D ]\}}|||d  |d < qHq8t|D ]t\}}	|dkrt|	D ]\}}
|d d |	|< qqp|d t|krt|	D ]\}}
d|	|< qqpd|	d< |d |	d< qp|| q|S )Nr   r   rD   r+  )	rB  rG  r  r  r  r  	enumerater  r  )r  rI  wrappedrL  rH  r   rC  r0  r.  r6  r7  r  r  r  _wrap_data_regions_with_findersu  s(    z0ECC200DataMatrix._wrap_data_regions_with_findersc                 C   st   g }t dt|| jD ]X}|||| j  }d}|t|d k rg }|D ]}||| 7 }qH|| |d7 }q0q|S rF  )r  r  r  r  )r  rI  mergedr   r!  r0  Z
merged_rowr6  r  r  r  _merge_data_regions  s    
z$ECC200DataMatrix._merge_data_regionsc                 C   sh   t | dr| jS | | j}|| || j7 }| |}| |}| |}| 	|| _| j
  | jS )Nr  )hasattrr  r$  r  r1  r	  rE  rM  rP  rR  r-  )r  r  rH  Zdata_regionsrO  r  r  r  encode  s    




zECC200DataMatrix.encodec                 G   s    | j | j | _| j| j | _d S r%  )r  barWidthZ_heightr  _width)r  r  r  r  r  computeSize  s    zECC200DataMatrix.computeSizec                 C   sZ   t | jD ]J\}}t |D ]8\}}|r| | j|| j  | j|| j  | j| j qq
d S r%  )rN  r  ZrectxrU  y)r  rY  r6  rX  r.  r  r  r  draw  s    zECC200DataMatrix.drawN)__name__
__module____qualname____doc__rU  r  r  r  r$  r'  r*  r1  r4  r9  r<  r>  r?  r@  rA  rE  rM  rB  rP  rR  rT  rW  rZ  r  r  r  r  r  Z   s0   	" ;r  N)__all__r,  r)  r(  Z!reportlab.graphics.barcode.commonr  r  r  r  r  r  <module>   s*   )