
    ]MhE              
       N   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"j%                  Z&de'fdZ(dede'defdZ)dede'dej*        ddfdZ+dede'dej*        ddfdZ,dede'deej-                 deej-                 fdZ.dede'dej-        deej-                 fdZ/dej0        de1fdZ2eeee$df         ee$df         f         eej3        ej3        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*Z9dS )-    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                  4   t           } t          t          j        v r?dd l}|                    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     ^/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_envr)      s    )I BJ..)    		
 	
 	
 J89	
9~~yL889~~
C5CC	CC
D
DD    fontlevelc                     |                      d          }|| S |j        j        j        D ]Q}|j        dk    rt          | ||           |j        dk    r'|j        d         j        dk    rt          | ||           R| 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!!4////!##(:(NRS(S(StUF333Kr*   r;   c                 h    t          | ||j                  }||_        t          |          |_        d S N)compact_pair_posr7   r$   SubTableCount)r+   r,   r;   new_subtabless       r(   r6   r6   H   s2    $T5&/BBM#FO}--Fr*   c                     t          | |d |j        D                       }g }|D ]8}t          j                    }d|_        ||_        |                    |           9||_        t          |          |_        d S )Nc                     g | ]	}|j         
S  )ExtSubTable).0ext_subtables     r(   
<listcomp>z&compact_ext_lookup.<locals>.<listcomp>P   s    SSS<l.SSSr*   r   )	r?   r7   r   ExtensionPosFormatrE   appendr$   r@   )r+   r,   r;   rA   new_ext_subtablessubtablerG   s          r(   r9   r9   N   s    $eSS6?SSS M ! / /,..#+   ....'FO011Fr*   	subtablesc                     g }|D ]R}|j         dk    r|                    |           #|j         dk    r$|                    t          | ||                     S|S )Nr   r/   )rJ   rK   extendcompact_class_pairs)r+   r,   rN   rA   rM   s        r(   r?   r?   \   ss     M M M?a  ****_!!  !4T5(!K!KLLLr*   rM   c                 \   ddl m} g }t          t                    }|j        j        D ];}||j        j                            |d                   	                    |           <t          t                    }|j
        j                                        D ] \  }}||         	                    |           !i }	t          |j                  D ]\  }}
t          |
j                  D ]|\  }}t          |          rt!          |dd           t!          |dd           f|	t#          t%          ||                             t#          t%          ||                             f<   }t'          | |	|          }|D ]3}|	                     |||                                                      4|S )Nr   )buildPairPosClassesSubtableValue1Value2)fontTools.otlLib.builderrS   r   listCoverageglyphs	ClassDef1	classDefsr1   rK   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r+   r,   rM   rS   rN   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairss                  r(   rQ   rQ   i   s    EDDDDDI,7,=,=H% C C#-11!Q778??BBBB,7,=,=H",2244  11Ix455  	6"6#677 	 	IAvf%% $//$//SIuVHQK001159L9L3M3MNOO	 AyRWXXM X X44UD<S<S<U<UVVWWWWr*   rn   c                     t          | dd           }t          | dd           }|d u s|                                dk    o|d u p|                                dk    S )NrT   rU   r   )rb   getEffectiveFormat)rn   v1v2s      r(   ra   ra      sh    	4	(	(B	4	(	(B$J6"//11Q6 
d
2b++--2r*   .glyphIDsc                 "   t          |           } | d         }|gg}| dd          D ]>}||dz   k    r1|d                             |           |                    |g           |}?|d                             |           || d         | d         fS )Nr   r   )rd   rK   )ru   lastrangesglyphIDs       r(   _getClassRangesr{      s    hHA;DfXFABB<  dQh2Jd###MM7)$$$
2Jd8A;,,r*   F
class_data	class_idsc                 N   |sdS | |d                  \  }}}t          |          }|dd          D ]N}| |         }|t          |d                   z  }t          ||d                   }t          ||d                   }O||z
  dz   }	d|	dz  z   }
d|dz  z   }t          |
|          S )Nr   r   r/         )r$   minmax)r|   r}   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countrj   data
glyphCountformat1_bytesformat2_bytess               r(   _classDef_bytesr      s    
  q/9)A,/G,L,l##Kqrr] 2 2!}s47||#<a11<a11,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d
