
    V/i              	          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Zd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZ  ej&                  e      Zd	Z	 d dlZd
Zee d   Z G d de      Z G d de      Z G d de      Z G d de      Z  e! e
jD                  dd             dk(  sJ  e	j                  d      jF                  dk(  sJ d        G d de      Z$ G d de      Z% G d de      Z& G d de      Z'd Z(d  Z)d! Z*d" Z+ G d# d$e      Z, G d% d&e,      Z- G d' d(e-      Z.e-e.d)Z/d* Z0 e       d5d+e,d,ee1   d-ee2   fd.       Z3g d/Z4d0 Z5 e5       Z6 G d1 d2e      Z7 G d3 d4e      Z8y# e$ r Y !w xY w)6    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFTz:USE_HARFBUZZ_REPACKERc                       e Zd Zd Zd Zy)OverflowErrorRecordc                 h    |d   | _         |d   | _        |d   | _        |d   | _        |d   | _        y )Nr   r            )	tableTypeLookupListIndexSubTableIndexitemName	itemIndex)selfoverflowTuples     S/srv/sistema/bot/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/otBase.py__init__zOverflowErrorRecord.__init__   s@    &q),Q/*1-%a(&q)    c                     t        | j                  d| j                  d| j                  d| j                  d| j
                  f	      S )NzLookupIndex:zSubTableIndex:z	ItemName:z
ItemIndex:)strr   r   r   r   r   r   s    r   __repr__zOverflowErrorRecord.__repr__!   sG    $$ ""

 	
r   N)__name__
__module____qualname__r   r!    r   r   r   r      s    *
r   r   c                       e Zd Zd Zd Zy)OTLOffsetOverflowErrorc                     || _         y Nvalue)r   overflowErrorRecords     r   r   zOTLOffsetOverflowError.__init__2   s	    (
r   c                 ,    t        | j                        S r)   )reprr+   r    s    r   __str__zOTLOffsetOverflowError.__str__5   s    DJJr   N)r"   r#   r$   r   r/   r%   r   r   r'   r'   1   s    ) r   r'   c                       e Zd ZdZdZdZy)RepackerStater   r   r   N)r"   r#   r$   PURE_FTHB_FTFT_FALLBACKr%   r   r   r1   r1   9   s     G E Kr   r1   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd	Zy
)BaseTTXConverterzGeneric base class for TTX table converters. It functions as an
    adapter between the TTX (ttLib actually) table model and the model
    we use for OpenType tables, which is necessarily subtly different.
    c                     ddl m} t        || j                        }t	        || j                        } |       | _        | j
                  j                  ||       y)zFCreate an object from the binary data. Called automatically on access.r   otTablestableTagN) r9   OTTableReaderr;   getattrtable	decompile)r   datafontr9   reader
tableClasss         r   r@   zBaseTTXConverter.decompileT   sB    tdmm<Xt}}5
\


VT*r   c                    d}|j                   t           }| j                  dv r^|du r!t        j	                  d| j                         n9t
        s3|du rt        d      |J t        j	                  d| j                         |dv r%t
        r| j                  dv rt        j                  }nt        j                  }d}d}	 	 t        | j                  	      }| j                  j                  ||       |t        j                  k(  r| j                  ||      S |t        j                  k(  r| j                  |      S |t        j                  k(  r6| j                  |       t        j	                  d
       t        j                  }# t         $ rk}d}| j#                  |||      }	|j$                  }|	rY d}~|t        j                  u r&t        j	                  d       t        j                  }n Y d}~pd}~ww xY w)z=Compiles the table into binary. Called automatically on save.N)GSUBGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)NTr:   zXRe-enabling sharing between extensions and switching back to harfbuzz+fontTools packing.zrHarfbuzz packing out of resolutions, disabling sharing between extensions and switching to fontTools only packing.)cfgUSE_HARFBUZZ_REPACKERr;   logdebughave_uharfbuzzImportErrorr1   r3   r2   OTTableWriterr?   compiletryPackingHarfbuzztryPackingFontToolsr4   r'   tryResolveOverflowr+   )
r   rB   overflowRecorduse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereoks
             r   rO   zBaseTTXConverter.compile]   s   .  !67==,,%		TMM $ D(%&CDD(000IIY \)!11!''E!))E %!!&>

""640M///226;PQQm33333F;;m777 ,,V4II6 *//E# & * (,%,,T16HI%&WW"M///II? *55E s,   AF #F <A	F 	G:#G579G55G:c                    	 t         j                  d| j                         |j                  | j                        S # t        t
        t        j                  f$ rm}|sOt        |      j                   }t        |      dk7  r|d| z  }t         j                  d| j                  |       d}|j                  d      cY d }~S d }~ww xY w)Nzserializing '%s' with hb.repackr<   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)remove_duplicate)rJ   rK   r;   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper"   r   warning
getAllData)r   rX   rV   rY   	error_msgs        r   rP   z#BaseTTXConverter.tryPackingHarfbuzz   s    	=II7G11$--@@K)9)9: 	=
 )#Aw//0	q6R<2aS)I2MM	 )-%$$e$<<!	=s   := CA"C=CCc                 "    |j                         S r)   )rd   r   rX   s     r   rQ   z$BaseTTXConverter.tryPackingFontTools   s      ""r   c                     d}||j                   k(  r|S |j                   }t        j                  d|       |j                  ddlm}  |||      }nddlm}  |||      }|r|S ddlm}  |||      S )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )fixLookupOverFlows)fixSubTableOverFlows)r+   rJ   infor   r9   ri   rj   )r   rB   rY   rW   rZ   rS   ri   rj   s           r   rR   z#BaseTTXConverter.tryResolveOverflow   st    (I>B""*4#D.9B6%dN;BI
 	1!$77r   c                 <    | j                   j                  ||       y r)   )r?   toXML2)r   rX   rB   s      r   toXMLzBaseTTXConverter.toXML   s    

