
    ,g`                         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      Z d Z!d Z"d Z#y)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                   :    e Zd Zd Zd Zed        Zd Zd Zd Z	y)Fontc           	         t        j                  |      | _        t        |      | _        t        | j                        | _        t        j                  | j                        | _	        || _
        t        j                  |      | _        t        j                  t        j                  |            | _        i | _        t        j$                  |      }|t        j&                  k7  rst        j                  |      j)                         j+                  d      D ci c]2  }|j+                  d      d   t-        |j+                  d      d         4 c}| _        | j"                  j/                  d      x}r't1        |      | _        t        j4                  ||       nt        j6                  |      | _        | j"                  j/                  d      r%t        j8                  |t         j:                         n?| j"                  j/                  d      r$t        j8                  |t         j<                         | j"                  j/                  d      x;t?        tA        jB                         fd	
      d   }t        jD                  ||       t        j                  t        jF                  |            }djI                  d tK        |d      jM                         d d D              | _'        tQ        j*                  d|      d   }	d| jN                  jS                         z   dz   |	jU                  dd      z   | _+        | j                  rt        jX                  |t        j&                        }
t1        t        jZ                  |
      t\        z  | j                  z  dz        | _/        t1        t        j`                  |
      t\        z  | j                  z  dz         | _1        ndx| _/        | _1        t        jd                  dd      }t        jd                  d      }t        jd                  d      }t        jf                  | j                  d||       g | _4        tk        |d         D ]W  }t        jl                  ||   |       | jh                  jo                  t        j                  |      j)                                Y d| _8        d| jh                  v rd| jh                  v rd| jh                  v rkt        jr                  dd      }t        jt                  | j                  |      }t        jv                  |      dk(  rd| _8        t        jx                  |       nd| _8        d| _=        t        j|                  | j                        | _?        t        j                  | j                        | _A        t        j                  | j                        | _C        d | _D        d | _E        i | _F        i | _G        d| _H        d!| _I        | j                  r| xj                  d"z  c_I        d#|	j+                  d      v r| xj                  d$z  c_I        y y c c}w )%N,=r      weightitalslntwdthc                 &    t        | d   z
        S )Nr   )abs)itemwidths    l/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/weasyprint/pdf/fonts.py<lambda>zFont.__init__.<locals>.<lambda>3   s    T!Wu_!5     )key c              3   >   K   | ]  }t        d |dz  z           yw)A      N)chr.0letters     r$   	<genexpr>z Font.__init__.<locals>.<genexpr>9   s%      L&,CVb[ !Ls   F)usedforsecurity   s    [#@]   /   +       -  zunsigned int *d   zhb_tag_t[100]zchar[4]EBDTEBLCglyfs   glyfTP      @   s   Serifr   )Jr   pango_font_get_hb_fonthb_fontr   hb_facer   file_contentr   hb_face_get_indexindex	font_size pango_font_description_get_stylestyler   string!pango_font_description_get_familyfamily
variations%pango_font_description_get_variationsNULLdecodesplitfloatgetroundr   !pango_font_description_set_weight!pango_font_description_get_weight pango_font_description_set_stylePANGO_STYLE_ITALICPANGO_STYLE_OBLIQUEminr   items"pango_font_description_set_stretch pango_font_description_to_stringjoinr   digesthashreencodereplacenamepango_font_get_metricspango_font_metrics_get_ascentr   ascentpango_font_metrics_get_descentdescentnewhb_face_get_table_tagstablesrangehb_tag_to_stringappendbitmaphb_tag_from_stringhb_face_reference_tablehb_blob_get_lengthhb_blob_destroyitalic_anglehb_face_get_upemupemhb_ot_color_has_pngpnghb_ot_color_has_svgsvgstemvstemhwidthscmapused_in_formsflags)self
pango_fontdescriptionrF   rL   partr   stretchdescription_stringrc   pango_metricstable_count
table_tags
table_nameitagblobr#   s                    @r$   __init__zFont.__init__   s   33J?-j9.t||<//=
";;KH
jj!H!H!UV@@M
!  JJz299;AA#FH 

3"E$**S/!*<$==HDO __((2262-DK33KHAA+NDK??v&22U557__  (22U668__((00E=%++-5778:G 44['J ZZ22;?A GG L%u=DDFrJL L	
 xx"45a8499++--4t||D$7OO	 >>!88SXXNM33MBZO!%&'DK "44]CjP!%&' 'DL *+*DK$, gg.4WW_-
