
    Mcgk              	          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 e eed
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
jH                  dd             dk(  sJ  e	j                  d      jJ                  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/      Z0e/e0d)Z1d* Z2 e       d5d+e.d,ee3   d-ee4   fd.       Z5g d/Z6d0 Z7 e7       Z8 G d1 d2e      Z9 G d3 d4e      Z:y# e$ r Y !w xY w)6    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFrepackz: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     X/var/www/html/bid-api/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__5   s	    (
r   c                 ,    t        | j                        S r*   )reprr,   r!   s    r   __str__zOTLOffsetOverflowError.__str__8   s    DJJr   N)r#   r$   r%   r   r0   r&   r   r   r(   r(   4   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   r2   r2   <   s     G E Kr   r2   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) r:   OTTableReaderr<   getattrtable	decompile)r   datafontr:   reader
tableClasss         r   rA   zBaseTTXConverter.decompileW   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ImportErrorr2   r4   r3   OTTableWriterr@   compiletryPackingHarfbuzztryPackingFontToolsr5   r(   tryResolveOverflowr,   )
r   rC   overflowRecorduse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereoks
             r   rP   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)rK   rL   r<   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper#   r    warning
getAllData)r   rY   rW   rZ   	error_msgs        r   rQ   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*   )re   r   rY   s     r   rR   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,   rK   infor   r:   rj   rk   )r   rC   rZ   rX   r[   rT   rj   rk   s           r   rS   z#BaseTTXConverter.tryResolveOverflow   st    (I>B""*4#D.9B6%dN;BI
 	1!$77r   c                 <    | j                   j                  ||       y r*   )r@   toXML2)r   rY   rC   s      r   toXMLzBaseTTXConverter.toXML   s    

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

46

##%r   c                 <    | j                   j                  |       y )N)recurse)r@   ensureDecompiled)r   rx   s     r   ry   z!BaseTTXConverter.ensureDecompiled   s    

