U
    9gE                     @   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-w2r18j3o/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   )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   r5  r:  r
  r  r  r/  r4  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   )r5  r:  )r  r/  r7  r8  r4  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_matrixr6  r=  r?  r@  rA  rB  r   )r  r/  rowscolsr7  r8  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_offsetrD  rE  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  r7  r8  rI  r!  r  r  r  rC  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,  )	rC  rH  r  r  r  r  	enumerater  r  )r  rJ  wrappedrM  rI  r!  rD  r1  r/  r7  r8  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 rG  )r   r  r  r  )r  rJ  mergedr!  r"  r1  Z
merged_rowr7  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  r2  r	  rF  rN  rQ  rS  r.  )r  r  rI  Zdata_regionsrP  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&  )rO  r  ZrectxrV  y)r  rZ  r7  rY  r/  r  r  r  draw  s    zECC200DataMatrix.drawN)__name__
__module____qualname____doc__rV  r  r  r  r%  r(  r+  r2  r5  r:  r=  r?  r@  rA  rB  rF  rN  rC  rQ  rS  rU  rX  r[  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*   )