a
    Aþdî   ã                   @   sè  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl	Z	G dd„ dej
ƒZG dd„ dejƒZdd„ Zd	d
„ Zd0dd„Zdd„ Zdd„ Zdd„ Zd1dd„Zdd„ Zd2dd„Zedkräe d¡ZeeƒZedusÚJ ‚eejd ƒZedu söJ ‚e dd d!¡Zeed"d#d$d%ƒZd&d'e	 ej   d(¡¡iiZ!eee!ƒZ"ee"ƒZ#e$e#ƒe$e!ƒksVJ ‚eee#ƒZ%e"e%ksnJ ‚eƒ Z&e 'd)d*„ e(d+ƒD ƒ¡ )ej*¡ +¡ Z,g d,¢Z-e,e-ks®J ‚e.e 'd-d*„ e(d.ƒD ƒ¡ )ej*¡ +¡ ƒZ/d/e/ksäJ ‚dS )3é    N)ÚImageÚ	ImageDrawc                   @   s   e Zd Zdd„ ZdS )ÚEmbeddingEncoderc                 C   s2   t |tjƒr$d| ¡  ¡  ¡  ¡ iS tj 	| |¡S ©NZTORCHTENSOR)
Ú
isinstanceÚtorchÚTensorÚcpuÚdetachÚnumpyÚtolistÚjsonÚJSONEncoderÚdefault)ÚselfÚobj© r   úQ/var/www/html/stable-diffusion-webui/modules/textual_inversion/image_embedding.pyr      s    zEmbeddingEncoder.defaultN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚEmbeddingDecoderc                 O   s$   t jj| g|¢R d| ji|¤Ž d S )NÚobject_hook)r   ÚJSONDecoderÚ__init__r   )r   ÚargsÚkwargsr   r   r   r      s    zEmbeddingDecoder.__init__c                 C   s    d|v rt  t |d ¡¡S |S r   )r   Ú
from_numpyÚnpÚarray)r   Údr   r   r   r      s    zEmbeddingDecoder.object_hookN)r   r   r   r   r   r   r   r   r   r      s   r   c                 C   s   t j| td}t | ¡ ¡S ©N©Úcls)r   Údumpsr   Úbase64Ú	b64encodeÚencode©Údatar    r   r   r   Úembedding_to_b64   s    r*   c                 C   s   t  | ¡}tj|tdS r!   )r%   Ú	b64decoder   Úloadsr   r(   r   r   r   Úembedding_from_b64!   s    
r-   ì        éf é_ón<c                 c   s    || | |  }|d V  q d S )Néÿ   r   )ÚmÚaÚcÚseedr   r   r   Úlcg&   s    r6   c                    sR   t ƒ ‰ t ‡ fdd„tt | j¡ƒD ƒ¡ tj¡ | j¡}t 	|  tj¡|d@ ¡S )Nc                    s   g | ]}t ˆ ƒ‘qS r   )Únext©Ú.0Ú_©Úgr   r   Ú
<listcomp>.   ó    zxor_block.<locals>.<listcomp>é   )
r6   r   r   ÚrangeÚproductÚshapeÚastypeÚuint8ÚreshapeÚbitwise_xor)ÚblockZ	randblockr   r;   r   Ú	xor_block,   s    4rH   c                 C   sØ   t  d| jd | jd f¡}t |¡}d}td|jd dƒD ]|}ttd|jd dƒƒD ]`\}}d}|d dkrrd}||t|ƒ  }	|d7 }|j	|| ||d | |d f|	|	|	fd	 qVq<t
 |¡ t
j¡d
@ }
| |
A S )NÚRGBé   r   iúÿÿÿé   é   é   é   )Úfilléð   )r   ÚnewrB   r   ÚDrawr@   ÚsizeÚ	enumerateÚlenÚellipser   r   rC   rD   )rG   ÚsequenceÚimÚdrawÚiÚxÚyiÚyÚoffsetÚshadeÚfgr   r   r   Ústyle_block2   s    
0ra   c                 C   sä  d}t jtj|td ¡ dd}t |tj¡ 	¡ }|d? }|d@ }| j
d }|jd ||jd |   }||| |||    }t ||¡}| |d	|f¡}t ||¡}| |d	|f¡}t|d
  ¡ ƒd  ¡  ¡  ¡  ¡ d d d… }	t |	¡t t |	¡¡ d  tj¡}	t||	d}t|ƒ}t||	d d d	… d}t|ƒ}tj|dd}
tj|dd}t d| j
d |
j
d  |j
d  d | j
d fd¡}| |
d¡ | | |
j
d d df¡ | ||
j
d d | j
d  d df¡ |S )Né   r"   é	   )ÚlevelrM   r?   rJ   r   éÿÿÿÿÚstring_to_parami   r1   )rW   rI   )ÚmoderL   )r   r   r   ©r   r   )ÚzlibÚcompressr   r$   r   r'   r   Ú
frombufferrD   ÚcopyrS   rB   ÚresizerE   ÚlistÚvaluesr	   r
   r   r   ÚabsÚmaxrC   ra   rH   r   Ú	fromarrayrQ   Úpaste)Úimager)   r    Zdata_compressedZdata_np_Zdata_np_highZdata_np_lowÚhZ	next_sizeZ
edge_styleZim_lowZim_highÚ
backgroundr   r   r   Úinsert_image_data_embedD   s2    
0&6(rw   c           	      C   s„   | |k  d¡}| d¡| d¡ }}| ¡ |jd |d d d…  ¡   }}| ¡ |jd |d d d…  ¡   }}| ||…||…f S )NrL   r   rJ   re   )ÚallÚanyÚargmaxrB   )	ÚimgÚtolÚmaskÚmask0Úmask1Ú	col_startZcol_endÚ	row_startÚrow_endr   r   r   Ú
crop_blackh   s
    &&rƒ   c                 C   s  d}t t |  d¡ ¡ ¡ | jd | jd |¡ tj¡ƒd@ }t 	tj
|dddk¡}|d jd dk rttd	ƒ d S |d d …d |d  ¡ …d d …f  tj¡}|d d …|d  ¡ d d …d d …f  tj¡}t|ƒ}t|ƒ}|d
> |B }| ¡  ¡ }t |¡}tj|tdS )Nrb   rI   rJ   r   r?   )r   rL   )ÚaxisrL   zNo Image data blocks found.rM   r"   )rƒ   r   r   ÚconvertÚgetdatarE   rS   rC   rD   ÚwhereÚsumrB   ÚprintÚminrq   rH   ÚflattenÚtobytesri   Ú
decompressr   r,   r   )rt   r    ÚoutarrZ
black_colsZdata_block_lowerZdata_block_upperZ
data_blockr)   r   r   r   Úextract_image_data_embedp   s    :*.
r   c              
   C   s¼  ddl m} |r tjdtdd ddlm} |  ¡ }d}	d}
tj	d	d
|j
d
 fdd}t|j
d
 ƒD ]l}d
|||j
d
  |
 ƒ }t|d
||j
d
 | |j
d
  |
 d ƒ ƒ}| d|fdddt|d ƒf¡ qdt | d	¡| |j
¡¡}t |¡}||	ƒ}d}|jd||d\}}}}tt|	|j
d d |d  |  ƒdƒ}	||	ƒ}|jd||d\}}}}|j||f|d|dd |jd||d\}}}}tt|	|j
d d | |  ƒdƒ}|jd||d\}}}}tt|	|j
d d | |  ƒdƒ}|jd||d\}}}}tt|	|j
d d | |  ƒdƒ}|t|||ƒƒ}|j||j
d
 | f|d|dd |j|j
d d |j
d
 | f|d|dd |j|j
d | |j
d
 | f|d|dd |S )Nr   )Úget_fontzMpassing in a textfont to caption_image_overlay is deprecated and does nothingrL   )Ú
stacklevel)Úcosé    g      ø?ÚRGBArJ   )r   r   r   r   )Úcolorgš™™™™™ñ?r1   é
   rh   )Úfontg      è?rM   éH   Últ)r1   r1   r1   éæ   )Úanchorr—   rO   rb   ÚlsÚmsÚrs)Úmodules.imagesr   ÚwarningsÚwarnÚDeprecationWarningÚmathr’   rl   r   rQ   rS   r@   rq   ÚputpixelÚintÚalpha_compositer…   rm   r   rR   ÚtextbboxrŠ   Útext)ZsrcimageÚtitleÚ
footerLeftÚ	footerMidÚfooterRightZtextfontr   r’   rt   ÚfontsizeÚfactorÚgradientr]   ÚmagrY   r—   Úpaddingr:   Úwru   Zfontsize_leftZfontsize_midZfontsize_rightr   r   r   Úcaption_image_overlay…   sH    ý."
($$$",,r³   Ú__main__ztest_embedding.pngzsd-ti-embeddingr”   )é   rµ   )r1   r1   éÈ   r1   r©   rª   r«   r¬   rf   Ú*)rL   i   c                 C   s   g | ]}t tƒ‘qS r   ©r7   r<   r8   r   r   r   r=   Í   r>   r=   éd   )déý   éò   é   é,   é   é   éï   é…   é&   éO   é§   rM   é±   é_   é‚   rÃ   éN   é   é4   é×   éÜ   éÂ   é~   é   rP   é³   é    é™   é•   é2   éi   rÉ   é   éÚ   éÇ   é   é6   éÆ   éÁ   rÂ   é€   é   é5   éÃ   é|   éK   éÍ   é   rN   é‘   r   rÏ   é   é”   rK   é-   r×   é«   é7   éù   éa   é¦   rä   é#   r   é)   éÝ   éz   rË   éª   é   éq   éº   rì   éw   ró   é   é¹   éB   éŒ   ræ   rï   é%   é?   é‰   ém   éØ   rê   éŸ   rå   éR   éÌ   éV   éI   éÞ   r½   rÛ   év   rP   rì   c                 C   s   g | ]}t tƒ‘qS r   r¸   r8   r   r   r   r=   Ú   r>   i † iîCÂ )r.   r/   r0   r   )r   )N)0r%   r   r    r   r   ri   ÚPILr   r   r   r   r   r   r   r*   r-   r6   rH   ra   rw   rƒ   r   r³   r   ÚopenZ	testEmbedr)   r¨   rQ   rt   Z	cap_imager   ÚrandomZ
test_embedZembedded_imageZretrived_embedÚstrZembedded_image2r<   r   r@   rC   rD   r   Zshared_randomZreference_randomrˆ   Zhunna_kay_random_sumr   r   r   r   Ú<module>   sJ   

$

/



$	(