§
    ¢”jÓ  ã                   óH   — d Z ddlmZ ddlmZmZ dgZ G d„ de¦  «        ZdS )zUfontTools.pens.pointInsidePen -- Pen implementing "point inside" testing
for shapes.
é    )ÚBasePen)ÚsolveQuadraticÚ
solveCubicÚPointInsidePenc                   óX   — e Zd ZdZdd„Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ ZdS )r   a†  This pen implements "point inside" testing: to test whether
    a given point lies inside the shape (black) or outside (white).
    Instances of this class can be recycled, as long as the
    setTestPoint() method is used to set the new point to test.

    :Example:
        .. code-block::

            pen = PointInsidePen(glyphSet, (100, 200))
            outline.draw(pen)
            isInside = pen.getResult()

    Both the even-odd algorithm and the non-zero-winding-rule
    algorithm are implemented. The latter is the default, specify
    True for the evenOdd argument of __init__ or setTestPoint
    to use the even-odd algorithm.
    Fc                 ó\   — t          j        | |¦  «         |                      ||¦  «         d S ©N)r   Ú__init__ÚsetTestPoint)ÚselfÚglyphSetÚ	testPointÚevenOdds       úl/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/fontTools/pens/pointInsidePen.pyr
   zPointInsidePen.__init__)   s1   € ÝÔ˜˜xÑ(Ô(Ð(Ø×Ò˜) WÑ-Ô-Ð-Ð-Ð-ó    c                 ó>   — || _         || _        d| _        d| _        dS )zASet the point to test. Call this _before_ the outline gets drawn.Nr   )r   r   Ú
firstPointÚintersectionCount)r   r   r   s      r   r   zPointInsidePen.setTestPoint-   s%   € à"ˆŒØˆŒØˆŒØ!"ˆÔÐÐr   c                 óF   — | j         �|                      ¦   «          | j        S r	   )r   Ú	closePathr   ©r   s    r   Ú
getWindingzPointInsidePen.getWinding4   s%   € ØŒ?Ð&ð �NŠNÑÔÐØÔ%Ð%r   c                 ób   — |                       ¦   «         }| j        r|dz  }n| j        dk    }|  S )z“After the shape has been drawn, getResult() returns True if the test
        point lies within the (black) shape, and False if it doesn't.
        é   r   )r   r   r   )r   ÚwindingÚresults      r   Ú	getResultzPointInsidePen.getResult;   s?   € ð —/’/Ñ#Ô#ˆØŒ<ð 	1Ø˜q‘[ˆFˆFàÔ+¨qÒ0ˆFØ�:ˆ~Ðr   c                 ó\   — | j         s|r| xj        dz  c_        d S | xj        dz  c_        d S )Né   )r   r   )r   ÚgoingUps     r   Ú_addIntersectionzPointInsidePen._addIntersectionF   sG   € ØŒ<ð 	(˜7ð 	(ØÐ"Ô" aÑ'Ð"Ô"Ð"Ð"àÐ"Ô" aÑ'Ð"Ô"Ð"Ð"r   c                 óJ   — | j         �|                      ¦   «          || _         d S r	   )r   r   )r   Úpoints     r   Ú_moveTozPointInsidePen._moveToL   s'   € ØŒ?Ð&ð �NŠNÑÔÐØˆŒˆˆr   c                 ó  — | j         \  }}|                      ¦   «         \  }}|\  }}||k     r||k     rd S ||k     r||k     rd S ||k    r||k    rd S ||z
  }||z
  }	||z
  |	z  }
||
z  |z   }||k     rd S |                      ||k    ¦  «         d S r	   )r   Ú_getCurrentPointr!   )r   r#   ÚxÚyÚx1Úy1Úx2Úy2ÚdxÚdyÚtÚixs               r   Ú_lineTozPointInsidePen._lineToS   sÅ   € ØŒ~‰ˆˆ1Ø×&Ò&Ñ(Ô(‰ˆˆBØ‰ˆˆBà�Š6ˆ6�b˜1’f�fØˆFØ�Š6ˆ6�b˜1’f�fØˆFØ�Š7ˆ7�r˜Q’w�wØˆFà�"‰WˆØ�"‰WˆØ�‰V�r‰MˆØ�!‰V�b‰[ˆØ�Š6ˆ6ØˆFØ×Ò˜b 2šgÑ&Ô&Ð&Ð&Ð&r   c           	      ó˜  — | j         \  }}|                      ¦   «         \  }}|\  }}	|\  }
}|\  }}||k     r||k     r|
|k     r||k     rd S ||k     r|	|k     r||k     r||k     rd S ||k    r|	|k    r||k    r||k    rd S |}|	|z
  dz  }||	z
  dz  |z
  }||z
  |z
  |z
  }t          t          |||||z
  ¦  «        ¦  «        }d„ |D ¦   «         }|sd S |}||z
  dz  }|
|z
  dz  |z
  }||z
  |z
  |z
  }||k    }d }|D ]Î}||k    rŒ	|}||z  }||z  }d|z  |z  d|z  |z  z   |z   }|dk    x}}|dk    r'd|z  |z  d|z  z   }|dk    }| }|dk    r
