
    ~/ic                       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
mZmZmZ g dZg dZddd	Zd d
Zd!dZ	 	 	 	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#dZddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZd%dZd&dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZeeeeedZy)(u  Procedural PIL renderer for hybrid patterns (task-2428 Phase 2-1b).

Satori CLI는 환경마다 인터페이스가 다르고 본 시스템에서는 stdin JSON 호출이 호환되지 않아
Pillow fallback이 단조 단색 PNG를 생성한다(unique_colors=1, std_mean~3.5).
이를 차단하기 위해 본 모듈은 hybrid 패턴별 시각 분화를 보장하는 procedural PIL render를
제공한다. 외부 API 호출 0건 — 결정성 100% (시드 기반).

quality_evaluator.PATTERN_THRESHOLDS 임계 충족 설계:
- h1 photo:        edge_density > 0.05 → 사진 모자이크 + 노이즈
- h2 illustration: unique_colors > 5000, saturation > 0.4 → 다채색 도형
- h3 gpt_style:    edge_density 0.03-0.08, sat_std > 0.1 → 중간 밀도 + 채도 변동
- h4 gradient:     smoothness < 5 → 부드러운 그라디언트 (텍스트 영역만 별도 면적)
- h5 user_photo:   noise_ratio > 0.15 → 자연 사진 high-frequency 노이즈

공통 충족:
- std_mean > 25 (다중 색상 영역)
- unique_colors > 1000 (그라디언트/노이즈)
- spatial_diff < 25 (구조 있는 이미지, TV-static 아님)
- 브랜드 색 ΔE<30, matching_area_ratio>0.10 (각 패턴 accent 영역)
    )annotationsN)Path)Any)Image	ImageDraw	ImageFont)z0/home/jay/.local/share/fonts/Pretendard-Bold.otfz5/home/jay/.local/share/fonts/Pretendard-ExtraBold.otfz1/home/jay/.local/share/fonts/Pretendard-Black.otfz3/home/jay/.local/share/fonts/NotoSansCJKKR-Bold.otf)z3/home/jay/.local/share/fonts/Pretendard-Regular.otfz2/home/jay/.local/share/fonts/Pretendard-Medium.otfz./home/jay/.local/share/fonts/NotoSansCJKKR.otfc                    |rt         nt        }|D ]4  }t        |      j                         s	 t	        j
                  ||       c S  t        d      # t        $ r Y Mw xY w)uA   한글 fallback 차단된 폰트 로딩 (Pretendard/Noto 한정).ua   한글 폰트(Pretendard/NotoSansCJKKR) 미설치 — /home/jay/.local/share/fonts/ 확인 필요)_FONT_CANDIDATES_BOLD_FONT_CANDIDATES_REGULARr   existsr   truetype	ExceptionRuntimeError)sizebold
candidatespaths       ?/home/jay/workspace/skills/hybrid-image/patterns/_pil_render.py
_load_fontr   -   sl    *.&4LJ : ))$55 	6   s   A	AAc                   | j                  d      }t        |      dk(  rdj                  d |D              }t        |      dk7  ry	 t        |dd d	      t        |dd
 d	      t        |d
