
    +gN                    	   d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlZddlZddlZej6                  dz
  Z ej8                  e      ZdZdZ  G d de!      Z" G d de!      Z#d Z$ G d de!      Z% G d de%      Z& G d de%      Z' G d de%      Z( G d de%      Z) G d de)      Z* G d  d!e)      Z+ G d" d#e!      Z, G d$ d%e,      Z- G d& d'e-      Z. G d( d)e,      Z/ G d* d+e,      Z0 G d, d-e!      Z1 G d. d/e!      Z2 G d0 d1e!      Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZA G d@ dAe!      ZB G dB dCeB      ZC G dD dEeB      ZDdF ZEdG ZF G dH dIeB      ZG G dJ dKeB      ZH G dL dMeB      ZI G dN dOeI      ZJ G dP dQeI      ZK G dR dSeI      ZL G dT dUeB      ZM G dV dWe!      ZNdX ZOdY ZPdZ ZQd[ ZRd\ ZSd] ZTd^ ZU G d_ d`e!      ZV G da dbeB      ZWdc ZXdd ZYde ZZdf Z[ G dg dheI      Z\ G di djeB      Z] G dk dleB      Z^dm Z_dn Z`do Za G dp dqe!      Zb G dr dse!      Zc G dt dueB      Zdg dvdwdxdyd ed       fdzd{dd|d}d eD       fd~dd}d eD       fddd}d eD       fddd}d eD       fddd}d eD       fddddddddddg ddfddddg ddfddddddddddddd eM       fddddd eW       fdddd eJ       fdd/dd e]       fdddd e\       fdd1dd eL       fdddd e^       fZedvdddg ddfdd/dd e]       fdddd e\       fdd1dd eL       fdddd e^       fgZfdZgdZhdehegdddfddddddddddddddddddddddd eK       fgZidehegdddfddddddddddddddddd eK       fgZjdƄ Zk ekei        ekee        G dǄ dej                        Zm G dɄ dej                        Zn G d˄ de!      Zod̈́ Zp G d΄ deo      Zq G dЄ deo      Zr G d҄ deo      Zs G dԄ de!      Zt G dք det      Zu G d؄ det      Zv G dڄ det      Zw G d܄ de!      Zxg dޢZydZz e{ey      ezk(  sJ i Z| e}ez      D ]
  Z~e~e|eye~   <    g dZdZ e{e      ek(  sJ g dZdZ e{e      ek(  sJ g dZdZ e{e      ek(  sJ y)a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines embed a completely independent
font file in Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   d    e Zd ZdZddZd Zd Zd Zd ZddZ	d	 Z
dd
Zd Zd Zd Zd Zd Zy)
CFFFontSetan  A CFF font "file" can contain more than one font, although this is
    extremely rare (and not allowed within OpenType fonts).

    This class is the entry point for parsing a CFF table. To actually
    manipulate the data inside the CFF font, you will want to access the
    ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
    object can either be treated as a dictionary (with appropriate
    ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
    objects, or as a list.

    .. code:: python

            from fontTools import ttLib
            tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
            tt["CFF "].cff
            # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
            tt["CFF "].cff[0] # Here's your actual font data
            # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

    Nc                    || _         t        j                  t        |j	                  d      |        |/|rdnd}| j
                  |k7  r>t        d|| j
                  fz        | j
                  dv sJ d       | j
                  dk(  }|st        j                  d|j	                  d            d	   | _        |j                  | j                         t        d
 t        ||      D              | _        t        ||      | _        t!        |      | _        nt        j                  d|j	                  d            d	   | _        |j                  | j                         dg| _        |j&                  }t        ||| j$                  |      | _        d| _        t)        ||      | _        | j"                  | j                  _        | j*                  | j                  _        y)a  Parse a binary CFF file into an internal representation. ``file``
        should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
           N   r   2Invalid CFF 'major' version: expected %d, found %dr   r   Unknown CFF formatBr   c              3   2   K   | ]  }t        |        y wNr   ).0ss     q/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/cffLib/__init__.py	<genexpr>z'CFFFontSet.decompile.<locals>.<genexpr>b   s     !Oq%(!Os   isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorstructoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)selffiler'   r$   expected_majorcff2GetGlyphOrders         r!   	decompilezCFFFontSet.decompileF   s    		!d; #)QaNzz^+ H%tzz23  ::'=)=='ZZ1_F!==diil;A>DLIIdll#!!OE$v4N!OODN ,T& AD)$/DL%}}T499Q<@CDIIdll#(\DN & 4 4 ,')9)9&!D  DL+D@$(LL!(,(8(8%    c                 ,    t        | j                        S r   )lenr3   r<   s    r!   __len__zCFFFontSet.__len__s   s    4>>""rA   c                 ,    t        | j                        S r   )r1   r3   rD   s    r!   keyszCFFFontSet.keysv   s    DNN##rA   c                     | j                   S r   )r5   rD   s    r!   valueszCFFFontSet.valuesy   s       rA   c                     t        |d      r|j                         }n:t        |t              r|}	 | j                  j                  |      }nt        |      | j                  |   S # t        $ r t        |      w xY w)z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        	__index__)
hasattrrK   
isinstancestrr3   indexr,   KeyError	TypeErrorr5   )r<   nameOrIndexrO   names       r!   __getitem__zCFFFontSet.__getitem__|   s~     ;,))+ES)D,,,T2 K((  ''	  ,{++,s   A' 'A<c                    || _         |/|rdnd}| j                  |k7  r>t        d|| j                  fz        | j                  dv sJ d       | j                  dk(  }|j                  r#|s!| j                  D ]  }|j                           |st               }nd}t        |      }| j                  j                  || |      }|rud| _	        |j                  t        j                  t        |              |j                         | _        |j                  t!        j                  d	| j                               nfd
| _	        d
| _        |j                  t        j                  t        |              |j                  t!        j                  d| j"                               |sOt%               }	| j&                  D ]  }
|	j)                  |
        |j                  |	j                  || |             |j                  |       |s|j                  |j                                |j                  | j*                  j                  || |             | j                  D ]2  }t-        |d      r|j.                  |j1                         }||_        4 |j3                  |      }|D ]  }|j                  |        |j5                  |       y)a  Write the object back into binary representation onto the given file.
        ``file`` should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        Nr   r   r   r   r   r#      r%      r   charset)r'   r+   r,   recalcBBoxesr5   recalcFontBBoxr6   	CFFWritergetCompilerr0   addr   packr)   getDataLengthr8   r-   r.   r2   r3   appendr;   rL   rX   r9   getChildrentoFile)r<   r=   r'   r$   r>   topDictr7   writertopCompilerr3   rS   rX   childrenchilds                 r!   compilezCFFFontSet.compile   sk    "(QaNzz^+ H%tzz23  ::'=)=='ZZ1_Fv,, )&&() $&GG6"''33GT&3QDLJJw||OT:;*88:DJJv{{4)9)9:;DLDLJJw||OT:;JJv{{356I '  &'JJy,,Wd6,JK

;JJw**,-

4##//f/MN(( 	*G7I.'//2I ..0")	* **73 	EJJu	 	drA   c                 z   |j                  d| j                         |j                          |j                  d| j                         |j                          | j                  D ]e  }|j                  dt        |             |j                          | |   }|j                  |       |j                  d       |j                          g |j                          |j                  d       |j                          | j                  j                  |       |j                  d       |j                          y)zWrite the object into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff.toXML(writer)

        r+   valueminorCFFFontrS   r;   N)
	simpletagr+   newlinerl   r3   begintagr   toXMLendtagr;   )r<   	xmlWriterfontNamefonts       r!   rr   zCFFFontSet.toXML   s    	G4::6G4::6 	 HyuX?>DJJy!Y'	  	=)y)'rA   c                    || _         t        | d      sd| _        t        | d      sd| _        |dk(  r| j                  dk(  rt        | d      sd| _        t        | d      sd| _        t        | d	      st               | _        t        | d
      sg | _        t               | _
        |d   }| j                  j                  |       t        | j                        }d|_        n| j                  dk(  rt        | d      sd| _        t        | d	      st               | _        t        | d
      sdg| _        | j                   j                  }t        | j                  |      }t        d|      | _
        | j                  j                         |D ],  }t        |t               r|\  }}}|j#                  |||       . t        |d      rV|j$                  d   j&                  <|j$                  }	|	D ]*  }
t        |
d      s|j(                  |
j*                  _        , yyy|d	k(  rt,        j.                  }t        | d	      st               | _        |D ]N  }t        |t               r|\  }}} |       }|j#                  |||       | j                  j                  |       P y|dk(  rt1        |d         | _        y|dk(  rt1        |d         | _        yy)z?Reads data from the XML element into the ``CFFFontSet`` object.r+   r   rl   r   rm   r.   rW   r0   r;   r3   rS   )r;   Nr   rV   r&   )r;   r?   VarStorePrivaterk   )r'   rL   r+   rl   r.   r0   r:   r;   r3   r4   r5   r`   TopDictrX   r9   rM   rN   fromXMLFDArrayvstorerx   ry   r   T2CharStringint)r<   rS   attrscontentr'   ru   rc   r?   elementfdArrayfontDictsubrCharStringClasssubrs                r!   r{   zCFFFontSet.fromXML   s    tW%DJtW%DJ9zzQtY/#$DLtY/#$DLt]3'7'9D$t[1%'DN(4D% =%%h/!d.>.>?"&qtY/#$DLt]3'7'9D$t[1&0\DN$(KK$=$=!! $ 0 0DU %17H$I!$$W-" 6gs+'.$eWeW5	6 w
+0B0I0I0Q!// ' CHx3292B2B((/C 1R+ ]""/"<"<4/#3#5 " .gs+'.$eW*,T5'2  ''-. W_U7^,DJW_U7^,DJ rA   c                 "    ddl m}  || |       y )Nr   )_convertCFFToCFF2)	CFFToCFF2r   )r<   r'   r   s      r!   convertCFFToCFF2zCFFFontSet.convertCFFToCFF2-      0$'rA   c                 "    ddl m}  || |       y )Nr   )_convertCFF2ToCFF)	CFF2ToCFFr   )r<   r'   r   s      r!   convertCFF2ToCFFzCFFFontSet.convertCFF2ToCFF2  r   rA   c                      ddl m}  ||        y )Nr   )desubroutinize)
transformsr   )r<   r   s     r!   r   zCFFFontSet.desubroutinize7  s    .trA   c                      ddl m}  ||        y )Nr   )remove_hints)r   r   )r<   r   s     r!   r   zCFFFontSet.remove_hints<  s    ,TrA   c                      ddl m}  ||        y )Nr   )remove_unused_subroutines)r   r   )r<   r   s     r!   r   z$CFFFontSet.remove_unused_subroutinesA  s    9!$'rA   r   )__name__
__module____qualname____doc__r@   rE   rG   rI   rT   rh   rr   r{   r   r   r   r   r    rA   r!   r   r   0   sL    *+9Z#$!( >@:B-H(
(


(rA   r   c                   "    e Zd ZdZd Zd Zd Zy)r[   zXHelper class for serializing CFF data to binary. Used by
    :meth:`CFFFontSet.compile`.c                      g | _         || _        y r   )datar$   r<   r$   s     r!   __init__zCFFWriter.__init__K  s    	rA   c                 :    | j                   j                  |       y r   )r   r`   )r<   tables     r!   r]   zCFFWriter.addO  s    		rA   c                    d }d}	 t         j                  t        d|       |dz   }d}|g}| j                  D ]  }t        |d      rE||j	                         z   }t        |t              r0|j                  r$|j	                         | _        n|t        |      z   }t        |d      r|j                  ||       |}|j                  |        ||k(  rn|}t         j                  t        d       |j                         }| j                  r.t        j                  d| j                        | j                  d<   n@t        |d         | _        t        j                  d	| j                         | j                  d<   dg}| j                  D ]S  }t        |d
      r|j#                  |       n|j%                  |       |j                  |j                         |z
         U ||k(  sJ y )Nr   z CFFWriter.toFile() iteration: %dr   r_   setPosz#CFFWriter.toFile() writing to file.r%   r   rb   )logDEBUGr   rL   r_   rM   TopDictIndexCompilerr$   r8   rC   r   r`   tellr-   r^   calcOffSizer.   rb   write)	r<   r=   lastPosListcountposposListitemendPosbegins	            r!   rb   zCFFWriter.toFileR  s   GGE=uEAIECeG		 
