Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 2øªjt_ã‡@s’dZddlmZddlmZddlmZmZddlmZm Z m Z m Z m Z m Z ddlmZddlmZddlmZdd lmZdd lmZdd lZdd lZdd lZejd ZejeƒZd ZdZ Gdd„de!ƒZ"Gdd„de!ƒZ#dd„Z$Gdd„de!ƒZ%Gdd„de%ƒZ&Gdd„de%ƒZ'Gdd„de%ƒZ(Gdd„de%ƒZ)Gdd „d e)ƒZ*Gd!d"„d"e)ƒZ+Gd#d$„d$e!ƒZ,Gd%d&„d&e,ƒZ-Gd'd(„d(e-ƒZ.Gd)d*„d*e,ƒZ/Gd+d,„d,e,ƒZ0Gd-d.„d.e!ƒZ1Gd/d0„d0e!ƒZ2Gd1d2„d2e!ƒZ3d3d4„Z4d5d6„Z5d7d8„Z6d9d:„Z7d;d<„Z8d=d>„Z9d?d@„Z:dAdB„Z;dCdD„ZdIdJ„Z?dKdL„Z@dMdN„ZAGdOdP„dPe!ƒZBGdQdR„dReBƒZCGdSdT„dTeBƒZDdUdV„ZEdWdX„ZFGdYdZ„dZeBƒZGGd[d\„d\eBƒZHGd]d^„d^eBƒZIGd_d`„d`eIƒZJGdadb„dbeIƒZKGdcdd„ddeIƒZLGdedf„dfeBƒZMGdgdh„dhe!ƒZNdidj„ZOdkdl„ZPdmdn„ZQdodp„ZRdqdr„ZSdsdt„ZTdudv„ZUGdwdx„dxe!ƒZVGdydz„dzeBƒZWd{d|„ZXd}d~„ZYdd€„ZZd�d‚„Z[Gdƒd„„d„eIƒZ\Gd…d†„d†eBƒZ]Gd‡dˆ„dˆeBƒZ^d‰dŠ„Z_d‹dŒ„Z`d�dŽ„ZaGd�d�„d�e!ƒZbGd‘d’„d’e!ƒZcGd“d”„d”eBƒZd�dž�dŸdš�d d edƒf�d¢�d£d dŸd›d eDƒf�d¤d d›d eDƒf�d¥�d§�d¨�d©�d«�d­�d°�d²�d´�d¶�d·d´dµd¶ddd¶ddgd f�d¸d¯d¹dµddddgd f�dº�d»�d½�d¿�dÁ�dÃ�dÅ�dÇ�dÉdÎdÏd—d eMƒf�dËdÒdÓd—deWƒfdÔdÕ�dÌd eJƒf�dÍd0d—d e]ƒf�dÎdØd—d e\ƒfdÙd2d—d eLƒfdÚdÛd—d e^ƒfg$Ze�dÏ�dÐd´dµd¶ddd¶ddgd f�dÑd0d—d e]ƒf�dÒdØd—d e\ƒfdÙd2d—d eLƒfdÚdÛd—d e^ƒfgZfdÜZgdÂZh�dÓehegdÞd d f�dÔ�dÕ�dÖ�d×�dÙ�dÛ�dÝ�dÞ�dß�dá�dã�då�dç�dé�dë�dí�dï�dð�dñdôdød—d eKƒfgZi�dòehegdÞd d f�dó�dô�dõ�dö�dø�dú�dü�dý�dþ�d�d�d�ddôdød—d eKƒfgZjdùdú„ZkekeiƒekeeƒGdûdü„düejlƒZmGdýdþ„dþejlƒZnGdÿ�d„�de!ƒZo�d�d„ZpG�d�d„�deoƒZqG�d�d„�deoƒZrG�d�d„�deoƒZsG�d �d „�d e!ƒZtG�d �d „�d etƒZuG�d �d„�detƒZvG�d�d„�detƒZwG�d�d„�de!ƒZx�d�d�d�d�d�d�d�d�d�d�d�d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�d{�d|�d}�d~�d�d€�d��d‚�dƒ�d„�d…�d†�d‡�dˆ�d‰�dŠ�d‹�dŒ�d��dŽ�d��d��d‘�d’�d“�d”�d•�d–�d—�d˜�d™�dš�d›�dœ�d��dž�dŸ�d �d¡�d¢�d£�d¤�d¥�d¦�d§�d¨�d©�dª�d«�d¬�d­�d®�d¯�d°�d±�d²�d³�d´�dµ�d¶�d·�d¸�d¹�dº�d»�d¼�d½�d¾�d¿�dÀ�dÁ�dÂ�dÃ�dÄ�dÅ�dÆ�dÇ�dÈ�dÉ�dÊ�dË�dÌ�dÍ�dÎ�dÏ�dÐ�dÑ�dÒ�dÓ�dÔ�dÕ�dÖ�d×�dØ�dÙ�dÚ�dÛ�dÜ�dÝ�dÞ�dß�dà�dá�dâ�dã�dä�då�dæ�dç�dè�dé�dê�dë�dì�dí�dî�dï�dð�dñ�dò�dó�dô�dõ�dö�d÷�dø�dù�dú�dû�dü�dý�dþ�dÿ�d�d�d�d�d�d�d�d�d�d �d �d �d �d �d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�d{�d|�d}�d~�d�d€�d��d‚�dƒ�d„�d…�d†�d‡�dˆ�d‰�dŠ�d‹�dŒ�d��dŽ�d��d��d‘�d’�d“�d”�d•�d–�d—�d˜�d™�g‡Zy�dšZze{eyƒezk� sŽt|‚iZ}xe~ezƒD]Zee}eye<� qœW�d�d�d�d�d�d�d�d�d�d�d�d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�d{�d|�d}�d~�d�d€�d��d‚�dƒ�d„�d…�d†�d‡�dˆ�d‰�dŠ�d‹�dŒ�d��dŽ�d��d��d‘�d’�d“�d”�d•�d–�d—�d˜�d™�dš�d›�dœ�d��dž�dŸ�d �d¡�d¢�d£�d¤�d¥�d¦�d§�d¨�d©�dª�d«�d¬�d­�d®�d¯�d°�d±�d²�d³�d´�dµ�d¶�d·�d¸�d¹�dº�d»�d¼�d½�d¾�d¿�dÀ�dÁ�dÂ�dÃ�dÄ�dÅ�dÆ�dÇ�dÈ�dÉ�dÊ�dË�dÌ�dÍ�dÎ�dÏ�dÐ�dÑ�dÒ�dÓ�dÔ�dÕ�dÖ�d×�dØ�dÙ�dÚ�dÛ�dÜ�dÝ�dÞ�dß�dà�dá�dâ�dã�dä�då�dæ�dç�dè�dé�dê�dë�dì�dí�dî�dï�dð�dñ�dò�dó�dô�dõ�dö�d÷gåZ€�d›Z�e{e€ƒe�k�sbt|‚�d�d�dø�dù�dú�dû�dü�dý�dþ�dÿ�d�d�d �d!�d"�dv�d�d�d�d�d�d�d�d �d �d �d.�d/�d �d �d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d€�d��d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�d±�d®�d¶�dR�dS�dT�dU�dV�dW�dX�dY�d©�d·�d¼�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�d{�d|�d}�d~�d�d€�d��d‚�dƒ�d„�d…�d†�d‡�dˆ�d‰�dŠ�d‹�dŒ�d�g¦Z‚�dœZƒe{e‚ƒeƒk�st|‚�d�d�dú�dû�dþ�dÿ�d�d�d �d!�d"�dv�d�d�d�d�d�d�d�d �d �d �d.�d/�d �d �d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d€�d��d�d�d �d!�d#�d?�d@�dA�dD�dM�dN�d±�d®�d¶�dS�dT�dU�dV�dW�dX�dY�d©�d·�d¼�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dmgWZ„�d�Z…e{e„ƒe…k�sŽt|‚d S(a+cffLib: read/write Adobe CFF fonts OpenType fonts with PostScript outlines contain a completely independent font file, 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 `_ 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 ic@s^eZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zdd d„Z dd„Z ddd„Z dd„Z dS)Ú CFFFontSetaA 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 # tt["CFF "].cff[0] # Here's your actual font data # NcCs8||_tjt|jdƒ|ƒ|dk rL|r*dnd}|j|krhtd||jfƒ‚n|jdks^tdƒ‚|jdk}|sÆtjd|jdƒƒd|_ |j |j ƒt d d „t ||d �Dƒƒ|_t||d �|_t|ƒ|_nLtjd |jdƒƒd|_|j |j ƒd g|_|j}t|||j|d �|_d|_t||d �|_|j|j_|j|j_dS)agParse 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érz2Invalid CFF 'major' version: expected %d, found %dzUnknown CFF formatÚBrcss|]}t|ƒVqdS)N)r )Ú.0Ús©rú>/tmp/pip-build-_d5lkt3n/fonttools/fontTools/cffLib/__init__.pyú Zsz'CFFFontSet.decompile..)ÚisCFF2z>HÚCFF2Font)rr)ÚotFontrÚunpackÚcffHeaderFormatÚreadÚmajorÚ ValueErrorÚAssertionErrorÚstructÚoffSizeÚseekÚhdrSizeÚlistÚIndexÚ fontNamesÚ TopDictIndexÚ topDictIndexÚIndexedStringsÚstringsÚ topDictSizeÚ getGlyphOrderÚGlobalSubrsIndexÚ GlobalSubrs)ÚselfÚfilerrÚexpected_majorÚcff2GetGlyphOrderrrrÚ decompile?s4        zCFFFontSet.decompilecCs t|jƒS)N)Úlenr*)r3rrrÚ__len__jszCFFFontSet.__len__cCs t|jƒS)N)r(r*)r3rrrÚkeysmszCFFFontSet.keyscCs|jS)N)r,)r3rrrÚvaluespszCFFFontSet.valuesc Csdt|dƒr|jƒ}nFt|tƒrR|}y|jj|ƒ}WqZtk rNt|ƒ‚YqZXnt|ƒ‚|j |S)zp Return TopDict instance identified by name (str) or index (int or any object that implements `__index__`). Ú __index__) Úhasattrr<Ú isinstanceÚstrr*Úindexr"ÚKeyErrorÚ TypeErrorr,)r3Z nameOrIndexr@ÚnamerrrÚ __getitem__ss   zCFFFontSet.__getitem__cCsð||_|dk r8|rdnd}|j|krTtd||jfƒ‚n|jd ksJtdƒ‚|jdk}|jrx| rxx|jD] }|jƒqhW|s„tƒ}nd}t|ƒ}|jj |||d�}|rÞd|_ |j t j t|ƒƒ|jƒ|_|j tj d|jƒƒn2d |_ d |_|j t j t|ƒƒ|j tj d |jƒƒ|�sNtƒ} x|jD]} | j| ƒ�q$W|j | j |||d�ƒ|j |ƒ|�sl|j |j ƒƒ|j |jj |||d�ƒx8|jD].}t|d ƒ �sª|jdk�rŒ|jƒ} | |_�qŒW|j|ƒ} x| D]} |j | ƒ�qÎW|j|ƒdS) atWrite 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. Nrrz2Invalid CFF 'major' version: expected %d, found %dzUnknown CFF format)réz>HérÚcharset)rr)rr!r"r#Z recalcBBoxesr,ÚrecalcFontBBoxr-Ú CFFWriterÚ getCompilerr'ÚaddrÚpackrÚ getDataLengthr/r$r%r)r*Úappendr2r=rGr0Ú getChildrenÚtoFile)r3r4rrr5ÚtopDictr.ÚwriterZ topCompilerr*rCrGÚchildrenÚchildrrrÚcompileƒsV              zCFFFontSet.compilecCsº|jd|jd�|jƒ|jd|jd�|jƒxL|jD]B}|jdt|ƒd�|jƒ||}|j|ƒ|jdƒ|jƒq8W|jƒ|jdƒ|jƒ|j j|ƒ|jdƒ|jƒdS)zËWrite 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)rCr2N) Ú simpletagr!ÚnewlinerWr*Úbegintagr ÚtoXMLÚendtagr2)r3Ú xmlWriterÚfontNameÚfontrrrr\Âs"        zCFFFontSet.toXMLc CsF||_t|dƒsd|_t|dƒs&d|_|dk�r |jdkr¬t|dƒsJd|_t|dƒsZd|_t|d ƒsltƒ|_t|d ƒs„g|_t ƒ|_ |d }|jj |ƒt |jd �}d |_ nd|jdk�rt|dƒsÈd|_t|d ƒsÚtƒ|_t|d ƒsìdg|_|jj}t |j|d�}t d |d ƒ|_ |j j |ƒx6|D].}t|tƒ�r6�q"|\}}}|j|||ƒ�q"Wt|dƒ�rB|jdjd k�rB|j} xÈ| D]} t| dƒ�r~|j| j_�q~Wn¢|d k�rtj} t|d ƒ�sÄtƒ|_x||D]@}t|tƒ�rÞ�qÊ|\}}}| ƒ} | j|||ƒ|jj | ƒ�qÊWn2|dk�r*t|dƒ|_n|dk�rBt|dƒ|_d S)z?Reads data from the XML element into the ``CFFFontSet`` object.r!rrWrrXr%rFr'r2r*rC)r2NrrEr)r2r6ÚVarStoreÚPrivaterV)rr=r!rWr%r'r1r2r*r+r,rNÚTopDictrGr0r>r?ÚfromXMLÚFDArrayÚvstorerarbrÚ T2CharStringÚint) r3rCÚattrsÚcontentrr_rQr6ÚelementÚfdArrayÚfontDictZsubrCharStringClassÚsubrrrrrdßst                           zCFFFontSet.fromXMLcCsNd|_|jj}td|dƒ}|jj|_||_|d}t|dƒrD|j}nd}tt ƒ}||_ ||_ xBt D]:}|d}||krb||j krˆ|j |=t||ƒrbt||ƒqbWt|dƒ�s`tƒ} |_d| _|j| _| |j_|j} | jrä| | j_n| | _tƒ} | jdƒ| j| ƒ|| _ttƒ} xJtD]B}|d}|| k�r||j k�rB|j |=t||ƒ�rt||ƒ�qWnº|j} ttƒ} xª| D]¢} | jdƒx>| j jƒD]0}|| j k�rŽ| j |=t| |ƒ�rŽt| |ƒ�qŽW| j}xJtD]B}|d}|| k�rÎ||j k�rø|j |=t||ƒ�rÎt||ƒ�qÎW�qtWtƒ} |j| |dd�| jdƒ|j | |dd�dS) zåConverts this object from CFF format to CFF2 format. This conversion is done 'in-place'. The conversion cannot be reversed. This assumes a decompiled CFF table. (i.e. that the object has been filled via :meth:`decompile`.)rNrrbrreT)r)!r!rr0r+r,Úitemsr=rbÚ buildOrderÚtopDictOperators2Úorderr6ÚtopDictOperatorsÚrawDictÚdelattrÚ FDArrayIndexrer.r2rlÚ CharStringsÚcharStringsAreIndexedÚcharStringsIndexÚFontDictÚsetCFF2rNÚprivateDictOperators2ÚprivateDictOperatorsr:rrUr&r7)r3rr6Z topDictDatarQZ privateDictZopOrderÚentryÚkeyrlÚ charStringsrmZprivateOpOrderr4rrrÚconvertCFFToCFF2#sz                        zCFFFontSet.convertCFFToCFF2)N)N)N) Ú__name__Ú __module__Ú __qualname__Ú__doc__r7r9r:r;rDrUr\rdr�rrrrr)s + ? Drc@s(eZdZdZdd„Zdd„Zdd„ZdS) rIzUHelper class for serializing CFF data to binary. Used by :meth:`CFFFontSet.compile`.cCsg|_||_dS)N)Údatar)r3rrrrÚ__init__wszCFFWriter.__init__cCs|jj|ƒdS)N)r†rN)r3ÚtablerrrrK{sz CFFWriter.addc Cs^d}d}x¤tjtd|ƒ|d}d}|g}xp|jD]f}t|dƒrh||jƒ}t|tƒrt|jrt|jƒ|_n |t |ƒ}t|dƒrŠ|j ||ƒ|}|j |ƒq2W||kr¦P|}q Wtjtdƒ|j ƒ}|jrÞt jd|jƒ|jd<n"t|d ƒ|_t jd|jƒ|jd<dg}xD|jD]:}t|d ƒ�r*|j|ƒn |j|ƒ|j |j ƒ|ƒ�qW||k�sZt‚dS) Nrz CFFWriter.toFile() iteration: %drrMÚsetPosz#CFFWriter.toFile() writing to file.z>HrrPéÿÿÿÿ)ÚlogÚDEBUGr†r=rMr>ÚTopDictIndexCompilerrr/r8r‰rNÚtellr$rLÚ calcOffSizer%rPÚwriter#) r3r4Z lastPosListÚcountÚposZposListÚitemÚendPosÚbeginrrrrP~sB            zCFFWriter.toFileN)r‚rƒr„r…r‡rKrPrrrrrItsrIcCs2|dkrd}n |dkrd}n|dkr*d}nd}|S)NéririrrFr)Z largestOffsetr%rrrr�¥sr�c@s:eZdZdZd dd„Zdd„Zdd„Zd d „Zd d „ZdS)Ú IndexCompilerz‚Base class for writing CFF `INDEX data `_ to binary.NcCsB|dkr$t|dƒr$|j}|dk s$t‚||_|j||ƒ|_||_dS)Nr)r=rr#ÚgetItemsroÚparent)r3ror.r™rrrrr‡µs  zIndexCompiler.__init__cCs|S)Nr)r3ror.rrrr˜½szIndexCompiler.getItemscCsX|jrPd}|g}xB|jD]2}t|dƒr4||jƒ}n |t|ƒ}|j|ƒqWng}|S)NrrM)ror=rMr8rN)r3r’Úoffsetsr“rrrÚ getOffsetsÀs   zIndexCompiler.getOffsetscCsV|jr d}nd}|jrN|jƒd}t|ƒ}|dt|jƒd||d}n|}|S)NrFrrrŠ)rror›r�r8)r3Z countSizeZ lastOffsetr%Ú dataLengthrrrrMÏs $zIndexCompiler.getDataLengthc CsÔ|jƒ}|jr t|t|jƒƒnt|t|jƒƒ|jrÐt|dƒ}t||ƒ| }tj }x:|D]2}|d|ƒ|d…}t|ƒ| ks†t ‚|j |ƒq^Wx:|jD]0}t |dƒr¶|j |ƒqœt|dd�}|j |ƒqœWdS)Nrz>lrPÚlatin1)ÚencodingrŠ)r›rÚ writeCard32r8roÚ writeCard16r�Ú writeCard8r$rLr#r�r=rPr ) r3r4ršr%rLÚoffsetÚ binOffsetr“r†rrrrPäs$       zIndexCompiler.toFile)N) r‚rƒr„r…r‡r˜r›rMrPrrrrr—±s  r—c@seZdZdd„ZdS)ÚIndexedStringsCompilercCs|jS)N)r.)r3ror.rrrr˜þszIndexedStringsCompiler.getItemsN)r‚rƒr„r˜rrrrr¤üsr¤csHeZdZdZdd„Zdd„Z‡fdd„Z‡fdd „Z‡fd d „Z‡Z S) r�z/Helper class for writing the TopDict to binary.cCs(g}x|D]}|j|j||ƒƒq W|S)N)rNrJ)r3ror.Úoutr“rrrr˜s zTopDictIndexCompiler.getItemscCs(g}x|jD]}|j|j|ƒƒq W|S)N)roÚextendrO)r3r.rSrQrrrrO s z TopDictIndexCompiler.getChildrencs.|jrd|jdjƒg}|Stt|ƒjƒSdS)Nr)rrorMÚsuperr�r›)r3rš)Ú __class__rrr›szTopDictIndexCompiler.getOffsetscs*|jr|jdjƒ}|Stt|ƒjƒSdS)Nr)rrorMr§r�)r3rœ)r¨rrrMsz"TopDictIndexCompiler.getDataLengthcs,|jr|jdj|ƒntt|ƒj|ƒdS)Nr)rrorPr§r�)r3r4)r¨rrrPszTopDictIndexCompiler.toFile) r‚rƒr„r…r˜rOr›rMrPÚ __classcell__rr)r¨rr�s   r�c@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) ÚFDArrayIndexCompilerz¨Helper class for writing the `Font DICT INDEX `_ to binary.cCs(g}x|D]}|j|j||ƒƒq W|S)N)rNrJ)r3ror.r¥r“rrrr˜+s zFDArrayIndexCompiler.getItemscCs(g}x|jD]}|j|j|ƒƒq W|S)N)ror¦rO)r3r.rSrmrrrrO1s z FDArrayIndexCompiler.getChildrencCsÂ|jƒ}|jr t|t|jƒƒnt|t|jƒƒt|dƒ}t||ƒ| }tj }x:|D]2}|d|ƒ|d…}t|ƒ| ks€t ‚|j |ƒqXWx.|jD]$}t |dƒr°|j |ƒq–|j |ƒq–WdS)Nrz>lrPrŠ)r›rrŸr8ror r�r¡r$rLr#r�r=rP)r3r4ršr%rLr¢r£r“rrrrP7s       zFDArrayIndexCompiler.toFilecCs||jjd<dS)Nre)r™rt)r3r’r”rrrr‰KszFDArrayIndexCompiler.setPosN)r‚rƒr„r…r˜rOrPr‰rrrrrª&s rªc@seZdZdZdd„ZdS)ÚGlobalSubrsCompilerz¤Helper class for writing the `global subroutine INDEX `_ to binary.cCs.g}x$|D]}|j|jƒ|j|jƒq W|S)N)rUrrNÚbytecode)r3ror.r¥Úcsrrrr˜Ss   zGlobalSubrsCompiler.getItemsN)r‚rƒr„r…r˜rrrrr«Osr«c@seZdZdZdd„ZdS)Ú SubrsCompilerz£Helper class for writing the `local subroutine INDEX `_ to binary.cCs||jj}||jjd<dS)NÚSubrs)r™r’rt)r3r’r”r¢rrrr‰_s zSubrsCompiler.setPosN)r‚rƒr„r…r‰rrrrr®[sr®c@s eZdZdZdd„Zdd„ZdS)ÚCharStringsCompilerzžHelper class for writing the `CharStrings INDEX `_ to binary.cCs.g}x$|D]}|j|jƒ|j|jƒq W|S)N)rUrrNr¬)r3ror.r¥r­rrrr˜gs   zCharStringsCompiler.getItemscCs||jjd<dS)Nrw)r™rt)r3r’r”rrrr‰nszCharStringsCompiler.setPosN)r‚rƒr„r…r˜r‰rrrrr°dsr°c@sXeZdZdZeZddd„Zdd„Zdd„Zd d „Z d d „Z d d„Z ddd„Z dd„Z dS)r)z¡This 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 Cs<|dk|dkkst‚g|_|jj}|dkr.dS||_tjtd||jƒƒ||_|r\t |ƒ}nt |ƒ}|dkrpdSdg||_t |ƒ}tjtd||ƒ|dks¨td|ƒ‚g|_ }dd|}xBt |dƒD]2}|j|ƒ} || } tjd| ƒ\} |jt| ƒƒqÌW|jƒd|_|j|j|d ƒtjtd ||jƒƒdS) Nzloading %s at %srz index count: %s offSize: %srFzoffSize too large: %sórz>Lz end of %s at %srŠ)r#ror¨r‚Ú_isCFF2r‹rŒrŽr4Ú readCard32Ú readCard16Ú readCard8ršÚranger r$rrNrhÚ offsetBaser&) r3r4rrCr‘r%ršÚpadr@Úchunkr¢rrrr‡ys6     zIndex.__init__cCs t|jƒS)N)r8ro)r3rrrr9—sz Index.__len__cCs†|j|}|dk r|S|j||j}|j|d|j|}|j}|j|ƒ|j|ƒ}t|ƒ|ksht‚|j||||ƒ}||j|<|S)Nr) roršr·r4r&r r8r#Ú produceItem)r3r@r“r¢Úsizer4r†rrrrDšs    zIndex.__getitem__cCs||j|<dS)N)ro)r3r@r“rrrÚ __setitem__¨szIndex.__setitem__cCs|S)Nr)r3r@r†r4r¢rrrrº«szIndex.produceItemcCs|jj|ƒdS)zAdd an item to an INDEX.N)rorN)r3r“rrrrN®sz Index.appendcCs|j||||d�S)N)r)Ú compilerClass)r3r.r™rrrrrJ²szIndex.getCompilercCs|jdd…=dS)zEmpty the INDEX.N)ro)r3rrrÚclearµsz Index.clear)NN)N)r‚rƒr„r…r—r½r‡r9rDr¼rºrNrJr¾rrrrr)rs  r)csReZdZdZeZejZejZ d ‡fdd„ Z dd„Z dd„Z d d „Z d d „Z‡ZS)r1aä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)) # # -64 callgsubr <-- Subroutine which implements the dieresis mark # tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG # tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT # ("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 `) Ncs8tt|ƒj||d�||_||_|r*||_|r4||_dS)N)r)r§r1r‡Ú globalSubrsÚprivateÚfdSelectrl)r3r4r¿rÀrÁrlr)r¨rrr‡àszGlobalSubrsIndex.__init__cCsn|jdk r|j}nJt|dƒrX|jdk rXt|dƒrF|jdk rF|j|}nd}|j|j}nd}|j|||jd�S)NrlrÁr)rÀr¿)rÀr=rlrÁrbÚ subrClassr¿)r3r@r†r4r¢rÀÚfdIndexrrrrºês  zGlobalSubrsIndex.produceItemcCs€|jdƒ|jƒxhtt|ƒƒD]X}||}|jƒrF|jd|dd�n|jd|d�|jƒ|j|ƒ|jdƒ|jƒq WdS)zå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)r@Úraw)r@N)ÚcommentrZr¶r8ÚneedsDecompilationr[r\r])r3r^Úirnrrrr\÷s   zGlobalSubrsIndex.toXMLcCs0|dkr dS|jƒ}|j|||ƒ|j|ƒdS)NrÄ)rÂrdrN)r3rCrirjrnrrrrds zGlobalSubrsIndex.fromXMLcCs$d}t|dƒr|j|}|||fS)NrÁ)r=rÁ)r3r@ÚselrrrÚgetItemAndSelectors  z#GlobalSubrsIndex.getItemAndSelector)NNNNNN)r‚rƒr„r…r«r½rrgrÂÚcharStringClassr‡rºr\rdrÊr©rr)r¨rr1ºs   r1c@seZdZdZeZdS)Ú SubrsIndexz³This 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½rrrrrÌsrÌcs6eZdZdZeZd ‡fdd„ Zdd„Zdd „Z‡Z S) r+aSThis 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] # tt["CFF "].cff.topDictIndex[0] # Nrcs¶|dk|dkkst‚||_|dk rž|rž||_g|_|jj}tjtd||jƒƒ||_ d}dg||_d|g|_ |jƒ|_ |j |j |ƒtjtd||jƒƒnt t|ƒj||d�dS)Nzloading %s at %srrz end of %s at %s)r)r#r6r²ror¨r‚r‹rŒrŽr4ršr·r&r§r+r‡)r3r4r6ZtopSizerrCr‘)r¨rrr‡6s    zTopDictIndex.__init__cCs*t|j|||j|j|jd�}|j|ƒ|S)N)r)rcr.r2r6r²r7)r3r@r†r4r¢ÚtoprrrrºJs   zTopDictIndex.produceItemcCsPxJtt|ƒƒD]:}|jd|d�|jƒ||j|ƒ|jdƒ|jƒqWdS)Nrz)r@)r¶r8r[rZr\r])r3r^rÈrrrr\Qs  zTopDictIndex.toXML)NNrN) r‚rƒr„r…r�r½r‡rºr\r©rr)r¨rr+&s  r+c@s(eZdZeZdd„Zdd„Zdd„ZdS)rvcCsPxJtt|ƒƒD]:}|jd|d�|jƒ||j|ƒ|jdƒ|jƒqWdS)Nrz)r@)r¶r8r[rZr\r])r3r^rÈrrrr\^s  zFDArrayIndex.toXMLcCs*t|j|||j|j|jd�}|j|ƒ|S)N)rrf)rzr.r2r²rfr7)r3r@r†r4r¢rmrrrrºfs   zFDArrayIndex.produceItemcCsR|dkr dStƒ}x0|D](}t|tƒr(q|\}}}|j|||ƒqW|j|ƒdS)Nrz)rzr>r?rdrN)r3rCrirjrmrkrrrrdms   zFDArrayIndex.fromXMLN)r‚rƒr„rªr½r\rºrdrrrrrvZsrvc@sFeZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dS)Ú VarStoreDataNcCs||_d|_||_tƒ|_dS)N)r4r†Ú otVarStorer r`)r3r4rÏrrrr‡{szVarStoreData.__init__cCsh|jrdGdd„dtƒ}|did�}t|jƒ}|jj|ƒ|_i}t|j|ƒ}tjƒ|_|jj ||j ƒ|S)Nc@seZdZdd„ZdS)z+VarStoreData.decompile..GlobalStatecSs||_||_dS)N)Ú tableTypeÚ cachingStats)r3rÐrÑrrrr‡„sz4VarStoreData.decompile..GlobalState.__init__N)r‚rƒr„r‡rrrrÚ GlobalStateƒsrÒra)rÐrÑ) r4Úobjectr´r r†rÚotrarÏr7r`)r3rÒZ globalStateÚlengthÚreaderrrrr7�s    zVarStoreData.decompilecCs$tƒ}|jj||jƒ|jƒ|_dS)N)r rÏrUr`Z getAllDatar†)r3rRrrrrU‘szVarStoreData.compilecCs|jj||jƒdS)N)rÏr\r`)r3r^rCrrrÚwriteXML˜szVarStoreData.writeXMLcCsFtjƒ|_x6|D].}t|tƒr|\}}}|jj||||jƒqqWdS)N)rÔrarÏr>Útuplerdr`)r3rCrirjr™rkrrrÚxmlRead›s    zVarStoreData.xmlReadcCs t|jƒS)N)r8r†)r3rrrr9¥szVarStoreData.__len__cCs|jj|}|j}|S)N)rÏZVarDataZVarRegionCount)r3ZvsIndexZvarDataÚ numRegionsrrrÚ getNumRegions¨s zVarStoreData.getNumRegions)NN) r‚rƒr„r‡r7rUr×rÙr9rÛrrrrrÎys  rÎc@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „ZdS) ÚFDSelectNc Cs´|�r¤t|ƒ|_|jdkr@ddlm}|d|j|ƒƒjƒ|_�q°|jdkrâdg|}t|ƒ}d}d}xHt|ƒD]<} t|ƒ} |dk ržxt|| ƒD] } ||| <qŽW| }t|ƒ}qnW|dk rÚt|ƒ} xt|| ƒD] } ||| <qÊW||_nÀ|jdk�r�dg|}t|ƒ}d}d}xNt|ƒD]B} t|ƒ} |dk �rFxt|| ƒD]} ||| <�q4W| }t|ƒ}�qW|dk �rˆt|ƒ} xt|| ƒD]} ||| <�qvW||_nd�s°t d|ƒ‚n ||_g|_dS)Nr)ÚarrayrrrFFzunsupported FDSelect format: %s) rµÚformatrÝr ÚtolistÚgidArrayr´r¶r³r#) r3r4Ú numGlyphsrÞrÝràÚnRangesÚfdÚprevrÈÚfirstÚglyphIDrrrr‡°sT            zFDSelect.__init__cCs t|jƒS)N)r8rà)r3rrrr9ászFDSelect.__len__cCs |j|S)N)rà)r3r@rrrrDäszFDSelect.__getitem__cCs||j|<dS)N)rà)r3r@Ú fdSelectValuerrrr¼çszFDSelect.__setitem__cCs|jj|ƒdS)N)ràrN)r3rçrrrrNêszFDSelect.append)NNN)r‚rƒr„r‡r9rDr¼rNrrrrrÜ®s  1rÜc@sfeZdZdZddd„Zdd„Zdd„Zd d „ZeZd d „Z d d„Z dd„Z dd„Z dd„Z dd„ZdS)rwañ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"] # 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 CsŠ||_|dk rXt||||||d�|_i|_}x tt|ƒƒD]} | ||| <q|j|j}qHd}nd}|j||fSdS)NrlrÁr)rxr€ryrÊr=Ú fdSelectIndex)r3rCr@rÉrrrrÊ2s    zCharStrings.getItemAndSelectorcCs t|jƒƒ}xŽ|D]†}|j|ƒ\}}|jƒr4dg}ng}|dkrX|jdd|fg|ƒn|jdd|fd|fg|ƒ|jƒ|j|ƒ|jdƒ|jƒqWdS)NrÅrrÄrCrê)rÅr)Úsortedr:rÊrÇr[rZr\r])r3r^ÚnamesrCZcharStrrêrÅrrrr\@s    zCharStrings.toXMLc Cs¾x¸|D]°}t|tƒrq|\}}}|dkr*qd}t|dƒrpyt|dƒ}Wntk r`d}YnX|j|j}n|j}|d}tj }|||j d�} | j |||ƒ|dkr®|| _ | ||<qWdS) NrÄrrlrêrrC)rÀr¿rŠ) r>r?r=r rArlrbrÀrrgr¿rdrê) r3rCrirjrkZfdIDrÀÚ glyphNamerËrérrrrdSs.      zCharStrings.fromXML)N)r‚rƒr„r…r‡r:r;rèÚ __contains__r9rDr¼rÊr\rdrrrrrwîs rwcCst|jdƒƒS)Nr)rr )r4rrrrµosrµcCstjd|jdƒƒ\}|S)Nz>Hr)r$rr )r4rVrrrr´ssr´cCstjd|jdƒƒ\}|S)Nz>LrF)r$rr )r4rVrrrr³xsr³cCs|jt|ƒƒdS)N)r�r)r4rVrrrr¡}sr¡cCs|jtjd|ƒƒdS)Nz>H)r�r$rL)r4rVrrrr �sr cCs|jtjd|ƒƒdS)Nz>L)r�r$rL)r4rVrrrrŸ…srŸcCst|ƒS)N)r)rVrrrÚ packCard8‰srïcCs tjd|ƒS)Nz>H)r$rL)rVrrrÚ packCard16�srðcCs tjd|ƒS)Nz>L)r$rL)rVrrrÚ packCard32‘srñcCs,i}x"|D]\}}}}}||f||<q W|S)Nr)rˆÚdÚoprCÚargÚdefaultÚconvrrrÚbuildOperatorDict•sr÷cCsXi}xN|D]F\}}}}}t|tƒrrØr)rˆròrórCrôrõrörrrÚbuildOpcodeDictœs røcCs*g}x |D]\}}}}}|j|ƒq W|S)N)rN)rˆÚlrórCrôrõrörrrrp§srpcCs0i}x&|D]\}}}}}|dk r |||<q W|S)Nr)rˆròrórCrôrõrörrrÚ buildDefaults®s  rúcCs(i}x|D]\}}}}}|||<q W|S)Nr)rˆròrórCrôrõrörrrÚbuildConverters¶s rûc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚSimpleConverterc CsBt|dƒs|j||ƒS|j}|jƒ}z |j||ƒS|j|ƒXdS)Nr4)r=Ú_readr4rŽr&)r3r™rVr4r’rrrr ¿s   zSimpleConverter.readcCs|S)Nr)r3r™rVrrrrýÉszSimpleConverter._readcCs|S)Nr)r3r™rVrrrr�ÌszSimpleConverter.writecCs|j||d�|jƒdS)N)rV)rYrZ)r3r^rCrVrrrÚxmlWriteÏszSimpleConverter.xmlWritecCs|dS)NrVr)r3rCrirjr™rrrrÙÓszSimpleConverter.xmlReadN)r‚rƒr„r rýr�rþrÙrrrrrü½s  rüc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚASCIIConvertercCs t|dd�S)NÚascii)rž)r )r3r™rVrrrrýÙszASCIIConverter._readcCs t|dd�S)Nr)rž)r )r3r™rVrrrr�ÜszASCIIConverter.writecCs"|j|t|dd�d�|jƒdS)Nr)rž)rV)rYr rZ)r3r^rCrVrrrrþßszASCIIConverter.xmlWritecCst|ddd�S)NrVr)rž)r )r3rCrirjr™rrrrÙãszASCIIConverter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrrÿ×srÿc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚLatin1ConvertercCs t|dd�S)Nr�)rž)r )r3r™rVrrrrýészLatin1Converter._readcCs t|dd�S)Nr�)rž)r )r3r™rVrrrr�ìszLatin1Converter.writecCs<t|dd�}|dkr"tjdd|ƒ}|j||d�|jƒdS) Nr�)ržÚNoticeÚ Copyrightz [\r\n]\s+ú )rV)rr)r ÚreÚsubrYrZ)r3r^rCrVrrrrþïs  zLatin1Converter.xmlWritecCst|ddd�S)NrVr�)rž)r )r3rCrirjr™rrrrÙöszLatin1Converter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrrçsrc Cs&y t|ƒ}Wnt|ƒ}YnX|S)N)rhÚfloat)rrVrrrÚparseNumús  rcCsdg}xF|D]>}t|tƒrq |\}}}|djƒ}dd„|Dƒ}|j|ƒq Wt|ƒdkr`|d}|S)NrVcSsg|] }t|ƒ‘qSr)Úeval)rÚvalrrrú sz"parseBlendList..rr)r>r?ÚsplitrNr8)rÚ valueListrkrCrirjÚ blendListrrrÚparseBlendLists     rc@seZdZdd„Zdd„ZdS)ÚNumberConvertercCs„t|tƒrj|j|ƒ|jƒ|jƒdjdd„|Dƒƒ}|jt|d�|jƒ|jƒ|j |ƒ|jƒn|j||d�|jƒdS)NrcSsg|] }t|ƒ‘qSr)r?)rr rrrr sz,NumberConverter.xmlWrite..)rV) r>r(r[rZÚindentÚjoinrYÚkBlendDictOpNameÚdedentr])r3r^rCrVÚ blendValuerrrrþs    zNumberConverter.xmlWritecCs.|jddƒ}|dkrt|ƒ}n t|dƒ}|S)NrV)Úgetrr)r3rCrirjr™Ú valueStringrVrrrrÙ s    zNumberConverter.xmlReadN)r‚rƒr„rþrÙrrrrrsrc@seZdZdd„Zdd„ZdS)ÚArrayConvertercCs®|r€t|dtƒr€|j|ƒ|jƒ|jƒx6|D].}djdd„|Dƒƒ}|jt|d�|jƒq2W|jƒ|j |ƒ|jƒn*djdd„|Dƒƒ}|j||d�|jƒdS)NrrcSsg|] }t|ƒ‘qSr)r?)rr rrrr 0sz+ArrayConverter.xmlWrite..)rVcSsg|] }t|ƒ‘qSr)r?)rr rrrr 7s) r>r(r[rZrrrYrrr])r3r^rCrVr rrrrrþ*s     zArrayConverter.xmlWritecCs8|jddƒ}|dkrt|ƒ}n|jƒ}dd„|Dƒ}|S)NrVcSsg|] }t|ƒ‘qSr)r)rrVrrrr Asz*ArrayConverter.xmlRead..)rrr )r3rCrirjr™rr r;rrrrÙ;s   zArrayConverter.xmlReadN)r‚rƒr„rþrÙrrrrr)src@seZdZdd„Zdd„ZdS)ÚTableConvertercCs2|j|ƒ|jƒ|j|ƒ|j|ƒ|jƒdS)N)r[rZr\r])r3r^rCrVrrrrþGs    zTableConverter.xmlWritecCs@|jƒƒ}x0|D](}t|tƒr q|\}}}|j|||ƒqW|S)N)ÚgetClassr>r?rd)r3rCrirjr™ÚobrkrrrrÙNs    zTableConverter.xmlReadN)r‚rƒr„rþrÙrrrrrEsrc@s$eZdZdd„Zdd„Zdd„ZdS)ÚPrivateDictConvertercCstS)N)Ú PrivateDict)r3rrrrZszPrivateDictConverter.getClassc Cs~|\}}|j}|j}y |j}Wntk r6d}YnXt|j||||d�}|j|ƒ|j|ƒ} t| ƒ|kspt ‚|j | ƒ|S)N)rrf) r4r²rfÚAttributeErrorrr.r&r r8r#r7) r3r™rVr»r¢r4rrfZprivr†rrrrý]s     zPrivateDictConverter._readcCsdS)Nr)rrr)r3r™rVrrrr�mszPrivateDictConverter.writeN)r‚rƒr„rrýr�rrrrrXsrc@s$eZdZdd„Zdd„Zdd„ZdS)ÚSubrsConvertercCstS)N)rÌ)r3rrrrsszSubrsConverter.getClasscCs(|j}|j}|j|j|ƒt||d�S)N)r)r4r²r&r¢rÌ)r3r™rVr4rrrrrývszSubrsConverter._readcCsdS)Nrr)r3r™rVrrrr�|szSubrsConverter.writeN)r‚rƒr„rrýr�rrrrrqsrc@s$eZdZdd„Zdd„Zdd„ZdS)ÚCharStringsConverterc Csv|j}|j}|j}|j}t|dƒrD|j}t|dƒr:|j}nd}d} nd\}}|j} |j|ƒt |||| |||d�} | S)NrerÜ)r)NN) r4r²rGr2r=rerÜrbr&rw) r3r™rVr4rrGr¿rlrÁrÀr€rrrrý‚s    zCharStringsConverter._readcCsdS)Nrr)r3r™rVrrrr�–szCharStringsConverter.writec Csdt|dƒr,|j}t|dƒr"|j}nd}d}n|jdd}}}tdd|j|||ƒ}|j|||ƒ|S)NrerÜ)r=rerÜrbrwr2rd) r3rCrirjr™rlrÁrÀr€rrrrÙ™s  zCharStringsConverter.xmlReadN)r‚rƒr„rýr�rÙrrrrr €sr c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚCharsetConverterc Csžt|dƒ}|dk�r"|j}|j}|j|ƒtjtd|ƒt|ƒ}|dkrZt|||j|ƒ}n(|dksj|dkr~t |||j||ƒ}nt ‚t |ƒ|ks’t ‚tjtd|j ƒƒi}g} xn|D]f} | |k�r|| } x | dt| ƒ|krè| d7} qÊW| d|| <| dt| ƒ} d|| <| j| ƒq²W| }nT|�s4d|jk�rH|dk�sBt ‚d}n.|dk�rXt}n|dk�rht}n|dk�rvt}|�ršt |ƒ|jk�rš|d|j…}|S) NÚROSrzloading charset at %srrz charset end at %sú#rw)r=rár4r&r‹rŒrµÚ parseCharset0r.Ú parseCharsetÚNotImplementedErrorr8r#rŽr?rNrtÚcffISOAdobeStringsÚcffIExpertStringsÚcffExpertSubsetStrings) r3r™rVÚisCIDrár4rÞrGZallNamesZ newCharsetríÚnrrrrý¯sL          zCharsetConverter._readcCsdS)Nrr)r3r™rVrrrr�ÝszCharsetConverter.writecCs|jdƒ|jƒdS)Nz8charset is dumped separately as the 'GlyphOrder' element)rÆrZ)r3r^rCrVrrrrþàs zCharsetConverter.xmlWritecCsdS)Nr)r3rCrirjr™rrrrÙçszCharsetConverter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrr!®s.r!c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚCharsetCompilercCs\|ddkst‚t|jdƒ}t|||ƒ}t|||ƒ}t|ƒt|ƒkrL||_n||_||_dS)Nrz.notdefr")r#r=ÚdictObjÚ packCharset0Ú packCharsetr8r†r™)r3r.rGr™r*Údata0r†rrrr‡ís   zCharsetCompiler.__init__cCs||jjd<dS)NrG)r™rt)r3r’r”rrrr‰øszCharsetCompiler.setPoscCs t|jƒS)N)r8r†)r3rrrrMûszCharsetCompiler.getDataLengthcCs|j|jƒdS)N)r�r†)r3r4rrrrPþszCharsetCompiler.toFileN)r‚rƒr„r‡r‰rMrPrrrrr,ës r,cCs€d}ttdfttdfttdfg}t|ƒ}xR|D]J\}}}|dk rBP||krLq.|}x&t|ƒD]}||||krZd}PqZWq.W|S)Nrrr)ÚcffISOAdobeStringCountr'ÚcffExpertStringCountr(ÚcffExpertSubsetStringCountr)r8r¶)rGZpredefinedCharSetValZpredefinedCharSetsZlcsZcntZpcsÚcsvrÈrrrÚ getStdCharSets   r5cCst|dd…ƒS)Nr)rh)rCr.rrrÚgetCIDfromNamesr6cCs |j|ƒS)N)ÚgetSID)rCr.rrrÚgetSIDfromNamesr8cCsNd}t|ƒg}|rt}nt}x(|dd…D]}|jt|||ƒƒƒq*Wt|ƒS)Nrr)rïr6r8rNrðr)rGr*r.Úfmtr†Ú getNameIDrCrrrr.s r.c Csôd}g}d}d}|rt}nt}xb|dd…D]R}|||ƒ} |dkrH| }n2|d| krz||} | dkrhd}|j|| fƒ| }| }q,W|r¨||} | dkršd}|j|| fƒt|ƒg} |dkrÀt} nt} x&|D]\}} | jt|ƒ| | ƒƒqÊWt| ƒS)Nrréÿr)r6r8rNrïrðr) rGr*r.r9ÚrangesråÚendr:rCÚSIDÚnLeftr†Ú nLeftFuncrrrr/,s<   r/cCsrdg}|rBxbt|dƒD]$}t|ƒ}|jdt|ƒjdƒƒqWn,x*t|dƒD]}t|ƒ}|j||ƒqPW|S)Nz.notdefrÚcidrE)r¶r´rNr?Úzfill)rár4r.r*rGrÈÚCIDr>rrrr$Qsr$c Cs®dg}d}|dkrt}nt}xŒ||kr¨t|ƒ}||ƒ} |rpx^t||| dƒD]} |jdt| ƒjdƒƒqNWn*x(t||| dƒD]} |j|| ƒq„W|| d}qW|S)Nz.notdefrrArE)rµr´r¶rNr?rB) rár4r.r*r9rGr‘r@rår?rCr>rrrr%^s r%c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚEncodingCompilercCs\t|tƒ st‚t|jj||jƒ}t|jj||jƒ}t|ƒt|ƒkrL||_ n||_ ||_ dS)N) r>r?r#Ú packEncoding0r-rGr.Ú packEncoding1r8r†r™)r3r.ržr™r0Zdata1rrrr‡tszEncodingCompiler.__init__cCs||jjd<dS)NÚEncoding)r™rt)r3r’r”rrrr‰~szEncodingCompiler.setPoscCs t|jƒS)N)r8r†)r3rrrrM�szEncodingCompiler.getDataLengthcCs|j|jƒdS)N)r�r†)r3r4rrrrP„szEncodingCompiler.toFileN)r‚rƒr„r‡r‰rMrPrrrrrDrs rDc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚEncodingConvertercCs¤|dkr dS|dkrdS|dks$t‚|j}|j|ƒtjtd|ƒt|ƒ}|d@}|r^tdƒ‚|d@}|dkr‚t|j|||j ƒ}n|dkrœt |j|||j ƒ}|SdS) NrÚStandardEncodingrÚExpertEncodingzloading Encoding at %sé€z*Encoding supplements are not yet supportedé) r#r4r&r‹rŒrµr&ÚparseEncoding0rGr.ÚparseEncoding1)r3r™rVr4r9ÚhaveSupplementržrrrrýŠs(     zEncodingConverter._readcCs|dkr dS|dkrdSdS)NrIrrJrr)r3r™rVrrrr�¡s zEncodingConverter.writecCsŒ|dkr"|j||d�|jƒdS|j|ƒ|jƒx@tt|ƒƒD]0}||}|dkrB|jdt|ƒ|d�|jƒqBW|j|ƒ|jƒdS)NrIrJ)rCz.notdefÚmap)ÚcoderC)rIrJ)rYrZr[r¶r8Úhexr])r3r^rCrVrQrírrrrþ¨s   zEncodingConverter.xmlWritec Cs^d|kr|dSdgd}x>|D]6}t|tƒr0q |\}}}t|dƒ}|d}|||<q W|S)NrCz.notdefr–rQ)r>r?r ) r3rCrirjr™ržrkrQrírrrrÙ·s      zEncodingConverter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrrHˆsrHcCsJt|ƒ}dgd}x2td|dƒD] }t|ƒ}|dkr"||||<q"W|S)Nz.notdefr–rr)rµr¶)rGr4rOr.ZnCodesržrærQrrrrMÅs rMc Cstt|ƒ}dgd}d}xXt|ƒD]L}t|ƒ}t|ƒ} x.t||| dƒD]}||||<|d}qHW|d}q W|S)Nz.notdefr–r)rµr¶) rGr4rOr.râržrærÈrQr?rrrrNÏs    rNc CsÆd}i}x,tt|ƒƒD]}||}|dkr|||<qWg}x(|dd…D]}|j|ƒ}|j|ƒqHWx|r€|ddkr€|jƒqfWt|ƒtt|ƒƒg}x&|D]}|dkr¬d}|jt|ƒƒqœWt|ƒS)Nrz.notdefrrŠ)r¶r8rrNÚpoprïr) rGržr.r9ÚmrQrCÚcodesr†rrrrEÝs$    rEc Cs&d}i}x,tt|ƒƒD]}||}|dkr|||<qWg}d}d} xX|dd…D]H}|j|dƒ}|dkrn|}n&| d|kr”| |} |j|| fƒ|}|} qPW| |} |j|| fƒx |rÒ|dddkrÒ|jƒq´Wt|ƒtt|ƒƒg} x4|D],\}} |dk�rd}| jt|ƒt| ƒƒqîWt| ƒS)Nrz.notdefrrŠrŠrŠrŠ)r¶r8rrNrSrïr) rGržr.r9rTrQrCr<rår=r?r†rrrrFôs8     rFc@s$eZdZdd„Zdd„Zdd„ZdS)ÚFDArrayConverterc Cs`y |j}Wntk r"d}YnX|j}|j}|j|ƒt||d�}||_|j|_|j|_|S)N)r) rarr4r²r&rvrfr.r2)r3r™rVrfr4rrlrrrrýs    zFDArrayConverter._readcCsdS)Nrr)r3r™rVrrrr�&szFDArrayConverter.writecCs<tƒ}x0|D](}t|tƒrq |\}}}|j|||ƒq W|S)N)rvr>r?rd)r3rCrirjr™rlrkrrrrÙ)s   zFDArrayConverter.xmlReadN)r‚rƒr„rýr�rÙrrrrrVsrVc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚFDSelectConvertercCs |j}|j|ƒt||jƒ}|S)N)r4r&rÜrá)r3r™rVr4rÁrrrrý5s  zFDSelectConverter._readcCsdS)Nrr)r3r™rVrrrr�;szFDSelectConverter.writecCs |j|d|jfgƒ|jƒdS)NrÞ)rYrÞrZ)r3r^rCrVrrrrþ@szFDSelectConverter.xmlWritec Cs$t|dƒ}d}d}t|||ƒ}|S)NrÞ)r rÜ) r3rCrirjr™r9r4rárÁrrrrÙDs   zFDSelectConverter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrrW3srWc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚVarStoreConvertercCs$|j}|j|ƒt|ƒ}|jƒ|S)N)r4r&rÎr7)r3r™rVr4ÚvarStorerrrrýNs  zVarStoreConverter._readcCsdS)Nrr)r3r™rVrrrr�UszVarStoreConverter.writecCs|j||ƒdS)N)r×)r3r^rCrVrrrrþXszVarStoreConverter.xmlWritecCstƒ}|j||||ƒ|S)N)rÎrÙ)r3rCrirjr™rYrrrrÙ[szVarStoreConverter.xmlReadN)r‚rƒr„rýr�rþrÙrrrrrXLsrXcCs2d}t|ƒg}x|D]}|jt|ƒƒqWt|ƒS)Nr)rïrNr)Ú fdSelectArrayr9r†r@rrrÚ packFDSelect0as   r[c Cs´d}g}t|ƒ}d}x2t|ƒD]&}||}||kr|j||gƒ|}qW|d}t|ƒg}|jtt|ƒƒƒx0|D](} |jt| dƒƒ|jt| dƒƒqrW|jt|ƒƒt|ƒS)NrrrrŠ)r8r¶rNrïrðr) rZr9ÚfdRangesÚlenArrayÚ lastFDIndexrÈrÃÚ sentinelGIDr†ÚfdRangerrrÚ packFDSelect3is"  rac Cs´d}g}t|ƒ}d}x2t|ƒD]&}||}||kr|j||gƒ|}qW|d}t|ƒg}|jtt|ƒƒƒx0|D](} |jt| dƒƒ|jt| dƒƒqrW|jt|ƒƒt|ƒS)NrFrrrŠ)r8r¶rNrïrñrðr) rZr9r\r]r^rÈrÃr_r†r`rrrÚ packFDSelect4~s"  rbc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚFDSelectCompilercCsŒ|j}|j}|dkr t|ƒ|_nb|dkr4t|ƒ|_nN|dkrHt|ƒ|_n:t|ƒ}t|ƒ}t|ƒt|ƒkrv||_d|_n ||_d|_||_dS)NrrrF)rÞràr[r†rarbr8r™)r3rÁr™r9rZr0Zdata3rrrr‡•s    zFDSelectCompiler.__init__cCs||jjd<dS)NrÜ)r™rt)r3r’r”rrrr‰«szFDSelectCompiler.setPoscCs t|jƒS)N)r8r†)r3rrrrM®szFDSelectCompiler.getDataLengthcCs|j|jƒdS)N)r�r†)r3r4rrrrP±szFDSelectCompiler.toFileN)r‚rƒr„r‡r‰rMrPrrrrrc“srcc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚVarStoreCompilercCs6||_|js|jƒtt|jƒƒ|jg}t|ƒ|_dS)N)r™r†rUrðr8r)r3Ú varStoreDatar™r†rrrr‡·s  zVarStoreCompiler.__init__cCs||jjd<dS)Nra)r™rt)r3r’r”rrrr‰ÁszVarStoreCompiler.setPoscCs t|jƒS)N)r8r†)r3rrrrMÄszVarStoreCompiler.getDataLengthcCs|j|jƒdS)N)r�r†)r3r4rrrrPÇszVarStoreCompiler.toFileN)r‚rƒr„r‡r‰rMrPrrrrrdµs rdc@seZdZdd„Zdd„ZdS)Ú ROSConvertercCs<|\}}}|j|dt|ƒfdt|ƒfd|fgƒ|jƒdS)NÚRegistryÚOrderÚ Supplement)rYr rZ)r3r^rCrVÚregistryrrZ supplementrrrrþÍs    zROSConverter.xmlWritecCs|d|dt|dƒfS)Nrgrhri)r )r3rCrirjr™rrrrÙØszROSConverter.xmlReadN)r‚rƒr„rþrÙrrrrrfËs rféÚmaxstackÚnumberé ér"r>éÚ SyntheticBaseÚversionrrrÚFullNameé&ÚFontNamerÚ FamilyNamerFÚWeightÚ isFixedPitchÚ ItalicAngleÚUnderlinePositionédÚUnderlineThicknessé2rEÚ PaintTypeéÚCharstringTypeéÚ FontMatrixrÝgü©ñÒMbP?é ÚUniqueIDÚFontBBoxéÚ StrokeWidthéÚXUIDéÚ PostScriptéÚ BaseFontNameéÚ BaseFontBlendÚdeltaéÚCIDFontVersioné ÚCIDFontRevisioné!Ú CIDFontTypeé"ÚCIDCounté"érGé#ÚUIDBaseérGérbé%é$reééraZblendÚvsindexrÚ BlueValuesÚ OtherBluesÚ FamilyBluesé ÚFamilyOtherBluesÚ BlueScaleç}?5^ºI¤?é Ú BlueShifté ÚBlueFuzzÚStdHWÚStdVWÚ StemSnapHÚ StemSnapVÚ ForceBoldÚForceBoldThresholdÚlenIVÚ LanguageGroupÚExpansionFactor縅ëQ¸®?éÚinitialRandomSeedÚ defaultWidthXÚ nominalWidthXr¯cCsŽxˆtt|ƒƒD]x}||\}}}}}|dk r.q|dkr>tƒ}n6|dkrNtƒ}n&|dkr^tƒ}n|dkrld}ndstt‚|||||f||<qWdS)Nr�rÝrmr>rF)r�rÝ)r¶r8rrrÿr#)rˆrÈrórCrôrõrörrrÚ addConvertersBsr½c@seZdZeeƒZdS)ÚTopDictDecompilerN)r‚rƒr„r÷rsÚ operatorsrrrrr¾Xsr¾c@seZdZeeƒZdS)ÚPrivateDictDecompilerN)r‚rƒr„r÷r}r¿rrrrrÀ\srÀc@sbeZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dS)Ú DictCompilerrNc Cs²|rt|tƒst‚|dkr6t|dƒr6|j}|dk s6t‚||_||_||_||_i}xT|jD]J}t ||dƒ}|dkrtqZ|j |}|j ||ƒ}||j j |ƒkrœqZ|||<qZW||_dS)Nr)r>r-r#r=rr-r.r™rrÚgetattrÚ convertersr�Údefaultsrrt) r3r-r.r™rrtrCrVrörrrr‡cs(      zDictCompiler.__init__cCsdS)Nr)r3r’r”rrrr‰yszDictCompiler.setPoscCst|jdƒƒS)NrM)r8rU)r3rrrrM|szDictCompiler.getDataLengthc Csêtjtd|jj|ƒ|j}g}x¾|jjD]²}|j|ƒ}|dkr@q(|j|\}}t |t ƒr´t |ƒ}t |ƒ|kstt dƒ‚xZt |ƒD]0} || } || } t|d| ƒ} |j| | ƒƒq~Wnt|d|ƒ} |j| |ƒƒ|j|ƒq(Wt|ƒ}|S)Nz-- compiling %s for %szvalue doesn't match arg typeZarg_)r‹rŒr¨r‚rtr-rrrÚopcodesr>rØr8r#r¶rÂrNr) r3Úreasonrtr†rCrVróZargTyperùrÈrôÚvZ arghandlerrrrrUs*  zDictCompiler.compilecCs|jdƒ}|j|ƒdS)NrP)rUr�)r3r4r†rrrrP—s zDictCompiler.toFilecCsJt|tƒr>dd„|Dƒ}|jtdƒƒ|jttƒƒt|ƒ}nt|ƒ}|S)NcSsg|] }t|ƒ‘qSr)Ú encodeNumber)rr rrrr �sz+DictCompiler.arg_number..r)r>r(rNrÈrÚblendOpr)r3Únumr†ZdatumrrrÚ arg_number›s  zDictCompiler.arg_numbercCstj|jj|ƒƒS)N)rÚ encodeIntCFFr.r7)r3rrrrÚarg_SID¥szDictCompiler.arg_SIDcCs*g}x|D]}|j|j|ƒƒq Wt|ƒS)N)rNrËr)r3rVr†rÊrrrÚ arg_array¨s zDictCompiler.arg_arraycCsv|sdS|d}t|tƒr&|j|ƒ}nHg}d}x|D]}|j||ƒ|}q4Wg}x|D]}|jt|ƒƒqXWt|ƒS)Nór)r>r(Úarg_delta_blendrNrÈr)r3rVZval0r†r¥ÚlastrÇrÊrrrÚ arg_delta®s    zDictCompiler.arg_deltacCs8t|dƒ}t|ƒ}||d}||jkrŒt|jd|ƒ}g}xòtt|ƒ|ƒ}|dkrZP|d|…}|j|ƒ} |j| ƒ||d…}qBWn¨dg|} dg|} d} d} xD| |krì|| d}|| | | <|} || dd…| | <| d7} qªW| }x| D]}|j|ƒqøWdd„|Dƒ}|jt|ƒƒ|jtt ƒƒ|S)a'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. rrNcSsg|] }t|ƒ‘qSr)rÈ)rr rrrr  sz0DictCompiler.arg_delta_blend..) r8Ú maxBlendStackrhÚminrÐr¦rNrÈrrÉ)r3rVZ numMastersZ numBlendsZnumStackZnumBlendValuesr¥ZnumValZvalListZout1Z firstListZ deltaListrÈZprevValÚ defaultValueZ relValueListrrrrrÐÀs>             zDictCompiler.arg_delta_blend)N)r‚rƒr„rÓr‡r‰rMrUrPrËrÍrÎrÒrÐrrrrrÁ`s  rÁcCs"t|tƒrtj|ƒStj|ƒSdS)N)r>rrZ encodeFloatrÌ)rÊrrrrÈ s  rÈc@seZdZeeƒZdd„ZdS)ÚTopDictCompilercCs|j}g}|jjdkr¬t|jdƒrr|jjrrt|jdƒrr?rDrardrÜr8rwrêrcr°rerJr¦rOrb)r3r.rrSZ charsetCoderžreZ varStoreComprÁr€rCZ fdSelectComproZcharStringsCompZfdArrayIndexCompÚprivComprrrrO sV             zTopDictCompiler.getChildrenN)r‚rƒr„rørsrÅrOrrrrrÖ srÖcs.eZdZeeƒZd‡fdd„ Zdd„Z‡ZS)ÚFontDictCompilerNc s¾tt|ƒj||||d�g}|j}xztt|jƒt|jƒƒD]^}||jkrV|j |ƒq<|j j |ƒ}|dk r€|j|}|j ||ƒ}t ||dƒ|kr<|j |ƒqg}t|jdƒr:|jjj||ƒ}|j|ƒ|j|j|ƒƒ|S)Nrb)r=r-rbrJrNr¦rO)r3r.rSr×rrrrOn s   zFontDictCompiler.getChildren)N) r‚rƒr„rørsrÅr‡rOr©rr)r¨rrØK s rØc@s(eZdZeZeeƒZdd„Zdd„Z dS)ÚPrivateDictCompilercCs"||}||f|jjd<||_dS)Nrb)r™rtr’)r3r’r”r»rrrr‰| szPrivateDictCompiler.setPoscCs*g}t|jdƒr&|j|jjj||ƒƒ|S)Nr¯)r=r-rNr¯rJ)r3r.rSrrrrO� s zPrivateDictCompiler.getChildrenN) r‚rƒr„Ú maxStackLimitrÓrør}rÅr‰rOrrrrrÜw srÜc@sHeZdZddd„Zdd„Zdd„Zddd „Zd d „Zd d „Zdd„Z dS)ÚBaseDictNcCsd|dk|dkkst‚i|_g|_||_|dkr2dS||_||_|dk r`tjtd|jj |ƒ||_ dS)Nzloading %s at %s) r#rtÚ skipNamesr.r²r4r‹rŒr¨r‚r¢)r3r.r4r¢rrrrr‡Š szBaseDict.__init__cCsFtjtd|jjt|ƒƒ|j|j|ƒ}|j|ƒ|jƒ|_ |j ƒdS)Nz length %s is %d) r‹rŒr¨r‚r8ÚdecompilerClassr.r7ZgetDictrtÚ postDecompile)r3r†Údecrrrr7— s   zBaseDict.decompilecCsdS)Nr)r3rrrráž szBaseDict.postDecompilecCs|j||||d�S)N)r)r½)r3r.r™rrrrrJ¡ szBaseDict.getCompilercCsˆ|dd…|dd…ko"dknr0t|ƒ‚|jj|dƒ}|dkrR|jj|ƒ}|dkrbt|ƒ‚|j|}|j||ƒ}t|||ƒ|S)NrÚ__éþÿÿÿ)rrtrrÄrÃr Úsetattr)r3rCrVrörrrÚ __getattr__¤ s(    zBaseDict.__getattr__cCsŽxP|jD]F}||jkrqt||dƒ}|dkr6|dkr6q|j|}|j|||ƒqWt|jƒt|jƒ}|rŠ|jddjt |ƒƒƒ|j ƒdS)NrGzsome keys were ignored: %sr) rrrßrÂrÃrþrÙrtrÆrrërZ)r3r^rCrVrörÛrrrr\µ s    zBaseDict.toXMLcCs*|j|}|j||||ƒ}t|||ƒdS)N)rÃrÙrå)r3rCrirjrörVrrrrdÍ s zBaseDict.fromXML)NNNN)N) r‚rƒr„r‡r7rárJrær\rdrrrrrÞˆ s  rÞcsjeZdZdZeeƒZeeƒZe Z e eƒZ e Zd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z‡ZS)rcaThe ``TopDict`` represents the top-level dictionary holding font information. CFF2 tables contain a restricted set of top-level entries as described `here `_, 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] Ncs^tt|ƒj||||d�||_||_|rFttƒ|_|ƒ|_t tƒ|_ ntt ƒ|_t t ƒ|_ dS)N)r) r§rcr‡r6r2rúrqrÄrGrprrrs)r3r.r4r¢r2r6r)r¨rrr‡ó s   zTopDict.__init__cCs|jS)z.Returns a list of glyph names in the CFF font.)rG)r3rrrr0 szTopDict.getGlyphOrdercCsH|jjdƒ}|dkrdS|jj|ƒ|jr8t|jƒ|_n t|jƒ|_dS)Nrw)rtrr4r&r²r³rár´)r3r¢rrrrá s  zTopDict.postDecompilecCsZt|dƒr|jƒt|dƒr$dg|_t|dƒ s|jjƒD]0}|j|jƒ}|dk r|dk r string mapping.NcCs.|dkrg}ndd„t|dd�Dƒ}||_dS)NcSsg|]}t|dd�‘qS)r�)rž)r )rrrrrr ” sz+IndexedStrings.__init__..F)r)r)r.)r3r4r.rrrr‡� s zIndexedStrings.__init__cCst|d|dd�S)NF)r)r¤)r3rrrrJ™ szIndexedStrings.getCompilercCs t|jƒS)N)r8r.)r3rrrr9œ szIndexedStrings.__len__cCs"|tkrt|S|j|tSdS)N)ÚcffStandardStringCountÚcffStandardStringsr.)r3r>rrrrDŸ szIndexedStrings.__getitem__cCsnt|dƒs|jƒt|dd�}|tkr0t|}n:||jkrF|j|}n$t|jƒt}|jj|ƒ||j|<|S)NÚ stringMappingr�)rž) r=ÚbuildStringMappingr ÚcffStandardStringMappingrñr8r.rïrN)r3rr>rrrr7¥ s       zIndexedStrings.getSIDcCs|jS)N)r.)r3rrrÚ getStrings³ szIndexedStrings.getStringscCs6i|_x*tt|jƒƒD]}|t|j|j|<qWdS)N)rñr¶r8r.rï)r3r@rrrrò¶ sz!IndexedStrings.buildStringMapping)N) r‚rƒr„r…r‡rJr9rDr7rôròrrrrr-‹ s r-z.notdefÚspaceZexclamZquotedblZ numbersignZdollarÚpercentZ ampersandZ quoterightZ parenleftZ parenrightZasteriskÚplusÚcommaZhyphenZperiodZslashZzeroZoneZtwoZthreeZfourZfiveÚsixZsevenZeightZnineZcolonZ semicolonZlessÚequalZgreaterZquestionZatÚArÚCÚDÚEÚFÚGÚHÚIÚJÚKÚLÚMÚNÚOÚPÚQÚRÚSÚTÚUÚVÚWÚXÚYÚZZ bracketleftZ backslashZ bracketrightZ asciicircumZ underscoreZ quoteleftÚaÚbÚcròÚeÚfÚgÚhrÈÚjÚkrùrTr+ÚoÚpÚqÚrrÚtÚurÇÚwÚxÚyÚzZ braceleftÚbarZ bracerightZ asciitildeZ exclamdownÚcentZsterlingÚfractionÚyenZflorinÚsectionÚcurrencyZ quotesingleZ quotedblleftZ guillemotleftZ guilsinglleftZguilsinglrightÚfiÚflZendashÚdaggerZ daggerdblZperiodcenteredZ paragraphZbulletZquotesinglbaseZ quotedblbaseZ quotedblrightZguillemotrightZellipsisZ perthousandZ questiondownZgraveÚacuteZ circumflexÚtildeZmacronZbreveZ dotaccentZdieresisZringZcedillaZ hungarumlautZogonekZcaronZemdashZAEZ ordfeminineZLslashÚOslashZOEZ ordmasculineZaeZdotlessiZlslashÚoslashZoeZ germandblsZ onesuperiorZ logicalnotÚmuZ trademarkZEthZonehalfZ plusminusZThornZ onequarterÚdivideZ brokenbarZdegreeÚthornZ threequartersZ twosuperiorZ registeredÚminusÚethÚmultiplyZ threesuperiorÚ copyrightÚAacuteZ AcircumflexZ AdieresisÚAgraveÚAringÚAtildeZCcedillaÚEacuteZ EcircumflexZ EdieresisÚEgraveÚIacuteZ IcircumflexZ IdieresisÚIgraveÚNtildeÚOacuteZ OcircumflexZ OdieresisÚOgraveÚOtildeÚScaronÚUacuteZ UcircumflexZ UdieresisÚUgraveÚYacuteZ YdieresisZZcaronÚaacuteZ acircumflexZ adieresisÚagraveÚaringÚatildeZccedillaÚeacuteZ ecircumflexZ edieresisÚegraveÚiacuteZ icircumflexZ idieresisÚigraveÚntildeÚoacuteZ ocircumflexZ odieresisÚograveÚotildeÚscaronÚuacuteZ ucircumflexZ udieresisÚugraveÚyacuteZ ydieresisZzcaronZ exclamsmallZHungarumlautsmallZdollaroldstyleZdollarsuperiorZampersandsmallZ AcutesmallZparenleftsuperiorZparenrightsuperiorZtwodotenleaderZonedotenleaderZ zerooldstyleZ oneoldstyleZ twooldstyleZ threeoldstyleZ fouroldstyleZ fiveoldstyleZ sixoldstyleZ sevenoldstyleZ eightoldstyleZ nineoldstyleZ commasuperiorZthreequartersemdashZperiodsuperiorZ questionsmallZ asuperiorZ bsuperiorZ centsuperiorZ dsuperiorZ esuperiorZ isuperiorZ lsuperiorZ msuperiorZ nsuperiorZ osuperiorZ rsuperiorZ ssuperiorZ tsuperiorÚffÚffiÚfflZparenleftinferiorZparenrightinferiorZCircumflexsmallZhyphensuperiorZ GravesmallZAsmallZBsmallZCsmallZDsmallZEsmallZFsmallZGsmallZHsmallZIsmallZJsmallZKsmallZLsmallZMsmallZNsmallZOsmallZPsmallZQsmallZRsmallZSsmallZTsmallZUsmallZVsmallZWsmallZXsmallZYsmallZZsmallZ colonmonetaryZ onefittedZrupiahZ TildesmallZexclamdownsmallZ centoldstyleZ LslashsmallZ ScaronsmallZ ZcaronsmallZ DieresissmallZ BrevesmallZ CaronsmallZDotaccentsmallZ MacronsmallZ figuredashZhypheninferiorZ OgoneksmallZ RingsmallZ CedillasmallZquestiondownsmallZ oneeighthZ threeeighthsZ fiveeighthsZ seveneighthsZonethirdZ twothirdsZ zerosuperiorZ foursuperiorZ fivesuperiorZ sixsuperiorZ sevensuperiorZ eightsuperiorZ ninesuperiorZ zeroinferiorZ oneinferiorZ twoinferiorZ threeinferiorZ fourinferiorZ fiveinferiorZ sixinferiorZ seveninferiorZ eightinferiorZ nineinferiorZ centinferiorZdollarinferiorZperiodinferiorZ commainferiorZ AgravesmallZ AacutesmallZAcircumflexsmallZ AtildesmallZAdieresissmallZ AringsmallZAEsmallZ CcedillasmallZ EgravesmallZ EacutesmallZEcircumflexsmallZEdieresissmallZ IgravesmallZ IacutesmallZIcircumflexsmallZIdieresissmallZEthsmallZ NtildesmallZ OgravesmallZ OacutesmallZOcircumflexsmallZ OtildesmallZOdieresissmallZOEsmallZ OslashsmallZ UgravesmallZ UacutesmallZUcircumflexsmallZUdieresissmallZ YacutesmallZ ThornsmallZYdieresissmallz001.000z001.001z001.002z001.003ZBlackZBoldZBookZLightZMediumZRegularZRomanZSemiboldi‡éåé¦éW)rkrlrmNN)rnro)r>r>rm©rnrp)rarqrmNN)rrrr>NN)rnr)rrsr>NN©rnrt)rbrur>NN)rrvr>NN)rFrwr>NN©rnr)rcrxrmrN©rnr)rdryrmrN©rnréœÿÿÿ)rerzrmrfN©rnrF)rgr|rmr}N©rnrE)rhr~rmrN©rnr)rir€rmrN)rnr�)rƒr„rmNN©rnr†)rjr‡rmrN)rˆr‰rÝNN©rnrŠ)rkr‹r>NN©rnrŒ)rlr�r>NN©rnrŽ)rmr�r�NN©rnr‘)rnr’rmrN©rnr“)ror”rmrN©rnr•)rpr–rmrN©rnr—)rqr˜rmr™N©rnr›)rrrœrmNN)rmrm)rnrŸ)rnr )rkrlrmNN)rnr�)rnrŸ)rnr )rŒr£rmNN)rr¤r�NN)r�r¥r�NN)r†r¦r�NN)r§r¨r�NN©rnr§)rsr©rmrªN©rnr«)rtr¬rmr�N©rnr­)rur®rmrN)r«r¯rmNN)r­r°rmNN©rnrn)rvr±r�NN©rnrƒ)rwr²r�NN©rnrˆ)rxr³rmrN©rnrš)ryr´rmNN©rnr�)rzrµrmNN©rnr¡)r{r¶rmrN©rnrž)r|r·rmr¸N©rnr¹)r}rºrmrN)rpr»rmrN)rŠr¼rmrN)rŒr£rmNN)rr¤r�NN)r�r¥r�NN)r†r¦r�NN)r§r¨r�NN©rnr§)r~r©rmrªN©rnr«)rr¬rmr�N©rnr­)r€r®rmrN)r«r¯rmNN)r­r°rmNN©rnrn)r�r±r�NN©rnrƒ)r‚r²r�NN©rnr¡)rƒr¶rmrN©rnrž)r„r·rmr¸N)†r…ZfontTools.miscrrZfontTools.misc.arrayToolsrrZfontTools.misc.textToolsrrrr r r ZfontTools.ttLibr ZfontTools.ttLib.tables.otBaser rZfontTools.ttLib.tablesrrÔÚiorr$ÚloggingrrŒÚ getLoggerr‚r‹rrÝrÓrrIr�r—r¤r�rªr«r®r°r)r1rÌr+rvrÎrÜrwrµr´r³r¡r rŸrïrðrñr÷rørprúrûrürÿrrrrrrrrr r!r,r5r6r8r.r/r$r%rDrHrMrNrErFrVrWrXr[rarbrcrdrfrsrqrrÉr}r|r½ZDictDecompilerr¾rÀrÁrÈrÖrØrÜrÞrcrzrr-rðrïr8r#rór¶Z_ir'r1r(r2r)r3rrrrÚ s¨          M1 K$)  Hd45@ .= % = ""  ( =,Ka3$4 $$<(<,      $$0@0@