S )Clusterctxindices_bitmaskc                 *    t          | j                  S r>   )r   r   selfs    r(   indiceszCluster.indices   s    4/000r*   c                 x     t          t          j         fd j        D                       }t	          |          S )Nc              3   <   K   | ]}j         j        |         V  d S r>   )r   r   rF   rj   r   s     r(   	<genexpr>z)Cluster.column_indices.<locals>.<genexpr>   s,      %N%NAdhnQ&7%N%N%N%N%N%Nr*   )r   r%   __or__r   r   )r   bitmasks   ` r(   column_indiceszCluster.column_indices   s;     %N%N%N%N%N%N%NOO7###r*   c                 0    t          | j                  dz   S )Nr   )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     !" 	   "#  !" "##& '* +. x*TX-HH$, j/	
r*   c                      dt           fd j        D                       dz  z   }t          t          j         fd j        D                                 }d}d }|D ]\  }}|||dz   k    r|dz  }|}d|dz  z   }t          ||          S )Nr   c              3   V   K   | ]#}t          j        j        |                   V  $d S r>   r$   r   r   r   s     r(   r   z)Cluster.coverage_bytes.<locals>.<genexpr>  s5      DD!#dh)!,--DDDDDDr*   r/   c              3   H   K   | ]}j         j        |         d          V  dS r   N)r   r   r   s     r(   r   z)Cluster.coverage_bytes.<locals>.<genexpr>  s2      UU1 8 ;A >UUUUUUr*   r   r   r   )sumr   rd   r   from_iterabler   )r   r   ry   merged_range_countrx   startendr   s   `       r(   r   zCluster.coverage_bytes   s     DDDDt|DDDDDqHI	 	 UUUUUUUUU
 
   	 	JE3ETAX$5$5"a'"DD
 
 !1$%	 	 =-000r*   c                      t           j         fd          t           j        j        fd j        D                       S )Nc                 B    t          j        j        |                    S r>   r   )rj   r   s    r(   <lambda>z)Cluster.classDef1_bytes.<locals>.<lambda>   s    DH<OPQ<R8S8S r*   )keyc                      g | ]
}|k    |S rD   rD   )rF   rj   biggest_indexs     r(   rH   z+Cluster.classDef1_bytes.<locals>.<listcomp>"  s#    &U&U&UQ!}BTBTqBTBTBTr*   )r   r   r   r   r   )r   r   s   `@r(   r   zCluster.classDef1_bytes  sW     DL.S.S.S.STTTH$&U&U&U&U$,&U&U&U
 
 	
r*   c                 @    t          | j        j        | j                  S r>   )r   r   r   r   r   s    r(   r   zCluster.classDef2_bytes%  s     tx79LMMMr*   N)__name__
__module____qualname__r   __annotations__r%   r   r   r   propertyr   r   r   r   r   rD   r*   r(   r   r      s         	1 1 _1 $ $ _$ , , X, 
 
 _
> 1 1 X1> 	
 	
 X	
 N N XN N Nr*   r      rp   compressionc                   "#$%& sgS t          t          d D                                 }t          t          d D                                 ""fd|D             }|                                 &&fd|D             }&fd"D             }d}d}                                D ]S\  }	}
||
d         r|
d                                         ndz  }||
d         r|
d                                         ndz  }Tt          |          dz  }t          |          dz  }t          ||||||          $i #d	t          d
t          f#$fd%dt          dt          d
t          f%fd}%fdt          t          |                    D             } %dt          |          z  dz
            j        }t                              dt          |                      t          |          dk    r=d }d }d }d }t          |          D ]^\  }}t          ||dz   d                    D ]>\  }} |||          }|j        |j        z
  |j        z
  }|||k     r|}|}|dz   |z   }|}?_|J |J |J |J |dk    rt          d |D                       }d||z  z
  }t!          d|z
             |z  }t                              dt          |          dd|dd|            |dk    rt          |          }t          |          |dz   k    rn||= |||<   t          |          dk    =t#          t$                    }                                D ]\  }	}|||	d                  |	<   g }|D ]R}t%                      } |j        D ]%}||         }!|                     ||!                    &|                    |            S|S )Nc              3   &   K   | ]}|d          V  dS r   rD   rF   pairs     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>5  &      66DG666666r*   c              3   &   K   | ]}|d          V  dS )r   NrD   r   s     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>6  r   r*   c                 d    g | ]+t          fd t                    D                       ,S )c              3   8   K   | ]\  }}|fv rd |z  ndV  dS )r   r   NrD   )rF   rj   rn   rl   rp   s      r(   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>:  sR       
 