$41 4#5#5#77F!$(<=$+++/+=+=+?( 3t9_F4*KKV,s#
$ +%!K% & 	<=		;;!;;tT-=-=>DIIaL&{27DL!;;sDLL9DIIaL#II 	0DtX&D!

4 NN499;./	0 +%%%rA   N)r   r   r   r   r   r]   rb   r   rA   r!   r[   r[   G  s    # $&rA   r[   c                 @    | dk  rd}|S | dk  rd}|S | dk  rd}|S d}|S )N   r   i   r   i   r   rW   r   )largestOffsetr.   s     r!   r   r   y  sN    u N 
	 
 N	 
	" N NrA   c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	IndexCompilerzBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
    to binary.Nc                     |t        |d      r|j                  }|J || _        | j                  ||      | _        || _        y Nr$   )rL   r$   getItemsitemsparent)r<   r   r7   r   r$   s        r!   r   zIndexCompiler.__init__  sE    >gfh7]]F%%%]]5'2
rA   c                     |S r   r   r<   r   r7   s      r!   r   zIndexCompiler.getItems      rA   c                     | j                   rWd}|g}| j                   D ]A  }t        |d      r||j                         z   }n|t        |      z   }|j	                  |       C |S g }|S )Nr   r_   )r   rL   r_   rC   r`   )r<   r   offsetsr   s       r!   
getOffsetszIndexCompiler.getOffsets  sq    ::CeG

 $41 2 2 44CD	/Cs#$  GrA   c                     | j                   rd}nd}| j                  rG| j                         d   }t        |      }|dz   t	        | j                        dz   |z  z   |z   dz
  }|S |}|S )NrW   r   r   r   )r$   r   r   r   rC   )r<   	countSize
lastOffsetr.   
dataLengths        r!   r_   zIndexCompiler.getDataLength  s    ;;II::*2.J!*-Gtzz?Q&'12  	   #JrA   c                 2   | j                         }| j                  r t        |t        | j                               nt        |t        | j                               | j                  rt        |d         }t        ||       | }t        j                  }|D ]0  } |d|      |d  }t        |      | k(  sJ |j                  |       2 | j                  D ]>  }t        |d      r|j                  |       !t        |d      }|j                  |       @ y y )Nr   >lrb   latin1encoding)r   r$   writeCard32rC   r   writeCard16r   
writeCard8r-   r^   r   rL   rb   r
   )	r<   r=   r   r.   r^   offset	binOffsetr   r   s	            r!   rb   zIndexCompiler.toFile  s    //#;;c$**o.c$**o.::!'"+.GtW%hG;;D! & v.wx8	9~'111

9%& 

 %4*KK%"4(;DJJt$% rA   r   )	r   r   r   r   r   r   r   r_   rb   r   rA   r!   r   r     s     ,%rA   r   c                       e Zd Zd Zy)IndexedStringsCompilerc                     |j                   S r   r7   r   s      r!   r   zIndexedStringsCompiler.getItems  s    }}rA   N)r   r   r   r   r   rA   r!   r   r     s    rA   r   c                   B     e Zd ZdZd Zd Z fdZ fdZ fdZ xZ	S )r   z/Helper class for writing the TopDict to binary.c                 Z    g }|D ]#  }|j                  |j                  ||              % |S r   r`   r\   r<   r   r7   outr   s        r!   r   zTopDictIndexCompiler.getItems  4     	8DJJt''67	8
rA   c                 l    g }| j                   D ]"  }|j                  |j                  |             $ |S r   r   extendra   )r<   r7   rf   rc   s       r!   ra   z TopDictIndexCompiler.getChildren  s6    zz 	:GOOG//89	:rA   c                     | j                   r!d| j                  d   j                         g}|S t        t        |          S Nr   )r$   r   r_   superr   r   )r<   r   	__class__s     r!   r   zTopDictIndexCompiler.getOffsets  s;    ;;$**Q-5578GN-t?AArA   c                 ~    | j                   r| j                  d   j                         }|S t        t        |          S r   )r$   r   r_   r   r   )r<   r   r   s     r!   r_   z"TopDictIndexCompiler.getDataLength  s7    ;;A446J-tBDDrA   c                     | j                   r| j                  d   j                  |       y t        t        |   |       y r   )r$   r   rb   r   r   )r<   r=   r   s     r!   rb   zTopDictIndexCompiler.toFile  s0    ;;JJqM  &&4T:rA   )
r   r   r   r   r   ra   r   r_   rb   __classcell__r   s   @r!   r   r     s&    9BE; ;rA   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)FDArrayIndexCompilerzHelper class for writing the
    `Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
    to binary.c                 Z    g }|D ]#  }|j                  |j                  ||              % |S r   r   r   s        r!   r   zFDArrayIndexCompiler.getItems  r   rA   c                 l    g }| j                   D ]"  }|j                  |j                  |             $ |S r   r   )r<   r7   rf   r   s       r!   ra   z FDArrayIndexCompiler.getChildren  s6    

 	;HOOH009:	;rA   c                    | j                         }| j                  r t        |t        | j                               nt        |t        | j                               t        |d         }t        ||       | }t        j                  }|D ]0  } |d|      |d  }t        |      | k(  sJ |j                  |       2 | j                  D ]1  }t        |d      r|j                  |       !|j                  |       3 y )Nr   r   rb   )r   r$   r   rC   r   r   r   r   r-   r^   r   rL   rb   )r<   r=   r   r.   r^   r   r   r   s           r!   rb   zFDArrayIndexCompiler.toFile  s    //#;;c$**o.c$**o.gbk*4!({{ 	"FT6*784Iy>gX---JJy!	" JJ 	!DtX&D!

4 		!rA   c                 6    || j                   j                  d<   y )Nr|   r   rawDictr<   r   r   s      r!   r   zFDArrayIndexCompiler.setPos      ),I&rA   N)r   r   r   r   r   ra   rb   r   r   rA   r!   r   r     s    !(-rA   r   c                       e Zd ZdZd Zy)GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                     g }|D ]8  }|j                  | j                         |j                  |j                         : |S r   rh   r$   r`   bytecoder<   r   r7   r   css        r!   r   zGlobalSubrsCompiler.getItems'  =     	$BJJt{{#JJr{{#	$ 
rA   N)r   r   r   r   r   r   rA   r!   r   r   #  s    rA   r   c                       e Zd ZdZd Zy)SubrsCompilerzHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 h    || j                   j                  z
  }|| j                   j                  d<   y NSubrs)r   r   r   )r<   r   r   r   s       r!   r   zSubrsCompiler.setPos3  s(    t{{&'-G$rA   N)r   r   r   r   r   r   rA   r!   r   r   /  s    .rA   r   c                       e Zd ZdZd Zd Zy)CharStringsCompilerzHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                     g }|D ]8  }|j                  | j                         |j                  |j                         : |S r   r   r   s        r!   r   zCharStringsCompiler.getItems<  r   rA   c                 6    || j                   j                  d<   y NCharStringsr   r   s      r!   r   zCharStringsCompiler.setPosC  s    -0M*rA   N)r   r   r   r   r   r   r   rA   r!   r   r   8  s    1rA   r   c                   H    e Zd ZdZeZddZd Zd Zd Z	d Z
d Zdd	Zd
 Zy)r2   zThis class represents what the CFF spec calls an INDEX (an array of
    variable-sized objects). `Index` items can be addressed and set using
    Python list indexing.Nc                    g | _         g x| _        }| j                  j                  }|y || _        t
        j                  t        d||j                                || _        |rt        |      }nt        |      }|dk(  ry d g|z  | _         t        |      }t
        j                  t        d||       |dk  s
J d|z         dd|z
  z  }t        |dz         D ]J  }|j                  |      }	||	z   }	t        j                  d|	      \  }
|j!                  t#        |
             L |j                         dz
  | _        |j'                  | j$                  |d	   z          t
        j                  t        d
