§
    ¢”jÈ1  ã                   ó†  — d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlZdgZ G d„ de¦  «        Z ej        d¦  «        Zeeej        f         Z dede dej!        fd„Z"dej#        de fd„Z$dej%        de de&fd„Z'dej!        dej%        fd„Z(dej!        dedefd„Z)efdej!        dee*ge*f         dej!        fd„Z+edœdej!        dedee*ge*f         dej!        fd „Z,d!ej!        d"ej!        de&fd#„Z-	 d7dede d%ej.        d&ej/        d'e&de&fd(„Z0d)ej1        d*ee         de d'e&d+e&ddfd,„Z2dede d-e	de&fd.„Z3d$d/œd)ej1        d*ee         de d'e&d+e&d0ed1e&ddfd2„Z4	 	 	 d8d$d/œd)ej1        d*eee                  d'e&d+e&d1e&ddfd4„Z5d9d5„Z6e7d6k    r e6¦   «          dS dS ):zySimplify TrueType glyphs by merging overlapping contours/components.

Requires https://github.com/fonttools/skia-pathops
é    N)ÚCallableÚIterableÚOptionalÚMapping)Ú
CFFFontSet)ÚttFont)Ú_g_l_y_f)Ú_h_m_t_x)ÚT2CharString)ÚotRoundÚnoRound)Ú
TTGlyphPen)ÚT2CharStringPenÚremoveOverlapsc                   ó   — e Zd ZdS )ÚRemoveOverlapsErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úm/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/fontTools/ttLib/removeOverlaps.pyr   r      s   € € € € € Ø€Dr   r   zfontTools.ttLib.removeOverlapsÚ	glyphNameÚglyphSetÚreturnc                 óŽ   — t          j        ¦   «         }|                     |¬¦  «        }||                               |¦  «         |S )N©r   )ÚpathopsÚPathÚgetPenÚdraw)r   r   ÚpathÚpathPens       r   ÚskPathFromGlyphr$   "   s>   € ÝŒ<‰>Œ>€DØ�kŠk 8ˆkÑ,Ô,€GØˆYÔ×Ò˜WÑ%Ô%Ð%Ø€Kr   Ú	componentc                 ód   — |                       ¦   «         \  }}t          ||¦  «        } |j        |Ž S ©N)ÚgetComponentInfor$   Ú	transform)r%   r   ÚbaseGlyphNameÚtransformationr"   s        r   ÚskPathFromGlyphComponentr,   )   s8   € ð %.×$>Ò$>Ñ$@Ô$@Ñ!€M�>Ý˜=¨(Ñ3Ô3€DØˆ4Œ>˜>Ð*Ð*r   Úglyphc           
      óX  ‡ ‡‡‡— ‰                       ¦   «         st          d¦  «        ‚t          ‰ j        ¦  «        dk     rdS i Šdt          dt
          j        fˆˆ ˆfd„Št          ˆfd„t          j	        t          t          ‰ j        ¦  «        ¦  «        d¦  «        D ¦   «         ¦  «        S )Nz5This method only works with TrueType composite glyphsé   FÚindexr   c                 óX   •— | ‰vrt          ‰j        |          ‰¦  «        ‰| <   ‰|          S r'   )r,   Ú
