L i!TddlmZmZmZmZm Z m Z ddl mZddlmZmZddlmZmZmZmZmZddlmZddlmZmZddlmZmZm Z m!Z!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z0m1Z1dd l2m3Z3m4Z4dd l5m6Z6dd l7m8Z8dd l9Z9dd l:Z:ddl;meEZZGd?d@eZZ[GdAdBeZZ\GdCdDe\Z]GdEdFe\Z^GdGdHe^Z_GdIdJe_Z`GdKdLeEZaGdMdNeEZbGdOdPeDZcGdQdRecZdGdSdTecZeGdUdVeeZfGdWdXeeZgGdYdZecZhGd[d\eeZiGd]d^efeiZjGd_d`eeZkGdadbeGZlGdcddelZmGdedfeDZnGdgdheDZoGdidjeDZpGdkdleDZqGdmdneDZrGdodpeDZsGdqdreDZtGdsdteDZuGdudveDZvGdwdxZwGdydzeDZxGd{d|eMZyGd}d~eOZzGddezZ-GddezZ/ideNdeLdeHdeOdeMdePdeIdebdeJd eKdLead4eUd6eVd8eWd:eXd@e[dDe]idFe^dHe_dJe`decdeedefdegddemdretdteudvevd|eyde-de/dr1-s Jq%(c g}i}|D]\}}}}}|} |jdr|dk(sJt} n|jds|dvrttt d|} na|dk(rt } nU|dk(rt} nI|dk(rt} n=|d k(rt} n1|d vrt} n&|tvr d |vr |} t} nt||t} | |||| } | jr | j} n'|d vr|j|} n|j| } | js| | _|dvrY|d| _| j j#D]2} | j#D]}t%||||||j&<4|d k(rN|d| _|d | _| j(j#D]}t%||||||j&<|j-| ||vsJ|| ||<||fS)zGiven a table spec from otData.py, build a converter object for each field of the table. This is called for each table in otData.py, and the results are assigned to the corresponding class in otTables.py. ValueFormatuint16Count) StructLength MorphType)uint8r5uint32SubTable ExtSubTable SubStruct FeatureParams)CIDGlyphMappingGlyphCIDMapping( description) MortChain MortSubtable MorxChain)r;r<r=rfeatureParamTypes) startswithr4endswith ComputedUInt8ComputedUShort ComputedULongr;r<r=r>StructWithLengthconverterMappingStructeval tableClassgetrvaluesTable__name__rGdefaultFeatureParamsappend) tableSpectableNamespace convertersconvertersByNametpnamerepeatauxdescr tableNameconverterClassconvrQr/clss r0buildConvertersre0s?J(16&$D&#u ??= )> !>(N ]]7 #t/L'L&(' N Z %N ] "(N [ &N _ $*N ; ;-N))cm !'!%b.:J!KdFCUC ??J = ='++B/J'++I6J(DO ; ;-mrPr6)DesignAxisRecordSizeValueRecordSize LookupTyper8) ClassCount Class2Count FeatureTag SettingsCountVarRegionCount MappingCountRegionAxisCountDesignAxisCountrjAxisValueCountrk AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList) r]r^r_compilerQrIisCount isLookupType isPropagatedrCselfr]r^r_rQrCs r0__init__zBaseConverter.__init__ts   88DKKtxxV.get_read_item..read_items-$$S1z>%9:99[$;;r2copyr)rrrrreaderrrs @@r0 get_read_itemz.BaseConverter.readArray..get_read_items)$kkm jj<<! r2c3"K|]}ywr,).0rrs r0 z*BaseConverter.readArray..s9q9s )lazy getRecordSizeNotImplementedrangerWrradvance) rrr tableDictcountrlrrrrs ``` @@r0 readArrayzBaseConverter.readArraysyy&UQY ++F3J^+A5\ =64;< =H !&I9E%L99A NN5:- .Hr2c>t|dr |jStS)N staticSize)hasattrrrrrs r0rzBaseConverter.getRecordSizes 4 &?? "r2ct|)zRead a value from the reader.NotImplementedErrorrrrrs r0rzBaseConverter.read !$''r2c t|D]\}}|j|||||y#t$r}|jfz|_d}~wwxYwr,) enumeratewrite Exceptionargs)rwriterrrrSrvaluees r0 writeArrayzBaseConverter.writeArraysW %f- >5 64E1= > VVqd]AF  s(+ AA  Act|)zWrite a value to the writer.rrrrrr repeatIndexs r0rzBaseConverter.writerr2ct|)zRead a value from XML.rrattrscontentrs r0xmlReadzBaseConverter.xmlReadrr2ct|)zWrite a value to XML.rr xmlWriterrrr]rs r0xmlWritezBaseConverter.xmlWriterr2zVarIndexBase\s*\+\s*(\d+)returnc|jj|j}|syt|j dS)zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr)varIndexBasePlusOffsetREsearchrCintgroup)rms r0getVarIndexOffsetzBaseConverter.getVarIndexOffsets6  ) ) 0 01A1A B1771:r2r,)rU __module__ __qualname____doc__rrrrrrrrrerzrr*rrrr2r0rgrgpsZ'"'>< (((( *rzz*FG8C=r2rgc8eZdZedZedZdZdZy) SimpleValuec|Sr,rrs r0toStringzSimpleValue.toString r2c|Sr,rrs r0 fromStringzSimpleValue.fromStringrr2cr|j||d|j|fgz|jyNr) simpletagrnewliners r0rzSimpleValue.xmlWrites4D%GT]]55I+J*K"KLr2c*|j|dSr)rrs r0rzSimpleValue.xmlReadsuW~..r2N)rUrr staticmethodrrrrrr2r0rrs2/r2rceZdZdZdZdZy) OptionalValueNc||jk7r"|jd|j|f|j|||j yr)DEFAULTrWrrrrs r0rzOptionalValue.xmlWritesD DLL LL'4==#78 9D%(r2cJd|vr|j|dS|jSr)rrrs r0rzOptionalValue.xmlReads' e ??5>2 2||r2)rUrrrrrrr2r0rrsG r2rceZdZedZy)IntValuect|dSNr)rrs r0rzIntValue.fromStrings5!}r2NrUrrrrrr2r0rrsr2rc*eZdZdZdZdZddZdZy)Longc"|jSr,readLongrs r0rz Long.read  r2c$|j|Sr,) readLongArrayrrrrrs r0rzLong.readArray##E**r2Nc&|j|yr,) writeLongrs r0rz Long.writer2c&|j|yr,)writeLongArrayrrrrrSs r0rzLong.writeArray f%r2r,rUrrrrrrrrr2r0rrJ!+ &r2rc*eZdZdZdZdZddZdZy)ULongrc"|jSr, readULongrs r0rz ULong.read!!r2c$|j|Sr,)readULongArrayrs r0rzULong.readArray$$U++r2Nc&|j|yr, writeULongrs r0rz ULong.write% r2c&|j|yr,)writeULongArrayrs r0rzULong.writeArrayv&r2r,rrr2r0rrJ",!'r2rceZdZedZy)Flags32c d|zS)Nz0x%08Xrrs r0rzFlags32.toString %r2N)rUrrrrrr2r0rrs  r2rceZdZeZy)VarIndexN)rUrrr%rrr2r0r r $s Gr2r c*eZdZdZdZdZddZdZy)Shortc"|jSr,) readShortrs r0rz Short.read+rr2c$|j|Sr,)readShortArrayrs r0rzShort.readArray.rr2Nc&|j|yr,) writeShortrs r0rz Short.write1rr2c&|j|yr,)writeShortArrayrs r0rzShort.writeArray4rr2r,rrr2r0r r (rr2r c*eZdZdZdZdZddZdZy)UShortr c"|jSr, readUShortrs r0rz UShort.read;  ""r2c$|j|Sr,)readUShortArrayrs r0rzUShort.readArray>s%%e,,r2Nc&|j|yr, writeUShortrs r0rz UShort.writeA5!r2c&|j|yr,)writeUShortArrayrs r0rzUShort.writeArrayDs'r2r,rrr2r0rr8sJ#-"(r2rc*eZdZdZdZdZddZdZy)Int8rc"|jSr,)readInt8rs r0rz Int8.readKrr2c$|j|Sr,) readInt8Arrayrs r0rzInt8.readArrayNrr2Nc&|j|yr,) writeInt8rs r0rz Int8.writeQrr2c&|j|yr,)writeInt8Arrayrs r0rzInt8.writeArrayTrr2r,rrr2r0r%r%Hrr2r%c*eZdZdZdZdZddZdZy)UInt8rc"|jSr,) readUInt8rs r0rz UInt8.read[rr2c$|j|Sr,)readUInt8Arrayrs r0rzUInt8.readArray^rr2Nc&|j|yr,) writeUInt8rs r0rz UInt8.writearr2c&|j|yr,)writeUInt8Arrayrs r0rzUInt8.writeArraydrr2r,rrr2r0r/r/Xrr2r/ceZdZdZdZddZy)UInt24c"|jSr, readUInt24rs r0rz UInt24.readkrr2Nc&|j|yr, writeUInt24rs r0rz UInt24.writenr!r2r,rUrrrrrrr2r0r9r9hsJ#"r2r9ceZdZdZy) ComputedIntcV|'|j|d||jyy)N=)commentrrs r0rzComputedInt.xmlWritess,     u5 6     r2NrUrrrrr2r0rCrCrs r2rCc eZdZy)rJNrUrrrr2r0rJrJyr2rJc eZdZy)rKNrIrr2r0rKrK}rJr2rKc eZdZy)rLNrIrr2r0rLrLrJr2rLceZdZdZdZddZy)Tagrc"|jSr,)readTagrs r0rzTag.reads~~r2Nc&|j|yr,)writeTagrs r0rz Tag.writesr2r,rArr2r0rNrNsJ r2rNc.eZdZdZdZdZdZdZddZy) GlyphIDr Hcn|j|j|j|j|Sr,)getGlyphNameManyrtypecoderrs r0rzGlyphID.readArrays/$$   T]]DOOU C  r2cl|j|j|j|jSr,) getGlyphName readValuerXrrs r0rz GlyphID.reads(  !1!1$--!QRRr2cZ|j|j|j|yr,)rrXgetGlyphIDManyrs r0rzGlyphID.writeArrays!$--)<)|jt|dzyr})r roundrs r0rzDeciPoints.writes5,-r2r,rArr2r0r{r{sJ(.r2r{cjeZdZeZeZeZeZdZddZ e dZ e dZ e dZ e dZy) BaseFixedValuecV|jt||jSr,)fromIntgetattr readerMethodrs r0rzBaseFixedValue.reads$||>GFD,=,=>@AAr2NcZt||j|j|yr,)r writerMethodtoIntrs r0rzBaseFixedValue.writes"*))*4::e+<=r2c.t||jSr,)fi2fl precisionBitsrdrs r0rzBaseFixedValue.fromIntUC--..r2c.t||jSr,)fl2firrs r0rzBaseFixedValue.toIntrr2c.t||jSr,)str2flrrs r0rzBaseFixedValue.fromStringeS..//r2c.t||jSr,)fl2strrrs r0rzBaseFixedValue.toStringrr2r,)rUrrrrrrrrr classmethodrrrrrr2r0rrsqJ"M!L!LB>////0000r2rceZdZdZdZdZdZy)FixedrrrNrUrrrrrrrr2r0rrsJMLLr2rceZdZdZdZdZdZy)F2Dot14r rrNrrr2r0rrsJMLLr2rcdeZdZdZdZefdZefdZedZedZ xZ S)Anglegg?cBt|||jzdzSN)superrbiasrdr __class__s r0rz Angle.fromInts &1S88r2cBt||dz |jz Sr)rrrrs r0rz Angle.toInt sw}eckSXX566r2c^tt||jz |jzSr,)r rxfactorrs r0rzAngle.fromStrings%uU|cjj01CJJ>>r2c.t||jSr,)r rrs r0rzAngle.toStrings*5#**==r2) rUrrrrrrrrr __classcell__rs@r0rrs] D "F9977??>>r2rceZdZdZy) BiasedAngleg?N)rUrrrrr2r0rrs  Dr2rcNeZdZdZdZddZedZedZedZ y) Versionrc&|j}|Sr,r)rrrrrs r0rz Version.read!s! r2Nc<t|}|j|yr,)fi2verrs r0rz Version.write%se r2ct|Sr,)ve2firs r0rzVersion.fromString)ryr2c d|zS)N0x%08xrrs r0rzVersion.toString-rr2ct|dS)Nr)r)vs r0 fromFloatzVersion.fromFloat1sQ|r2r,) rUrrrrrrrrrrr2r0rrsMJ   r2rc"eZdZdZdZdZddZy)Char64zAn ASCII string with up to 64 characters. Unused character positions are filled with 0x00 bytes. Used in Apple AAT fonts in the `gcid` table. @c|j|j}|jd}|dk\r|d|}t|dd}|t|ddk7rtj d|z|S)Nrasciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatarfindrrirj)rrrrdatazeroPosss r0rz Char64.read?sjt/))E" a<>D $ ; dWX> > KK?!C Dr2NcJt|dd}|t|ddk7rtjd|zt||jkDr$tjd||jfz|d|jzzd|j}|j |y)Nrrrrz&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr)r rirjlenr writeData)rrrrrrrs r0rz Char64.writeIsuwyA 7578D D KK@5H I t9t & KK6%9QQ ut..0A$//Br2r,)rUrrrrrrrr2r0rr6s J r2rc2eZdZdZdZddZdZdZdZy) rOcT|jxr|jj|Sr,)rQrrs r0rzStruct.getRecordSizeVs H4??#@#@#HHr2cJ|j}|j|||Sr,)rQ decompile)rrrrtables r0rz Struct.readYs!! % r2Nc(|j||yr,)rzrs r0rz Struct.write^s fd#r2c|*|r'|j||dgz|jyy|j||||y)N)emptyr)r])rrtoXMLrs r0rzStruct.xmlWriteasF =##D%<.*@A!!# KK 4TK :r2c*d|vrt|dry|j}|jd}|t||_t |d }|rd}|j D]}|jsd}t |dsi|_|j} |j| vsJ|j| ft||jdt|j|j| |j<|D]-} t| tr| \} }}|j| |||./|j!t#|dd|rBr@|j D]-}|js|j} | |j=| r,|`/|S)NrFormatpostReadFT _propagator) propagator)rrQrRrrr getConvertersr}rr]setattrr__dict__r-r.fromXMLpopulateDefaultsr) rrrrrr noPostReadcleanPropagationrcrelementr]s r0rzStruct.xmlReadns e w 8!8$  v;EL  33 $ ++- V$$'+$"47+-(!%!1!1J99J6OJ8OO6E499d3,:5>>499,UJtyy) V G'5)'.$eW dE7D9   '$ t*LM !//11D((%)%5%5 &tyy1) $ 0 1 r2c2dt|jzS)Nz Struct of )reprrQ)rs r0__repr__zStruct.__repr__sd4??333r2r,) rUrrrrrrrrrr2r0rOrOUs"I $ ;(T4r2rOceZdZdZddZy)rMc|j}|j}|j|||j||jz|Sr,)rrQrrr7)rrrrrrs r0rzStructWithLength.readsAjj! % C%,,,- r2Nc$t|jD]\}}|jdk(snt|jz}t |t r|dz }ddddj} |j} | |_ |j|||j| z } |j} |j| ||| |j|dd|jk(sJ| j|j|<y)Nr7ri>[=)rr rޭ)rrr]ritemsr-rr getDataLengthr7rz getSubWriterr getAllData) rrrrrr convIndexrc lengthIndexdeadbeefbeforelength lengthWriters r0rzStructWithLength.writes()<)<)>? OItyyN* &,,')3 e5 6 1 K:6tG%%'% fd#%%'&0**,  <y&9||K(,?@Q$//,RRRR$0$;$;$= [!r2r,rUrrrrrr2r0rMrMs >r2rMc*eZdZdZdZdZdZddZy)rTr c"|jSr,rrs r0 readOffsetzTable.readOffsetrr2c&|jdyrrrrs r0writeNullOffsetzTable.writeNullOffset1r2c|j|}|dk(ry|j}|j|}|jr||_||_|S|j |||Sr)rrQ getSubReaderrrrr)rrrroffsetrs r0rz Table.readsg( Q;!$$V, 99!ELEJ  OOFD ) r2Nc||j|y|j}|j|_|||_|j ||j |j ||y)N offsetSize)rrr]r writeSubTablerrz)rrrrrr subWriters r0rz Table.writesa =   (++-I!YYIN&(3 %  t G MM)T *r2r,)rUrrrrrrrrr2r0rTrTsJ#  +r2rTceZdZdZdZdZy)LTablerc"|jSr,rrs r0rzLTable.readOffsetrr2c&|jdyrrrs r0rzLTable.writeNullOffsets!r2NrUrrrrrrr2r0rrsJ"r2rceZdZdZdZdZy)Table24r:c"|jSr,r<rs r0rzTable24.readOffsetrr2c&|jdyrr?rs r0rzTable24.writeNullOffsetrr2Nr rr2r0r r sJ#r2r c$eZdZdZfdZxZS)r=c|j||}|j|j|j|j|Sr,rrr]r^r_r tableType lookupTyperQs r0 getConverterzSubStruct.getConverter8%%i0< ~~diidhh KKr2c4tt| |||d|yr,)rr=rrrrrr]rrs r0rzSubStruct.xmlWrites i' 4eLr2rUrrrrrrs@r0r=r=sLMMr2r=c$eZdZdZfdZxZS)r;c|j||}|j|j|j|j|Sr,rrs r0rzSubTable.getConverterrr2c4tt| |||d|yr,)rr;rrs r0rzSubTable.xmlWrites h&y$tUKr2rrs@r0r;r;sLLLr2r;ceZdZddZy)r<NcFd|_tj||||||y)NT) ExtensionrTrrs r0rzExtSubTable.writes  D&$ 5+Fr2r,)rUrrrrr2r0r<r<sGr2r<ceZdZdZy)r>c|jj||j}|j|j|j |j |Sr,)rGrRrVrr]r^r_)r featureTagrQs r0rzFeatureParams.getConverter sA++// Dr> sLr2r>c,eZdZdZddddZdZddZy) r4r NrhrBcrtj||||||d|ddk(r dz|_ydz|_y)NrBr421)rgrwhichr~s r0rzValueFormat.__init__sC $Z[  #T"X_cF #F r2cV|j}t|||j<|Sr,)rrr)rrrrformats r0rzValueFormat.reads(""$/7tzz r2cV|j|t|||j<yr,)r rr))rrrrr,rs r0rzValueFormat.writes#6"/7tzzr2r,)rUrrrrrrrr2r0r4r4sJG"G  8r2r4c,eZdZdZdZddZdZdZy) ValueRecordc8dt||jzSNr )rr)rs r0rzValueRecord.getRecordSize#s3vdjj)***r2c@||jj||Sr,)r)readValueRecordrs r0rzValueRecord.read&sdjj!11&$??r2NcD||jj|||yr,)r)writeValueRecordrs r0rzValueRecord.write)stzz++FD%@r2cF|y|j|||j|yr,)rr]rs r0rzValueRecord.xmlWrite,s =  KK 4E :r2cHddlm}|}|jd||||S)Nr)r/)otBaser/r)rrrrr/rs r0rzValueRecord.xmlRead2s#'  dE7D1 r2r,)rUrrrrrrrrr2r0r/r/"s+@A; r2r/ceZdZdZdddZdZddZedZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZy) AATLookupr~rhrBctj||||||t|jtr|jddd|_yt ddd|j|_y)NrBValue)r]r^r_)r]r^r_rQ)rgr issubclassrQr converterrTr~s r0rzAATLookup.__init__=sa $Z[   doo{ 3!__'$D_QDN"TtDNr2c|j}|dk(r|j||S|dk(r|j||S|dk(r|j||S|dk(r|j ||S|dk(r|j ||SJd|z)Nrr rrzunsupported lookup format: %d)r readFormat0 readFormat2 readFormat4 readFormat6 readFormat8r+s r0rzAATLookup.readHs""$ Q;##FD1 1 q[##FD1 1 q[##FD1 1 q[##FD1 1 q[##FD1 1 B9FB B5r2Nctt|jDcgc]\}}|j||fc}}}ttt d|j ||||j ||||j||||j|||g} | d\} } } |j} | |j| z }|| k(s Jd| | |fzycc}}w)Nrz;AATLookup format %d claimed to write %d bytes, but wrote %d) listsortedrr`filter buildFormat0 buildFormat2 buildFormat6 buildFormat8r)rrrrrrglyphvalrSformatsdataSize lookupFormat writeMethodr actualSizes r0rzAATLookup.writeWs  EKKMRjeST__U+S1R S  ))&$?))&$?))&$?))&$?    /6aj+, ""$ ))+c1 ( " H   L   "/SsC3c|j||j|t||\}}}|j||j||j|y)N)nitemSize)r r)rnumUnitsunitSize searchRange entrySelector rangeShifts r0writeBinSearchHeaderzAATLookup.writeBinSearchHeaderws`8$8$1?2 . ]J ;'=):&r2ctj}t|k7ryjj}d||zzdfdfS)Nr rc*jSr,) writeFormat0rrrSrsr0r1z(AATLookup.buildFormat0..D%%fdF;r2)r getGlyphOrderr>r)rrrrS numGlyphs valueSizes```` r0rJzAATLookup.buildFormat0sQ**,- v;) #NN-- I% % ;  r2cz|jd|D]%\}}|jj||d|d'y)Nrrrr)r r>r)rrrrSglyphID_rs r0r`zAATLookup.writeFormat0sE1% OHe NN Et !  r2cF |d\}}|}g |ddD]/\}}||dzk7s||k7r j|||f|x}}|}.|}1 j|||fjj} t dz| dz} } djz| | zzd fdfS)Nrrrr c*jSr,) writeFormat2)rsegmentsrrsr0r1z(AATLookup.buildFormat2..sD%%fdH=r2)rWr>rrBIN_SEARCH_HEADER_SIZE) rrrrSsegStartsegValuesegEndglyphIDcurValuererXrYrls ``` @r0rKzAATLookup.buildFormat2s#AY(!' ! GX&1*$H(<68 <=$++6#   ! 6845NN--  ]Q. A ( ++ +h.A A =  r2c|jd|jj}t||dz}}|j ||||D]H\}}} |j||j||jj ||d| dJ|jd|jd|j d|zy)Nr rrgrr r>rrr]rr) rrrrlrerXrY firstGlyph lastGlyphrs r0rkzAATLookup.writeFormat2s1NN--  ]IM( !!&(H=,4  (J 5   y )   z * NN Et !   6"6"9,-r2cjj}t|dz}}djz|dz|zzdfdfS)Nr rr@c*jSr,) writeFormat6rasr0r1z(AATLookup.buildFormat6..rbr2)r>rrrm)rrrrSrerXrYs```` r0rLzAATLookup.buildFormat6sONN--  [)a-( ++ +x!|x.G G ;  r2cX|jd|jj}t||dz}}|j ||||D]6\}}|j||jj ||d|d8|jd|j d|zy)Nr@r rgrtrru) rrrrSrerXrYrqrs r0rzzAATLookup.writeFormat6s1NN--  [)a-( !!&(H=$ NGU   w ' NN Et !   6"9,-r2cdddd}}t||z dzk7ryjj}dt|zzdfdfS)Nrr&rr@rc*jSr,) writeFormat8rasr0r1z(AATLookup.buildFormat8..rbr2)rr>r)rrrrS minGlyphID maxGlyphIDres```` r0rMzAATLookup.buildFormat8se!'1vbz!}J v;*z1A5 5NN-- F i' ' ;  r2c|dd}|jd|j||jt||D]%\}}|jj||d|d'y)Nrrrg)r rr>r)rrrrS firstGlyphID_rs r0r~zAATLookup.writeFormat8sray| 1<(3v;' HAu NN Et !  r2ct|j}|jj||d|}t |Dcic]\}}|j ||c}}Scc}}wNrr)rrcr>rrrZ)rrrrdrkrs r0rAzAATLookup.readFormat0s^**,- ~~''I'VrrrrrZ) rrrmappingrrYrXrlastfirstrrs r0rBzAATLookup.readFormat2sjj1n#..0&2C2C2E(1t~~8888B(B8x :A KKa(l*R/ 0$$&D%%'ENN'''EEv~udQh/:A49GD--a01:  :r2c$i}|jdz }|j}|dk\sJ|t|jD]}|j|||zzdz|j}|j}|j} |dk7sS|j d} | j|| z|j j | |d||z dz} t| D]\} } | ||j|| z<|S)Nr r@rrtrrr) rrrrrr>rrrZ)rrrrrrYrrrr dataReaderrrrs r0rCzAATLookup.readFormat4sjj1n$$&1}&h&}v((*+ >A KKa(l*R/ 0$$&D%%'E&&(Fv~#003 f -~~//D5L1DAq<=GD--eai89> >r2ci}|jdz }|j}|d|jjzk\sJ|t |jD]d}|j |||zzdz|j}|jj ||d}|dk7sQ|||j|<f|S)Nr rrrtr) rrrrrrYrrqrs r0rDzAATLookup.readFormat6 sjj1n$$&1t~~8888B(B8v((*+ rrrZ)rrrrrrrrs r0rEzAATLookup.readFormat8sl!!#!!#~~''E'RFOPToV E!!%!),e3VVVsA1ci}|D]B}t|ts|\}}}|dk(s |jj|||||d<D|S)NLookuprN)r-r.r>r) rrrrrrr]a eltContents r0rzAATLookup.xmlReads^ TG'5)&-#a8#(,(>(>q*d(SE!G*%  T  r2c |j|||jt|jD](\}}|jj |||dd|fg*|j ||jy)NrrN)rr]r)begintagrrHrr>rendtag)rrrrr]rrNs r0rzAATLookup.xmlWrite&s4'"5;;=1 LE5 NN # #4u8WeDTCU $   r2r,)rUrrrmrrrrr]rJr`rKrkrLrzrMr~rArBrCrDrErrrr2r0r:r::s}EG  C @''   ( .  .  M ( W r2r:c&eZdZdZddZdZdZy)AATLookupWithDataOffsetc\|j}|j}|j|}tdddt}|j |||}i} |j D]@\} } |j| |z} |j } | j| || | | <B| SN DataOffsets)rrr:rrrrQr)rrrr lookupOffset dataOffset lookupReaderlookupoffsetsresultrNrritems r0rzAATLookupWithDataOffset.read9s'') %%' **<8 =$f=++lD)<$]]_ !ME6,,Vj-@AJ??$D NN:t , F5M  !  r2Nc8iid}}}g} t||jD]s} t} || j| || j } |j | d} | dk(r&|} |t | z}| || <| j| | || <u|j}tdddt}|j||||d|j}|j|d|j|d| D]}|j|y)Nr)keyrrr)rHr`rrzrrRrrWrr:rrrr)rrrrrr offsetByGlyph offsetByDatadataLen compiledDatarNrrr lookupWriterr dataWriterds r0rzAATLookupWithDataOffset.writeGs,022qW|  Et7 *E%I %L D 1'')D!%%dD1F~ !CI-%+ T"##D)#)M%  ***, =$f= \4M4H((* \a8ZA6 $A   # $r2cXtddd|j}|j|||Sr)r:rQr)rrrrrs r0rzAATLookupWithDataOffset.xmlReadjs)=$dooF~~eWd33r2c^tddd|j}|j|||||yr)r:rQr)rrrrr]rrs r0rz AATLookupWithDataOffset.xmlWritens*=$dooF 4e>Q     (U^^2K  L    .5??:;-X@U@U5UV i.r2ct}d}d|_tt|D]\}}}|dk(rEt |d}|dzdk7|dzdk7f} |j | |_|j||R|dk(r7|d|_|j |jvrzJd|j z|dk(r-|d|_ |jd vrJd |jz|d k(rt |d|_|d k(rt |d|_ |jd r|j||||J||dzdz|jz|_|S)Nr CoverageFlagsrrrrzunknown ProcessingOrder: %sr>rrrzunknown TextDirection %srrMorphr) r"rrIistuplerrrr_PROCESSING_ORDERS_REVERSEDrrrIr) rrrrrcovFlagseltNameeltAttrsrrs r0rzMorxSubtableConverter.xmlReads N -3GW-E & )GXz/)#HW$56%_2X_4JK$($;$;H$E!77!D--$,W$5!((D,L,LL1A4E4EELO+"*7"3*KK.@KJ&%hw&78 --$,Xg->$?!!!'* '8Z>%g%u1 &2n+ajj8 r2cH|jdzdz }|j|j\}}||jdk(rdndz}||rdndz}||jdk(rdndz}||rdndz}||_t |j } |j} d |_|j} |jd z|_|j||| |_|j | d k(sJ|j| z } tjd | |j | <y) Nirrrrrrrrrtrz>L) rrrrrrrrr7rzstructpack) rrrrrrr reverseOrder logicalOrderrr origReservedrs r0rzMorxSubtableConverter.writes#NNZ/B6%)%E%E  ! !& " l E//:=D1DLDa/E//58Da?LDa/&&,,' %%''~~ &0 fd#%||K(,????%%'&0$*KKf$= [!r2r,) rUrrrrrrrrrrr)rrrOs000r0rrssm&,%, =O}#Xs A rczeZdZdddZdZdZdZdZdZdd Z d Z d Z d Z dZ dZdZdZdZdZdZy ) STXHeaderrhrBctj||||||t|jtsJt dddt |_t|jtrt dddt|_ yd|_ y)NrB GlyphClassesPerGlyphLookup) rgrr=rQrr:r classLookuprrTperGlyphLookupr~s r0rzSTXHeader.__init__sv $Z[  $//9555$^T4H doo'< ="+, doo': ;!..q1L   cF$4$4$66 7!'!4!4Q!7   # #C&*:*:*<$< =$11!4O  v'7'7'9!9 : / 3 36H6L6L LQRR #q( (("4"D"DEU"VE "11/4HEO )= >!..q1L   cF$4$4$66 7!--223CT9U  ! !$4$8$8 8U=R=RUV=V W  * JJE LL   &#E$9$9:  -88: 040D0D$j$ 1!!*-      *$($=$=*D%E ! r2c|j}|j|j||jzz}|j ||||Sr,)rQrrrr)rrrrr transition entryReaders r0rzSTXHeader._readTransition/sO__& )) JJj&;&;; ;  [$ =r2ct|j}||jz dz}|j|j |Sr1)rrrrWr)rrrlimitnumLigatureGlyphss r0rzSTXHeader._readLigatures7sAFKK "VZZ/A5$$V%;%;e00779:Q> "    * !Q & !!A!AA"&//"@"@u||"T K)-)<)< %,,* &13~3FF+c..AA)C,??477tDaH  !+c..AALL/9,, 66udC..ud;  (|$) ))".Z"@ 1C8I4JJO/*/0*+*+    *   n -  #   l +  *   1 2   o .(((&  !   Z (  (   . /  $   ] + %r2c 6t}gi}}|D]}t|D]} |j| } t} | j| ||| j } t | | j k(s)Jdt| | j t | fz|j| } | !t |} | || <|j| |j| t|j d}tt|d}||fS)Nz1%s has staticSize %d, but actually wrote %d bytesr) rrrrzrrrrrRrWr rr )rrstatesrrstateArrayWriterentriesentryIDsrrr entryWriter entryDatarrrs r0r zSTXHeader._compileStatess)(? 9E#O4 9 "..z: +o "";kB'224  Nj&;&;;I$)) NM; &\\)4 %!$WJ*4HY'NN9- ,,Z8# 9 9&-88:A>Yw/3~--r2c|jy|j|}t|j|k(sJdt|j|fzt }|jD]D}|j }|jj ||i|d|j|dF|jS)Nr2zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %drr) rrrrrrrrr)rrrrrrrs r0rz!STXHeader._compilePerGlyphLookupss    &//6 5(()Z7  ;5(():6 7 7 ++ =F!..0L    % %lD"fd K  ! < =  ""r2ct|dsyt}|jD]}|j||j S)Nr)rrrr r)rrrr components r0rzSTXHeader._compileLigComponentssHuo.,, *I   y ) *  ""r2ct|dsyt}|jD]"}|j|j |$|j S)Nr)rrrr r`r)rrrr glyphNames r0rzSTXHeader._compileLigaturessOuk* ;I   ty9 : ;  ""r2c^|j|||j|jd|jz|jt |j j D])\}}|jd|||j+t|jD]\}} |jd||jt | jj D]\} } | j||d| id|jd|jt|jD]\} } |jd | |jt | j D])\}}|jd |||j+|jd |jt|d r|jd |jtt|d D])\} }|jd | | |j+|jd |j|j!||||||j||jy)NzGlyphClassCount=%s GlyphClassrNrState)index onGlyphClass Transition)rrr]rrr LigComponent)r2r)rrrFrrHrrrrrrrrrrr_xmlWriteLigatures)rrrrr]rgklassrrrtransrrrNrOs r0rzSTXHeader.xmlWrites~4'.1F1FFGu11779: HAu    AU  C     "+5<? !__. ""7Hj$G0:!!*-  ;  r2cg}tt|D])\}}}|dk(s |jt|d+|S)Nr5r)rIrrWr)rrrr ligComponentsrr _eltContents r0r>zSTXHeader._xmlReadLigComponentssN .4Wg.F B *GX{.($$Xhw.?%@A Br2cpg}tt|D] \}}}|dk(s |j|d"|S)Nr;rN)rIrrW)rrrrligsrrrCs r0r?zSTXHeader._xmlReadLigaturessD.4Wg.F / *GX{*$ HW-. / r2r,)rUrrrrrrrrrr rrrrr6rr=r>r?rr2r0rrs^EG '-^P 5,n.4# ##&P ,r2rc&eZdZdZddZdZdZy) CIDGlyphMapc|j}i}t|j|D]\}}|dk7s |j|||<!|S)Nrt)rrrrZ)rrrrnumCIDsrcidrqs r0rzCIDGlyphMap.read(s[##%%f&<&s4' / $JC Uf_##Es%#@!!# $ r2r,rrr2r0rGrG's7r2rGc&eZdZdZddZdZdZy) GlyphCIDMapcL|j}|j}|j|}|t|kDr#tj d|t|fzi}t tt|t|D]}||} | dk7s| |||<|S)NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restrt)rcrrrrirjrmin) rrrr glyphOrderrcidsrrqrJs r0rzGlyphCIDMap.readJs'') !!#%%e, 3z? " KK$',c*o&>?  STC O<= 2Gw-Cf}.1z'*+ 2 r2Nc*|jDcic]\}}||dk7r|j|| }}}|rt|dznd} |j| t | D]#} |j|j | d%ycc}}w)NrtrrrL) rrrrrrr7rJrrrqs r0rzGlyphCIDMap.write[s ++- 33&= OOA  #  #(E QQ5!U| ;G   uyy&9 : ; s#Bcpi}tt|D] \}}}|dk(s t|d||d<"|S)NrNrrN)rIrrrPs r0rzGlyphCIDMap.xmlReadfsK(.w(@ D $E69~*26'?*Cvg' D r2c&|j|||jt|jD]2\}}| |dk7s|j d|||j4|j ||jy)NrtrNr0rU)rrrrr]rrNrJs r0rzGlyphCIDMap.xmlWritems4' / $JE33&=##Ec#B!!# $ r2r,rrr2r0rWrWIs" ;r2rWc&eZdZdZddZdZdZy) DeltaValuec*|d}|d}|d}|dvsJd||z dz}d|z}d|z} d|zdz } d|dz z} g} d\} }t|D]A}|dk(r|jd }} ||z }| |z | z}|| zr|| z }| j|C| S) N StartSizeEndSize DeltaFormatrr r:illegal DeltaFormatr)rrrr)rrrW)rrrrrbrcrdnItemsnBits minusOffsetmasksignMaskr`tmpshiftrrs r0rzDeltaValue.readysk* I& . i'>)>>'9$q([ 5j U a#  Uv %Az#..0"UEMEE\T)Ex +   e $ %r2Nc$|d}|d}|d}|} |dvsJd||z dz} d|z} t| | k(sJd| zdz } d\} }| D].}|| z }| || z|zz} |dk(s|j| d\} }0|d k7r|j| yy) Nrbrcrdrerfr)rrrr)rr )rrrrrrrbrcrdr`rgrhrjrlrms r0rzDeltaValue.writesk* I& .  i'>)>>'9$q([ :&(((U a U #EEME%$,501Cz""3'" U  # B;   s # r2cT|j||d|fgz|jyrrrrs r0rzDeltaValue.xmlWrite+D%GU+;*<"<=r2ct|dSrrrs r0rzDeltaValue.xmlReadg''r2r,rUrrrrrrrr2r0r`r`xs.$*(r2r`ceZdZdZddZy)VarIdxMapValuec|d}|d}d|dzz}d|zdz }d|z }d|z } d|dzdz z} |j|j|j|jd | } | |D cgc]} | |z| z| |zzc} Scc} w) N EntryFormatrrrrlr0rrr r:rr3rreadUInt24Arrayr) rrrrfmtrg innerBits innerMask outerMask outerShift entrySizerraws r0rzVarIdxMapValue.reads &>*v& )^q( * )^ #,1,- $$%%%%$$    !( Y:-# / B   s,BNc>|d}|}|djt|d|dzz}d|zdz } d|z } d|dzdz z} |j|j|j|j d| } | |D cgc]} | d z| z | | zzc} ycc} w) Nryrrrrrrzrr{l)setValuerr7r#writeUInt24Arrayr)rrrrrrr~rrrrrridxs r0rzVarIdxMapValue.writes &~''G 5v& )^q( )^ #,1,- %%&&&&%%     # # 2sYG   s=Br,rrr2r0rwrws  , r2rwc&eZdZdZddZdZdZy) VarDataValuecPg}|d}|d}t|dz}|dz}|r|j|j} }n|j|j} }t ||t ||} } |j || |j | | | z | |kDr||d=|S)Nrq NumShorts)boolrrr)rYrextend) rrrrrS regionCount wordCount longWords readBigArrayreadSmallArrayn1n2s r0rzVarDataValue.reads 01 k* V+, & +1+?+?AVAV.L+1+@+@&BVBV.L[),c+y.IB l2&' nR"W-. {|$ r2NcD|d}|d}t|dz}|dz}|j|jf|j|jfd|\} } t ||t ||} } | |d| | || || |kDr|j dg| |z zyy)Nrqrrrrr)rrr-rrYrwriteSmallArray) rrrrrSrrrr writeBigArrayrrrs r0rzVarDataValue.writes 01 k* V+, & **F,A,AB((&*@*@A,  ,( [),c+y.IBfSbk"r+./   " "A3"{*:#; < r2cT|j||d|fgz|jyrrprs r0rzVarDataValue.xmlWriterqr2ct|dSrrsrs r0rzVarDataValue.xmlRead rtr2r,rurr2r0rrs.=&(r2rc&eZdZdZddZdZdZy) TupleValuesc4tjd|dSr)r decompileDeltas_)rrrs r0rzTupleValues.reads..tT:1==r2Ncj|jt}ttj|| S)N) optimizeSize)cfgrbytesr compileDeltaValues_)rrrrrSr optimizeSpeeds r0rzTupleValues.writes1!45   . .v DU V  r2ct|dSrrsrs r0rzTupleValues.xmlReadrtr2cT|j||d|fgz|jyrrprs r0rzTupleValues.xmlWriterqr2r,rrr2r0rrs> (r2rc:eZdZ d dddddZdZd dZdZdZy) CFF2IndexNrh) itemClassitemConverterClassrCcttj||||||||_| ||_yd|_yr)rgr _itemClass _converter)rr]r^r_rQrrrCs r0rzCFF2Index.__init__#sJ  $Z[  $$6$B   HL r2cjdk(rgSjd}jduxrdkD}|s|dz}g}|jd}j |dz |D]} || ksJj | |z } j 0j } | j | j| } n(jjj| } |j| | }|Sfd} | } t| gz}|S)Nrcf|j|j|j|jd|S)Nr{r|)roffSizes r0 getReadArrayz$CFF2Index.read..getReadArray<s:(())))((    r2Frrc j jdzzzdz  fd}|S)Nrcr j|zzd} j|dz j|d|dz } j1 j}|j| j|}|S j  j j |}|S)Nr rr)rrrr localStaterr) rrrobjdata_posrr offset_posrrrs r0rz8CFF2Index.read..get_read_item..read_itemcs$$Z!g+%=>'lG$$X %:;&// WQZ0GHD2"oo/ dD+2H2HI" K4#33D$?Kr2r) rrrrrrrrrrrs @@@@r0rz%CFF2Index.read..get_read_item]sM$kkm #ZZ %g(==A(g>    ! r2) rr1rpoprrrrrrrWr)rrrrrrrr lastOffsetrrrrrrrrrs``` @@@r0rzCFF2Index.read6sL  " A:I""$ !1 yy%3%!) *GE QJ OOJN +! $!V+++v ':;??.//+CMM$f.?.?@D__0??//d;D T"#  $L ! !,&I)u,-AHr2c |}|jt|t|sy|j|Dcgc]}|j|}}nF|j:t |Dcgc]$\}}|jj |||||&}}}|Dcgc] }t|} }tt| d} | d} | dkrdn| dkrdn| dkrdnd } |j| |j|j|j|jd | } | | |D]}|j|ycc}wcc}}wcc}w) Nr)initialr&ir ir:rr{)rrrrzrrrrGr'r5r7r#rrr) rrrrrSrrrrrrrrs r0rzCFF2Index.writezsl#e*%5z  ?? &49:DT\\$':E: __ ( )/At%%fdItQGE *//3t9//z'156R[ E!  7*Z)5KQR  '"%%&&&&%%     7 #D   T " #5; 0sE.)E Ec|j&|j}|jd||||S|j|jj|||St r,)rrrrr)rrrrrs r0rzCFF2Index.xmlReads[ ?? &//#C KKeWd 3J __ (??**5'4@ @%' 'r2c |j+t|D]\}}|j||d|fg|y|j9t|D]*\}}|jj |||||d|fgz,yt )Nr2)rrrrrr)rrrrr]rrrs r0rzCFF2Index.xmlWrites ?? &$U+ B4 9dgq\NDA B __ ($U+ 4((tT47A,1G  &' 'r2r,)rUrrrrrrrrr2r0rr"s3    &BH##J( (r2rceZdZdZy) LookupFlagc|j||d|fgzg}|dzr|jd|dzr|jd|dzr|jd|dzr|jd |d zr|jd |d zr|jd |dz z|r |jdj||j y)Nrr rightToLeftr ignoreBaseGlyphsrignoreLigaturesr ignoreMarksruseMarkFilteringSetizmarkAttachmentType[%i]rq)rrWrFrrrrss r0rzLookupFlag.xmlWritesD%GU+;*<"<= 4< LL ' 4< LL+ , 4< LL* + 4< LL ' 4< LL. / 6> LL1UaZ@ A    chhuo .r2NrGrr2r0rrsr2rcBeZdZeZfdZedZedZxZ S) _UInt8EnumcD|jt| |||Sr,) enumClassrr)rrrrrs r0rz_UInt8Enum.reads~~egl64CDDr2cJt|j|jSr,)rrupperrs r0rz_UInt8Enum.fromStringss}}ekkm44r2cT|j|jjSr,)rr]lowerrs r0rz_UInt8Enum.toStrings }}U#((..00r2) rUrrrrrrrrrrs@r0rrs6IE5511r2rceZdZeZy)r#N)rUrr _ExtendModerrr2r0r#r#sIr2r#ceZdZeZy)r$N)rUrr_CompositeModerrr2r0r$r$sIr2r$int8int16int32r9r5uint24r:char64rOffsetLOffsetOffset24 TupleList)rVarCompositeGlyphList)rc$tt|SN)rQ)r(r:Cs r0r1r1 79;r2c$tt|Sr)r(rrs r0r1r1s1HUV)Wr2c$tt|Sr)r(rrs r0r1r1rr2c$tt|Sr)r(rTrs r0r1r1s '%A6r2c$tt|Sr)r(rrs r0r1r1s 76a8r2c$tt|Sr)r(r rs r0r1r1s WW;r2) rGrWrDrErFr"r:rrOffsetTo LOffsetTo LOffset24To)|fontTools.misc.fixedToolsrrrrrrrrrrrr%fontTools.ttLib.tables.TupleVariationr fontTools.misc.roundToolsr r fontTools.misc.textToolsr r rrrfontTools.misc.lazyToolsrfontTools.ttLibrrr8rrrrrotTablesrrrrrrr r!r"r#rr$rr% itertoolsr&r' functoolsr(typesr)rrtypingr*logging getLoggerrUrirreobjectrgrrrrrrr r rr%r/r9rCrJrKrLrNrTrbrermrvr{rrrrrrrrOrMrTrr r=r;r<r>r4r/r:rrrrGrWr`rwrrrrrrNrr2r0rs1AJMM-?    .! g! (=(@eFeP/-/" K { &8 & 'H '  e !}e! 'H ' (X ( &8 & 'H ' "X" (  K  [&  K +AkA& V    ..0Z0:N n >G>0% k0[>D4]D4N>v>6+F+DUeMMLuLG&(G LEL 8(8&+0t t|8=m8=v|>M|>Bp pf -D,-,^2(2(j- ]- `0(=0(f$Q( Q(h* 1 1J2 D2 U2 T 2  U 2  f 2 f2 e2 f2w22w2 32w22  f!2"*#2$ U%2&w'2( U)2*;+2, f-2. e/20v122324;526*728n92:L;2<*=2>*?2@]A2BC2D{CE2FWY:KLG2J!$!);W;68;c2r2