||j                                y )Nloading %s at %sr   z    index count: %s offSize: %srW   zoffSize too large: %s    r   >Lr       end of %s at %s)r   r   r   r   _isCFF2r   r   r   r=   
readCard32
readCard16	readCard8ranger*   r-   r(   r`   r   
offsetBaser/   )r<   r=   r$   r   rS   r   r.   padrO   chunkr   s              r!   r   zIndex.__init__N  sX   
!##w~~&&<)4=	t$Et$EA:Ve^
D/8%I!|>4w>>|q7{#519% 	(EIIg&E%KEdE2IVNN3v;'		(
 ))+/		$//GBK/0,dDIIK@rA   c                 ,    t        | j                        S r   )rC   r   rD   s    r!   rE   zIndex.__len__k  s    4::rA   c                 j   | j                   |   }||S | j                  |   | j                  z   }| j                  |dz      | j                  |   z
  }| j                  }|j	                  |       |j                  |      }t        |      |k(  sJ | j                  ||||      }|| j                   |<   |S Nr   )r   r   r  r=   r/   r*   rC   produceItem)r<   rO   r   r   sizer=   r   s          r!   rT   zIndex.__getitem__n  s    zz% Ke$t6||EAI&e)<<yy		&yy4yD   tT6: 

5rA   c                 "    || j                   |<   y r   r   )r<   rO   r   s      r!   __setitem__zIndex.__setitem__|  s     

5rA   c                     |S r   r   )r<   rO   r   r=   r   s        r!   r  zIndex.produceItem  s    rA   c                 :    | j                   j                  |       y)zAdd an item to an INDEX.N)r   r`   )r<   r   s     r!   r`   zIndex.append  s    

$rA   c                 ,    | j                  | |||      S Nr#   compilerClassr<   r7   r   r$   s       r!   r\   zIndex.getCompiler      !!$!GGrA   c                 "    | j                   dd= y)zEmpty the INDEX.Nr  rD   s    r!   clearzIndex.clear  s    JJqMrA   NNr   )r   r   r   r   r   r  r   rE   rT   r  r  r`   r\   r"  r   rA   r!   r2   r2   G  s8     "MA:! HrA   r2   c                   |     e Zd ZdZeZej                  Zej                  Z		 	 	 	 	 	 d fd	Z
d Zd Zd Zd Z xZS )r:   ay  This index contains all the global subroutines in the font. A global
    subroutine is a set of ``CharString`` data which is accessible to any
    glyph in the font, and are used to store repeated instructions - for
    example, components may be encoded as global subroutines, but so could
    hinting instructions.

    Remember that when interpreting a ``callgsubr`` instruction (or indeed
    a ``callsubr`` instruction) that you will need to add the "subroutine
    number bias" to number given:

    .. code:: python

            tt = ttLib.TTFont("Almendra-Bold.otf")
            u = tt["CFF "].cff[0].CharStrings["udieresis"]
            u.decompile()

            u.toXML(XMLWriter(sys.stdout))
            # <some stuff>
            # -64 callgsubr <-- Subroutine which implements the dieresis mark
            # <other stuff>

            tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
            # <T2CharString (bytecode) at 103451d10>

            tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
            # <T2CharString (source) at 103451390>

    ("The bias applied depends on the number of subrs (gsubrs). If the number of
    subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
    than 33900, it is 1131; otherwise it is 32768.",
    `Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
    c                 r    t         t        |   ||       || _        || _        |r|| _        |r|| _        y y r  )r   r:   r   globalSubrsprivatefdSelectr   )r<   r=   r&  r'  r(  r   r$   r   s          r!   r   zGlobalSubrsIndex.__init__  sB     	.tF.C&$DM"DL rA   c                 ,   | j                   | j                   }n^t        | d      rP| j                  Dt        | d      r| j                  | j                  |   }nd}| j                  |   j                  }nd }| j                  ||| j                        S )Nr   r(  r   r'  r&  )r'  rL   r   r(  ry   	subrClassr&  )r<   rO   r   r=   r   r'  fdIndexs          r!   r  zGlobalSubrsIndex.produceItem  s    <<#llGT9%$,,*BtZ(T]]-F--.ll7+33GG~~dGAQAQ~RRrA   c                 v   |j                  d       |j                          t        t        |             D ]  }| |   }|j	                         r|j                  d|d       n|j                  d|       |j                          |j                  |       |j                  d       |j                           y)a  Write the subroutines index into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

        zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )rO   rawrO   N)commentrp   r  rC   needsDecompilationrq   rr   rs   )r<   rt   ir   s       r!   rr   zGlobalSubrsIndex.toXML  s     	U	
 	s4y! 		 A7D&&(""<qa"@""<q"9JJy!\*		 rA   c                 x    |dk7  ry | j                         }|j                  |||       | j                  |       y )Nr.  )r+  r{   r`   )r<   rS   r   r   r   s        r!   r{   zGlobalSubrsIndex.fromXML  s5    <~~T5'*DrA   c                 J    d }t        | d      r| j                  |   }| |   |fS )Nr(  )rL   r(  )r<   rO   sels      r!   getItemAndSelectorz#GlobalSubrsIndex.getItemAndSelector  s.    4$--&CE{CrA   NNNNNN)r   r   r   r   r   r  r   r~   r+  charStringClassr   r  rr   r{   r7  r   r   s   @r!   r:   r:     sT    B (M**I#00O #"S 2 rA   r:   c                       e Zd ZdZeZy)
SubrsIndexzThis index contains a glyph's local subroutines. A local subroutine is a
    private set of ``CharString`` data which is accessible only to the glyph to
    which the index is attached.N)r   r   r   r   r   r  r   rA   r!   r;  r;    s    $ "MrA   r;  c                   4     e Zd ZdZeZd fd	Zd Zd Z xZ	S )r4   a  This index represents the array of ``TopDict`` structures in the font
    (again, usually only one entry is present). Hence the following calls are
    equivalent:

    .. code:: python

            tt["CFF "].cff[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>
            tt["CFF "].cff.topDictIndex[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>

    c                    || _         ||r|| _        g | _        | j                  j                  }t
        j                  t        d||j                                || _        d}d g|z  | _        d|g| _	        |j                         | _
        |j                  | j                  |z          t
        j                  t        d||j                                y t        t        | ;  ||       y )Nr  r   r   r  r#   )r?   r	  r   r   r   r   r   r   r=   r   r  r/   r   r4   r   )r<   r=   r?   topSizer$   rS   r   r   s          r!   r   zTopDictIndex.__init__  s    !2!DLDJ>>**DGGE-tTYY[ADIE%DJw<DL"iikDOIIdoo/0GGE0$		D,.tF.CrA   c                     t        | j                  ||| j                  | j                  | j                        }|j                  |       |S r  )rz   r7   r;   r?   r	  r@   )r<   rO   r   r=   r   tops         r!   r  zTopDictIndex.produceItem#  sE    LL""<<
 	d
rA   c                     t        t        |             D ]Z  }|j                  d|       |j                          | |   j	                  |       |j                  d       |j                          \ y NFontDictr0  r  rC   rq   rp   rr   rs   r<   rt   r3  s      r!   rr   zTopDictIndex.toXML/  c    s4y! 	 Az3GMM)$Z(	 rA   )NNr   N)
r   r   r   r   r   r  r   r  rr   r   r   s   @r!   r4   r4     s     )MD$
 rA   r4   c                   "    e Zd ZeZd Zd Zd Zy)FDArrayIndexc                     t        t        |             D ]Z  }|j                  d|       |j                          | |   j	                  |       |j                  d       |j                          \ y rB  rD  rE  s      r!   rr   zFDArrayIndex.toXML;  rF  rA   c                     t        | j                  ||| j                  | j                  | j                        }|j                  |       |S N)r$   r}   )rC  r7   r;   r	  r}   r@   )r<   rO   r   r=   r   r   s         r!   r  zFDArrayIndex.produceItemC  sE    LL<<;;
 	4 rA   c                     |dk7  ry t               }|D ],  }t        |t              r|\  }}}|j                  |||       . | j	                  |       y )NrC  )rC  rM   rN   r{   r`   )r<   rS   r   r   r   r   s         r!   r{   zFDArrayIndex.fromXMLO  s\    :: 	3G'3'#* D%T5'2		3
 	HrA   N)r   r   r   r   r  rr   r  r{   r   rA   r!   rH  rH  8  s    (M 
	rA   rH  c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
VarStoreDataNc                 L    || _         d | _        || _        t               | _        y r   )r=   r   
otVarStorer   rv   )r<   r=   rP  s      r!   r   zVarStoreData.__init__\  s     		$H	rA   c                    | j                   rt        | j                         }|dk(  r | j                   j                         | _        n | j                   j                  |      | _        i }t	        | j                  |      }t        j                         | _        | j                  j                  || j                         d | _        | S Ni  )
r=   r  r*   r   r   otrx   rP  r@   rv   )r<   lengthglobalStatereaders       r!   r@   zVarStoreData.decompileb  s    99		*F IINN,	 IINN62	K"499k:F kkmDOOO%%fdii8DIrA   c                     t               }| j                  j                  || j                         |j	                         | _        y r   )r   rP  rh   rv   
getAllDatar   )r<   rd   s     r!   rh   zVarStoreData.compiler  s3    		2 %%'	rA   c                 P    | j                   j                  || j                         y r   )rP  rr   rv   )r<   rt   rS   s      r!   writeXMLzVarStoreData.writeXMLy  s    i3rA   c                     t        j                         | _        |D ]A  }t        |t              r/|\  }}}| j                  j                  |||| j                         BC y r   )rS  rx   rP  rM   tupler{   rv   )r<   rS   r   r   r   r   s         r!   xmlReadzVarStoreData.xmlRead|  sX    ++- 	G'5)'.$eW''eWdiiH	 rA   c                 ,    t        | j                        S r   rC   r   rD   s    r!   rE   zVarStoreData.__len__      499~rA   c                 X    |d}| j                   j                  |   }|j                  }|S r   )rP  VarDataVarRegionCount)r<   vsIndexvarData
numRegionss       r!   getNumRegionszVarStoreData.getNumRegions  s1    ?G//))'2++
rA   r#  )
r   r   r   r   r@   rh   rZ  r]  rE   rg  r   rA   r!   rN  rN  [  s%     (4rA   rN  c                   ,    e Zd ZddZd Zd Zd Zd Zy)FDSelectNc                    |ryt        |      | _        | j                  dk(  r2ddlm}  |d|j                  |            j	                         | _        y | j                  dk(  rd g|z  }t        |      }d }d }t        |      D ]2  }	t        |      }
|t        ||
      D ]  }|||<   	 |
}t        |      }4 |!t        |      }
t        ||
      D ]  }|||<   	 || _        y | j                  dk(  rd g|z  }t        |      }d }d }t        |      D ]2  }	t        |      }
|t        ||
      D ]  }|||<   	 |
}t        |      }4 |!t        |      }
t        ||
      D ]  }|||<   	 || _        y J d|z         || _        g | _        y )Nr   )arrayr   r   rW   zunsupported FDSelect format: %s)	r  formatrk  r*   tolistgidArrayr  r  r
  )r<   r=   	numGlyphsrl  rk  rn  nRangesfdprevr3  firstglyphIDs               r!   r   zFDSelect.__init__  s   #D/DK{{a' %c499Y+? @ G G I! 6I-$T*w )A&t,E'',T5'9 3G02HW-3 D"4B) #&t,E#(u#5 /,.)/ (! 6I-$T*w *A&t,E'',T5'9 3G02HW-3 D#D)B* #&t,E#(u#5 /,.)/ (H?&HHu !DKDMrA   c                 ,    t        | j                        S r   )rC   rn  rD   s    r!   rE   zFDSelect.__len__  s    4==!!rA   c                      | j                   |   S r   rn  r<   rO   s     r!   rT   zFDSelect.__getitem__  s    }}U##rA   c                 "    || j                   |<   y r   rw  )r<   rO   fdSelectValues      r!   r  zFDSelect.__setitem__  s    ,erA   c                 :    | j                   j                  |       y r   )rn  r`   )r<   rz  s     r!   r`   zFDSelect.append  s    ]+rA   )NNN)r   r   r   r   rE   rT   r  r`   r   rA   r!   ri  ri    s    0d"$-,rA   ri  c                   V    e Zd ZdZ	 	 ddZd Zd Zd ZeZd Z	d Z
d	 Zd
 Zd Zd Zy)r  a  The ``CharStrings`` in the font represent the instructions for drawing
    each glyph. This object presents a dictionary interface to the font's
    CharStrings, indexed by glyph name:

    .. code:: python

            tt["CFF "].cff[0].CharStrings["a"]
            # <T2CharString (bytecode) at 103451e90>

    See :class:`fontTools.misc.psCharStrings.T1CharString` and
    :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
    compile and interpret the glyph drawing instructions in the returned objects.

    Nc	                    || _         || _        |Ht        ||||||      | _        i x| _        }	t        t        |            D ]
  }
|
|	||
   <    d| _        y i | _        d| _        || _        ||| _	        ||| _
        y y )Nr#   r   r   )r&  varStorer;  charStringsIndexcharStringsr  rC   charStringsAreIndexedr'  r(  r   )r<   r=   rX   r&  r'  r(  r   r$   r~  r  r3  s              r!   r   zCharStrings.__init__  s     ' $.k7Hgf%D! .0/D{3w<( ,*+GAJ', *+D&!D)*D&"DL# ("& #rA   c                 H    t        | j                  j                               S r   )r1   r  rG   rD   s    r!   rG   zCharStrings.keys  s    D$$))+,,rA   c                 x    | j                   r| j                  S t        | j                  j	                               S r   )r  r  r1   r  rI   rD   s    r!   rI   zCharStrings.values  s1    %%(((((//122rA   c                     || j                   v S r   )r  )r<   rS   s     r!   has_keyzCharStrings.has_key  s    t''''rA   c                 ,    t        | j                        S r   )rC   r  rD   s    r!   rE   zCharStrings.__len__  s    4##$$rA   c                 Z    | j                   |   }| j                  r| j                  |   }|S r   )r  r  r  )r<   rS   
