U
    Q»{j¥ ã                   @   s–  d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d dl;Z;d dl<Z<d dl=m>Z> d dl?Z?d dl@Z@d dlAZAe? BeC¡ZDddd„ZEddd„ZFG dd„ deGƒZHdS )é    )Ússtruct)ÚTagÚtostrÚ
binary2numÚsafeEval)ÚFeatureLibError)ÚLookupDebugInfoÚLOOKUP_DEBUG_INFO_KEYÚLOOKUP_DEBUG_ENV_VAR)ÚParser)ÚFeatureFile)ÚVariableScalar)Úbuilder)Ú
maxCtxFont)ÚnewTableÚgetTableModule)ÚotBaseÚotTables)ÚAlternateSubstBuilderÚChainContextPosBuilderÚChainContextSubstBuilderÚLigatureSubstBuilderÚMultipleSubstBuilderÚCursivePosBuilderÚMarkBasePosBuilderÚMarkLigPosBuilderÚMarkMarkPosBuilderÚReverseChainSingleSubstBuilderÚSingleSubstBuilderÚClassPairPosSubtableBuilderÚPairPosBuilderÚSinglePosBuilderÚChainContextualRule)ÚOpenTypeLibError)ÚOnlineVarStoreBuilder)ÚbuildVarDevTable)ÚaddFeatureVariationsRaw)ÚnormalizeValueÚpiecewiseLinearMap)ÚdefaultdictN)ÚStringIOFc                 C   s   t | |ƒ}|j||d� dS )aô  Add features from a file to a font. Note that this replaces any features
    currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        featurefile: Either a path or file object (in which case we
            parse it into an AST), or a pre-parsed AST instance.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    ©ÚtablesÚdebugN)ÚBuilderÚbuild)ÚfontÚfeaturefiler,   r-   r   © r2   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/feaLib/builder.pyÚaddOpenTypeFeatures2   s    
r4   c                 C   s*   t t|ƒƒ}|r||_t| |||d� dS )ae  Add features from a string to a font. Note that this replaces any
    features currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        features: A string containing feature code.
        filename: The directory containing ``filename`` is used as the root of
            relative ``include()`` paths; if ``None`` is provided, the current
            directory is assumed.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    r+   N)r*   r   Únamer4   )r0   ÚfeaturesÚfilenamer,   r-   r1   r2   r2   r3   ÚaddOpenTypeFeaturesFromStringD   s    r8   c                   @   sî  e Zd Zedd„ dD ƒƒZdd„ Zd¶dd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7g fdldm„Z8dndo„ Z9dpdq„ Z:d·drds„Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d�„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdˆd‰„ ZFdŠd‹„ ZGdŒd�„ ZHdŽd�„ ZId�d‘„ ZJd’d“„ ZKd”d•„ ZLd–d—„ ZMd˜d™„ ZNdšd›„ ZOdœd�„ ZPdždŸ„ ZQd d¡„ ZRd¢d£„ ZSd¤d¥„ ZTd¦d§„ ZUd¨d©„ ZVdªd«„ ZWd¬d­„ ZXd®d¯„ ZYd°d±„ ZZd²d³„ e[j\D ƒZ]d´dµ„ Z^dS )¸r.   c                 c   s   | ]}t |ƒV  qd S ©N)r   ©Ú.0Útagr2   r2   r3   Ú	<genexpr>^   s   ÿzBuilder.<genexpr>)
ÚBASEÚGDEFÚGPOSÚGSUBúOS/2ÚheadÚhhear5   ÚvheaÚSTATc                 C   sz  || _ t|tƒr |d  | _| _nd | | _| _| ¡ | _d | _d|krh|d j| _t	dd„ | jD ƒƒ| _t
ƒ | _d | _d| _d | _t
ƒ | _d| _i | _d | _d | _d | _g | _i i dœ| _i | _i | _i | _g | _d | _i | _t
ƒ | _i | _t
ƒ | _i | _ i | _!t"t#ƒ| _$d | _%d | _&g | _'d | _(d | _)i | _*i | _+i | _,i | _-i | _.i | _/i | _0i | _1i | _2i | _3i | _4i | _5i | _6d S )NÚfvarc                 S   s   g | ]
}|j ‘qS r2   )ÚaxisTag)r;   Zaxr2   r2   r3   Ú
<listcomp>{   s     z$Builder.__init__.<locals>.<listcomp>r   F)rA   r@   )7r0   Ú
isinstancer   Ú	parseTreeÚfileZgetReverseGlyphMapÚglyphMapÚvarstorebuilderÚaxesr$   ÚsetÚdefault_language_systems_Úscript_Úlookupflag_Úlookupflag_markFilterSet_Úlanguage_systemsÚseen_non_DFLT_script_Únamed_lookups_Úcur_lookup_Úcur_lookup_name_Úcur_feature_name_Úlookups_Úlookup_locationsÚ	features_Úrequired_features_Úfeature_variations_Úaalt_features_Úaalt_location_Úaalt_alternates_ÚfeatureNames_ÚfeatureNames_ids_Úcv_parameters_Úcv_parameters_ids_Úcv_num_named_params_r)   ÚlistÚcv_characters_Úsize_parameters_ÚfontRevision_Únames_Úbase_horiz_axis_Úbase_vert_axis_ÚattachPoints_ÚligCaretCoords_ÚligCaretPoints_ÚglyphClassDefs_ÚmarkAttach_ÚmarkAttachClassID_ÚmarkFilterSets_Úos2_Úhhea_Úvhea_Ústat_Úconditionsets_Úmodel_cache)Úselfr0   r1   r2   r2   r3   Ú__init__n   sj    

ÿ
zBuilder.__init__NFc           
         s,  ˆ j d krtˆ jˆ jƒ ¡ ˆ _ ˆ j  ˆ ¡ |d kr:ˆ j}n4t|ƒ}|ˆ j }|rnd t	|ƒ¡}t
d|› d�ƒ‚d|kr~ˆ  ¡  d|krŽˆ  ¡  d|kržˆ  ¡  d|kr®ˆ  ¡  d|kr¾ˆ  ¡  d	|krÎˆ  ¡  d
|krÞˆ  ¡  dD ]‚}||krðqâˆ  |¡}ˆ j�rˆ  ||¡ |jjdk�s8|jjdk�s8|jjdk�rRt|ƒ }ˆ j|< ||_qâ|ˆ jkrâˆ j|= qât‡ fdd„dD ƒƒ�rœd	ˆ jk�rœtˆ jƒˆ jd	 _ d|k�rÔˆ  !¡ }|�rÀ|ˆ jd< ndˆ jk�rÔˆ jd= d|k�rˆ  "¡ }	|	�rø|	ˆ jd< ndˆ jk�rˆ jd= |�s t#j$ %t&¡�r(ˆ  '¡  d S )Nz, z9The following tables were requested but are unsupported: Ú.rA   rC   rD   rE   r5   rB   rF   ©r@   rA   r   c                 3   s   | ]}|ˆ j kV  qd S r9   )r0   r:   ©r|   r2   r3   r=   å   s     z Builder.build.<locals>.<genexpr>r?   r>   )(rK   r   rL   rM   Úparser/   ÚsupportedTablesÚ	frozensetÚjoinÚsortedÚNotImplementedErrorÚbuild_feature_aalt_Ú
build_headÚ
build_hheaÚ
build_vheaÚ
build_nameÚ
build_OS_2Ú
build_STATÚ	makeTabler_   ÚmakeFeatureVariationsÚ
ScriptListÚScriptCountÚFeatureListÚFeatureCountÚ
LookupListÚLookupCountr   r0   ÚtableÚanyr   ÚusMaxContextÚ	buildGDEFÚ	buildBASEÚosÚenvironÚgetr
   Ú	buildDebg)