d d	      fS # t        $ r Y yw xY w)u2   HEX → RGB (#fff, #ffffff, ffffff 모두 허용).#    c              3  &   K   | ]	  }|d z    yw)   N ).0cs     r   	<genexpr>z_hex_to_rgb.<locals>.<genexpr>@   s     'qQU's            )   r   r         )lstriplenjoinint
ValueError)	hex_colorhxs     r   _hex_to_rgbr.   <   s    			#	B
2w!|WW'B''
2w!|BqGR #b1gr"2C1Q4DEE s   +A4 4	B ?B c                <    dddddd}|j                  | |d         S )u<   5 그라디언트 테마의 3 stop 색상 (start, mid, end).)r!   )   r$   R   )*   :   z   ))r2      r%   )\   r2      )   @       ))
   (   r:   )r7   J   <   )-   r4   d   ))r2   r%   r:   )Z   r0   >   )   r3   n   ))   rE   r5   )r<   r<   0   )P   rG   `   )navywarmmintrosemonorI   )get)themepresetss     r   _gradient_rgb_endpointsrQ   I   s2     <;<<:cG ;;ugfo..    c                   | j                   \  }}	||n|}||n|	}t        |      \  }
}}t        j                  ||dft        j                        }t        j
                  dd|t        j                        j                  dd      }t        j
                  dd|t        j                        j                  dd      }||z   dz  }|dk  }|dz  }|dz
  dz  }t        d      D ]K  }|
|   ||   |
|   z
  |z  z   }||   ||   ||   z
  |z  z   }t        j                  |||      |dddd|f<   M |dkD  r6|d	z  t        |d         d
z  z   |z   |dz  z   dz  }t        j                  j                  |      }d}||z   dz
  |z  }||z   dz
  |z  }|j                  | dz  |dz  dz   ||dft        j                        }t        j                  t        j                  ||d      |d      }|d|d|ddf   j                  t        j                        }|j                  dd|j                   t        j                        j                  t        j                        }||z   |z   }t        j"                  |dd      j                  t        j$                        }t'        j(                  |d      }| j+                  |||f       y)u  부드러운 3-stop diagonal gradient + fine dithering noise.

    noise_amplitude: ±N RGB jitter per pixel — unique_colors > 1000 보장.
    smoothness 임계 영향 미미 (noise ≤ 5).

    rng_seed: numpy RNG의 명시 seed (로키 L-01 CRITICAL 보완 — Python hash() 무작위화 차단).
              caller가 design_tokens['hint_seed']를 전달하면 cross-process 결정성 보장.
    Nr   dtyper      g       @g      ?   yn< r%          seed   r   r   rU   )axis   RGBmode)r   rQ   npzerosfloat32linspacereshaperangewhereordrandomdefault_rngintegersint32repeatastypeshapeclipuint8r   	fromarraypaste) imgrO   xywhnoise_amplituderng_seediwihc0c1c2arryyxxtmask_lowt_lowt_highchlowhighnsrngblockbwbhblock_noise
full_noisefinegrad_imgs                                    r   _draw_smooth_gradientr   U   s   $ XXFB]A]A(/JBB
((Aq!9BJJ
/C	Q1BJJ	/	7	7A	>B	Q1BJJ	/	7	72	>B	bCA3wHGE#g_FAh 6f2B500"vB"R&F2235Aq"H6 #s58}':;a?!b&HJVii###,%i!m%%i!m%llq /A"5"9b!BHH # 

 YYryye!DeRST
BQB	*11"**=
||B		|BII"**UJ%
''#q#

%
%bhh
/Cs/HIIhArR      r      )         rG   &   rF   )r;      r5      )
title_color
body_color
title_size	body_sizepanel_xpanel_ypanel_w	panel_padpanel_bgaccent_colorc       
           | j                   \  }}|	|	n|d|z  z
  }t        |d      }t        |d      }t        |||d|
z  z
        }t        |||d|
z  z
        }t        |dz        }t        |dz        }t	        |      |z  dz   t	        |      |z  z   }|d|
z  z   }||nt        |dz        }t        |||z
  d	z
        }t        j                  d
| j                   d      }t        j                  |      }|j                  ||||z   ||z   fd|       |,|j                  ||
z   ||
z   dz
  ||
z   dz   ||
z   dz
  f|       | j                  t        j                  | j                  d
      |      j                  d             t        j                  |       }||
z   }||dz  }|D ]!  }|j                  ||
z   |f|||       ||z  }# |dz  }|D ]!  }|j                  ||
z   |f|||       ||z  }# ||||fS )uI   반투명 panel + Korean text 렌더링. 반환: panel rect (x, y, w, h).r   Tr   F?      ?r5   皙?r>   RGBA)r   r   r   r   rE   )radiusfillr%   rG   r;   r   ra   fontr   )r   r   _wrap_koreanr*   r(   minr   newr   Drawrounded_rectangle	rectanglerv   alpha_compositeconverttext)rw   titlebodyr   r   r   r   r   r   r   r   r   r   r~   r   pw
title_font	body_fonttitle_lines
body_linesline_h_titleline_h_bodytext_hpanel_hpyoverlayodrdrawcylines                                 r   _draw_text_blockr      so   " XXFB'R!g+-=BJT2J951Iuj"q9}2DEKdIrA	M/ABJ zC'(Li#o&KK<'
	
j/K
'	( 
 q9}$G'Sd^B	Rg"	#B ii,7G
..
!C	"glBL1   y "y.2"5y 2%rI~':< 	 	

 IIe##CKK$7AII%PQ >>#D	iB
b 		7Y&+T
	U
l "HB 		7Y&+T	
	S
k RW%%rR   c                    | sdgS | j                         }|s| gS g }|d   }|dd D ]?  }|dz   |z   }|j                  |      }|d   |d   z
  |k  r|}-|j                  |       |}A |j                  |       |S )u=   한글 word-break: keep-all 호환 줄바꿈 (어절 기준).r   r   rV   N r   )splitgetbboxappend)	r   r   	max_widthwordslinescurrz   trialbboxs	            r   r   r      s    tJJLEvE
(C12Y c	A||E"7T!W	)CLLC 
LLLrR   c                ,    t        j                  |       S )N)rl   Randomr[   s    r   _seeded_rngr      s    ==rR   )design_tokensc               	   |xs i }t        |j                  dd            }t        |j                  dd            }t        |j                  d      xs |j                  d      xs d      }	t        |	      }
t        t        |j                  d|	                  }t	        j
                  d	||ft        |      d   
      }t        ||t        |j                  dd      xs d             t        |dz         }t        j                  |t        j                        }t        |dz        }d}t        j                  |
t        j                        }t        d||z
  |      D ]  }t        d||z
  |      D ]  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }t        t        j                   |d   |z  |z   dd            }t        t        j                   |d   |z  |z   dd            }t        t        j                   |d   |z  |z   dd            }|||g||||z   |||z   f<     t	        j"                  |d	      }t%        j&                  |      }t        d      D ]  }|j                  d|      }|j                  d|dz
        }|j                  dd      }t        t        j                   |
d   |j                  dd      z   dd            t        t        j                   |
d   |j                  dd      z   dd            t        t        j                   |
d   |j                  dd      z   dd            f} |j)                  ||||z   ||z   f| d        t        |dz        }!|j)                  d||!z
  ||f|
       t+        || |t        t        |j                  d d!                  t        t        |j                  d"d#                  t        |j                  d$d%      xs d%      t        |j                  d&d'      xs d'      dt        |dz        |d(z
  d)|*       |j,                  j/                  d+d+,       |j1                  |d-.       |S )/u  H1: 사진 모자이크 (edge_density > 0.05 충족용 노이즈 패치 + 텍스트 패널).

    photo_card 임계: Sobel edge_density > 0.05 (pixels with grad > 30, mean>0.05)
    구현: gradient + 그리드 색 패치 + 모자이크 노이즈 + 모서리 박스 디테일.
    gradient_themerI   	hint_seedr   hint_force_brand_colorprimary_hex#0f1729r   ra   colorr}   r@   rT   333333?r%   r   gffffff?ir0   r`   rV   r   rb   r<   rE   rG   ir   )outlinewidthgQ?r   r   #ffffffr   #e8e8ecr   H   r   r   r8   )r;   r   r5      	r   r   r   r   r   r   r   r   r   Tparentsexist_okPNGformat)strrN   r*   r.   r   r   rQ   r   r   rd   arrayrt   rf   ri   uniformrandintrs   ru   r   r   r   r   parentmkdirsave)"r   r   output_pathr   heightr   tokensrO   r\   r   primary_rgb
