§
    NÛ¾jy  ã                  óî   — d Z ddlmZ ddlZddlmZ ddlmZ ddlZddl	Z	ddl
mZmZ ddlmZ  edd¬	¦  «         G d
„ d¦  «        ¦   «         Z	 	 d!d"d„Z	 	 	 	 d#d$d„Zd%d„Zed k    r e¦   «          dS dS )&zî
FreeExile WebP Texture Compressor.
Converts and optimizes PNG textures to WebP format for high-performance Web and Mobile deployment.
Target: Achieves <= 50% of original PNG file size, significantly reducing memory and transfer budgets.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚListÚOptional)ÚImageT)ÚslotsÚfrozenc                  ód   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   dS )ÚCompressionResultz:Stores metrics for a single texture compression operation.r   Ú
input_pathÚoutput_pathÚintÚoriginal_sizeÚcompressed_sizeÚfloatÚcompression_ratioÚsaved_bytesÚreduction_percentageÚduration_msN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    ú@C:\Projects\FreeExile\tools\asset_pipeline\texture_compressor.pyr   r      sx   € € € € € € àDÐDØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr   r   éP   r   ú
Path | strr   úOptional[Path | str]Úqualityr   Úreturnc                óþ  — t          j        ¦   «         }t          | ¦  «                             ¦   «         }|                     ¦   «         r|                     ¦   «         st          d|› �¦  «        ‚|r!t          |¦  «                             ¦   «         n|                     d¦  «        }|j         	                    dd¬¦  «         | 
                    ¦   «         j        }t          j        |¦  «        5 }|j        dv s	d|j        v r|                     d¦  «        }n|                     d¦  «        }|                     |d	t%          d
t'          d|¦  «        ¦  «        d¬¦  «         ddd¦  «         n# 1 swxY w Y   | 
                    ¦   «         j        }	||	z
  }
|	t%          d
|¦  «        z  }|
t%          d
|¦  «        z  dz  }t          j        ¦   «         |z
  dz  }t)          ||||	||
|t+          |d¦  «        ¬¦  «        S )aF  Compresses a PNG/JPEG texture to WebP format.

    Args:
        input_path: Source image file path.
        output_path: Destination .webp path. If None, uses same stem + '.webp'.
        quality: WebP quality from 1 to 100 (default: 80).

    Returns:
        CompressionResult with file sizes and reduction statistics.
    zSource texture not found: ú.webpT)ÚparentsÚexist_ok)ÚRGBAÚLAÚtransparencyr(   ÚRGBÚWEBPé   éd   é   )Úformatr"   ÚmethodNg      Y@g     @�@é   )r   r   r   r   r   r   r   r   )ÚtimeÚperf_counterr   ÚresolveÚexistsÚis_fileÚFileNotFoundErrorÚwith_suffixÚparentÚmkdirÚstatÚst_sizer   ÚopenÚmodeÚinfoÚconvertÚsaveÚmaxÚminr   Úround)r   r   r"   Ú
start_timeÚsrcÚdstÚ	orig_sizeÚimgÚ
target_imgr   ÚsavedÚratioÚreduction_pctÚ
elapsed_mss                 r   Úcompress_to_webprP   !   s1  € õ Ô"Ñ$Ô$€JÝ
ˆzÑ
Ô
×
"Ò
"Ñ
$Ô
$€CØ�:Š:‰<Œ<ð D˜sŸ{š{™}œ}ð DÝÐ B¸SÐ BÐ BÑCÔCÐCà)4Ð
R�$ˆ{Ñ
Ô
×
#Ò
#Ñ
%Ô
%Ð
%¸#¿/º/È'Ñ:RÔ:R€CØ„J×Ò˜T¨DÐÑ1Ô1Ð1à—’‘
”
Ô"€Iå	Œ�C‰Œð 
˜CàŒ8�~Ð%Ð%¨.¸C¼HÐ*DÐ*DØŸš VÑ,Ô,ˆJˆJàŸš UÑ+Ô+ˆJð 	�ŠØØÝ˜�3˜s GÑ,Ô,Ñ-Ô-Øð	 	ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð —h’h‘j”jÔ(€OØ˜Ñ'€EØ�c ! YÑ/Ô/Ñ/€EØ�S  IÑ.Ô.Ñ.°%Ñ7€MÝÔ#Ñ%Ô%¨
Ñ2°fÑ<€JåØØØØ'ØØØ*Ý˜* aÑ(Ô(ð	ñ 	ô 	ð 	s   Ã0A3E/Å/E3Å6E3ú*.pngÚ
source_dirÚ
output_dirÚ	recursiveÚboolÚpatternÚstrúList[CompressionResult]c                óš  — t          | ¦  «                             ¦   «         }|                     ¦   «         r|                     ¦   «         st	          d|› �¦  «        ‚|r!t          |¦  «                             ¦   «         nd}|r|                     |¦  «        n|                     |¦  «        }g }t          |¦  «        D ]Œ}	|	j         	                    ¦   «         dk    rŒ |r.|	 
                    |¦  «        }
