o
    <jO                     @  sh  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Z
ddddfddZdgddZdhddZdidd Zdjd#d$Zdkd%d&Zdld-d.Zdmd2d3Zdnd5d6Zdod7d8Zdpd9d:Zdqd;d<Zdrd?d@ZdsdAdBZdtdDdEZdudFdGZdudHdIZdudJdKZdvdLdMZdwdOdPZdudQdRZdudSdTZ dvdUdVZ!dwdWdXZ"dxdZd[Z#dyd]d^Z$dzd`daZ%d{dddeZ&dS )|    )annotationsN)Counterdeque)Anys   PNG

g      X@)
chroma_keychroma_thresholdimage_bytesbytesr   tuple[int, int, int] | Noner   floatreturntuple[bytes, dict[str, Any]]c             
   C  s  zt | }W n  ty& } z| ddt|dd dfW  Y d}~S d}~ww |d dkrt|}|durLtdd |D t|d	 t|d
 d||dS dd |D }dd |D }tdd |D rt|t|d	 t|d
 st|s| ddd|d	 |d
 dfS t	dd |D t|d	 t|d
 ddS |d dks|d r| ddd|d	 |d
 dfS |d dks|d dks|d dkr| ddd|d	 |d
 |d |d dfS t
|}|durtdd |D t|d	 t|d
 d||dS t	dd |D t|d	 t|d
 ddS ) zLConvert common Qwen checkerboard RGB PNG backgrounds into transparent alpha.FNx   )appliedalpha_capablereason
color_type   c                 S      g | ]\}}}}||||fqS  r   .0redgreenbluealphar   r   H/opt/sixxie/releases/current/services/media_pipeline/png_transparency.py
<listcomp>        z$ensure_png_alpha.<locals>.<listcomp>widthheightT)pixelsr   r    source_has_alphar   r   c                 S     g | ]\}}}}|||fqS r   r   r   r   r   r   _alphar   r   r   r   $       c                 S  s&   g | ]\}}}}|d kr|||fqS )r   r   r   r   r   r   r   %   s   & c                 s  s    | ]
^ }}|d kV  qdS )r   Nr   )r   _rgbr   r   r   r   	<genexpr>'       z#ensure_png_alpha.<locals>.<genexpr>png_already_has_alpha)r   r   r   r   r    c                 S  r   r   r   r   r   r   r   r   3   r   )r!   r   r    r"      has_trns   	bit_depth   	interlacer   unsupported_png_format)r   r   r   r   r    r   r.   c                 S     g | ]\}}}|||d fqS    r   r   r   r   r   r   r   r   r   P   r&   c                 S  r2   r3   r   r5   r   r   r   r   X   r&   )	_read_png
ValueErrorstr_decode_rgba_pixels"_remove_explicit_chroma_backgroundintany_opaque_edge_background_palette!_global_chroma_background_palette!_remove_connected_edge_background_decode_rgb_pixels)r   r   r   pngexcr!   
rgb_pixelsopaque_rgb_pixelsr   r   r   ensure_png_alpha   s   (



$




rE   r!   list[tuple[int, int, int, int]]r   r;   r    r"   booltuple[int, int, int]c                 C  s   t  }d}d}| D ]3\}	}
}}|dkst|	|
|f||kr'|d7 }|d q	t|	|
|f|r3|d7 }||	|
||f q	t||t||dkdd||||t|||d
fS )Nr      r   r   r   r   Texplicit_chroma_key)
r   r   methodr   r    transparent_pixelsr"   r   r   chroma_residue_pixels)	bytearray_rgb_distanceextend_is_chroma_residue_pixel_write_rgba_pngr	   list)r!   r   r    r"   r   r   rgbatransparent_countrN   r   r   r   original_alphar   r   r   r:   _   s,   	r:   c              	     s   dd | D }t |||}t|}|r8t|D ]\} || r qt fdd|D r/d||< qt||||| t }d}	t| D ]'\}\}
}}}|| rOdn|}|dkr_|	d7 }	|d qA||
|||f qA|	dk}t||t||dd	|||	|d
fS )Nc                 S  r#   r   r   r$   r   r   r   r      r&   z5_remove_connected_edge_background.<locals>.<listcomp>c                 3  s(    | ]}t  |d kpt |V  qdS )`   N)rP   _is_chroma_shadow_pixelr   colorpixelr   r   r(      s   & z4_remove_connected_edge_background.<locals>.<genexpr>Tr   rI   rJ   edge_background_flood_fill)r   r   rL   r   r    rM   r"   )	_find_connected_edge_backgroundr>   	enumerater<   _remove_connected_chroma_halorO   rQ   rS   r	   )r!   r   r    r"   rC   transparentdetached_chroma_paletteindexrU   rV   r   r   r   rW   r   r   r   r\   r   r?      s:   r?   dict[str, Any]c                 C  sR  |  ts	tdtt}d  } } } } } }}g }	d}
|d t| krtd| ||d  d }| |d |d  }|d }|| }| || }|d }|dkrctd	|\}}}}}}}n|d
krm|	| n|dkrtd}
n|dkryn|d t| ks'd |||||||hv rtd|dks|dkrtd|||||d|	|
dS )Nnot_pngF   >Ir+   r   r/      IHDR>IIBBBBB   IDATs   tRNST   IENDmissing_ihdrunsupported_png_compression    )r   r    r.   r   r0   idatr,   )
startswithPNG_SIGNATUREr7   lenstructunpackappendjoin)r   positionr   r    r.   r   compressionfilter_methodr0   
idat_partsr,   length
chunk_type
data_startdata_end
chunk_datar   r   r   r6      sH   
r6   rA   list[tuple[int, int, int]]c              	   C  s   t | d }t | d }d}|| }t| d }g }d}t|}t|D ]&}	|| }
|d7 }t||||  }||7 }t|||
| || |}q%g }|D ]}tdt|dD ]}||| ||d  ||d  f qZqP|S )Nr   r       rp   r   rI   r-   r;   zlib
decompressrO   range_unfilter_rowrv   rs   rA   r   r    bytes_per_pixelstriderawrowsrx   previous_filter_typerowr!   xr   r   r   r@      s,   
&r@   c              
   C  s   t | d }t | d }d}|| }t| d }g }d}t|}t|D ]&}	|| }