r|   r,   r-   ÚunsupportedZunsupported_stringr<   r–   Z	fontTableÚgdefÚbaser2   r€   r3   r/   ¸   st    


ÿ

ÿ
þ
ý

$

zBuilder.buildc                 C   s,   || j |ƒ}| j|_| j|_| j |¡ |S r9   )r0   rS   Ú
lookupflagrT   ÚmarkFilterSetr[   Úappend)r|   ÚlocationÚbuilder_classÚresultr2   r2   r3   Úget_chained_lookup_ö   s
    zBuilder.get_chained_lookup_c                 C   s2   | j D ]&\}}|||f}| j |g ¡ |¡ qd S r9   )rU   r]   Ú
setdefaultr¤   )r|   ÚlookupZfeature_nameÚscriptÚlangÚkeyr2   r2   r3   Úadd_lookup_to_feature_ý   s    
zBuilder.add_lookup_to_feature_c                 C   s¬   | j r6t| j ƒ|kr6| j j| jkr6| j j| jkr6| j S | jrL| j rLtd|ƒ‚|| j|ƒ| _ | j| j _| j| j _| j	 
| j ¡ | jr�| j | j| j< | jr¦|  | j | j¡ | j S )NzOWithin a named lookup block, all rules must be of the same lookup type and flag)rX   Útyper¢   rS   r£   rT   rY   r   r0   r[   r¤   rW   rZ   r®   )r|   r¥   r¦   r2   r2   r3   Úget_lookup_  s.    ÿþýüý

zBuilder.get_lookup_c              
      sŽ  | j s| jsd S dd„ | j ¡ D ƒ}| j dg D ]°\}‰‡fdd„| j ¡ D ƒ}|spˆdkrpt d|ˆf ¡ q0|D ]j\}}}}|D ]X}t|tƒs˜|g}|D ]>}| ¡  ¡ D ],\}	}
| 	|	g ¡‰ ˆ  
‡ fdd	„|
D ƒ¡ q¬qœq„qtq0d
d„ | ¡ D ƒ}dd„ | ¡ D ƒ}|�s|�sd S dd„ | j ¡ D ƒ| _| j}g | _|  | jd¡ |�r^|  |t¡}||_|�rv|  |t¡}||_|  ¡  | j 
|¡ d S )Nc                 S   s   i | ]\}}|t |ƒ“qS r2   )rh   )r;   ÚgÚar2   r2   r3   Ú
<dictcomp>$  s      z/Builder.build_feature_aalt_.<locals>.<dictcomp>)NÚaaltc                    s*   g | ]"\\}}}}|ˆ kr||||f‘qS r2   r2   ©r;   r«   r¬   ÚfeatureÚlookups)r5   r2   r3   rI   &  s   þz/Builder.build_feature_aalt_.<locals>.<listcomp>r´   z#%s: Feature %s has not been definedc                 3   s   | ]}|ˆ kr|V  qd S r9   r2   ©r;   r±   )Úalts_for_glyphr2   r3   r=   6  s     z.Builder.build_feature_aalt_.<locals>.<genexpr>c                 S   s&   i | ]\}}t |ƒd kr||d “qS )é   r   ©Úlen©r;   ÚglyphÚreplr2   r2   r3   r³   9  s      c                 S   s"   i | ]\}}t |ƒd kr||“qS )rº   r»   r½   r2   r2   r3   r³   <  s       c                 S   s*   i | ]"\\}}}}|d kr|||f|“qS )r´   r2   rµ   r2   r2   r3   r³   ?  s   þ )r`   rb   Úitemsr]   ÚwarningsÚwarnrJ   rh   ZgetAlternateGlyphsr©   Úextendr[   Ústart_featurera   r°   r   Úmappingr   Ú
alternatesÚend_feature)r|   rÆ   r¥   r¶   r«   r¬   r·   Ú
lookuplistrª   r¾   ÚaltsZsingleÚmultiZold_lookupsZsingle_lookupZmulti_lookupr2   )r¹   r5   r3   r‡     sP    
þ
ÿÿþzBuilder.build_feature_aalt_c                 C   s^   | j s
d S | j d¡}|sRtdƒ }| jd< | d| j¡ d|_d|_d |_|_| j |_	d S )NrC   s6                                                         g      ð?iõ<_l   ùe )
rk   r0   r�   r   Ú	decompileÚtableVersionZmagicNumberÚcreatedÚmodifiedZfontRevision©r|   r–   r2   r2   r3   rˆ   P  s    zBuilder.build_headc                 C   sœ   | j s
d S | j d¡}|s@tdƒ }| jd< | d| j¡ d|_d| j krV| j d |_d| j krl| j d |_d| j kr‚| j d |_d| j kr˜| j d |_	d S )NrD   ó$                                       é   ZcaretoffsetZascenderZ	descenderZlinegap)
rw   r0   r�   r   rË   rÌ   ZcaretOffsetÚascentÚdescentÚlineGaprÏ   r2   r2   r3   r‰   \  s    



zBuilder.build_hheac                 C   s†   | j s
d S | j d¡}|s@tdƒ }| jd< | d| j¡ d|_d| j krV| j d |_d| j krl| j d |_d| j kr‚| j d |_d S )NrE   rÐ   i  ZverttypoascenderZverttypodescenderZverttypolinegap)	rx   r0   r�   r   rË   rÌ   rÒ   rÓ   rÔ   rÏ   r2   r2   r3   rŠ   m  s    


zBuilder.build_vheac                 C   s4   dd„ |j D ƒ}tddƒD ]}||kr|  S qd S )Nc                 S   s   g | ]
}|j ‘qS r2   )ÚnameID)r;   r5   r2   r2   r3   rI   ~  s     z,Builder.get_user_name_id.<locals>.<listcomp>é   iÿ  )ÚnamesÚrange)r|   r–   ZnameIDsZuser_name_idr2   r2   r3   Úget_user_name_id|  s    zBuilder.get_user_name_idc                 C   s   d }|dkrJt  ¡ }| j\|_|_|_|_|| jkrB| j| |_nd|_nÒ|| j	kr†| js\n(|| jksjt
‚t  ¡ }d|_| j| |_n–|| jk�rt  ¡ }d|_| j |dfd¡|_| j |dfd¡|_| j |dfd¡|_| j |d¡|_| j |dfd¡|_t| j| ƒ|_| j| |_|S )NÚsizer   ÚFeatUILabelNameIDÚFeatUITooltipTextNameIDÚSampleTextNameIDZParamUILabelNameID_0)r   ZFeatureParamsSizerj   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEndrd   ZSubfamilyNameIDrc   ÚAssertionErrorZFeatureParamsStylisticSetÚVersionZUINameIDre   ZFeatureParamsCharacterVariantsÚFormatrf   r�   rÛ   rÜ   rÝ   rg   ZNumNamedParametersZFirstParamUILabelNameIDr¼   ri   Z	CharCountZ	Character)r|   r<   Úparamsr2   r2   r3   ÚbuildFeatureParamsƒ  sT    û

 ÿ ÿ ÿ ÿzBuilder.buildFeatureParamsc           	      C   s   | j s
d S | j d¡}|s2tdƒ }| jd< g |_| j D ]¸}|\}}}}}t|tƒsÞ|}|| jkrš|| jkrŽ|  	|¡| j|< | j| d k	sŽt
‚| j| }nD|d | jkrÞ|| jkrÔ|  	|¡| j|< | j| d k	sÔt
‚| j| }| |||||¡ q8|j ¡  d S )Nr5   r   )rl   r0   r�   r   r×   rJ   Úintrc   rd   rÙ   râ   re   rf   ÚsetNameÚsort)	r|   r–   r5   rÕ   Ú
platformIDÚ	platEncIDÚlangIDÚstringr<   r2   r2   r3   r‹   ®  s,    