&$'r   c                     ddl m} t        | d      s"t        || j                        } |       | _        | j
                  j                  ||||       | j
                  j                          y )Nr   r8   r?   )r<   r9   hasattrr>   r;   r?   fromXMLpopulateDefaults)r   nameattrscontentrB   r9   rD   s          r   rq   zBaseTTXConverter.fromXML   sP    tW% 4==9J#DJ

46

##%r   c                 <    | j                   j                  |       y )N)recurse)r?   ensureDecompiled)r   rw   s     r   rx   z!BaseTTXConverter.ensureDecompiled   s    

##G#4r   NT)r"   r#   r$   __doc__r@   rO   rP   rQ   rR   rn   rq   rx   r%   r   r   r6   r6   N   s1    
+Yv=,#88(&5r   r6   ir   z#Oops, file a bug against fonttools.c                       e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r=   z5Helper class to retrieve data from an OpenType table.rA   offsetpos
localStater;   Nc                 J    || _         || _        || _        || _        || _        y r)   r}   )r   rA   r   r~   r;   s        r   r   zOTTableReader.__init__  s%    	$ r   c                 .    | xj                   |z  c_         y r)   r   r   counts     r   advancezOTTableReader.advance  s    Er   c                     || _         y r)   r   )r   r   s     r   seekzOTTableReader.seek  s	    r   c                     | j                  | j                  | j                  | j                  | j                        }| j
                  |_        |S r)   )	__class__rA   r   r~   r;   r   r   others     r   copyzOTTableReader.copy  s6    tyy$//4;;VHH	r   c                     | j                   |z   }| j                  | j                  | j                  || j                        S r)   )r~   r   rA   r   r;   )r   r~   s     r   getSubReaderzOTTableReader.getSubReader  s1    v%~~dii&$--PPr   c                     | j                   }||z   }t        j                  d| | j                  ||       \  }|| _         |S N>r   structunpackrA   )r   typecode
