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 ddlm	Z	 ddl
mZmZ dd	lmZ G d
d dZedkrejejejddZejestdde_eeddZe Zedej eee dS )z3.3.0z@
Image functionality sliced out of canvas.py for generalization
    N)	rl_config)pdfutils)pdfdoc)isStr)fp_strasciiBase85Encode)aspectRatioFixc                   @   s^   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dddZ
dddZdd ZdS )PDFImagezWrapper around different "image sources".  You can make images
    from a PIL Image object, a filename (in which case it uses PIL),
    an image we previously cached (optimisation, hardly used these
    days) or a JPEG (which PDF supports natively).Nr   c                 C   sN   || _ || _|| _|| _|| _d | _|| _d| _d| _g | _	d | _
|   d S )N	DeviceRGB   )imagexywidthheightfilenameimageCaching
colorSpaceZbitsPerComponentfilterssourcegetImageData)selfr   r   r   r   r   Zcaching r   >/tmp/pip-unpacked-wheel-109iniqw/reportlab/pdfgen/pdfimages.py__init__   s    zPDFImage.__init__c                 C   s*   t | jd}z| |}W 5 |  X |S )Nrb)openr   close_jpg_imagedata)r   fpresultr   r   r   jpg_imagedata*   s
    
zPDFImage.jpg_imagedatac                 C   s   t |}d| _|d |d  }}|d dkr4d}n|d dkrFd}nd}|d g }|d	|||tjrnd
ppdf  | }tjrt|}t 	|| |d |||fS )NJPEGr         
DeviceGray   r
   
DeviceCMYKz,BI /W %d /H %d /BPC 8 /CS /%s /F [%s/DCT] ID/A85  EI)
r   ZreadJPEGInfor   seekappendr   useA85readr   _chunker)r   Z	imageFileinfoimgwidth	imgheightr   	imagedatadatar   r   r   r   4   s"    

 
zPDFImage._jpg_imagedatac                 C   sZ   | j }t|st| tj|d tjr2dp4d }t	|d
 }tttj|}|S )Nr   z.a85z.binr   )r   r   ZcachedImageExistscacheImageFileospathsplitextr   r-   r   	readlineslistmapstrstrip)r   r   Z
cachednamer3   r   r   r   cache_imagedataJ   s    

zPDFImage.cache_imagedatac                 C   sB  dd l }| j}|jdkr2|j}|d | |S d| _d}|jdkrT|}d}d}nF|jdkrp|}d	}d
}d
}n*|jdkr|}d	}d
}n|d}d}d}|j	\}}	d||	||t
jrdpdf g}
t|dr|jn|j }|| | d d? }t|||	 kstd||}t
jr"t|}t||
 |
d |
||	fS )Nr   r"   ZPILr   ZCMYKr'      1r%   r#   LZRGBr&   z,BI /W %d /H %d /BPC %d /CS /%s /F [%s/Fl] IDr(   r)   tobytes   zWrong amount of data for imager*   )zlibr   formatr   r+   r   r   modeconvertsizer   r-   hasattrrB   tostringlenAssertionErrorcompressr   r   r/   r,   )r   rD   r   r   ZbpcZmyimager   Zbppr1   r2   r3   rawZ	rowstrider4   r   r   r   PIL_imagedataV   sF    









zPDFImage.PIL_imagedatac                 C   sL   | j stj|dd}n|  }|d  }t|d }t|d }|||fS )Nr#   )ZreturnInMemoryr&   )r   r   r5   r>   splitint)r   r   r3   wordsr1   r2   r   r   r   non_jpg_imagedata   s    zPDFImage.non_jpg_imagedataFc                 C   s   | j }t|rl|| _tj|d dkrZz|  \}}}W qj   | |\}}}Y qjX qz| |\}}}n|  \}}}|| _	|| _
|| _| jp|| _| jp|| _dS )z1Gets data, height, width - whatever type of imager#   )z.jpgz.JPGz.jpegz.JPEGN)r   r   r   r6   r7   r8   r!   rS   rO   	imageDatar1   r2   r   r   )r   preserveAspectRatior   r3   r1   r2   r   r   r   r      s    zPDFImage.getImageDataswc              
   C   s   | j }| j}|dk s|dk r dS t||| j| j||| j| j|	\}	}
| _ | _}|js\|
| }
|j	dt
| j t
| j|	|
f  | j }| j}| jD ]}|j	| q|j	d |r|||	|
|| |r| D ]}t | ||< qdS )zDraw an Image into the specified rectangle.  If width and
        height are omitted, they are calculated from the image size.
        Also allow file names as well as images.  This allows a
        caching mechanismgư>Fzq %s 0 0 %s cmQT)r   r   r   r   r   r1   r2   Zbottomup_coder,   r   rT   ZdrawBoundarykeysvars)r   ZcanvasrU   anchorZ
anchorAtXYZshowBoundaryZextraReturnr   r   r   r   Zscaledlinekr   r   r   drawInlineImage   s&     . $
zPDFImage.drawInlineImagec                 C   st   t  }d|d< d|d< | j|d< | j|d< d|d< t | j|d	< d
| jdd d
 }t j||d}|	|S )ztAllow it to be used within pdfdoc framework.  This only
        defines how it is stored, not how it is drawn later.z/XObjectTypez/ImageZSubtypeZWidthZHeightr   ZBitsPerComponentZ
ColorSpace
r&   )
dictionarycontent)
r   ZPDFDictionaryr   r   ZPDFNamer   joinrT   Z	PDFStreamrE   )r   documentdictrc   strmr   r   r   rE      s    

zPDFImage.format)NNr   )F)FrV   FFN)__name__
__module____qualname____doc__r   r!   r   r>   rO   rS   r   r^   rE   r   r   r   r   r	      s   

.

    
r	   __main__testzpythonpowered.gifzimage not foundr#   d   zsource=)__version__rk   r6   Z	reportlabr   Zreportlab.pdfbaser   r   Zreportlab.lib.utilsr   Zreportlab.lib.rl_accelr   r   Zreportlab.lib.boxstuffr   r	   rh   r7   rd   dirname__file__srcfileisfilerL   Z
LongFormatimgZPDFDocumentdocprintr   rE   r   r   r   r   <module>   s.    :