accent_rgbrw   r   r   photo_htile
base_colortytxtonejitter_rjitter_gjitter_brgbr   _cxr   szcolbar_hs"                                     r   render_h1_proceduralr     s     bF

+V45Evzz+q)*Dfjj!9:dfjj>Wd[deKk*KSNK!HIJJ
))EE6?2I%2PQR2S
TC#us6::k13M3RQR/ST dSj
!C
((3bhh
'C&4- GD+RZZ8JAw~t, 
854<. 		8B;;tS)D{{3+H{{3+H{{3+HBGGJqMD08;QDEABGGJqMD08;QDEABGGJqMD08;QDEA/0!QiC29bdl*+		8
8 //#E
*C>>#D2Y 	I[[E"[[GbL)[[R AS#)>>3GHAS#)>>3GHAS#)>>3GH

 	BRb13aH	I ENNAv~uf5KNH FJJ}i$H IJs6::lI#FGHvzz,39r:fjjb17R8FTM"" TD9HH[H'rR   c               H
   |xs i }t        |j                  dd            }t        |j                  dd            }t        |j                  d      xs |j                  d      xs d      }	t        |	      }
t	        j
                  d||ft        |      d   	      }t        ||t        |j                  dd      xs d      
       t        |dz         }t        j                  |d      }g }t        d      D ]  }|j                         }|j                  dd      }|j                  dd      }t        |dz        }|dz  |z
  }|d|z
  z  }|d||z  z
  z  }|dd|z
  |z  z
  z  }|||f|||f|||f|||f|||f|||fg|dz     }|j                  t        |d   dz        t        |d   dz        t        |d   dz        f        t        |dz        }t        d      D ]  }|j                  d|      }|j                  d|      }|j                  dd      }||t!        |      z     |j                  dd      fz   }|dz  }|dk(  r$|j#                  ||z
  ||z
  ||z   ||z   f|       |dk(  r*|j%                  ||z
  ||dz  z
  ||z   ||dz  z   f|       |j'                  |||z
  f||z
  ||z   f||z   ||z   fg|        |dz  }d} t        |dz        }!|dz
  }"t)        g d      D ]w  \  }}#t        |!|#z        }| ||z  z   }$|dz  dk(  r|
