HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/weasyprint/__pycache__/draw.cpython-310.pyc
o

&weT��@s�dZddlZddlZddlmZmZddlmZddlm	Z	m
Z
mZmZm
Z
ddlmZddlmZdd	lmZdd
lmZmZddlmZddlmZdd
lmZddlmZddlm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&dZ'ej(dd��Z)dd�Z*dd�Z+dd�Z,dd�Z-dd�Z.dd�Z/d d!�Z0dHd$d%�Z1d&d'�Z2d(d)�Z3d*d+�Z4	dId,d-�Z5d.d/�Z6d0d1�Z7dJd2d3�Z8d4d5�Z9d6d7�Z:d8d9�Z;d:d;�Z<	<	=dKd>d?�Z=d@dA�Z>dBdC�Z?dDdE�Z@dFdG�ZAdS)Lz@Take an "after layout" box tree and draw it onto a pydyf stream.�N)�
hsv_to_rgb�
rgb_to_hsv)�BytesIO)�ceil�floor�pi�sqrt�tan)�ElementTree)�Image�)�boxes)�RasterImage�SVGImage)�replaced)�BackgroundLayer)�Matrix)�StackingContext)�ffi�harfbuzz�pango�units_from_double�units_to_double)�get_last_word_end)�top�right�bottom�leftccs*�|��z
dVW|��dS|��w)zDSave and restore stream context when used with the ``with`` keyword.N)�
push_state�	pop_state)�stream�r!�H/home/arjun/projects/env/lib/python3.10/site-packages/weasyprint/draw.py�stackeds
�r#cCs||}|dkr
|S|dS)N�currentColor�colorr!)�style�key�valuer!r!r"�	get_color"sr)cCs<t|j|j|j�\}}}|d}|d}t|||�|jfS)zReturn a darker color.��?��?�r�red�green�bluer�alpha�r%�hue�
saturationr(r!r!r"�darken'sr4cCsPt|j|j|j�\}}}dd|d}|rdd|d}t|||�|jfS)zReturn a lighter color.rr*r+r,r1r!r!r"�lighten/s
r5cCsT|jd}t�|�}t||jjd|j|d�t||jdd�t||�t	||�dS)zDraw the given PageBox.�marksF)�clip_box�bleedr6)r7N)
r&r�	from_page�draw_background�box�
backgroundr8�canvas_background�draw_border�draw_stacking_context)�pager r6�stacking_contextr!r!r"�	draw_page8s


�
rBcCs4t|tj�r
t||�dSt||j�t||�dS�N)�
isinstancer
�TableBox�
draw_tabler:r<r>)r r@r;r!r!r"�draw_box_background_and_borderDsrGc	Cs~t|����|j}|j|dd�|jr+|jjddkr+t||j���|��|�	�|�
�ru|jdru|jd\}}}}|dkrCd}|dkrId}|dkrQ|��}|dkrY|��}|�
|��||��|||||�|��|�	�|jdd	kr�|}|j|j�}|jr�|jjr�|j|jj�n
|��	Wd
�d
St|tjtjtjtjtjf�r�t||j|�t|���|jddkr�t|tj�s�t||���|��|�	�|j D]}t!||�q�|j"D]	}	t||j|	�q�|j#D]}t!||�q�t|tj$��rt%||j|�|g|j&D]G}	t|	tj'��r#t(||	�t)||	��q|	j*�rT|	|k�r3|j|	dd�t|	j*dtj+��rK|	j*D]
}
t%||j|
��q@|	|k�rT|���q|j,D]}t!||��qY|j-D]}t!||��qeWd
�n	1�sywYt.||�|jdd	k�r�|j/}|}|�0�|j1|jdddd�|�2|�|�3�|��Wd
�d
S1�s�wYd
S)
z*Draw a ``stacking_context`` on ``stream``.T)�mcid�overflow�visible�clip�autor�opacityrN���)�stroke�fill)4r#r;�begin_marked_content�is_for_root_elementr@r&�rounded_box_path�rounded_padding_boxrK�end�is_absolutely_positioned�
border_height�border_width�	rectangle�border_box_x�border_box_y�	add_group�page_rectangle�transformation_matrix�determinant�	transform�values�end_marked_contentrDr
�BlockBox�	MarginBox�InlineBlockBox�TableCellBox�FlexContainerBoxrG�PageBox�negative_z_contextsr?�block_level_boxes�float_contexts�	InlineBox�draw_inline_level�blocks_and_cells�ReplacedBoxr>�draw_replacedbox�children�LineBox�zero_z_contexts�positive_z_contexts�
draw_outlines�idr�	set_alpha�
draw_x_objectr)r rAr;rrrr�original_stream�
child_context�block�child�group_idr!r!r"r?Ls�
���+�
�

�



�
�

��
4

$�r?c
Cs�|\}}}}}}}}	tdd�||||	fD��r!|�||||�dSd}
|�||d|�|�|||d|�|�|||d|
|||||d|
||||d�|�|||||d�|�|||||d|
|||d|
|||||d||�|�||	d||�|�||	d|
||||||	d|
||||	d�|�|||d�|�|||d|
||d|
|||d|�dS)z�Draw the path of the border radius box.

    ``widths`` is a tuple of the inner widths (top, right, bottom, left) from
    the border box. Radii are adjusted from these values. Default is (0, 0, 0,
    0).

    css�|]}d|vVqdS�rNr!)�.0�cornerr!r!r"�	<genexpr>���z#rounded_box_path.<locals>.<genexpr>Ng�������?rr)�allrY�move_to�line_to�curve_to)r �radii�x�y�w�h�tl�tr�br�bl�rr!r!r"rS�s.8�>�8�,�rSTr!c
Cs|durdSt|���l|r$|jdjD]}t||�q|��|��|jjdkrkt|��5|j|jdd��|�	|jj�|jdj
}|j|�|��|��|j|�|��Wd�n1sfwY|�r_|�r_|jdj
\}}}	}
dd�|�
�D�}d|
�d|	�d	�}d
|v�r3|d�gd�|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�|d��d�|
��d�|d��d�|d
��d�|	��d��7}d|v�r%|d�gd�|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,�|d��d�|
��d-�|d��d&�|d��d.�|d��d/�|d��d0�|
��d1�|d��d2�|	��d3�|d��d�|
��d'�|d��d&�|d��d.�|d��d4�|d��d2�|	��d5�|
��d6��7}|d77}t�|�}
t|
dd|�}|	|
f}||f}d8}d9}||}dd|	|
f}g}t||||||||�}|j�d|�t|j�D]
}t|||j��qdWd�dS1�s{wYdS):z�Draw the background color and image to a ``document.Stream``.

    If ``clip_box`` is set to ``False``, the background is not clipped to the
    border box of the background, but only to the painting area.

    NrNr�cSsi|]	\}}||d�qS)��?r!)rr'r(r!r!r"�
<dictcomp>sz#draw_background.<locals>.<dictcomp>z
              <svg height="z	" width="z�"
                   fill="transparent" stroke="black" stroke-width="1"
                   xmlns="http://www.w3.org/2000/svg">
            �crop�z
                  <path d="M0,rz hrz#" />
                  <path d="M0,rz/"
                        transform="translate(z2,0) scale(-1,1)" />
                  <path d="M0,r�,z1) scale(-1,-1)" />
                  <path d="M0,z1"
                        transform="translate(0,z.) scale(1,-1)" />
                  <path d="Mz,0 vz!" />
                  <path d="Mz/) scale(-1,-1)" />
                  <path d="Mz$,0) scale(-1,1)" />
                �crossz
                  <circle r="z7" transform="scale(0.5)
                     translate(zI) scale(0.5)" />
                  <path transform="scale(0.5) translate(z,0)" d="
                    M-z
                    M0,0 vz"" />
                  <circle r="z." transform="
                    translate(0,z+) scale(0.5)
                    translate(z,-z.) scale(0.5)" />
                  <path d="M-z
                    hz M0,0 v-z) scale(0.5) translate(z%,0)" />
                  <circle r="z6" transform="scale(0.5)
                    translate(z-) scale(0.5)" />
                  <path d="Mz
                    vz M0,0 hz8"
                    transform="scale(0.5) translate(0,z#)" />
                  <circle r="z," transform="
                    translate(z.,0) scale(0.5)
                    translate(-z M0,0 h-z,0) scale(0.5) translate(0,z)" />
                z</svg>)�	no-repeatr�T)r#�layers�
clipped_boxesrSrKrUr%r0�
set_color_rgbrw�
painting_arearYrP�items�joinr
�
fromstringrr�insert�reversed�draw_background_image�image_rendering)r �bgr7r8r6r;r�r�r��width�height�
half_bleed�svg�tree�image�size�position�repeat�	unbounded�positioning_arear��layerr!r!r"r:�sT



�
��
��������������	�	�
�
����
�
��
������������	�	�
�
����
�
����������������
��$�r:c	Cs�|jdus
d|jvrdS|j\}}}}|j\}}}	}
|j\}}|j\}
}|j\}}|
dkr5t|d|�}n$|
dvr<|}n|
dksBJ�t|	|�}|dkrW|	||d}d}n|	}|dkret|d|�}n$|dvrl|}n|dksrJ�t|
|�}|dkr�|
||d}d}n|
}t||||d�}||j	}|�
dd|||||�}|�dd||�}t|��F|j�
||||�|�|j�|�d�|�|j�|jr�|j\}}}}|�||||||�n|�||||�|��Wd�dS1s�wYdS)	Nrr��)r��round�spacer��e�f�Pattern)r�r�r�r�r�r��maxrr�ctm�add_patternr\r#�drawrxrv�color_space�set_color_specialr�r]rYrP)r r�r��
painting_x�
painting_y�painting_width�painting_height�
positioning_x�
positioning_y�positioning_width�positioning_height�
position_x�
position_y�repeat_x�repeat_y�image_width�image_height�repeat_width�	n_repeats�
repeat_height�matrix�pattern�group�x1�y1�x2�y2r!r!r"r�Esb
�
�


�
�

�
"�r�cCsh|dvr|dv|dkA}|rt|�St|�S|dvr2|dv|dkAr*t|�t|�fSt|�t|�fS|S)N)�inset�outset)rrr���ridge�groover�)r5r4)r&r%�side�
do_lightenr!r!r"�styled_color�sr�c	sr�fdd�����fdd�}�jddkr|�dS�fdd	�tD�}td
d�|D��r1|�dS�fdd	�tD����fd
d	�tt�D�}t|�td�td�fvrjtt���dkrjt��|d�d�|�dStt|�|�D]B\}}}}|dks}|s~qqt���)t	�|||��
�dd�|��
�dd��t��|t|||��Wd�n1s�wYqq|�dS)z-Draw the box border to a ``document.Stream``.c3s:�d}�jD]}|jddkrd}q|rd}q|VqdS)z1Yield columns that have a rule drawn on the left.T�column_spanr�FN)rqr&)�	skip_nextr|�r;r!r"�get_columns_with_rule�s�
�z*draw_border.<locals>.get_columns_with_rulecst�tj�o�jddkp�jddk}|r}�jdrddd�jdf}��D]Y}t���G|j�jd�jdd}||j�jd|jf}t��jd�jdd	||�t	�||�jdt
�jdt�jd
�d	��Wd�n1swwYq'dSdSdS)zDraw column borders.�column_widthrL�column_count�column_rule_widthr�
column_gapr��column_rule_styler�column_rule_colorN)rDr
�BlockContainerBoxr&r#r�r�r��clip_border_segment�draw_rect_borderr�r))�columns�
border_widthsr|r��
border_box)r;r�r r!r"�draw_column_border�sB�

���
�
�����z'draw_border.<locals>.draw_column_border�
visibilityrJNcsg|]}t�d|�d���qS)�border_�_width)�getattr�rr�r�r!r"�
<listcomp>�szdraw_border.<locals>.<listcomp>css�|]}|dkVqdSr~r!)rr�r!r!r"r��r�zdraw_border.<locals>.<genexpr>cs g|]}t�jd|�d���qS)r��_color)r)r&r�r�r!r"r��s cs,g|]\}}�|jo�jd|�d��qS)r��_style)r0r&)r�ir�)r;�colorsr!r"r��s��)�solid)�doublerr�)r&�SIDESr��	enumerate�set�len�draw_rounded_border�zipr#r��rounded_border_boxr�)	r r;r��widths�stylesr�r�r%r&r!)r;r�r�r r"r>�s@�
����
r>c3	s|\}}}	}
|p	d\\}}\}
}\}}\}}|pd|f\}}}}dd�}dd�}�dkrN|||||�\\}}}||
|||�\\}}}|}d}d�|�nz�d	kry||
|||�\\}}}|||||�\\}}}|}d}d
�||	�nO�dkr�|||||�\\}}}|||||�\\}}}|}d}d
�||
�n$�dkr�|||||�\\}}}|||||�\\}}}|}d}d�|��dv�r||d
|||d
} }!||d
|||d
}"}#|	||}$|	}%��||	����|����||�|���||	|�|�nR�dv�rk|||d
||d
} }!|||d
||d
}"}#|
||}$|
}%���||
����|����|||����|||
|�|dv�r�|dk�rw|nd
|�|�s�|�r~|| |!�}&||"|#�}'|$|&|'}%t|%��}(|�r�|�r�|%|(|(d
�n
|%|(|(d
d�tt|&�d
���})tt|'�d
���}*tt|$���}+�����fdd�},|,|)|+||||||&�\}+}-|,|*|+|||	||
|||'�d}+|$dk�r}td|+d
�D]x}.|.|-7}.�dv�r=t|||.�||�}/t|||.d�||	|�}0�|dk�r5|nd}1|1|}2n2�dv�rot|||.�||�}1t|||.d�||
|�}2�|dk�rh|nd}/|/|}0��	|/|1|0|/|2|1��qn��j
dd����|%t|%��t|%��dd
�p�d�tdtt|%���d
�D]U}.�dk�r���	||.�|�|��q��d	k�rՈ�	||	|||.�|���q��dk�r��	||.�||
|�|��q��dk�r���	|||.�|���q��j
dd����dS)z�Clip one segment of box border.

    The strategy is to remove the zones not needed because of the style or the
    side before painting.

    )�rrrrrr�cSs8t|�t|�krt|�t|�kr||fdfS||fdfS)aGet the point use for border transition.

        The extra boolean returned is ``True`` if the point is in the padding
        box (ie. the padding box is rounded).

        This point is not specified. We must be sure to be inside the rounded
        padding box, and in the zone defined in the "transition zone" allowed
        by the specification. We chose the corner of the transition zone. It's
        easy to get and gives quite good results, but it seems to be different
        from what other browsers do.

        TF)�abs)r�r�r�r�r!r!r"�transition_point�s*�
�z-clip_border_segment.<locals>.transition_pointc	SsH||||}td||dd|ddtdd|d�S)a7Return the length of the half of one ellipsis corner.

        Inspired by [Ramanujan, S., "Modular Equations and Approximations to
        pi" Quart. J. Pure. Appl. Math., vol. 45 (1913-1914), pp. 350-372],
        wonderfully explained by Dr Rob.

        https://mathforum.org/dr.math/faq/formulas/

        �rr�r��
r�)rr)�a�br�r!r!r"�corner_half_lengths
&�z/clip_border_segment.<locals>.corner_half_lengthrrrr�rrNr�r�rr�rr)�dotted�dashedrr�cs�|s|ddfStd|d�D]�}|d7}d�|||�|dt}	|dkr,tntd�||d|�|dt�td�}
�dvrz��||�|���||||dt|
�����||||dt|	���n.�dvr����|||����||||t|
�����||||t|	��|
�tdkr�|	|
d�||d|�|dt|	}|d7}||fSqd�td|
|
|	}||fS)Nrrr�r�r�r
r)�ranger�minr�r�r�r	)�dashes�line�wayr�r��px�py�chlr��angle1�angle2�offset��angle�dash�main_offsetr�r r!r"�	draw_dotsVsf�����
����������z&clip_border_segment.<locals>.draw_dotsr���ư>T��even_oddN)r�r�r��intrrrr�rrYrKrU)3r r&r�r�r�r�r��bbx�bby�bbw�bbh�tlh�tlv�trh�trv�brh�brv�blh�blv�btr��bbr�rr�px1�py1�rounded1�px2�py2�rounded2r�a1�b1�a2�b2�line_length�length�chl1�chl2�dash_length�dashes1�dashes2rr rr�r�r�r�r�r!rr"r��s� 


 
 "


#���

"

"���

�
�
�r�cCs$|dvrX|j|ddd��|�|dd�t||���t||�d��|jdd�|j|ddd��|�|dd�t||�d��t||���|jdd�dS|j|dd��|�|d�t||���|dkr�t||�d	��t||�d
��t||���|jdd�dS)Nr�rr�r�Tr"rr�gUUUUUU�?gUUUUUU�?)r�rwrSrT�rounded_box_ratiorPr)r r;r&r%r!r!r"r�s(rc
Cs|\}}}}|\}	}
}}|dvr�|j|ddd��|�|dd�|j|�|�||d||	d|||
d||	|d�|jdd�|�||d||	d|||
d||	|d�|�||||	|||
||	|�|j|ddd��|�|dd�|jdd�dS|j|dd��|�|d�|j|�|dkr�|�||d||	d|||
d||	|d�|�||dd||	dd|||
dd||	|dd�|�||||	|||
||	|�|jdd�dS)	Nr�rr�r�Tr"rr�)r�rwrYrP)
r r;rr&r%r%r&r'r(r1r�r2r�r!r!r"r��sD
��(
�$�(r�c	
Csd||ks
||ks
J�t|���|j|dd�ddi�|j|ddd�|dkr3|�d|g|�n|dkr>|�|g|�|dkr�|�|d�||krv|�||d|�|�||d|�|�||d|�|�||d|�n�||kr�|�|||d�|�|||d�|�|||d�|�|||d�nx|d	k�r
||ks�J�d
}	d|}
|�||d|
||d
|
�|��|�	�||}|�||�||k�r	|�
||
d||	|
|d|
d||	|
|d|
|�|d|
7}|	d9}	||ks�n|�|�|�||�|�||�|��Wd�dS1�s+wYdS)Nr�rOT)rOr�rr��wavyrg�?r�r�rN)r#r�rw�set_dash�set_line_widthr�r�rYrKrUr�rO)r r�r�r�r��	thicknessr&r%r�up�radiusr�r!r!r"�	draw_line�sZ�
 
���

$�rLcCs|jd}t|jd�}|jd}|jddkrf|rf|jrf|��||��||��d||��d|f}tD]-}t|��t	|||||�t
||d|f|t|||��Wd�n1s`wYq8t|t
j�r}|jD]}t|t
j�r|t||�qodSdS)N�
outline_width�
outline_color�
outline_styler�rJr�r�)r&r)r0rZr[rXrWr�r#r�r�r�rDr
�	ParentBoxrq�Boxru)r r;r�r%r&�outline_boxr�r|r!r!r"ru
s.

�

���

��rucCst||j�|jD]}t||j�|jD]}t||j�qq	|jD]1}t||j�|jD]%}t||j�|jD]}|jddksJ|jddksJ|jsPt||j�q7q,q!|jddkr_t||�St||�|jD]}|jD]}|jD]}|jddks}|js�t||�qqqlqgdS)N�border_collapse�collapse�empty_cells�show)r:r<�
column_groupsrqr&�empty�draw_collapsed_bordersr>)r �table�column_group�column�	row_group�row�cellr!r!r"rFs>

�


����	





����rFcsndd��jD�}�j}|r|sdSdd��jD��
t�j��t|��t|���t��ks.J��jddkrA���d|d�n��d�d|d��
��
d|d��j\�
��jdj	rlt�jdj��nd��jdj
r}t�jdj��nd��j}|r�|��nd�t�
�}|�������fd	d
��	g�d���	fdd
�	������	�
���
f	dd�}�����	�
���
f	dd�}t��D]}||d�q�t��D]}	|d|	�t��D]}||d|	�|||	d�q�qԈj
t�d�d��D]8}
|
\}}}
}}}t|��!|\}}}}t||||||||
|t|||��Wd�n	1�s/wYq�dS)z/Draw borders of table cells when they collapse.cS�g|]}|jD]}|j�qqSr!)rqr��rr]r^r!r!r"r�=����z*draw_collapsed_borders.<locals>.<listcomp>NcSr`r!)rqr�rar!r!r"r�Drb�	direction�ltrrNrcs@�r|�t|�kr|S�r|��t|�kr|�S|�SrC)r$)r��
horizontal)�body_rows_offset�footer_rows�footer_rows_offset�grid_height�header_rowsr!r"�
row_numbercs
z*draw_collapsed_borders.<locals>.row_numberTc	s�d}|D]M\}}|r"d|kr�krQnqd|kr �krQnqd|kr,�krQnqd|kr8�krQnq�||d�}|||\}\}}}t||�}q|dS)Nr�rer�)r�)	�border_list�yx_pairs�vertical�resultr�r��yy�_r�)ri�
grid_widthrkr!r"�half_max_widthqs�00
�z.draw_collapsed_borders.<locals>.half_max_widthc
s��|dd�}�||\}\}}}|dks|jdkrdS�|}�|}|dks+�js<|��||df||fgdd�8}�|d}	|�dksK�js`|	��|d|df|d|fgdd�7}	��||||d||d|	|ff�dS)NFrlrr)ror)r0�skip_cell_border_top�skip_cell_border_bottom�append)
r�r�rq�scorer&r�r%�pos_x�pos_y1�pos_y2�	�column_positionsrirt�horizontal_bordersrk�
row_positions�segmentsrZ�vertical_bordersr!r"�add_vertical~s.����

�z,draw_collapsed_borders.<locals>.add_verticalcs|dkr	�jr	dS|�kr�jrdS�|dd�}�||\}\}}}|dks,|jdkr.dS�|}��|d|f||fg�}��|d|df||dfg�}	�jddkrf�||}
�|d|	}n�|d|	}
�||}��||||d|
|||
dff�dS)NrTrlrrcrdr)rurvr0r&rw)r�r�rqrxr&r�r%�pos_y�shift_before�shift_after�pos_x1�pos_x2r|r!r"�add_horizontal�s,�

�z.draw_collapsed_borders.<locals>.add_horizontalr)r')T)rq�
column_widths�listr}r�r&rwr��collapsed_border_grid�	is_header�	is_footer�skipped_rowsr�sort�operator�
itemgetterr#rLr�)r rZ�row_heightsr�r��original_grid_heightr�r�r�r��segmentrrr&r�r%r�r��bx�by�bw�bhr!)rfr}rgrhrirsrtrjr~rkrr�rZr�r"rY;sn��




�

����rYcCs�|jddks
|jr
|jsdSt�|�\}}}}|dks |dkr"dSt|��3t||���|��|�	�|j
||d�|��|j�
||||jd�|��Wd�dS1s\wYdS)zCDraw the given :class:`boxes.ReplacedBox` to a ``document.Stream``.r�rJNrr�r�)r&r�r�r�replacedbox_layoutr#rS�rounded_content_boxrKrUr`r�replacementr�r)r r;�
draw_width�draw_height�draw_x�draw_yr!r!r"rp�s 
�
"�rprK�nonecCsbt|t�r|}t|jtjtjf�sJ�t||�dSt||j�t	||�t|tj
tjf�r�d}t|tj�r=|j}|j
}n|j}d}|rL|j|ddd�t|j�D]7\}	}
|	t|j�dkr`|}t|
t�rh|}n||
j|j}t|
tj�rt||
|||�qQt|||
|||�qQ|r�|��dSdSt|tj�r�t||�dSt|tj�s�J�t||||�dS)Nr�T�Link)rH�tagr)rDrr;r
re�
InlineFlexBoxr?r:r<r>rlrr�
text_overflow�block_ellipsis�link_annotationrQr�rqr�r��TextBox�	draw_textrmrb�InlineReplacedBoxrp)r r@r;�offset_xr�r�rAr��ellipsisr�r|�child_offset_xr!r!r"rm�sN
�

�
�
��rmc
Cs�|jdsJ�|jddkrdS|jd}|jd}|dkr#|jd}d	|vr?|jj}|j|jj|d
}t||||||�d|vr[|jj}|j|jj|d
}t||||||�|j|j|j}	}
|j	|jddd��|�
|jdd�|j�|j�|��t
||||td
|	|
d��}|��t||jd|	|
|�d|vr�|jj}|j|jj}t||||||�|j��dS)z!Draw a textbox to a pydyf stream.�	font_sizer�rJN�text_decoration_line�text_decoration_colorr$r%�overliner��	underliner�rN)�dr�r�zline-through)r&�pango_layout�underline_thickness�baseline�ascent�draw_text_decoration�underline_positionr�r�r�rw�
reactivate�
begin_text�draw_first_liner�end_text�draw_emojis�strikethrough_thickness�strikethrough_position�
deactivate)r �textboxr�r�r��text_decoration_valuesr�rI�offset_yr�r��emojisr!r!r"r�sX


�
���
���
�r�cCsX|D]'\}}}}}	}
|��|j||||	|||
d�|�|||d�|��qdS)N)r
r�r�r�)rr`r�r)r r�r�r�r�r��fontr
r�r�r�r!r!r"r�5s
�r�c1	s�|j��sgS|jd}|dkrgSt�|jjd�|dks"|dkr�|jjdus*J�|jj}t�|jjt	|��|dkrFt�
|jjtj�nA|dkrMd}n|d	d
ksUJ�|d}|jj}|�|jd�rt
|dt|jd��|jd
�}	|	r|d|	�}|j�||�|j��\}
}|dkr�|r�t
|jjdt|��|jd
�}	|	dur�n|jjd|	�}|j�||�|j��\}
}|s�|jj��}d	}
|j|j�d}d}d	}g}|
jd	}|tjk�rI|j}|j}|j}|j}|j}|jj�|j�|jjj}|� |�}��fdd�t!d|�D�}|�"�|jj#�||k�r8|�r'|�$|�d}|�%|j&|j'�r3dn|�|}|d7}t!|�D�]�}||}|j(}|j)j*}|tj+k�sZ|tj,@�rg|d||�d�7}�q@||}|j)j-|�|j)j.d}|�r�|ddk�r�|dd�}n|d7}|�$|�|�/|�d}��r���}||j'�r�d|d�d�nd|d�d�7}|�$|�|�/d	�d}n��r�|d��d�7}||j'�r�|d�n|d�7}||j0v�r�t�1|||j2|j3�t4t5t6|j3j*d�|��|j0|<t4|j0|t6|d�|��} | �r|d| �d�7}||j7v�r,t8|
|�}!||!�9�|j7|<|}
|j:�r�t�;|�}"t<�=|"�}#t�>t<�?|#|�t<j@�}$t<�A|$|j#�}%|%tjk�r�t�B|%t4|j#d	��}&tC�D|&�}'tC�Ed�}(tF|'�D]
})|(�"|)�|'�G|)��qm|'�"|(�tCjH|'ddd|��id�tI|'dd|�}*|j0|d|jJ|}+},|�"|*||+|,|d	g�nu|jK�r#t�;|�}"t�>t<�L|"|�t<j@�}$t<�A|$|j#�}%|%tjk�r#t�B|%t4|j#d	��}-tM�NtO|-��}.|j&�|��}/tP|.|/|-�}*|j0|d},|.j*|.jQ|,}+t�1|||j2|j3�t6|j3jR|j3jQ�}0|0||}0|�"|*||+|,||0g�||j0|�| d7}�q@|ddk�r@|dd�}n|d7}|tjks�|�$|�|S)z;Draw the given ``textbox`` line to the document ``stream``.r�r!Tr�r�NrLu…r�stringr�hyphenate_character�langr�csg|]}��|�qSr!r!)rr���clustersrr!r"r��sz#draw_first_line.<locals>.<listcomp>�<�>i�rN�02x�04x�defs�use�hrefz#glyph)�attrib)S�text�stripr&r�&pango_layout_set_single_paragraph_moder��layout�	max_width�pango_layout_set_widthr�pango_layout_set_ellipsize�PANGO_ELLIPSIZE_END�endswithrr��set_text�get_first_line�encode�text_matrixra�runsr�NULL�data�next�glyphs�
num_glyphs�itemr�log_clusters�analysisr��add_fontrrwr>�	show_text�
set_font_size�hash�bitmap�glyph�geometryr��PANGO_GLYPH_EMPTY�PANGO_GLYPH_UNKNOWN_FLAG�x_offset�y_offset�
set_text_riser�pango_font_get_glyph_extents�ink_rect�logical_rectr$r�r�cmap�slice�decoder��pango_font_get_hb_fontr�hb_font_get_face�gc�hb_ot_color_glyph_reference_svg�hb_blob_destroy�hb_blob_get_data�unpackr
r��Elementr��remove�
SubElementr�upem�png�hb_ot_color_glyph_reference_pngr�openrrr�r�)1r r�r�r�r�r�r�r��new_text�
last_word_end�
first_line�index�	utf8_text�previous_utf8_position�	last_fontr��	x_advancer��run�
glyph_item�glyph_stringr�r��
pango_fontr��utf8_positionsr��
glyph_infor�r��
utf8_position�rise�kerning�
utf8_slice�hb_font�hb_face�hb_blob�hb_data�svg_datar�r�r|r�r
r��png_data�pillow_image�image_idr�r!r�r"r�=s`

��
����





�
(

������



�



��

����
�
r�c
Cs8t||j|j||j|j|j|||jd||�	dS)z=Draw text-decoration of ``textbox`` to a ``document.Stream``.�text_decoration_styleN)rLr�r�r�r&)r r�r�r�rIr%r!r!r"r�s
�r�)TNr!)NN)r)rrKr�)B�__doc__�
contextlibr��colorsysrr�ior�mathrrrrr	�	xml.etreer
�PILr�formatting_structurer
�imagesrrr�r�layout.backgroundrr�r�stackingr�text.ffirrrrr�text.line_breakrr��contextmanagerr#r)r4r5rBrGr?rSr:r�r�r>r�rr�rLrurFrYrprmr�r�r�r�r!r!r!r"�<module>sb
		u
!cFS
�9
!1
�.3E