components)r0   Úcomponent_pathsr-   r   s    €€€r   Ú_get_nth_component_pathz2componentsOverlap.<locals>._get_nth_component_path9   s<   ø€ Ø˜Ð'Ð'Ý%=ØÔ  Ô'¨ñ&ô &ˆO˜EÑ"ð ˜uÔ%Ð%r   c              3   ó’   •K  — | ]A\  }}t          j         ‰|¦  «         ‰|¦  «        t           j        j        d d ¬¦  «        V — ŒBdS )F)Úfix_windingÚkeep_starting_pointsN)r   ÚopÚPathOpÚINTERSECTION)Ú.0ÚiÚjr4   s      €r   ú	<genexpr>z$componentsOverlap.<locals>.<genexpr>@   sx   øè è € ð 	ð 	ñ ˆAˆqõ 	Œ
Ø#Ð# AÑ&Ô&Ø#Ð# AÑ&Ô&ÝŒNÔ'ØØ!&ð	
ñ 	
ô 	
ð	ð 	ð 	ð 	ð 	ð 	r   )ÚisCompositeÚ
ValueErrorÚlenr2   Úintr   r   ÚanyÚ	itertoolsÚcombinationsÚrange)r-   r   r4   r3   s   ``@@r   ÚcomponentsOverlaprG   1   sÞ   øøøø€ Ø×ÒÑÔð RÝÐPÑQÔQÐQÝ
ˆ5ÔÑÔ˜qÒ Ð Øˆuà€Oð&¥sð &­w¬|ð &ð &ð &ð &ð &ð &ð &ð &õ ð 	ð 	ð 	ð 	õ Ô*­5µ°UÔ5EÑ1FÔ1FÑ+GÔ+GÈÑKÔKð	ñ 	ô 	ñ 	ô 	ð 	r   r"   c                 óÐ   — t          d ¬¦  «        }|                      |¦  «         |                     ¦   «         }|                     ¦   «         rJ ‚|                     d ¬¦  «         |S )Nr   )Ú	glyfTable)r   r!   r-   r?   ÚrecalcBounds)r"   ÚttPenr-   s      r   ÚttfGlyphFromSkPathrL   L   se   € å Ð%Ñ%Ô%€EØ‡I‚IˆeÑÔÐØ�KŠK‰MŒM€EØ× Ò Ñ"Ô"Ð"Ð"Ð"à	×Ò ÐÑ&Ô&Ð&Ø€Lr   Ú
charStringc                 óæ   — |j         |j        j        k    rd }n|j         |j        j        z
  }t	          |d ¬¦  «        }|                      |¦  «         |                     |j        |j        ¦  «        S )N)Úwidthr   )rO   ÚprivateÚdefaultWidthXÚnominalWidthXr   r!   ÚgetCharStringÚglobalSubrs)r"   rM   rO   Út2Pens       r   Ú_charString_from_SkPathrV   W   sr   € ð Ô˜:Ô-Ô;Ò;Ð;ØˆˆàÔ  :Ô#5Ô#CÑCˆÝ %°$Ð7Ñ7Ô7€EØ‡I‚IˆeÑÔÐØ×Ò˜zÔ1°:Ô3IÑJÔJÐJr   Úroundc                 ór   ‡— t          j        ¦   «         }| D ]\  }} |j        |gˆfd„|D ¦   «         ¢R Ž  Œ |S )Nc              3   ó\   •K  — | ]&} ‰|d          ¦  «         ‰|d         ¦  «        fV — Œ'dS )r   é   Nr   )r;   ÚprW   s     €r   r>   z_round_path.<locals>.<genexpr>h   s@   øè è € Ð LÐ LÀ % %¨¨!¬¡+¤+¨u¨u°Q°q´T©{¬{Ð!;Ð LÐ LÐ LÐ LÐ LÐ Lr   )r   r   Úadd)r"   rW   Úrounded_pathÚverbÚpointss    `   r   Ú_round_pathr`   c   s^   ø€ õ ”<‘>”>€LØð Nð N‰ˆˆfØˆÔ˜ÐMÐ LÐ LÐ LÐ LÀVÐ LÑ LÔ LÐMÐMÐMÐMÐMØÐr   ©rW   ÚdebugGlyphNamec                ó¼  — 	 t          j        | | j        ¬¦  «        S # t           j        $ r Y nw xY wt	          | |¬¦  «        } 	 t          j        | | j        ¬¦  «        } t
                               d|¦  «         | S # t           j        $ rP}t
                               t          j	        ¦  «        r|  
                    ¦   «          t          d|›�¦  «        |‚d }~ww xY w)N)Ú	clockwisera   zkskia-pathops failed to simplify '%s' with float coordinates, but succeded using rounded integer coordinatesz%Failed to remove overlaps from glyph )r   Úsimplifyrd   ÚPathOpsErrorr`   ÚlogÚdebugÚisEnabledForÚloggingÚDEBUGÚdumpr   ÚAssertionError)r"   rb   rW   Úes       r   Ú	_simplifyro   l   sþ   € ðÝÔ °´Ð?Ñ?Ô?Ð?øÝÔð ð ð Øˆðøøøõ �t 5Ð)Ñ)Ô)€DðÝÔ °´Ð?Ñ?Ô?ˆÝ�	Š	ð=àñ	
ô 	
ð 	
ð
 ˆøÝÔð ð ð Ý×Ò�GœMÑ*Ô*ð 	Ø�IŠI‰KŒKˆKÝ!ØF°NÐFÐFñ
ô 
àð	øøøøðøøøs%   ‚ �/®/Á7A< Á<CÂACÃCÚpath1Úpath2c                 óJ   — d„ | j         D ¦   «         d„ |j         D ¦   «         k    S )Nc                 ó,   — h | ]}t          |¦  «        ’ŒS r   ©Útuple©r;   Úcs     r   ú	<setcomp>z_same_path.<locals>.<setcomp>”   s   € Ð-Ð-Ð-˜�E�!‰HŒHÐ-Ð-Ð-r   c                 ó,   — h | ]}t          |¦  «        ’ŒS r   rt   rv   s     r   rx   z_same_path.<locals>.<setcomp>”   s   € Ð1SÐ1SÐ1S¸qµ%¸±(´(Ð1SÐ1SÐ1Sr   )Úcontours)rp   rq   s     r   Ú
_same_pathr{   “   s.   € Ø-Ð-˜eœnÐ-Ñ-Ô-Ð1SÐ1SÀEÄNÐ1SÑ1SÔ1SÒSÐSr   TrI   Ú	hmtxTableÚremoveHintingc                 ó‚  — ||          }|j         dk    s$|                     ¦   «         r�t          ||¦  «        rqt          | |¦  «        }t	          || ¦  «        }t          ||¦  «        sAt          |¦  «        x|| <   }|j        rJ ‚||          \  }}	|	|j        k    r||j        f|| <   dS |r| 	                    ¦   «          dS )Nr   TF)
ÚnumberOfContoursr?   rG   r$   ro   r{   rL   ÚprogramÚxMinr}   )
r   r   rI   r|   r}   r-   r"   rq   rO   Úlsbs
             r   ÚremoveTTGlyphOverlapsrƒ   —   sï   € ð �iÔ €Eð 	Ô Ò"Ð"Ø×ÒÑÔð 	#å˜e XÑ.Ô.ð 	#õ ˜y¨(Ñ3Ô3ˆõ ˜$ 	Ñ*Ô*ˆõ ˜$ Ñ&Ô&ð 	Ý+=¸eÑ+DÔ+DÐDˆI�iÑ  5à”}Ð$Ð$Ð$à" 9Ô-‰JˆE�3Ø�e”jÒ Ð Ø(-¨u¬zÐ':�	˜)Ñ$Ø�4àð Ø×ÒÑÔÐØˆ5r   ÚfontÚ
glyphNamesÚignoreErrorsc                 óœ  ‡— | d         Š| d         }t          |ˆfd„¬¦  «        }t          ¦   «         }|D ]Y}	 t          ||‰||¦  «        r|                     |¦  «         Œ,# t          $ r! |s‚ t
                               d|¦  «         Y ŒVw xY wt
                               dt          |¦  «        d 	                    |¦  «        ¦  «         d S )NÚglyfÚhmtxc                 ó€   •— ‰|                                ¦   «         r ‰|                               ‰¦  «        j        nd| fS )Nr   )r?   ÚgetCompositeMaxpValuesÚmaxComponentDepth)ÚnamerI   s    €r   ú<lambda>z'_remove_glyf_overlaps.<locals>.<lambda>Ê   sD   ø€ ð ˜T”?×.Ò.Ñ0Ô0ð�	˜$”×6Ò6°yÑAÔAÔSÐSààð
€ r   )Úkeyú"Failed to remove overlaps for '%s'ú"Removed overlaps for %s glyphs:
%sú )
ÚsortedÚsetrƒ   r\   r   rg   Úerrorrh   rA   Újoin)	r„   r…   r   r}   r†   r|   Úmodifiedr   rI   s	           @r   Ú_remove_glyf_overlapsr˜   º   s  ø€ ð �V”€IØ�V”€Iõ
 Øð
ð 
ð 
ð 
ð
ñ 
ô 
€Jõ ‰uŒu€HØð 	Gð 	Gˆ	ð	GÝ$Ø˜8 Y°	¸=ñô ð (ð —’˜YÑ'Ô'Ð'øøÝ"ð 	Gð 	Gð 	GØð ØÝ�IŠIÐ:¸IÑFÔFÐFÐFÐFð	Gøøøõ
 ‡I‚IÐ3µS¸±]´]ÀCÇHÂHÈXÑDVÔDVÑWÔWÐWÐWÐWs   ¹(A"Á"(BÂBÚ
cffFontSetc                 óÄ   — t          | |¦  «        }t          || t          ¬¦  «        }t          ||¦  «        s(|d         j        }t          |||          ¦  «        || <   dS dS )Nra   r   TF)r$   ro   r   r{   ÚCharStringsrV   )r   r   r™   r"   rq   ÚcharStringss         r   Ú_remove_charstring_overlapsr�   â   sl   € õ ˜9 hÑ/Ô/€Dõ �d˜I­WÐ5Ñ5Ô5€Eõ �d˜EÑ"Ô"ð Ø  ”mÔ/ˆÝ!8¸ÀÈIÔ@VÑ!WÔ!Wˆ�IÑØˆtàˆ5r   )ÚremoveUnusedSubroutinesÚ	table_tagrž   c                 óþ  — | |         j         }t          ¦   «         }|D ]X}		 t          |	||¬¦  «        r|                     |	¦  «         Œ+# t          $ r! |s‚ t
                               d|	¦  «         Y ŒUw xY w|st
                               d¦  «         d S |r|                     ¦   «          |r| 	                    ¦   «          t
                               dt          |¦  «        d                     |¦  «        ¦  «         d S )N)r   r   r™   r�   z-No overlaps found in the specified CFF glyphsr‘   r’   )Úcffr”   r�   r\   r   rg   r•   rh   Úremove_hintsÚremove_unused_subroutinesrA   r–   )
r„   r…   r   r}   r†   rŸ   rž   r™   r—   r   s
             r   Ú_remove_cff_overlapsr¤   ö   s/  € ð �i”Ô$€JÝ‰uŒu€HØð Gð Gˆ	ð
	GÝ*Ø#Ø!Ø%ðñ ô ð (ð
 —’˜YÑ'Ô'Ð'øøÝ"ð 	Gð 	Gð 	GØð ØÝ�IŠIÐ:¸IÑFÔFÐFÐFÐFð	Gøøøð
 ð Ý�	Š	ÐAÑBÔBÐBØˆàð "Ø×ÒÑ!Ô!Ð!àð /Ø×,Ò,Ñ.Ô.Ð.å‡I‚IÐ3µS¸±]´]ÀCÇHÂHÈXÑDVÔDVÑWÔWÐWÐWÐWs   ¡'A	Á	(A4Á3A4Fc          	      ó  — d| vrd| vrd| vrt          d¦  «        ‚|€|                      ¦   «         }|                      ¦   «         }d| v rt          | ||||¬¦  «         d| v sd| v rt	          | ||||d| v rdnd|¬¦  «         dS dS )aŽ  Simplify glyphs in TTFont by merging overlapping contours.

    Overlapping components are first decomposed to simple contours, then merged.

    Currently this only works for fonts with 'glyf' or 'CFF ' tables.
    Raises NotImplementedError if 'glyf' or 'CFF ' tables are absent.

    Note that removing overlaps invalidates the hinting. By default we drop hinting
    from all glyphs whether or not overlaps are removed from a given one, as it would
    look weird if only some glyphs are left (un)hinted.

    Args:
        font: input TTFont object, modified in place.
        glyphNames: optional iterable of glyph names (str) to remove overlaps from.
            By default, all glyphs in the font are processed.
        removeHinting (bool): set to False to keep hinting for unmodified glyphs.
        ignoreErrors (bool): set to True to ignore errors while removing overlaps,
            thus keeping the tricky glyphs unchanged (fonttools/fonttools#2363).
        removeUnusedSubroutines (bool): set to False to keep unused subroutines
            in CFF table after removing overlaps. Default is to remove them if
            any glyphs are modified.
    rˆ   zCFF ÚCFF2zJNo outline data found in the font: missing 'glyf', 'CFF ', or 'CFF2' tableN)r„   r…   r   r}   r†   )r„   r…   r   r}   r†   rŸ   rž   )ÚNotImplementedErrorÚgetGlyphOrderÚgetGlyphSetr˜   r¤   )r„   r…   r}   r†   rž   r   s         r   r   r     sï   € ð> �TÐÐ˜f¨DÐ0Ð0°VÀ4Ð5GÐ5GÝ!ØXñ
ô 
ð 	
ð ÐØ×'Ò'Ñ)Ô)ˆ
ð ×ÒÑ!Ô!€Hà�€~€~ÝØØ!ØØ'Ø%ð	
ñ 	
ô 	
ð 	
ð �€~€~˜ 4˜˜ÝØØ!ØØ'Ø%Ø &¨$  �f�f°FØ$;ð	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð (˜r   c                 ó‚  — ddl }|                     dt          ¬¦  «        }|                     ddd¬¦  «         |                     d	d
d¬¦  «         |                     dddd¬¦  «         |                     ddd¬¦  «         |                     ddd¬¦  «         |                     ddd¬¦  «         |                     | ¦  «        } t          j        | j        ¦  «        5 }t          || j	        pd| j
         | j        | j         ¬¦  «         |                     | j        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z:Simplify glyphs in TTFont by merging overlapping contours.r   Nzfonttools ttLib.removeOverlaps)ÚdescriptionÚinputz	INPUT.ttfzInput font file)ÚmetavarÚhelpÚoutputz
OUTPUT.ttfzOutput font fileÚglyphsÚGLYPHSÚ*z4Optional list of glyph names to remove overlaps from)r­   Únargsr®   z--keep-hintingÚ
store_truez>Keep hinting for unmodified glyphs, default is to drop hinting)Úactionr®   z--ignore-errorszOignore errors while removing overlaps, thus keeping the tricky glyphs unchangedz--keep-unused-subroutineszrKeep unused subroutines in CFF table after removing overlaps, default is to remove them if any glyphs are modified)r„   r…   r}   r†   rž   )ÚargparseÚArgumentParserÚ__doc__Úadd_argumentÚ
parse_argsr   ÚTTFontr¬   r   r°   Úkeep_hintingÚignore_errorsÚkeep_unused_subroutinesÚsaver¯   )Úargsr¶   Úparserr„   s       r   ÚmainrÂ   [  så  € ð €O€O€Oà×$Ò$Ø(µgð %ñ ô €Fð ×Ò˜¨Ð;LÐÑMÔMÐMØ
×Ò˜¨,Ð=OÐÑPÔPÐPØ
×ÒØØØØCð	 ñ ô ð ð ×ÒØØØMð ñ ô ð ð
 ×ÒØØð3ð ñ ô ð ð ×ÒØ#Øð?ð ñ ô ð ð ×Ò˜TÑ"Ô"€Då	Œ�t”zÑ	"Ô	"ð  dÝØØ”{Ð* dØ"Ô/Ð/ØÔ+Ø(,Ô(DÐ$Dð	
ñ 	
ô 	
ð 	
ð 	�	Š	�$”+ÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   Ã AD4Ä4D8Ä;D8Ú__main__)T)NTFr'   )8r¸   rD   rj   Útypingr   r   r   r   ÚfontTools.cffLibr   ÚfontTools.ttLibr   ÚfontTools.ttLib.tablesr	   r
   ÚfontTools.misc.psCharStringsr   ÚfontTools.misc.roundToolsr   r   ÚfontTools.pens.ttGlyphPenr   ÚfontTools.pens.t2CharStringPenr   r   Ú__all__Ú	Exceptionr   Ú	getLoggerrg   ÚstrÚ_TTGlyphÚ_TTGlyphMappingr   r$   ÚGlyphComponentr,   ÚGlyphÚboolrG   rL   rV   Úfloatr`   ro   r{   Útable__g_l_y_fÚtable__h_m_t_xrƒ   r»   r˜   r�   r¤   r   rÂ   r   r   r   r   ú<module>rØ      s  ððð ð
 Ð Ð Ð Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +Ø +Ð +Ð +Ð +Ð +Ð +Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø :Ð :Ð :Ð :Ð :Ð :à €€€ð Ð
€ð	ð 	ð 	ð 	ð 	˜)ñ 	ô 	ð 	ð €gÔÐ8Ñ9Ô9€à˜#˜vœÐ.Ô/€ð˜sð ¨oð À'Ä,ð ð ð ð ð+ØÔ&ð+Ø2Að+ð +ð +ð +ð˜Xœ^ð °ð È4ð ð ð ð ð6˜Wœ\ð ¨h¬nð ð ð ð ð	KØ
Œ,ð	KØ$0ð	Kàð	Kð 	Kð 	Kð 	Kð ;Bðð Ø
Œ,ðØ'¨¨°¨Ô7ðà„\ðð ð ð ð '.ð	$(ð $(ð $(Ø
Œ,ð$(àð$(ð �U�G˜U�NÔ#ð	$(ð
 „\ð$(ð $(ð $(ð $(ðNT�g”lð T¨7¬<ð T¸Dð Tð Tð Tð Tð ð ð  Øð àð ð Ô&ð ð Ô&ð	 ð
 ð ð 
ð ð  ð  ð  ðF%Xà
Œ-ð%Xð ˜”ð%Xð ð	%Xð
 ð%Xð ð%Xð 
ð%Xð %Xð %Xð %XðPàðð ðð ð	ð
 
ðð ð ð ð8 %)ð#Xð #Xð #Xà
Œ-ð#Xð ˜”ð#Xð ð	#Xð
 ð#Xð ð#Xð ð#Xð "ð#Xð 
ð#Xð #Xð #Xð #XðP +/ØØð	<
ð %)ð<
ð <
ð <
Ø
Œ-ð<
à˜ #œÔ'ð<
ð ð<
ð ð	<
ð "ð<
ð 
ð<
ð <
ð <
ð <
ð~,ð ,ð ,ð ,ð^ ˆzÒÐØ€D�F„F€F€F€Fð Ðr   