n1t        |
d   dz        t        |
d   dz        t        |
d   dz        f}|j%                  |$|"|z
  |$|z   dz
  |"f|       y |j%                  |dz
  d||f|
       t+        || |t        t        |j                  dd                   t        t        |j                  d!d"                  t        |j                  d#d$      xs d$      t        |j                  d%d&      xs d&      dt        |d'z        |d(z
  d)|
*       t-        j.                  |t,        j0                  +      }%t,        j                  j3                  |d,z  d-z  .      }&|&j5                  d/d|%j6                  t,        j0                  0      }'t-        j8                  |%|'z   dd      j;                  t,        j<                        }%t	        j>                  |%d1      }|j@                  jC                  d2d23       |jE                  |d45       |S )6u   H2: 일러스트 (unique_colors > 5000, saturation > 0.4 충족용 다채색 도형).

    구현: gradient + 채도 높은 다중 도형 (원, 사각, 삼각 — vivid color palette).
    r   rK   r   r   r   r   z#3ecf8era   r   r   r   r   r<   r   gffffff?r    rV   r`   r   r>   r      r   r   g)\(?rE   )?ffffff?gq=
ףp?r   333333?r  r%   rG   r   #fafaf8r   #d4d8e0r   D   r   $   r   r8   )r]            r   rT   rX   rZ   r[   r^   rb   Tr   r   r   )#r   rN   r*   r.   r   r   rQ   r   r   r   r   ri   rl   r   r   r   r(   ellipser   polygon	enumerater   rd   r   ro   rm   rn   rr   rs   rq   rt   ru   r   r   r   )(r   r   r   r   r   r   r   rO   r\   r   r   rw   r   r   paletter  r{   svifpqr   rgb_fdraw_hr  r   r  r  rr   bar_wbar_x	bar_max_h
bar_y_basepctrx   	final_arrrng_postjitters(                                           r   render_h2_proceduralr5  F  s=     bF

+V45Evzz+q)*Dfjj!9:dfjj>Wd[deKk*K
))EE6?2I%2PQR2S
TC#us6::k13M3RQR/ST dSj
!C>>#v&D*,G2Y XJJLKKd#KKd#AJEAIQKQUOa!eq[!QQ1I1ay1a)aAYAq	RSTWXSXYE!HsN+SqC-@#eAhQTnBUVWX $F2Y \[[E"[[F#[[S!a#g,&'3;;sC+@*BBAA:LL"r'27BGR"W=CLHaZNNBGR"'\27BqLIPSNTLL2rBw-"r'27);b2grBw=OPWZL[\ QJEEFTM"I"J89 R3	C AIUaZkA$%A$%A$%.

 	:>1u9r>:FSQR 	NNEBJ5&1ND FJJ}i$H IJs6::lI#FGHvzz,39r:fjjb17R8FTM"! " BHH-Iyy$$4*+<
