Ë
    ;ŒÕjÍ  ã                   ó$  — d Z ddlZddlZddlZddlmZ ej                  j                  dd¬«       ddlm	Z	m
Z
mZ  ee«      j                  «       j                  j                  ZdZ ed	«      Zd
Zd„ Zd„ Z	 	 dd„Zd„ Zd„ Zedk(  r e«        yy)ue  watermark: marca de agua de texto con Pillow (sin GPU ni red).

    # CLI sobre un fichero o un directorio (recursivo), marca de agua:
    python Engine/watermark.py --in Output/pilots --out "$env:TEMP\wm_out"         --text "PlumLoom" --position bottom-right --opacity 0.35

    # --text "" (o sin --text) = copia plana, byte a byte (no carga fuente).

La parte de watermarking la usa el paso de packaging de pack_builder.py
(--pack): con --watermark "<texto>" marca, sin el copia en plano.

DiseÃ±o:
- `apply_watermark` lee la imagen, la compone con un overlay RGBA (el canal
  alfa del texto = `opacity`, asÃ­ se respeta la transparencia) y la guarda en
  `dst`. Nunca escribe si `src` y `dst` son el mismo fichero.
- `watermark_dir` recorre `in_dir` con `rglob("*.png")` (recursivo) y preserva
  la ruta relativa bajo `out_dir`; en un dir plano el nombre coincide.
é    N)ÚPathzutf-8Úbackslashreplace)ÚencodingÚerrors)ÚImageÚ	ImageDrawÚ	ImageFont)úbottom-rightúbottom-leftú	top-rightútop-leftÚcenterzC:\Windows\Fonts\arial.ttfg{®Gáz”?c                 óÞ   — 	 t        j                  t        t        «      | «      S # t        $ r> 	 t        j
                  | «      cY S # t        $ r t        j
                  «       cY cY S w xY ww xY w)uD   arial.ttf si estÃ¡; si no, la fuente por defecto (tamaÃ±o ignorado).)r	   ÚtruetypeÚstrÚ	FONT_PATHÚ	ExceptionÚload_defaultÚ	TypeError)Úsizes    úEngine/watermark.pyÚ
_load_fontr   &   sa   € ð,Ü×!Ñ!¤#¤i£.°$Ó7Ð7øÜò ,ð	,Ü×)Ñ)¨$Ó/Ò/øÜò 	,Ü×)Ñ)Ó+Ô+ð	,úð,ús,   ‚"% ¥	A,¯AÁA,ÁA(Á#A,Á'A(Á(A,c                 óš   — |dk(  r| |z
  |z
  ||z
  |z
  fS |dk(  r
|||z
  |z
  fS |dk(  r
| |z
  |z
  |fS |dk(  r||fS | |z
  dz  ||z
  dz  fS )uH   Esquina superior-izquierda (X, Y) del bloque de texto, segÃºn posiciÃ³n.r
   r   r   r   é   © )ÚwÚhÚtwÚthÚpadÚpositions         r   Ú_text_xyr"   1   s‡   € à�>Ò!Ø�3‰w˜‰|˜Q ™W r™\Ð)Ð)Ø�=Ò Ø�A˜‘G˜b‘LÐ Ð Ø�;ÒØ�3‰w˜‰|˜SÐ Ð Ø�:ÒØ�CˆxˆØ�‰F�a‰<˜!˜b™& A™Ð%Ð%ó    c                 óP  — t        | «      } t        |«      }|t        vrt        d|›dt        › �«      ‚| j                  «       |j                  «       k(  rt        d| › �«      ‚|j                  j                  dd¬«       |st        j                  | |«       yt        dt        dt        t        |«      dz  «      «      «      }t        j                  | «      5 }|j                  d	«      }ddd«       j                  \  }	}
t!        t        d
t        t        |«      |	z  «      «      «      }t        j"                  d	|	|
fd«      }t%        j&                  |«      }|j)                  d||¬«      }|d   |d   z
  }|d   |d
   z
  }t        d
t        t        |	|
«      t*        z  «      «      }t-        |	|
||||«      \  }}|j/                  ||d   z
  ||d
   z
  f||ddd|f¬«       t        j0                  ||«      j                  d«      }|j3                  |«       y# 1 sw Y   �Œ2xY w)ui  Escribe `src` en `dst` con la marca `text`.

    `scale` = tamaÃ±o de fuente como fracciÃ³n del ancho. `opacity` (0..1) va en
    el canal alfa del texto. `text=""` copia el fichero tal cual (nunca falla
    por fuente). Crea los directorios padre de `dst`. Si `src == dst` (mismo
    fichero) NO escribe nada: lanza ValueError para no truncar el original.
    zposicion invalida: z; usa z src y dst son el mismo fichero: T)ÚparentsÚexist_okNr   éÿ   ÚRGBAé   )r   r   r   r   )r   r   )Úfontr   é   )r*   ÚfillÚRGB)r   Ú	POSITIONSÚ