##G#4r   NT)r#   r$   r%   __doc__rA   rP   rQ   rR   rS   ro   rr   ry   r&   r   r   r7   r7   Q   s1    
+Yv=,#88(&5r   r7   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.rB   offsetpos
localStater<   Nc                 J    || _         || _        || _        || _        || _        y r*   r~   )r   rB   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__rB   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   rB   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unpackrB   )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   arrayrB   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.readInt80      ~~ca~00r   c                 *    | j                  dd|      S )Nr   r   r   r   r   r   s     r   readInt8ArrayzOTTableReader.readInt8Array3      ~~cau~==r   c                 (    | j                  dd      S )Nhr   r   r   r!   s    r   	readShortzOTTableReader.readShort6  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readShortArrayzOTTableReader.readShortArray9  r   r   c                 (    | j                  dd      S )Nr|   r   r   r   r!   s    r   readLongzOTTableReader.readLong<  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.readUInt8B  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readUInt8ArrayzOTTableReader.readUInt8ArrayE  r   r   c                 (    | j                  dd      S )NHr   r   r   r!   s    r   
readUShortzOTTableReader.readUShortH  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readUShortArrayzOTTableReader.readUShortArrayK  r   r   c                 (    | j                  dd      S )NIr   r   r   r!   s    r   	readULongzOTTableReader.readULongN  r   r   c                 *    | j                  dd|      S )Nr   r   r   r   r   s     r   readULongArrayzOTTableReader.readULongArrayQ  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.readUInt24T  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.readUInt24Array[  s%    +0<8<a!<888s   (c                     | j                   }|dz   }t        | j                  ||       }t        |      dk(  sJ |       || _         |S Nr   )r   r   rB   lenr   s       r   readTagzOTTableReader.readTag^  sJ    hhqDIIc&)*5zQ%%r   c                 T    | j                   }||z   }| j                  || }|| _         |S r*   )r   rB   )r   r   r   r   r,   s        r   readDatazOTTableReader.readDataf  s0    hhu		#f%r   c                 |    | j                   r| j                   j                         n	t               }|||<   || _         y r*   r   r   dictr   rt   r,   rV   s       r   __setitem__zOTTableReader.__setitem__m  .    *.//$$&tvdr   c                 <    | j                   xr | j                   |   S r*   r   r   rt   s     r   __getitem__zOTTableReader.__getitem__r  s    84??4#88r   c                 :    | j                   xr || j                   v S r*   r   r   s     r   __contains__zOTTableReader.__contains__u  s    :44??#::r   )Nr   N)r#   r$   r%   r{   	__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__z  s    "$r   c                     t        |       t        |      k7  rt        S | j                  |j                  k(  xr | j                  |j                  k(  S r*   )rc   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   y  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)-rO   z=Helper class to gather and assemble data for OpenType tables.Nc                 J    g | _         d | _        || _        || _        d | _        y r*   )itemsr   r   r<   parent)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   rq   sizer   r   )r   litems      r   getDataLengthzOTTableWriter.getDataLength  sX    JJD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   rq   r   	packULongr   
packUShortr   errorgetOverflowErrorRecordr(   
packUInt24r_   r   )r   r   r   numItemsr|   r   r-   s          r   getDatazOTTableWriter.getData  s   TZZ hhu:xA8Dt[)??a'(););c)ABE!H__)J#-dnn.@.@3.F#Ga __))$..*<*<s*BCE!H$T__55' !*  "<< 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   	enumeraterq   r   r_   r   )r   r   	packFuncsr|   r   s        r   getDataForHarfbuzzz OTTableWriter.getDataForHarfbuzz  sz    TZZ "zi@	 'GAtt[)??i/9y9!<E!H$T__55 ( 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*   )rc   r   r   r   s     r   r   zOTTableWriter.__eq__  s+    :e$!!zzU[[((r   c                    t        | d      }t        | d      }|r|si }| j                  }t        t        |            D ]  }||   }t        |d      r|j	                         ||<   (t        |d      s5|j
                  j                  ||       |rU|j                  |j
                  |j
                        ||   _         t        |      | _        y )N	Extension	DontSharer   r   shareExtension)	rq   r   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesr  isExtension	dontSharer   r|   r   s           r   r  zOTTableWriter._doneWriting  s     dK0 D+.	~N

s5z"A8D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   rt   Coverager   )idr   r   r   r   reverserq   r?   r   _gatherTablesappend)r   tables	extTablesdoner  iRanger  
selfTablesr  r|   r   s              r   r!  zOTTableWriter._gatherTables
  sy    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  rt   r  Tr   r   r   )r"  rq   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._gatherGraphForHarfbuzzJ  s   
 !C  !Q- ! !4+,$TZZ044.*<'+$$xt+262N2N"HdHm3 x (,BtH~!((6 1 	
 ,GAtt[) ~.dii'
'#d)3
$..!-'+~~'M'MHdHm( 	H !DNN!34	dooy9Ii($//)J' -* 	d]34A!RXr   c                    i }| j                  |d       g }g }i }d}g }| j                  |||||       d}|D ]  }	||	_        ||	j                         z   } g }
|D ]#  }	|	j	                         }|
j                  |       % t        t        d      r t        j                  t        |      |
|      S t        j                  |
|      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   repack_with_tag)r  r)  r   r   r  r"  rq   ra   r7  r    r   )r   r<   r  r#  r+  r%  r,  r-  r   r@   rB   	tableDatas               r   r^   z%OTTableWriter.getAllDataUsingHarfbuzz  s     .>$$VXtV]S EEI++--C  E002IKK	"  2()%%c(mT8DD99T8,,r   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@   rB   r8  s
             r   re   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@   rt   r   r,   refs         r   writeCountReferencez!OTTableWriter.writeCountReference  s)    UDt5A

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

$r   c                 :    | j                   j                  |       y r*   )r   r"  )r   rB   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Lookuprt   z<none>repeatIndexSubTableExtSubTable.)r  r  )rt   r  r?   rq   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Frz   )r   N)*r#   r$   r%   r{   r   r   r   r   r   r  r  r   r  r   r  r!  r)  r^   re   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   rO   rO     s    G 
%"

 8  B)
