o
    Z2hK                     @  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mZmZmZ G dd dZd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)UnrecognizedImageError)EmuInchesLengthlazypropertyc                      s   e Zd ZdZd5 fdd	Zed6ddZed7ddZedd Z	ed8ddZ
edd Zedd Zed9ddZed9ddZed9ddZed9d d!Zed:d#d$Zed:d%d&Z	'd;d<d,d-Zed.d/ Ze	'd=d>d3d4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__ a/home/skpark/git/infrasmart_work/infrasmart/venv/lib/python3.10/site-packages/docx/image/image.pyr      s   
zImage.__init__returnc                 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_blobimage_descriptorstr | IO[bytes]c                 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    r#   r*   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   4      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   9      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   H   s   zImage.filenameintc                 C  r2   z,The horizontal pixel dimension of the image.)r   px_widthr0   r   r   r   r:   N   r4   zImage.px_widthc                 C  r2   z*The vertical pixel dimension of the image.)r   	px_heightr0   r   r   r   r<   S   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>   X      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   `   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   widthh      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   heightn   rD   zImage.heightNrC   int | Length | 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_dimensionst   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#   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
   r!   rO   c           	      C  s`   ddl m} ddd}|| }|D ]\}}}|t| }||| }||kr-||   S qt)	zRA |BaseImageHeader| subclass instance that can parse headers of image in `stream`.r   )
SIGNATURESr!   rO   c                 S  s   |  d | dS )Nr       )r,   r(   )r!   r   r   r   read_32   s   

z$_ImageHeaderFactory.<locals>.read_32Nr!   rO   )
docx.imager[   lenfrom_streamr   )	r!   r[   r]   headerr    offsetsignature_bytesendfound_bytesr   r   r   rQ      s   
rQ   c                   @  sf   e Zd ZdZdddZedddZed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|.r:   r8   r<   r>   rA   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__r   r   c                 C  s   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  s   t d)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 BaseImageHeaderrk   r0   r   r   r   rR      s   zBaseImageHeader.default_extc                 C  r/   r9   )rg   r0   r   r   r   r:      r1   zBaseImageHeader.px_widthc                 C  r/   r;   )rh   r0   r   r   r   r<      r1   zBaseImageHeader.px_heightc                 C  r/   r=   )ri   r0   r   r   r   r>         zBaseImageHeader.horz_dpic                 C  r/   r@   )rj   r0   r   r   r   rA      rn   zBaseImageHeader.vert_dpiN)r:   r8   r<   r8   r>   r8   rA   r8   rS   )rT   rU   rV   rW   r   rY   r3   rR   r:   r<   r>   rA   r   r   r   r   r      s    
	


r   r^   )rW   
__future__r   rL   r   r)   typingr   r   docx.image.exceptionsr   docx.sharedr   r   r   r	   r
   rQ   r   r   r   r   r   <module>   s     
