a
    Cg](                     @   s   d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZ G dd deZdd Zdd	 Zd
d Zdd ZG dd deZegZdS )    N)c_char_pc_void_p)AvifImageFileBadImageOperationErrorBMPImageFileGIFImageFileHeicImageFileIcoImageFileImageJPEGImageFilePNGImageFileRGBAImageBufferRGBImageBufferTIFFImageFileWebPImageFilec                   @   s   e Zd ZdS )UnsupportedRotationN)__name__
__module____qualname__ r   r   R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/willow/plugins/wand.pyr      s   r   c                  C   s   dd l } | jS Nr   )Z
wand.imageimagewandr   r   r   _wand_image   s    r   c                  C   s   dd l } | jS r   )Z
wand.colorcolorr   r   r   r   _wand_color   s    r   c                  C   s   dd l } | jS r   )Zwand.apiapir   r   r   r   	_wand_api%   s    r   c                  C   s   dd l } | jS r   )Zwand.versionversionr   r   r   r   _wand_version+   s    r!   c                   @   s  e Zd Zdd Zedd Zdd Zedd Zej	d	d
 Z
ej	dd Zej	dd Zej	dd Zej	dd Zej	dd Zej	dd Zej	dd Zdd Zdd Zej	d=eeed d!d"Zej	d>ed#d$d%Zej	d?ed#d&d'Zej	d@eeed)d*d+Zej	dAd,d-Zej	dBd.d/Zej	d0d1 Zej	d2d3 Zeejed4d5eje d4d5eje!d4d5eje"d4d5eje#d4d5eje$d4d5eje%d4d5eje&d4d5eje'd4d5d6d7 Z(e)e*d8d9 Z+e)e,d:d; Z-d<S )C	WandImagec                 C   s
   || _ d S Nr   )selfr   r   r   r   __init__2   s    zWandImage.__init__c                 C   s   t   t  t  t  d S r#   )r   r   r   r!   )clsr   r   r   check5   s    zWandImage.checkc                 C   s   t | j S r#   )r"   r   cloner%   r   r   r   _clone<   s    zWandImage._clonec                 C   s   t t |S r#   )boolr!   formats)r'   Zimage_formatr   r   r   is_format_supported?   s    zWandImage.is_format_supportedc                 C   s   | j jS r#   )r   sizer*   r   r   r   get_sizeC   s    zWandImage.get_sizec                 C   s   t | jjS r#   )lenr   sequencer*   r   r   r   get_frame_countG   s    zWandImage.get_frame_countc                 C   s   | j jS r#   )r   alpha_channelr*   r   r   r   	has_alphaK   s    zWandImage.has_alphac                 C   s   | j jS r#   )r   Z	animationr*   r   r   r   has_animationO   s    zWandImage.has_animationc                 C   s"   |   }|j|d |d  |S )Nr      )r+   r   resize)r%   r/   r)   r   r   r   r8   S   s    zWandImage.resizec           	      C   s   |\}}}}| j j\}}||ksH||ksH|dksH||ksH||ksH|dkrVtd||  }|j jtd|td|t||t||d |S )Nr   zInvalid crop dimensions: )lefttoprightbottom)r   r/   r   r+   cropmaxmin)	r%   Zrectr9   r:   r;   r<   widthheightr)   r   r   r   r=   Y   s.    zWandImage.cropc                 C   s0   |d }|rt d| j }|| t|S )NZ   zLSorry - we only support right angle rotations - i.e. multiples of 90 degrees)r   r   r)   rotater"   )r%   ZangleZnot_a_multiple_of_90r)   r   r   r   rC   q   s    

zWandImage.rotatec                 C   sh   |   s| S t|ttfr&t|dks.td|  }t dj	| |j
_d|j
_|j
jrdd|j
_|S )N   z6the 'color' argument must be a 3-element tuple or listzrgb({}, {}, {})removeF)r5   
isinstancetuplelistr1   	TypeErrorr+   r   ZColorformatr   Zbackground_colorr4   )r%   r   r)   r   r   r   set_background_color_rgb~   s    z"WandImage.set_background_color_rgbc                 C   s   | j jdS )Niccr   profilesgetr*   r   r   r   get_icc_profile   s    zWandImage.get_icc_profilec                 C   s   | j jdS )NexifrM   r*   r   r   r   get_exif_data   s    zWandImage.get_exif_dataU   FT)qualityprogressiveapply_optimizersc           	      K   s   | j |rdndV}||_|  }|dur6||jd< |  }|durP||jd< |j|d W d   n1 sp0    Y  |r| |d t|S )aV  
        Save the image as a JPEG file.

        :param f: the file or file-like object to save to
        :param quality: the image quality
        :param progressive: whether to save as progressive JPEG file.
        :param apply_optimizers: controls whether to run any configured optimizer libraries
        :return: JPEGImageFile
        ZpjpegZjpegNrL   rQ   file)	r   convertcompression_qualityrP   rN   rR   saveoptimizer   )	r%   frT   rU   rV   kwargs	convertedicc_profile	exif_datar   r   r   save_as_jpeg   s    