|}|dk    x}}||z  ||z  z   ||z  z   |z   }||k     rŒy|dv r|s|                      |¦  «         Œ•|dk    r|r|                      |¦  «         Œ³||k    r|                      |¦  «         ŒÏd S )	Ng      @c                 ó2   — g | ]}d |cxk    rdk    ¯n n|‘ŒS )ç       €ç      ð?© ©Ú.0r/   s     r   ú
<listcomp>z.PointInsidePen._curveToOne.<locals>.<listcomp>z   s9   € Ð>Ð>Ð>˜1¨T°QÐ-=Ð-=Ò-=Ð-=¸#Ò-=Ð-=Ð-=Ð-=Ð-=�QÐ-=Ð-=Ð-=r   é   r   ç        é   )r;   r4   r5   )r   r&   Úsortedr   r!   ) r   Úbcp1Úbcp2r#   r'   r(   r)   r*   r+   r,   Úx3Úy3Úx4Úy4r.   ÚcyÚbyÚayÚ	solutionsr-   ÚcxÚbxÚaxÚaboveÚlastTr/   Út2Út3Ú	directionÚincomingGoingUpÚoutgoingGoingUpÚxts                                    r   Ú_curveToOnezPointInsidePen._curveToOneg   s»  € ØŒ~‰ˆˆ1Ø×&Ò&Ñ(Ô(‰ˆˆBØ‰ˆˆBØ‰ˆˆBØ‰ˆˆBà�Š6ˆ6�b˜1’f�f  a¢ ¨B°ªF¨FØˆFØ�Š6ˆ6�b˜1’f�f  a¢ ¨B°ªF¨FØˆFØ�Š7ˆ7�r˜Q’w�w 2¨¢7 7¨r°Qªw¨wØˆFàˆØ�2‰g˜‰_ˆØ�2‰g˜‰_˜rÑ!ˆØ�"‰W�r‰\˜BÑˆÝ�: b¨"¨b°"°q±&Ñ9Ô9Ñ:Ô:ˆ	Ø>Ð> 	Ð>Ñ>Ô>ˆ	Øð 	ØˆFàˆØ�2‰g˜‰_ˆØ�2‰g˜‰_˜rÑ!ˆØ�"‰W�r‰\˜BÑˆà�a’ˆØˆØð 	;ð 	;ˆAØ�EŠzˆzØØˆEØ�Q‘ˆBØ�a‘ˆBà˜B™ ™ a¨"¡f¨q¡jÑ0°2Ñ5ˆIØ09¸C²Ð?ˆO˜oØ˜CÒÐØ ™F Q™J¨¨R©Ñ/�	Ø"+¨c¢/�Ø&5Ð"5�Ø Ò#Ð#Ø "�IØ8AÀCºÐG�O oà�b‘˜2 ™7Ñ" R¨!¡VÑ+¨bÑ0ˆBØ�AŠvˆvØà�KÐÐØ&ð ;Ø×)Ò)¨/Ñ:Ô:Ð:øØ�c’�Ø"ð ;Ø×)Ò)¨/Ñ:Ô:Ð:øà" oÒ5Ð5Ø×)Ò)¨/Ñ:Ô:Ð:øð;	;ð 	;r   c                 óâ   — | j         \  }}|                      ¦   «         \  }}|\  }}|\  }	}
|}||z
  dz  }|
|z
  |z
  }t          t          ||||z
  ¦  «        ¦  «        }d„ |D ¦   «         }|sd S d S )Ng       @c                 óF   — g | ]}t           |cxk    rt          k    ¯n n|‘ŒS r6   )ÚZERO_MINUS_EPSILONÚONE_PLUS_EPSILONr7   s     r   r9   z:PointInsidePen._qCurveToOne_unfinished.<locals>.<listcomp>²   sB   € ð 
ð 
ð 
ØÕ$6¸!Ð$OÐ$OÒ$OÐ$OÕ?OÒ$OÐ$OÐ$OÐ$OÐ$OˆAÐ$OÐ$OÐ$Or   )r   r&   r=   r   )r   Úbcpr#   r'   r(   r)   r*   r+   r,   r@   rA   ÚcÚbÚarG   s                  r   Ú_qCurveToOne_unfinishedz&PointInsidePen._qCurveToOne_unfinished¦   s©   € ð Œ~‰ˆˆ1Ø×&Ò&Ñ(Ô(‰ˆˆBØ‰ˆˆBØ‰ˆˆBØˆØ�!‰V�s‰NˆØ�‰F�Q‰JˆÝ�>¨!¨Q°°A±Ñ6Ô6Ñ7Ô7ˆ	ð
ð 
Ø ð
ñ 
ô 
ˆ	ð ð 	ØˆFð	ð 	r   c                 ó‚   — |                       ¦   «         | j        k    r|                      | j        ¦  «         d | _        d S r	   )r&   r   ÚlineTor   s    r   Ú
_closePathzPointInsidePen._closePath¹   s:   € Ø× Ò Ñ"Ô" d¤oÒ5Ð5Ø�KŠK˜œÑ(Ô(Ð(ØˆŒˆˆr   c                 ó   — t           ‚)z,Insideness is not defined for open contours.)ÚNotImplementedErrorr   s    r   Ú_endPathzPointInsidePen._endPath¾   s   € å!Ð!r   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r!   r$   r1   rS   r\   r_   rb   r6   r   r   r   r      sÎ   € € € € € ðð ð8.ð .ð .ð .ð#ð #ð #ð #ð&ð &ð &ð	ð 	ð 	ð(ð (ð (ð ð  ð  ð'ð 'ð 'ð(;;ð ;;ð ;;ð~ð ð ð&ð ð ð
"ð "ð "ð "ð "r   N)rf   ÚfontTools.pens.basePenr   ÚfontTools.misc.bezierToolsr   r   Ú__all__r   r6   r   r   ú<module>rj      sƒ   ððð ð +Ð *Ð *Ð *Ð *Ð *Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ Að Ð
€ðt"ð t"ð t"ð t"ð t"�Wñ t"ô t"ð t"ð t"ð t"r   