|d7 }t||||  }||7 }t|||
| || |}q%g }|D ]$}tdt|dD ]}||| ||d  ||d  ||d  f qZqP|S )	Nr   r    r+   rp   r   rI   r-   r   r   r   r   r   r   r9      s,   
0r9   r   rO   r   r   r   Nonec                 C  s   |dkrd S t t| D ]h}||kr| ||  nd}|| }||kr(|||  nd}|dkr9| | | d@ | |< q|dkrH| | | d@ | |< q|dkr[| | || d  d@ | |< q|dkrn| | t||| d@ | |< qtd| d S )Nr   rI   r4   r-   r   r+   unsupported_png_filter_)r   rs   _paethr7   )r   r   r   r   rd   leftup
upper_leftr   r   r   r     s    r   r   r   r   c                 C  sT   | | | }t ||  }t || }t || }||kr"||kr"| S ||kr(|S |S N)abs)r   r   r   estimateleft_distanceup_distanceupper_left_distancer   r   r   r     s   r   
list[bool]c                 C  sz  t | ||}dg||  }|s|S t }t|D ]!}d|d fD ]}|| | }t| | |r8d||< || q qt|D ]%}d|d fD ]}|| | }|| sbt| | |rbd||< || qFq>|r| }|| }|| }|d |f|d |f||d f||d ffD ]0\}	}
|	dk s|	|ks|
dk s|
|krq|
| |	 }|| rqt| | |rd||< || q|sf|S )NFr   rI   T)_edge_background_paletter   r   _is_background_pixelrv   popleft)r!   r   r    paletterb   queuer   yrd   next_xnext_y
next_indexr   r   r   r_   !  sJ   