ValueErrorÚresolveÚparentÚmkdirÚshutilÚcopyfileÚmaxÚminÚroundÚfloatr   ÚopenÚconvertr   r   Únewr   ÚDrawÚtextbboxÚ	_PAD_FRACr"   ÚtextÚalpha_compositeÚsave)ÚsrcÚdstr?   r!   ÚopacityÚscaleÚalphaÚopenedÚbaser   r   r*   ÚoverlayÚdrawÚbboxr   r   r    ÚxÚyÚcomposeds                        r   Úapply_watermarkrO   >   sï  € ô ˆs‹)€CÜ
ˆs‹)€CØ”yÑ ÜÐ.¨x¨l¸&ÄÀÐLÓMÐMØ
‡{�{ƒ}˜Ÿ™›Ò%ÜÐ;¸C¸5ÐAÓBÐBà‡J�J×Ñ˜T¨DÐÔ1áÜ�‰˜˜SÔ!Øä�”3�sœE¤%¨£.°3Ñ"6Ó7Ó8Ó9€EÜ	�‰�CŒ˜FØ�~‰~˜fÓ%ˆ÷ 
à�9‰9�D€A€qÜ”c˜!œU¤5¨£<°!Ñ#3Ó4Ó5Ó6€DÜ�i‰i˜  A ¨Ó5€GÜ�>‰>˜'Ó"€DØ�=‰=˜ ¨Dˆ=Ó1€DØ	ˆa‰�4˜‘7Ñ	€BØ	ˆa‰�4˜‘7Ñ	€BÜ
ˆa””s˜1˜a“y¤9Ñ,Ó-Ó
.€CÜ�A�q˜"˜b # xÓ0�D€A€qà‡I�Iˆq�4˜‘7‰{˜A  Q¡™KÐ(¨$°TØ˜˜c 5Ð)ð ô +ä×$Ñ$ T¨7Ó3×;Ñ;¸EÓB€HØ‡M�M�#Õ÷ 
‰ús   ÃHÈH%c                 óÚ   — t        | «      } t        |«      }g }t        | j                  d«      «      D ]5  }||j                  | «      z  }t	        |||fi |¤Ž |j                  |«       Œ7 |S )zŒMarca cada `*.png` de `in_dir` (recursivo) en `out_dir/<ruta relativa>`.

    -> lista de ficheros escritos (orden por ruta de origen).
    z*.png)r   ÚsortedÚrglobÚrelative_torO   Úappend)Úin_dirÚout_dirr?   ÚkwÚwrittenrB   rC   s          r   Úwatermark_dirrY   g   sj   € ô
 �&‹\€FÜ�7‹m€GØ€GÜ�f—l‘l 7Ó+Ö,ˆØ˜Ÿ™¨Ó/Ñ/ˆÜ˜˜S $Ñ-¨"Ò-Ø�‰�sÕð -ð €Nr#   c                  ó  — t        j                  d¬«      } | j                  dddd¬«       | j                  dd	dd
¬«       | j                  ddd¬«       | j                  ddt        ¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  «       }t        |j                  «      }t        |j                  «      }|j                  |j                  |j                  dœ}|j                  «       rt        |||j                  fi |¤Ž}nI|j                  «       r+||j                   z  }t#        |||j                  fi |¤Ž |g}nt%        d|› �«      ‚t'        dt)        |«      › d|› �«       y )NzMarca de agua de texto (Pillow))Údescriptionz--inÚinpTz'directorio (recursivo) o PNG de entrada)ÚdestÚrequiredÚhelpz--outÚoutzdirectorio de salidaz--textÚ z&texto de la marca; vacio = copia plana)Údefaultr_   z
--positionr
   )rb   Úchoicesz	--opacityçffffffÖ?)Útyperb   z--scaleçìQ¸…ë¡?)r!   rD   rE   z[!] no existe: z[OK] z ficheros -> )ÚargparseÚArgumentParserÚadd_argumentr.   r8   Ú
parse_argsr   r\   r`   r!   rD   rE   Úis_dirrY   r?   Úis_fileÚnamerO   Ú
SystemExitÚprintÚlen)ÚpÚargsrB   r`   rW   rX   rC   s          r   Úmainrs   v   sT  € Ü×ÑÐ,MÔN€AØ‡N�N�6 °ØAð ô Cà‡N�N�7 °Ø.ð ô 0à‡N�N�8 RØ@ð ô Bà‡N�N�<¨Ä€NÔKØ‡N�N�;¤U°D€NÔ9Ø‡N�N�9¤5°%€NÔ8Ø�<‰<‹>€Dä
ˆt�x‰x‹.€CÜ
ˆt�x‰x‹.€CØ—m‘m°·±Ø—:‘:ñ
€Bà
‡z�z„|Ü  S¨$¯)©)Ñ:°rÑ:‰Ø	�‰ŒØ�C—H‘H‰nˆÜ˜˜S $§)¡)Ñ2¨rÒ2Ø�%‰ä˜?¨3¨%Ð0Ó1Ð1ä	ˆE”#�g“,�˜}¨S¨EÐ
2Õ3r#   Ú__main__)r
   rd   rf   )Ú__doc__rg   r3   ÚsysÚpathlibr   ÚstdoutÚreconfigureÚPILr   r   r	   Ú__file__r0   r1   ÚBASE_DIRr.   r   r>   r   r"   rO   rY   rs   Ú__name__r   r#   r   Ú<module>r~      s¡   ðñó$ Û Û 
Ý à ‡
�
× Ñ  Ð0BÐ Ô Cç +Ñ +á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€àN€	áÐ.Ó/€	ð €	ò,ò
&ð .<Ø(-ó&òRò4ð: ˆzÒÙ…Fð r#   