WWY'
''ajQ{1~& 	@A%%jmZ@KKszz*5<<>?	@ T[[ Vt{{%:$11'2>77cJ..t49"&DK((."--dll;	//=//=

	" "
::JJ,&Jtzz$''JJ,&J (YHs   7Yc                    | j                  ||       d| j                  v rt        j                  | j                        }t        || j                        }d| j                  vr| j                  | j                  d<   d| j                  vr| j                  | j                  d<   d| j                  vrmd}| j                  dk(  rM|d   j                  D ];  }|j                  dk(  s|j                  dk(  r|j                  }n|j                  } n || j                  d<   d| j                  vr%t        | j                  d	k(        | j                  d<   t        j                         }	 t!        || j                        }|d
   j"                  j%                         D ]"  \  }\  }	}
|	dk  sd|
f|d
   j"                  |<   $ |j'                  |       |j)                         | _        | j0                  s| j2                  rtt        j                  | j                        }t        || j                        }	 d| j                  vsd| j                  vr t5        j6                  d             |d<    t5        j6                  d             |d<   |j9                         |d   _        |d   j:                  D ci c]&  }|t5        j<                  d      j?                         ( c}|d   _         n=|d   j@                  D ]+  }t5        j<                  d      j?                         |d   |<   - dD ]
  }||v s||=  t        j                         }|j'                  |       |j)                         | _        yy# t*        $ r t-        j.                  d       Y w xY wc c}w # tB        $ r t-        j.                  d       Y yw xY w)zRemove useless data from font.fvar
fontNumberwghtopszr   r   r   r   r   hmtxzUnable to mutate variable fontlocar;   )CBDTCBLCzSVG zUnable to save emoji fontN)"r   rk   ioBytesIOrC   r   rE   rL   r   rF   rH   axesaxisTagmaxValueminValueintr
   metricsrZ   savegetvalue	Exceptionr   warningrx   rz   r	   getTableClassgetGlyphOrder
glyphOrdergetTableModuleGlyphglyphsr   )r   r~   hinting	full_fontttfontr   axepartial_fontr'   advancebearingrc   glyphr   output_fonts                  r$   cleanz
Font.cleanq   sP    	D'" T[[ 

4#4#45II$**=FT__,*.++'T__,*...'T__,::?%f~22 ";;&0"||q0'*||'*||!" +/'T__,*-djjAo*>'::<L	<0I/5f~/E/E/K/K/M C+C+'7{78'lv..s3C L) %1$9$9$;! 88txx

4#4#45II$**=F<,dkk0I%AV%9%9&%A%CF6N%AV%9%9&%A%CF6N060D0D0FF6N- %+6N$=$=-?  f33F;AACC-?F6N) "(!6!6 V060E0Ef0M0S0S0Uvu-V": /J!V+":./ !jjlK($/$8$8$:!)    A?@A-?  <:;<sE   )AM5 +'M5 7A?N 6+N!AN 4?N 5NNN O ?O c                 .    | j                   d d dk(  rdS dS )Nr>   s   OTTOotfttf)rC   )r   s    r$   typez	Font.type   s!    ))"1-8uCeCr&   c                     |syt         r*t        j                  ddd      r| j                  ||       y| j	                  ||       y)z*Remove unused glyphs and tables from font.Nr>   r   r   )r   r   hb_version_atleast_harfbuzz_subset_fonttools_subset)r   r~   r   s      r$   r   zFont.subset   s<    x::1aC!!$0""41r&   c                    t        j                  t        j                         t        j                        }t        j
                  |      }t        j                  dt        |       dt        |            }t        j                  ||t        |             t        j                  t        j                  z  t        j                  z  }t        j                  ||       t        j                  |t        j                         }t#        d dD              }t        j                  dt        |       d|      }	t        j                  ||	t        |             t        j                  t        j$                  | j&                  |      t        j(                        }
