o
    h](                     @   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   S/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/willow/plugins/wand.pyr      s    r   c                  C      dd l } | jS Nr   )
wand.imageimagewandr   r   r   _wand_image      r   c                  C   r   r   )
wand.colorcolorr   r   r   r   _wand_color   r   r!   c                  C   r   r   )wand.apiapir   r   r   r   	_wand_api%   r   r$   c                  C   r   r   )wand.versionversionr   r   r   r   _wand_version+   r   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>d ed!ed"efd#d$Zej	d?d"efd%d&Zej	d?d"efd'd(Zej		)		d@d ed*ed"efd+d,Zej	d@d-d.Zej	d?d/d0Zej	d1d2 Zej	d3d4 Zeejed5d6eje d5d6eje!d5d6eje"d5d6eje#d5d6eje$d5d6eje%d5d6eje&d5d6eje'd5d6d7d8 Z(e)e*d9d: Z+e)e,d;d< Z-d=S )A	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<      zWandImage._clonec                 C   s   t t |S r)   )boolr'   formats)r-   image_formatr   r   r   is_format_supported?   s   zWandImage.is_format_supportedc                 C      | j jS r)   )r   sizer0   r   r   r   get_sizeC      zWandImage.get_sizec                 C   s   t | jjS r)   )lenr   sequencer0   r   r   r   get_frame_countG   s   zWandImage.get_frame_countc                 C   r7   r)   )r   alpha_channelr0   r   r   r   	has_alphaK   r:   zWandImage.has_alphac                 C   r7   r)   )r   	animationr0   r   r   r   has_animationO   r:   zWandImage.has_animationc                 C   s"   |   }|j|d |d  |S )Nr      )r1   r   resize)r+   r8   r/   r   r   r   rC   S   s   zWandImage.resizec           	      C   s   |\}}}}| j j\}}||ks$||ks$|dks$||ks$||ks$|dkr+td||  }|j jtd|td|t||t||d |S )Nr   zInvalid crop dimensions: )lefttoprightbottom)r   r8   r   r1   cropmaxmin)	r+   rectrD   rE   rF   rG   widthheightr/   r   r   r   rH   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+   anglenot_a_multiple_of_90r/   r   r   r   rO   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r2d|j
_|S )N   z6the 'color' argument must be a 3-element tuple or listzrgb({}, {}, {})removeF)r?   
isinstancetuplelistr;   	TypeErrorr1   r!   Colorformatr   background_colorr>   )r+   r    r/   r   r   r   set_background_color_rgb~   s   z"WandImage.set_background_color_rgbc                 C      | j jdS )Niccr   profilesgetr0   r   r   r   get_icc_profile   r2   zWandImage.get_icc_profilec                 C   r\   )Nexifr^   r0   r   r   r   get_exif_data   r2   zWandImage.get_exif_dataU   FTqualityprogressiveapply_optimizersc           	      K   s   | j |rdnd+}||_|  }|dur||jd< |  }|dur(||jd< |j|d W d   n1 s8w   Y  |rE| |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
        pjpegjpegNr]   rb   file)	r   convertcompression_qualityra   r_   rc   saveoptimizer   )	r+   fre   rf   rg   kwargs	convertedicc_profile	exif_datar   r   r   save_as_jpeg   s   

zWandImage.save_as_jpegc                 K   sj   | j d}|  }|dur||jd< |j|d W d   n1 s$w   Y  |r1| |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
        pngNrb   rj   )r   rl   rc   r_   rn   ro   r   )r+   rp   rg   rq   rr   rt   r   r   r   save_as_png   s   	
zWandImage.save_as_pngc                 C   P   | j d}|j|d W d    n1 sw   Y  |r$| |d t|S )Ngifrj   )r   rl   rn   ro   r   r+   rp   rg   rr   r   r   r   save_as_gif   s   zWandImage.save_as_gifP   losslessc                 C   s   | j d4}|rt j}tttg|j_||jdd n||_	| 
 }|dur-||jd< |j|d W d   n1 s=w   Y  |sL|rL| |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
        webps   webp:lossless   trueNr]   rj   )r   rl   r$   libraryr   r   MagickSetOptionargtypesr   rm   ra   r_   rn   ro   r   )r+   rp   re   r}   rg   rr   r   rs   r   r   r   save_as_webp   s$   
zWandImage.save_as_webpc                 C   s   | j d*}|r d|_t j}tttg|j_||j	dd n||_|j
|d W d    n1 s3w   Y  |sB|rB| |d t|S )Navifd   s   heic:losslessr   rj   )r   rl   rm   r$   r   r   r   r   r   r   rn   ro   r   )r+   rp   re   r}   rg   rr   r   r   r   r   save_as_avif  s    zWandImage.save_as_avifc                 C   rx   )Nicorj   )r   rl   rn   ro   r	   rz   r   r   r   save_as_ico  s   zWandImage.save_as_icoc              
   C   s   | j }|jdvra| }t|dr|  t|S |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}|ra|D ]}|  qXd|_t|S )	N)top_left	undefinedauto_orientg     f@)degreeg     V@g     p@)	top_rightbottom_rightbottom_leftleft_top	right_topright_bottomleft_bottomr   )r   orientationr/   hasattrr   flop	functoolspartialrO   flipr`   r(   )r+   r   orientation_opsfnsfnr   r   r   r   #  s0   

zWandImage.auto_orientc                 C   s   | j S r)   r*   r0   r   r   r   get_wand_imageF  s   zWandImage.get_wand_image   )costc                 C   s6   |j d t j|j d}t j|j|_| |S )Nr   rj   )rp   seekr   r
   r$   r   MagickCoalesceImagesr   )r-   
image_filer   r   r   r   openJ  s   zWandImage.openc                 C      t | jj| jdS )NRGBr   r   r8   	make_blobr0   r   r   r   to_buffer_rgb[     zWandImage.to_buffer_rgbc                 C   r   )NRGBAr   r0   r   r   r   to_buffer_rgba_  r   zWandImage.to_buffer_rgbaN)rd   FT)T)r|   FT).r   r   r   r,   classmethodr.   r1   r6   r
   	operationr9   r=   r?   rA   rC   rH   rO   r[   ra   rc   intr3   ru   rw   r{   r   r   r   r   r   converter_fromr   r   r   r   r   r   r   r   r	   r   converter_tor   r   r   r   r   r   r   r   r(   1   s    









"'	
"

r(   )r   ctypesr   r   willow.imager   r   r   r   r   r	   r
   r   r   r   r   r   r   	Exceptionr   r   r!   r$   r'   r(   willow_image_classesr   r   r   r   <module>   s    <  
5