6 v&%//AFFQ
 
 
 
 
 
r*   )r   r^   )rF   rl   
all_class2rp   s    @r(   rH   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>9  si       
 	 	 
 
 
 
 
&z22
 
 
 	
 	
  r*   c                 F    g | ]}t          fd |D                       S )c              3   (   K   | ]}|         V  d S r>   rD   rF   name
name_to_ids     r(   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>E  (      99T
4(999999r*   r{   rF   clsr   s     r(   rH   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>D  C       >A9999S99999  r*   c                 F    g | ]}t          fd |D                       S )c              3   (   K   | ]}|         V  d S r>   rD   r   s     r(   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>H  r   r*   r   r   s     r(   rH   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>G  r   r*   r   r   r/   r   r   c                 f                         | d           }||S t          |           }|| <   |S r>   )r1   r   )r   clustercluster_cacher   s     r(   make_clusterzBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster^  sA    ##GT22N#w''!(gr*   r   otherc                 4     | j         |j         z            S r>   )r   )r   r   r   s     r(   mergez;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergef  s    |G3e6KKLLLr*   c                 ,    g | ]} d |z            S )r   rD   )rF   rj   r   s     r(   rH   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>m  s'    @@@Q!V$$@@@r*   z        len(clusters) = c              3   $   K   | ]}|j         V  d S r>   )r   )rF   cs     r(   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>  s$      &@&@!qv&@&@&@&@&@&@r*   z            len(clusters) = 3dz    size_reduction=z5.2fz    max_new_subtables=r0   )rd   setrf   r]   rr   r   r   r%   r   ranger$   r   logdebugr^   r   r	   r   dictr   updaterK   )'r+   rp   r   r   r   r   r   format1format2r   valuer   r   r   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedrj   r   rm   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_grouprl   r   r   r   r   r   s'    `                                @@@@@r(   re   re   +  s^   
  w 666666677J666666677J    
 !  E ((**J   EO  O   EO  O GG{{}} D DeE!HC58..000!CE!HC58..000!C"7++a/"7++a/
 C )+Mc g       Mw Mw M7 M M M M M M A@@@eCJJ.?.?@@@H )L!s5zz/Q)>??DII8X88999
h--!

!!#H-- 	) 	)JAw%hq1uww&788 ) )5w..$kGL85:E%-?Q1Q1Q)4&)*&'(1uqy$"(K) "---!---+++&&& !! $'&@&@x&@&@&@#@#@  !58M!MMN "&a.&8!9!9 9K GII Ss8}}  S  S  STb  S  S  S  @Q  S  S   a$'MM! 8}} 1A 555 %&'2#$m h--!

r 5@4E4EO 0 0f)/Q && "L ) )!VV 	8 	8A]Fv67777K((((r*   )F)r   ):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?   rQ   r`   boolra   ValueRecordPairsr{   r   r   r   re   rD   r*   r(   <module>r     s    				 / / / / / / / / ! ! ! ! ! ! - - - - - - - -             E E E E E E E E E E E E E E E E $ $ $ $ $ $ : : : : : : : : " " " " " " 3 3 3 3 3 3 3 3g!!x;;;<  : C 1 9:: ES E E E E$&      :. . .X_ . . . . .2V 2C 2 2T 2 2 2 2



)1(2B)C
h
 
 
 

(0(8	(
   680 T     		%S/5c?
*+	&
f0
013	
-hsm 
- 
- 
- 
-" - -U4c3h0#s:;<-Cy- - - -, J  
 
  cN cN cN cN cN cN cN cNR L L
LL L 
%[	L L L L L Lr*   