||
z                       d¦  «        }n|	                     d¦  «        }t          |	||¬¦  «        }|                     |¦  «         Œ�|S )z=Batch compresses all textures matching pattern in source_dir.zDirectory not found: Nr%   ©r"   )r   r5   r6   Úis_dirÚNotADirectoryErrorÚrglobÚglobÚsortedÚsuffixÚlowerÚrelative_tor9   rP   Úappend)rR   rS   r"   rT   rV   Úsrc_dirÚtarget_rootÚiteratorÚresultsÚ	file_pathÚrelÚout_fileÚress                r   Úbatch_compress_directoryrl   [   sR  € õ �:ÑÔ×&Ò&Ñ(Ô(€GØ�>Š>ÑÔð D 7§>¢>Ñ#3Ô#3ð DÝ Ð!B¸Ð!BÐ!BÑCÔCÐCà0:ÐD•$�zÑ"Ô"×*Ò*Ñ,Ô,Ð,À€KØ)2ÐMˆw�}Š}˜WÑ%Ô%Ð%¸¿ºÀWÑ8MÔ8M€HØ')€Gå˜HÑ%Ô%ð ð ˆ	ØÔ×!Ò!Ñ#Ô# wÒ.Ð.Øàð 	6Ø×'Ò'¨Ñ0Ô0ˆCØ# cÑ)×6Ò6°wÑ?Ô?ˆHˆHà ×,Ò,¨WÑ5Ô5ˆHå˜y¨(¸GÐDÑDÔDˆØ�Š�sÑÔÐÐà€Nr   ÚNonec            	     ó¬  — t          j        d¬¦  «        } |                      ddt          d¬¦  «         |                      ddt          d	d
¬¦  «         |                      ddt          d	d¬¦  «         |                      dt          d	d¬¦  «         |                      ddt          dd¬¦  «         |                      ddd¬¦  «         |                      ddd¬¦  «         |                      ¦   «         }|j        rót          |j        |j        |j	        ¬¦  «        }t          d|j        j        › d|j        j        › �¦  «         t          d|j        › d|j        › d|j        d z  d!›d"�¦  «         t          d#|j        › d|j        d!›d$|j        › d%�¦  «         |j        rI|j        d&k    r@t          d'|j        d z  d!›d(�t*          j        ¬)¦  «         t+          j        d*¦  «         d	S d	S d	S |j        rÌt3          |j        |j        |j	        |j         ¬+¦  «        }t9          d,„ |D ¦   «         ¦  «        }t9          d-„ |D ¦   «         ¦  «        }|t;          d*|¦  «        z  }t          d.t=          |¦  «        › d/�¦  «         t          d0|› d|› d|d z  d!›d"�¦  «         t          d#||z
  › dd*|z
  d z  d!›d"�¦  «         d	S |                      ¦   «          d	S )1z&CLI interface for texture compression.z!FreeExile WebP Texture Compressor)Údescriptionz--inputz-izInput texture file)ÚtypeÚhelpz--outputz-oNzOutput .webp path)rp   Údefaultrq   z--dirz-dzDirectory to batch compressz--output-dirzTarget directory for batchz	--qualityz-qr   zWebP quality (1-100)z--no-recursiveÚ
store_truezDisable recursive scan)Úactionrq   z--verify-budgetzAssert WebP <= 50% of PNG sizerZ   zCompressed z -> z  z bytes (r.   z.1fz%)z	  Saved: z
%), Time: Úmsg      à?z)[ERROR] Compression exceeded 50% budget: ú%)Úfiler-   )rS   r"   rT   c              3  ó$   K  — | ]}|j         V — Œd S ©N)r   ©Ú.0Úrs     r   ú	<genexpr>zmain.<locals>.<genexpr>–   s$   è è € Ð;Ð;¨Q˜œÐ;Ð;Ð;Ð;Ð;Ð;r   c              3  ó$   K  — | ]}|j         V — Œd S ry   )r   rz   s     r   r}   zmain.<locals>.<genexpr>—   s%   è è € Ð=Ð=¨q˜Ô*Ð=Ð=Ð=Ð=Ð=Ð=r   zBatch compressed z files.z	  Total: ) ÚargparseÚArgumentParserÚadd_argumentr   r   Ú
parse_argsÚinputrP   Úoutputr"   Úprintr   Únamer   r   r   r   r   r   r   Úverify_budgetÚsysÚstderrÚexitÚdirrl   rS   Úno_recursiveÚsumrC   ÚlenÚ
print_help)ÚparserÚargsrk   Úres_listÚ
total_origÚ
total_compÚoverall_ratios          r   Úmainr–   {   sN  € åÔ$Ð1TÐUÑUÔU€FØ
×Ò˜	 4­dÐ9MÐÑNÔNÐNØ
×Ò˜
 D­t¸TÐH[ÐÑ\Ô\Ð\Ø
×Ò˜ ­D¸$ÐEbÐÑcÔcÐcØ
×Ò˜­T¸4ÐFbÐÑcÔcÐcØ
×Ò˜ Tµ¸RÐF\ÐÑ]Ô]Ð]Ø
×ÒÐ(°ÐD\ÐÑ]Ô]Ð]Ø
×ÒÐ)°,ÐEeÐÑfÔfÐfØ×ÒÑÔ€Dà„zð Ý˜tœz¨4¬;ÀÄÐMÑMÔMˆÝÐK˜CœNÔ/ÐKÐK°S´_Ô5IÐKÐKÑLÔLÐLÝÐh�3Ô$ÐhÐh¨#Ô*=ÐhÐhÀsÔG\Ð]`ÑG`ÐhÐhÐhÐhÑiÔiÐiÝÐn˜#œ/ÐnÐn°3Ô3KÐnÐnÐnÐ[^Ô[jÐnÐnÐnÑoÔoÐoØÔð 	 #Ô"7¸$Ò">Ð">ÝÐ^¸cÔ>SÐTWÑ>WÐ^Ð^Ð^Ð^ÕehÔeoÐpÑpÔpÐpÝŒH�Q‰KŒKˆKˆKˆKð	ð 	Ð">Ð">ð 
Œð Ý+ØŒHØ”Ø”LØÔ+Ð+ð	
ñ 
ô 
ˆõ Ð;Ð;°(Ð;Ñ;Ô;Ñ;Ô;ˆ
ÝÐ=Ð=°HÐ=Ñ=Ô=Ñ=Ô=ˆ
Ø"¥S¨¨JÑ%7Ô%7Ñ7ˆÝÐ8¥# h¡-¤-Ð8Ð8Ð8Ñ9Ô9Ð9ÝÐW˜*ÐWÐW¨*ÐWÐW¸mÈCÑ>OÐWÐWÐWÐWÑXÔXÐXÝÐZ˜* zÑ1ÐZÐZ¸AÀÑ<MÈsÑ;RÐZÐZÐZÐZÑ[Ô[Ð[Ð[Ð[à×ÒÑÔÐÐÐr   Ú__main__)Nr   )r   r    r   r!   r"   r   r#   r   )Nr   TrQ   )rR   r    rS   r!   r"   r   rT   rU   rV   rW   r#   rX   )r#   rm   )r   Ú
__future__r   r   Údataclassesr   Úpathlibr   rˆ   r3   Útypingr   r   ÚPILr   r   rP   rl   r–   r   r   r   r   ú<module>r�      sS  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 
€
€
€
Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð ð €�˜dÐ#Ñ#Ô#ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ $Ô#ð	ð )-Øð7ð 7ð 7ð 7ð 7ðx (,ØØØðð ð ð ð ð@"ð "ð "ð "ðJ ˆzÒÐØ€D�F„F€F€F€Fð Ðr   