*J$KHr19??"((KF	F*As3::288DI
//)%
0CTD9HH[H'rR   c               	   |xs i }t        |j                  dd            }t        |j                  dd            }t        |j                  d      xs |j                  d      xs d      }	t        |	      }
t	        j
                  d||ft        |      d   	      }t        ||t        |j                  dd      xs d      
       t        |dz         }t        j                  |d      }t        d      D ]_  }|j                  d|      }|j                  dt        |dz              }||j                  dd      |j                  ddg      z  z   }||j                  dd      |j                  ddg      z  z   }t        t        j                  |
d   |j                  dd      z   dd            t        t        j                  |
d   |j                  dd      z   dd            t        t        j                  |
d   |j                  dd      z   dd            |j                  dd      f}|j!                  ||||f||j                  dd             b t        d      D ]6  }|j                  d|      }|j                  dt        |dz              }|j                  dd      }|j#                         }|j%                  dd       }|j%                  d!d       }t        |d"z        }|d"z  |z
  }|d|z
  z  }|d||z  z
  z  }|dd|z
  |z  z
  z  }|||f|||f|||f|||f|||f|||fg|d"z     }t        |d   dz        t        |d   dz        t        |d   dz        |j                  dd#      f}|j'                  ||z
  ||z
  ||z   ||z   f|$       9 |j)                  ddd|f|
$       t+        || |t        t        |j                  d%d&                  t        t        |j                  d'd(                  t        |j                  d)d*      xs d*      t        |j                  d+d,      xs d,      d-t        |d.z        |dz
  d/|
0       |j,                  j/                  d1d12       |j1                  |d34       |S )5u   H3: GPT 스타일 (edge_density 0.03~0.08, sat_std > 0.1).

    구현: gradient + 중간 밀도의 추상 도형 (선, 부드러운 곡선) + 채도 변동.
    r   rL   r   r   r   r   z#a83a6era   r   r   i,  r      r   rG   i  rW   rV   r>   r`   r   r     r&   r;   )r   r   rE   r   r   g333333?r  r  r    r   r   r   r   r   r   r   F   r   r  r@   g(\?)rE   r%   r:   r   r   Tr   r   r   )r   rN   r*   r.   r   r   rQ   r   r   r   r   ri   r   choicerd   rs   r   rl   r   r!  r   r   r   r   r   ) r   r   r   r   r   r   r   rO   r\   r   r   rw   r   r   r  x1y1x2y2r  r  r   r  r{   r%  r&  r'  r(  r)  r*  r   r+  s                                    r   render_h3_proceduralr@    sd     bF