t        j
                  |      }t#        t+        t-        |      dz               }t        j                  dt        |       d|      }t        j                  ||t        |             t        j                  t        j                  z  }|s|t        j.                  z  }t        j                  ||       t        j                  t        j$                  |
|      t        j(                        }
|
rt1        |
      }|r|| _        yt5        j6                  d       y)zSubset font using Harfbuzz.zhb_codepoint_t[]c              3   H   K   | ]  }t        j                  |d         yw)r<   N)r   rp   )r.   rc   s     r$   r0   z(Font._harfbuzz_subset.<locals>.<genexpr>   s!      (dH77bA (s    ")s   BASEs   DSIGs   EBDTs   EBLCs   EBSCs   GPOSs   GSUBs   JSTFs   LTSHs   PCLTs   SVG r   Nz#Unable to subset font with Harfbuzz)r   gcr   hb_subset_input_create_or_failhb_subset_input_destroyhb_subset_input_glyph_setri   lensortedr   hb_set_add_sorted_arrayHB_SUBSET_FLAGS_RETAIN_GIDS(HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZEDHB_SUBSET_FLAGS_DESUBROUTINIZEhb_subset_input_set_flagshb_subset_input_setHB_SUBSET_SETS_DROP_TABLE_TAGtuplehb_subset_or_failrB   hb_face_destroyrl   maxHB_SUBSET_FLAGS_NO_HINTINGr   rC   r   r   )r   r~   r   	hb_subsetgid_set	gid_arrayr   drop_setdrop_tablesdrop_tables_arrayrB   keeprC   s                r$   r   zFont._harfbuzz_subset   s>   FF::<335	
 ";;IFGGoc$i[:F4LI	(()SYG 77DDE::; 	 	11)UC #66DDF ( O' ( (  GGoc+6F5Gq$I;W((3Dc+FVW &&--dllIF$$&
 ";;IFU3t9q=)*GGoc$i[:DA	(()SYG DD::; 	 _???E11)UC &&--gyA$$&
 -g6L$0!<=r&   c                    t        j                  | j                        }t        j                  ddd|d      }|xj
                  g dz  c_        t        j                  |      }|j                  |       	 t        || j                        }t        dt              5 }|j                  |       ddd       D ]1  }t        j                  d	| j                  j                         |       3 	 t        j                         }	|j!                  |	       |	j#                         | _        y# 1 sw Y   {xY w# t$        $ r t        j                  d
       Y yw xY w)zSubset font using Fonttools.T)retain_gidspassthrough_tablesignore_missing_glyphsr   desubroutinize)GSUBGPOSSVG)gidsr   	fontTools)levelNz*fontTools warning when subsetting "%s": %sz$Unable to subset font with fontTools)r   r   rC   r   Optionsr   	Subsetterpopulater   rE   r   r   r   r   rK   rO   r   r   r   )
