)Ej.FdZddlmZmZddlmZddlmZddlmZm Z ddl m Z ddl m Z ddlmZmZdd lmZdd lmZmZdd lmZmZdd lmZmZmZGd deZGddeZGddeZ GddeZ!GddeZ"Gdde"Z#Gdde"Z$dZ%Gdde"Z&ddd Z'Gd!d"eZ(Gd#d$Z)d%S)&zGlyphSets returned by a TTFont.)ABCabstractmethod)Mapping)contextmanager)copydeepcopy)SimpleNamespace)Vector)otRound fixedToFloat)deprecateFunction) TransformDecomposedTransform) TransformPenTransformPointPen)DecomposingRecordingPenlerpRecordingsreplayRecordingceZdZdZdddZedefdZedZdZ d Z d Z e d e d ZdS) _TTGlyphSetzlGeneric dict-like GlyphSet class that pulls metrics from hmtx and glyph shape from TrueType or CFF. T recalcBoundsc6||_||_d|jvrd|jdjDni|_||ni|_i|_||ni|_d|_g|_g|_ ||_ |dj |_ t|ddd|_d|_|r_ddlm}t|dd d|_|j+||jj|dj||_dSdSdS) Nfvarci|] }|jd S)raxisTag).0axiss LC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/ttLib/ttGlyphSet.py z(_TTGlyphSet.__init__..s @ @ @T\1 @ @ @rhmtxvmtxmetricsVarStoreInstancerHVARtable)rfontaxesdefaultLocationNormalizedlocation rawLocationoriginalLocationdepth locationStackrawLocationStack glyphsMappingr%hMetricsgetattrgetvMetrics hvarTablefontTools.varLib.varStorer'VarStore hvarInstancer)selfr*r-r3rr's r __init__z_TTGlyphSet.__init__sK( "" A @6):)? @ @ @ @ & %-$8b ,4,@b  "*V ,  0 0)TBB    C C C C C C$TXXf%5%5wEEDN~)%6%6N+T&\->&&"""   *)r"resetc#K|j|j|j|j|r=|j|_|j|_n%|j|_i|_|j||j| dV|j |_|j |_dS#|j |_|j |_wxYwN) r1appendr-r2r.r/rr,updatepop)r<r-r>s r pushLocationz_TTGlyphSet.pushLocation5s8 !!$-000 $$T%5666  " 16688DM#=BBDDD   M..00DM!D  X&&& ))) ;JJJ .2244DM#488::D   !.2244DM#488::D  : : : :s D>Ec#K |j}|xjdz c_|V|xjdzc_dS#|xjdzc_wxYw)N)r0)r<r0s r pushDepthz_TTGlyphSet.pushDepthHsT JE JJ!OJJKKK JJ!OJJJJDJJ!OJJJJJJs 1Ac||jvSr@r3r< glyphNames r __contains__z_TTGlyphSet.__contains__QsD...r"cNt|jSr@)iterr3keysr<s r __iter__z_TTGlyphSet.__iter__TsD&++--...r"c*t|jSr@)lenr3rPs r __len__z_TTGlyphSet.__len__Ws4%&&&r"z#use 'glyphName in glyphSet' instead)categoryc||jvSr@rIrJs r has_keyz_TTGlyphSet.has_keyZsD...r"N)__name__ __module__ __qualname____doc__r=rboolrDrGrLrQrTr DeprecationWarningrWr"r rrsGK8;D;;;^;$^//////'''-8J/////r"rc&eZdZdfd ZdZxZS)_TTGlyphSetGlyfTc|d|_t|||j||d|_dS)Nglyfrgvar) glyfTablesuperr=r6 gvarTable)r<r*r-r __class__s r r=z_TTGlyphSetGlyf.__init__bsHf xlSSS&))r"c0t|||jS)Nr) _TTGlyphGlyfrrJs r __getitem__z_TTGlyphSetGlyf.__getitem__gsD)$:KLLLLr")TrXrYrZr=rj __classcell__rgs@r r`r`asS****** MMMMMMMr"r`cFeZdZfdZdZdZedefdZxZ S)_TTGlyphSetCFFc d|vrdnd}t||jdj|_t |||j||dS)NCFF2zCFF r)listcffvalues CharStrings charStringsrer= setLocation)r<r*r-tableTagrgs r r=z_TTGlyphSetCFF.__init__lsx#t^^66X 2 9 9 ; ;< $#  DLLLr"r>c#K||t|||5} |V||jn#||jwxYw ddddS#1swxYwYdSr@)rwrrDr-)r<r-r>values r rDz_TTGlyphSetCFF.pushLocations """  % %dHe < < 0 0   ////  /////  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s'BABA11BB B) rXrYrZr=rjrwrr\rDrlrms@r roroks}##### ,,,   0D000^00000r"roc$eZdZfdZdZxZS)_TTGlyphSetVARCc||_t||||dj|_dS)NVARC)glyphSetrer=r) varcTable)r<r*r-rrgs r r=z_TTGlyphSetVARC.__init__s8   x222f+r"cf|j}||jjvr |j|St ||Sr@)rCoverageglyphsr _TTGlyphVARC)r<rKvarcs r rjz_TTGlyphSetVARC.__getitem__s6~ DM0 0 0=+ +D),,,r"rkrms@r rrsG,,,,, -------r"rc:eZdZdZdddZedZdZdS)_TTGlyphaSGlyph object that supports the Pen protocol, meaning that it has .draw() and .drawPoints() methods that take a pen object as their only argument. Additionally there are 'width' and 'lsb' attributes, read from the 'hmtx' table. If the font contains a 'vmtx' table, there will also be 'height' and 'tsb' attributes. Trc||_||_||_|j|\|_|_|j|j|\|_|_nd\|_|_|j ra|j \|j j |j |n|j j j|}|xj|j|z c_dSdSdS)NNN)rnamerr4widthlsbr7heighttsbr-r8 AdvWidthMapr* getGlyphIDmappingr;)r<rrKrvaridxs r r=z_TTGlyph.__init__s   ('0; DH   ($,$5i$@ !DK$. !DK   9!3!?%19 ((333'3;IF  JJ(08 8JJJJ  9 9!?!?r"ct)dDraw the glyph onto ``pen``. See fontTools.pens.basePen for details how that works. )NotImplementedErrorr<pens r drawz _TTGlyph.draws "!r"cNddlm}|||dS)eDraw the glyph onto ``pen``. See fontTools.pens.pointPen for details how that works. r)SegmentToPointPenN)fontTools.pens.pointPenrr)r<rrs r drawPointsz_TTGlyph.drawPointss: >===== ##C(()))))r"N)rXrYrZr[r=rrrr^r"r rrsg=A99999$""^" *****r"rc&eZdZdZdZdZdZdS)ric|\}}|j5}|rd}|||jj|ddddS#1swxYwYdS)rrN)_getGlyphAndOffsetrrGrrdr<rglyphoffsetr0s r rz_TTGlyphGlyf.draws//11 v ] $ $ & & =%  JJsDM3V < < <  = = = = = = = = = = = = = = = = = =&A$$A(+A(c|\}}|j5}|rd}|||jj|ddddS#1swxYwYdS)rrN)rrrGrrdrs r rz_TTGlyphGlyf.drawPointss//11 v ] $ $ & & C%    S$-"96 B B B  C C C C C C C C C C C C C C C C C Crc|jjr!|jj|}n|jj|j}t |dr|j|jz nd}||fS)NxMinr) rr-rf_getGlyphInstancerdrhasattrrr)r<rrs r rz_TTGlyphGlyf._getGlyphAndOffsetsi = ! 7dm&=&I**,,EEM+DI6E*1%*@*@GEJ&&af}r"c ddlm}ddlm}ddlm}|j}|j}|jj |j }|j }|j }| |j ||\} } d\} } |D]} ||j| j}|s| j}d|vrq| b| |j ||\} }|ddkr|dn.t#t%t'|d} ||| | }| |||zz } t)||j }t+|| ||j\}}}}||_||_|j||_||_|S)Nr) iup_delta)GlyphCoordinates) supportScalarrrFr)fontTools.varLib.iuprfontTools.ttLib.tables._g_l_y_frfontTools.varLib.modelsrrrdrf variationsrr4r7_getCoordinatesAndControlsr-r+ coordinatesrrrangerSr_setCoordinatesrrrr8rr)r<rrrrrdrr4r7r_ origCoordsendPtsvarscalardeltacontrolrrrrrs r rz_TTGlyphGlyf._getGlyphInstances222222DDDDDD999999=& '249= $$"== Ix   Q( F < .is3/3q!HQK'r"T)2fontTools.ttLib.tables.otTablesrrrrrrindexrVarCompositeGlyphsVarCompositeGlyphfontTools.varLib.multiVarStorerr9r'r*r+ MultiVarStorer- componentsflagsHAVE_CONDITION ConditionListrconditionIndexraxisIndicesIndexAxisIndicesListItemr axisValuesaxisValuesVarIndexfi2flrSziptransformVarIndexrapplyTransformDeltas transformRESET_UNSPECIFIED_AXESrDrKaddVarComponentr.AttributeError toTransformrrrr)r<r isPointPenrrrridxrrr'rcomprr- axisIndicesrdeltasrr>shouldDecomposet compGlyphSetgtPenrs @r _drawz_TTGlyphVARC._drawAs$        =!m"((33'9#>IIIIII??????=(-**  $-*@  $6 )6 )Dz-<<  .=d>QR )x)?H$0"278MN #DO44 *.@@@% $2I(JB"O"OOJ;''3z??::: $$ OO=:::7:; 7S7S%);;;"4#9:~~))&111IJ!2!IIE'44XuEE ) )]//%@@))&*i4>&AO*33// $ 4=;T .333.2OOO3' )%1133 $~::!MM!)!2% )8%)#4S!#<#z#_setCoordinates..sDDD4DJJDDDr"x)rSr isCompositerrrrynumberOfContoursrrr ryMax)rcoordrdr leftSideX rightSideXtopSideY bottomSideYrprhorizontalAdvanceWidthverticalAdvanceWidthleftSideBearingtopSideBearings r rrs u::????b ! Ir1JRy|H)A,K 1XX "II  "5zzS!1222222DD53CDDD5%"233 # #GAttS!! #!" #  1 $ $5zzQ5zzS!2333333!& 9%%%$Z)%;<<"8k#9::ej9455OX 233N  r"c2eZdZdZd dZdZdZdZdZdS) LerpGlyphSeta+A glyphset that interpolates between two other glyphsets. Factor is typically between 0 and 1. 0 means the first glyphset, 1 means the second glyphset, and 0.5 means the average of the two glyphsets. Other values are possible, and can be useful to extrapolate. Defaults to 0.5. ?c0||_||_||_dSr@) glyphset1 glyphset2factor)r<r&r'r(s r r=zLerpGlyphSet.__init__s"" r"cd||jvr||jvrt||St|r@)r&r' LerpGlyphKeyErrorr< glyphnames r rjzLerpGlyphSet.__getitem__s9  & &9+F+FY-- -y!!!r"c&||jvo||jvSr@)r&r'r,s r rLzLerpGlyphSet.__contains__sDN*JyDN/JJr"ct|j}t|j}t||Sr@)setr&r'rN intersectionr<set1set2s r rQzLerpGlyphSet.__iter__s<4>""4>""D%%d++,,,r"ct|j}t|j}t||Sr@)r0r&r'rSr1r2s r rTzLerpGlyphSet.__len__s<4>""4>""4$$T**+++r"N)r$) rXrYrZr[r=rjrLrQrTr^r"r r#r#sq """ KKK--- ,,,,,r"r#ceZdZdZdZdS)r*c"||_||_dSr@)glyphsetr-)r<r-r8s r r=zLerpGlyph.__init__s  "r"c|t|jj}|jj|j|t|jj}|jj|j||jj}tt|j |j ||dSr@) rr8r&r-rr'r(rrr)r<r recording1 recording2r(s r rzLerpGlyph.draws,T]-DEE  /44Z@@@,T]-DEE  /44Z@@@%z'79I6RRTWXXXXXr"N)rXrYrZr=rr^r"r r*r*s7###YYYYYr"r*N)*r[abcrrcollections.abcr contextlibrrrtypesr fontTools.misc.vectorr fontTools.misc.fixedToolsr r rfontTools.misc.loggingToolsr fontTools.misc.transformrrfontTools.pens.transformPenrrfontTools.pens.recordingPenrrrrr`rorrrirzrrrr#r*r^r"r rFs#%%##############%%%%%%!!!!!!((((((DDDDDDDD999999CCCCCCCCGGGGGGGGJ/J/J/J/J/'J/J/J/ZMMMMMkMMM!0!0!0!0!0[!0!0!0H - - - - -k - - -)*)*)*)*)*s)*)*)*XJJJJJ8JJJZNNNNN(NNN   FSSSSS8SSSl>B#####L,,,,,7,,,B Y Y Y Y Y Y Y Y Y Yr"