charStrings      r!   rT   zCharStrings.__getitem__  s1    %%d+
%%..z:JrA   c                 x    | j                   r| j                  |   }|| j                  |<   y || j                  |<   y r   )r  r  r  )r<   rS   r  rO   s       r!   r  zCharStrings.__setitem__  s;    %%$$T*E+5D!!%(%/DT"rA   c                     | j                   r*| j                  |   }| j                  j                  |      S t	        | d      r)t	        | d      r| j                  |   j
                  }nd}nd }| j                  |   |fS )Nr   r(  r   )r  r  r  r7  rL   fdSelectIndex)r<   rS   rO   r6  s       r!   r7  zCharStrings.getItemAndSelector   s|    %%$$T*E((;;EBBtY'4,**40>>CC##D)3..rA   c                    t        | j                               }|D ]  }| j                  |      \  }}|j                         rdg}ng }||j	                  dd|fg|z          n|j	                  dd|fd|fg|z          |j                          |j                  |       |j                  d       |j                           y )N)r/  r   r.  rS   r  )sortedrG   r7  r2  rq   rp   rr   rs   )r<   rt   namesrS   charStrr  r/  s          r!   rr   zCharStrings.toXML.  s    tyy{# 	 D%)%<%<T%B"G]))+!l$""<64.1AC1GH"" d^o}%EFL MM)$\*!	 rA   c                    |D ]  }t        |t              r|\  }}}|dk7  r d}t        | d      r)	 t        |d         }| j
                  |   j                  }n| j                  }|d   }t        j                  } ||| j                        }	|	j                  |||       |dk\  r||	_        |	| |<    y # t        $ r d}Y w xY w)Nr.  r   r   r  r   rS   r*  )rM   rN   rL   r   rP   r   ry   r'  r   r~   r&  r{   r  )
r<   rS   r   r   r   fdIDr'  	glyphNamer9  r  s
             r!   r{   zCharStrings.fromXMLB  s     	)G'3'#* D%|#DtY'#E/$:;D ,,t,44,,fI+88O(dFVFVWJtUG4qy+/
((DO-	)   Ds   B66CCr#  )r   r   r   r   r   rG   rI   r  __contains__rE   rT   r  r7  rr   r{   r   rA   r!   r  r    sI    . 'B-3( L%0/ ()rA   r  c                 6    t        | j                  d            S r  )r   r*   )r=   s    r!   r  r  \  s    499Q<  rA   c                 T    t        j                  d| j                  d            \  }|S )Nr%   r   r-   r(   r*   r=   rk   s     r!   r  r  `  !    }}T499Q<0HULrA   c                 T    t        j                  d| j                  d            \  }|S )Nr  rW   r  r  s     r!   r
  r
  e  r  rA   c                 8    | j                  t        |             y r   )r   r   r  s     r!   r   r   j  s    JJwu~rA   c                 N    | j                  t        j                  d|             y Nr%   r   r-   r^   r  s     r!   r   r   n      JJv{{4'(rA   c                 N    | j                  t        j                  d|             y Nr  r  r  s     r!   r   r   r  r  rA   c                     t        |       S r   )r   rj   s    r!   	packCard8r  v  s    5>rA   c                 .    t        j                  d|       S r  r-   r^   rj   s    r!   
packCard16r  z      ;;tU##rA   c                 .    t        j                  d|       S r  r  rj   s    r!   
packCard32r  ~  r  rA   c                 2    i }| D ]  \  }}}}}||f||<    |S r   r   r   doprS   argdefaultconvs          r!   buildOperatorDictr    s3    
A(- $D#ws"HrA   c                     i }| D ]H  \  }}}}}t        |t              rt        |d         t        |d         z   }nt        |      }||f||<   J |S Nr   r   )rM   r\  r   r  s          r!   buildOpcodeDictr    sb    
A(- $D#wb% A'"Q%.0BBs)$ HrA   c                 F    g }| D ]  \  }}}}}|j                  |        |S r   )r`   )r   lr  rS   r  r  r  s          r!   
buildOrderr    s1    
A(- $D#w	HrA   c                 4    i }| D ]  \  }}}}}||||<    |S r   r   r  s          r!   buildDefaultsr    s7    
A(- $D#wAdG HrA   c                 .    i }| D ]  \  }}}}}|||<    |S r   r   r  s          r!   buildConvertersr    s/    
A(- $D#w$HrA   c                   *    e Zd Zd Zd Zd Zd Zd Zy)SimpleConverterc                     t        |d      s| j                  ||      S |j                  }|j                         }	 | j                  ||      |j	                  |       S # |j	                  |       w xY w)Nr=   )rL   _readr=   r   r/   )r<   r   rk   r=   r   s        r!   r*   zSimpleConverter.read  s[    vv&::fe,,{{iik	::fe,IIcNDIIcNs   A A2c                     |S r   r   r<   r   rk   s      r!   r  zSimpleConverter._read  r   rA   c                     |S r   r   r  s      r!   r   zSimpleConverter.write  r   rA   c                 J    |j                  ||       |j                          y )Nrj   )ro   rp   r<   rt   rS   rk   s       r!   xmlWritezSimpleConverter.xmlWrite  s!    D.rA   c                     |d   S Nrk   r   r<   rS   r   r   r   s        r!   r]  zSimpleConverter.xmlRead  s    W~rA   N)r   r   r   r*   r  r   r  r]  r   rA   r!   r  r    s    rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)ASCIIConverterc                     t        |d      S Nasciir   r   r  s      r!   r  zASCIIConverter._read  s    UW--rA   c                     t        |d      S r  r
   r  s      r!   r   zASCIIConverter.write  s    uw//rA   c                 `    |j                  |t        |d             |j                          y )Nr  r   rj   ro   r   rp   r  s       r!   r  zASCIIConverter.xmlWrite  s(    Deg(FGrA   c                 "    t        |d   d      S )Nrk   r  r   r  r  s        r!   r]  zASCIIConverter.xmlRead  s    uW~::rA   Nr   r   r   r  r   r  r]  r   rA   r!   r  r    s    .0;rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)Latin1Converterc                     t        |d      S Nr   r   r   r  s      r!   r  zLatin1Converter._read  s    UX..rA   c                     t        |d      S r  r  r  s      r!   r   zLatin1Converter.write  s    ux00rA   c                     t        |d      }|dv rt        j                  dd|      }|j                  ||       |j	                          y )Nr   r   )Notice	Copyrightz	[\r\n]\s+ rj   )r   resubro   rp   r  s       r!   r  zLatin1Converter.xmlWrite  sH    eh/**FF<e4ED.rA   c                 "    t        |d   d      S )Nrk   r   r   r  r  s        r!   r]  zLatin1Converter.xmlRead  s    uW~;;rA   Nr  r   rA   r!   r  r    s    /1<rA   r  c                 D    	 t        |       }|S #  t        |       }Y |S xY wr   )r   float)r    rk   s     r!   parseNumr    s,    A LaLs    c                     g }| D ]U  }t        |t              r|\  }}}|d   j                         }|D cg c]  }t        |       }}|j	                  |       W t        |      dk(  r|d   }|S c c}w )Nrk   r   r   )rM   rN   splitevalr`   rC   )r    	valueListr   rS   r   r   	blendListvals           r!   parseBlendListr    s    I $gs#&eW'N((*	*343T#Y4	4#$ 9~aL		 5s   A2c                       e Zd Zd Zd Zy)NumberConverterc                    t        |t              r|j                  |       |j                          |j	                          dj                  |D cg c]  }t        |       c}      }|j                  t        |       |j                          |j                          |j                  |       |j                          y |j                  ||       |j                          y c c}w )Nr  rj   rM   r1   rq   rp   indentjoinrN   ro   kBlendDictOpNamededentrs   )r<   rt   rS   rk   r  
blendValues         r!   r  zNumberConverter.xmlWrite  s    eT"t$u"=3s8"=>J 0
CT"E2 #>s   C'c                 d    |j                  dd       }|t        |      }|S t        |d         }|S r  )getr  r  )r<   rS   r   r   r   valueStringrk   s          r!   r]  zNumberConverter.xmlRead
  s>    ii."7+E  U7^,ErA   Nr   r   r   r  r]  r   rA   r!   r  r    s     rA   r  c                       e Zd Zd Zd Zy)ArrayConverterc           	      J   |rt        |d   t              r|j                  |       |j                          |j	                          |D ]Q  }dj                  |D cg c]  }t        |       c}      }|j                  t        |       |j                          S |j                          |j                  |       |j                          y dj                  |D cg c]  }t        |       c}      }|j                  ||       |j                          y c c}w c c}w )Nr   r  rj   r  )r<   rt   rS   rk   r  r  r  s          r!   r  zArrayConverter.xmlWrite  s    Za$/t$" $	 XX9&ECs3x&EF
##$4J#G!!#$ T"HH%83c#h89EE2 'F 9s   D
D c                     |j                  dd       }|t        |      }|S |j                         }|D cg c]  }t        |       }}|S c c}w r  )r  r  r  r  )	r<   rS   r   r   r   r  r  rI   rk   s	            r!   r]  zArrayConverter.xmlRead%  s\    ii.&w/I  !&&(F6<=U%=I= >s   ANr  r   rA   r!   r  r    s     "rA   r  c                       e Zd Zd Zd Zy)TableConverterc                     |j                  |       |j                          |j                  |       |j                  |       |j                          y r   )rq   rp   rr   rs   r  s       r!   r  zTableConverter.xmlWrite0  sB    4 IrA   c                      | j                                }|D ],  }t        |t              r|\  }}}|j                  |||       . |S r   )getClassrM   rN   r{   )r<   rS   r   r   r   obr   s          r!   r]  zTableConverter.xmlRead7  sQ    T]]_ 	-G'3'#* D%JJtUG,		-
 	rA   Nr  r   rA   r!   r  r  /  s    rA   r  c                       e Zd Zd Zd Zd Zy)PrivateDictConverterc                     t         S r   )PrivateDictrD   s    r!   r  zPrivateDictConverter.getClassB  s    rA   c                 6   |\  }}|j                   }|j                  }	 |j                  }t	        |j
                  ||||      }|j                  |       |j                  |      }	t        |	      |k(  sJ |j                  |	       |S # t        $ r d }Y lw xY wrK  )
r=   r	  r}   AttributeErrorr  r7   r/   r*   rC   r@   )
r<   r   rk   r  r   r=   r$   r}   privr   s
             r!   r  zPrivateDictConverter._readE  s    f{{	]]F 6>>4vV		&yy4yD   t  	F	s   B
 
BBc                      y)N)r   r   r   r  s      r!   r   zPrivateDictConverter.writeT  s    rA   Nr   r   r   r  r  r   r   rA   r!   r  r  A  s    rA   r  c                       e Zd Zd Zd Zd Zy)SubrsConverterc                     t         S r   )r;  rD   s    r!   r  zSubrsConverter.getClassY  s    rA   c                     |j                   }|j                  }|j                  |j                  |z          t	        ||      S r  )r=   r	  r/   r   r;  )r<   r   rk   r=   r$   s        r!   r  zSubrsConverter._read\  s6    {{		&--%'($v..rA   c                      yr   r   r  s      r!   r   zSubrsConverter.writeb      rA   Nr  r   rA   r!   r
  r
  X  s    /rA   r
  c                       e Zd Zd Zd Zd Zy)CharStringsConverterc           
      V   |j                   }|j                  }|j                  }t        |dd       }|j                  }t        |d      r*|j                  }t        |d      r|j                  }	nd }	d }