r   r~   r   r   options	subsetterr   logslogoptimized_fonts
             r$   r   zFont._fonttools_subset   s$   JJt001	 ..TD2 	66$$W-	%	:I$**=Fk9 )T  () /@KK&&(#//  ZZ\NKK' . 7 7 9D) )  	CNNAB	Cs*   9(D9 !D-3>D9 -D62D9 9EEN)
__name__
__module____qualname__r   r   propertyr   r   r   r    r&   r$   r   r      s5    Z'x><@ D D	2:>x:r&   r   c                    t        j                         }i }|j                         D ]-  }|j                  |j                  g       j                  |       / i }|j                         D ]  \  }	}
|
d   }|j                  ri }|r#|j                  s|
D ]  }i ||j                  } |j                  ||d          |j                  dk(  rt        j                  ddi      }n*t        j                  dt        |j                        i      }t        j                  |j                  g||      }| j                  |       |j                   ||	<    |j                         D ]  }|r%|j                  s|j"                  }|j                  }nt%        j&                  |j                        }t)        ||j*                        }i i }}t-        |j/                         j                               D ]$  \  }}|j0                  d	z  |j2                  z  ||<   & |j5                         j                         D ])  \  }}|j7                  |      }||vst9        |      ||<   + t        j                  g d
|      }t        |      }t;        |j                               }t=        t?        |dz              D ]  }tA        d||dz  z
        }|jB                  j                  | djE                                ||dz  |dz   dz   D ]N  \  }}djG                  d |D              }|jB                  j                  d|dd| djE                                P |jB                  j                  d        |jB                  jI                  g d       | j                  |       t        j                  dd|j                  rdnd |jJ                  |j                   d      }|j                  rtM        || ||||       n!tO        || |||||j                     |d          | j                  |       |j                   ||j                  <    |S )zBuild PDF dictionary for fonts.r   r   r   Subtype	/OpenTypeLength1compressr   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              3   \   K   | ]$  }|j                  d       j                           & yw)z	utf-16-beN)ra   hexr-   s     r$   r0   z)build_fonts_dictionary.<locals>.<genexpr>[  s/      -N>Dv}}[155789-Ns   *,<04xz> <>s	   endbfchar)s   endcmaps-   CMapName currentdict /CMap defineresource pop   endr   /Fontz/Type   )Typer   BaseFont	ToUnicodepdf_version)(pydyf
Dictionaryvalues
setdefaultr_   rn   rZ   ro   r   r~   r   r   r   rC   Stream
add_object	referencer}   r   r   r   rE   	enumerategetGlyphSetr#   rv   getBestCmap
getGlyphIDr,   r   rl   r   rY   streamra   r]   extendrc   _build_bitmap_font_dictionary_build_vector_font_dictionary)pdffontsr   r   r   	pdf_fontsfonts_by_file_hashfontfont_references_by_file_hash	file_hash
file_fontsr~   	file_font
font_extrafont_streamfont_widthsr   r   r   r   r/   r'   
to_unicodecmap_length
cmap_itemsbatch_lengthtextunicode_codepointsfont_dictionarys                                r$   build_fonts_dictionaryr%    s/     "I B%%dii4;;DAB#% !3!9!9!; H	:!};; $,,' 2	1$1)..12

4+, 99))9k*BCJ))9c$:K:K6L*MNJllD$5$5#6
XV{#2=2G2G$Y/)H,  ?9$,,++K99D 

4#4#45II$**=F "BK%f&8&8&:&A&A&CD @5!&t!3dii!?A@%11399; .))#.$"%f+DK.
 \\ #" -56
 $i4::<(
tK#-./ 	3AsK!c'$9:L$$~\%B%I%I%KL)!C%1c	: Ft%'WW -NHL-N &N"!!((c{#&8%9;BBDFF
 $$\2	3 	   " 	
 	z"**DKKqQ78		#--	,
  ;;)dK6K *dK,TYY79OQ 	'.88	$))?9B r&   c                   789 t        j                  g d      | d<   t        j                  g d      | d<   |rt        t        |j                              }nt        t        d            }|d   |d   }}g }	t        |      D ].  }
|
dz
  |vr|	j                  |
       |	j                  d	|
        0 || d
<   || d<   t        j                  dt        j                  |	      d      | d<   t        j                  i       }t        j                  |j                        }t        ||j                        }|d   j                  d   }dg||z
  dz   z  }i }|j                         D ]D  \  }}