&"P> @7r-BF>'4%4%4%4%4%4%!
$
A
  !
r   rO   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@   rt   r   setValue)r   r@   rt   r   r,   s        r   r   zCountReference.__init__F  s.    
		MM%  r   c                 t    | j                   }| j                  }||   |||<   y ||   |k(  sJ |||   |f       y r*   r@   rt   )r   r,   r@   rt   s       r   r  zCountReference.setValueM  sI    

yy;E$K;%'C$dU)CC'r   c                 4    | j                   | j                     S r*   r  r!   s    r   getValuezCountReference.getValueU  s    zz$))$$r   c                     | j                   | j                     }|d}t        t        t        d| j
                     |      S )Nr   )r   r   r   )r@   rt   	packUInt8r   r   r   )r   vs     r   r   zCountReference.getCountDataX  s9    JJtyy!9A	:499EaHHr   r  )r#   r$   r%   r{   r   r  r  r   r&   r   r   ru  ru  C  s    B!D%Ir   ru  c                 .    t        j                  d|       S )Nr[  r   r?  r+   s    r   r  r  _      ;;tU##r   c                 .    t        j                  d|       S )Nr`  r  r+   s    r   r   r   c  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   g  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  l  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        |      NrD   )__dict__getrD   rC   rA   r?   AttributeError)r   attrrD   rC   s       r   __getattr__zBaseTable.__getattr__t  sR    ""8,99D	NN64(4&&T""r   c                     | j                   j                  d      }|r"| `| j                  }| `| j	                  ||       |r1| j                         D ]  }|j                  j                  |        y y r  )r  r  rD   rC   rA   iterSubTablesr,   ry   )r   rx   rD   rC   subtables        r   ry   zBaseTable.ensureDecompiled  sg    ""8,99D	NN64( ..0//8 1 r   c                     d| j                   v r<| j                   j                         }| j                   d   j                         |d<   |S | j                   S r  )r  r   )r   rV   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)clsrD   	totalSizeconvr   
countValues         r   r  zBaseTable.getRecordSize  s    	NND%%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  rq   rt   setattrr   r?   r  r  KeyErrorr  evalr  r  )r   
propagatorr  r  
count_convs        r   rs   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  rt   getConverterr<   r  
isinstanceintr  r   r  readisPropagated	Exceptionargsrq   r  r  update)r   rD   rC   r@   r  r  rZ   rt   s           r   rA   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[])#ry   rq   r  r  r   r  isCountr  r  rt   r  ru  r  r  r   r  r  writeFormatr  r   r  r  rE  r  r  r   r   r|  r  rw  isLookupTyper  writer#   r  )r   rY   rC   deleteFormatr@   r  r,   r  rZ   rv  rt   s              r   rP   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   rD   s     r   r  zBaseTable.readFormatS      r   c                      y r*   r&   rh   s     r   r  zBaseTable.writeFormatV  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#   rq   r  begintagnewlinern   endtag)r   	xmlWriterrC   ru   rt   	tableNames         r   ro   zBaseTable.toXMLY  s     Ddnn&=&=	=E4"h455E9e,It$#r   c           
         | j                         D ]  }|j                  rXt        | |j                  g       }t	        t        |            D ])  }||   }|j                  ||||j                  d|fg       + g|j                  r!t        |j                  d t        |             st        | |j                  d       }|j                  ||||j                  g         y )Nindex)