+V45Evzz+q)*Dfjj!9:dfjj>Wd[deKk*K
))EE6?2I%2PQR2S
TC#us6::k13M3RQR/ST
dSj
!C>>#v&D 2Y H[[E"[[C./#++b#&RG)<<<#++b#&RG)<<<AS")==q#FGAS")==q#FGAS")==q#FGKKS!	
 			2r2r"CKK24F	GH 2Y A[[E"[[C./KKC JJLKKd#KKd#AJEAIQKQUOa!eq[!QQ1I1ay1a)aAYAq	RSTWXSXY58c>"Ca3$7U1X^9LckkZ\^aNbcb1fb1fb1fb1f5C@A$ 	NNAq"f%KN8 FJJ}i$H IJs6::lI#FGHvzz,39r:fjjb17R8FTM""  TD9HH[H'rR   c          
     "   |xs i }t        |j                  dd            }t        |j                  d      xs |j                  d      xs d      }t        |      }	t        t        |j                  dd                  }
t        j                  d||ft        |      d	   
      }t        ||t        |j                  dd	      xs d	             t        j                  |      }|j                  d|
       |j                  |dz
  d	||f|	       t        |dz        }|j                  d	||z
  ||f|	       t        t        |j                  dd                  }t        t        |j                  dd                  }t        |j                  dd      xs d      }t        |j                  dd      xs d      }t        |d      }t        |d      }t        | ||dz
        }t        ||d      }d}|D ]*  }|j                  d|f|||       |t        |dz        z  }, |d z  }|D ]*  }|j                  d|f|||       |t        |d!z        z  }, |j                  j                  dd"       |j!                  |d#$       |S )%u  H4: 부드러운 그라디언트 (smoothness < 5).

    구현: 순수 3-stop diagonal gradient + 좌측 accent line + 텍스트.
    smoothness = 인접 픽셀 차이 평균 — gradient는 자연스럽게 < 5 충족.
    text 영역은 면적이 작아 평균 영향 미미.
    r   rI   r   r   r   r   #d4a853ra   r   r   r   r   )rH   rH      f   r   rH   g{Gz?r   r  r   r  r   rG   r   r   Tr   F   ip  r   g      ?r:   g?r   r   r   )r   rN   r.   r   r   rQ   r   r*   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rO   r   r   r  rw   r   bar_h2r   r   r   r   r   r   r   r   r   r   s                           r   render_h4_proceduralrG    sx     bF

+V45Efjj!9:dfjj>Wd[deKk*KSNI!FGHJ
))EE6?2I%2PQR2S
TC#us6::k13M3RQR/ST >>#DNN,:N> 	NNEBJ5&1ND$FNNAvv6[NI c&**]I"FGHKSL)!DEFJVZZb17R8JFJJ{B/526IJT2J951Iuj%#+>KdIs3J	B %		2r(Dz	D
c*t#$$% "HB $		2r(Dyz	B
c)d"##$ TD9HH[H'rR   c               T
   |xs i }t        |j                  dd            }t        |j                  dd            }t        |j                  d      xs |j                  d      xs d      }	t        |	      }
t        t        |j                  dd	                  }t	        j
                  d
||fd      }t        |dz        }t	        j
                  d
||ft        |      d         }t        ||       t        j                  |t        j                        }t        j                  j                  |dz         }|j                  dd|j                  dt        j                        }|j                  dd|j                  t        j                        dz  dz
  }|j                  |j                  dd       dk  }||z  }||xx   ||   z  cc<   t        j                  |dd      j!                  t        j"                        }t	        j$                  |d
      }t'        j(                  |d      }t+        |dz         }t-        d      D ]  }|j/                  d|      }|j/                  d|      }|j/                  dd      }t        t        j                  |
d   |j/                  d d!      z   dd            t        t        j                  |
d   |j/                  d d!      z   dd            t        t        j                  |
d   |j/                  d d!      z   dd            |j/                  d"d#      f}|j1                  ||z
  ||z
  ||z   ||z   f|$        |j3                  |d%       t'        j(                  |      }|}||z
  }|j5                  d&|d"z   d'|d(z   f|$       t        t        |j                  d)d                  }t        t        |j                  d*d+                  } t        |j                  d,d-      xs d-      }!t        |j                  d.d/      xs d/      }"t7        |!d0      }#t7        |"d10      }$t9        | |#|d2z
        }%t9        ||$|d2z
        }&|dz   }|%D ]*  }'|j;                  d&|f|'|#|3       |t        |!d4z        z  }, |d5z  }|&D ]*  }'|j;                  d&|f|'|$| 3       |t        |"d6z        z  }, |j5                  |d7z
  |dz
  |d!z
  |d"z
  f|