staticSizer   newposr+   s         r   	readValuezOTTableReader.readValue  sD    hhz!==1XJ3v1FGr   c                     | j                   }|||z  z   }t        j                  || j                  ||       }t        j                  dk7  r|j                          || _         |j                         S Nbig)r   arrayrA   sys	byteorderbyteswaptolist)r   r   r   r   r   r   r+   s          r   	readArrayzOTTableReader.readArray$  s^    hhuz))HdiiF&;<==E!NN||~r   c                 (    | j                  dd      S )Nbr   r   r   r    s    r   readInt8zOTTableReader.readInt8-      ~~ca~00r   c                 *    | j                  dd|      S )Nr   r   r   r   r   r   s     r   readInt8ArrayzOTTableReader.readInt8Array0      ~~cau~==r   c                 (    | j                  dd      S )Nhr   r   r   r    s    r   	readShortzOTTableReader.readShort3  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readShortArrayzOTTableReader.readShortArray6  r   r   c                 (    | j                  dd      S )Nr{   r   r   r   r    s    r   readLongzOTTableReader.readLong9  r   r   c                 *    | j                  dd|      S )Nr{   r   r   r   r   s     r   readLongArrayzOTTableReader.readLongArray<  r   r   c                 (    | j                  dd      S )NBr   r   r   r    s    r   	readUInt8zOTTableReader.readUInt8?  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readUInt8ArrayzOTTableReader.readUInt8ArrayB  r   r   c                 (    | j                  dd      S )NHr   r   r   r    s    r   
readUShortzOTTableReader.readUShortE  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readUShortArrayzOTTableReader.readUShortArrayH  r   r   c                 (    | j                  dd      S )NIr   r   r   r    s    r   	readULongzOTTableReader.readULongK  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readULongArrayzOTTableReader.readULongArrayN  r   r   c                     | j                   }|dz   }t        j                  dd| j                  || z         \  }|| _         |S )Nr   z>l    r   r   r   r   r+   s       r   
readUInt24zOTTableReader.readUInt24Q  sB    hhq==utyyV/D'DEr   c                 Z    t        |      D cg c]  }| j                          c}S c c}w r)   )ranger   )r   r   _s      r   readUInt24ArrayzOTTableReader.readUInt24ArrayX  s!    +0<8a!888s   (c                     | j                   }|dz   }t        | j                  ||       }t        |      dk(  sJ |       || _         |S Nr   )r   r   rA   lenr   s       r   readTagzOTTableReader.readTag[  sJ    hhqDIIc&)*5zQ%%r   c                 T    | j                   }||z   }| j                  || }|| _         |S r)   )r   rA   )r   r   r   r   r+   s        r   readDatazOTTableReader.readDatac  s0    hhu		#f%r   c                 |    | j                   r| j                   j                         n	t               }|||<   || _         y r)   r   r   dictr   rs   r+   rU   s       r   __setitem__zOTTableReader.__setitem__j  .    *.//$$&tvdr   c                 <    | j                   xr | j                   |   S r)   r   r   rs   s     r   __getitem__zOTTableReader.__getitem__o  s    84??4#88r   c                 :    | j                   xr || j                   v S r)   r   r   s     r   __contains__zOTTableReader.__contains__r  s    :44??#::r   )Nr   N)r"   r#   r$   rz   	__slots__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r   r   r=   r=     s    ?CI!
Q1>1>1>1>1>1>9 
9;r   r=   c                       e Zd Zd Zd Zd Zy)OffsetToWriterc                      || _         || _        y r)   )	subWriter
offsetSizer   r   r   s      r   r   zOffsetToWriter.__init__w  s    "$r   c                     t        |       t        |      k7  rt        S | j                  |j                  k(  xr | j                  |j                  k(  S r)   )rb   NotImplementedr   r   r   s     r   __eq__zOffsetToWriter.__eq__{  s?    :e$!!~~0XT__HXHX5XXr   c                 D    t        | j                  | j                  f      S r)   )hashr   r   r    s    r   __hash__zOffsetToWriter.__hash__  s    T^^T__566r   N)r"   r#   r$   r   r   r   r%   r   r   r   r   v  s    %Y
7r   r   c                       e Zd ZdZd)dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd*dZd Zd Zd Zd+dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d  Z!d! Z"d" Z#d# Z$d$ Z%d,d%Z&d& Z'd' Z(d( Z)y)-rN   z=Helper class to gather and assemble data for OpenType tables.Nc                 X    g | _         d | _        || _        || _        d | _        d| _        y )N<none>)itemsr   r   r;   parentrs   )r   r   r;   s      r   r   zOTTableWriter.__init__  s,    
$ 	r   c                 |    | j                   r| j                   j                         n	t               }|||<   || _         y r)   r   r   s       r   r   zOTTableWriter.__setitem__  r   r   c                      | j                   |   S r)   r   r   s     r   r   zOTTableWriter.__getitem__  s    t$$r   c                     | j                   |= y r)   r   r   s     r   __delitem__zOTTableWriter.__delitem__  s    OOD!r   c                     d}| j                   D ]H  }t        |d      r||j                  z  }t        |d      r||j                  z  };|t	        |      z   }J |S )z<Return the length of this table in bytes, without subtables.r   getCountDatar   )r   rp   sizer   r   )r   litems      r   getDataLengthzOTTableWriter.getDataLength  s]    JJ 	"Dt^,TYY{+T__$D	M	" r   c                    t        | j                        }| j                  }t        |      }t	        |      D ]  }||   }t        |d      s|j                  dk(  r&t        |j                  j                  |z
        ||<   J|j                  dk(  r'	 t        |j                  j                  |z
        ||<   |j                  dk(  r&t        |j                  j                  |z
        ||<   t        |j                         t!        |      S # t        j                  $ r' | j                  |j                        }t        |      w xY w)z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   r   r   r   rp   r   	packULongr   
packUShortr   errorgetOverflowErrorRecordr'   
packUInt24r^   r   )r   r   r   numItemsr{   r   r,   s          r   getDatazOTTableWriter.getData  s$   TZZ hhu:x 	6A8Dt[)??a'(););c)ABE!H__)J#-dnn.@.@3.F#Ga __))$..*<*<s*BCE!H$T__55'	6*  "<< J.2.I.I NN/+ 55HIIJs   %D:Ec                    t        | j                        }t        t        t        d}t        |      D ]M  \  }}t        |d      s|j                  |v r ||j                     d      ||<   :t        |j                         t        |      S )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r   r   )
r   r   r   r  r   	enumeraterp   r   r^   r   )r   r   	packFuncsr{   r   s        r   getDataForHarfbuzzz OTTableWriter.getDataForHarfbuzz  s    TZZ "zi@	 ' 	6GAtt[)??i/9y9!<E!H$T__55	6 r   c                 ,    t        | j                        S r)   )r   r   r    s    r   r   zOTTableWriter.__hash__  s    DJJr   c                 >    | j                  |      }|t        u r|S | S r)   r   r   r   r   results      r   __ne__zOTTableWriter.__ne__  $    U#>1vA6zAr   c                 n    t        |       t        |      k7  rt        S | j                  |j                  k(  S r)   )rb   r   r   r   s     r   r   zOTTableWriter.__eq__  s+    :e$!!zzU[[((r   c                    t        | d      }t        | d      }|r|si }| j                  }t        |      D ]  \  }}t        |d      r|j                         ||<   &t        |d      s3|j                  j                  ||       |rS|j                  |j                  |j                        ||   _         t        |      | _        y )N	Extension	DontSharer   r   shareExtension)rp   r   r  r   r   _doneWriting
setdefaulttuple)r   internedTablesr  isExtension	dontSharer   r{   r   s           r   r  zOTTableWriter._doneWriting  s     dK0 D+.	~N

 ' 	GAtt^,,,.a{+++"> ,  !)7)B)B*E!H&	" 5\
r   c                    d|t        |       <   t        | j                        }t        t	        |            }|j                          t        | d      }|}|r|J d       |d i }}}d}t        | d      rt	        |      D ]<  }	| j                  |	   }
t        |
d      st        |
j                  dd       dk(  s:d} n t        
j                        |vr|
j                  j                  |||       n	 |D ]u  }	| j                  |	   }
t        |
d      s|r |	d	k(  rt        |
j                  dd       dk(  rAt        |
j                        |vr|
j                  j                  |||       vw |j                  |        y )
NTr  zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr   rs   Coverager   )idr   r   r   r   reverserp   r>   r   _gatherTablesappend)r   tables	extTablesdoner  iRanger  
selfTablesr  r{   r   s              r   r!  zOTTableWriter._gatherTables  s    RXtzz?eHo&dK0
%gfg%&/rtIF !4+,8_ zz!}D+.=K'+$ $..!-,,VYE  	A::a=D4- !!VDNNFD9ZG $..!-,,VYE #	& 	$r   c                    g }g }|}|D ]  }	|j                  dd|	f        d}
d}t        | d      rut        | j                        D ]]  \  }}t	        |dd       dk(  sd}
t        |      |vr|j                  |||||      x}}n|t        |         }|j                  |        n d}d}t        | j                        D ]  \  }}t        |d      r|}n+t        |d      r||j                  z  }1|t        |      z   }@t        |j                        |vr"|j                  j                  |||||      x}}n|t        |j                           }||j                  |f}|j                  |       ||j                  z  } |j                  |        |j                  ||f       |d	z  }||t        |       <   |
r|j                          |S )
Nr   Fr  rs   r  Tr   r   r   )r"  rp   r  r   r>   r  _gatherGraphForHarfbuzzr   r   r   r   pop)r   r#  obj_listr%  objidxvirtual_edges
real_linksvirtual_linksitem_idxidxr  coverage_idxr{   r   	child_idx
offset_posr   	real_edges                     r   r)  z%OTTableWriter._gatherGraphForHarfbuzzG  s   
 ! 	.C  !Q-	. !4+,$TZZ0 
44.*<'+$$xt+262N2N"HdHm3 x (,BtH~!((6
 	
 , 	*GAtt[) ~.dii'