nd\  }	}|j                  }
|j                  |       t        ||||
|	|||      }|S )Nrx   r|   ri  r#  )r$   r~  )r=   r	  rX   getattrr;   rL   r|   ri  ry   r/   r  )r<   r   rk   r=   r$   rX   r~  r&  r   r(  r'  r  s               r!   r  zCharStringsConverter._readg  s    {{..6:t4((69%nnGvz*!??G *HgnnG		%!	
 rA   c                      yr   r   r  s      r!   r   zCharStringsConverter.write  r  rA   c                    t        |d      r*|j                  }t        |d      r|j                  }nd }d }n|j                  d d }}}t	        d d |j
                  |||t        |dd             }|j                  |||       |S )Nr|   ri  rx   )r~  )rL   r|   ri  ry   r  r;   r  r{   )	r<   rS   r   r   r   r   r(  r'  r  s	            r!   r]  zCharStringsConverter.xmlRead  s    69% nnGvz*!??G
 *0twXG!VZ6
 	D%1rA   Nr   r   r   r  r   r]  r   rA   r!   r  r  f  s    :rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)CharsetConverterc                 z   t        |d      }|dkD  rB|j                  }|j                  }|j                  |       t        j	                  t
        d|       t        |      }|dk(  rt        |||j                  |      }n*|dk(  s|dk(  rt        |||j                  ||      }nt        t        |      |k(  sJ t        j	                  t
        d|j                                i }g }	|D ]f  }
|
|v rJ||
   }|
dz   t        |      z   |v r|dz  }|
dz   t        |      z   |v r|dz   ||
<   |
dz   t        |      z   }
d||
<   |	j                  |
       h |	}n=|sd|j                  vr
|dk(  sJ d }n#|dk(  rt         }n|dk(  rt"        }n|dk(  rt$        }r't        |      |j                  k7  r|d |j                   }|S )	NROSr   zloading charset at %sr   r   z    charset end at %s#r  )rL   ro  r=   r/   r   r   r  parseCharset0r7   parseCharsetNotImplementedErrorrC   r   rN   r`   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r<   r   rk   isCIDro  r=   rl  rX   allNames
newCharsetr  ns               r!   r  zCharsetConverter._read  s   &19((I;;DIIeGGE2E:t_F{'	4O1!&y$vV))w<9,,,GGE2DIIK@HJ$ 	-	( +A$s?SV3@Q %s?SV3@*+a%HY' )C#a& 8I&'#!!),	- !GV^^; z!z!,!+!0G(8(880 0 01GrA   c                      yr   r   r  s      r!   r   zCharsetConverter.write  r  rA   c                 F    |j                  d       |j                          y )Nz8charset is dumped separately as the 'GlyphOrder' element)r1  rp   r  s       r!   r  zCharsetConverter.xmlWrite  s     	TUrA   c                      y r   r   r  s        r!   r]  zCharsetConverter.xmlRead      rA   Nr  r   rA   r!   r  r    s    ,\rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)CharsetCompilerc                     |d   dk(  sJ t        |j                  d      }t        |||      }t        |||      }t	        |      t	        |      k  r|| _        || _        y || _        || _        y )Nr   .notdefr  )rL   dictObjpackCharset0packCharsetrC   r   r   )r<   r7   rX   r   r!  data0r   s          r!   r   zCharsetCompiler.__init__  sp    qzY&&&.WeW57E73t9s5z!DI  DIrA   c                 6    || j                   j                  d<   y )NrX   r   r   s      r!   r   zCharsetCompiler.setPos  r   rA   c                 ,    t        | j                        S r   r_  rD   s    r!   r_   zCharsetCompiler.getDataLength  r`  rA   c                 :    |j                  | j                         y r   r   r   r<   r=   s     r!   rb   zCharsetCompiler.toFile      

499rA   Nr   r   r   r   r   r_   rb   r   rA   r!   r*  r*    s    	-rA   r*  c                     d }t         t        dft        t        dft        t
        dfg}t        |       }|D ]2  \  }}}| |S ||kD  r|}t        |      D ]  }| |   ||   k7  sd } 2 4 |S )Nr   r   r   )cffISOAdobeStringCountr  cffExpertStringCountr  cffExpertSubsetStringCountr   rC   r  )rX   predefinedCharSetValpredefinedCharSetslcscntpcscsvr3  s           r!   getStdCharSetrB    s    	!3Q7	0!4	#%;Q?
 g,C+ 	S#+   9"s 	AqzSV#'+$		  rA   c                     t        | dd        S )Nr   )r   rS   r7   s     r!   getCIDfromNamerE    s    tABx=rA   c                 $    |j                  |       S r   )getSIDrD  s     r!   getSIDfromNamerH    s    >>$rA   c           	          d}t        |      g}|rt        }nt        }| dd  D ]#  }|j                  t	         |||                   % t        |      S r  )r  rE  rH  r`   r  r	   )rX   r!  r7   fmtr   	getNameIDrS   s          r!   r.  r.    sW    
CcND"	"	 :Jyw789:T?rA   c                    d}g }d }d}|rt         }nt        }| dd  D ];  } |||      }	||	}n)|dz   |	k7  r!||z
  }
|
dkD  rd}|j                  ||
f       |	}|	}= |r||z
  }
|
dkD  rd}|j                  ||
f       t        |      g}|dk(  rt        }nt        }|D ](  \  }}
|j                  t	        |       ||
      z          * t        |      S )Nr   r      r   )rE  rH  r`   r  r  r	   )rX   r!  r7   rJ  rangesrs  endrK  rS   SIDnLeftr   	nLeftFuncs                r!   r/  r/  !  s   
CFE
C"	"	 
g&=E1W^%KEs{MM5%.)E
 e3;Cuen%cND
ax		 :uJu%	%(889:T?rA   c                    dg}|rLt        | dz
        D ]9  }t        |      }|j                  dt        |      j	                  d      z          ; |S t        | dz
        D ]!  }t        |      }|j                  ||          # |S Nr,  r   cidrV   )r  r  r`   rN   zfill)ro  r=   r7   r!  rX   r3  CIDrP  s           r!   r  r  F  s    kGy1}% 	6AT"CNN53s8>>!#445	6 N y1}% 	)AT"CNN73<(	) NrA   c                 b   dg}d}|dk(  rt         }nt        }|| k  rt        |      } ||      }	|rDt        |||	z   dz         D ].  }
|j                  dt	        |
      j                  d      z          0 n+t        |||	z   dz         D ]  }|j                  ||           ||	z   dz   }|| k  r|S rT  )r  r  r  r`   rN   rV  )ro  r=   r7   r!  rJ  rX   r   rR  rs  rQ  rW  rP  s               r!   r  r  S  s    kGE
ax		
)
4 $UEEMA$56 :us3x~~a'889: UEEMA$56 -ws|,-! )
 NrA   c                   $    e Zd Zd Zd Zd Zd Zy)EncodingCompilerc                 <   t        |t              rJ t        |j                  j                  ||j
                        }t        |j                  j                  ||j
                        }t        |      t        |      k  r|| _        || _	        y || _        || _	        y r   )
rM   rN   packEncoding0r-  rX   r7   packEncoding1rC   r   r   )r<   r7   r   r   r0  data1s         r!   r   zEncodingCompiler.__init__h  sz    h,,,fnn44hOfnn44hOu:E
"DI  DIrA   c                 6    || j                   j                  d<   y )NEncodingr   r   s      r!   r   zEncodingCompiler.setPosr      *-J'rA   c                 ,    t        | j                        S r   r_  rD   s    r!   r_   zEncodingCompiler.getDataLengthu  r`  rA   c                 :    |j                  | j                         y r   r4  r5  s     r!   rb   zEncodingCompiler.toFilex  r6  rA   Nr7  r   rA   r!   rZ  rZ  g  s    .rA   rZ  c                   $    e Zd Zd Zd Zd Zd Zy)EncodingConverterc                    |dk(  ry|dk(  ry|dkD  sJ |j                   }|j                  |       t        j                  t        d|       t	        |      }|dz  }|rt        d      |dz  }|dk(  r$t        |j                  |||j                        }|S |dk(  r"t        |j                  |||j                        }S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
r=   r/   r   r   r  r  parseEncoding0rX   r7   parseEncoding1)r<   r   rk   r=   rJ  haveSupplementr   s          r!   r  zEncodingConverter._read}  s    A:%aZ#199;;DIIeGGE3U;D/C 4ZN)*VWW*Cax)NND.&.. O	 )NND.&.. OrA   c                     |dk(  ry|dk(  ryy)Nrg  r   rh  r   r   r  s      r!   r   zEncodingConverter.write  s    &&&&rA   c                 z   |dv r$|j                  ||       |j                          y |j                  |       |j                          t        t	        |            D ]:  }||   }|dk7  s|j                  dt        |      |       |j                          < |j                  |       |j                          y )N)rg  rh  rn   r,  map)coderS   )ro   rp   rq   r  rC   hexrs   )r<   rt   rS   rk   rq  r  s         r!   r  zEncodingConverter.xmlWrite  s    ::514 #e*% 	$DdII%##ED		#J!!#		$
 	rA   c                     d|v r|d   S dgdz  }|D ]1  }t        |t              r|\  }}}t        |d         }|d   }|||<   3 |S )NrS   r,  r   rq  )rM   rN   r   )	r<   rS   r   r   r   r   r   rq  r  s	            r!   r]  zEncodingConverter.xmlRead  sn    U?= ;$ 	'G'3'#* D%E&M*DfI&HTN	' rA   Nr  r   rA   r!   re  re  |  s    2rA   re  c                     t        |      }dgdz  }t        d|dz         D ]  }t        |      }|dk7  s| |   ||<    |S )Nr,  r   r   r   r  r  )rX   r=   rm  r7   nCodesr   rt  rq  s           r!   rk  rk    sV    t_F{S HFQJ' .19$W-HTN. OrA   c                     t        |      }dgdz  }d}t        |      D ]A  }t        |      }t        |      }	t        |||	z   dz         D ]  }| |   ||<   |dz   } |dz   }C |S )Nr,  r   r   ru  )
rX   r=   rm  r7   rp  r   rt  r3  rq  rQ  s
             r!   rl  rl    s    oG{S HG7^ $Wgo&9: 	G$W-HTN!8D	 A+ OrA   c                    d}i }t        t        |            D ]  }||   }|dk7  s|||<    g }| dd  D ]$  }|j                  |      }|j                  |       & |r|d   |j	                          |r|d   t        |      t        t        |            g}|D ]   }|d}|j                  t        |             " t        |      S )Nr   r,  r   r   r  rC   r  r`   popr  r	   )	rX   r   r7   rJ  mrq  rS   codesr   s	            r!   r\  r\    s    
C
Ac(m$ ~9AdG E uuT{T E"I%		 E"I% cNIc%j12D %<DIdO$% T?rA   c                 :   d}i }t        t        |            D ]  }||   }|dk7  s|||<    g }d }d}	| dd  D ]=  }|j                  |d      }||}n"|	dz   |k7  r|	|z
  }
|j                  ||
f       |}|}	? |	|z
  }
|j                  ||
f       |r)|d   d   dk(  r|j	                          |r|d   d   dk(  rt        |      t        t        |            g}|D ]2  \  }}
|dk(  rd}|j                  t        |      t        |
      z          4 t        |      S )Nr   r,  r   r   ry  )rX   r   r7   rJ  r{  rq  rS   rN  rs  rO  rQ  r   s               r!   r]  r]    sV   