$       |j<                  j?                  dd8       |jA                  |d9:       |S );u  H5: 사용자 사진 + 화이트 프레임 (noise_ratio > 0.15 충족 자연 노이즈).

    구현: 상단 60% — 자연 사진 시뮬레이션 (gradient + 1~15 범위 high-frequency 노이즈).
            하단 40% — 화이트 프레임 + 한글 텍스트.
    r   rM   r   r   r   r   r   r   rB  ra   r   r   r   rT   i  rV   r  T)r   endpointrU   r   r^   N)r   r   r`   rb   r   i  r   rG   r9  r8  r>   r<   rD   r   )r   r   rH      ,   r   r   z#3a3f4er   6   r   r0   r   F   r   r      r   r   r   r   r   )!r   rN   r*   r.   r   r   rQ   r   rd   r   ro   rl   rm   rn   rr   rs   rq   rt   ru   r   r   r   ri   r   r!  rv   r   r   r   r   r   r   r   )(r   r   r   r   r   r   r   rO   r\   r   r   r  rw   r  img_topr   r   noise_hsignmask
noise_fulldraw_toppy_rngr  r  r   r  col_tr   text_yr   r   r   r   r   r   r   r   r   r   s(                                           r   render_h5_proceduralrX  9  s     bF

+V45Evzz+q)*Dfjj!9:dfjj>Wd[deKk*KSNI!FGHJ
))EE6?/
BC &4- Giiw/7Nu7UVW7XYG'5) ((7"((
+C
))

s

+Cll1bsyy4rxxlPG<<1399BHH<=AAED::399Ra=:)D0D4JID!!I
''#q#

%
%bhh
/Cooc.G ~~gv.H$F2Y 
G^^Au%^^Aw'NN2s#AR)@@!SIJAR)@@!SIJAR)@@!SIJNN2s#	
 	"q&"q&"q&"q&9F
G IIgv >>#DFgF 	NNBWfrk:NLc&**]I"FGHKSL)!DEFJVZZb17R8JFJJ{B/526IJT2J951Iuj%#+>KdIus{;J	"B $		2r(Dz	D
c*s"##$ "HB #		2r(Dyz	B
c)c/""#
 	NNECK"ebj&2+F[NYTD9HH[H'rR   )h1h2h3h4h5)F)r   r*   r   boolreturnImageFont.FreeTypeFont)r,   r   r_  tuple[int, int, int])rO   r   r_  zGtuple[tuple[int, int, int], tuple[int, int, int], tuple[int, int, int]])r   r   NNr&   r   )rw   Image.ImagerO   r   rx   r*   ry   r*   rz   
int | Noner{   rc  r|   r*   r}   r*   r_  None)rw   rb  r   r   r   r   r   ra  r   ra  r   r*   r   r*   r   r*   r   rc  r   rc  r   r*   r   tuple[int, int, int, int]r   ztuple[int, int, int] | Noner_  re  )r   r   r   r`  r   r*   r_  z	list[str])r\   r*   r_  zrandom.Random)r   r   r   r   r   r   r   r*   r   r*   r   zdict[str, Any] | Noner_  r   )__doc__
__future__r   rl   pathlibr   typingr   numpyrd   PILr   r   r   r
   r   r   r.   rQ   r   r   r   r   r  r5  r@  rG  rX  PROCEDURAL_RENDERERSr   rR   r   <module>rm     s1  * #     + +  
	/ 9 	9 9  9  	9 
 9  9  9  9  
9 B )8'6*;04C&	C&C& C&
 &C& %C& C& C& C& C& C& C& (C& .C& C&L* ,0OO
O O
 O O )O 
Or ,0bb
b b
 b b )b 
bX ,0NN
N N
 N N )N 
Np ,0::
: :
 : : ): 
:H ,0YY
Y Y
 Y Y )Y 
Yz 



 rR   