'#d)3
$..!-'+~~'M'MHdHm( 	H !DNN!34	dooy9Ii($//)J'	** 	d]34A!RXr   c                 D   i }| j                  |d       g }g }i }d}g }| j                  |||||       d}|D ]  }	||	_        ||	j                         z   } g }
|D ]#  }	|	j	                         }|
j                  |       % t        j                  t        |      |
|      S )a  The Whole table is represented as a Graph.
        Assemble graph data and call Harfbuzz repacker to pack the table.
        Harfbuzz repacker is faster and retain as much sub-table sharing as possible, see also:
        https://github.com/harfbuzz/harfbuzz/blob/main/docs/repacker.md
        The input format for hb.repack() method is explained here:
        https://github.com/harfbuzz/uharfbuzz/blob/main/src/uharfbuzz/_harfbuzz.pyx#L1149
        Tr  r   )	r  r)  r   r   r  r"  r`   serialize_with_tagr   )r   r;   r  r#  r+  r%  r,  r-  r   r?   rA   	tableDatas               r   r]   z%OTTableWriter.getAllDataUsingHarfbuzz  s     .>$$VXtV]S  	.EEI++--C	.  	#E002IKK	"	# $$S]D(CCr   c                    |ri }| j                  |       g }g }i }| j                  |||       |j                          |j                          d}|D ]  }||_        ||j	                         z   } |D ]  }||_        ||j	                         z   } g }|D ]#  }|j                         }	|j                  |	       % |D ]#  }|j                         }	|j                  |	       % t        |      S )z+Assemble all data, including all subtables.r   )r  r!  r   r   r   r  r"  r   )
r   r\   r  r#  r$  r%  r   r?   rA   r8  s
             r   rd   zOTTableWriter.getAllData  s   Nn-	69d3  	.EEI++--C	.  	.EEI++--C	.  	#EIKK	"	#  	#EIKK	"	# r   c                 `    | j                  | j                  | j                        }| |_        |S r)   )r   r   r;   r   )r   	subwriters     r   getSubWriterzOTTableWriter.getSubWriter  s-    NN4??DMMB	 	 r   c                 h    | j                   j                  t        j                  d| |             y r   r   r"  r   pack)r   r   r+   s      r   
writeValuezOTTableWriter.writeValue  s%    

&++(ne<=r   c                     t        j                   ||      }t        j                  dk7  r|j                          | j                  j                  |j                                y r   )r   r   r   r   r   r"  tobytes)r   r   valuesas       r   
writeArrayzOTTableWriter.writeArray  s?    KK&)==E!JJL

!))+&r   c                     d|cxk  rdk  sJ |        J |       | j                   j                  t        j                  d|             y )Ni   z>br>  r   r+   s     r   	writeInt8zOTTableWriter.writeInt8  sB    u"s")E)")E)"

&++dE23r   c                 (    | j                  d|       y )Nr   rE  r   rC  s     r   writeInt8ArrayzOTTableWriter.writeInt8Array      V$r   c                     d|cxk  rdk  sJ |        J |       | j                   j                  t        j                  d|             y )Ni    z>hr>  rH  s     r   
writeShortzOTTableWriter.writeShort  sB    &&--&--&

&++dE23r   c                 (    | j                  d|       y )Nr   rK  rL  s     r   writeShortArrayzOTTableWriter.writeShortArray  rN  r   c                 b    | j                   j                  t        j                  d|             y )Nz>ir>  rH  s     r   	writeLongzOTTableWriter.writeLong      

&++dE23r   c                 (    | j                  d|       y )Nr{   rK  rL  s     r   writeLongArrayzOTTableWriter.writeLongArray  rN  r   c                     d|cxk  rdk  sJ |        J |       | j                   j                  t        j                  d|             y )Nr      >Br>  rH  s     r   
writeUInt8zOTTableWriter.writeUInt8  sB    EC&&&&

&++dE23r   c                 (    | j                  d|       y )Nr   rK  rL  s     r   writeUInt8ArrayzOTTableWriter.writeUInt8Array  rN  r   c                     d|cxk  rdk  sJ |        J |       | j                   j                  t        j                  d|             y )Nr   i   >Hr>  rH  s     r   writeUShortzOTTableWriter.writeUShort  sB    E#G#*U*#*U*#

&++dE23r   c                 (    | j                  d|       y )Nr   rK  rL  s     r   writeUShortArrayzOTTableWriter.writeUShortArray  rN  r   c                 b    | j                   j                  t        j                  d|             y )N>Ir>  rH  s     r   
writeULongzOTTableWriter.writeULong  rV  r   c                 (    | j                  d|       y )Nr   rK  rL  s     r   writeULongArrayzOTTableWriter.writeULongArray  rN  r   c                     d|cxk  rdk  sJ |        J |       t        j                  d|      }| j                  j                  |dd         y )Nr      z>Lr   r   r?  r   r"  )r   r+   r   s      r   writeUInt24zOTTableWriter.writeUInt24  sM    E%I%,u,%,u,%KKe$

!AB% r   c                 4    |D ]  }| j                  |        y r)   )rl  )r   rC  r+   s      r   writeUInt24ArrayzOTTableWriter.writeUInt24Array  s     	$EU#	$r   c                     t        |      j                         }t        |      dk(  sJ |       | j                  j	                  |       y r   )r   rB  r   r   r"  )r   tags     r   writeTagzOTTableWriter.writeTag  s;    #h 3x1}!c!}

#r   c                 N    | j                   j                  t        ||             y r)   )r   r"  r   r   s      r   writeSubTablezOTTableWriter.writeSubTable
  s    

.J?@r   c                 Z    t        ||||      }| j                  j                  |       |S )N)r   r+   )CountReferencer   r"  )r   r?   rs   r   r+   refs         r   writeCountReferencez!OTTableWriter.writeCountReference  s)    UDt5A