|
j                         }|j!                  |      }|dk(  r|
j"                  }|d   j$                  d   j&                  }|D ]  }|j(                  }|j*                  }||cxk  r|k  s'n *|j,                  j.                  }|j,                  j0                  x}9|j,                  j2                  }|j,                  j4                  } n t7        j8                  d|        |dv rdnd}|
j"                  |d  }|
j"                  dd \  }9t:        j=                  |
j"                  dd dd      }t:        j=                  |
j"                  dd dd      }|
j"                  d   }||z
  }||v r||||z
  <   t?        9dz        }9||||d d dx}||<   d9|fv s|sd|d<   |dv r||d<   |d v rd9dz  z
  dz  8tA        t;        |jC                         d!            dd  77jE                  dtG        |      z        7d"jI                  789fd#t        |      D              } t;        | d      jK                  ||z  d      |d<   \|d$v rg x}!|d%<   |d&k(  rdnd}"t:        j=                  ||"|"dz    d      }#t        |#      D ]  }$|"dz   |$dz  z   }%t:        j=                  ||%|%dz    d      }&t:        j=                  ||%dz   |%dz    dd      }'t:        j=                  ||%dz   |%dz    dd      }(|!j                  |&|'|(d'        t7        j8                  d(|        tM        ||z        |d<   G |j                         D ]  \  }}||vr|d)   }|d*   9|d+   }|d,   }'|d-   }(|d   <||z  })t:        j=                  tM        |)      d      }*|d%   D ]  }+|+d,   },|+d-   }-|+d.   }.|.|vrt7        j8                  d/|.        /||.   }+|+d   t7        j8                  d0|.        Rt        |+d+         D ]  }/tO        |/|+d)   z  |/dz   |+d)   z        }0|+d   |0   }1t:        j=                  |1d      }2|dz  ||-z
  |/z
  dz
  z  }3||+d)   z
  }4|4dkD  r	|2|4dz  z  }2n|4dk  r	|2|4 dz  z  }2|,dkD  r|2|,z  }2n|,dk  r|2|, z  }2|2d|dz  z  z  }2|2|3z  }2|*|2z  }*  |*jK                  |)d      }5n|d   }5t        jP                  d19 d2| d3|' d3|( d4jS                         d5d6d79d8|d9d:d;|5d<g|=      }6|jU                  |6       |6jV                  ||<    |jU                  |       t        j                  |      | d><   |jV                  | d?<   y )@N)r   r   r   r   FontBBox)r   r   r   r   r   r   
FontMatrix   r   r<   r   /	FirstCharLastCharz	/Encoding)r   DifferencesEncodingr   r9      r:   z"Unknown bitmap metrics for glyph: )r   r      r0  r   r   bigT)signedr>   )r#   heightxystridero   	subglyphsr&   ro   )r   r2   )r   r/        r(   c              3   F   K   | ]  }|z  |d z   z   dz  z     yw)r   0Nr   )r.   r   bitspaddingr#   s     r$   r0   z0_build_bitmap_font_dictionary.<locals>.<genexpr>  s5      "( QYA/'C-?"(s   !)r0  	   r7  r>  )idr4  r5  z!Unsupported bitmap glyph format: r6  r#   r3  r4  r5  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   Widths	CharProcs),r  Arrayr   r   r~   rl   rn   r  r   r   rC   r   rE   
strikeDatarZ   	getFormatr  datastrikesindexSubTablesfirstGlyphIndexlastGlyphIndexr   r3  r#   horiBearingXhoriBearingYr   r   r   
from_bytesr   binr   zfillr   r]   to_bytesbytesslicer  ra   r  r	  ):r$  r  r  r}   r   r   charsfirstlastdifferencesr   
char_procsr   r   font_glyphsglyphs_infor'   glyph_formatglyph_idrF  	subtablessubtablefirst_index
last_indexr3  r   	bearing_x	bearing_y
data_start
position_yr6  
glyph_infobitmap_bitsr7  r   number_of_componentsjrE   subglyph_idr4  r5  length
bitmap_intsubglyphsub_xsub_ysub_idrow_y	row_slicerowrow_intshiftstride_differencero   bitmap_streamr<  r=  r#   s:                                                          @@@r$   r  r  z  s   "'++l";OJ$)KK0B$COL!fTYY'(eCj!(E"I4EK (19F"u%Qug;'( $)OK "&OJ"'"2"2{{;/4 #OJ !!"%J

