
    &hH                        S r SSKJr  SSKJrJr  S rS r\" S/ SQ5      r\" SS	S
/5      r	S r
S&S jrS rS rS rS rSrSrSrSrS rS'S jrS rS rS rS rS rS rS rS&S jrS(S jr   S)S  jrS(S! jr S&S" jr!S# r"S$ r#g%)*zPygame Drawing algorithms written in Python. (Work in Progress)

Implement Pygame's Drawing Algorithms in a Python version for testing
and debugging.
    )
namedtuple)floorceilc                     U [        U 5      -
  $ )zreturn fractional part of xr   values    F/var/www/auris/envauris/lib/python3.13/site-packages/pygame/draw_py.pyfracr      s    5<    c                 $    SU [        U 5      -
  -
  $ )z#return inverse fractional part of x   r   r   s    r
   inv_fracr      s    e$%%r   BoundingBox)lefttoprightbottomPointxyc                 *    U R                  X4U5        g)z%Set the color of a pixel in a surfaceN)set_at)surfin_xin_ycolors       r
   r   r   "   s    KKe$r   c                    ^  U(       a  U R                  U5      OSn[        U4S j[        X%5       5       5      nU R	                  X5        g! [         a     gf = f)z-draw one blended pixel with given brightness.)r   r   r   r   Nc              3   D   >#    U  H  u  pTU-  S T-
  U-  -   v   M     g7f)r   N ).0colpixbrights      r
   	<genexpr>draw_pixel.<locals>.<genexpr>-   s)      <Q#Vs*	*<Qs    )get_at
