
    <`9F              
          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mZ d dlmZ d d	lmZmZ d
ZdZ e j        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j(        ej(        f         f         Z)dee*         fdZ+	 d)deeeee*e*f                  e*e*f                  dee*         fd Z, ed!g d"          Z- G d# d$          Z.	 d*ded&e)d'e*dee)         fd(Z/dS )+    N)defaultdict
namedtuple)reduce)chain)log2)DefaultDictDictIterableListSequenceTuple)	bit_countbit_indices)TTFont)otBaseotTablesFONTTOOLS_GPOS_COMPACT_MODE0zfontTools.otlLib.optimize.gposfontmodereturnc                     | 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       >lib/python3.11/site-packages/fontTools/otlLib/optimize/gpos.pycompactr'      s     <D*'. 3 3!!4v....!##(:(NRS(S(StT6222K    r%   c                 h    t          | ||j                  }||_        t          |          |_        d S N)compact_pair_posr!   lenSubTableCount)r   r   r%   new_subtabless       r&   r    r    ,   s2    $T4AAM#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>4   s    RRR,\-RRRr(      )	r+   r!   r   ExtensionPosFormatr2   appendr,   r-   )r   r   r%   r.   new_ext_subtablessubtabler4   s          r&   r#   r#   2   s    $dRR&/RRR M ! / /,..#+   ....'FO011Fr(   	subtablesc                     g }|D ]R}|j         dk    r|                    |           #|j         dk    r$|                    t          | ||                     S|S )Nr6   r   )r8   r9   extendcompact_class_pairs)r   r   r<   r.   r;   s        r&   r+   r+   @   ss     M L L?a  ****_!!  !4T4!J!JKKKr(   r;   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k    rY|dv rUt)          | |	t+          |                    }|D ]3}|	                     |||                                                      4nt/          dt0           d|           |S )	Nr   )buildPairPosClassesSubtableValue1Value2r6   	123456789zBad =)fontTools.otlLib.builderrA   r   listCoverageglyphs	ClassDef1	classDefsgetr9   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesortedr,   ,cluster_pairs_by_class2_coverage_custom_costintgetReverseGlyphMap
ValueErrorGPOS_COMPACT_MODE_ENV_KEY)r   r   r;   rA   r<   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairss                  r&   r?   r?   M   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	 4yyA~~$+--D)SYY
 
 # 	 	E++E43J3J3L3LMM   	
 B 9BBDBBCCCr(   rb   c                     t          | dd           }t          | dd           }|d u s|                                dk    o|d u p|                                dk    S )NrB   rC   r   )rS   getEffectiveFormat)rb   v1v2s      r&   rR   rR   p   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   r6   )rU   r9   )ri   lastrangesglyphIDs       r&   _getClassRangesro   ~   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   r6   r         )r,   minmax)rp   rq   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countr^   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   r3   r^   r   s     r&   	<genexpr>z)Cluster.column_indices.<locals>.<genexpr>   s,      )R)R$(.*;)R)R)R)R)R)Rr(   )r   r   rW   __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 )Nr6   )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 )Nrs   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 )Nrt   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   r6   rs   )sumr   rU   r   from_iterableru   )r   r~   rm   merged_range_countrl   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
 
 " 	 	LUC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   )r^   r   s    r&   <lambda>z)Cluster.classDef1_bytes.<locals>.<lambda>   s    DH<OPQ<R8S8S r(   )keyc                      g | ]
}|k    |S r1   r1   )r3   r^   biggest_indexs     r&   r5   z+Cluster.classDef1_bytes.<locals>.<listcomp>"  s#    &U&U&UQ!}BTBTqBTBTBTr(   )rv   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__	__slots__r   rW   r   propertyr   r   r   r   r   r   r   r1   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      rd   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   r1   r3   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 )r6   Nr1   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 )r6   r   Nr1   )r3   r^   rb   r`   rd   s      r&   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>:  sR       
 
6 v&%//AFFQ
 
 
 
 
 
r(   )r   rO   )r3   r`   
all_class2rd   s    @r&   r5   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*   r1   r3   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(   ro   r3   clsr   s     r&   r5   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*   r1   r   s     r&   r   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>H  r   r(   r   r   s     r&   r5   z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>G  r   r(   r   r6   r   r   r   c                 f                         | d           }||S t          |           }|| <   |S r*   )rL   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 )r6   r1   )r3   r^   r   s     r&   r5   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   )r3   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   )rU   setrX   rN   rf   r   r   rW   r   ranger,   r   logdebugrO   r   r   r   dictr   updater9   )'r   rd   r   r   r   r   r   format1format2r   valuer   r   r   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedr^   r   ra   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_groupr`   r   r   r   r   r   s'    `                                @@@@@r&   rV   rV   +  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   )0loggingcollectionsr   r   	functoolsr   	itertoolsr   mathr   typingr   r	   r
   r   r   r   fontTools.misc.intToolsr   r   fontTools.ttLibr   fontTools.ttLib.tablesr   r   rZ   GPOS_COMPACT_MODE_DEFAULT	getLoggerr   strr'   r   r    r#   PairPosr+   r?   rQ   boolrR   ValueRecordPairsrW   ro   r   r   r   rV   r1   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899&      .. .s .HO . . . . .2V 23 2 2D 2 2 2 2



(01A(B
h
 
 
 
 
  '/'7 	(
       F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(   