o
    	'fl                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZ G dd	 d	Zd
d ZG dd dZdS )zProvides objects that can characterize image streams.

That characterization is as to content type and size, as a required step in including
them in a document.
    )annotationsN)IOTuple)Self)UnrecognizedImageError)EmuInchesLengthlazypropertyc                      s   e Zd ZdZd4 fdd	Zed5ddZedd Zedd Z	edd Z
edd Zedd Zed6ddZed6ddZed6ddZed6dd Zed7d"d#Zed7d$d%Z	&d8d9d+d,Zed-d. Ze	&d:d;d2d3Z  ZS )<ImagezgGraphical image stream such as JPEG, PNG, or GIF with properties and methods
    required by ImagePart.blobbytesfilenamestrimage_headerBaseImageHeaderc                   s$   t t|   || _|| _|| _d S N)superr   __init___blob	_filename_image_header)selfr   r   r   	__class__ H/home/ubuntu/flask/venv/lib/python3.10/site-packages/docx/image/image.pyr      s   
zImage.__init__returnr   c                 C  s   t |}| ||S )z`Return a new |Image| subclass instance parsed from the image binary contained
        in `blob`.)ioBytesIO_from_stream)clsr   streamr   r   r   	from_blob   s   
zImage.from_blobc                 C  s   t |tr,|}t|d}| }t|}W d   n1 s w   Y  tj|}n|}|	d | }d}| 
|||S )zReturn a new |Image| subclass instance loaded from the image file identified
        by `image_descriptor`, a path or file-like object.rbNr   )
isinstancer   openreadr   r   ospathbasenameseekr    )r!   image_descriptorr)   fr   r"   r   r   r   r   	from_file%   s   

zImage.from_filec                 C     | j S )zThe bytes of the image 'file'.)r   r   r   r   r   r   6      z
Image.blobc                 C     | j jS )zIMIME content type for this image, e.g. ``'image/jpeg'`` for a JPEG image.)r   content_typer0   r   r   r   r3   ;      zImage.content_typec                 C  s   t j| jd dd S )a  The file extension for the image.

        If an actual one is available from a load filename it is used. Otherwise a
        canonical extension is assigned based on the content type. Does not contain the
        leading period, e.g. 'jpg', not '.jpg'.
           N)r(   r)   splitextr   r0   r   r   r   ext@   s   z	Image.extc                 C  r/   )zpOriginal image file name, if loaded from disk, or a generic filename if
        loaded from an anonymous stream.)r   r0   r   r   r   r   J   s   zImage.filenameintc                 C  r2   z,The horizontal pixel dimension of the image.)r   px_widthr0   r   r   r   r:   P   r4   zImage.px_widthc                 C  r2   z*The vertical pixel dimension of the image.)r   	px_heightr0   r   r   r   r<   U   r4   zImage.px_heightc                 C  r2   zInteger dots per inch for the width of this image.

        Defaults to 72 when not present in the file, as is often the case.
        )r   horz_dpir0   r   r   r   r>   Z      zImage.horz_dpic                 C  r2   zInteger dots per inch for the height of this image.

        Defaults to 72 when not present in the file, as is often the case.
        )r   vert_dpir0   r   r   r   rA   b   r?   zImage.vert_dpir   c                 C     t | j| j S )z}A |Length| value representing the native width of the image, calculated from
        the values of `px_width` and `horz_dpi`.)r   r:   r>   r0   r   r   r   widthj      zImage.widthc                 C  rB   )zA |Length| value representing the native height of the image, calculated from
        the values of `px_height` and `vert_dpi`.)r   r<   rA   r0   r   r   r   heightp   rD   zImage.heightNrC   
int | NonerE   Tuple[Length, Length]c                 C  s   |du r|du r| j | jfS |du r(|dusJ t|t| j }t| j | }|du r<t|t| j  }t| j| }t|t|fS )a?  (cx, cy) pair representing scaled dimensions of this image.

        The native dimensions of the image are scaled by applying the following rules to
        the `width` and `height` arguments.

        * If both `width` and `height` are specified, the return value is (`width`,
        `height`); no scaling is performed.
        * If only one is specified, it is used to compute a scaling factor that is then
        applied to the unspecified dimension, preserving the aspect ratio of the image.
        * If both `width` and `height` are |None|, the native dimensions are returned.

        The native dimensions are calculated using the dots-per-inch (dpi) value
        embedded in the image, defaulting to 72 dpi if no value is specified, as is
        often the case. The returned values are both |Length| objects.
        N)rC   rE   floatroundr   )r   rC   rE   scaling_factorr   r   r   scaled_dimensionsv   s   zImage.scaled_dimensionsc                 C  s   t | j S )z#SHA1 hash digest of the image blob.)hashlibsha1r   	hexdigestr0   r   r   r   rM      s   z
Image.sha1r"   	IO[bytes]
str | Nonec                 C  s&   t |}|du rd|j }| |||S )zhReturn an instance of the |Image| subclass corresponding to the format of the
        image in `stream`.Nzimage.%s)_ImageHeaderFactorydefault_ext)r!   r"   r   r   r   r   r   r   r       s   	
zImage._from_stream)r   r   r   r   r   r   )r   r   r   r   )r   r8   )r   r   )NN)rC   rF   rE   rF   r   rG   r   )r"   rO   r   r   r   rP   r   r   )__name__
__module____qualname____doc__r   classmethodr#   r.   propertyr   r3   r
   r7   r   r:   r<   r>   rA   rC   rE   rK   rM   r    __classcell__r   r   r   r   r      sD    



	
 
r   c           	      C  s^   ddl m} dd }|| }|D ]\}}}|t| }||| }||kr,||   S qt)znReturn a |BaseImageHeader| subclass instance that knows how to parse the headers
    of the image in `stream`.r   )
SIGNATURESc                 S  s   |  d | dS )Nr       )r+   r'   )r"   r   r   r   read_32   s   

z$_ImageHeaderFactory.<locals>.read_32)
docx.imagerZ   lenfrom_streamr   )	r"   rZ   r\   headerr!   offsetsignature_bytesendfound_bytesr   r   r   rQ      s   rQ   c                   @  s`   e Zd ZdZdd Zedd Zedd Zedd	 Zed
d Z	edd Z
edd ZdS )r   z>Base class for image header subclasses like |Jpeg| and |Tiff|.c                 C  s   || _ || _|| _|| _d S r   )	_px_width
_px_height	_horz_dpi	_vert_dpi)r   r:   r<   r>   rA   r   r   r   r      s   
zBaseImageHeader.__init__c                 C     d}t |)zDAbstract property definition, must be implemented by all subclasses.zNcontent_type property must be implemented by all subclasses of BaseImageHeaderNotImplementedErrorr   msgr   r   r   r3      s   zBaseImageHeader.content_typec                 C  ri   )zDefault filename extension for images of this type.

        An abstract property definition, must be implemented by all subclasses.
        zMdefault_ext property must be implemented by all subclasses of BaseImageHeaderrj   rl   r   r   r   rR      s   zBaseImageHeader.default_extc                 C  r/   r9   )re   r0   r   r   r   r:      r1   zBaseImageHeader.px_widthc                 C  r/   r;   )rf   r0   r   r   r   r<      r1   zBaseImageHeader.px_heightc                 C  r/   r=   )rg   r0   r   r   r   r>         zBaseImageHeader.horz_dpic                 C  r/   r@   )rh   r0   r   r   r   rA      rn   zBaseImageHeader.vert_dpiN)rS   rT   rU   rV   r   rX   r3   rR   r:   r<   r>   rA   r   r   r   r   r      s    




r   )rV   
__future__r   rL   r   r(   typingr   r   typing_extensionsr   docx.image.exceptionsr   docx.sharedr   r   r	   r
   r   rQ   r   r   r   r   r   <module>   s     