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øªjåÛã@sždZddlmZmZmZmZddlmZmZm Z ddl m Z ddl m Z ddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlZddlmZddl m!Z!ddl"Z"ddl#m$Z$ddl%Z%ddl&Z&e"j'dƒZ(Gdd„dej)ddƒƒZ*Gdd„de*ƒZ+Gdd„de!ƒZ,dndd„Z-dd„Z.dd„Z/d d!„Z0d"d#„Z1dod%d&„Z2dpd'd(„Z3dqd)d*„Z4d+d,„Z5d-d.„Z6d/d0„Z7d1d2„Z8d3d4„Z9d5d6„Z:d7d8„Z;d9d:„Zd=d>„Z?d?d@„Z@dAdB„ZAdCdD„ZBdEdF„ZCdGdH„ZDdIdJ„ZEdKdL„ZFdMdN„ZGdOdP„ZHdQdR„ZIdSdT„ZJdUdV„ZKdWdX„ZLdYdZ„ZMd[d\„ZNdrd]d^„ZOd_d`„ZPdadb„ZQdcd$e,jRdcfddde„ZSe*fdfdg„ZTdhdi„ZUdjdk„ZVdsdldm„ZWdS)tas Partially instantiate a variable font. The module exports an `instantiateVariableFont` function and CLI that allow to create full instances (i.e. static fonts) from variable fonts, as well as "partial" variable fonts that only contain a subset of the original variation space. For example, if you wish to pin the width axis to a given location while also restricting the weight axis to 400..700 range, you can do: $ fonttools varLib.instancer ./NotoSans-VF.ttf wdth=85 wght=400:700 See `fonttools varLib.instancer --help` for more info on the CLI options. The module's entry point is the `instantiateVariableFont` function, which takes a TTFont object and a dict specifying either axis coodinates or (min, max) ranges, and returns a new TTFont representing either a partial VF, or full instance if all the VF axes were given an explicit coordinate. E.g. here's how to pin the wght axis at a given location in a wght+wdth variable font, keeping only the deltas associated with the wdth axis: | >>> from fontTools import ttLib | >>> from fontTools.varLib import instancer | >>> varfont = ttLib.TTFont("path/to/MyVariableFont.ttf") | >>> [a.axisTag for a in varfont["fvar"].axes] # the varfont's current axes | ['wght', 'wdth'] | >>> partial = instancer.instantiateVariableFont(varfont, {"wght": 300}) | >>> [a.axisTag for a in partial["fvar"].axes] # axes left after pinning 'wght' | ['wdth'] If the input location specifies all the axes, the resulting instance is no longer 'variable' (same as using fontools varLib.mutator): | >>> instance = instancer.instantiateVariableFont( | ... varfont, {"wght": 700, "wdth": 67.5} | ... ) | >>> "fvar" not in instance | True If one just want to drop an axis at the default location, without knowing in advance what the default value for that axis is, one can pass a `None` value: | >>> instance = instancer.instantiateVariableFont(varfont, {"wght": None}) | >>> len(varfont["fvar"].axes) | 1 From the console script, this is equivalent to passing `wght=drop` as input. This module is similar to fontTools.varLib.mutator, which it's intended to supersede. Note that, unlike varLib.mutator, when an axis is not mentioned in the input location, the varLib.instancer will keep the axis and the corresponding deltas, whereas mutator implicitly drops the axis at its default coordinate. The module currently supports only the first three "levels" of partial instancing, with the rest planned to be implemented in the future, namely: L1) dropping one or more axes while leaving the default tables unmodified; L2) dropping one or more axes while pinning them at non-default locations; L3) restricting the range of variation of one or more axes, by setting either a new minimum or maximum, potentially -- though not necessarily -- dropping entire regions of variations that fall completely outside this new range. L4) moving the default location of an axis. Currently only TrueType-flavored variable fonts (i.e. containing 'glyf' table) are supported, but support for CFF2 variable fonts will be added soon. The discussion and implementation of these features are tracked at https://github.com/fonttools/fonttools/issues/1537 é)ÚfloatToFixedToFloatÚstrToFixedToFloatÚotRoundÚ MAX_F2DOT14)Ú supportScalarÚnormalizeValueÚpiecewiseLinearMap)ÚTTFont)ÚTupleVariation)Ú_g_l_y_f)ÚvarLib)Úsubset)Úbuilder)Ú MVAR_ENTRIES)Ú MutatorMerger)Únames)ÚcontextmanagerN)Údeepcopy)ÚIntEnum)ÚislicezfontTools.varLib.instancercs$eZdZ‡fdd„Zdd„Z‡ZS)Ú AxisRangecsBtƒj|f|ž|Ž}|j|jkr>td|jd›d|jd›d�ƒ‚|S)NzRange minimum (Úgz) must be <= maximum (ú))ÚsuperÚ__new__ÚminimumÚmaximumÚ ValueError)ÚclsÚargsÚkwargsÚself)Ú __class__©úH/tmp/pip-build-_d5lkt3n/fonttools/fontTools/varLib/instancer/__init__.pyrfs  zAxisRange.__new__cCs$t|ƒj›d|jd›d|jd›d�S)Nú(rz, r)ÚtypeÚ__name__rr)r!r#r#r$Ú__repr__nszAxisRange.__repr__)r'Ú __module__Ú __qualname__rr(Ú __classcell__r#r#)r"r$res rzminimum maximumcseZdZ‡fdd„Z‡ZS)ÚNormalizedAxisRangecshtƒj|f|ž|Ž}|jdks(|jdkr0tdƒ‚|jdkrJtd|j›�ƒ‚|jdkrdtd|j›�ƒ‚|S)Ngð?z4Axis range values must be normalized to -1..+1 rangerz&Expected axis range minimum <= 0; got z&Expected axis range maximum >= 0; got gð¿)rrrrr)rrr r!)r"r#r$rss  zNormalizedAxisRange.__new__)r'r)r*rr+r#r#)r"r$r,rsr,c@seZdZdZdZdZdZdS)Ú OverlapModeréééN)r'r)r*ZKEEP_AND_DONT_SET_FLAGSÚKEEP_AND_SET_FLAGSÚREMOVEÚREMOVE_AND_IGNORE_ERRORSr#r#r#r$r-~sr-c CsØt|td�\}}|}|r"t||ƒ}|r0t||ƒ}tjƒ}xP|D]H}|dk rV|j||ƒt|jj ƒƒ} | |kr~|| |7<q>||| <q>W|j tƒdƒ} x|j ƒD] }|j ƒq¢Wt |j ƒƒ|dd…<| dk rÔ| jSgS)a Instantiate TupleVariation list at the given location, or limit axes' min/max. The 'variations' list of TupleVariation objects is modified in-place. The 'axisLimits' (dict) maps axis tags (str) to either a single coordinate along the axis (float), or to minimum/maximum coordinates (NormalizedAxisRange). A 'full' instance (i.e. static font) is produced when all the axes are pinned to single coordinates; a 'partial' instance (i.e. a less variable font) is produced when some of the axes are omitted, or restricted with a new range. Tuples that do not participate are kept as they are. Those that have 0 influence at the given location are removed from the variation store. Those that are fully instantiated (i.e. all their axes are being pinned) are also removed from the variation store, their scaled deltas accummulated and returned, so that they can be added by the caller to the default instance's coordinates. Tuples that are only partially instantiated (i.e. not all the axes that they participate in are being pinned) are kept in the store, and their deltas multiplied by the scalar support of the axes to be pinned at the desired location. Args: variations: List[TupleVariation] from either 'gvar' or 'cvar'. axisLimits: Dict[str, Union[float, NormalizedAxisRange]]: axes' coordinates for the full or partial instance, or ranges for restricting an axis' min/max. origCoords: GlyphCoordinates: default instance's coordinates for computing 'gvar' inferred points (cf. table__g_l_y_f._getCoordinatesAndControls). endPts: List[int]: indices of contour end points, for inferring 'gvar' deltas. Returns: List[float]: the overall delta adjustment after applicable deltas were summed. )Ú rangeTypeN)ÚsplitAxisLocationAndRangesr,ÚpinTupleVariationAxesÚlimitTupleVariationAxisRangesÚ collectionsÚ OrderedDictZcalcInferredDeltasÚ frozensetÚaxesÚitemsÚpopÚvaluesZ roundDeltasÚlistÚ coordinates) Ú variationsÚ axisLimitsZ origCoordsÚendPtsZpinnedLocationÚ axisRangesÚ newVariationsZmergedVariationsÚvarr;Z defaultVarr#r#r$ÚinstantiateTupleVariationStore…s(!      rGcsPg}xF|D]>‰‡fdd„|Dƒ}t||ƒ}|dkr4q ˆj|ƒ|jˆƒq W|S)Ncsi|]}ˆjj|dƒ|“qS)r.réÿÿÿÿr.)rHrr.)r;r=)Ú.0Úaxis)rFr#r$ú Ñsz)pinTupleVariationAxes..g)rÚ scaleDeltasÚappend)rAÚlocationrEZsupportÚscalarr#)rFr$r6Ês   r6cCsFx@t|jƒƒD]0\}}g}x|D]}|jt|||ƒƒq W|}qW|S)N)Úsortedr<ÚextendÚlimitTupleVariationAxisRange)rArDÚaxisTagÚ axisRangerErFr#r#r$r7Üs  r7cgsdd„|DƒEdHdS)Ncss|]}d|VqdS)r.NrHr#)rIÚvr#r#r$ú æsz_negate..r#)r>r#r#r$Ú_negateåsrWcCsrt|tƒst|Ž}|jj|dƒ\}}}|dksN||ksN||ksN|dkrT|dkrT|gS|dk}|r€|jd krp|gS|jdkržgSn|jdkr�|gS|jdkržgS|r¨|jn|j}||}||} ||} |rÔ| |}} || koædkn�r|�rød nd|j|<|gS|dk�rgS| dk�rxt||i||||fiƒ} |j| ƒd} d} |�rbt| | |ƒ\}} } || | f|j|<|gS| dk�rÒ|�rœt| | |ƒ\}} } n t | k�o°dkn�r¼t } || | f|j|<|gSt |j|j ƒ} |�rdd| d|f|j|<ddd| f| j|<n || t f|j|<| ddf| j|<t||i||||fiƒ} dd| }| j| |ƒ|| gSdS)Nr.rçð?gg@r/rH)rHrr.gð¿çð¿çð¿çð¿)rYrZr[)rXrXrXgÀrHrHgð¿gð¿rH) Ú isinstancer,r;ÚgetrrrrLrWrr r@)rFrSrTÚlowerZpeakÚupperÚnegativeÚlimitZnewLowerZnewPeakZnewUpperrOZnewVarZscalar1Zscalar2r#r#r$rRésh (           rRTcCs¢|j|||ƒ\}}|j} |jj|ƒ} | rHt| ||| ƒ} | rH|tj| ƒ7}|j||||ƒ| sr||jkrn|j|=dS|rž||jƒ} x| D]} | j || | ƒqˆWdS)N) Z_getCoordinatesAndControlsrCrAr]rGr ZGlyphCoordinatesZ_setCoordinatesÚ isCompositeÚoptimize)Ú glyphnameÚglyfÚgvarÚhMetricsÚvMetricsrBrcr@ZctrlrCÚ tupleVarStoreÚ defaultDeltasrbrFr#r#r$Ú_instantiateGvarGlyphGs"      rkc CsF|d}|d}|dj}t|jdƒddƒ}t|||||||d�dS)z�sz!instantiateGvar..)Úkey)rc) ÚlogÚinfornror]rPÚ glyphOrderrkrA)rprBrcrfrgrhZ glyphnamesrdr#)rer$ÚinstantiateGvarts   rxcCs2x,t|ƒD] \}}|r ||t|ƒ7<q WdS)N)Ú enumerater)ÚcvtÚdeltasÚiÚdeltar#r#r$Ú setCvarDeltas�sr~cCs@tjdƒ|d}t|j|ƒ}|r0t|d|ƒ|js<|d=dS)NzInstantiating cvt/cvar tablesÚcvarzcvt )rurvrGrAr~)rprBrrjr#r#r$ÚinstantiateCvar•s  r€c Csr|dj}|j}x\|D]T}|j}|tkr*qt|\}}||j}|dkrt|||t|||ƒt|ƒƒqWdS)NÚMVARr)ÚtableÚ ValueRecordZValueTagrÚVarIdxÚsetattrror) rpr{ÚmvarÚrecordsÚrecZmvarTagÚtableTagZitemNamer}r#r#r$Ú setMvarDeltas£s    rŠcCsrtjdƒ|dj}|dj}|j}t|||ƒ}t||ƒ|jjrh|j ƒ}x"|j D]}||j |_ qRWn|d=dS)NzInstantiating MVAR tabler�Úfvar) rurvr‚r;ÚVarStoreÚinstantiateItemVariationStorerŠÚ VarRegionListÚRegionrcrƒr„)rprBr†ÚfvarAxesÚvarStorerjÚvarIndexMappingrˆr#r#r$ÚinstantiateMVAR´s      r“cs8t||ƒj‰‡‡fdd„|Dƒ}t||tj||ƒƒdS)Ncsg|]}ˆˆ|‘qSr#r#)rIÚ glyphName)Ú oldMappingr’r#r$ú Çsz#_remapVarIdxMap..)roÚmappingr…rZbuildVarIdxMap)r‚ÚattrNamer’rwÚ newMappingr#)r•r’r$Ú_remapVarIdxMapÅs ršc Cs|j}|dj}tdd„|jƒDƒƒjdd„|DƒƒrLtjd|ƒ||=dStjd|ƒ||j}|j}t |||ƒ|j j �r t ||j ƒ�r |jƒ}|jƒ}t||j ||ƒt ||jƒrÈt||j||ƒt ||jƒrät||j||ƒ|dkoöt ||jƒ�r t||j||ƒdS)Nr‹css |]\}}t|tƒs|VqdS)N)r\Útuple)rIrSÚvaluer#r#r$rVÒsz$_instantiateVHVAR..css|] }|jVqdS)N)rS)rIrJr#r#r$rVÓszDropping %s tablezInstantiating %s tableÚVVAR)r‰r;Úsetr<Ú issupersetrurvr‚rŒr�rŽr�roZ advMappingrcZ getGlyphOrderršZsb1Zsb2Z vOrigMapping) rprBZ tableFieldsr‰r�Zvhvarr‘r’rwr#r#r$Ú_instantiateVHVARÌs0        r cCst||tjƒS)N)r r Z HVAR_FIELDS)rprBr#r#r$ÚinstantiateHVARðsr¡cCst||tjƒS)N)r r Z VVAR_FIELDS)rprBr#r#r$ÚinstantiateVVARôsr¢c@s8eZdZdd„Zedd„ƒZdd„Zdd„Zd d „Zd S) Ú_TupleVarStoreAdaptercCs||_||_||_||_dS)N)ÚregionsÚ axisOrderÚ tupleVarDataÚ itemCounts)r!r¤r¥r¦r§r#r#r$Ú__init__ùsz_TupleVarStoreAdapter.__init__c sªdd„ˆDƒ}‡fdd„|jjDƒ‰g}g}xn|jD]d}g}‡fdd„|jDƒ}x0t|t|jŽƒD]\} } |jt| t| ƒƒƒqbW|j|ƒ|j|j ƒq4W|ˆ|||ƒS)NcSsg|] }|j‘qSr#)rS)rIrJr#r#r$r–sz:_TupleVarStoreAdapter.fromItemVarStore..csg|]}|jˆƒ‘qSr#)Z get_support)rIÚregion)r�r#r$r–sc3s|]}ˆ|VqdS)Nr#)rIr|)r¤r#r$rV sz9_TupleVarStoreAdapter.fromItemVarStore..) rŽr�ÚVarDataZVarRegionIndexÚzipZItemrMr r?Z ItemCount) rÚ itemVarStorer�r¥r¦r§ZvarDatarAZvarDataRegionsr;r@r#)r�r¤r$ÚfromItemVarStoreÿs  z&_TupleVarStoreAdapter.fromItemVarStorecCsrtjjdd„|jDƒƒ}g}x2|jD](}t|jƒƒ}||kr$|j|ƒ||=q$W|rh|jdd„|Dƒƒ||_dS)Ncss&|]}|D]}t|jjƒƒVq qdS)N)r:r;r<)rIrArFr#r#r$rVsz7_TupleVarStoreAdapter.rebuildRegions..css|]}t|ƒVqdS)N)Údict)rIr©r#r#r$rV#s) r8r9Úfromkeysr¦r¤r:r<rMrQ)r!Z uniqueRegionsZ newRegionsr©Z regionAxesr#r#r$ÚrebuildRegionss     z$_TupleVarStoreAdapter.rebuildRegionscsvg}x1sz4_TupleVarStoreAdapter.instantiate..csg|]}|ˆkr|‘qSr#r#)rIrS)Ú pinnedAxesr#r$r–7sz5_TupleVarStoreAdapter.instantiate..)r«r¦r§rGrMr°r<r¥)r!rBÚdefaultDeltaArrayrAÚ itemCountrjr#)r²r$Ú instantiate&s   z!_TupleVarStoreAdapter.instantiatecsÒdd„|jDƒ‰g}x”t|j|jƒD]‚\}}|r†t|djƒ|ksFt‚‡fdd„|Dƒ}ttdd„|DƒŽƒ}|jt j ||dd�ƒq$|jt j gd d„t |ƒDƒƒƒq$Wt j |j|j ƒ}t j||ƒ}|jƒ|S) NcSsg|]}t|jƒƒ‘qSr#)r:r<)rIr;r#r#r$r–=sz8_TupleVarStoreAdapter.asItemVarStore..rcs g|]}ˆjt|jjƒƒƒ‘qSr#)Úindexr:r;r<)rIrF)Ú regionOrderr#r$r–Cscss|] }|jVqdS)N)r@)rIrFr#r#r$rVEsz7_TupleVarStoreAdapter.asItemVarStore..F)rccSsg|]}g‘qSr#r#)rIÚ_r#r#r$r–Ks)r¤r«r¦r§Úlenr@ÚAssertionErrorr?rMrZ buildVarDataÚrangeZbuildVarRegionListr¥Z buildVarStoreZ prune_regions)r!ZvarDatasrAr´ZvarRegionIndicesZ varDataItemsZ regionListr¬r#)r·r$ÚasItemVarStore<s  z$_TupleVarStoreAdapter.asItemVarStoreN) r'r)r*r¨Ú classmethodr­r°rµr¼r#r#r#r$r£øs  r£cCsTtj||ƒ}|j|ƒ}|jƒ}|j|_|j|jks6t‚|j|_dd„t|ƒDƒ}|S)aCompute deltas at partial location, and update varStore in-place. Remove regions in which all axes were instanced, or fall outside the new axis limits. Scale the deltas of the remaining regions where only some of the axes were instanced. The number of VarData subtables, and the number of items within each, are not modified, in order to keep the existing VariationIndex valid. One may call VarStore.optimize() method after this to further optimize those. Args: varStore: An otTables.VarStore object (Item Variation Store) fvarAxes: list of fvar's Axis objects axisLimits: Dict[str, float] mapping axis tags to normalized axis coordinates (float) or ranges for restricting an axis' min/max (NormalizedAxisRange). May not specify coordinates/ranges for all the fvar axes. Returns: defaultDeltas: to be added to the default instance, of type dict of floats keyed by VariationIndex compound values: i.e. (outer << 16) + inner. cSs0i|](\}}t|ƒD]\}}||d>|“qqS)é)ry)rIÚmajorr{Úminorr}r#r#r$rKrsz1instantiateItemVariationStore..) r£r­rµr¼rŽZ VarDataCountrºrªry)r¬r�rBrir³ZnewItemVarStorerjr#r#r$r�Ts   r�c Cs$d|ks&|djjdks&|djj r*dSd|kr8d}nd}tj|ƒ|dj}|j}|dj}t|||ƒ}t|||jj d�}|j ||gddgƒ|jj rÈ|j ƒ}|j |ƒd|krÆ|djj |ƒnX|`d|_|j dkræ|` d |_|j�p|j�p|j�p|j�p|jdk�o|j �s |d=dS) NZGDEFiÚGPOSz"Instantiating GDEF and GPOS tableszInstantiating GDEF tabler‹)ZdeleteVariationsii)r‚ÚVersionrŒrurvr;r�rrŽr�Z mergeTablesrcZremap_device_varidxesZMarkGlyphSetsDefZ LigCaretListZMarkAttachClassDefZ GlyphClassDefZ AttachList) rprBÚmsgZgdefr‘r�rjZmergerr’r#r#r$ÚinstantiateOTLzs>      rÄcCs`xZdD]R}||kst||jddƒ r(qtjd|ƒt||j|dj|ƒ||jƒqWdS)NrÁÚGSUBÚFeatureVariationsz+Instantiating FeatureVariations of %s tabler‹)rÁrÅ)ror‚rurvÚ_instantiateFeatureVariationsr;Z prune_lookups)rprBr‰r#r#r$ÚinstantiateFeatureVariationsµs   rÈcCsjg}x4|jjD](}|jdkr dS|j|j|j|jfƒqWt|jj g|ƒ}||krXdS|j |ƒdSdS)Nr.TF) Ú ConditionSetÚConditionTableÚFormatrMÚ AxisIndexÚFilterRangeMinValueÚFilterRangeMaxValuer:ÚFeatureTableSubstitutionrÂÚadd)rˆÚseenZ conditionSetZcondZ recordKeyr#r#r$Ú_featureVariationRecordIsUniqueÃs  rÒcCsÂ|j}|j}||ks(||jks(||jkr,dS||g}x„t|ƒD]x\}}|dkrz|jdkr^d}q®|t|jƒ}|dkr®d}n4|dkrª|jdkr’d}q®||j}|dkr®d}nd}|||<q>Wt|ŽS)Nrgð?gð¿gð¿)rÍrÎrrryÚabsr)Ú conditionrTÚminValueÚmaxValuer>r|rœZnewValuer#r#r$Ú$_limitFeatureVariationConditionRangeÙs.      r×cCsØd}g}x°t|jjƒD] \}}|jdkr’|j} || j} | |krx|j} |j} || } | | kof| kns�d}d}Pq¶d}|| |_|j|ƒqt j dj |||jƒƒd}|j|ƒqW|rÌ||j_d}nd}||fS)NTr.FzWCondition table {0} of FeatureVariationRecord {1} has unsupported format ({2}); ignored) ryrÉrÊrËrÌrSrÍrÎrMruÚwarningÚformat)ÚrecordZrecIdxrNr�Ú axisIndexMapÚappliesÚ newConditionsr|rÔÚaxisIdxrSrÕrÖrUÚ shouldKeepr#r#r$Ú"_instantiateFeatureVariationRecordüs6    ràc Csªg}xŠt|jjƒD]z\}}|jdkr‚|j}||j}||krv||}t||ƒ} | rn| j|_| j |_ |j |ƒq€d}PqŒ|j |ƒq|j |ƒqW|r¢||j_d} nd} | S)Nr.TF) ryrÉrÊrËrÌrSr×rrÍrrÎrM) rÚrDr�rÝr|rÔrÞrSrTZnewRangerßr#r#r$Ú_limitFeatureVariationRecord$s*     rács t|td�\}}t|jƒƒ‰‡fdd„|Dƒ‰‡fdd„ˆDƒ}d}tƒ}g}x–t|jjƒD]†\} } t| | |||ƒ\} } | rˆt| ||ƒ} | r t | |ƒr |j | ƒ| r\| r\| j j dksºt ‚x"| j jD]} | j|jj| j_qÄWd}q\W|�r||j_t|ƒ|j_n|`dS) N)r4csg|]}|jˆkr|j‘qSr#)rS)rIrJ)r²r#r$r–Isz1_instantiateFeatureVariations..csi|]}ˆj|ƒ|“qSr#)r¶)rIrS)r¥r#r$rKJsz1_instantiateFeatureVariations..FiT)r5r,ržÚkeysryrÆZFeatureVariationRecordràrárÒrMrÏrÂrºZSubstitutionRecordÚFeatureZ FeatureListZ FeatureRecordZ FeatureIndexr¹ZFeatureVariationCount)r‚r�rBrNrDrÛZfeatureVariationAppliedZ uniqueRecordsZ newRecordsr|rÚrÜrßrˆr#)r¥r²r$rÇDs0    rÇc Cs�|sdSdddhj|jƒƒs2tjd|›d�ƒdSd}xTt|jƒƒD]D\}}|dk r„||kr„tjd|›d|›d |›d |›d � ƒdS|}qDWdS)NTçð?rz)Invalid avar SegmentMap record for axis 'zH': does not include all required value maps {-1.0: -1.0, 0: 0, 1.0: 1.0}FzInvalid avar AxisValueMap(z, z) record for axis 'zX': the toCoordinate value must be >= to the toCoordinate value of the preceding record (z).çð¿çð¿)råræ)rr)rärä)Úissubsetr<rurØrP)rSZ segmentMapZ previousValueÚ fromCoordÚtoCoordr#r#r$Ú_isValidAvarSegmentMaphs rêcCst|ƒ\}}|dj}t|jƒƒ}|j|ƒr@tjdƒ|d=dStjdƒx|D]}||krP||=qPWt||dd�}i}�xz|jƒD�]l\} } t | | ƒsšq„| o¤| |k�rê|| } t t | j | ƒdƒ} t t | j | ƒdƒ} i}xô| jƒD]è\}}|dk�r| j dksâ|| j k�rqân|t| j ƒ}n.|dk�rL| j dksâ|| j k�rBqân || j }|dk�r€| dk�sdt‚|| k�srt‚|t| ƒ}n.|dk�r®| dk�s˜t‚|| k�s¦t‚|| }t |dƒ}t |dƒ}|||<qâW|jd d ddiƒ||| <q„| || <q„W||d_dS) NÚavarzDropping avar tablezInstantiating avar tableF)Ú usingAvarérgð?gð¿gð¿)r5ÚsegmentsržrârŸrurvÚnormalizeAxisLimitsr<rêrrrrrÓrºÚupdate)rprBrNrDrîr²rJZnormalizedRangesZ newSegmentsrSr—rTZ mappedMinZ mappedMaxr™rèrér#r#r$ÚinstantiateAvar~s^                   rñcCsBx<|jƒD]0\}}||kr ||}||jks6||jkr dSq WdS)NFT)r<rr)rNrDrSZcoordrTr#r#r$ÚisInstanceWithinAxisRangesÄs ròc st|td�\}}|d}t|ƒjdd„|jDƒƒrFtjdƒ|d=dStjdƒg}x@|jD]6}|j}||krpq\||krˆ||\|_|_ |j |ƒq\W||_g}xX|j D]N‰t ‡fdd„|j ƒDƒƒrÈq¨x|D] }ˆj|=qÎWtˆj|ƒsìq¨|j ˆƒq¨W||_ dS)N)r4r‹css|] }|jVqdS)N)rS)rIrJr#r#r$rVÕsz"instantiateFvar..zDropping fvar tablezInstantiating fvar tablec3s |]\}}ˆj||kVqdS)N)r@)rIrJrœ)Úinstancer#r$rVés)r5rržrŸr;rurvrSrÕrÖrMÚ instancesÚanyr<r@rò) rprBrNrDr‹r;rJrSrôr#)rór$ÚinstantiateFvarÍs4       röcCsT|dj}|j s"|jo|jj r&dStjdƒt||ƒ}||j_t|jjƒ|_dS)NÚSTATzInstantiating STAT table) r‚ÚDesignAxisRecordÚAxisValueArrayÚ AxisValuerurvÚaxisValuesFromAxisLimitsr¹ZAxisValueCount)rprBÚstatÚnewAxisValueTablesr#r#r$ÚinstantiateSTATós   rþc sÚt|td�\‰‰‡‡fdd„}|jj}g}xª|jjD]ž}|j}|d krv||jj}|dkrb|j }n|j }|||ƒrÈq4nR|dkr¼d} x0|j D]&} || jj}| j }|||ƒrŠd } PqŠW| rÈq4n t j d |ƒ|j|ƒq4W|S) N)r4csD|ˆkr|ˆ|krdS|ˆkr@ˆ|}||jks<||jkr@dSdS)NTF)rr)rSÚ axisValuerT)rDrNr#r$ÚisAxisValueOutsideLimitssz:axisValuesFromAxisLimits..isAxisValueOutsideLimitsr.r/r0éFTz,Unknown AxisValue table format (%s); ignored)r.r/r0)r5rrøZAxisrùrúrËrÌZAxisTagZ NominalValueÚValueZAxisValueRecordrurØrM) rürBrZ designAxesrýZaxisValueTableZaxisValueFormatrSrÿZdropAxisValueTablerˆr#)rDrNr$rûs4       rûcCsdtj}tj}xR|jƒD]F}||}|jƒr@|jdj|O_q|jdkr|jd|O<qWdS)Nr)r ZOVERLAP_COMPOUNDÚflagOverlapSimplerârbÚ componentsÚflagsZnumberOfContours)Z glyfTableZflagOverlapCompoundrr”Zglyphr#r#r$ÚsetMacOverlapFlags.s rcCs"t||ƒ}|rt||ƒ}t|dƒS)Nrí)rrr)rœÚtripleÚ avarMappingr#r#r$Ú normalize;s  r c sF|d}tˆjƒƒjdd„|jDƒƒ}|r8tdj|ƒƒ‚‡fdd„|jDƒ}i}|rfd|krf|dj}xr|jƒD]f\}\}} }ˆ|} t| t ƒrp| \} } | | ks¨| | krpt d|›d | d ›d | d ›d |›d | d ›d � ƒ‚qpWi} xb|jƒD]V\}‰|j |dƒ‰ˆ|} t| t ƒ�r.t ‡‡fdd„| DƒŽ| |<qèt | ˆˆƒ| |<qèW| S)Nr‹css|] }|jVqdS)N)rS)rIÚar#r#r$rVEsz&normalizeAxisLimits..z$Cannot limit: {} not present in fvarcs*i|]"}|jˆkr|j|j|jf|j“qSr#)rSrÕÚ defaultValuerÖ)rIr )rBr#r$rKIsz'normalizeAxisLimits..rëzUnsupported range ú=rú:z!; can't change default position (rc3s|]}t|ˆˆƒVqdS)N)r )rIrU)rrr#r$rVcs)ržrâÚ differencer;rrÙrîr<r\r›ÚNotImplementedErrorr]r,r )rprBrìr‹Z badLimitsr;Z avarSegmentsZaxis_tagr¸ÚdefaultrœZminVZmaxVÚnormalizedLimitsr#)rrBrr$rïCs2     0  rïcCs<d|krtdƒ‚d|kr(d|kr(tdƒ‚d|kr8tdƒ‚dS)Nr‹zMissing required table fvarrfrezCan't have gvar without glyfZCFF2z3Instancing CFF2 variable fonts is not supported yet)rr)rpr#r#r$ÚsanityCheckVariableTablesjsrcsHtdd„|jƒDƒƒrD|d}dd„|jDƒ‰‡fdd„|jƒDƒS|S)Ncss|]}|dkVqdS)Nr#)rIrœr#r#r$rVvsz'populateAxisDefaults..r‹cSsi|]}|j|j“qSr#)r rS)rIr r#r#r$rKxsz(populateAxisDefaults..cs&i|]\}}|dkrˆ|n||“qS)Nr#)rIrSrœ)Ú defaultValuesr#r$rKys)rõr>r;r<)rprBr‹r#)rr$ÚpopulateAxisDefaultsus   rFc Cs˜tt|ƒƒ}t|ƒt||ƒ}t||ƒ}tjd|ƒ|s@t|ƒ}|rZtjdƒtj ||ƒd|krpt |||d�d|kr‚t ||ƒd|kr”t ||ƒd|kr¦t ||ƒd|kr¸t||ƒt||ƒt||ƒd |krÞt||ƒtj|ƒ�"d |krüt||ƒt||ƒWd QRXd |k�rxd |k�rx|tjk�r>t|d ƒn:|tjtjfk�rxddlm}tjdƒ|||tjkd�tj|dd„|jƒDƒd�|S)a( Instantiate variable font, either fully or partially. Depending on whether the `axisLimits` dictionary references all or some of the input varfont's axes, the output font will either be a full instance (static font) or a variable font with possibly less variation data. Args: varfont: a TTFont instance, which must contain at least an 'fvar' table. Note that variable fonts with 'CFF2' table are not supported yet. axisLimits: a dict keyed by axis tags (str) containing the coordinates (float) along one or more axes where the desired instance will be located. If the value is `None`, the default coordinate as per 'fvar' table for that axis is used. The limit values can also be (min, max) tuples for restricting an axis's variation range. The default axis value must be included in the new range. inplace (bool): whether to modify input TTFont object in-place instead of returning a distinct object. optimize (bool): if False, do not perform IUP-delta optimization on the remaining 'gvar' table's deltas. Possibly faster, and might work around rendering issues in some buggy environments, at the cost of a slightly larger file size. overlap (OverlapMode): variable fonts usually contain overlapping contours, and some font rendering engines on Apple platforms require that the `OVERLAP_SIMPLE` and `OVERLAP_COMPOUND` flags in the 'glyf' table be set to force rendering using a non-zero fill rule. Thus we always set these flags on all glyphs to maximise cross-compatibility of the generated instance. You can disable this by passing OverlapMode.KEEP_AND_DONT_SET_FLAGS. If you want to remove the overlaps altogether and merge overlapping contours and components, you can pass OverlapMode.REMOVE (or REMOVE_AND_IGNORE_ERRORS to not hard-fail on tricky glyphs). Note that this requires the skia-pathops package (available to pip install). The overlap parameter only has effect when generating full static instances. updateFontNames (bool): if True, update the instantiated font's name table using the Axis Value Tables from the STAT table. The name table will be updated so it conforms to the R/I/B/BI model. If the STAT table is missing or an Axis Value table is missing for a given axis coordinate, a ValueError will be raised. zNormalized limits: %szUpdating name tablerf)rcrr�ZHVARr�rër÷Nr‹rer)ÚremoveOverlapsz!Removing overlaps from glyf table)Z ignoreErrorscSs i|]\}}t|tƒs||“qSr#)r\r›)rIrSrar#r#r$rKìsz+instantiateVariableFont..)rN)r-ÚintrrrïrurvrrZupdateNameTablerxr€r“r¡r¢rÄrÈrñZpruningUnusedNamesrþrör1rr2r3ZfontTools.ttLib.removeOverlapsrr Zset_default_weight_width_slantr<)rprBÚinplacercÚoverlapÚupdateFontNamesrrr#r#r$ÚinstantiateVariableFont€sV0                    rcCsŽii}}xz|jƒD]n\}}t||ƒr0|||<qt|ttfƒrH|||<qt|tƒr`||Ž||<qtd|j›dt|ƒj›d|›�ƒ‚qW||fS)NzExpected number or z, got z: )r<r\rÚfloatr›Ú TypeErrorr'r&)rBr4rNrDrSrœr#r#r$r5ös     $r5cCs¤i}xš|D]’}tjd|ƒ}|s*td|ƒ‚|jdƒjdƒ}|jdƒrJd}nt|jdƒdd�}|}|jdƒr|t|jdƒdd�}||kr”t||ƒ||<q |||<q W|S) Nz.^(\w{1,4})=(?:(drop)|(?:([^:]+)(?:[:](.+))?))$zinvalid location format: %rr.rr/r0r¾)Z precisionBits)ÚreÚmatchrÚgroupÚljustrr)ZlimitsÚresultZ limitStringrÚtagZlboundZuboundr#r#r$Ú parseLimitss       r#c CsÎddlm}ddl}|jddd�}|jddd d �|jd d d dd�|jdddddd�|jddddd�|jddddd�|jdddd d�|jd!d"dd#d�|jd$dd%d&�|jd'd(�}|jd)d*dd+d&�|jd,d-dd.d&�|j|ƒ}|j�r|j�rt j |_ nt j |_ nt t |j ƒƒ|_ |j}tjj|ƒ�sB|jd/j|ƒƒ||j�rPd0n|j�r\d1nd2d3�yt|jƒ}Wn2tk �r¤}z|jt|ƒƒWYdd}~XnXt|ƒt|jƒk�rÄ|jd4ƒ|||fS)5aÃParse argv. Returns: 3-tuple (infile, axisLimits, options) axisLimits is either a Dict[str, Optional[float]], for pinning variation axes to specific coordinates along those axes (with `None` as a placeholder for an axis' default value); or a Dict[str, Tuple(float, float)], meaning limit this axis to min/max range. Axes locations are in user-space coordinates, as defined in the "fvar" table. r)Ú configLoggerNzfonttools varLib.instancerz%Partially instantiate a variable font)Ú descriptionÚinputz INPUT.ttfzInput variable TTF file.)ÚmetavarÚhelpÚlocargszAXIS=LOCÚ*zÔList of space separated locations. A location consists of the tag of a variation axis, followed by '=' and one of number, number:number or the literal string 'drop'. E.g.: wdth=100 or wght=75.0:125.0 or wght=drop)r'Únargsr(z-oz--outputz OUTPUT.ttfz7Output instance TTF file (default: INPUT-instance.ttf).)r'rr(z --no-optimizercÚ store_falsezDDon't perform IUP optimization on the remaining gvar TupleVariations)ÚdestÚactionr(z--no-overlap-flagrzfDon't set OVERLAP_SIMPLE/OVERLAP_COMPOUND glyf flags (only applicable when generating a full instance)z--remove-overlapsÚremove_overlapsÚ store_truezrMerge overlapping contours and components (only applicable when generating a full instance). Requires skia-pathopsz--ignore-overlap-errorsÚignore_overlap_errorszCDon't crash if the remove-overlaps operation fails for some glyphs.z--update-name-tablezeUpdate the instantiated font's `name` table. Input font must have a STAT table with Axis Value Tables)r.r(F)Úrequiredz-vz --verbosezRun more verbosely.z-qz--quietzTurn verbosity off.zNo such file '{}'ÚDEBUGÚERRORÚINFO)Úlevelz+Specified multiple limits for the same axis)Ú fontToolsr$ÚargparseÚArgumentParserÚ add_argumentÚadd_mutually_exclusive_groupÚ parse_argsr/r1r-r3rr2rr&ÚosÚpathÚisfileÚerrorrÙÚverboseÚquietr#r)rÚstrr¹) rr$r8ÚparserZ loggingGroupÚoptionsÚinfilerBÚer#r#r$Ú parseArgss€        rHcCsÀt|ƒ\}}}tjd|ƒtjdƒt|ƒ}dd„|jƒDƒjdd„|djDƒƒ}t||d|j|j |j d �|j s–t j j|ƒd d j|rŽd nd ƒn|j }tjd|rªd nd|ƒ|j|ƒdS)z&Partially instantiate a variable font.zRestricting axes: %szLoading variable fontcSsh|]\}}t|tƒs|’qSr#)r\r›)rIrSrar#r#r$r±‹szmain..css|] }|jVqdS)N)rS)rIrJr#r#r$rV�szmain..r‹T)rrcrrrz-{}.ttfróÚpartialzSaving %s font %szpartial variableN)rHrurvr r<rŸr;rrcrZupdate_name_tableÚoutputr=r>ÚsplitextrÙÚsave)rrFrBrErpZisFullInstanceÚoutfiler#r#r$Úmainƒs*    ( rN)NN)T)T)T)T)N)XÚ__doc__ZfontTools.misc.fixedToolsrrrrZfontTools.varLib.modelsrrrZfontTools.ttLibr Z%fontTools.ttLib.tables.TupleVariationr ZfontTools.ttLib.tablesr r7r r ZfontTools.varLibrZfontTools.varLib.mvarrZfontTools.varLib.mergerrZfontTools.varLib.instancerrÚ contextlibrr8ÚcopyrÚenumrÚloggingÚ itertoolsrr=rÚ getLoggerruÚ namedtuplerr,r-rGr6r7rWrRrkrqrxr~r€rŠr“ršr r¡r¢Úobjectr£r�rÄrÈrÒr×ràrárÇrêrñròrörþrûrr rïrrr1rr5r#rHrNr#r#r#r$ÚDs†                 D ^ $ $\&;#( $F &,  '  p g