C
Ac(m$ ~9AdG FE
C uuT2=E1W_%KEMM5%.)E %KE
MM5%.! VBZ]b(

 VBZ]b( cNIc&k23D 9uB;EIe$y'7789 T?rA   c                       e Zd Zd Zd Zd Zy)FDArrayConverterc                     	 |j                   }|j                  }|j                  }|j	                  |       t        ||      }||_        |j                  |_        |j                  |_        |S # t        $ r d }Y nw xY wr  )	rx   r  r=   r	  r/   rH  r}   r7   r;   )r<   r   rk   r}   r=   r$   r   s          r!   r  zFDArrayConverter._read  sw    	__F {{		%tF3 ..$00  	F	s   A/ /A=<A=c                      yr   r   r  s      r!   r   zFDArrayConverter.write  r  rA   c                 |    t               }|D ],  }t        |t              r|\  }}}|j                  |||       . |S r   )rH  rM   rN   r{   )r<   rS   r   r   r   r   r   s          r!   r]  zFDArrayConverter.xmlRead  sH    . 	2G'3'#* D%OOD%1		2
 rA   Nr  r   rA   r!   r  r    s    rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)FDSelectConverterc                 l    |j                   }|j                  |       t        ||j                        }|S r   )r=   r/   ri  ro  )r<   r   rk   r=   r(  s        r!   r  zFDSelectConverter._read(  s.    {{		%D&"2"23rA   c                      yr   r   r  s      r!   r   zFDSelectConverter.write.  r  rA   c                 b    |j                  |d|j                  fg       |j                          y Nrl  )ro   rl  rp   r  s       r!   r  zFDSelectConverter.xmlWrite3  s*    DHell#;"<=rA   c                 D    t        |d         }d }d }t        |||      }|S r  )r   ri  )	r<   rS   r   r   r   rJ  r=   ro  r(  s	            r!   r]  zFDSelectConverter.xmlRead7  s-    uX'	D)S1rA   Nr  r   rA   r!   r  r  '  s    
rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)VarStoreConverterc                 v    |j                   }|j                  |       t        |      }|j                          |S r   )r=   r/   rN  r@   )r<   r   rk   r=   r~  s        r!   r  zVarStoreConverter._read@  s2    {{		%%rA   c                      yr   r   r  s      r!   r   zVarStoreConverter.writeG  r  rA   c                 (    |j                  ||       y r   )rZ  r  s       r!   r  zVarStoreConverter.xmlWriteJ  s    y$'rA   c                 B    t               }|j                  ||||       |S r   )rN  r]  )r<   rS   r   r   r   r~  s         r!   r]  zVarStoreConverter.xmlReadM  s"    >ugv6rA   Nr  r   rA   r!   r  r  ?  s    (rA   r  c                 v    d}t        |      g}| D ]  }|j                  t        |              t        |      S r   )r  r`   r	   )fdSelectArrayrJ  r   rO   s       r!   packFDSelect0r  S  s=    
CcND &Ie$%&T?rA   c                    d}g }t        |       }d}t        |      D ]"  }| |   }||k7  s|j                  ||g       |}$ dz   }t        |      g}|j                  t	        t        |                   |D ]<  }	|j                  t	        |	d                |j                  t        |	d                > |j                  t	        |             t        |      S )Nr   r   r   r   )rC   r  r`   r  r  r	   
r  rJ  fdRangeslenArraylastFDIndexr3  r,  sentinelGIDr   fdRanges
             r!   packFDSelect3r  [  s    
CH=!HK8_ ""'!OOQL)!K	"
 a%KcNDKK
3x=)* +Jwqz*+Igaj)*+ 	KK
;'(T?rA   c                    d}g }t        |       }d}t        |      D ]"  }| |   }||k7  s|j                  ||g       |}$ dz   }t        |      g}|j                  t	        t        |                   |D ]<  }	|j                  t	        |	d                |j                  t        |	d                > |j                  t	        |             t        |      S )NrW   r   r   r   )rC   r  r`   r  r  r  r	   r  s
             r!   packFDSelect4r  p  s    
CH=!HK8_ ""'!OOQL)!K	"
 a%KcNDKK
3x=)* ,Jwqz*+Jwqz*+, 	KK
;'(T?rA   c                   $    e Zd Zd Zd Zd Zd Zy)FDSelectCompilerc                    |j                   }|j                  }|dk(  rt        |      | _        || _        y |dk(  rt	        |      | _        || _        y |dk(  rt        |      | _        || _        y t        |      }t	        |      }t        |      t        |      k  r|| _        d|_         || _        y || _        d|_         || _        y )Nr   r   rW   )rl  rn  r  r   r  r  rC   r   )r<   r(  r   rJ  r  r0  data3s          r!   r   zFDSelectCompiler.__init__  s    oo ))!8%m4DI   AX%m4DI  AX%m4DI  "-0E!-0E5zCJ&!	"#
  "	"#rA   c                 6    || j                   j                  d<   y )Nri  r   r   s      r!   r   zFDSelectCompiler.setPos  ra  rA   c                 ,    t        | j                        S r   r_  rD   s    r!   r_   zFDSelectCompiler.getDataLength  r`  rA   c                 :    |j                  | j                         y r   r4  r5  s     r!   rb   zFDSelectCompiler.toFile  r6  rA   Nr7  r   rA   r!   r  r    s    ,.rA   r  c                   $    e Zd Zd Zd Zd Zd Zy)VarStoreCompilerc                     || _         |j                  s|j                          t        dt	        |j                              }t        |      |j                  g}t        |      | _        y rR  )r   r   rh   minrC   r  r	   )r<   varStoreDatar   varStoreDataLenr   s        r!   r   zVarStoreCompiler.__init__  sU        "fc,*;*;&<=?+\->->?dO	rA   c                 6    || j                   j                  d<   y )Nrx   r   r   s      r!   r   zVarStoreCompiler.setPos  ra  rA   c                 ,    t        | j                        S r   r_  rD   s    r!   r_   zVarStoreCompiler.getDataLength  r`  rA   c                 :    |j                  | j                         y r   r4  r5  s     r!   rb   zVarStoreCompiler.toFile  r6  rA   Nr7  r   rA   r!   r  r    s    $.rA   r  c                       e Zd Zd Zd Zy)ROSConverterc                     |\  }}}|j                  |dt        |      fdt        |      fd|fg       |j                          y NRegistryOrder
Supplementr  )r<   rt   rS   rk   registryorder
supplements          r!   r  zROSConverter.xmlWrite  sR    &+#%U8_-%,'z*	
 	rA   c                 0    |d   |d   t        |d         fS r  )r   r  s        r!   r]  zROSConverter.xmlRead  s"    j!5>8E,<O3PQQrA   Nr  r   rA   r!   r  r    s    
RrA   r  )   maxstacknumberNN)      r  )rP  rP  r  ))r     SyntheticBaser  NN)r   versionrP  NNr  rP  )r  r   r  r   FullName)r  &   FontNamer   
FamilyName)rW   WeightrP  NN))r  r   isFixedPitchr  r   N))r  r   ItalicAngler  r   N))r  r   UnderlinePositionr  iN))r  rW   UnderlineThicknessr  2   N))r  rV   	PaintTyper  r   N))r     CharstringTyper  r   N)r     
FontMatrixrk  )MbP?r   r   r  r   r   )   UniqueIDr  NNrV   FontBBox)r   r   r   r   ))r     StrokeWidthr  r   N)   XUIDrk  NN))r     
PostScriptrP  NN))r     BaseFontNamerP  NN))r     BaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   rX   r  ))r  #   UIDBaser  NN   r`     ry   )r  r  )r  %   )r  $   r|         rx   blendr  )r  vsindexr  NNr  )r  
BlueValuesr  NN)r  
OtherBluesr  NN)r  FamilyBluesr  NN)	   FamilyOtherBluesr  NN))r  r  	BlueScaler  g}?5^I?N))r  
   	BlueShiftr  r  N))r     BlueFuzzr  r   N)r  StdHWr  NN)r  StdVWr  NN))r  r  	StemSnapHr  NN))r  r  	StemSnapVr  NN))r  r  	ForceBoldr  r   N))r  r  ForceBoldThresholdr  NN))r  r  lenIVr  NN))r  r  LanguageGroupr  r   N))r  r  ExpansionFactorr  gQ?N))r     initialRandomSeedr  r   N)r  defaultWidthXr  r   N)r  nominalWidthXr  r   Nr  r   c                     t        t        |             D ]S  }| |   \  }}}}}||dv rt               }n*|dk(  rt               }n|dk(  rt	               }n
|dk(  rd }nJ |||||f| |<   U y )N)r  rk  r  rP  r  )r  rC   r  r  r  )r   r3  r  rS   r  r  r  s          r!   addConvertersr	  =  s    3u: 0',Qx$D#w$$!#DH_"$DE\!#DKD5tS'4/a0rA   c                       e Zd Z ee      Zy)TopDictDecompilerN)r   r   r   r  topDictOperators	operatorsr   rA   r!   r  r  S  s    !"23IrA   r  c                       e Zd Z ee      Zy)PrivateDictDecompilerN)r   r   r   r  privateDictOperatorsr  r   rA   r!   r  r  W  s    !"67IrA   r  c                   N    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y)DictCompilerr   Nc                 ~   |rt        |t              sJ |t        |d      r|j                  }|J || _        || _        || _        || _        i }|j                  D ]W  }t        ||d       }||j                  |   }|j                  ||      }||j                  j                  |      k(  rS|||<   Y || _        y r   )rM   r6   rL   r$   r-  r7   r   r  r  
convertersr   defaultsr  r   )	r<   r-  r7   r   r$   r   rS   rk   r  s	            r!   r   zDictCompiler.__init__^  s    g~666>gfh7]]F%%%MM 	"DGT40E}%%d+DJJw.E((,,T22!GDM	" rA   c                      y r   r   r   s      r!   r   zDictCompiler.setPost  r(  rA   c                 6    t        | j                  d            S )Nr_   )rC   rh   rD   s    r!   r_   zDictCompiler.getDataLengthw  s    4<<011rA   c                 j   t         j                  t        d| j                  j                  |       | j                  }g }| j
                  j                  D ]  }|j                  |      }|| j                  |   \  }}t        |t              rat        |      }t        |      |k(  sJ d       t        |      D ]2  }	||	   }
||	   }t        | d|
z         }|j                   ||             4 n&t        | d|z         }|j                   ||             |j                  |        t        |      }|S )Nz-- compiling %s for %szvalue doesn't match arg typearg_)r   r   r   r   r   r-  r  r  opcodesrM   r\  rC   r  r  r`   r	   )r<   reasonr   r   rS   rk   r  argTyper  r3  r  v
arghandlers                r!   rh   zDictCompiler.compilez  s   /1H1H&Q,,LL&& 	DKK%E},,t,KB'5)L5zQF(FFq /A!!*CaA!(v|!<JKK
1.	/ %T6G+;<
Ju-.KKO!	" rA   c                 H    | j                  d      }|j                  |       y )Nrb   )rh   r   )r<   r=   r   s      r!   rb   zDictCompiler.toFile  s    ||H%