r  r  r?   rt   r   r   xmlWriter  r  vars)r   r  rC   r  r,   r|   r   s          r   rn   zBaseTable.toXML2e  s     &&(D{{dii4s5z*A 8DMM)T4gq\NS + 88D4d$D$))T iudiiD )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?   rt   r  r"  )r   rt   ru   rv   rC   r  r,   seqs           r   rr   zBaseTable.fromXMLw  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*   )rc   r   ry   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()rt   r  r,   Nr  )	r#   r$   r%   r{   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  rt   r   s      r   	<genexpr>z*BaseTable.iterSubTables.<locals>.<genexpr>  s9       01!!Y/ &&tQa&8 0s   14)r  rt   r?   r  r  r  r   r  )r   r  r,   rt   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%   r{   r  ry   r  classmethodr  r  r  rs   rA   rP   r  r  ro   rn   rr   r  r   r   r  r
   r  r  r&   r   r   r  r  q  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  rD   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  rh   s     r   r  z$FormatSwitchingBaseTable.writeFormat  s    4;;'r   Nc                 6    t         j                  | ||||       y r*   )r  ro   )r   r  rC   ru   rt   s        r   ro   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%   r{   r  r  r  r  r  r  ro   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  rh   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  varAttrsrt   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maskrt   isDevicesigneds        r   
_buildDictr+  -  s/    
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(  rt   r)  r*  s          r   r   zValueRecordFactory.__init__:  s>    ,=(D$&T!tXv67 -> r   c                 ,    t        | j                        S r*   )r   ry  r!   s    r   __len__zValueRecordFactory.__len__A  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   r9   )
ry  ValueRecordr   r   r=   r:   r   r?   rA   r  )r   rD   rC   ry  valueRecordrt   r)  r*  r,   r:   	subReaders              r   readValueRecordz"ValueRecordFactory.readValueRecordD  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  rP   ra  rQ  )	r   rY   rC   r5  rt   r)  r*  r,   r   s	            r   writeValueRecordz#ValueRecordFactory.writeValueRecordZ  s    &*kk"D(FKq1E & 3 3 5I((q(AMM)T2&&q)!!%(""5) '2r   N)r#   r$   r%   r{   r   r1  r7  r9  r&   r   r   r-  r-  7  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   rq   r   )	r   r/  srcr(  rt   r)  r*  r  vals	            r   r   zValueRecord.__init__m  s    "0A,dHf%D$a@ 1B  # 2 2 4HC"4- D#s+ !5 
 _LL--/DM r   c                 f    d}| j                   j                         D ]  }|t        |   d   z  } |S r<  )r  keysvalueRecordFormatDict)r   ry  rt   s      r   	getFormatzValueRecord.getFormatz  s8    MM&&(D3D9!<<F )r   c                 r    d}| j                   j                         D ]  \  }}|s	|t        |   d   z  } |S r<  )r  r   rA  )r   ry  rt   r,   s       r   getEffectiveFormatzValueRecord.getEffectiveFormat  sA    ==..0KD%"7"=a"@@ 1 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  )rt   )
r   r&  rq   r"  r?   r  r  ro   r  	simpletag)r   r  rC   	valueNameru   simpleItemsr(  rt   r)  ry  deviceItemsdevicedeviceRecords                r   ro   zValueRecord.toXML  s'   =Ku+K,=bq,A(D$&tT"""D'$*=#>? -B ,=a,B(D$&tT" t,%&&f~6	 -C
 y+6&1"l+ &&y$T&B '2 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=   r:   r   r  r  r  r  r?   rr   )r   rt   ru   rv   rC   r:   kr  elementr,   elem2name2attrs2content2s                 r   rr   zValueRecord.fromXML  s    KKMDAq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*   )rc   r   r  r   s     r   r   zValueRecord.__eq__  s+    :e$!!}}..r   r  r*   )
r#   r$   r%   r   rB  rD  ro   rr   r  r   r&   r   r   r4  r4  j  s&    0 4'"B/r   r4  r*   );fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   r   logging	functoolsr	   typingr
   r   r   r   	getLoggerr#   rK   rM   	uharfbuzzra   callabler?   rN   rJ   objectr   r  r(   r2   r7   r   r?  itemsizer>   r   rO   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!	
 gb(D9: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x
F x
vIV I8$$$
(
G0 G0T
!=y !=H'$< ' '* D =) =(3- =5: = =B , # 0* 0*fO/& O/i*  		s   E? ?FF