
    Ng*H              
       .   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 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j-        de.fdZ/eeee!df         ee!df         f         eej0        ej0        f         f         Z1dee$         fdZ2	 d*deeeee$e$f                  e$e$f                  d ee$         fd!Z3 ed"g d#          Z4 G d$ d%          Z5	 d+ded'e1d(e$dee1         fd)Z6dS ),    N)defaultdict
namedtuple)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     Z/var/www/html/ai-engine/env/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         }|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   )table
LookupListLookup
LookupTypecompact_lookupSubTableExtensionLookupTypecompact_ext_lookup)r)   r*   gposlookups       r&   compactr9   *   s     <D*'. 4 4!!4////!##(:(NRS(S(StUF333Kr(   r8   c                 h    t          | ||j                  }||_        t          |          |_        d S N)compact_pair_posr4   r"   SubTableCount)r)   r*   r8   new_subtabless       r&   r3   r3   A   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>I   s    SSS<l.SSSr(   r   )	r<   r4   r   ExtensionPosFormatrB   appendr"   r=   )r)   r*   r8   r>   new_ext_subtablessubtablerD   s          r&   r6   r6   G   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-   )rG   rH   extendcompact_class_pairs)r)   r*   rK   r>   rJ   s        r&   r<   r<   U   ss     M M M?a  ****_!!  !4T5(!K!KLLLr(   rJ   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.builderrP   r   listCoverageglyphs	ClassDef1	classDefsgetrH   	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   b   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(   rl   c                     t          | dd           }t          | dd           }|d u s|                                dk    o|d u p|                                dk    S )NrQ   rR   r   )r`   getEffectiveFormat)rl   v1v2s      r&   r_   r_   }   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   )rb   rH   )rs   lastrangesglyphIDs       r&   _getClassRangesry      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)rz   r{   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countrh   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dZdedefdZ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_bitmask_indices_column_indices_costr   r   c                 L    || _         || _        d | _        d | _        d | _        d S r;   r   )selfr   r   s      r&   __init__zCluster.__init__   s+    .#


r(   c                 P    | j         t          | j                  | _         | j         S r;   )r   r   r   r   s    r&   indiceszCluster.indices   s$    = '(<==DM}r(   c                       j         ?t          t          j         fd j        D                       }t          |           _          j         S )Nc              3   <   K   | ]}j         j        |         V  d S r;   )r   r   rC   rh   r   s     r&   	<genexpr>z)Cluster.column_indices.<locals>.<genexpr>   s,      )R)R$(.*;)R)R)R)R)R)Rr(   )r   r   r#   __or__r   r   )r   bitmasks   ` r&   column_indiceszCluster.column_indices   sO    ' SZ)R)R)R)RT\)R)R)RSSG#.w#7#7D ##r(   c                 0    t          | j                  dz   S )Nr   )r"   r   r   s    r&   widthzCluster.width   s     4&''!++r(   c                     | j         hd| 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   | _         | j         S )Nr}   r-   )
r   coverage_bytesclassDef1_bytesclassDef2_bytesr   r   r   r"   r   r   r   s    r&   costzCluster.cost   s    : %& 	   &'  !" &#'& '* +. 8.1LLdl##$*/ J: z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   rb   r   from_iterabler   )r   r   rw   merged_range_countrv   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   )rh   r   s    r&   <lambda>z)Cluster.classDef1_bytes.<locals>.<lambda>.  s    DH<OPQ<R8S8S r(   )keyc                      g | ]
}|k    |S rA   rA   )rC   rh   biggest_indexs     r&   rE   z+Cluster.classDef1_bytes.<locals>.<listcomp>0  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_bytes3  s     tx79LMMMr(   N)__name__
__module____qualname__	__slots__r   r#   r   propertyr   r   r   r   r   r   r   rA   r(   r&   r   r      s        QI-        X
 $ $ X$ , , X,   XB 1 1 X1> 	
 	
 X	
 N N XN N Nr(   r      rn   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   rA   rC   pairs     r&   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>C  &      66DG666666r(   c              3   &   K   | ]}|d          V  dS )r   NrA   r   s     r&   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>D  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   NrA   )rC   rh   rl   rj   rn   s      r&   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>H  sR       
 
6 v&%//AFFQ
 
 
 
 
 
r(   )r   r\   )rC   rj   
all_class2rn   s    @r&   rE   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>G  si       
 	 	 
 
 
 
 
&z22
 
 
 	
 	
  r(   c                 F    g | ]}t          fd |D                       S )c              3   (   K   | ]}|         V  d S r;   rA   rC   name
name_to_ids     r&   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>S  (      99T
4(999999r(   ry   rC   clsr   s     r&   rE   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>R  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;   rA   r   s     r&   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>V  r   r(   r   r   s     r&   rE   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>U  r   r(   r   r   r-   r   r   c                 f                         | d           }||S t          |           }|| <   |S r;   )rY   r   )r   clustercluster_cacher   s     r&   make_clusterzBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterl  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>.merget  s    |G3e6KKLLLr(   c                 ,    g | ]} d |z            S )r   rA   )rC   rh   r   s     r&   rE   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>{  s'    @@@Q!V$$@@@r(   z        len(clusters) = c              3   $   K   | ]}|j         V  d S r;   )r   )rC   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=r.   )rb   setrd   r[   rp   r   r   r#   r   ranger"   r   logdebugr\   r   r   r   dictr   updaterH   )'r)   rn   r   r   r   r   r   format1format2r   valuer   r   r   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedrh   r   rk   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_grouprj   r   r   r   r   r   s'    `                                @@@@@r&   rc   rc   9  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   )7loggingr   collectionsr   r   	functoolsr   	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'   r9   r1   r3   r6   PairPosr<   rN   r^   boolr_   ValueRecordPairsry   r   r   r   rc   rA   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  
 
 yN yN yN yN yN yN yN yN~ L L
LL L 
%[	L L L L L Lr(   