
    WhE              
       <   d dl Z d dlZd dlmZ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mZmZmZmZmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZmZ  e j>                  e       Z!ee  d   Z"dZ# e$e"jJ                        Z&de'fdZ(dede'defdZ)dede'dejT                  ddfdZ+dede'dejT                  ddfdZ,dede'deejZ                     deejZ                     fdZ.dede'dejZ                  deejZ                     fdZ/dej`                  de1fdZ2eeee$df   ee$df   f   eejf                  ejf                  f   f   Z4dee'   fdZ5	 d)deeeee'e'f      e'e'f      d ee'   fd!Z6 ed"g d#      Z7e G d$ d%             Z8	 d*ded&e4d'e'dee4   fd(Z9y)+    N)defaultdict
namedtuple)	dataclass)cached_propertyreduce)chain)log2)DefaultDictDictIterableListSequenceTuple)OPTIONS)	bit_countbit_indices)TTFont)otBaseotTablesz:COMPRESSION_LEVELFONTTOOLS_GPOS_COMPACT_MODEreturnc                     t         } t        t        j                  v r9dd l}|j                  dt         dt               t        j                  t           } t        |       dk(  r| dv rt        |       S t        dt         d|        )Nr   'z}' environment variable is deprecated. Please set the 'fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL' option in TTFont.cfg.   
0123456789zBad =)
GPOS_COMPACT_MODE_DEFAULTGPOS_COMPACT_MODE_ENV_KEYosenvironwarningswarnDeprecationWarninglenint
ValueError)	env_levelr!   s     X/var/www/html/jupyter_env/lib/python3.12/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_envr)      s    )I BJJ.)* +  		
 JJ89	
9~yL89~
t56a	{C
DD    fontlevelc                 (   | j                  d      }|| S |j                  j                  j                  D ]Y  }|j                  dk(  rt        | ||        |j                  dk(  s0|j                  d   j                  dk(  sMt        | ||       [ | S )NGPOS   	   r   )	gettable
LookupListLookup
LookupTypecompact_lookupSubTableExtensionLookupTypecompact_ext_lookup)r+   r,   gposlookups       r(   compactr<   +   s     88FD |**''.. 4!4/!#(:(N(NRS(StUF3	4 Kr*   r;   c                 `    t        | ||j                        }||_        t        |      |_        y N)compact_pair_posr7   r$   SubTableCount)r+   r,   r;   new_subtabless       r(   r6   r6   H   s(    $T5&//BM#FO}-Fr*   c                    t        | ||j                  D cg c]  }|j                   c}      }g }|D ]5  }t        j                         }d|_        ||_        |j                  |       7 ||_        t        |      |_        y c c}w Nr   )	r?   r7   ExtSubTabler   ExtensionPosFormatappendr$   r@   )r+   r,   r;   ext_subtablerA   new_ext_subtablessubtables          r(   r9   r9   N   s    $e6??S<l..SM ! /,,.#+   .	/
 (FO01F Ts   B	subtablesc                     g }|D ]O  }|j                   dk(  r|j                  |       $|j                   dk(  s4|j                  t        | ||             Q |S )Nr   r/   )rF   rG   extendcompact_class_pairs)r+   r,   rK   rA   rJ   s        r(   r?   r?   \   s`     M M??a  *__!  !4T5(!KLM r*   rJ   c                    ddl m} g }t        t              }|j                  j
                  D ]:  }||j                  j                  j                  |d         j                  |       < t        t              }|j                  j                  j                         D ]  \  }}||   j                  |        i }	t        |j                        D ]w  \  }}
t        |
j                        D ]Z  \  }}t        |      rt!        |dd       t!        |dd       f|	t#        t%        ||               t#        t%        ||               f<   \ y t'        | |	|      }|D ](  }|j                   ||| j)                                      * |S )Nr   )buildPairPosClassesSubtableValue1Value2)fontTools.otlLib.builderrP   r   listCoverageglyphs	ClassDef1	classDefsr1   rG   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r+   r,   rJ   rP   rK   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairss                  r(   rN   rN   i   s~    EI,7,=H%% C##--11!Q78??BC,7,=H"",,224 11Ix445 	6"6#6#67 	IAvf%$/$/SIuVHQK0159L3MNO	 AyRWXM X4UD<S<S<UVWXr*   rk   c                     t        | dd       }t        | dd       }|d u xs |j                         dk(  xr |d u xs |j                         dk(  S )NrQ   rR   r   )r_   getEffectiveFormat)rk   v1v2s      r(   r^   r^      s\    	4	(B	4	(B$J6"//1Q6 
d
2b++-2r*   .glyphIDsc                     t        |       } | d   }|gg}| dd  D ]2  }||dz   k7  r&|d   j                  |       |j                  |g       |}4 |d   j                  |       || d   | d   fS )Nr   r   )ra   rG   )rr   lastrangesglyphIDs       r(   _getClassRangesrx      s    hHA;DfXFAB< dQh2Jd#MM7)$	
 2Jd8A;,,r*   
class_data	class_idsc                     |sy| |d      \  }}}t        |      }|dd  D ]6  }| |   }|t        |d         z  }t        ||d         }t        ||d         }8 ||z
  dz   }	d|	dz  z   }
d|dz  z   }t        |
|      S )Nr   r   r/         )r$   minmax)ry   rz   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countrg   data
glyphCountformat1_bytesformat2_bytess               r(   _classDef_bytesr      s    
 /9)A,/G,L,l#Kqr] 2!}s47|#<a1<a1	2
 ,q0J
Q&Ma'M}m,,r*   ClusteringContext)lines
all_class1all_class1_dataall_class2_datavalueFormat1_bytesvalueFormat2_bytesc                       e Zd ZU eed<   eed<   ed        Zed        Ze	d        Z
ed        Ze	d        Ze	d        Ze	d	        Zy
)Clusterctxindices_bitmaskc                 ,    t        | j                        S r>   )r   r   selfs    r(   indiceszCluster.indices   s    4//00r*   c                 t     t        t        j                   fd j                  D              }t	        |      S )Nc              3   P   K   | ]  }j                   j                  |     y wr>   )r   r   .0rg   r   s     r(   	<genexpr>z)Cluster.column_indices.<locals>.<genexpr>   s     %NAdhhnnQ&7%Ns   #&)r   r%   __or__r   r   )r   bitmasks   ` r(   column_indiceszCluster.column_indices   s*     %N%NO7##r*   c                 2    t        | j                        dz   S rC   )r$   r   r   s    r(   widthzCluster.width   s     4&&'!++r*   c                    d| j                   z   dz   dz   dz   | j                  z   dz   | j                  z   dz   dz   | j                  j                  | j                  j
                  z   t        | j                        z  | j                  z  z   S )Nr|   r/   )	coverage_bytesclassDef1_bytesclassDef2_bytesr   r   r   r$   r   r   r   s    r(   costzCluster.cost   s     !!" 	   ""#  !" ""##& '* +. xx**TXX-H-HH$,, jj/	
r*   c                     dt         fd j                  D              dz  z   }t        t        j                   fd j                  D                    }d}d }|D ]  \  }}|||dz   k7  r|dz  }|} d|dz  z   }t        ||      S )Nr}   c              3   b   K   | ]&  }t        j                  j                  |          ( y wr>   r$   r   r   r   s     r(   r   z)Cluster.coverage_bytes.<locals>.<genexpr>  s%     D!#dhh))!,-Ds   ,/r/   c              3   V   K   | ]   }j                   j                  |   d     " ywr   N)r   r   r   s     r(   r   z)Cluster.coverage_bytes.<locals>.<genexpr>  s%     U1 8 8 ;A >Us   &)r   r   r|   )sumr   ra   r   from_iterabler~   )r   r   rv   merged_range_countru   startendr   s   `       r(   r   zCluster.coverage_bytes   s     Dt||DDqHI	 	 UUU
   	JE3ETAX$5"a'"D	 
 !1$%	 	 =-00r*   c                      t         j                   fd      }t         j                  j                   j                  D cg c]
  }||k7  s	| c}      S c c}w )Nc                 H    t        j                  j                  |          S r>   r   )rg   r   s    r(   <lambda>z)Cluster.classDef1_bytes.<locals>.<lambda>   s    DHH<O<OPQ<R8S r*   )key)r   r   r   r   r   )r   biggest_indexrg   s   `  r(   r   zCluster.classDef1_bytes  sK     DLL.STHH$$$,,&UQ!}BTq&U
 	
&Us   
A
A
c                 V    t        | j                  j                  | j                        S r>   )r   r   r   r   r   s    r(   r   zCluster.classDef2_bytes%  s!     txx779L9LMMr*   N)__name__
__module____qualname__r   __annotations__r%   r   r   r   propertyr   r   r   r   r    r*   r(   r   r      s    	1 1 $ $ , , 
 
> 1 1> 	
 	
 N Nr*   r   rm   compressionc           	      :  $%&' sgS t        t        d D                    }t        t        d D                    }|D cg c]   t        fdt        |      D              " }}| j	                         '|D cg c]  }t        'fd|D               }}|D cg c]  }t        'fd|D               }	}d}
d}j                         D ]?  \  }}|
|d   r|d   j                         ndz  }
||d   r|d   j                         ndz  }A t        |
      dz  }t        |      dz  }t        ||||	||      %i $d	t        d
t        f$%fd&dt        dt        d
t        f&fd}t        t        |            D cg c]  } &d|z         }} &dt        |      z  dz
        j                  }t        j!                  dt        |              t        |      dkD  rd }d }d }d }t        |      D ]c  \  }}t        ||dz   d        D ]J  \  }} |||      }|j                  |j                  z
  |j                  z
  }|||k  s=|}|}|dz   |z   }|}L e |J |J |J |J |dkD  rwt        d |D              }d||z  z
  }t#        d|z
         |z  }t        j!                  dt        |      dd|dd|        |dk(  rt        |      }t        |      |dz   k  rn||= |||<   t        |      dkD  rt%        t&              } j                         D ]  \  }}!|!| |d      |<    g }"|D ]G  }t'               }#|j(                  D ]  }||   |#j+                  |            |"j-                  |#       I |"S c c}w c c}w c c}w c c}w )Nc              3   &   K   | ]	  }|d      ywr   r   r   pairs     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>5       6DG6   c              3   &   K   | ]	  }|d      yw)r   Nr   r   s     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>6  r   r   c              3   >   K   | ]  \  }}|fv rd |z  nd  yw)r   r   Nr   )r   rg   rk   ri   rm   s      r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>:  s2      
6 v&%/AFQ6
s   c              3   (   K   | ]	  }|     y wr>   r   r   name
name_to_ids     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>E       9T
4(9   c              3   (   K   | ]	  }|     y wr>   r   r   s     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>H  r   r   r   r   r/   r   r   c                 V    j                  | d       }||S t        |       }|| <   |S r>   )r1   r   )r   clustercluster_cacher   s     r(   make_clusterzBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster^  s;    ##GT2N#w'!(gr*   r   otherc                 B     | j                   |j                   z        S r>   )r   )r   r   r   s     r(   mergez;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergef  s    G33e6K6KKLLr*   z        len(clusters) = c              3   4   K   | ]  }|j                     y wr>   )r   )r   cs     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>  s     &@!qvv&@s   z            len(clusters) = 3dz    size_reduction=z5.2fz    max_new_subtables=r0   )ra   setr   r[   rc   rx   rZ   ro   r   r   r%   r   ranger$   r   logdebugr	   r   dictr   updaterG   )(r+   rm   r   r   
all_class2ri   r   clsr   r   format1format2r   valuer   r   r   rg   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedr   rj   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_groupr   r   r   r   s(    `   `                              @@@@r(   rb   rb   +  s}   
 w 6667J6667J !
 	 	 
&z2
 	
E  ((*J FP>A9S99O  FP>A9S99O  GG{{} DeE!H58..0!CE!H58..0!CD #7+a/"7+a/
C )+Mc g Mw Mw M7 M /4CJ.?@Q!V$@H@ )!s5z/Q)>?DDII(X89
h-!
!!#H- 	)JAw%hq1uw&78 )5w.$kkGLL85::E%-?Q1Q)4&)*&'(1uqy$"(K)	) "---!---+++&&& ! $'&@x&@#@  !58M!MMN "&a.&8!9 9K GII.s8}R.@@STbcgShh~  @Q  R  S a$'M! 8} 1A 55 %&'2#$m h-!
r 5@4EO 0f)/Q &0 "L )!V 	8A]Fv67	8 	K() }L As   %N	N#NN)F)   ):loggingr   collectionsr   r   dataclassesr   	functoolsr   r   	itertoolsr   mathr	   typingr
   r   r   r   r   r   fontTools.configr   fontTools.misc.intToolsr   r   fontTools.ttLibr   fontTools.ttLib.tablesr   r   	getLoggerr   r   COMPRESSION_LEVELr   strdefaultr   r%   r)   r<   r4   r6   r9   PairPosr?   rN   r]   boolr^   ValueRecordPairsrx   r   r   r   rb   r   r*   r(   <module>r     sf    	 / ! -   E E $ : " 3g!xj(:;<  :  1 9 9: ES E$&   :. . .X__ . .2V 2C 2 2T 2



)1(2B2B)C
h

(0(8(8	(

6800 T  		%S/5c?
*+	&

f00
013	
-hsm 
-" -U4c3h0#s:;<-Cy-, 
  cN cN cNR L
LL L 
%[	Lr*   