zBuilder.build_namec                 C   sŠ  | j s
d S | j d¡}|sNtdƒ }| jd< dt tdƒj¡ }| || j¡ d}d| j krh| j d |_	d| j kr¶tdƒ 
¡ }| j d \
|_|_|_|_|_|_|_|_|_|_||_d| j krÌ| j d |_d| j krâ| j d |_d| j krø| j d |_d	| j k�r| j d	 |_d
| j k�r(| j d
 |_d| j k�rLtd| j d  d ƒ|_d| j k�rd| j d |_d| j k�r|| j d |_d| j k�r˜| | j d ¡ d| j k�rÄ|   | j d ¡}|\|_!|_"d}d| j k�rà| j d |_#d}d| j k�rü| j d |_$d}d| j k�r| j d |_%d}d| j k�r4| j d |_&d}dd„ }t'||j(ƒ|_(|dk�r^||dƒ |dk�rr||dƒ |dk�r†||dƒ d S )NrB   ó    r   ZfstypeÚpanoseZtypoascenderZtypodescenderZtypolinegapZ	winascentZ
windescentÚvendorz'''ZweightclassZ
widthclassZunicoderangeZcodepagerangerº   Zxheighté   Z	capheightZloweropsizeé   Zupperopsizec                 S   s$   |D ]}t | |ƒst| |dƒ qd S ©Nr   )ÚhasattrÚsetattr)r–   ÚattrsÚattrr2   r2   r3   Ú	checkattr  s    
z%Builder.build_OS_2.<locals>.checkattr)ÚulCodePageRange1ÚulCodePageRange2)ÚsxHeightÚ
sCapHeightZusDefaultCharZusBreakCharr˜   )ÚusLowerOpticalPointSizeÚusUpperOpticalPointSize))rv   r0   r�   r   r   Úcalcsizer   ZOS2_format_0rË   ZfsTypeZPanoseZbFamilyTypeZbSerifStyleZbWeightZbProportionZ	bContrastZbStrokeVariationZ	bArmStyleZbLetterFormZbMidlineZbXHeightrï   ZsTypoAscenderZsTypoDescenderZsTypoLineGapZusWinAscentZusWinDescentr   Z	achVendIDZusWeightClassZusWidthClassZsetUnicodeRangesÚbuild_codepages_rù   rú   rû   rü   rý   rþ   ÚmaxÚversion)r|   r–   Údatar  rï   Úpagesrø   r2   r2   r3   rŒ   È  sŒ    

õ





þ

zBuilder.build_OS_2c                 C   s\   dD ]}|| j krt|› d�|ƒ‚qt|tƒr:|| j d< nt|tƒrP|| j d< nt|ƒ‚d S )N)ÚElidedFallbackNameÚElidedFallbackNameIDz is already set.r  r  )ry   r   rJ   rç   rh   râ   )r|   Úvaluer¥   Útokenr2   r2   r3   ÚsetElidedFallbackName  s    
þ

zBuilder.setElidedFallbackNamec                 C   s„   d| j krg | j d< |jdd„ | j d D ƒkrBtd|j› d�|ƒ‚|jdd„ | j d D ƒkrptd|j› d�|ƒ‚| j d  |¡ d S )	NÚ
DesignAxesc                 s   s   | ]}|j V  qd S r9   )r<   ©r;   Úrr2   r2   r3   r=   /  s     z(Builder.addDesignAxis.<locals>.<genexpr>z$DesignAxis already defined for tag "z".c                 s   s   | ]}|j V  qd S r9   )Ú	axisOrderr  r2   r2   r3   r=   4  s     z+DesignAxis already defined for axis number r~   )ry   r<   r   r  r¤   )r|   Z
designAxisr¥   r2   r2   r3   ÚaddDesignAxis,  s    

þþzBuilder.addDesignAxisc                 C   sŽ   d| j krg | j d< | j d D ]Z}dd„ |jD ƒdd„ |jD ƒkrdd„ |jD ƒdd„ |jD ƒkr|j|jkrtd|ƒ‚q| j d  |¡ d S )NÚAxisValueRecordsc                 S   s   h | ]}|  ¡ ’qS r2   ©ZasFea©r;   Únr2   r2   r3   Ú	<setcomp>A  s     z-Builder.addAxisValueRecord.<locals>.<setcomp>c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  B  s     c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  C  s     c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  D  s     z8An AxisValueRecord with these values is already defined.)ry   r×   Ú	locationsÚflagsr   r¤   )r|   ZaxisValueRecordr¥   Zrecord_r2   r2   r3   ÚaddAxisValueRecord;  s$    

ÿÿÿý
ûþzBuilder.addAxisValueRecordc                    sî  | j s
d S | j  d¡}|s$tdd ƒ‚| j  d¡}i ‰ g }|D ]}g ˆ |j< q<|d k	�rJ|D ]î}i }|jdkrv|j|d< t|jƒdk�r |jd }|j}t|ƒdkr¸| |d |j	dœ¡ t|ƒdkrà| |d |d |j	d	œ¡ t|ƒd
k�r|\}	}
}| |	|
||j	dœ¡ ˆ |j  
|¡ qZ| dd„ |jD ƒ|j	dœ¡ | 
|¡ qZ‡ fdd„|D ƒ}| j d¡}|�s†tdƒ }| jd< g |_	d| j k�rÀ| j d }| |¡}|�sÖtd|› d�d ƒ‚nd| j k�rÖ| j d }tj| j|||d� d S )Nr
  zDesignAxes not definedr  r   r  rº   )r  r5   rñ   )r  ZlinkedValuer5   é   )ZnominalValueZrangeMinValueZrangeMaxValuer5   c                 S   s   i | ]}|j |jd  “qS )r   )r<   Úvalues©r;   Úir2   r2   r3   r³   y  s      z&Builder.build_STAT.<locals>.<dictcomp>)r¥   r5   c                    s&   g | ]}|j |j|jˆ |j d œ‘qS ))Zorderingr<   r5   r  )r  r<   r×   )r;   r²   ©Z
axisValuesr2   r3   rI     s   ûüz&Builder.build_STAT.<locals>.<listcomp>r5   r  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tabler  )r  ZelidedFallbackName)ry   r�   r   r<   r  r¼   r  r  Úupdater×   r¤   r0   r   ZgetDebugNameÚotlZbuildStatTable)r|   rO   ZaxisValueRecordsZformat4_locationsr<   ZavrZ
valuesDictr¥   r  ZnominalZminValZmaxValZ
designAxesZ	nameTablerÕ   r5   r2   r  r3   r�   M  s„    




ýÿ
üÿþÿ
ù



ü
üzBuilder.build_STATc                     sÆ   ddddddddd	d
dddddddddddddddddddddd œ‰ ‡ fd!d"„|D ƒ}g }t dƒD ]T}| d#¡ t |d$ |d d$ ƒD ].}||kr¤||  d%7  < q†||  d&7  < q†qbd'd"„ |D ƒS )(Nr   rº   rñ   r  é   rò   é   é   é   é   é   é   é   é   é   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   )iä  iâ  iã  iå  iæ  iç  iè  ié  iê  ij  i¤  i¨  iµ  i¶  iQ  ie  ib  ia  i`  i_  i^  i]  i\  iY  iW  iT  i  iá  iÄ  iR  iµ  c                    s   g | ]}|ˆ krˆ | ‘qS r2   r2   ©r;   Úp©Z
pages2bitsr2   r3   rI   Ä  s      z,Builder.build_codepages_.<locals>.<listcomp>Ú é    Ú1Ú0c                 S   s   g | ]}t |d d d… ƒ‘qS )Néÿÿÿÿ)r   r8  r2   r2   r3   rI   Í  s     )rØ   r¤   )r|   r  Úbitsr  Újr2   r:  r3   r   ¢  sR    á!
zBuilder.build_codepages_c                 C   sL   | j s| jsd S t ¡ }d|_|  | j ¡|_|  | j¡|_tdƒ}||_	|S )NrÑ   r>   )
rm   rn   r   r>   rã   ÚbuildBASEAxisZ	HorizAxisZVertAxisr   r–   )r|   r¡   r§   r2   r2   r3   rš   Ï  s    zBuilder.buildBASEc                 C   s   t  ¡ }d|_||_|S ©Nrº   )r   Ú	BaseCoordrä   Z
Coordinate)r|   ÚcZcoordr2   r2   r3   ÚbuildBASECoordÛ  s    zBuilder.buildBASECoordc                    sŠ  |sd S |\}}}t  ¡ }t  ¡ |_||j_t|ƒ|j_t  ¡ |_g |j_t|ƒ|j_t	|ƒD �]$‰ ‡ fdd„|D ƒ}t  ¡ }ˆ d |_
t  ¡ |_t  ¡ |j_| ˆ d ¡|jj_g |jj_tˆ d ƒ|jj_g |j_ˆ d D ]}|jjj |  |¡¡ qÞ|D ]f\}}	}
t  ¡ }|  |	¡|_|  |
¡|_d|_|dk�rB||j_qþt  ¡ }||_||_|jj |¡ qþt|jjƒ|j_|jj |¡ q^|S )Nc                    s(   g | ] }|d  ˆ d  kr|dd… ‘qS )r   rº   Nr2   )r;   Úrecord©r«   r2   r3   rI   í  s     z)Builder.buildBASEAxis.<locals>.<listcomp>r   rº   rñ   Údflt)r   ZAxisZBaseTagListZBaselineTagr¼   ZBaseTagCountZBaseScriptListZBaseScriptRecordZBaseScriptCountr…   ZBaseScriptTagZ
BaseScriptZ
BaseValuesÚindexZDefaultIndexrD  ZBaseCoordCountZBaseLangSysRecordr¤   rF  ZMinMaxZMinCoordZMaxCoordZFeatMinMaxCountZDefaultMinMaxZBaseLangSysTagZBaseLangSysCount)r|   ÚaxisÚbasesÚscriptsÚminmaxZminmax_for_scriptrG  rE  ÚlanguageZ	min_coordZ	max_coordZminmax_recordZlang_recordr2   rH  r3   rB  á  sP    



ÿ




ÿzBuilder.buildBASEAxisc                 C   sö   t  ¡ }|  ¡ |_t | j| j¡|_t 	| j
| j| j¡|_|  ¡ |_|  ¡ |_|jrXdnd|_| jr¶| j ¡ }|r¬d|_||_| ¡ }| |¡ d| jkr¬| jd j |¡ | j ¡  t|j|j|j|j|jfƒsÜt|dƒrîtdƒ}||_|S d S d S )Ni  rÑ   i  r@   ÚVarStorer?   )r   r?   ÚbuildGDEFGlyphClassDef_ÚGlyphClassDefr  ZbuildAttachListro   rM   Z
AttachListZbuildLigCaretListrp   rq   ZLigCaretListÚbuildGDEFMarkAttachClassDef_ÚMarkAttachClassDefÚbuildGDEFMarkGlyphSetsDef_ZMarkGlyphSetsDefrã   rN   ÚfinishrP  ÚoptimizeZremap_device_varidxesr0   r–   r{   Úclearr—   rô   r   )r|   r    ÚstoreZ
varidx_mapr§   r2   r2   r3   r™     sF    
  ÿ





ûÿø	zBuilder.buildGDEFc                 C   sŒ   | j rdd„ | j  ¡ D ƒ}nRi }| jD ]}| | ¡ ¡ q&| jj ¡ D ]&}|jD ]}| 	¡ D ]}d||< q\qPqF|r„t
 ¡ }||_|S d S d S )Nc                 S   s   i | ]\}\}}||“qS r2   r2   ©r;   r±   rE  Ú_r2   r2   r3   r³   3  s    
  z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>r  )rr   rÀ   r[   r  ZinferGlyphClassesrK   ZmarkClassesr  ÚdefinitionsÚglyphSetr   rR  Ú	classDefs)r|   Úclassesrª   Ú	markClassÚmarkClassDefr¾   r§   r2   r2   r3   rQ  1  s    

zBuilder.buildGDEFGlyphClassDef_c                 C   s.   dd„ | j  ¡ D ƒ}|sd S t ¡ }||_|S )Nc                 S   s   i | ]\}\}}||“qS r2   r2   rZ  r2   r2   r3   r³   D  s    
  z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>)rs   rÀ   r   rT  r^  )r|   r^  r§   r2   r2   r3   rS  C  s    z$Builder.buildGDEFMarkAttachClassDef_c                 C   s<   g }t | j ¡ dd„ d�D ]\}}| |¡ qt || j¡S )Nc                 S   s   | d S rC  r2   )Úitemr2   r2   r3   Ú<lambda>N  ó    z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>©r­   )r…   ru   rÀ   r¤   r  ZbuildMarkGlyphSetsDefrM   )r|   ZsetsÚglyphsÚid_r2   r2   r3   rU  K  s     ÿz"Builder.buildGDEFMarkGlyphSetsDef_c                 C   s:   d| j kr$tdƒ| j d< i | j d _| j| j d jt< d S )NZDebg)r0   r   r  r\   r	   r€   r2   r2   r3   rž   S  s    
zBuilder.buildDebgc                 C   s  |dkst |ƒ‚| jD ]
}d |_qg }| jD ]N}|j|kr<q,t|ƒ|_tt|jƒ|  |¡d d�| j	| t|jƒ< | 
|¡ q,g }|D ]”}z| 
| ¡ ¡ W q„ tk
rÎ } ztt|ƒ|jƒ|‚W 5 d }~X Y q„ tk
�r } z*| j	| t|jƒ j}tt|ƒ|ƒ|‚W 5 d }~X Y q„X q„|S )Nr   )r¥   r5   r¶   )râ   r[   Úlookup_indexr–   r¼   r   Ústrr¥   Úget_lookup_name_r\   r¤   r/   r#   r   Ú	Exception)r|   r<   rª   r·   Z	otLookupsÚlÚer¥   r2   r2   r3   ÚbuildLookups_Y  s0    



ý"$zBuilder.buildLookups_c              
      s"  t t|d ƒƒ }d|_t ¡ |_g |j_t ¡ |_g |j_t ¡ |_|  |¡|j_	i }i }i }dd„ }t
| j ¡ |d�D �]j\}}|\}	}
}tt dd„ |D ƒ¡ƒ}|dko°|dk}|  ||¡}t|ƒd	krÔ|sÔ|sÔqv|D ]R}z,| j| t|ƒ j|d
�| j| t|ƒ< W qØ tk
�r(   t d¡ Y qØX qØ||f}| |¡}|d k�r¨t|jjƒ}t ¡ }||_t ¡ |_|  |¡|j_t|ƒ|j_t|ƒ|j_|jj  |¡ |||< | !|	i ¡ !|
g ¡  |¡ | j" |	|
f¡|krv|||	|
f< qvt
| ¡ ƒD ]ü\}	}t ¡ }|	|_#t $¡ |_$d |j$_%g |j$_&t
| ¡ ƒD ]ž\}
}t &¡ }t '¡ |_'d |j'_(| |	|
f¡‰ ˆ d k�rpd|j'_)nˆ |j'_)‡ fdd„|D ƒ|j'_*t|j'j*ƒ|j'_+|
dk�r´|j'|j$_%n|
|_,|j$j&  |¡ �q,t|j$j&ƒ|j$_-|jj  |¡ �qðt|jjƒ|j_.t|jjƒ|j_+t|jj	ƒ|j_|S )NrÑ   c                 S   s(   | d d | d d | d d | d fS )Nr   rñ   rº   r2   )Úfr2   r2   r3   rc  „  rd  z#Builder.makeTable.<locals>.<lambda>re  c                 s   s   | ]}|j d k	r|j V  qd S r9   )rh  ©r;   rl  r2   r2   r3   r=   Ž  s    
 z$Builder.makeTable.<locals>.<genexpr>r@   rÚ   r   )r¶   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.iÿÿ  c                    s   g | ]}|ˆ kr|‘qS r2   r2   r  ©Zreq_feature_indexr2   r3   rI   Å  s     z%Builder.makeTable.<locals>.<listcomp>rI  )/Úgetattrr   rã   r�   ZScriptRecordr’   ZFeatureRecordr”   rn  ZLookupr…   r]   rÀ   ÚtupleÚdictÚfromkeysÚany_feature_variationsr¼   r\   ri  Ú_replaceÚKeyErrorrÁ   rÂ   r�   Z
FeatureTagZFeatureræ   ZFeatureParamsrh   ZLookupListIndexr•   r¤   r©   r^   Z	ScriptTagZScriptZDefaultLangSysZLangSysRecordZLangSysZLookupOrderZReqFeatureIndexZFeatureIndexr“   Z
LangSysTagZLangSysCountr‘   )r|   r<   r–   Zfeature_indicesZrequired_feature_indicesrM  ZsortFeatureTagr­   r·   r«   r¬   Úfeature_tagZlookup_indicesZsize_featureZforce_featureZixZfeature_keyZfeature_indexZfrecZlang_featuresZsrecZlangrecr2   rq  r3   rŽ   s  sš    




ÿÿÿþÿ







ÿ

zBuilder.makeTablec                 C   sº   i }d}| j  ¡ D ]|\\}}}}g ||< | ¡ D ]\\}}	| j| }
g }|	D ].}|j|krZqJ|jd k	sht‚| |j¡ d}qJ||  |
|f¡ q0q|r¶| ¡ D ]\}}t| j|||ƒ qœd S )NFT)	r_   rÀ   rz   r–   rh  râ   r¤   r&   r0   )r|   r–   Ú	table_tagZfeature_varsZhas_any_variationsr[  ry  Ú
variationsÚconditionsetÚbuildersZraw_conditionsetÚindicesÚbZconditions_and_lookupsr2   r2   r3   r�   ×  s,    

   ÿzBuilder.makeFeatureVariationsc                    sX   | j  ¡ D ]H\\}}}}||kr"q
| ¡ D ]&\}}t‡ fdd„|D ƒƒr*  dS q*q
dS )Nc                 3   s   | ]}|j ˆ kV  qd S r9   )r–   )r;   r  ©rz  r2   r3   r=   ó  s     z1Builder.any_feature_variations.<locals>.<genexpr>TF)r_   rÀ   r—   )r|   ry  rz  r[  r¶   r{  r|  r}  r2   r€  r3   rv  î  s    zBuilder.any_feature_variationsc                 C   s(   dd„ | j  ¡ D ƒ}||kr$|| S d S )Nc                 S   s   i | ]\}}||“qS r2   r2   )r;   ÚkÚvr2   r2   r3   r³   ø  s      z,Builder.get_lookup_name_.<locals>.<dictcomp>)rW   rÀ   )r|   rª   Úrevr2   r2   r3   rj  ÷  s    zBuilder.get_lookup_name_c                 C   s|   |dkr |dkr | j r td|ƒ‚|dkr:| jr@td|ƒ‚nd| _||f| j krhtd| ¡ | ¡ f |ƒ‚| j  ||f¡ d S )NÚDFLTrI  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz1"languagesystem %s %s" has already been specified)rQ   r   rV   ÚstripÚadd)r|   r¥   r«   rO  r2   r2   r3   Úadd_language_systemý  s(    ýýÿýzBuilder.add_language_systemc                 C   s   | j rt| j ƒS tdhƒS d S )N)r„  rI  )rQ   rƒ   r€   r2   r2   r3   Úget_default_language_systems_  s    
z%Builder.get_default_language_systems_c                 C   s:   |   ¡ | _d| _d | _|| _d| _d | _|dkr6|| _d S )Nr„  r   r´   )rˆ  rU   rR   rX   rZ   rS   rT   ra   ©r|   r¥   r5   r2   r2   r3   rÄ   !  s    
zBuilder.start_featurec                 C   s0   | j d k	st‚d | _ d | _d | _d| _d | _d S ró   )rZ   râ   rU   rX   rS   rT   r€   r2   r2   r3   rÇ   +  s    zBuilder.end_featurec                 C   s\   || j krtd| |ƒ‚| jdkr,td|ƒ‚|| _d | j |< d | _| jd krXd| _d | _d S )Nz$Lookup "%s" has already been definedr´   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )rW   r   rZ   rY   rX   rS   rT   r‰  r2   r2   r3   Ústart_lookup_block3  s     
 ÿ
ý

zBuilder.start_lookup_blockc                 C   s4   | j d k	st‚d | _ d | _| jd kr0d| _d | _d S ró   )rY   râ   rX   rZ   rS   rT   r€   r2   r2   r3   Úend_lookup_blockE  s    
zBuilder.end_lookup_blockc                 C   s<   || j kst|ƒ‚d | _| j | }|d k	r8|  || j¡ d S r9   )rW   râ   rX   r®   rZ   )r|   Úlookup_namerª   r2   r2   r3   Úadd_lookup_callM  s
    
zBuilder.add_lookup_callc                 C   s
   || _ d S r9   )rk   )r|   r¥   Úrevisionr2   r2   r3   Úset_font_revisionT  s    zBuilder.set_font_revisionc                    s  t |ƒdkst‚| jdkr*td| j |ƒ‚| jd kr>td|ƒ‚d | _| j|| jf}| j |d d|d f¡‰ |dksx|r�ˆ r�ˆ d d … | j|< n&| j |g ¡}‡ fdd	„|D ƒ| j|< t| j|fgƒ| _	|�r| j|f}|| j
k�rtd
| ¡ | j ¡ | j
|  ¡ f |ƒ‚| j| j
|< d S )Nr  ©r´   rÚ   z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   rI  rñ   c                    s   g | ]}|ˆ kr|‘qS r2   r2   )r;   Úx©r·   r2   r3   rI   r  s      z(Builder.set_language.<locals>.<listcomp>zPLanguage %s (script %s) has already specified feature %s as its required feature)r¼   râ   rZ   r   rX   rR   r]   r�   rƒ   rU   r^   r…  )r|   r¥   rO  Úinclude_defaultÚrequiredr­   Zcur_lookupsr2   r’  r3   Úset_languageW  sD    
ÿý
ý
ýþø
zBuilder.set_languagec                 C   s~   t |ƒ}| j |¡}|d k	r |S t| jƒd }|| j|< |D ]<}|| jkrj| j| \}}td||f |ƒ‚||f| j|< q<|S )Nrº   z=Glyph %s already has been assigned a MarkAttachmentType at %s)rƒ   rt   r�   r¼   rs   r   )r|   r¥   rf  rg  r¾   r[  Úlocr2   r2   r3   ÚgetMarkAttachClass_„  s"    

ÿýzBuilder.getMarkAttachClass_c                 C   s8   t |ƒ}| j |¡}|d k	r |S t| jƒ}|| j|< |S r9   )rƒ   ru   r�   r¼   )r|   r¥   rf  rg  r2   r2   r3   ÚgetMarkFilterSet_–  s    

zBuilder.getMarkFilterSet_c                 C   sT   |d@ }|r$|   ||¡}||d> B }|rD|  ||¡}|dB }|| _nd | _|| _d S )Néÿ   r!  r"  )r—  r˜  rT   rS   )r|   r¥   r  Z
markAttachZ
markFilterZmarkAttachClassr£   r2   r2   r3   Úset_lookup_flagŸ  s    zBuilder.set_lookup_flagc                 C   sp   | j dkrtd| j  |ƒ‚| j d kr.td|ƒ‚| j|dfhkrBd S d | _|| _d| _d | _| j|dddd� d S )	Nr�  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksrI  r   TF)r“  r”  )rZ   r   rU   rX   rR   rS   rT   r•  )r|   r¥   r«   r2   r2   r3   Ú
set_script¬  s&    
ÿý
þzBuilder.set_scriptc                    s>   g }|D ]0}|dk	r.|  ‡ fdd„|D ƒ¡ q|  d¡ q|S )zÓHelper for building chain contextual substitutions

        Given a list of lookup names, finds the LookupBuilder for each name.
        If an input name is None, it gets mapped to a None LookupBuilder.
        Nc                    s   g | ]}ˆ j  |j¡‘qS r2   )rW   r�   r5   rp  r€   r2   r3   rI   Ë  s     z1Builder.find_lookup_builders_.<locals>.<listcomp>)r¤   )r|   r·   Zlookup_buildersrÈ   r2   r€   r3   Úfind_lookup_builders_Á  s    ÿzBuilder.find_lookup_builders_c                 C   s$   |D ]}| j  |tƒ ¡ |¡ qd S r9   )ro   r©   rP   r  )r|   r¥   rf  ZcontourPointsr¾   r2   r2   r3   Úadd_attach_pointsÑ  s    zBuilder.add_attach_pointsc                 C   s(   | j dkrtd|ƒ‚| j ||f¡ d S )Nr´   z9Feature references are only allowed inside "feature aalt")rZ   r   r`   r¤   )r|   r¥   ZfeatureNamer2   r2   r3   Úadd_feature_referenceÕ  s    
 ÿzBuilder.add_feature_referencec                 C   s   | j  |¡ d S r9   )rc   r†  ©r|   r<   r2   r2   r3   Úadd_featureNameÜ  s    zBuilder.add_featureNamec                 C   s   | j  |¡ d S r9   )re   r†  rŸ  r2   r2   r3   Úadd_cv_parameterß  s    zBuilder.add_cv_parameterc                 C   s,   || j kr| j |  d7  < n
d| j |< dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.rº   N)rg   rŸ  r2   r2   r3   Úadd_to_cv_num_named_paramsâ  s    
z"Builder.add_to_cv_num_named_paramsc                 C   s   | j |  |¡ d S r9   )ri   r¤   )r|   Ú	characterr<   r2   r2   r3   Úadd_cv_characterê  s    zBuilder.add_cv_characterc                 C   s"   |r|||f| _ n|||f| _d S r9   )rn   rm   )r|   rL  rM  ÚverticalrN  r2   r2   r3   Úset_base_axisí  s    zBuilder.set_base_axisc           	      C   sV   | j dkrtd| j  |ƒ‚||||g| _| jD ]"\}}||| j f}| j |g ¡ q.d S )NrÚ   z9Parameters statements are not allowed within "feature %s")rZ   r   rj   rU   r]   r©   )	r|   r¥   rÞ   rß   rà   rá   r«   r¬   r­   r2   r2   r3   Úset_size_parametersó  s    
ÿýzBuilder.set_size_parametersc           
      C   sÎ   | j dkr@| ¡ D ](\}}| j |g ¡}||kr| |¡ qd S |sL|sL|r`|  ||||¡ d S |  |t¡}	| ¡ D ]T\}}||	jkr¾||	j| kr¦t	 
d|||¡ ntd||	j| f |ƒ‚||	j|< qtd S )Nr´   zDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz5Already defined rule for replacing glyph "%s" by "%s")rZ   rÀ   rb   r©   r¤   Úadd_single_subst_chained_r°   r   rÅ   ÚlogÚinfor   )
r|   r¥   ÚprefixÚsuffixrÅ   Ú
forceChainZ
from_glyphZto_glyphrÉ   rª   r2   r2   r3   Úadd_single_subst  s4    

ûÿýzBuilder.add_single_substc                 C   s‚   |s|s|r"|   |||||¡ d S |  |t¡}||jkrt||j| krft d|||r^d|› �nd¡ ntd| |ƒ‚||j|< d S )Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at r;  z+Already defined substitution for glyph "%s")Úadd_multi_subst_chained_r°   r   rÅ   r©  rª  r   )r|   r¥   r«  r¾   r¬  Úreplacementsr­  rª   r2   r2   r3   Úadd_multiple_subst"  s"    
û ÿzBuilder.add_multiple_substc                    s¤   | j dkr4| j |g ¡‰ ˆ  ‡ fdd„|D ƒ¡ d S |s<|rr|  |t¡}|  |t¡}|j 	t
||hg||gƒ¡ n|  |t¡}||jkr–td| |ƒ‚||j|< d S )Nr´   c                 3   s   | ]}|ˆ kr|V  qd S r9   r2   r¸   ©rÉ   r2   r3   r=   <  s      z.Builder.add_alternate_subst.<locals>.<genexpr>z)Already defined alternates for glyph "%s")rZ   rb   r©   rÃ   r°   r   r¨   r   Úrulesr¤   r"   rÆ   r   )r|   r¥   r«  r¾   r¬  ÚreplacementÚchainrª   r2   r²  r3   Úadd_alternate_subst9  s    

 ÿzBuilder.add_alternate_substc           	      C   s^   |s|s|r"|   |||||¡ d S |  |t¡}t|ƒs@td|ƒ‚tj|Ž D ]}||j|< qJd S ©Nz!Empty glyph class in substitution)Úadd_ligature_subst_chained_r°   r   Úallr   Ú	itertoolsÚproductÚ	ligatures)	r|   r¥   r«  rf  r¬  r´  r­  rª   r±   r2   r2   r3   Úadd_ligature_substL  s        ÿ
zBuilder.add_ligature_substc              	   C   sN   t |ƒrt |ƒrt |ƒs"td|ƒ‚|  |t¡}|j t||||  |¡ƒ¡ d S ©Nz,Empty glyph class in contextual substitution)r¹  r   r°   r   r³  r¤   r"   rœ  ©r|   r¥   r«  rf  r¬  r·   rª   r2   r2   r3   Úadd_chain_context_substc  s     ÿ   ÿÿzBuilder.add_chain_context_substc                 C   s|   |rt |ƒrt |ƒstd|ƒ‚|  |t¡}| |t¡}|d krJ|  |t¡}|j |¡ |j	 
t|t| ¡ ƒg||gƒ¡ d S r¾  )r¹  r   r°   r   Úfind_chainable_substr   r¨   rÅ   r  r³  r¤   r"   rh   Úkeys)r|   r¥   r«  r¬  rÅ   rµ  Úsubr2   r2   r3   r¨  o  s     ÿÿz!Builder.add_single_subst_chained_c                 C   st   t |ƒrt |ƒstd|ƒ‚|  |t¡}| ||it¡}|d krJ|  |t¡}||j|< |j 	t
||hg||gƒ¡ d S r¾  )r¹  r   r°   r   rÁ  r   r¨   rÅ   r³  r¤   r"   )r|   r¥   r«  r¾   r¬  r°  rµ  rÃ  r2   r2   r3   r¯    s     ÿ
z Builder.add_multi_subst_chained_c           	      C   s|   t |ƒrt |ƒstd|ƒ‚|  |t¡}| ||¡}|d krF|  |t¡}tj|Ž D ]}||j	|< qP|j
 t||||gƒ¡ d S r¾  )r¹  r   r°   r   Zfind_chainable_ligature_substr¨   r   rº  r»  r¼  r³  r¤   r"   )	r|   r¥   r«  rf  r¬  r´  rµ  rÃ  r±   r2   r2   r3   r¸  Œ  s     ÿz#Builder.add_ligature_subst_chained_c                 C   s0   |st d|ƒ‚|  |t¡}|j |||f¡ d S r·  )r   r°   r   r³  r¤   )r|   r¥   Z
old_prefixÚ
old_suffixrÅ   rª   r2   r2   r3   Úadd_reverse_chain_single_substŸ  s    
z&Builder.add_reverse_chain_single_substc                 C   s¬   |s|s|r|   ||||¡ nŠ|  |t¡}|D ]x\}}|sDtd|ƒ‚| j||dd�}	|D ]L}
z| ||
|	¡ W qX tk
r¢ } ztt|ƒ|jƒ|‚W 5 d }~X Y qXX qXq.d S )Nú%Empty glyph class in positioning ruleF©ÚpairPosContext)	Úadd_single_pos_chained_r°   r!   r   ÚmakeOpenTypeValueRecordÚadd_posr#   ri  r¥   )r|   r¥   r«  r¬  Úposr­  rª   rf  r  ZotValueRecordr¾   rm  r2   r2   r3   Úadd_single_pos¨  s&     ÿ  ÿzBuilder.add_single_posc           	      C   sT   |r|st d|ƒ‚|  |t¡}| j||dd�}| j||dd�}| |||||¡ d S ©NrÆ  TrÇ  )r   r°   r    rÊ  ZaddClassPair)	r|   r¥   Zglyphclass1Úvalue1Zglyphclass2Úvalue2rª   Úv1Úv2r2   r2   r3   Úadd_class_pair_pos¼  s    
zBuilder.add_class_pair_posc           	      C   sT   |r|st d|ƒ‚|  |t¡}| j||dd�}| j||dd�}| |||||¡ d S rÎ  )r   r°   r    rÊ  ZaddGlyphPair)	r|   r¥   Zglyph1rÏ  Zglyph2rÐ  rª   rÑ  rÒ  r2   r2   r3   Úadd_specific_pair_posÄ  s    
zBuilder.add_specific_pair_posc              	   C   s>   |st d|ƒ‚|  |t¡}| |||  ||¡|  ||¡¡ d S ©NrÆ  )r   r°   r   Úadd_attachmentÚmakeOpenTypeAnchor)r|   r¥   Z
glyphclassZentryAnchorZ
exitAnchorrª   r2   r2   r3   Úadd_cursive_posÍ  s    


üzBuilder.add_cursive_posc           	      C   sd   |   |t¡}|  |||¡ |s(td|ƒ‚|D ]2\}}|  ||¡}|D ]}||j |i ¡|j< qDq,d S rÕ  )r°   r   Ú
add_marks_r   r×  rL  r©   r5   )	r|   r¥   rL  Úmarksr   Ú
baseAnchorr`  ÚotBaseAnchorr¡   r2   r2   r3   Úadd_mark_base_posÙ  s    
zBuilder.add_mark_base_posc                 C   s|   |   |t¡}g }|std|ƒ‚|D ]@}i }|  |||¡ |D ]\}}	|  ||¡||	j< q<| |¡ q"|D ]}
||j|
< qhd S rÕ  )r°   r   r   rÙ  r×  r5   r¤   r¼  )r|   r¥   r¼  Ú
componentsr   ZcomponentAnchorsrÚ  ÚanchorsZ	ligAnchorr`  r¾   r2   r2   r3   Úadd_mark_lig_posä  s    
zBuilder.add_mark_lig_posc           	      C   sd   |   |t¡}|  |||¡ |s(td|ƒ‚|D ]2\}}|  ||¡}|D ]}||j |i ¡|j< qDq,d S rÕ  )r°   r   rÙ  r   r×  Ú	baseMarksr©   r5   )	r|   r¥   rá  rÚ  r   rÛ  r`  rÜ  ZbaseMarkr2   r2   r3   Úadd_mark_mark_posó  s    
þÿzBuilder.add_mark_mark_posc              	   C   sN   t |ƒrt |ƒrt |ƒs"td|ƒ‚|  |t¡}|j t||||  |¡ƒ¡ d S )Nú0Empty glyph class in contextual positioning rule)r¹  r   r°   r   r³  r¤   r"   rœ  r¿  r2   r2   r3   Úadd_chain_context_pos   s     ÿ   ÿÿzBuilder.add_chain_context_posc                 C   s  |rt |ƒrt |ƒstd|ƒ‚|  |t¡}g }|jD ]\}}}}| |¡ q4g }	|D ]z\}
}|d krp|	 d ¡ qT| j||dd�}| ||
|¡}|d kr¬|  	|t
¡}| |¡ |
D ]}| |||¡ q°|	 |¡ qTt|ƒt|	ƒksìt||	fƒ‚|j t|dd„ |D ƒ||	ƒ¡ d S )Nrã  FrÇ  c                 S   s   g | ]\}}|‘qS r2   r2   )r;   r±   r‚  r2   r2   r3   rI   '  s     z3Builder.add_single_pos_chained_.<locals>.<listcomp>)r¹  r   r°   r   r³  rÃ   r¤   rÊ  Zfind_chainable_single_posr¨   r!   rË  r¼   râ   r"   )r|   r¥   r«  r¬  rÌ  rµ  Útargetsr[  r·   Úsubsrf  r  ZotValuerÃ  r¾   r2   r2   r3   rÉ    s<     ÿ
  ÿ
ÿzBuilder.add_single_pos_chained_c           
   	   C   sŒ   |D ]‚\}}|j D ]r}|j ¡ D ]b}||jkrT|  |t |j¡¡}|j|f|j|< q |j| d }	|j|	kr t	d||	|jf |ƒ‚q qqdS )z)Helper for add_mark_{base,liga,mark}_pos.r   z&Glyph %s cannot be in both @%s and @%sN)
r\  rf  r]  rÚ  r×  ÚcopyÚdeepcopyÚanchorr5   r   )
r|   r¥   ZlookupBuilderrÚ  r[  r`  ra  ÚmarkZotMarkAnchorZexistingMarkClassr2   r2   r3   rÙ  *  s"    

 
ÿ

ÿýzBuilder.add_marks_c                 C   s   | j  |¡ d S r9   )rX   Úadd_subtable_break)r|   r¥   r2   r2   r3   rë  =  s    zBuilder.add_subtable_breakc                 C   sB   | j  |d¡\}}|r0||kr0td||f |ƒ‚||f| j |< d S )N©NNz0Glyph %s was assigned to a different class at %s)rr   r�   r   )r|   r¥   r¾   Z
glyphClassZoldClassZoldLocationr2   r2   r3   ÚsetGlyphClass_@  s    ÿýzBuilder.setGlyphClass_c                 C   sd   |D ]}|   ||d¡ q|D ]}|   ||d¡ q|D ]}|   ||d¡ q4|D ]}|   ||d¡ qLd S )Nrº   rñ   r  r  )rí  )r|   r¥   Z
baseGlyphsZligatureGlyphsZ
markGlyphsZcomponentGlyphsr¾   r2   r2   r3   Úadd_glyphClassDefJ  s    zBuilder.add_glyphClassDefc                 C   s"   |D ]}|| j kr|| j |< qd S r9   )rq   ©r|   r¥   rf  Zcaretsr¾   r2   r2   r3   Úadd_ligatureCaretByIndex_V  s    
z!Builder.add_ligatureCaretByIndex_c                 C   s2   t |tƒs|S |  ||¡\}}|d k	r.||fS |S r9   )rJ   r   ÚmakeVariablePos)r|   r¥   ÚcaretÚdefaultÚdevicer2   r2   r3   ÚmakeLigCaret[  s    
zBuilder.makeLigCaretc                    s6   ‡ ‡fdd„|D ƒ}|D ]}|ˆj kr|ˆj |< qd S )Nc                    s   g | ]}ˆ  ˆ |¡‘qS r2   )rõ  )r;   rò  ©r¥   r|   r2   r3   rI   d  s     z3Builder.add_ligatureCaretByPos_.<locals>.<listcomp>)rp   rï  r2   rö  r3   Úadd_ligatureCaretByPos_c  s    
zBuilder.add_ligatureCaretByPos_c                 C   s   | j  |||||g¡ d S r9   )rl   r¤   )r|   r¥   rÕ   rê   rë   rì   rí   r2   r2   r3   Úadd_name_recordi  s    zBuilder.add_name_recordc                 C   s   || j |< d S r9   )rv   ©r|   r­   r  r2   r2   r3   Úadd_os2_fieldl  s    zBuilder.add_os2_fieldc                 C   s   || j |< d S r9   )rw   rù  r2   r2   r3   Úadd_hhea_fieldo  s    zBuilder.add_hhea_fieldc                 C   s   || j |< d S r9   )rx   rù  r2   r2   r3   Úadd_vhea_fieldr  s    zBuilder.add_vhea_fieldc                    st   d| j krtd|ƒ‚dd„ | jD ƒ‰ ‡ fdd„| ¡ D ƒ}d| j krf| j d j‰‡fdd„| ¡ D ƒ}|| j|< d S )NrG   z?Cannot add feature variations to a font without an 'fvar' tablec                 S   s    i | ]}|j |j|j|jf“qS r2   )rH   ZminValueZdefaultValueZmaxValue)r;   rK  r2   r2   r3   r³   }  s   ÿ z,Builder.add_conditionset.<locals>.<dictcomp>c                    s2   i | ]*\}\}}|t |ˆ | ƒt |ˆ | ƒf“qS r2   )r'   )r;   r<   ÚbottomÚtop)ÚaxisMapr2   r3   r³   ‚  s
   
üþÚavarc                    s*   i | ]"\‰ }ˆ t ‡ ‡fd d„|D ƒƒ“qS )c                 3   s(   | ] }ˆ ˆkrt |ˆˆ  ƒn|V  qd S r9   )r(   )r;   r‚  )rK  rÅ   r2   r3   r=   �  s   ÿz6Builder.add_conditionset.<locals>.<dictcomp>.<genexpr>)rs  )r;   Zcondition_range)rÅ   )rK  r3   r³   �  s
   ü þ)r0   r   rO   rÀ   Úsegmentsrz   )r|   r¥   r­   r  r2   )rÿ  rÅ   r3   Úadd_conditionsetu  s"    
þþ
û

ûzBuilder.add_conditionsetc                 C   sj   | j std|ƒ‚| j|_|js(|jd fS | | j | j| j d¡¡\}}d }|d k	rb|dkrbt	|ƒ}||fS )Nz5Can't define a variable scalar in a non-variable fontr   l   ÿÿ )
rN   r   rO   Z	does_varyró  Zadd_to_variation_storer{   r0   r�   r%   )r|   r¥   Ú	varscalarró  rJ  rô  r2   r2   r3   rñ  ™  s"     ÿ
  
ÿzBuilder.makeVariablePosc                 C   s^   d }t |tƒs,|d k	r$t t|ƒ¡}||fS |  ||¡\}}|d k	rV|d k	rVtd|ƒ‚||fS )Nú4Can't define a device coordinate and variable scalar)rJ   r   r  ÚbuildDevicert  rñ  r   )r|   r  ZdeviceTabler¥   rô  ró  r2   r2   r3   ÚmakeAnchorPos­  s    
 ÿzBuilder.makeAnchorPosc                 C   sŒ   |dkrdS d\}}|j dk	r.t t|j ƒ¡}|jdk	rHt t|jƒ¡}|  |j|j |¡\}}|  |j|j|¡\}}t |||j	||¡}|S )zast.Anchor --> otTables.AnchorNrì  )
ZxDeviceTabler  r  rt  ZyDeviceTabler  r‘  ÚyZbuildAnchorZcontourpoint)r|   r¥   ré  ZdeviceXZdeviceYr‘  r  Z	otlanchorr2   r2   r3   r×  º  s    

zBuilder.makeOpenTypeAnchorc                 C   s<   i | ]4\}}}}|  d ¡s|d  ¡ |dd…  ||f“qS )ÚReservedr   rº   N)Ú
startswithÚlower)r;   r[  r5   ÚisDevicer2   r2   r3   r³   È  s   

þ zBuilder.<dictcomp>c                 C   sî   |sdS i }| j  ¡ D ]ª\}\}}t||dƒ}|s4q|rLt t|ƒ¡||< qt|tƒr¸|dd… d }	|	d  ¡ |	dd…  }
t||
ƒr’t	d|ƒ‚|  
||¡\||< }|dk	rÀ|||	< q|||< q|rà|sà|jrØddinddi}t |¡}|S )	z&ast.ValueRecord --> otBase.ValueRecordNr   r  ZDevicerº   r  ZYAdvanceZXAdvance)Ú_VALUEREC_ATTRSrÀ   rr  r  r  rt  rJ   r   r
  r   rñ  r¥  Z
buildValue)r|   r¥   r‚  rÈ  ZvrZastNameZotNamer  ÚvalZotDeviceNameZfeaDeviceNamerô  ZvalRecr2   r2   r3   rÊ  Î  s2    

 ÿ


zBuilder.makeOpenTypeValueRecord)NF)F)_Ú__name__Ú
__module__Ú__qualname__rƒ   r‚   r}   r/   r¨   r®   r°   r‡   rˆ   r‰   rŠ   rÙ   ræ   r‹   rŒ   r	  r  r  r�   r   rš   rF  rB  r™   rQ  rS  rU  rž   rn  rŽ   r�   rv  rj  r‡  rˆ  rÄ   rÇ   rŠ  r‹  r�  r�  r•  r—  r˜  rš  r›  rœ  r�  rž  r   r¡  r¢  r¤  r¦  r§  r®  r±  r¶  r½  rÀ  r¨  r¯  r¸  rÅ  rÍ  rÓ  rÔ  rØ  rÝ  rà  râ  rä  rÉ  rÙ  rë  rí  rî  rð  rõ  r÷  rø  rú  rû  rü  r  rñ  r  r×  r   ZvalueRecordFormatr  rÊ  r2   r2   r2   r3   r.   ]   s¼   þJ
>3+TU-,$d	
-	 ÿ
		
$þr.   )NF)NNF)IZfontTools.miscr   ZfontTools.misc.textToolsr   r   r   r   ZfontTools.feaLib.errorr   Z fontTools.feaLib.lookupDebugInfor   r	   r
   ZfontTools.feaLib.parserr   ZfontTools.feaLib.astr   ZfontTools.feaLib.variableScalarr   ZfontTools.otlLibr   r  ZfontTools.otlLib.maxContextCalcr   ZfontTools.ttLibr   r   ZfontTools.ttLib.tablesr   r   ZfontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   ZfontTools.otlLib.errorr#   ZfontTools.varLib.varStorer$   ZfontTools.varLib.builderr%   ZfontTools.varLib.featureVarsr&   ZfontTools.varLib.modelsr'   r(   Úcollectionsr)   rç  rº  Úior*   ÚloggingrÁ   r›   Ú	getLoggerr  r©  r4   r8   Úobjectr.   r2   r2   r2   r3   Ú<module>   s<   D

     ÿ