4 
r_   c                 C  s   g }t |D ]}|| |  || |d | |   qt |D ]}|| ||   || || | d   q!dd |D }dd t|dD S )NrI   c                 S     g | ]
}t |rt|qS r   _is_supported_background_pixel	_quantizer   r]   r   r   r   r   Q  s    z,_edge_background_palette.<locals>.<listcomp>c                 S     g | ]\}}|qS r   r   r   r[   r   r   r   r   r   V      r   r   rv   r   most_common)r!   r   r    edge_pixelsr   r   
candidatesr   r   r   r   I  s   r   c                 C  s   g }t |D ]#}||d | | fD ]}| | \}}}}	|	dkr(||||f qqt |D ]%}
|
| |
| | d fD ]}| | \}}}}	|	dkrR||||f q<q.dd |D }dd t|dD S )NrI   r   c                 S  r   r   r   r   r   r   r   r   i      z3_opaque_edge_background_palette.<locals>.<listcomp>c                 S  r   r   r   r   r   r   r   r   j  r   r   r   )r!   r   r    r   r   rd   r   r   r   r   r   r   r   r   r   r=   Y  s"   r=   c                   sH   dd | D }|sg S t dtt| d   fddt|dD S )Nc                 S  r   r   )_is_chroma_key_liker   r   r   r   r   r   n  r   z5_global_chroma_background_palette.<locals>.<listcomp>r+   g{Gz?c                   s   g | ]
\}}| kr|qS r   r   )r   r[   count	thresholdr   r   r   r  r   r   )maxr;   rs   r   r   )r!   r   r   r   r   r>   m  s
   r>   rb   r   c                 C  s   t |rdnd}t|D ]h}g }t| D ]Q\}}	|| s!t|	|s"q|| }
|| }|
d |f|
d |f|
|d f|
|d ffD ]$\}}|dk sT||ksT|dk sT||krUq@||| |  rd||  nq@q|sk d S |D ]}d||< qmqd S )NrI   r   r   T)_palette_is_green_chromar   r`   _is_chroma_halo_pixelrv   )r!   rb   r   r    r   max_iterationsr   to_clearrd   r]   r   r   r   r   r   r   r   ra   u  s,   4 

ra   c                 C  s*   | D ]\}}}||kr||kr dS qdS )NTFr   )r   r   r   r   r   r   r   r     s
   r   r]   c                 C  s   t dd | D S )Nc                 s  s    | ]	}|d  d  V  qdS )r/   Nr   )r   valuer   r   r   r(         z_quantize.<locals>.<genexpr>)tupler\   r   r   r   r     s   r   c                 C  s   t | t|  dkS )N   )r   minr\   r   r   r   _is_low_saturation_gray  s   r   c                   sT   t  rt d }d|  kodkS   S t p)t p)t fddt D S )Nr   r   r4   c                 3      | ]
}t  |d kV  qdS H   NrP   rZ   r\   r   r   r(     r)   z1_is_supported_background_pixel.<locals>.<genexpr>)r   sum_is_high_saturation_chroma_is_desaturated_green_chromar<   _chroma_key_colors)r]   
brightnessr   r\   r   r     s   r   c                   s(   t  pt pt fddt D S )Nc                 3  r   r   r   rZ   r\   r   r   r(     r)   z&_is_chroma_key_like.<locals>.<genexpr>)r   r   r<   r   r\   r   r\   r   r     s
   r   c           	      C  s   | \}}}|D ]Z}|\}}}||kr)||kr)|dkr)|| dkr)|| dkr) dS ||krE||krE|dkrE|dkrE|d t ||k rE dS ||kra||kra|dkra|dkra|d t ||k ra dS qdS )N   rg   Td   F)r   )	r]   r   r   r   r   r[   	color_redcolor_green
color_bluer   r   r   r     s   

 ""r   chromac                 C  s   | \}}}|\}}}|dkr*|dkr*|dk r*|dko)|dko)|d |k o)|d |k S |dkrJ|dkrJ|dk rJ|dkoI|dkoI|d |k oI|d |k S |dkrj|dkrj|dk rj|dkoi|dkoi|d |k oi|d |k S t | |gS )N   r   P         )r   )r]   r   r   r   r   
chroma_redchroma_greenchroma_bluer   r   r   rR     s   

(((rR   c                 C  s   | \}}}t | t|  dk rdS t| d dk rdS |dkr'|dkr'|dk pb|dko2|dko2|dk pb|dko>|dk o>|dk pb|dkoJ|dkoJ|dk pb|dkoV|dk oV|d	k pb|d
kob|dkob|dk S )Nr   Fr   #   r   r   r            F   )r   r   r   r]   r   r   r   r   r   r   r     s    
r   c                 C  s:   | \}}}|dko|dko|dko|| dko|| dkS )Nr      Z   (   <   r   r   r   r   r   r     s   
0r   c                   s   t  fdd|D S )Nc                 3  s0    | ]}t  rt |d kpt |V  qdS r   )r   rP   rY   rZ   r\   r   r   r(     s    
z'_is_background_pixel.<locals>.<genexpr>)r<   )r]   r   r   r\   r   r     s   r   c                   s\  t  sdS | \}}} \}}}dd t D }dd t D }	|s&dS |||ft fdd|D r9dS tfdd|	D rFdS tfdd|D }
tfd	d|	D d
d}|
| dk rfdS td dk rpdS |dkr|dkr|dk rt|| dkS |dkr|dkr|dk rt|| dkS |dkr|dkr|dk rt|| dkS dS )NFc                 S  s   g | ]
\}}|d kr|qS r   r   r   rd   r   r   r   r   r     r   z+_is_chroma_shadow_pixel.<locals>.<listcomp>c                 S  s   g | ]
\}}|d kr|qS r   r   r   r   r   r   r     r   c                 3  s0    | ]}| d k p|  | d kV  qdS )K      Nr   r   rd   r   valuesr   r   r(     s   . z*_is_chroma_shadow_pixel.<locals>.<genexpr>c                 3  s    | ]	} | d kV  qdS )r   Nr   r   r   r   r   r(     r   c                 3      | ]} | V  qd S r   r   r   r   r   r   r(         c                 3  r   r   r   r   r   r   r   r(     r   r   )default-   r   r   r   r   r   T)r   r`   r<   r   r   r   r   )r]   r   r   r   r   r   r   r   high_channelslow_channelshigh_minlow_maxr   r   r   rY     s4   


