L i@dZddlmZddlmZmZdgZGddeZy)zUfontTools.pens.pointInsidePen -- Pen implementing "point inside" testing for shapes. )BasePen)solveQuadratic solveCubicPointInsidePencVeZdZdZddZddZdZdZdZdZ dZ d Z d Z d Z d Zy )raThis 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. cTtj|||j||yN)r__init__ setTestPoint)selfglyphSet testPointevenOdds c/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/pens/pointInsidePen.pyr zPointInsidePen.__init__)s"x( )W-c<||_||_d|_d|_y)zASet the point to test. Call this _before_ the outline gets drawn.Nr)rr firstPointintersectionCount)r rrs rr zPointInsidePen.setTestPoint-s" !"rcR|j|j|jSr )r closePathrr s r getWindingzPointInsidePen.getWinding4s$ ?? & NN %%%rcr|j}|jr |dz}| S|jdk7}| S)zAfter the shape has been drawn, getResult() returns True if the test point lies within the (black) shape, and False if it doesn't. r)rrr)r windingresults r getResultzPointInsidePen.getResult;sH//# <<q[F:~++q0F:~rcv|js|r|xjdz c_y|xjdzc_y)N)rr)r goingUps r_addIntersectionzPointInsidePen._addIntersectionFs- <<7  " "a ' "  " "a ' "rcJ|j|j||_yr )rr)r points r_moveTozPointInsidePen._moveToLs ?? & NN rc|j\}}|j\}}|\}}||kr||kry||kr||kry||k\r||k\ry||z }||z } ||z | z } || z|z} | |kry|j||kDyr )r_getCurrentPointr!) r r#xyx1y1x2y2dxdytixs r_lineTozPointInsidePen._lineToSs~~1&&(BB 6b1f  6b1f  7rQw  "W "W VrM !Vb[ 6  b2g&rc t|j\}}|j\}}|\}} |\} } |\} } ||kr||kr | |kr| |kry||kr| |kr | |kr| |kry||k\r| |k\r | |k\r| |k\ry|}| |z dz}| | z dz|z }| |z |z |z }tt|||||z }|Dcgc]}d|cxkrdksnn|}}|sy|}||z dz}| |z dz|z }| |z |z |z }||k\}d}|D]}||k(r |}||z}||z}d|z|zd|z|zz|z}|dkDx}}|dk(r$d|z|zd|zz}|dkD}| }|dk(r |}|dkDx}}||z||zz||zz|z}||krs|dvr|rz|j ||dk(r|s|j |||k(s|j |ycc}w) Ng@g?r)r5r3)rr&sortedrr!) r bcp1bcp2r#r'r(r)r*r+r,x3y3x4y4r.cybyay solutionsr/r-cxbxaxabovelastTt2t3 directionincomingGoingUpoutgoingGoingUpxts r _curveToOnezPointInsidePen._curveToOnegse~~1&&(BBBB 6b1faBF  6b1faBF  7rQw27rQw  2g_2g_r ! "Wr\B :b"b"q&9: )>1TQ-=#-=Q> >  2g_2g_r ! "Wr\B a ;AEzEQBaBB a"fqj025I09C ?OoCFQJR/ "+c/&5"5# "I8ACGOob27"R!V+b0BAvK&))/:c"))/:"o5))/:; ;?s /F5F5c|j\}}|j\}}|\}}|\} } |} || z dz} | | z | z } tt| | | |z }|Dcgc]}t|cxkr t ksnn|}}|syycc}w)Ng@)rr&r7rZERO_MINUS_EPSILONONE_PLUS_EPSILON)r bcpr#r'r(r)r*r+r,r:r;cbarAr/s r_qCurveToOne_unfinishedz&PointInsidePen._qCurveToOne_unfinisheds~~1&&(BBB  !VsN FQJ>!QA67   $6!$O?O$OA    s B5Bc|j|jk7r|j|jd|_yr )r&rlineTors r _closePathzPointInsidePen._closePaths.  "doo 5 KK (rct)z,Insideness is not defined for open contours.)NotImplementedErrorrs r_endPathzPointInsidePen._endPaths!!rN)F)__name__ __module__ __qualname____doc__r r rrr!r$r1rMrUrXr[rrrr s?8.#& (  '(;;~& "rN)r_fontTools.pens.basePenrfontTools.misc.bezierToolsrr__all__rr`rrrds*+A  t"Wt"r