)EjHdZddlmZddlmZmZdgZGddeZdS)zUfontTools.pens.pointInsidePen -- Pen implementing "point inside" testing for shapes. )BasePen)solveQuadratic solveCubicPointInsidePencXeZdZdZddZddZdZdZdZdZ d Z d Z d Z d Z d ZdS)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. Fc\tj|||||dSN)r__init__ setTestPoint)selfglyphSet testPointevenOdds OC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/pens/pointInsidePen.pyr zPointInsidePen.__init__)s1x((( )W-----c>||_||_d|_d|_dS)zASet the point to test. Call this _before_ the outline gets drawn.Nr)rr firstPointintersectionCount)r rrs rr zPointInsidePen.setTestPoint-s%" !"rcF|j||jSr )r closePathrr s r getWindingzPointInsidePen.getWinding4s% ? & NN   %%rcb|}|jr|dz}n |jdk}| 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;s?//## < 1q[FF+q0F:~rc\|js|r|xjdz c_dS|xjdzc_dS)N)rr)r goingUps r_addIntersectionzPointInsidePen._addIntersectionFsG < (7 (  " "a ' " " " "  " "a ' " " " "rcJ|j|||_dSr )rr)r points r_moveTozPointInsidePen._moveToLs' ? & NN   rc|j\}}|\}}|\}}||kr||krdS||kr||krdS||kr||krdS||z }||z } ||z | z } || z|z} | |krdS|||kdSr )r_getCurrentPointr!) r r#xyx1y1x2y2dxdytixs r_lineTozPointInsidePen._lineToSs~1&&((BB 66b1ff F 66b1ff F 77rQww F "W "W VrM !Vb[ 66 F b2g&&&&&rc |j\}}|\}}|\}} |\} } |\} } ||kr||kr| |kr| |krdS||kr| |kr| |kr| |krdS||kr| |kr| |kr| |krdS|}| |z dz}| | z dz|z }| |z |z |z }tt|||||z }d|D}|sdS|}||z dz}| |z dz|z }| |z |z |z }||k}d}|D]}||kr |}||z}||z}d|z|zd|z|zz|z}|dkx}}|dkr'd|z|zd|zz}|dk}| }|dkr |}|dkx}}||z||zz||zz|z}||kry|dvr|s|||dkr|r||||kr||dS) Ng@c2g|]}d|cxkrdknn|S)?.0r/s r z.PointInsidePen._curveToOne..zs9>>>1TQ-=-=-=-=#-=-=-=-=-=Q-=-=-=rr)r;r4r5)rr&sortedrr!) r bcp1bcp2r#r'r(r)r*r+r,x3y3x4y4r.cybyay solutionsr-cxbxaxabovelastTr/t2t3 directionincomingGoingUpoutgoingGoingUpxts r _curveToOnezPointInsidePen._curveToOnegs~1&&((BBBB 66b1ffaBFF F 66b1ffaBFF F 77rQww277rQww F 2g_2g_r ! "Wr\B :b"b"q&99:: >> >>>   F 2g_2g_r ! "Wr\B a ; ;AEzzEQBaBB a"fqj025I09C ?OoCFQJR/ "+c/&5"5## "I8ACGOob27"R!V+b0BAvvK&;))/:::c";))/:::"o55))/:::; ; ;rc|j\}}|\}}|\}}|\} } |} || z dz} | | z | z } tt| | | |z }d|D}|sdSdS)Ng@cFg|]}t|cxkr tknn|Sr6)ZERO_MINUS_EPSILONONE_PLUS_EPSILONr7s rr9z:PointInsidePen._qCurveToOne_unfinished..sB   $6!$O$O$O$O?O$O$O$O$O$OA$O$O$Or)rr&r=r)r bcpr#r'r(r)r*r+r,r@rAcbarGs r_qCurveToOne_unfinishedz&PointInsidePen._qCurveToOne_unfinisheds~1&&((BBB  !VsN FQJ>!QA6677         F  rc||jkr||jd|_dSr )r&rlineTors r _closePathzPointInsidePen._closePaths:  " "do 5 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$r1rSr\r_rbr6rrrr s8....####&&&   (((    '''(;;;;;;~& """""rN)rffontTools.pens.basePenrfontTools.misc.bezierToolsrr__all__rr6rrrjs+*****AAAAAAAA  t"t"t"t"t"Wt"t"t"t"t"r