rY   rightc                   s    t  fddtdD d S )Nc                 3  s$    | ]} | |  d  V  qdS )r-   Nr   r   r   r   r   r   r(   	  s   " z _rgb_distance.<locals>.<genexpr>r   g      ?)r   r   r   r   r   r   rP     s    rP    tuple[tuple[int, int, int], ...]c                   C  s   dS )N))r4   r   r4   )r   r4   r4   )r   r4   r   )r4   r4   r   )r   r   r4   )r4      r   r   r   r   r   r   r     s   r   rU   c                 C  s   | d }t  }t|D ]}|d |||| |d |   qtdtd| |dddddtdtt	|td	d
g}t
d
| S )Nr+   r   rI   ri   rj   r/   r   rk   rl   ro   )rO   r   rv   rQ   
_png_chunkrt   packr   compressr	   rr   rw   )r   r    rU   r   r   r   chunksr   r   r   rS     s   
 rS   r}   datac                 C  s6   t | | d@ }tdt||  | td| S )Nl    rh   )binasciicrc32rt   r   rs   )r}   r   checksumr   r   r   r   %  s   $r   )r   r	   r   r
   r   r   r   r   )r!   rF   r   r;   r    r;   r"   rG   r   rH   r   r   r   r   )
r!   rF   r   r;   r    r;   r"   rG   r   r   )r   r	   r   re   )rA   re   r   r   )rA   re   r   rF   )
r   rO   r   rO   r   r;   r   r;   r   r   )r   r;   r   r;   r   r;   r   r;   )r!   r   r   r;   r    r;   r   r   )r!   r   r   r;   r    r;   r   r   )r!   rF   r   r;   r    r;   r   r   )r!   r   r   r   )r!   r   rb   r   r   r;   r    r;   r   r   r   r   )r   r   r   rG   )r]   rH   r   rH   )r]   rH   r   rG   )r]   rH   r   r   r   rG   )r]   rH   r   rH   r   rG   )r   rH   r   rH   r   r   )r   r   )r   r;   r    r;   rU   r	   r   r	   )r}   r	   r   r	   r   r	   )'
__future__r   r   rt   r   collectionsr   r   typingr   rr   rE   r:   r?   r6   r@   r9   r   r   r_   r   r=   r>   ra   r   r   r   r   r   r   rR   r   r   r   rY   rP   r   rS   r   r   r   r   r   <module>   sJ    
R
#
'
'




(
