4rA   c                     t        |t              r]|D cg c]  }t        |       }}|j                  t        d             |j                  t	        t
                     t        |      }|S t        |      }|S c c}w r  )rM   r1   encodeNumberr`   r   blendOpr	   )r<   numr  r   datums        r!   
arg_numberzDictCompiler.arg_number  sk    c4 145#L%5D5KKQ(KK()dOE  !%E 6s   A;c                 ^    t        j                  | j                  j                  |            S r   )r   encodeIntCFFr7   rG  )r<   r    s     r!   arg_SIDzDictCompiler.arg_SID  s"    ))$,,*=*=a*@AArA   c                 j    g }|D ]"  }|j                  | j                  |             $ t        |      S r   )r`   r%  r	   )r<   rk   r   r#  s       r!   	arg_arrayzDictCompiler.arg_array  s5     	.CKK,-	.rA   c                    |sy|d   }t        |t              r| j                  |      }t        |      S g }d}|D ]  }|j                  ||z
         |} g }|D ]  }|j                  t	        |              t        |      S )NrA   r   )rM   r1   arg_delta_blendr`   r!  r	   )r<   rk   val0r   r   lastr  r#  s           r!   	arg_deltazDictCompiler.arg_delta  s    QxdD!''.D  CD 

1t8$ D /L-./rA   c                    t        |d         }t        |      }||z  dz   }|| j                  kD  rht        | j                  dz
  |z        }g }	 t        t        |      |      }|dk(  r	 |S |d| }| j	                  |      }	|j                  |	       ||d }Jdg|z  }
dg|z  }d}d}||k  r(||   d   }||z
  |
|<   |}||   dd ||<   |dz  }||k  r(|
}|D ]  }|j                  |        |D cg c]  }t        |       }}|j                  t        |             |j                  t        t                     |S c c}w )aM  A delta list with blend lists has to be *all* blend lists.

        The value is a list is arranged as follows::

                [
                        [V0, d0..dn]
                        [V1, d0..dn]
                        ...
                        [Vm, d0..dn]
                ]

        ``V`` is the absolute coordinate value from the default font, and ``d0-dn``
        are the delta values from the *n* regions. Each ``V`` is an absolute
        coordinate from the default font.

        We want to return a list::

                [
                        [v0, v1..vm]
                        [d0..dn]
                        ...
                        [d0..dn]
                        numBlends
                        blendOp
                ]

        where each ``v`` is relative to the previous default font value.
        r   r   N)
rC   maxBlendStackr   r  r,  r   r!  r`   r   r"  )r<   rk   
numMasters	numBlendsnumStacknumBlendValuesr   numValvalListout1	firstList	deltaListr3  prevValdefaultValuerelValueListr  r  s                     r!   r,  zDictCompiler.arg_delta_blend  s   : q]
J	
*a/d((( !$"4"4q"8J!FGNCSZ8Q;6 
5  &/++G4

4 fg  iI*IAGi-
  %Qx{+g5	!&$Qx|	!Q i- %L& /	##I./0<=<$=C=JJ|I./JJww'(
 >s   4Er   )r   r   r   r1  r   r   r_   rh   rb   r%  r(  r*  r/  r,  r   rA   r!   r  r  [  s;    M,20B"DrA   r  c                 v    t        | t              rt        j                  |       S t        j                  |       S r   )rM   r  r   encodeFloatr'  )r#  s    r!   r!  r!  	  s.    #u((--))#..rA   c                   "    e Zd Z ee      Zd Zy)TopDictCompilerc                    | j                   }g }| j                  j                  t        | j                  d      r| j                  j                  rzt        | j                  d      rd }nt        | j                  j                        }|1|j                  t        || j                  j                  |              n|| j                  d<   t        | j                  d      r| j                  j                  r| j                  j                  }t        |t              sf|j                  t        |||              nIt        | j                  d      r3| j                  j                  }t        ||       }|j                  |       t        | j                  d      r| j                  j                  }t!        |      dk(  rO| j                  j"                  }	| j                  j                  D ]   }
|j                  |	|
   j$                         " t'        ||       }|j                  |       t        | j                  d      rgg }| j                  j"                  }	| j                  j                  D ]  }
|j                  |	|
           t)        ||| |      }|j                  |       t        | j                  d	      rW| j                  j*                  j-                  ||       }|j                  |       |j/                  |j1                  |             t        | j                  d
      rW| j                  j2                  j-                  ||       }|j                  |       |j/                  |j1                  |             |S )NrX   r  r`  rx   ri  r   r  r#   r|   ry   )r$   r-  r?   rL   rX   rB  r`   r*  r   r`  rM   rN   rZ  rx   r  ri  rC   r  r  r  r   r|   r\   r   ra   ry   )r<   r7   r$   rf   charsetCoder   r  varStoreCompr(  r  rS   fdSelectCompr   charStringsCompfdArrayIndexCompprivComps                   r!   ra   zTopDictCompiler.getChildren	  s   <<))1t||Y/DLL4H4H4<</"&K"/0D0D"EK&OO'1E1EtL /:DLL+t||Z0T\\5J5J<<00!(C0OO$4Wh$MNt||Z0#||44/dC-4<<,
 ||,,H8}!"ll66 LL00 EDOOK$5$C$CDE+Hd;LOOL)4<</E,,22K,, 0[./01%$vVOOOO,4<<+  $||33??NOO,-OO,88AB4<<+||++77FHOOH%OOH009:rA   N)r   r   r   r  r  r  ra   r   rA   r!   rA  rA  	  s    ./G7rA   rA  c                   6     e Zd Z ee      Zd fd	Zd Z xZS )FontDictCompilerc                 (   t         t        |   ||||       g }| j                  }t	        t        |j                        t        |j                        z
        D ]  }||j                  v r|j                  |       #|j                  j                  |      }|!|j                  |   }|j                  ||      }t        ||d       |k7  sr|j                  |        |r1t        j                  ddj!                  t	        |            z          y y )Nr#   z:Some CFF FDArray/FontDict keys were ignored upon compile: r  )r   rJ  r   r-  r  setr  r  r   r`   r  r  r*   r  r   warningr  )
r<   r-  r7   r   r$   ignoredNamesrS   r  r  r   s
            r!   r   zFontDictCompiler.__init__H	  s   .wPV.W ,,3w112S5GGH 	.Dw&
 ##D) "**..t4&"--d3D"ii9G7D$/7: ''-#	.$ KKL((6,/01 rA   c                     g }t        | j                  d      rW| j                  j                  j                  ||       }|j	                  |       |j                  |j                  |             |S Nry   )rL   r-  ry   r\   r`   r   ra   )r<   r7   rf   rH  s       r!   ra   zFontDictCompiler.getChildreni	  sY    4<<+||++77FHOOH%OOH009:rA   r   )	r   r   r   r  r  r  r   ra   r   r   s   @r!   rJ  rJ  E	  s    ./GBrA   rJ  c                   ,    e Zd ZeZ ee      Zd Zd Z	y)PrivateDictCompilerc                 R    ||z
  }||f| j                   j                  d<   || _        y rP  )r   r   r   )r<   r   r   r  s       r!   r   zPrivateDictCompiler.setPosv	  s*    |)-sI&rA   c                     g }t        | j                  d      r5|j                  | j                  j                  j	                  ||              |S r   )rL   r-  r`   r   r\   )r<   r7   rf   s      r!   ra   zPrivateDictCompiler.getChildren{	  s=    4<<)OODLL..::7DIJrA   N)
r   r   r   maxStackLimitr1  r  r  r  r   ra   r   rA   r!   rR  rR  r	  s    !M23G
rA   rR  c                   :    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	y)BaseDictNc                     |d u |d u k(  sJ i | _         g | _        || _        |y || _        || _        |8t
        j                  t        d| j                  j                  |       || _	        y y )Nr  )
r   	skipNamesr7   r	  r=   r   r   r   r   r   )r<   r7   r=   r   r$   s        r!   r   zBaseDict.__init__	  sr    $DDL111<	GGE-t~~/F/FO DK rA   c                    t         j                  t        d| j                  j                  t	        |             | j                  | j                  |       }|j                  |       |j                         | _	        | j                          y )Nz    length %s is %d)r   r   r   r   rC   decompilerClassr7   r@   getDictr   postDecompile)r<   r   decs      r!   r@   zBaseDict.decompile	  s^    ,dnn.E.Es4yQ""4<<6d{{}rA   c                      y r   r   rD   s    r!   r]  zBaseDict.postDecompile	  r(  rA   c                 ,    | j                  | |||      S r  r  r  s       r!   r\   zBaseDict.getCompiler	  r   rA   c                 (   |d d |dd  cxk(  rdk(  rt        |       | j                  j                  |d       }|| j                  j                  |      }|t        |      | j                  |   }|j                  | |      }t        | ||       |S )Nr   __)r  r   r  r  r  r*   setattr)r<   rS   rk   r  s       r!   __getattr__zBaseDict.__getattr__	  s    8tBCy(D(
 !&& )   t,=MM%%d+E= &&t$		$&dE"rA   c                    | j                   D ]H  }|| j                  v rt        | |d       }||dk7  r'| j                  |   }|j	                  |||       J t        | j                        t        | j                         z
  }|r=|j                  ddj                  t        |            z         |j                          y y )NrX   zsome keys were ignored: %sr  )r  rY  r  r  r  rL  r   r1  r  r  rp   )r<   rt   rS   rk   r  rN  s         r!   rr   zBaseDict.toXML	  s    JJ 	2Dt~~%D$-E }!2??4(DMM)T51!	2" 4<<(3tzz?:,sxx|8L/MM 	 rA   c                 d    | j                   |   }|j                  ||||       }t        | ||       y r   )r  r]  rd  )r<   rS   r   r   r  rk   s         r!   r{   zBaseDict.fromXML	  s0    t$T5'48dE"rA   )NNNNr   )
r   r   r   r   r@   r]  r\   re  rr   r{   r   rA   r!   rW  rW  	  s&    !H" 2#rA   rW  c                        e Zd ZdZ ee      Z ee      Ze	Z
 ee      ZeZ	 	 	 	 	 	 d fd	Zd Zd Zd Zd Zd Z xZS )	rz   ad  The ``TopDict`` represents the top-level dictionary holding font
    information. CFF2 tables contain a restricted set of top-level entries
    as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
    but CFF tables may contain a wider range of information. This information
    can be accessed through attributes or through the dictionary returned
    through the ``rawDict`` property:

    .. code:: python

            font = tt["CFF "].cff[0]
            font.FamilyName
            # 'Linux Libertine O'
            font.rawDict["FamilyName"]
            # 'Linux Libertine O'

    More information is available in the CFF file's private dictionary, accessed
    via the ``Private`` property:

    .. code:: python

            tt["CFF "].cff[0].Private.BlueValues
            # [-15, 0, 515, 515, 666, 666]

    c                    t         t        |   ||||       || _        || _        |r5t        t              | _         |       | _        t        t              | _
        y t        t              | _        t        t              | _
        y r  )r   rz   r   r?   r;   r  topDictOperators2r  rX   r  r  r  )r<   r7   r=   r   r;   r?   r$   r   s          r!   r   zTopDict.__init__	  sn     	gt%gtVF%K!2&)*;<DM,.DL#$56DJ)*:;DM#$45DJrA   c                     | j                   S )z.Returns a list of glyph names in the CFF font.)rX   rD   s    r!   r9   zTopDict.getGlyphOrder
      ||rA   c                     | j                   j                  d      }|y | j                  j                  |       | j                  rt        | j                        | _        y t        | j                        | _        y r  )r   r  r=   r/   r	  r
  ro  r  )r<   r   s     r!   r]  zTopDict.postDecompile
  sU    !!-0>		v<<'		2DN'		2DNrA   c                     t        | d      r| j                          t        | d      rdg| _        t        | d      rt        | d      s	g d| _        t        j	                  | |       y )Nr  r  r`  )r  r  r  r  )rL   decompileAllCharStringsrY  rW  rr   )r<   rt   s     r!   rr   zTopDict.toXML
  sW    4'((*4(\DNtU#74+GDN 	tY'rA   c                     t        | j                  j                               D ]  \  }}	 |j                           y #  t        j                  d|        xY w)NzError in charstring %s)	enumerater  rI   r@   r   error)r<   r3  r  s      r!   ro  zTopDict.decompileAllCharStrings 
  sS    &t'7'7'>'>'@A 	MAz$$&			2A6s	   >Ac                 
   d }| j                   j                         D ]1  }|j                  | j                         }|!|t        ||      }0|}3 || j                  d   d d  | _        y t        t        |            | _        y )Nr  )r  rI   