#
r   c                 f    t        j                  |f|z    }| j                  j                  |       y r)   rk  )r   formatrC  rA   s       r   writeStructzOTTableWriter.writeStruct  s)    {{VI./

$r   c                 :    | j                   j                  |       y r)   )r   r"  )r   rA   s     r   	writeDatazOTTableWriter.writeData  s    

$r   c                    d x}x}x}}| j                   dk(  r|j                  }n| j                   dk(  r| j                  }|j                  }n{t        |dd      }t        |d      r|j                  }| j                   dk(  r$| j                  j                  }| j                  }n#| j                   dk(  r7| j                  j                  j                  }| j                  j                  }ndj                  | j                   |g      }| j                  }|rH|j                   d	vr:dj                  |j                   |g      }|j                  }|r|j                   d	vr:|rh|j                   dk(  r7|j                  j                  j                  }|j                  j                  }n"|j                  j                  }|j                  }t        | j                  ||||f      S )
N
LookupListLookuprs   r   repeatIndexSubTableExtSubTable.)r  r  )rs   r  r>   rp   r   joinr   r;   )r   r   r   r   r   r   p1s          r   r  z$OTTableWriter.getOverflowErrorRecord  s   AEEE-E(Y99$"..OYY(""..O ,,MtVX6Ht]+ ,,	yyJ&"&++"9"9 $ 0 0m+"&++"4"4"@"@ $ 7 788TYY$9:[[RWW,GG"xx((;<HB RWW,GG ww-/*,))*:*:*F*F(*		(=(=*,))*?*?(*"]]O]HiP
 	
r   NNFry   )r   N)*r"   r#   r$   rz   r   r   r   r   r   r  r  r   r  r   r  r!  r)  r]   rd   r<  r@  rE  rI  rM  rQ  rS  rU  rX  r\  r^  ra  rc  rf  rh  rl  rn  rq  rs  rw  rz  r|  r  r%   r   r   rN   rN     s    G 
%"

 8  B)
%"N> @7rD<F>'4%4%4%4%4%4%!
$
A
  !
r   rN   c                   *    e Zd ZdZddZd Zd Zd Zy)ru  z8A reference to a Count value, not a count of references.Nc                 V    || _         || _        || _        || j                  |       y y r)   )r?   rs   r   setValue)r   r?   rs   r   r+   s        r   r   zCountReference.__init__@  s.    
		MM%  r   c                 t    | j                   }| j                  }||   |||<   y ||   |k(  sJ |||   |f       y r)   r?   rs   )r   r+   r?   rs   s       r   r  zCountReference.setValueG  sI    

yy;E$K;%'C$dU)CC'r   c                 4    | j                   | j                     S r)   r  r    s    r   getValuezCountReference.getValueO  s    zz$))$$r   c                     | j                   | j                     }|d}t        t        t        d| j
                     |      S )Nr   )r   r   r   )r?   rs   	packUInt8r   r   r   )r   vs     r   r   zCountReference.getCountDataR  s9    JJtyy!9A	:499EaHHr   r  )r"   r#   r$   rz   r   r  r  r   r%   r   r   ru  ru  =  s    B!D%Ir   ru  c                 .    t        j                  d|       S )Nr[  r   r?  r*   s    r   r  r  Y      ;;tU##r   c                 .    t        j                  d|       S )Nr`  r  r*   s    r   r   r   ]  r  r   c                 b    d| cxk  rdk  sJ |         J |        t        j                  d|       S )Nr   l        re  r  r*   s    r   r   r   a  s6    ##*U*#*U*#;;tU##r   c                 h    d| cxk  rdk  sJ |         J |        t        j                  d|       dd  S )Nr   rj  re  r   r  r*   s    r   r  r  f  s=    !	!(5(!(5(!;;tU#AB''r   c                       e Zd ZdZd ZddZd Zed        Zd Z	d Z
dd	Zd
 Zd Zd Zd ZddZd Zd Zd Zd Z G d de      Zdee   fdZd Zy)	BaseTablez0Generic base class for all OpenType (sub)tables.c                     | j                   j                  d      }|r.| `| j                  }| `| j	                  ||       t        | |      S t        |      NrC   )__dict__getrC   rB   r@   r>   AttributeError)r   attrrC   rB   s       r   __getattr__zBaseTable.__getattr__n  sR    ""8,99D	NN64(4&&T""r   c                     | j                   j                  d      }|r"| `| j                  }| `| j	                  ||       |r1| j                         D ]  }|j                  j                  |        y y r  )r  r  rC   rB   r@   iterSubTablesr+   rx   )r   rw   rC   rB   subtables        r   rx   zBaseTable.ensureDecompiledy  sl    ""8,99D	NN64( ..0 9//89 r   c                     d| j                   v r<| j                   j                         }| j                   d   j                         |d<   |S | j                   S r  )r  r   )r   rU   s     r   __getstate__zBaseTable.__getstate__  sL     t}}$MM&&(E"mmH5::<E(OL}}r   c                     d}| j                   D ]l  }|j                  |      }|t        u rt        c S d}|j                  r3|j                  |v r||j                     |j                  z   }nt        c S |||z  z  }n |S )Nr   r   )
convertersgetRecordSizer   repeataux)clsrC   	totalSizeconvr   
countValues         r   r  zBaseTable.getRecordSize  s    	NN 
	+D%%f-D~%%%J{{;;&(!'!4txx!?J))
**I
	+ r   c                     | j                   S r)   )r  r    s    r   getConverterszBaseTable.getConverters  s    r   c                      | j                   |   S r)   )convertersByNamer   s     r   getConverterByNamezBaseTable.getConverterByName  s    $$T**r   Nc                    | j                         D ]3  }|j                  rt        | |j                        st	        | |j                  g        t        t        | |j                              |j                  z
  }	 | j                  |j                        }t	        | |j                  |       |j                  r"t        |j                  d | j                        st        | |j                        rt        |d      rt	        | |j                  d        t        |d      st	        | |j                  |j                         6 y # t        $ r2 |r,|j                  |v r||j                     j                  |       Y rw xY w)NwriteNullOffsetDEFAULT)r  r  rp   rs   setattrr   r>   r  r  KeyErrorr  evalr  r  )r   
propagatorr  r  
count_convs        r   rr   zBaseTable.populateDefaults  s+   &&( 	;D{{tTYY/D$))R0 tyy!9:TXXE
E!%!8!8!EJD$++z: 88D4$G4+4!23D$))T2 4+D$))T\\:1	;   E!dkkZ&?"4;;/88DEs   ;2E		7FFc                    | j                  |       i }|| _        | j                         D ]  }|j                  dk(  r|j	                  |j
                  |d         }|j                  dk(  r|j	                  |j
                  |d         }|j                  dk(  r|j	                  |d         }|j                  dk(  r|j	                  |j
                  |d         }	 |j                  rt        |j                  t              r|j                  }n-|j                  |v r||j                     }n||j                     }||j                  z  }|j                  ||||      ||j                  <   nm|j                  rt        |j                  d |      sh|j                  |||      ||j                  <   |j                  r||j                     ||j                  <    t!        | d	      r| j#                  ||       | `y | j$                  j'                  |       | `y # t        $ r'}|j                  }|j                  |fz   |_         d }~ww xY w)
Nr  
LookupTyper  ExtensionLookupTypeFeatureParams
FeatureTag	SubStruct	MorphTypepostRead)
readFormat_BaseTable__rawTabler  rs   getConverterr;   r  
isinstanceintr  r   r  readisPropagated	Exceptionargsrp   r  r  update)r   rC   rB   r?   r  r  rY   rs   s           r   r@   zBaseTable.decompile  s    &&( 	DyyJ&((%:MNyyM)((%@U:VWyyO+(()=>yyK'((%:LM;;!$++s3%)[[
-%*4;;%7
 &,DKK%8
$((*J'+~~fdE:'VE$))$xxTXXtU(C '+yyu'EE$))$((,1$)),<tyy)3	> 4$MM%& O MM  'O  yy4')s    B4HAH	I&"IIc                    | j                          t        | d      r/t        | d       }| j                  |      }|xr t        | d      }nd}| j                  j	                         }| j                         D ]W  }|j                  s|j                  s|j                  |j                        }t        |t              sI|||j                  <   Y t        | d      rd|_        t        | d      rd|_        t        | j                  d      r(|d   j                  | j                  j                          | j#                  |       | j                         D ]a  }|j                  |j                        }|j$                  r|g }t'        |      |j(                  z
  }t        |j$                  t*              r7t'        |      |j$                  k(  sdJ d	|j$                  t'        |      fz         |j$                  |v rt        ||j$                  |
       n||j$                     j                  |       	 |j-                  ||||       |j                  rt        |t              rB|}	|j2                  |	_        |j7                  |	       |	j9                         ||j                  <   n6|j;                  ||j                  |j2                        }	d ||j                  <   |j                  s|	||j                  <   |j<                  rY|j                  |vrd ||j                  <   |j;                  ||j                  |j2                  ||j                           }	|	|d<   |j(                  rt?        |j(                  d |      s0	 |jA                  ||||       |j                  sS|||j                  <   d |r| `"y y # t.        $ r(}|j0                  |j                  dz   fz   |_         d }~ww xY w# t.        $ r?}||j                  jB                  n|j                  }
|j0                  |
fz   |_         d }~ww xY w)NpreWriteFormatFr  r   r  Tr  zexpected %d values, got %dr*   z[])#rx   rp   r  r  r   r  isCountr  r  rs   r  ru  r  r  r   r  r  writeFormatr  r   r  r  rE  r  r  r   r   r|  r  rw  isLookupTyper  writer"   r  )r   rX   rB   deleteFormatr?   r  r+   r  rY   rv  rs   s              r   rO   zBaseTable.compile  s    4$&tX66LMM$'E'CGD(,CL LMM&&(E &&( 	.D|| 1 1		$)),e^4(-F499%		. 4+,&'F#4%#F4>><0< ))$..*C*CD &&( ?	.DII		E {{=E Z$((2
dkk3/u:4 6RE
V 7 4 [[E)"5$++ZH 4;;'00<OOFD%?  e^4C#CH$$S)'*||~E$))$ 44UDIItWC'+E$))$$$(+F499%"" 99E)'+E$))$00499doouTYY7G (+|$88D4$?JJvtUE:
 $$(-F499%?	.B  [ ! VVtyy4'7&99AFL ! 7<7H5??33diiDVVtg-AFs0   5OO6	O3#O..O36	P>?:P99P>c                      y r)   r%   r   rC   s     r   r  zBaseTable.readFormatM      r   c                      y r)   r%   rg   s     r   r  zBaseTable.writeFormatP  r  r   c                 &   |r|n| j                   j                  }|g }t        | d      r|d| j                  fgz   }|j	                  ||       |j                          | j                  ||       |j                  |       |j                          y )Nr  )r   r"   rp   r  begintagnewlinerm   endtag)r   	xmlWriterrB   rt   rs   	tableNames         r   rn   zBaseTable.toXMLS  s     Ddnn&=&=	=E4"h455E9e,It$#r   c           
         | j                         D ]  }|j                  rMt        | |j                  g       }t	        |      D ]'  \  }}|j                  ||||j                  d|fg       ) \|j                  r!t        |j                  d t        |             st        | |j                  d       }|j                  ||||j                  g         y )Nindex)	r  r  r>   rs   r  xmlWriter  r  vars)r   r  rB   r  r+   r{   r   s          r   rm   zBaseTable.toXML2_  s     &&( 	ED{{dii4(/ TGAtMM)T4gq\NST 88D4d$D$))T iudiiD	Er   c                 8   	 | j                  |      }|j                  |||      }|j                  Dt	        | |j
                  d       }|g }t        | |j
                  |       |j                  |       y t        | |j
                  |       y # t        $ r  w xY wr)   )r  r  xmlReadr  r>   rs   r  r"  )r   rs   rt   ru   rB   r  r+   seqs           r   rq   zBaseTable.fromXMLp  s    	**40D UGT2 ;;"$		40C{dii-JJuD$))U+  		s   B Bc                 >    | j                  |      }|t        u r|S | S r)   r  r  s      r   r  zBaseTable.__ne__  r  r   c                     t        |       t        |      k7  rt        S | j                          |j                          | j                  |j                  k(  S r)   )rb   r   rx   r  r   s     r   r   zBaseTable.__eq__  sC    :e$!! }}..r   c                   :    e Zd ZU dZeed<   ded<   dZee   ed<   y)BaseTable.SubTableEntryzSee BaseTable.iterSubTables()rs   r  r+   Nr  )	r"   r#   r$   rz   r   __annotations__r  r   r  r%   r   r   SubTableEntryr    s    +	#x}#r   r  returnc              #      K    j                         D ]q  }|j                  t         d      }|t        |t              r j                  |       Dt        |t              sU fdt        |      D        E d{    s y7 w)a7  Yield (name, value, index) namedtuples for all subtables of current table.

        A sub-table is an instance of BaseTable (or subclass thereof) that is a child
        of self, the current parent table.
        The tuples also contain the attribute name (str) of the of parent table to get
        a subtable, and optionally, for lists of subtables (i.e. attributes associated
        with a converter that has a 'repeat'), an index into the list containing the
        given subtable value.
        This method can be useful to traverse trees of otTables.
        Nc              3   l   K   | ]+  \  }}t        |t              rj                  ||        - yw))r  N)r  r  r  ).0r{   r  rs   r   s      r   	<genexpr>z*BaseTable.iterSubTables.<locals>.<genexpr>  s9      1!!Y/ &&tQa&8s   14)r  rs   r>   r  r  r  r   r  )r   r  r+   rs   s   `  @r   r  zBaseTable.iterSubTables  s      &&( 	D99DD$-E}%+((u55E4( )% 0  	s   A%B*BB
Bc                 ,    t        | j                        S r)   )getVariableAttrsr   r    s    r   r  zBaseTable.getVariableAttrs  s    //r   r  r)   r  )r"   r#   r$   rz   r  rx   r  classmethodr  r  r  rr   r@   rO   r  r  rn   rm   rq   r  r   r   r  r
   r  r  r%   r   r   r  r  k  s    :	#	9  +;6(TcJ
E",$B/$
 $x6 40r   r  c                   F    e Zd ZdZed        Zd Zd Zd Zd Z	d
dZ
d	 Zy)FormatSwitchingBaseTablezvMinor specialization of BaseTable, for tables that have multiple
    formats, eg. CoverageFormat1 vs. CoverageFormat2.c                     t         S r)   )r   )r  rC   s     r   r  z&FormatSwitchingBaseTable.getRecordSize  s    r   c                     	 | j                   }| j                  j                  | j                   g       S # t        $ r g cY S w xY wr)   )r  r  r  r  )r   fmts     r   r  z&FormatSwitchingBaseTable.getConverters  sE    	++C ""4;;33  	 I	s   4 AAc                 :    | j                   | j                     |   S r)   )r  r  r   s     r   r  z+FormatSwitchingBaseTable.getConverterByName  s    $$T[[1$77r   c                 .    |j                         | _        y r)   )r   r  r  s     r   r  z#FormatSwitchingBaseTable.readFormat  s    '')r   c                 :    |j                  | j                         y r)   )ra  r  rg   s     r   r  z$FormatSwitchingBaseTable.writeFormat  s    4;;'r   Nc                 6    t         j                  | ||||       y r)   )r  rn   )r   r  rB   rt   rs   s        r   rn   zFormatSwitchingBaseTable.toXML  s    iud;r   c                 B    t        | j                  | j                        S r)   )r  r   r  r    s    r   r  z)FormatSwitchingBaseTable.getVariableAttrs  s    <<r   r  )r"   r#   r$   rz   r  r  r  r  r  r  rn   r  r%   r   r   r  r    s9    9  
48*(<=r   r  c                       e Zd Zd Zd Zy)UInt8FormatSwitchingBaseTablec                 .    |j                         | _        y r)   )r   r  r  s     r   r  z(UInt8FormatSwitchingBaseTable.readFormat  s    &&(r   c                 :    |j                  | j                         y r)   )r\  r  rg   s     r   r  z)UInt8FormatSwitchingBaseTable.writeFormat  s    $++&r   N)r"   r#   r$   r  r  r%   r   r   r   r     s    )'r   r   )uint16uint8c                 L    	 t         |    S # t        $ r t        d|       w xY w)NzUnsupported format type: )formatSwitchingBaseTablesr  	TypeError)
formatTypes    r    getFormatSwitchingBaseTableClassr	    s7    D(44 D3J>BCCDs    #r  r  r  c                 r   t        | t              st        |       t        | t              r*|t        d| j                         | j
                  |   }n| j
                  }d|vryi }|j                         D ]  \  }}|j                         }||||<    t        t        ||j                              S )zReturn sequence of variable table field names (can be empty).

    Attributes are deemed "variable" when their otData.py's description contain
    'VarIndexBase + {offset}', e.g. COLRv1 PaintVar* tables.
    z''fmt' is required for format-switching VarIndexBaser%   )key)
issubclassr  r  r  r"   r  r   getVarIndexOffsetr  sortedr   )r  r  r  varAttrsrs   r  r~   s          r   r  r    s     c9%n#/0;Ecll^TUU))#.
))
Z'H &&( $
d'')#HTN$ h&:&:;<<r   ))r   
XPlacementr   r   )r   
YPlacementr   r   )r   XAdvancer   r   )   YAdvancer   r   )   
XPlaDevicer   r   )    
YPlaDevicer   r   )@   
XAdvDevicer   r   )rG  
YAdvDevicer   r   )rZ  	Reserved1r   r   )i   	Reserved2r   r   )i   	Reserved3r   r   )i   	Reserved4r   r   )i   	Reserved5r   r   )i    	Reserved6r   r   )i @  	Reserved7r   r   )rP  	Reserved8r   r   c                  :    i } t         D ]  \  }}}}|||f| |<    | S r)   )valueRecordFormat)dmaskrs   isDevicesigneds        r   
_buildDictr+  &  s4    
A(9 )$dHf&($)Hr   c                   (    e Zd ZdZd Zd Zd Zd Zy)ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 j    g }t         D ]!  \  }}}}||z  s|j                  |||f       # || _        y r)   )r&  r"  ry  )r   valueFormatry  r(  rs   r)  r*  s          r   r   zValueRecordFactory.__init__3  sC    ,= 	8(D$&T!tXv67	8 r   c                 ,    t        | j                        S r)   )r   ry  r    s    r   __len__zValueRecordFactory.__len__:  s    4;;r   c                 0   | j                   }|sy t               }|D ]w  \  }}}|r|j                         }n|j                         }|r?|r;ddlm}	 |j                  |      }
 t        |	|             }|j                  |
|       nd }t        |||       y |S Nr   r8   )
ry  ValueRecordr   r   r<   r9   r   r>   r@   r  )r   rC   rB   ry  valueRecordrs   r)  r*  r+   r9   	subReaders              r   readValueRecordz"ValueRecordFactory.readValueRecord=  s    !m&, 	."D(F((*))+* & 3 3E :I3GHd35EOOIt4 EKu-	. r   c                 *   | j                   D ]  \  }}}t        ||d      }|rJ|r6|j                         }|j                  |d       |j	                  ||       N|j                  d       `|r|j                  |       t|j                  |        y )Nr   r   )r   )ry  r>   r<  rs  rO   ra  rQ  )	r   rX   rB   r5  rs   r)  r*  r+   r   s	            r   writeValueRecordz#ValueRecordFactory.writeValueRecordS  s    &*kk 	*"D(FKq1E & 3 3 5I((q(AMM)T2&&q)!!%(""5)	*r   N)r"   r#   r$   rz   r   r1  r7  r9  r%   r   r   r-  r-  0  s    @ ,*r   r-  c                   :    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	y)r4  Nc                    |gt         D ]  \  }}}}||z  st        | ||rd nd         |=|j                  j                         D ]  \  }}t	        | |      st        | ||       ! y y | |j                  j                         | _        y y Nr   )r&  r  r  r   rp   r   )	r   r/  srcr(  rs   r)  r*  r  vals	            r   r   zValueRecord.__init__f  s    "0A A,dHf%D$a@A  # 2 2 4 ,HC"4- D#s+, 
 _LL--/DM r   c                 f    d}| j                   j                         D ]  }|t        |   d   z  } |S r<  )r  keysvalueRecordFormatDict)r   ry  rs   s      r   	getFormatzValueRecord.getFormats  s=    MM&&( 	=D3D9!<<F	=r   c                 r    d}| j                   j                         D ]  \  }}|s	|t        |   d   z  } |S r<  )r  r   rA  )r   ry  rs   r+   s       r   getEffectiveFormatzValueRecord.getEffectiveFormaty  sH    ==..0 	AKD%"7"=a"@@	A r   c                 8   |g }nt        |      }t        d d D ]1  \  }}}}	t        | |      s|j                  |t	        | |      f       3 g }
t        dd D ]6  \  }}}}	t        | |      st	        | |      }|$|
j                  ||f       8 |
re|j                  ||       |j                          |
D ]  \  }}|	|j                  |||        |j                  |       |j                          y |j                  ||       |j                          y )Nr   r  )rs   )
r   r&  rp   r"  r>   r  r  rn   r  	simpletag)r   r  rB   	valueNamert   simpleItemsr(  rs   r)  ry  deviceItemsdevicedeviceRecords                r   rn   zValueRecord.toXML  s8   =Ku+K,=bq,A 	@(D$&tT"""D'$*=#>?	@ ,=a,B 	7(D$&tT" t,%&&f~6		7
 y+6&1 C"l+ &&y$T&BC Y'	;7r   c                 H   ddl m} |j                         D ]  \  }}t        | |t	        |              |D ]i  }t        |t              s|\  }}} t        ||             }	|D ]-  }
t        |
t              s|
\  }}}|	j                  ||||       / t        | ||	       k y r3  )	r<   r9   r   r  r  r  r  r>   rq   )r   rs   rt   ru   rB   r9   kr  elementr+   elem2name2attrs2content2s                 r   rq   zValueRecord.fromXML  s    KKM 	%DAqD!SV$	% 
	'Ggu-#* D%+GHd+-E  =!%/*/'vxeVXt<	=
 D$&
	'r   c                 >    | j                  |      }|t        u r|S | S r)   r  r  s      r   r  zValueRecord.__ne__  r  r   c                 n    t        |       t        |      k7  rt        S | j                  |j                  k(  S r)   )rb   r   r  r   s     r   r   zValueRecord.__eq__  s+    :e$!!}}..r   r  r)   )
r"   r#   r$   r   rB  rD  rn   rq   r  r   r%   r   r   r4  r4  c  s&    0 4'"B/r   r4  r)   )9fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   r   logging	functoolsr	   typingr
   r   r   r   	getLoggerr"   rJ   rL   	uharfbuzzr`   rM   rI   objectr   r  r'   r1   r6   r   r?  itemsizer=   r   rN   ru  r  r   r   r  r  r  r   r  r	  r  r   r  r&  r+  rA  r-  r4  r%   r   r   <module>r_     s   $ 3 &  
     8 8g!	N  8*,B CD 
& 
0 Y  G *l5| l5` ;6;;sA1$ $$u{{3  A% L'L L%q;F q;h7V 7u
F u
pIV I8$$$
(
F0 F0R
!=y !=H'$< ' '* D =) =(3- =5: = =B , # 0* 0*fO/& O/a*  		s   E1 1E:9E: