a
    ¥Q•hÉ`  ã                   @   sÞ   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	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mZ d	dlmZ d	dlmZmZmZmZmZ d	dlmZmZ G dd„ dƒZ dd„ Z!dd„ Z"dd„ Z#dS )zFonts integration in PDF.é    N)Úmd5)ÚWARNING)Úceil)Úsubset)ÚTTFontÚ
TTLibErrorÚttFont)ÚinstantiateVariableFonté   )ÚLOGGERÚcapture_logs)ÚPANGO_STRETCH_PERCENT)Ú
FROM_UNITSÚffiÚharfbuzzÚharfbuzz_subsetÚpango)Úget_hb_object_dataÚget_pango_font_hb_facec                   @   s@   e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dS )ÚFontc                    sl  t  |¡| _t|ƒ| _t| jƒ| _t | j¡| _	|| _
t  |¡| _t t  |¡¡| _i | _t  |¡}|tjkrŽdd„ t |¡ ¡  d¡D ƒ| _| j d¡ }r¶t|ƒ| _t  ||¡ nt  |¡| _| j d¡rÞt  |t j¡ n| j d¡røt  |t j¡ | j d¡ ‰ d u�r6tt  ¡ ‡ fdd	„d
�d }t  !||¡ t t  "|¡¡}d #dd„ t$|dd� %¡ d d… D ƒ¡| _&t' d|¡d }d| j& (¡  d | )dd¡ | _*| j
�röt  +|tj¡}	tt  ,|	¡t- | j
 d ƒ| _.tt  /|	¡t- | j
 d ƒ | _0nd | _.| _0t 1dd¡}
t 1d¡}t 1d¡}t 2| jd|
|¡ g | _3t4|
d ƒD ],}t 5|| |¡ | j3 6t |¡ ¡ ¡ �qFd| _7d| j3v �ràd| j3v �ràd| j3v �rÚt 8d d!¡}t 9| j|¡}t :|¡dk�rÎd"| _7t ;|¡ nd"| _7d| _<t =| j¡| _>t ?| j¡| _@t A| j¡| _Bd#| _Cd#| _Di | _Ei | _Fd| _Gd$| _H| j�rJ|  jHd%7  _Hd&| d¡v �rh|  jHd'7  _Hd S )(Nc                 S   s*   i | ]"}|  d ¡d t|  d ¡d ƒ“qS )ú=r   é   )ÚsplitÚfloat)Ú.0Úpart© r   úM/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/pdf/fonts.pyÚ
<dictcomp>"   s   ÿz!Font.__init__.<locals>.<dictcomp>ú,ÚweightÚitalÚslntZwdthc                    s   t | d ˆ  ƒS )Nr   )Úabs)Úitem©Úwidthr   r   Ú<lambda>3   ó    zFont.__init__.<locals>.<lambda>)Úkeyr   Ú c                 s   s   | ]}t d |d  ƒV  qdS )éA   é   N)Úchr©r   Úletterr   r   r   Ú	<genexpr>9   s   z Font.__init__.<locals>.<genexpr>F)Úusedforsecurityé   s    [#@]r   ó   /ó   +ó    ó   -éè  zunsigned int *éd   zhb_tag_t[100]zchar[4]ÚEBDTÚEBLCÚglyfs   glyféÿÿÿÿTéP   é   é@   s   Serifr
   )Ir   Zpango_font_get_hb_fontÚhb_fontr   Úhb_facer   Úfile_contentr   Zhb_face_get_indexÚindexÚ	font_sizeZ pango_font_description_get_styleÚstyler   ÚstringZ!pango_font_description_get_familyÚfamilyÚ
variationsZ%pango_font_description_get_variationsÚNULLÚdecoder   ÚgetÚroundr    Ú!pango_font_description_set_weightZ!pango_font_description_get_weightÚ pango_font_description_set_styleÚPANGO_STYLE_ITALICÚPANGO_STYLE_OBLIQUEÚminr   ÚitemsÚ"pango_font_description_set_stretchZ pango_font_description_to_stringÚjoinr   ÚdigestÚhashÚreÚencodeÚreplaceÚnameZpango_font_get_metricsÚpango_font_metrics_get_ascentr   ÚascentZpango_font_metrics_get_descentÚdescentÚnewZhb_face_get_table_tagsÚtablesÚrangeZhb_tag_to_stringÚappendÚbitmapÚhb_tag_from_stringZhb_face_reference_tableZhb_blob_get_lengthÚhb_blob_destroyÚitalic_angleZhb_face_get_upemÚupemZhb_ot_color_has_pngÚpngZhb_ot_color_has_svgÚsvgÚstemvÚstemhÚwidthsÚcmapÚused_in_formsÚflags)ÚselfÚ
pango_fontÚdescriptionrD   rH   r    ÚstretchZdescription_stringrZ   Zpango_metricsZtable_countZ
table_tagsÚ
table_nameÚiÚtagÚblobr   r%   r   Ú__init__   s²    


þ
ÿÿ
þþÿ
þ
 ÿÿÿÿÿÿ


zFont.__init__c                 C   sj  |   ||¡ d| jv �rVt | j¡}t|| jd�}d| jvrH| j| jd< d| jvr^| j	| jd< d| jvr¶d}| j
dkr¬|d jD ]*}|jdkr€|jdkr |j}n|j} q¬q€|| jd< d| jvrÔt| j
d	kƒ| jd< t ¡ }zPt|| jƒ}|d
 j ¡ D ]&\}\}	}
|	dk rød|
f|d
 j|< qø| |¡ W n t�yJ   t d¡ Y n0 | ¡ | _| j�sf| j�rft | j¡}t|| jd�}zÆd| jv�sšd| jv�rät d¡ƒ |d< t d¡ƒ |d< | ¡ |d _dd„ |d jD ƒ|d _n(|d jD ]}t d¡  ¡ |d |< �qîdD ]}||v �r||= �qt ¡ }| |¡ | ¡ | _W n t!�yd   t d¡ Y n0 dS )zRemove useless data from font.Úfvar©Ú
fontNumberZwghtZopszr"   r   r   r!   r
   ÚhmtxzUnable to mutate variable fontÚlocar;   c                 S   s   i | ]}|t  d ¡ ¡ “qS )r;   )r   ÚgetTableModuleÚGlyph©r   rZ   r   r   r   r   ¢   s   ÿzFont.clean.<locals>.<dictcomp>)ÚCBDTÚCBLCzSVG zUnable to save emoji fontN)"r   r_   ÚioÚBytesIOrB   r   rC   rH   r    rD   rE   ÚaxesÚaxisTagÚmaxValueÚminValueÚintr	   ÚmetricsrR   ÚsaveÚ	Exceptionr   ÚwarningÚgetvaluerg   rh   r   ÚgetTableClassÚgetGlyphOrderÚ
glyphOrderÚglyphsr}   r~   r   )ro   rl   ÚhintingÚ	full_fontÚttfontr"   ZaxeZpartial_fontr)   ÚadvanceZbearingÚglyphrs   Zoutput_fontr   r   r   Úcleanq   sf    








þ


z
Font.cleanc                 C   s   | j d d… dkrdS dS )Nr>   s   OTTOÚotfZttf)rB   )ro   r   r   r   Útype±   s    z	Font.typec                 C   s8   |sdS t r(t ddd¡r(|  ||¡ n|  ||¡ dS )z*Remove unused glyphs and tables from font.Nr>   r   r   )r   r   Zhb_version_atleastÚ_harfbuzz_subsetÚ_fonttools_subset)ro   rl   r’   r   r   r   r   µ   s
    zFont.subsetc                 C   s|  t  t ¡ tj¡}t |¡}t  dt|ƒ› d�t|ƒ¡}t	 
||t|ƒ¡ tjtjB tjB }t ||¡ t |tj¡}tdd„ dD ƒƒ}t  dt|ƒ› d�|¡}	t	 
||	t|ƒ¡ t  t | j|¡t	j¡}
t |¡}ttt|ƒd ƒƒ}t  dt|ƒ› d�|¡}t	 
||t|ƒ¡ tjtjB }|�s.|tjO }t ||¡ t  t |
|¡t	j¡}
|
�rnt|
ƒ}|�rn|| _dS t d¡ dS )	zSubset font using Harfbuzz.zhb_codepoint_t[ú]c                 s   s   | ]}t  |d ¡V  qdS )r<   N)r   rc   r   r   r   r   r0   Õ   r(   z(Font._harfbuzz_subset.<locals>.<genexpr>)s   BASEs   DSIGs   EBDTs   EBLCs   EBSCs   GPOSs   GSUBs   JSTFs   LTSHs   PCLTs   SVG r   Nz#Unable to subset font with Harfbuzz)r   Úgcr   Zhb_subset_input_create_or_failZhb_subset_input_destroyZhb_subset_input_glyph_setr^   ÚlenÚsortedr   Zhb_set_add_sorted_arrayZHB_SUBSET_FLAGS_RETAIN_GIDSZ(HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZEDZHB_SUBSET_FLAGS_DESUBROUTINIZEZhb_subset_input_set_flagsZhb_subset_input_setZHB_SUBSET_SETS_DROP_TABLE_TAGÚtupleZhb_subset_or_failrA   Zhb_face_destroyr`   ÚmaxZHB_SUBSET_FLAGS_NO_HINTINGr   rB   r   rŒ   )ro   rl   r’   Z	hb_subsetZgid_setZ	gid_arrayrn   Zdrop_setÚdrop_tablesZdrop_tables_arrayrA   ÚkeeprB   r   r   r   rš   À   sZ    þ
ÿþÿÿþ
ÿÿ

þzFont._harfbuzz_subsetc           
      C   sì   t  | j¡}tjddd|dd�}| jg d¢7  _t |¡}|j|d� zft|| j	d�}t
dtd��}| |¡ W d  ƒ n1 s„0    Y  |D ]}t d	| j ¡ |¡ q’W n tyÊ   t d
¡ Y n0 t  ¡ }	| |	¡ |	 ¡ | _dS )zSubset font using Fonttools.T)Zretain_gidsZpassthrough_tablesZignore_missing_glyphsr’   Zdesubroutinize)ÚGSUBÚGPOSÚSVG)Úgidsry   Ú	fontTools)ÚlevelNz*fontTools warning when subsetting "%s": %sz$Unable to subset font with fontTools)r‚   rƒ   rB   r   ÚOptionsr¢   Z	SubsetterÚpopulater   rC   r   r   r   rŒ   rG   rJ   r   rŠ   r�   )
ro   rl   r’   r“   ÚoptionsZ	subsetterr”   ZlogsÚlogZoptimized_fontr   r   r   r›   ü   s,    þ
(
þ

zFont._fonttools_subsetN)
Ú__name__Ú
__module__Ú__qualname__rw   r—   Úpropertyr™   r   rš   r›   r   r   r   r   r      s   \@
<r   c              
   C   sú  t  ¡ }i }| ¡ D ]}| |jg ¡ |¡ qi }| ¡ D ]¤\}	}
|
d }|jrRq:i }|rx|jsx|
D ]}i |¥|j	¥}qd| 
||d ¡ |jdkr¢t  ddi¡}nt  dt|jƒi¡}t j|jg||d�}|  |¡ |j||	< q:| ¡ D �]
}|�r
|j�s
|j}|j	}nŒt |j¡}t||jd�}i i  }}t| ¡  ¡ ƒD ]\}}|jd	 |j ||< �q>| ¡  ¡ D ]*\}}| |¡}||v�rjt|ƒ||< �qjt jg d
¢|d�}t|ƒ}t| ¡ ƒ}tt|d ƒƒD ]’}t d||d  ƒ}|j! |› d� "¡ ¡ ||d |d d … D ]>\}}d #dd„ |D ƒ¡}|j! d|d›d|› d� "¡ ¡ �q|j! d¡ �qÌ|j! $g d¢¡ |  |¡ t  dd|j�rŽdnd› �|j%|jdœ¡}|j�rÀt&|| ||||ƒ nt'|| |||||j |d ƒ |  |¡ |j||j< qè|S )zBuild PDF dictionary for fonts.r   r’   r˜   ÚSubtypeú	/OpenTypeÚLength1©Úcompressry   r7   )s$   /CIDInit /ProcSet findresource begins   12 dict begins	   begincmaps   /CIDSystemInfos   << /Registry (Adobe)s   /Ordering (UCS)s   /Supplement 0s   >> defs!   /CMapName /Adobe-Identity-UCS defs   /CMapType 2 defs   1 begincodespaceranges   <0000> <ffff>s   endcodespaceranger8   z beginbfcharr   r*   c                 s   s   | ]}|  d ¡ ¡ › V  qdS )z	utf-16-beN)rX   Úhexr.   r   r   r   r0   [  s   z)build_fonts_dictionary.<locals>.<genexpr>ú<Ú04xz> <ú>s	   endbfchar)s   endcmaps-   CMapName currentdict /CMap defineresource popó   endr»   ú/Fontz/Typeé   )ÚTyper²   ÚBaseFontZ	ToUnicodeÚpdf_version)(ÚpydyfÚ
DictionaryÚvaluesÚ
setdefaultrV   ra   rR   rb   rm   rl   r—   r™   rž   rB   ÚStreamÚ
add_objectÚ	referencerk   r‚   rƒ   r   rC   Ú	enumerateÚgetGlyphSetr&   rf   ÚgetBestCmapÚ
getGlyphIDr-   r    r`   r   rQ   ÚstreamrX   rT   ÚextendrZ   Ú_build_bitmap_font_dictionaryÚ_build_vector_font_dictionary)ÚpdfÚfontsr¶   r   r¬   Ú	pdf_fontsZfonts_by_file_hashÚfontZfont_references_by_file_hashÚ	file_hashZ
file_fontsrl   Z	file_fontZ
font_extraZfont_streamZfont_widthsr“   r”   rt   r–   r/   r)   Z
to_unicodeZcmap_lengthZ
cmap_itemsZbatch_lengthÚtextZunicode_codepointsÚfont_dictionaryr   r   r   Úbuild_fonts_dictionary  sˆ    






ó 
ÿÿ
üÿ
þ
r×   c           7         st  t  g d¢¡| d< t  g d¢¡| d< |r8tt|jƒƒ}nttdƒƒ}|d |d  }}g }	t|ƒD ]*}
|
d |vr||	 |
¡ |	 d	|
› �¡ qb|| d
< || d< t  dt  |	¡dœ¡| d< t  i ¡}t 	|j
¡}t||jd�}|d jd }dg|| d  }i }| ¡ D �]
\}}
|
 ¡ }| |¡}|dk�r¸|
j}|d jd j}|D ]X}|j}|j}||  k�rp|k�rHn n*|jj}|jj }‰|jj}|jj} �q(�qHt d|› �¡ �qnp|dv �rÆdnd}|
j|d … }|
jdd… \}‰tj|
jdd… ddd�}tj|
jdd… ddd�}|
jd }|| }||v �rF|||| < tˆd ƒ}ˆ||||d d dœ }||< dˆ|fv �s‚|�sŽd|d< �q|dv �r¤||d< �q|d v �r&dˆd  d ‰t t| !¡ d!ƒƒdd … ‰ ˆ  "dt#|ƒ ¡‰ d" $‡ ‡‡fd#d$„t|ƒD ƒ¡} t| dƒ %|| d¡|d< nì|d%v �ròg  }!|d&< |d'k�rJdnd}"t ||"|"d … d¡}#t|#ƒD ]€}$|"d |$d  }%t ||%|%d … d¡}&tj||%d |%d … ddd�}'tj||%d |%d … ddd�}(|! |&|'|(d(œ¡ �qnn t d)|› �¡ t&|| ƒ|d< �q| ¡ D �],\}}||v�r6�q|d* }|d+ ‰|d, }|d- }'|d. }(|d d u �rê|| })t t&|)ƒd¡}*|d& D �]L}+|+d- },|+d. }-|+d/ }.|.|v�rÈt d0|.› �¡ �qŒ||. }+|+d d u �ròt d1|.› �¡ �qŒt|+d, ƒD ]Ø}/t'|/|+d*  |/d |+d*  ƒ}0|+d |0 }1t |1d¡}2|d ||- |/ d  }3||+d*  }4|4dk�rt|2|4d K }2n|4dk �rŒ|2|4 d L }2|,dk�r |2|,L }2n|,dk �r´|2|, K }2|2d|d > ; }2|2|3K }2|*|2O }*�qþ�qŒ|* %|)d¡}5n|d }5t j(d2ˆ› d3|› d4|'› d4|(› d5� )¡ d6d7d8ˆd9|d:d;d<|5d=g|d>�}6| *|6¡ |6j+||< �q| *|¡ t  |¡| d?< |j+| d@< d S )AN)r   r   r   r   ÚFontBBox)r   r   r   r   r   r   Z
FontMatrixé   r   r<   r   ú/Ú	FirstCharÚLastCharz	/Encoding)r¾   ÚDifferencesÚEncodingry   r9   é   r:   z"Unknown bitmap metrics for glyph: )r   r
   é   rà   r
   r½   ÚbigT)Úsignedr>   )r&   ÚheightÚxÚyÚstriderb   Ú	subglyphsr(   rb   )r   r2   )r
   rß   é   é   r*   c                 3   s.   | ]&}ˆ |ˆ |d  ˆ … ˆd  V  qdS )r   Ú0Nr   )r   rt   ©ÚbitsÚpaddingr&   r   r   r0   Æ  s   ÿz0_build_bitmap_font_dictionary.<locals>.<genexpr>)rà   é	   rç   rî   )Úidrä   rå   z!Unsupported bitmap glyph format: ræ   r&   rã   rä   rå   rï   zUnknown subglyph: z"Unsupported subglyph in subglyph: s   0 0 d0z 0 0 ú z cms   BIs   /IM trues   /Ws   /Hs   /BPC 1s   /D [1 0]s   IDs   EIrµ   ÚWidthsZ	CharProcs),rÁ   ÚArrayr    rŸ   rl   r`   ra   rÂ   r‚   rƒ   rB   r   rC   Z
strikeDatarR   Z	getFormatrË   ÚdataZstrikesZindexSubTablesZfirstGlyphIndexZlastGlyphIndexr‰   rã   r&   ZhoriBearingXZhoriBearingYr   rŒ   rˆ   Ú
from_bytesr   Úbinr·   Úzfillrž   rT   Úto_bytesÚbytesÚslicerÅ   rX   rÆ   rÇ   )7rÖ   rÐ   rÓ   rk   r¶   r   ÚcharsÚfirstÚlastÚdifferencesr–   Z
char_procsr“   r”   Zfont_glyphsZglyphs_infor)   Zglyph_formatZglyph_idró   Z	subtablesZsubtableZfirst_indexÚ
last_indexrã   r•   Z	bearing_xZ	bearing_yZ
data_startÚ
position_yræ   Ú
glyph_infoZbitmap_bitsrç   rt   Znumber_of_componentsÚjrC   Zsubglyph_idrä   rå   ÚlengthZ
bitmap_intZsubglyphZsub_xZsub_yZsub_idÚrow_yZ	row_sliceÚrowZrow_intÚshiftZstride_differencerb   Zbitmap_streamr   rë   r   rÎ   z  s    
þ





ù

þ
  


þ





÷
ö

rÎ   c                 C   s.  d|j dkrdnd› �}|r(t| ¡ ƒnd}d|j||jf}	|j}
t|ƒdkrltt|j ¡ ƒƒdkrl|
d7 }
t	 
ddd	|jd
t	 |j¡d|
dt	 |	¡d|jd|jd|jd|	d d|jd|j||i¡}t|ƒdk�rJt|jƒ}t|d d d ƒ}dg| d }|D ]}d||< �qt	jtd |¡dƒ |d¡f|d�}| |¡ |j|d< |j dk�r^d|d< | |¡ t	 ¡ }t|ƒD ]>}|d |v�r¦| |¡ t	 ¡ }| |¡ | || ¡ �qxt	 
dd|j dk�rÐdnd› �|jt	 
t	 d ¡t	 d!¡dd"œ¡d#||jd$œ¡}| |¡ d%| d&< t	 |jg¡| d'< d S )(NÚFontFiler˜   r½   r
   r   r   r¾   z/FontDescriptorÚFontNameZ