calcBoundsr   r  r  r1   r   )r<   fontBBoxr  boundss       r!   rZ   zTopDict.recalcFontBBox)
  s    **113 	&J**4+;+;<F!'(6:H%H	&  MM*5a8DM !23DMrA   r8  )r   r   r   r   r  r  r  r  r  rA  r  r  r  r  r[  r   r9   r]  rr   ro  rZ   r   r   s   @r!   rz   rz   	  sg    2 -.H !12J#M'(E'O 6(	3( 4rA   rz   c                   \     e Zd Zi Z ee      ZeZg dZ	dgZ
eZ	 	 	 	 	 	 d fd	Zd Z xZS )rC  )r  r  r  ry   ry   c                 d    t         t        |   ||||       || _        | j	                  |       y r  )r   rC  r   r}   setCFF2)r<   r7   r=   r   r;   r$   r}   r   s          r!   r   zFontDict.__init__\
  s0     	h&wfV&LVrA   c                 j    |r| j                   | _        d| _        y | j                  | _        d| _        y )NTF)	orderCFF2r  r	  orderCFFr   s     r!   ry  zFontDict.setCFF2i
  s)    DJDLDJ DLrA   r8  )r   r   r   r  r  r  r  rJ  r  r|  r{  r  r[  r   ry  r   r   s   @r!   rC  rC  9
  sI    8 H !12J$M>HI'O !rA   rC  c                   p     e Zd Z ee      Z ee      Z ee      Z	e
ZeZd fd	Zed        ZddZ xZS )r  c                     t         t        |   ||||       || _        |r>t	        t
              | _        t        t
              | _        d x| _	        | _
        d| _        y t	        t              | _        t        t              | _        d| _        y )Nr#   TF)r   r  r   r}   r  privateDictOperators2r  r  r  r  r  r	  r  )r<   r7   r=   r   r$   r}   r   s         r!   r   zPrivateDict.__init__z
  sy    k4)'4)O)*?@DM#$9:DJ 7;:D!3DL)*>?DM#$89DJ DLrA   c                     | j                   S r   )r	  rD   s    r!   in_cff2zPrivateDict.in_cff2
  rl  rA   c                 v    |t        | d      r| j                  }nd}| j                  j                  |      }|S )Nr  r   )rL   r  r}   rg  )r<   virf  s      r!   rg  zPrivateDict.getNumRegions
  s9    :tY'\\[[..r2
rA   )NNNNNr   )r   r   r   r  r  r  r  r  r  r  r  r[  rR  r  r   propertyr  rg  r   r   s   @r!   r  r  s
  sL    12H !56J+,E+O'M!  rA   r  c                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)r6   zSID -> string mapping.Nc                 ~    |
g }|| _        y t        |d      D cg c]  }t        |d       }}|| _        y c c}w )NFr#   r   r   )r2   r   r7   )r<   r=   r7   r    s       r!   r   zIndexedStrings.__init__
  sF    <G  =B$u<UVquQ2VGV Ws   :c                      t        | d | d      S )NFr#   )r   rD   s    r!   r\   zIndexedStrings.getCompiler
  s    %dD$uEErA   c                 ,    t        | j                        S r   )rC   r7   rD   s    r!   rE   zIndexedStrings.__len__
  s    4<<  rA   c                 R    |t         k  r	t        |   S | j                  |t         z
     S r   )cffStandardStringCountcffStandardStringsr7   )r<   rP  s     r!   rT   zIndexedStrings.__getitem__
  s+    ''%c**<<&< <==rA   c                 H   t        | d      s| j                          t        |d      }|t        v rt        |   }|S || j                  v r| j                  |   }|S t        | j                        t        z   }| j                  j                  |       || j                  |<   |S )NstringMappingr   r   )	rL   buildStringMappingr   cffStandardStringMappingr  rC   r7   r  r`   )r<   r    rP  s      r!   rG  zIndexedStrings.getSID
  s    t_-##%!h'((*1-C 
 $$$$$$Q'C
 
 dll#&<<CLL"$'Dq!
rA   c                     | j                   S r   r   rD   s    r!   
getStringszIndexedStrings.getStrings
  s    ||rA   c                     i | _         t        t        | j                              D ]%  }|t        z   | j                   | j                  |   <   ' y r   )r  r  rC   r7   r  rx  s     r!   r  z!IndexedStrings.buildStringMapping
  sH    3t||,- 	UE6;>T6TDt||E23	UrA   r   )r   r   r   r   r   r\   rE   rT   rG  r  r  r   rA   r!   r6   r6   
  s*     F!>UrA   r6   (  r,  spaceexclamquotedbl
numbersigndollarpercent	ampersand
quoteright	parenleft
parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon	semicolonlessequalgreaterquestionatAr   CDEFGHIJKLMNOPQRSTUVWXYZbracketleft	backslashbracketrightasciicircum
underscore	quoteleftabcr  efghr3  jkr  r{  r$  opqrr    tur  wxyz	braceleftbar
braceright
asciitilde
exclamdowncentsterlingfractionyenflorinsectioncurrencyquotesinglequotedblleftguillemotleftguilsinglleftguilsinglrightfiflendashdagger	daggerdblperiodcentered	paragraphbulletquotesinglbasequotedblbasequotedblrightguillemotrightellipsisperthousandquestiondowngraveacute
circumflextildemacronbreve	dotaccentdieresisringcedillahungarumlautogonekcaronemdashAEordfeminineLslashOslashOEordmasculineaedotlessilslashoslashoe
germandblsonesuperior
logicalnotmu	trademarkEthonehalf	plusminusThorn
onequarterdivide	brokenbardegreethornthreequarterstwosuperior
registeredminusethmultiplythreesuperior	copyrightAacuteAcircumflex	AdieresisAgraveAringAtildeCcedillaEacuteEcircumflex	EdieresisEgraveIacuteIcircumflex	IdieresisIgraveNtildeOacuteOcircumflex	OdieresisOgraveOtildeScaronUacuteUcircumflex	UdieresisUgraveYacute	YdieresisZcaronaacuteacircumflex	adieresisagravearingatildeccedillaeacuteecircumflex	edieresisegraveiacuteicircumflex	idieresisigraventildeoacuteocircumflex	odieresisograveotildescaronuacuteucircumflex	udieresisugraveyacute	ydieresiszcaronexclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall
Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleaderzerooldstyleoneoldstyletwooldstylethreeoldstylefouroldstylefiveoldstylesixoldstylesevenoldstyleeightoldstylenineoldstylecommasuperiorthreequartersemdashperiodsuperiorquestionsmall	asuperior	bsuperiorcentsuperior	dsuperior	esuperior	isuperior	lsuperior	msuperior	nsuperior	osuperior	rsuperior	ssuperior	tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior
GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmallcolonmonetary	onefittedrupiah
TildesmallexclamdownsmallcentoldstyleLslashsmallScaronsmallZcaronsmallDieresissmall
Brevesmall
CaronsmallDotaccentsmallMacronsmall
figuredashhypheninferiorOgoneksmall	RingsmallCedillasmallquestiondownsmall	oneeighththreeeighthsfiveeighthsseveneighthsonethird	twothirdszerosuperiorfoursuperiorfivesuperiorsixsuperiorsevensuperioreightsuperiorninesuperiorzeroinferioroneinferiortwoinferiorthreeinferiorfourinferiorfiveinferiorsixinferiorseveninferioreightinferiornineinferiorcentinferiordollarinferiorperiodinferiorcommainferiorAgravesmallAacutesmallAcircumflexsmallAtildesmallAdieresissmall
AringsmallAEsmallCcedillasmallEgravesmallEacutesmallEcircumflexsmallEdieresissmallIgravesmallIacutesmallIcircumflexsmallIdieresissmallEthsmallNtildesmallOgravesmallOacutesmallOcircumflexsmallOtildesmallOdieresissmallOEsmallOslashsmallUgravesmallUacutesmallUcircumflexsmallUdieresissmallYacutesmall
ThornsmallYdieresissmallz001.000z001.001z001.002z001.003BlackBoldBookLightMediumRegularRomanSemiboldi  )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  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  r  r  r  r  r  r  r  r  r  r  r  r  r3  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  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  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn     )r,  r  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  r  r  r  r  ry  rz  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  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  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  r   r.  r3  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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r     )Wr,  r  rq  rr  ru  rv  rw  rx  r  r  r  r  ry  rz  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  r  r  r  r  r  r  r  r  r  r(  r%  r-  r  r  r  r  r  r  r  r   r.  r3  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  W   )r   fontTools.miscr   r   fontTools.misc.arrayToolsr   r   fontTools.misc.textToolsr   r   r	   r
   r   r   fontTools.ttLibr   fontTools.ttLib.tables.otBaser   r   fontTools.ttLib.tablesr   rS  ior   r-   loggingr  r   	getLoggerr   r   r)   rU  objectr   r[   r   r   r   r   r   r   r   r   r2   r:   r;  r4   rH  rN  ri  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*  rB  rE  rH  r.  r/  r  r  rZ  re  rk  rl  r\  r]  r  r  r  r  r  r  r  r  r  r  rj  r  r"  r  r  r	  DictDecompilerr  r  r  r!  rA  rJ  rR  rW  rz   rC  r  r6   r  r  rC   r  r  _ir  r9  r  r:  r   r;  r   rA   r!   <module>r     s   # ( 8  # 7 7 1    	 	g! T( T(n/& /&d	I%F I%X] 
!;= !;H&-= &-R	- 	.' .1- 1DF DNh u h V"! "4 5 4 n 5  F36 3l=,v =,@H)& H)V!

))$$f 2;_ ;<o <$o 2_ 8_ $> .^ :> :z: :zf , , 
"J
(v *; ;|.D~ 8 0 (**v Bv &R? R"&*& u.lnE& 6	&
 && %01& k5$(9:& 
E4!23& z5$(9:& eT?#45& %& 1& 0& 9& 8&  .!&" 3#&$ lG%?F%&& +'&( 
G\40)&* 0+&, &-&. 0/&0 21&2 53&4 45&6 57&8 19&: 1;&< Hd$4$67=&> 0?&@ Xq"3"56A&B ($0D0FGC&D z8T+<+>?E&F y(D*:*<=G&H $(<(>?I&J Xt%6%89K& T +lG%?Fz8T+<+>?y(D*:*<=$(<(>?Xt%6%89   
 * +*+04.-''00.:-276,,(D."23; D * +*+04.-''0027(D."23/ 60$ " #  444 48M88 8c6 cL/:l :z*| *Z,  H#v H#Vi4h i4X7!x 7!t"( "J*UV *U`H T  
"88 88 
&
' :B79/34:f P  
"88 88g R  
!55 55X t   
!"&@@ @@rA   