*zWandImage.save_as_jpeg)rV   c                 K   sj   | j d6}|  }|dur(||jd< |j|d W d   n1 sH0    Y  |rb| |d t|S )z
        Save the image as a PNG file.

        :param f: the file or file-like object to save to
        :param apply_optimizers: controls whether to run any configured optimizer libraries
        :return: PNGImageFile
        ZpngNrQ   rW   )r   rY   rR   rN   r[   r\   r   )r%   r]   rV   r^   r_   ra   r   r   r   save_as_png   s    	
*zWandImage.save_as_pngc                 C   sP   | j d}|j|d W d    n1 s.0    Y  |rH| |d t|S )NZgifrW   )r   rY   r[   r\   r   r%   r]   rV   r_   r   r   r   save_as_gif   s
    *zWandImage.save_as_gifP   )rT   losslessrV   c                 C   s   | j dh}|r:t j}tttg|j_||jdd n||_	| 
 }|durZ||jd< |j|d W d   n1 sz0    Y  |s|r| |d t|S )a  
        Save the image as a WEBP file.

        :param f: the file or file-like object to save to
        :param quality: the image quality
        :param lossless: whether to save as lossless WEBP file.
        :param apply_optimizers: controls whether to run any configured optimizer libraries.
            Note that when lossless=True, this will be ignored.
        :return: WebPImageFile
        Zwebps   webp:lossless   trueNrL   rW   )r   rY   r   libraryr   r   MagickSetOptionargtypesr   rZ   rP   rN   r[   r\   r   )r%   r]   rT   rg   rV   r_   ri   r`   r   r   r   save_as_webp   s"    
*zWandImage.save_as_webpc                 C   s   | j dT}|r@d|_t j}tttg|j_||j	dd n||_|j
|d W d    n1 sf0    Y  |s|r| |d t|S )NZavifd   s   heic:losslessrh   rW   )r   rY   rZ   r   ri   r   r   rj   rk   r   r[   r\   r   )r%   r]   rT   rg   rV   r_   ri   r   r   r   save_as_avif  s    *zWandImage.save_as_avifc                 C   sP   | j d}|j|d W d    n1 s.0    Y  |rH| |d t|S )NZicorW   )r   rY   r[   r\   r	   rd   r   r   r   save_as_ico  s
    *zWandImage.save_as_icoc              
   C   s   | j }|jdvr| }t|dr,|  n|jgtj|jddg|j	g|j	tj|jddgtj|jddg|jtj|jddgtj|jddgd}|
|j}|r|D ]
}|  qd|_t|S )	N)top_leftZ	undefinedauto_orientg     f@)Zdegreeg     V@g     p@)Z	top_rightZbottom_rightZbottom_leftZleft_topZ	right_topZright_bottomZleft_bottomrp   )r   Zorientationr)   hasattrrq   Zflop	functoolspartialrC   ZfliprO   r"   )r%   r   Zorientation_opsfnsfnr   r   r   rq   #  s.    


zWandImage.auto_orientc                 C   s   | j S r#   r$   r*   r   r   r   get_wand_imageF  s    zWandImage.get_wand_image   )Zcostc                 C   s6   |j d t j|j d}t j|j|_| |S )Nr   rW   )r]   seekr   r
   r   ri   ZMagickCoalesceImagesr   )r'   Z
image_filer   r   r   r   openJ  s    zWandImage.openc                 C   s   t | jj| jdS )NZRGBr   r   r/   Z	make_blobr*   r   r   r   to_buffer_rgb[  s    zWandImage.to_buffer_rgbc                 C   s   t | jj| jdS )NZRGBAr{   r*   r   r   r   to_buffer_rgba_  s    zWandImage.to_buffer_rgbaN)rS   FT)T)T)rf   FT)rf   FT)T).r   r   r   r&   classmethodr(   r+   r.   r
   Z	operationr0   r3   r5   r6   r8   r=   rC   rK   rP   rR   intr,   rb   rc   re   rl   rn   ro   rq   rw   Zconverter_fromr   r   r   r   r   r   r   r   r	   rz   Zconverter_tor   r|   r   r}   r   r   r   r   r"   1   s   









   "   '	
"

r"   )rs   ctypesr   r   Zwillow.imager   r   r   r   r   r	   r
   r   r   r   r   r   r   	Exceptionr   r   r   r   r!   r"   Zwillow_image_classesr   r   r   r   <module>   s   <  5