4,,-II$**5F.++A.KSD5L1$%FK!'') B:
U($$S) 1::Dv..q1@@I% &66%44
(8j8%--44F&.&6&6&<&<<Ge ( 0 0 = =I ( 0 0 = =I !CH:NO*i7QJ::jk*D!JJqOMFEuzz!AdKIuzz!AdKIjjmG'
u'.F8e#$eai.
 	

[* t#&Jx V##'Jx Y&EAI!+Gs488:r*+AB/D::a#d)m,D'' "(v"( (K $'{A#6#?#?QV#WJx V#244I
;/!Q&AA#&>>$q1+u#E /0 FQ1q5)!nnT%a-@%HNN4aa#8%NMNN4aa#8%NM  !!!DEF NN>|nMN#(&#9Jx EB:H !, 1 1 3 <7*5  H%7#H%sOsOh'f_Ffu=J&{3 *  !$,NN%7x#@A&v.H%-NN%Gx#PQ"8H#56 *E % 22hx&88!:I #8,Y7C!nnS%8G"QJ&5.5*@1*DEE(.(1C(C%(1,$5$99*Q.%6$6$::qyE)UF*qFQJ.G%G')J%**>  ((7F)FgU6(!A3as#.5575665
&
 
 	}%,66
8y<7| NN: %F 3OH#-#7#7OK r&   c                 v   d|j                   dk(  rdnd }|rt        |j                               nd}d|j                  ||j                  f}	|j
                  }
t        |      dkD  r4t        t        |j                  j                                     dk(  r|
dz  }
t        j                  ddd	|j                  d
t        j                  |j                        d|
dt        j                  |	      d|j                  d|j                  d|j                  d|	d   d|j                   d|j"                  ||i      }t%        |      dk  rt'        |j                        }t)        |d   dz   dz        }dg|z  dz  }|D ]  }d||<   	 t        j*                  t-        dj/                  |      d      j1                  |d      f|      }|j3                  |       |j4                  |d<   |j                   dk(  rd|d<   |j3                  |       t        j                         }t'        |      D ]S  }|dz
  |vr6|j7                  |       t        j                         }|j7                  |       j7                  ||          U t        j                  dd|j                   dk(  rdnd |j                  t        j                  t        j                  d       t        j                  d!      dd"      d#||j4                  d$      }|j3                  |       d%| d&<   t        j                  |j4                  g      | d'<   y )(NFontFiler   r   r   r   r   r   z/FontDescriptorFontName
FontFamilyFlagsr'  ItalicAngleAscentDescent	CapHeightStemVStemHz1.4r<   r0  r;  1r(   r1  r   CIDSetr   r   r   z/CIDFontTypeAdobeIdentity)RegistryOrdering
Supplementz	/Identity)r   r   r   CIDSystemInfoCIDToGIDMapWFontDescriptorz/Identity-Hr.  DescendantFonts)r   r   r  rh   rf   r   r   setr}   r  r  rc   StringrK   rC  rt   r{   r|   strr   r   r  r   r]   rP  r  r	  rn   )r$  r  r  r}   r   r	  r  	font_filemax_xbboxr   font_descriptorcidspadded_widthr<  cidr  
pdf_widthsr   current_widthssubfont_dictionarys                        r$   r  r    s   		U 21:;I$*C Et||UDKK0DJJE
6{Q3s4;;#5#5#789Q>&&!DIIell4;;/EKK%t(($++4<<T!W9( O ;5 dkk"T"X\Q./u|#a' 	CDI	"++L%@B 	v$*$4$4!yyE%0	"NN?#JF^ )q5a "[[]Nn-fQi() ))!tyyE'9!q!ABII))W-Z0+
 
 #)33+  NN%&"/OJ).6H6R6R5S)TO%&r&   )$__doc__r   r`   hashlibr   loggingr   mathr   r  r   r   fontTools.ttLibr   r   r	   fontTools.varLib.mutatorr
   loggerr   r   text.constantsr   text.ffir   r   r   r   r   
text.fontsr   r   r   r%  r  r  r   r&   r$   <module>r     sV     	 	      6 6 < ) 2 H H CB: B:J^B^8B<Ur&   