FontFamilyÚFlagsrØ   ÚItalicAngleÚAscentÚDescentÚ	CapHeightÚStemVZStemHz1.4r<   rà   rê   Ú1r*   rá   rµ   ZCIDSetr³   r²   r¼   z/CIDFontTypeZAdobeÚIdentity)ZRegistryZOrderingZ
Supplementz	/Identity)r¾   r²   r¿   ZCIDSystemInfoZCIDToGIDMapÚWÚFontDescriptorz/Identity-HrÞ   ZDescendantFonts)r™   r¡   rÃ   r]   r\   rn   rž   Úsetrk   rÁ   rÂ   rZ   ÚStringrG   rò   re   ri   rj   ÚstrrŸ   r   rÅ   rˆ   rT   r÷   rÆ   rÇ   ra   )rÖ   rÐ   rÓ   rk   r¶   rÇ   rÀ   Z	font_fileÚmax_xÚbboxrn   Zfont_descriptorZcidsZpadded_widthrì   ÚcidrÌ   Z
pdf_widthsrt   Zcurrent_widthsZsubfont_dictionaryr   r   r   rÏ     st    "
ô
þ




ýõ
rÏ   )$Ú__doc__r‚   rW   Úhashlibr   Úloggingr   Úmathr   rÁ   r¨   r   ÚfontTools.ttLibr   r   r   ZfontTools.varLib.mutatorr	   Úloggerr   r   Ztext.constantsr   Ztext.ffir   r   r   r   r   Ú
text.fontsr   r   r   r×   rÎ   rÏ   r   r   r   r   Ú<module>   s(     a "