
    +gH              
       "   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 j8                  e      Zee d   ZdZ  e!ejD                        Z#de$fdZ%dede$defdZ&dede$dejN                  ddfdZ(dede$dejN                  ddfdZ)dede$deejT                     deejT                     fdZ+dede$dejT                  deejT                     fdZ,dejZ                  de.fdZ/eeee!df   ee!df   f   eej`                  ej`                  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'Z6y)*    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                     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     v/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/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(   r9   c                 `    t        | ||j                        }||_        t        |      |_        y N)compact_pair_posr5   r"   SubTableCount)r)   r*   r9   new_subtabless       r&   r4   r4   G   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=   r5   ExtSubTabler   ExtensionPosFormatappendr"   r>   )r)   r*   r9   ext_subtabler?   new_ext_subtablessubtables          r&   r7   r7   M   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-   )rD   rE   extendcompact_class_pairs)r)   r*   rI   r?   rH   s        r&   r=   r=   [   s`     M M??a  *__!  !4T5(!KLM r(   rH   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.builderrN   r   listCoverageglyphs	ClassDef1	classDefsr/   rE   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r)   r*   rH   rN   rI   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairss                  r&   rL   rL   h   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(   ri   c                     t        | dd       }t        | dd       }|d u xs |j                         dk(  xr |d u xs |j                         dk(  S )NrO   rP   r   )r]   getEffectiveFormat)ri   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   )r_   rE   )rp   lastrangesglyphIDs       r&   _getClassRangesrv      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)rw   rx   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countre   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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y)Clusterctxindices_bitmask_indices_column_indices_costr   r   c                 J    || _         || _        d | _        d | _        d | _        y r<   r   )selfr   r   s      r&   __init__zCluster.__init__   s'    .#
r(   c                 f    | 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   P   K   | ]  }j                   j                  |     y wr<   )r   r   .0re   r   s     r&   	<genexpr>z)Cluster.column_indices.<locals>.<genexpr>   s     )R$((..*;)Rs   #&)r   r   r#   __or__r   r   )r   bitmasks   ` r&   column_indiceszCluster.column_indices   sD    ' SZZ)RT\\)RSG#.w#7D ###r(   c                 2    t        | j                        dz   S rA   )r"   r   r   s    r&   widthzCluster.width   s     4&&'!++r(   c                 T   | j                   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   | _         | j                   S )Nrz   r-   )
r   coverage_bytesclassDef1_bytesclassDef2_bytesr   r   r   r"   r   r   r   s    r&   costzCluster.cost   s    :: %%& 	   &&'  !" &&#'& '* +. 88..1L1LLdll#$**/ J: zz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   rz   )sumr   r_   r   from_iterabler|   )r   r   rt   merged_range_countrs   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   )re   r   s    r&   <lambda>z)Cluster.classDef1_bytes.<locals>.<lambda>4  s    DHH<O<OPQ<R8S r(   )key)r}   r   r   r   r   )r   biggest_indexre   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_bytes9  s!     txx779L9LMMr(   N)__name__
__module____qualname__	__slots__r   r#   r   propertyr   r   r   r   r   r   r    r(   r&   r   r      s     QI-    
 $ $ , ,  B 1 1> 	
 	
 N Nr(   r   rk   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>I       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>J  r   r   c              3   >   K   | ]  \  }}|fv rd |z  nd  yw)r   r   Nr   )r   re   ri   rg   rk   s      r&   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>N  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>Y       9T
4(9   c              3   (   K   | ]	  }|     y wr<   r   r   s     r&   r   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>\  r   r   r   r   r-   r   r   c                 V    j                  | d       }||S t        |       }|| <   |S r<   )r/   r   )r   clustercluster_cacher   s     r&   make_clusterzBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterr  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>.mergez  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=r.   )r_   setr   rY   ra   rv   rX   rm   r   r   r#   r   ranger"   r   logdebugr   r   dictr   updaterE   )(r)   rk   r   r   
all_class2rg   r   clsr   r   format1format2r   valuer   r   r   re   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedr   rh   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&   r`   r`   ?  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)   )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'   r:   r2   r4   r7   PairPosr=   rL   r[   boolr\   ValueRecordPairsrv   r   r   r   r`   r   r(   r&   <module>r	     sR    	 /    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-, 
 yN yN~ L
LL L 
%[	Lr(   