a
    AdQ                     @   sr   d dl Z d dlmZ d dlZd dlmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZmZ G dd dejZdS )    N)Image	ImageDraw)imagesdevices)	Processedprocess_images)optsstatec                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Scriptc                 C   s   dS )NzPoor man's outpainting )selfr   r   E/var/www/html/stable-diffusion-webui/scripts/poor_mans_outpainting.pytitle   s    zScript.titlec                 C   s   |S )Nr   )r   
is_img2imgr   r   r   show   s    zScript.showc              	   C   s   |sd S t jddddd| dd}t jddd	d
d| dd}t jdg ddd| dd}t jdg dg d| dd}||||gS )NzPixels to expand         pixels)labelminimummaximumstepvalueelem_idz	Mask blurr   @         	mask_blurzMasked content)filloriginalzlatent noisezlatent nothingr   indexinpainting_fill)r   choicesr   typer   zOutpainting direction)leftrightupdown	direction)r   r#   r   r   )grSliderr   RadioCheckboxGroup)r   r   r   r   r"   r)   r   r   r   ui   s     z	Script.uic           +   
   C   sB  d }d }|d |_ ||_d|_d|v r*|nd}d|v r:|nd}	d|v rJ|nd}
d|v rZ|nd}|jd }t|j| |	 d d }t|j|
 | d d }|dkr|||j  ||	  }|	dkr||j | }	|
dkr|
||j  |
|  }
|dkr
||j |
 }t	d	||f}|
|||
f t	d
|j|jfd}t|}|j||dkrb|d nd |
|
dkrz|d nd |j|	 |	dkr|d nd |j| |dkr|d nd fdd t	d
|j|jfd}t|}|j||dkr|d nd |
|
dkr|d nd |j|	 |	dkr2|d nd |j| |dkrP|d nd fdd t  tj||j|j|d}tj||j|j|d}tj||j|j|d}d|_d|_d|_d|_g }g }g }g }t|j|j|jD ]\\}}}\}}}\}}} t||| D ]\}!}"}#|!dd \}$}%|$|krd|$|% |j|	 krd||
krd|| |j| krdq
||!d  ||"d  ||#d  q
qt|}&tdt| dt|jd d  dt|j d |&t_t|&D ]p}'||' g|_||' |_||' |_d|'d  d|& t_ t!|}(|d u r8|(j"}|(j#}|(j"d |_"||(j7 }qd})|jD ]\}}}|D ]}!|!dd \}$}%|$|kr|$|% |j|	 kr||
kr|| |j| krqj|)t|k r||) nt	d	|j|jf|!d< |)d7 })qjq\t$|}*t%j&r.tj'|*|j(d||j)t%j*||d t+||*g||}(|(S )N   Fr%   r   r&   r'   r(   r   RGBLwhiteblack)r   )tile_wtile_hoverlapr   Tz/Poor man's outpainting will process a total of z images tiled as x.zBatch z out of  )infop),r   r"   inpaint_full_resinit_imagesmathceilwidthheightr   newpaster   Draw	rectangler   torch_gcr   
split_gridn_iter
batch_sizedo_not_save_griddo_not_save_samplesziptilesappendlenprintr	   	job_countrange
image_masklatent_maskjobr   seedr:   combine_gridr   samples_save
save_imageoutpath_samplespromptsamples_formatr   )+r   r;   r   r   r"   r)   initial_seedinitial_infor%   r&   r'   r(   init_imgtarget_wtarget_himgmaskdrawrT   Zlatent_drawgridZ	grid_maskZgrid_latent_maskworkZ	work_maskZwork_latent_maskZwork_resultsyhrow_row_maskZrow_latent_maskZtiledataZtiledata_maskZtiledata_latent_maskr7   wbatch_counti	processedimage_indexcombined_imager   r   r   run   s    




.<4


<.
 z
Script.runN)__name__
__module____qualname__r   r   r.   rr   r   r   r   r   r
      s   r
   )r>   modules.scriptsscriptsgradior*   PILr   r   modulesr   r   Zmodules.processingr   r   Zmodules.sharedr   r	   r
   r   r   r   r   <module>   s   