U
    '1e'                     @   s   d Z dZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZ g dfd	d
ZddddZddddZd+ddZd,ddZd-ddZdd Zdd Zd.dd Zd!d" Zd#d$ Zd/d%d&Zd'd( ZG d)d* d*ZdS )0z3.3.0     N)BytesIO)	rl_config)ImageReader	isUnicode)asciiBase85EncodeasciiBase85Decode<   c                 C   s0   t dt| |D ]}|| |||   q|S Nr   )rangelenappend)srcdst	chunkSizei r   >/tmp/pip-unpacked-wheel-109iniqw/reportlab/pdfbase/pdfutils.py_chunker   s    r   RGBCMYKG)r   r   L         Fc                 C   s   dd l }t| }|d k	r2|| |r2| r2d S | \}}| }g }|j}	|	d |	d||t|j f  |	d t||| t	|j  kst
d||}
t|
}t|| |	d |S )Nr   BIz(/W %s /H %s /BPC 8 /CS /%s /F [/A85 /Fl]IDWrong amount of data for imageEI)zlibr   r   jpeg_fhgetSize
getRGBData_mode2csmoder   	_mode2bppAssertionErrorcompressr   r   )filenameIMG
detectJpegr    imgimgwidth	imgheightrawcoder   
compressedencodedr   r   r   makeA85Image   s&    
"

r3   c                 C   s   dd l }t| }|d k	r2|| |r2| r2d S | \}}| }g }|j}	|	d |	d||t|j f  |	d t||| t	|j  kst
d||}
t|
| |	d |S )Nr   r   z#/W %s /H %s /BPC 8 /CS /%s /F [/Fl]r   r   r   )r    r   r   r!   r"   r#   r$   r%   r   r&   r'   r(   r   )r)   r*   r+   r    r,   r-   r.   r/   r0   r   r1   r   r   r   makeRawImage9   s$    
"

r4   c                 C   s   t j| d tjrdpd }| |krft| rXddlm} |rdtd||	 
dS qtd|  n\tjrxt| |}n
t| |}|r|S t|d}|d|d  |  tjrtd	|  dS )
zHProcesses image as if for encoding, saves to a file with .a85 extension.r   .a85z.bin)open_for_readN
zNo such cached image %swbzcached image as %s)ospathsplitextr   useA85cachedImageExistsreportlab.lib.utilsr6   filterreadsplitIOErrorr3   r4   openwritejoincloseverboseprint)r)   ZreturnInMemoryr*   
cachednamer6   r0   fr   r   r   cacheImageFileT   s"     
 
rK   c                 C   sT   ddl }t| tr| | }n| }|D ](}t|rFtjrNtd|  q&t| q&dS )zPreprocesses one or more image files.

    Accepts either a filespec ('C:\mydir\*.jpg') or a list
    of image filenames, crunches them all to save time.  Run this
    to save huge amounts of time when repeatedly building image
    documents.r   Nz#cached version of %s already exists)glob
isinstancestrr=   r   rG   rH   rK   )specrL   filelistr)   r   r   r   preProcessImagesm   s    
rQ   c                 C   s`   t j| d tjrdpd }t j|rXt | d }t |d }||krRdS dS ndS dS )zDetermines if a cached image already exists for a given file.

    Determines if a cached image exists which has the same name
    and equal or newer date to the given file.r   r5   bin   r   N)r9   r:   r;   r   r<   isfilestat)r)   rI   Zoriginal_dateZcached_dater   r   r   r=      s    r=   r7    c                 C   s$   |  d| d| d| ||S )zzNormalizes different line end character(s).

    Ensures all instances of CR, LF and CRLF end up as
    the specified one.r7   
)replace)textZdesiredZunlikelyr   r   r   _normalizeLineEnds   s        r[   c                 C   s:   t | r| d} t }|t|  |d | S )zEncodes input using ASCII-Hex coding.

    This is a verbose encoding used for binary data within
    a PDF file.  One byte binary becomes two bytes of ASCII.
    Helper function used by images.utf-8   >)r   encoder   rD   binasciib2a_hexgetvalue)inputoutputr   r   r   _AsciiHexEncode   s    

rd   c                    s|   t | s| d} d|    d dks4td dd  t d dksXtd	d fd
dtdt dD S )zeDecodes input using ASCII-Hex coding.

    Not used except to provide a test of the inverse function.r\   r   >z'Invalid terminator for Ascii Hex StreamN   r   z(Ascii Hex stream has odd number of bytesc                    s&   g | ]}t t ||d   dqS )rg      )chrint).0r   strippedr   r   
<listcomp>   s     z#_AsciiHexDecode.<locals>.<listcomp>)r   decoderE   rA   r'   r   r   )rb   r   rl   r   _AsciiHexDecode   s    
rp   c                 C   s   g }t | }d}|| }||k rH|| |||   |d }|| }qt |d dkr|d dd |d d |d  g|dd< d|S )z>Wraps input at a given column size by inserting 
 characters.r   r   re   Nr7   )r   r   rE   )rb   columnsrc   lengthr   posr   r   r   _wrap   s    
,ru   c                 C   s8  ddl }ddlm} dddg}ddd	d
ddddddg
}dddddddddddg}d}d}|s4|d| d}|d dkrX|d| d}|d |kr@| dd |d| d}|d d kr|d!|d"| d}	|	d d > |	d  }
|d"| d}	|	d d > |	d  }|d| d}	|	d }||
||fS |d d#kr|d"| d}|d d > |d  d }| |}|d"|d$d% }	|d"|d d$ }|d d > |d  |	d d > |	d  f}qX|d |kr|d&|d  qX|d |krX|d"| d}| |d d > |d  d d qXdS )'z@Read width, height and number of components from open JPEG file.r   N)PDFError                                    r                                    )H   r   B   rg   rS   z#JPEG must have 8 bits per componentBB   
      z#JPEG Unsupported JPEG marker: %0.2x)structZreportlab.pdfbase.pdfdocrv   unpackr@   seek)imager   rv   ZvalidMarkersZnoParamMarkersZunsupportedMarkersZdpidonexyheightwidthcolornr   r   r   readJPEGInfo   sJ    

*r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_fuscc                 C   s.   |st d|| _t|| _t|p&d| _d S )Nz'Argument k should be a non empty string   )r'   _kr   _klenrj   _n)selfkr   r   r   r   __init__  s    
z_fusc.__init__c                 C   s.   |  tdtt| ttt|| jS Nr   )	_fusc__rotater   rE   mapri   _fusc__fusclistordr   r   sr   r   r   encrypt  s    z_fusc.encryptc                 C   s0   d tt| tttt| || j S r   )	rE   r   ri   r   r   r   r   r   r   r   r   r   r   decrypt  s    z_fusc.decryptc                 C   sF   t |}|dk r|| }||; }|s(|S || d  |d ||   S r
   )r   )r   r   r   lr   r   r   Z__rotate!  s      z_fusc.__rotatec              
   C   sB   t |}ttdd |tttt|| j d | j d | S )Nc                 S   s   | |A S )Nr   )r   r   r   r   r   <lambda>*      z_fusc.__fusc.<locals>.<lambda>r   )r   r   r   r   rj   r   r   )r   r   slenr   r   r   Z__fusc(  s    z_fusc.__fuscN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r     s
   r   )NF)NF)r   N)r7   rV   )r	   )__version____doc__r9   r_   ior   Z	reportlabr   r>   r   r   Zreportlab.lib.rl_accelr   r   r   r$   r&   r3   r4   rK   rQ   r=   r[   rd   rp   ru   r   r   r   r   r   r   <module>   s*   




5