IndexErrortuplezipr   )r   posr   r$   blend	other_col	new_colors      `   r
   
draw_pixelr/   '   sZ    (-DKK$<	  <?<Q I 	KK  s   A 
AAc                     X$:X  a  U R                  X#4U5        g X$::  a  X$4OXB4u  pV[        XVS-   5       H  nU R                  Xs4U5        M     g Nr   r   range)r   r   x_fromr   x_tostartendline_xs           r
   _drawhorzliner9   4   sN    ~VNE*#)>&~JEQw'VNE* (r   c                     X4:X  a  U R                  X#4U5        g X4::  a  X44OXC4u  pV[        XVS-   5       H  nU R                  X'4U5        M     g r1   r2   )r   r   r   y_fromy_tor6   r7   line_ys           r
   _drawvertliner>   >   sN    ~TNE*#)>&~JEQw'TNE* (r   c                 b   U R                  5       nX5R                  :  d  X5R                  UR                  -   :  a  g[        X%R                  5      n[        XER                  UR                  -   S-
  5      nXER                  :  d  X%R                  UR                  -   :  a  g[        XX#U5        g)zdraw clipped horizontal line.Nr   )get_clipr   hmaxr   minwr9   )r   r   r4   r   r5   clips         r
   _clip_and_draw_horizlinerF   K   s     ==?Dff}/ FtVVdff_q()D ff}&&466/1$vT2r   c                 b   U R                  5       nX%R                  :  d  X%R                  UR                  -   :  a  g[        X5R                  5      n[        XER                  UR                  -   S-
  5      nXER                  :  d  X5R                  UR                  -   :  a  g[        XX#U5        g)zdraw clipped vertical line.Nr   )r@   r   rD   rB   r   rC   rA   r>   )r   r   r   r;   r<   rE   s         r
   _clip_and_draw_vertlinerH   \   s     ==?Dff}/ FtVVdff_q()D ff}&&466/1$tT2r   r            c                     U S   UR                   :  [        -  U S   UR                  :  [        -  -   U S   UR                  :  [
        -  -   U S   UR                  :  [        -  -   $ )zCreturns a code that defines position with respect to a bounding boxr   r   )r   	LEFT_EDGEr   
RIGHT_EDGEr   TOP_EDGEr   BOTTOM_EDGE)r+   b_boxs     r
   encoderR   u   sn    
 
Q%**		)q6EKK:
-	.q6EII
)	* q6ELL K
/	0r   c                    S nS nS n[        U [        5      (       d   eU u  pgpU(       a  [        O[        n
 [	        Xg4U5      n[	        X4U5      nU" X5      (       a  XgX4U SS& gU" X5      (       a  gU" U5      (       a  XpXpXpX:w  a  X-
  [        X-
  5      -  OSnU[
        -  (       a'  Xz" UR                  U-
  U-  5      -  nUR                  nOU[        -  (       a'  Xz" UR                  U-
  U-  5      -  nUR                  nOsU[        -  (       a,  X:w  a  Xj" UR                  U-
  U-  5      -  nUR                  nO9U[        -  (       a+  X:w  a  Xj" UR                  U-
  U-  5      -  nUR                  nGMI  )a  Algorithm to calculate the clipped line.

We calculate the coordinates of the part of the line segment within the
bounding box (defined by left, top, right, bottom). The we write
the coordinates of the line segment into "line", much like the C-algorithm.
With `use_float` True, clip_line is usable for float-clipping.

Returns: true if the line segment cuts the bounding box (false otherwise)
c                     U (       + $ Nr    )codes    r
   insideclip_line.<locals>.inside   s	    xr   c                 "    U =(       d    U(       + $ rU   r    code_acode_bs     r
   acceptclip_line.<locals>.accept   s    $f%%r   c                     U =(       a    U$ rU   r    rZ   s     r
   rejectclip_line.<locals>.reject   s     & r   TNFg      ?)
isinstancelistfloatintrR   rM   r   rN   r   rP   r   rO   r   )linerQ   	use_floatrW   r]   r`   x_1y_1x_2y_2dtypecode1code2slopes                 r
   	clip_linerp      s   &! dD!!!!CcECE
 z5)z5)%(DG% %== 536:eCI..C 95%**s*e344C**CZ5%+++u455C++C[ zuellS0E9::,,CXzueii#o677))CG r   c                 ,   UR                   UR                   :X  a  [        e[        UR                  UR                  -
  UR                   UR                   -
  -  5      nSnUS:  a  UR                   UR                   :  aF  UR                   UR                   sUl         Ul         UR                  UR                  sUl        Ul        UR                  nUR                  UR                  :  a  SOSn[	        UR                   UR                   S-   5       H$  n[        XXa5        XT-  nUS:  d  M  Xg-  nUS-  nM&     gUR                  UR                  :  aF  UR                   UR                   sUl         Ul         UR                  UR                  sUl        Ul        UR                   nSU-  nUR                   UR                   :  a  SOSn	[	        UR                  UR                  S-   5       H$  n[        XXa5        XT-  nUS:  d  M  X-  nUS-  nM&     g)z3draw a non-horizontal line (without anti-aliasing).g        r   g      ?N)r   
ValueErrorabsr   r3   r   )
r   r   r6   r7   ro   errorr=   dy_signr8   dx_signs
             r
   
_draw_linerx      s    ww#%%SUUUWW_56EEqy 55577? UUEGGNEGSU UUEGGNEGSU#%%!b EGGSUUQY/F4/NE|!
 0 77SUU? UUEGGNEGSU UUEGGNEGSUE	#%%!b EGGSUUQY/F4/NE|!
 0r   c                   ^ ^^ UR                   UR                   -
  nUR                  UR                  -
  nUS:X  a;  US:X  a5  [        T [        UR                   5      [        UR                  5      T5        gUR                   UR                   :  d  UR                  UR                  :  aL  UR                   UR                   sUl         Ul         UR                  UR                  sUl        Ul        U* nU* n[	        U5      [	        U5      :  a  Xe-  nUUU 4S jn[        XWX2U5        gXV-  nUUU 4S jn[        XgX2U5        g)a  draw an anti-aliased line.

The algorithm yields identical results with _draw_line for horizontal,
vertical or diagonal lines, and results changes smoothly when changing
any of the endpoint coordinates.

Note that this yields strange results for very short lines, eg
a line from (0, 0) to (0, 1) will draw 2 pixels, and a line from
(0, 0) to (0, 1.1) will blend 10 % on the pixel (0, 2).
r   Nc           	         > [        U5      n[        TX4TU[        U5      -  T5        [        TXS-   4TU[        U5      -  T5        g r1   r   r/   r   r   )r   float_yfactorflr_yr,   r   r   s       r
   draw_two_pixel$_draw_aaline.<locals>.draw_two_pixel  sH    'NEtd]E6HW<M3MuUtdAI.vW7MuUr   c           	         > [        U 5      n[        TX14TU[        U 5      -  T5        [        TUS-   U4TU[        U 5      -  T5        g r1   r{   )float_xr   r}   fl_xr,   r   r   s       r
   r   r   %  sJ    >Dtd\5&8G;L2LeTtdQh-uftG}6LeTr   )r   r   r   re   rt   _draw_aaline_dx_draw_aaline_dy)	r   r   r6   r7   r,   d_xd_yro   r   s	   ``  `    r
   _draw_aaliner      s    . %%%''/C
%%%''/C
axC1H 	tS\3uww<7ww%''CEE/dd
3x3s8		V
 	C?		U
 	C?r   c                    [        UR                  5      nUR                  XSR                  -
  U-  -   nUR                  U:  a2  U" Xa-
  [        UR                  5      [	        UR                  5      5        [        UR                  5      n[        UR                  5      nUS:  a!  UR                  XS-   U-
  -  -   n	U" XU5        OUS-  n[        XX5       H  n
XaX-
  -  -   nU" XS5        M     g Nr   r   )r   r   r   r   r   r   r3   )r   ro   r7   r6   r   g_yg_xrests_ys_xr=   r8   s               r
   r   r   -  s    
uww-C
''S77]e+
+Cww}s{E%''NHUWW4EF;D
suu+Caxggq400s&q/--vq) "r   c                    [        UR                  5      nUR                  XSR                  -
  U-  -   nUR                  U:  a2  U" [        UR                  5      Xa-
  [	        UR                  5      5        [        UR                  5      n[        UR                  5      nUS:  a!  UR                  XS-   U-
  -  -   n	U" XU5        OUS-  n[        XX5       H  n
XaX-
  -  -   nU" XS5        M     g r   )r   r   r   r   r   r   r3   )r   ro   r7   r6   r   r   r   r   r   r   r8   r=   s               r
   r   r   A  s     uww-C
''S77]e+
+Cww}uUWW~s{HUWW4EF;D
suu+Caxggq400s&q/--vq) "r   c           
         [        U[        UR                  UR                  UR                  UR                  -   S-
  UR                  UR
                  -   S-
  5      5      (       d  gUS   US   :X  a  [        XUS   US   US   5        gUS   US   :X  a  [        XUS   US   US   5        g[        X[        US   US   5      [        US   US   5      5        g)zjclip the line into the rectangle and draw if needed.

Returns true if anything has been drawn, else false.r   r      rI   )
rp   r   r   r   rD   rA   r9   r>   rx   r   )r   rectr   ptss       r
   _clip_and_draw_liner   _  s     [$&&1)<dfftvvoPQ>QR  
1vQd3q63q63q6:
 	 
Q3q6	d3q63q63q6:  	4c!fc!f 5uSVSV7LMr   c                 n   S=pV[        US   US   -
  5      [        US   US   -
  5      :  a  SnOSnUS S  n[        XX'5      (       a  SnUS S  n	OSn/ SQn	[        SUS-  S-   5       GHG  n
US   Xj-  -   US'   US   XZ-  -   US'   US   Xj-  -   US'   US   XZ-  -   US'   [        XX'5      (       aV  Sn[        US   U	S   5      U	S'   [        US   U	S   5      U	S'   [	        US   U	S   5      U	S'   [	        US   U	S   5      U	S'   U
S-  U:  d  M  US   Xj-  -
  US'   US   XZ-  -
  US'   US   Xj-  -
  US'   US   XZ-  -
  US'   [        XX'5      (       d  M  Sn[        US   U	S   5      U	S'   [        US   U	S   5      U	S'   [	        US   U	S   5      U	S'   [	        US   U	S   5      U	S'   GMJ     U$ )Nr   rI   r   r   )'  r   r   )rt   r   r3   rC   rB   )r   r   r   rf   widthyincxincnewptsanydrawnframeloops              r
   _clip_and_draw_line_widthr   t  s   OD
47T!WDGd1g$5 66!WF4u55q	.a!a(Gdk)q	Gdk)q	Gdk)q	Gdk)q	t599H6!9eAh/E!H6!9eAh/E!H6!9eAh/E!H6!9eAh/E!H!8eQ$+-F1IQ$+-F1IQ$+-F1IQ$+-F1I"4u==vay%(3avay%(3avay%(3avay%(3a- )0 Or   c           
      *   [        U[        UR                  S-
  UR                  S-
  UR                  UR                  -   UR                  UR
                  -   5      SS9(       d  g[        X[        US   US   5      [        US   US   5      U5        g)-draw anti-aliased line between two endpoints.r   T)rg   Nr   rI   r   )rp   r   r   r   rD   rA   r   r   )r   r   r   rf   r,   s        r
   _clip_and_draw_aaliner     s{    DFFQJ
DFFTVVOTVVdff_M
 	eDGT!W5uT!Wd1g7NPUV
r   c                 \    US   US   US   US   /n[        X R                  5       XU5      $ r   r   r   )r   r@   )r   r   
from_pointto_pointr,   rf   s         r
   draw_aaliner     s5    qM:a=(1+x{CD }}UKKr   c                 \    US   US   US   US   /n[        X R                  5       XU5      $ r   )r   r@   )r   r   r   r   r   rf   s         r
   	draw_liner     s5    qM:a=(1+x{CD$T==?EOOr   c                    [        U5      S::  a  [        eS/S-  nU Vs/ s H  oS   PM	     n	nU Vs/ s H  oS   PM	     n
nU	S   US'   U
S   US'   [        U	S   U	S   U
S   U
S   S9nUSS  Hq  u  p[        UR                  U5      Ul        [        UR                  U5      Ul        [        UR                  U5      Ul        [        UR                  U5      Ul        Ms     U R                  5       n[        S[        U5      5       HH  nXS-
     US'   XS-
     US'   X   US'   X   US'   U(       a  [        XXU5        M;  [        XXU5        MJ     U(       a[  U	[        U5      S-
     US'   U
[        U5      S-
     US'   U	S   US'   U
S   US'   U(       a  [        XXU5        g[        XXU5        ggs  snf s  snf )z/draw several lines, either anti-aliased or not.rI   r   rJ   r   )r   r   r   r   Nr   )len	TypeErrorr   rC   r   rB   r   r   r   r@   r3   r   r   )r   r   closedpointsr   r,   aalinerf   ptxlistylistrQ   r8   r=   r   r   s                   r
   _multi_linesr     s    6{a37D#$VrUVE$#$VrUVE$AhDGAhDGU1XU1X58ERSHUE *V,
%++v.		6*	5<<0	 % ==?DaV%q/Qq/Q+Q+Q!$e5A%d%uE & Fa(QFa(Q(Q(Q!$e5A%d%uE / %$s
   F:F?c           	          [        XX#USS9$ )z0draw several lines connected through the points.F)r   r   )r   r   r   r   r   s        r
   
draw_linesr     s    VU5IIr   c           	          [        XX#USS9$ )z=draw several anti-aliased lines connected through the points.T)r,   r   r   )r   r   r   r   r,   s        r
   draw_aalinesr     s    V5NNr   c                    U(       a  [        XSX#5        g[        U5      nU VVs/ s H  u  pVUPM	     nnnU VVs/ s H  u  pVUPM	     nnn[        U5      n	[        U5      n
X:X  a$  [        U5      n[        U5      n[	        XXU5        g[        XS-   5       Hf  n/ n[        U5       H  n[        XXU5        M     UR                  5         [        S[        U5      S5       H  n[	        XX   XUS-      5        M     Mh     [        U5       HH  nU(       a  US-
  OUS-
  nXU   s=:  a  UU   s=:X  a  U
:  d  M/  O  M3  [	        XX   X   UU   5        MJ     gs  snnf s  snnf )zDraw a polygonr   Nr   rI   )r   r   rC   rB   rF   r3   _draw_polygon_inner_loopsort)surfacer   r   r   
num_pointsr   r   point_xpoint_yminymaxyminxmaxxy_coordx_intersectii_prevs                    r
   draw_polygonr     sW   71f4VJ#$VTQqVG$#$VTQqVG$w<Dw<D|7|7| TBax(z"A$Q;O # 	q#k*A.A$QU9K / ) :Qa!*66$66$
GJ  ? %$s
   EE"c                    U (       a  U S-
  O[        U5      S-
  nX%   nX    nXg:  a	  X   nX   n	OXg:  a  X%   nX    nX   n	X   nOg Xss=:  a  U:  d  O  U[        U5      :X  a'  X7::  a!  UR                  X6-
  X-
  -  Xv-
  -  U-   5        g g g r1   )r   rB   append)
indexr   r   r   r   r   ri   rk   rh   rj   s
             r
   r   r      s    UQYS\A%5F
/C
.C
yon	onon7c'l#:GMci8SYG#MN BP#:r   N)T)F)r   )r   FF)$__doc__collectionsr   mathr   r   r   r   r   r   r   r/   r9   r>   rF   rH   rM   rN   rP   rO   rR   rp   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r
   <module>r      s    #  
&
 (JK7S#J'%

 ++3"3& 	
	;|1h7@t*(*<*&R	LP 
.FfJ
O
%POr   