Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 0øªjXÈã@s¶dZddlZddlZddlmZmZddlmZddlm Z m Z m Z m Z m Z ddlmZddlmZdd lmZdd lmZmZdd lmZdd lmZdd lmZddlmZmZm Z m!Z!m"Z"ddl#m$Z$dKZ%ej&dd„ƒZ'dd„Z(dd„Z)dd„Z*dd„Z+dd„Z,d d!„Z-d"d#„Z.d$dffd%d&„Z/d'd(„Z0d)d*„Z1d+d,„Z2d-d.„Z3d/d0„Z4dLd1d2„Z5d3d4„Z6d5d6„Z7d7d8„Z8d9d:„Z9d;d<„Z:dMd?d@„Z;dAdB„ZdGdH„Z?dIdJ„Z@dS)Nzp weasyprint.draw --------------- 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)ÚStackingContext)ÚffiÚharfbuzzÚpangoÚunits_from_doubleÚunits_to_double)Úget_last_word_endÚtopÚrightÚbottomÚleftc cs"|jƒz dVWd|jƒXdS)zDSave and restore stream context when used with the ``with`` keyword.N)Ú push_stateÚ pop_state)Ústream©r ú5/tmp/pip-build-_d5lkt3n/weasyprint/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.gø?gô?)rÚredÚgreenÚbluerÚalpha)r$ÚhueÚ saturationr'r r r!Údarken,sr/cCsPt|j|j|jƒ\}}}dd|d}|r?szdraw_page..rrrrÚmarksF)Úclip_boxÚbleedr5)r6N)rrrr) r%rZ from_pageÚdraw_backgroundÚboxÚ backgroundZcanvas_backgroundÚ draw_borderÚdraw_stacking_context)r3rr7r5Ústacking_contextr )r3r!Ú draw_page=s     r>cCs¨t||jƒt|tjƒršt|||ƒ|jddkrŽt||ƒxZ|jD]D}x>|jD]4}x.|jD]$}|jddksv|j r\t||ƒq\WqPWqDWq¤t ||ƒn t||ƒdS)NÚborder_collapseZseparateÚ empty_cellsÚshow) r8r:Ú isinstancer ZTableBoxÚdraw_table_backgroundsr%r;ÚchildrenÚemptyÚdraw_collapsed_borders)rr3r9Ú row_groupÚrowÚcellr r r!Údraw_box_background_and_borderLs        rJc Cs8t|ƒ��$|j}|jrH|jjddkrHt||jjƒƒ|jƒ|jƒ|j ƒrÜ|jdrÜ|jd\}}}}|dkrxd}|dkr„d}|dkr”|j ƒ}|dkr¤|j ƒ}|j |j ƒ||jƒ|||||ƒ|jƒ|jƒ|jddk�r"|}|j|j ƒ|jƒ|j ƒ|j ƒ|jƒ|j ƒgƒ}|j�rH|jj�rD|j|jjŽndSt|tjtjtjtjtjfƒ�rvt||j|ƒt|ƒ��P|jddk�rÀt|tjƒ �rÀt||jƒƒ|jƒ|jƒx|jD]}t||ƒ�qÈWx|jD]} t||j| ƒ�qäWx|j D]}t||ƒ�qWt|tj!ƒ�r4t"||j|ƒx^|g|j#D]N} t| tj$ƒ�r`t%|| ƒn.x,| j&D]"} t| tj'ƒ�rht"||j| ƒ�qhW�qBWx|j(D]}t||ƒ�qœWx|j)D]}t||ƒ�q¸WWdQRXt*||ƒ|jddk�r*|j+} |}|j,ƒ|j-|jdd d d �|j.| ƒ|j/ƒWdQRXdS) z*Draw a ``stacking_context`` on ``stream``.ZoverflowÚvisibleÚclipÚautorZopacityr NT)ÚstrokeÚfill)0r"r9Zis_for_root_elementr3r%Úrounded_box_pathÚrounded_padding_boxrLÚendZis_absolutely_positionedÚ border_heightÚ border_widthÚ rectangleÚ border_box_xÚ border_box_yÚ add_groupZtransformation_matrixZ determinantÚ transformÚvaluesrBr ZBlockBoxZ MarginBoxÚInlineBlockBoxZ TableCellBoxZFlexContainerBoxrJZPageBoxZnegative_z_contextsr<Zblock_level_boxesZfloat_contextsÚ InlineBoxÚdraw_inline_levelZblocks_and_cellsZ ReplacedBoxÚdraw_replacedboxrDÚLineBoxZzero_z_contextsZpositive_z_contextsÚ draw_outlinesÚidrÚ set_alphaÚ draw_x_objectr) rr=r9rrrrZoriginal_streamZ child_contextÚblockÚchildZgroup_idr r r!r<^sŽ               r<c Cs¾|\}}}}}}}} tdd„|||| fDƒƒrB|j||||ƒdSd} |j||d|ƒ|j|||d|ƒ|j|||d| |||||d| ||||dƒ|j|||||dƒ|j|||||d| |||d| |||||d||ƒ|j|| d||ƒ|j|| d| |||||| d| |||| dƒ|j|||dƒ|j|||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|kVqdS)rNr )r1Zcornerr r r!ú Ösz#rounded_box_path..NgÍÌÌÌÌÌÜ?rr )ÚallrUÚmove_toÚline_toÚcurve_to) rÚradiiÚxÚyÚwÚhÚtlÚtrÚbrÚblÚrr r r!rPÌs&<> <rPTcXCs~|dkr dSt|ƒ��^|rNx |jd jD]}t||ƒq,W|jƒ|jƒ|jjdk�rt|ƒ�´|jd j}|rÞ|rÄ|\}}} } ||d||d| |d|d| |d|df}|j |Ž|jƒ|jƒ|j |j Ž|j |jdd…Ž|j |jjƒ|j ƒWdQRX|�o&|�rL|jd j\}}} } ||d8}||d8}| |d|d7} | |d|d7} d d „|jƒDƒ} d | ›d | ›d �} d|k�rˆ| 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�17} d|k�rÔ| 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.|d›d/| ›d0| d›d1| ›d2| d›d| ›d&| d›d%| d›d-|d›d3|d›d1| ›d4| ›d5�I7} | d67} tj| ƒ} t| dd|ƒ}| | f}||f}d7d7f}d8}||}dd| | f}g}t||||||||ƒ}|jjd|ƒx"t|jƒD]}t|||jƒ�qXWWdQRXdS)9zÓ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. Nr rrrrrécSsi|]\}}|d|“qS)gà?r )r1r&r'r r r!r4sz#draw_background..z Zcropz Zcrossz zz no-repeatT)r"ZlayersÚ clipped_boxesrPrLrRr$r,Ú painting_arearUÚpage_rectangleÚ set_color_rgbrbrOÚitemsr Ú fromstringrrÚinsertÚreversedÚdraw_background_imageÚimage_rendering)rÚbgr6r7r5r9rxrlrmÚwidthÚheightZ half_bleedÚsvgÚtreeÚimageÚsizeÚpositionÚrepeatÚ unboundedÚpositioning_arearwÚlayerr r r!r8ísn         Ø ÿA   r8cCs´x6|jD],}t||jƒx|jD]}t||jƒq WqWxv|jD]l}t||jƒxZ|jD]P}t||jƒx>|jD]4}|jddks˜|jddks˜|j rpt||jƒqpWqXWq@WdS)z:Draw the background color and image of the table children.r?Zcollapser@rAN)Z column_groupsr8r:rDr%rE)rr3ÚtableZ column_groupÚcolumnrGrHrIr r r!rC\s        rCc Cs&ddlm}|jdks d|jkr$dS|j\}}}}|j\}} } } |j\} } |j\}}|j\}}|dkrrt||ƒ}nH|d kr€|}n:|dksŒt ‚t | |ƒ}|dkr¶| ||d}d} n|}|dkrÎt||ƒ}nJ|d krÜ|}n<|dksèt ‚t | |ƒ}|dk�r| ||d}d} n|}||k�o,dkn�rPd|j d}d|j d }|| || | d �}||j }|j |||||ƒ}|jdd||gƒ}t|ƒ�‚|jj||||ƒ|j|jƒ|jd ƒ|j|jƒ|j�r|j \}}}}|j||||||ƒn|j||||ƒ|jƒWdQRXdS)Nr )ÚMatrixrz no-repeatr‰ÚroundÚspaceéru)ÚeÚfÚPattern)r‰r�)r‰r�)Údocumentr�r†r‡rxr‹rˆr‰ÚmaxÚAssertionErrorrryZctmZ add_patternrXr"ÚdrawrcraZ color_spaceZset_color_specialrŠrUrO)rrŒr€r�Z painting_xZ painting_yZpainting_widthZpainting_heightZ positioning_xZ positioning_yZpositioning_widthZpositioning_heightÚ position_xÚ position_yZrepeat_xZrepeat_yZ image_widthZ image_heightZ repeat_widthZ n_repeatsZ repeat_heightZmatrixÚpatternÚgroupÚx1Úy1Úx2Úy2r r r!rms^                 rcCs||||||fS)z3Increment X and Y coordinates by the given offsets.r )rlrmÚoffset_xÚoffset_yÚoffsetr r r!Ú xy_offset¸sr¥cCsd|dkr(|dk|dkA}|r tnt|ƒS|d kr`|d k|dkArPt|ƒt|ƒfSt|ƒt|ƒfS|S) NÚinsetÚoutsetrrÚridgeÚgroove)r¦r§)rr)r¨r©)rr)r0r/)r%r$r2Z do_lightenr r r!Ú styled_color½srªc sV‡‡fdd„}ˆjddkr&|ƒdS‡fdd„tDƒ}tdd „|DƒƒrT|ƒdS‡fd d„tDƒ‰‡‡fd d„ttƒDƒ}t|ƒtdƒtdƒfkrÆttˆƒƒdkrÆtˆˆ|dˆdƒ|ƒdSx„tt|ˆ|ƒD]r\}}}}|dksÖ| ròqÖtˆƒ�Ht ˆ|||ˆj ƒdd…|ˆj ƒdd…ƒtˆˆ|t |||ƒƒWdQRXqÖW|ƒdS)z-Draw the box border to a ``document.Stream``.csötˆtjƒo&ˆjddkp&ˆjddk}|ròˆjdròdddˆjdf}x¨ˆjdd…D]–}tˆƒ�„|jˆjdˆjdd }||jˆjdˆjf}t ˆˆjd ˆjdd ||ƒt ˆ||ˆjd t ˆjd t ˆjd ƒd ƒƒWdQRXqXWdS) zDraw column borders.Z column_widthrMZ column_countZcolumn_rule_widthrr NZ column_gapr’Zcolumn_rule_stylerZcolumn_rule_color) rBr ZBlockContainerBoxr%rDr"ršr›rƒÚclip_border_segmentÚdraw_rect_borderrªr()ÚcolumnsÚ border_widthsreršÚ border_box)r9rr r!Údraw_column_borderÎs*     z'draw_border..draw_column_borderÚ visibilityrKNcsg|]}tˆd|›d�ƒ‘qS)Úborder_Ú_width)Úgetattr)r1r2)r9r r!ú íszdraw_border..css|]}|dkVqdS)rNr )r1r‚r r r!rfðszdraw_border..cs g|]}tˆjd|›d�ƒ‘qS)r²Z_color)r(r%)r1r2)r9r r!rµôscs,g|]$\}}ˆ|jo&ˆjd|›d�‘qS)r²Ú_style)r,r%)r1Úir2)r9Úcolorsr r!rµösÚsolidÚdoubler ré)r¹)rº) r%ÚSIDESrgÚ enumerateÚsetÚlenÚdraw_rounded_borderÚzipr"r«Úrounded_border_boxrª) rr9r°ÚwidthsZstylesr2r‚r$r%r )r9r¸rr!r;És4   "r;c3 s |\}}} } |pd\\} } \} }\}}\}}|p8d|f\}}}}dd„}dd„}ˆdkrœ|| | ||ƒ\\}}}|| || |ƒ\\}}}|}d}d‰|‰nøˆd krò|| || |ƒ\\}}}|| | | | ƒ\\}}}|}d}d ‰|| ‰n¢ˆd k�rJ||| || ƒ\\}}}|| | | | ƒ\\}}}|}d}d ‰|| ‰nJˆd k�r”|| | ||ƒ\\}}}||| || ƒ\\}}}|}d}d‰|‰ˆdk�r6||d |||d } }!| |d |||d }"}#| ||}$| }%ˆj|| ˆƒˆj|ˆƒˆj||ˆ|ƒˆj|| |ˆ|ƒn¤ˆdk�rÚ| ||d ||d } }!| ||d | |d }"}#| ||}$| }%ˆjˆ|| ƒˆjˆ|ƒˆjˆ|||ƒˆjˆ||| |ƒ|dk�r|dk�rò|nd |‰|�s|�r|| |!ƒ}&||"|#ƒ}'|$|&|'}%t|%ˆƒ}(|�rP|�rP|%|(|(d ‰n|%|(|(d d‰tt|&ˆd ˆƒƒ})tt|'ˆd ˆƒƒ}*tt|$ˆƒƒ}+‡‡‡‡‡fdd„},|,|)|+||||||&ƒ\}+}-|,|*|+| || || |||'ƒd}+|$dk�r�xtd|+d ƒD]ð}.|.|-7}.ˆdk�r‚t|||.ˆ||ƒ}/t|||.dˆ|| |ƒ}0ˆ|dk�rr|nd}1|1|}2ndˆd k�ræt|||.ˆ||ƒ}1t|||.dˆ|| |ƒ}2ˆ|dk�rØ|nd}/|/|}0ˆj |/|1|0|/|2|1ƒ�qW�nˆj dd�ˆj ƒ|%t|%ˆƒt|%ˆƒdd �pDd‰xÀtdtt|%ˆƒƒd ƒD]¤}.ˆdk�rˆˆj ||.ˆ|ˆ|ƒnzˆd k�r´ˆj || |||.ˆ|ˆƒnNˆd k�ràˆj ||.ˆ|| |ˆ|ƒn"ˆd k�r`ˆj |||.ˆ|ˆƒ�q`Wˆj dd�ˆj ƒ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. r»rcSs8t|ƒt|ƒkr,t|ƒ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_points,z-clip_border_segment..transition_pointc SsH||||}td||dd|ddtdd|dƒS)a6Return 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. http://mathforum.org/dr.math/faq/formulas/ ér rur’é r»)rr)ÚaÚbrlr r r!Úcorner_half_length-s z/clip_border_segment..corner_half_lengthrr rr’rrurÚdottedÚdashedgà?c sÐ|s|ddfS�x´td|dƒD�]†}|d7}dˆ|||ˆ|dt} |dkr^tntdˆ||d|ˆ|dtˆtdƒ} ˆd k�rüˆj||ˆ|ƒˆj||||dt| ƒˆƒˆj||||dt| ƒˆƒn^ˆd k�rZˆjˆ|||ƒˆjˆ||||t| ƒƒˆjˆ||||t| ƒƒ| ˆtdkr | | dˆ||d|ˆ|dt| } |d7}Pq Wdˆtd| | | } || fS) Nr rr’gà?r»rrrr)rr)rr)ÚrangerÚminr—rhrir ) ZdashesÚlineÚwayrlrmZpxÚpyZchlr·Zangle1Zangle2r¤)ÚangleÚdashÚ main_offsetr2rr r!Ú draw_dots}s8 $&  " .z&clip_border_segment..draw_dotsg�íµ ÷ư>T)Úeven_oddN©rr)r×)r×r×r×r×éÿÿÿÿrØ)rr)rr)rËrÌ)rr)rr) rhrir�ÚintrrrÍr—rÎrUrLrR)3rr%r‚r2r¯r®rkÚbbxÚbbyÚbbwÚbbhZtlhZtlvZtrhZtrvZbrhZbrvZblhZblvÚbtrrÚbbrsrÅrÊZpx1Zpy1Zrounded1Zpx2Zpy2Zrounded2rÐZa1Zb1Za2Zb2Z line_lengthÚlengthZchl1Zchl2Z dash_lengthZdashes1Zdashes2rÏrÕr¤r·ržr rŸr¡r )rÒrÓrÔr2rr!r«sÈ            "         #"  "  "" (     r«cCst||jƒƒ|d kr°t||jd ƒƒ|j|ddd…Ž|j|ddƒ|jdd�t||jd ƒƒt||jƒƒ|j|ddd…Ž|j|ddƒ|jdd�dS|d krØt||jd ƒƒt||jdƒƒt||jƒƒ|j|dd…Ž|j|dƒ|jdd�dS)Nr¨r©r r’rruT)rÖrº)r¨r©gà?gà?gUUUUUUÕ?gUUUUUUå?)rPrQZrounded_box_ratiorzrbrOrÂ)rr9r%r$r r r!rÀÈs&  rÀc Cs|\}}}}|\} } } } |j|Ž|d k�r0|j|| d|| d|| | d|| | dƒ|j|ddd…Ž|j|ddƒ|jdd�|j|| d|| d|| | d|| | dƒ|j|| || || | || | ƒ|j|ddd…Ž|j|ddƒ|jdd�dS|d k�rº|j|| d|| d|| | d|| | dƒ|j|| dd|| dd|| | dd|| | ddƒ|j|| || || | || | ƒ|j|dd…Ž|j|dƒ|jdd�dS) Nr¨r©r’rruT)rÖr rº)r¨r©)rUrzrbrO) rr9rÃr%r$rÚrÛrÜrÝrÞrrrßrsr r r!r¬Þs:       (   ((r¬cCsò|jd}t|jdƒ}|jd}|jddkr¼|r¼|jr¼|jƒ||jƒ||jƒd||jƒd|f}xNtD]F}t|ƒ�4t |||||ƒt ||d|f|t |||ƒƒWdQRXqrWt |t jƒrîx$|jD]}t |t jƒrÐt||ƒqÐWdS)NZ outline_widthZ outline_colorZ outline_styler±rKr’r»)r%r(r,rVrWrTrSr¼r"r«r¬rªrBr Z ParentBoxrDZBoxr`)rr9r‚r$r%Z outline_boxr2rer r r!r`þs          r`cs�dd„ˆ jDƒ}ˆ j}|o|s"dSdd„ˆ jDƒ‰ tˆ jƒ‰t|ƒ‰t|ƒ‰ˆtˆƒks\t‚ˆ jddkr‚ˆjˆd|dƒnˆjdˆd|dƒˆ jˆ d|dƒˆ j \‰ ‰ˆ jdj rØtˆ jdjƒ‰nd‰ˆ jdj �rütˆ jdjƒ‰nd‰ˆ j }|�r|ˆ‰nd‰tˆ ƒ}|ˆ‰‡‡‡‡‡fd d „‰ g‰ d‡‡‡ fd d „ ‰‡‡‡‡‡ ‡ ‡ ‡ ‡ f dd„}‡‡‡‡‡ ‡ ‡ ‡ ‡ f dd„}xt ˆƒD]}||dƒ�q–WxLt ˆƒD]@} |d| ƒx.t ˆƒD]"}||d| ƒ||| dƒ�qÌW�q´Wˆ jtjdƒd�x€ˆ D]x} | \} } } }}}|dk�r<| dddf}n ddd| f}t|ƒ�0t|| | |||ƒt|||| t| ||ƒƒWdQRX�qWdS)z/Draw borders of table cells when they collapse.cSsg|]}|jD] }|j‘qqSr )rDrƒ)r1rGrHr r r!rµsz*draw_collapsed_borders..NcSsg|]}|jD] }|j‘qqSr )rDr›)r1rGrHr r r!rµsÚ directionÚltrr rcsDˆr|ˆt|ƒkr|Sˆr8|ˆˆt|ƒkr8|ˆS|ˆSdS)N)rÙ)rmÚ horizontal)Úbody_rows_offsetÚ footer_rowsÚfooter_rows_offsetÚ grid_heightÚ header_rowsr r!Ú row_number;s z*draw_collapsed_borders..row_numberTc s°d}x¢|D]š\}}|rFd|ko(ˆknotd|ko@ˆkqtn.d|koXˆknr d|kopˆknr ˆ|| d�}|||\}\}}}t||ƒ}q W|dS)Nr)rãr’)r—) Z border_listZyx_pairsÚverticalÚresultrmrlÚyyÚ_r‚)rçÚ grid_widthrér r!Úhalf_max_widthIs40z.draw_collapsed_borders..half_max_widthc sòˆ|dd�}ˆ||\}\}}}|dks4|jdkr8dSˆ|}ˆ|}|dksXˆj rz|ˆˆ||df||fgdd�8}ˆ|d} |ˆdksšˆj rÄ| ˆˆ|d|df|d|fgdd�7} ˆj||||d||d|d| |ffƒdS)NF)rãrr )rêrr’)r,Úskip_cell_border_topÚskip_cell_border_bottomÚappend) rlrmrìÚscorer%r‚r$Zpos_xZpos_y1Zpos_y2) Úcolumn_positionsrçrïÚhorizontal_bordersréÚ row_positionsÚsegmentsr�Úvertical_bordersr r!Ú add_verticalVs   $ z,draw_collapsed_borders..add_verticalc s|dkrˆjrdS|ˆkr$ˆjr$dSˆ|dd�}ˆ||\}\}}}|dksX|jdkr\dSˆ|}ˆˆ|d|f||fgƒ}ˆˆ|d|df||dfgƒ} ˆjddkr̈||} ˆ|d| } nˆ|d| } ˆ||} ˆj||||d| ||d| | dffƒdS) NrT)rãr rárârr’)rðrñr,r%rò) rlrmrìrór%r‚r$Zpos_yZ shift_beforeZ shift_afterZpos_x1Zpos_x2) rôrçrïrõrérör÷r�rør r!Úadd_horizontalhs(     z.draw_collapsed_borders..add_horizontal)r&rrØrØrØrØrØrØ)T)rDÚ column_widthsÚlistrôr¿r˜r%ròr}Zcollapsed_border_gridZ is_headerZ is_footerÚ skipped_rowsrÍÚsortÚoperatorÚ itemgetterr"r«r¬rª)rr�Z row_heightsrûrýZoriginal_grid_heightrùrúrlrmZsegmentrír%r‚r$r2r¯rÃr )rärôrårærçrîrïrèrõrérör÷r�rør!rFsb           rFc Cs´|jddks|j s|j r"dStj|ƒ\}}}}|dksD|dkrHdSt|ƒ�Zt||jƒƒ|jƒ|j ƒ|j ||d�|j ƒ|j j ||||jdƒ|jƒWdQRXdS)zCDraw the given :class:`boxes.ReplacedBox` to a ``document.Stream``.r±rKNr)r“r”r€)r%r‚rƒrZreplacedbox_layoutr"rPZrounded_content_boxrLrRrYrÚ replacementr™r)rr9Z draw_widthZ draw_heightZdraw_xZdraw_yr r r!r^šs r^rLÚnonec Cs4t|tƒr2|}t|jtjtjfƒs&t‚t||ƒnþt||j ƒt ||ƒt|tj tj fƒröt|tj ƒrr|j }|j}d}x¸t|jƒD]n\}} |t|jƒdkr |}t| tƒr°|} n|| j|j} t| tjƒrÞt|| | ||ƒq‚t||| | ||ƒq‚Wn:t|tjƒ�rt||ƒn t|tjƒ�s"t‚t||||ƒdS)Nrr )rBrr9r r[Z InlineFlexBoxr˜r<r8r:r;r\r_Ú text_overflowÚblock_ellipsisr½rDr¿ršZTextBoxÚ draw_textr]ZInlineReplacedBoxr^) rr3r9r¢rrr=Úellipsisr·reZchild_offset_xr r r!r]°s8          r]c Csd|jdst‚|jddkr dS|j|j|j}}|j|jddd…Ž|j|jddƒ|jj|jƒ|j ƒt ||||||ƒ}|j ƒt ||jd|||ƒ|jd}|jd} | d krÌ|jd} d |krò|jj } |j|jj| d } d |k�r|jj } |j|jj| d } d |k�r:|jj} |j|jj} |dk�rVt|||| | | ƒ|jjƒdS)z!Draw a textbox to a pydyf stream.Ú font_sizer±rKNr$ruZtext_decoration_lineZtext_decoration_colorr#Zoverliner’Z underlinez line-throughr)r%r˜ršr›ZbaselinerzrbÚ pango_layoutZ reactivateZ begin_textÚdraw_first_lineZend_textÚ draw_emojisZunderline_thicknessZascentZunderline_positionZstrikethrough_thicknessZstrikethrough_positionÚdraw_text_decorationZ deactivate) rÚtextboxr¢rrrlrmÚemojisrZr$Ú thicknessr£r r r!r×s<        rc Csjxd|D]\}xV|D]N\}}}} } } |jƒ|j|| || ||| d�|j|||dƒ|jƒqWqWdS)N)rÈÚdr“r”)rrYr™r) rrrlrmr Zemojir†ÚfontrÈrr“r”r r r!r s  r c8 sþtj|jjdƒ|dks |dkrê|jjdk s0t‚|jj}tj|jjt|ƒƒ|dkrhtj|jjtj ƒn‚|dkrvd}n|ddks†t‚|d }|jj }|j |j d ƒrÚt |dt|j d ƒ …|j d ƒ} | rÚ|d| …}|jj||ƒ|jjƒ\} } |dk�rlxh| �rjt |jj dt|ƒ …|j d ƒ} | dk�r8P|jj d| …}|jj||ƒ|jjƒ\} } �qW|j d } |jj jd ƒ} d}| jdg}x(|djtjk�r¼|j|djƒ�q–W|j| dd| ||ƒd}d}|jƒ}d}g}�x|D�]ö}tjd|jƒ}|j}|j}|j}|jj‰|j‰|jj j!}tj"|ƒ}t#j$|ƒ}t%|ƒ}||k�rb||}nRtj&t#j'|ƒt#j(ƒ}t#j)||j*ƒ} tj+| t,|j*dƒƒ}!t#j-|ƒ}"|j.||!||"ƒ}‡‡fdd„t/d |ƒDƒ}#|#jˆ|jj*ƒ||k�r|�rú|j0|ƒd}|}|j1|j%d ƒ|d7}�xªt/|ƒD�]œ}$||$}%|%j2}&|%j3j4}'|&tj5k�sX|&tj6@�rr|d|' | ›d�7}�q$|#|$}(|%j3j7| ‰ˆ�rž|dˆ ›d�7}||&d›7}|&|j8k�rÈtj9||&|j:|j;ƒ|j:j<|j:j= |j:j>|j:j<|j:j4|j:j= f\})}*}+},|)|j?dk�r,t,t@|)dƒ| ƒ|j?d<|*|j?d k�rVt,t@|*dƒ| ƒ|j?d <|+|j?dk�r€t,t@|+dƒ| ƒ|j?d<|,|j?dk�rªt,t@|,dƒ| ƒ|j?d<t,t@|j;j4dƒ| ƒ|j8|&<t,|j8|&t@|'dƒ| ˆƒ}-|-�r|d|-›d�7}|&|jAk�r*tB||(ƒ}.| |.jCd ƒ|jA|&<|(}|jD�rÈtj&t#jE||&ƒt#j(ƒ}t#j)||j*ƒ} | tjk�rªtj+| t,|j*dƒƒ}/tFjG|/ƒ}0tH|0dd|ƒ}1|j8|&d|jI| }2}3|j|1||2|3|dgƒnâ|jJ�rªtj&t#jK||&ƒt#j(ƒ}t#j)||j*ƒ} | tjk�rªtj+| t,|j*dƒƒ}4tLjMtN|4ƒƒ}5|j%›|&›�}6tO|5|6fd�}1|j8|&d}3|5j4|5j>|3}2tj9||&|j:|j;ƒt@|j;j= |j;j>ƒ}7|7| | }7|j|1||2|3||7gƒ||j8|&ˆd7}�q$W|ddk�râ|dd…}n|d7}�qôW|j0|ƒ|S)z;Draw the given ``textbox`` line to the document ``stream``.TrrNrMu…rÚstringr Zhyphenate_characterÚlangrzutf-8ÚzPangoGlyphItem *csg|]}ˆˆ|‘qSr r )r1r·)Úclustersr¤r r!rµasz#draw_first_line..ú<ú>Z04xièr’ru)Z optimize_sizerØrØrØrØ)PrZ&pango_layout_set_single_paragraph_moderÚlayoutÚ max_widthr˜Zpango_layout_set_widthrZpango_layout_set_ellipsizeZPANGO_ELLIPSIZE_ENDÚtextÚendswithr%rr¿Zset_textZget_first_lineÚencodeÚrunsÚnextrZNULLròZ text_matrixZ get_fontsÚcastÚdataÚglyphsÚ num_glyphsÚitemr¤Z log_clustersZanalysisrZpango_font_get_hb_fontrZhb_font_get_faceÚhashÚgcZhb_face_reference_blobZhb_blob_destroyZhb_blob_get_dataràÚunpackrÙZhb_face_get_indexZadd_fontrÍZ show_textZ set_font_sizeÚglyphZgeometryr‚ZPANGO_GLYPH_EMPTYZPANGO_GLYPH_UNKNOWN_FLAGZx_offsetrÃZpango_font_get_glyph_extentsZink_rectZ logical_rectrlrmrƒZbboxrZcmapÚsliceÚdecoder„Zhb_ot_color_glyph_reference_svgr r|rZupemZpngZhb_ot_color_glyph_reference_pngr Úopenrr)8rr rrrlrmrrZnew_textZ last_word_endÚ first_lineZ second_linerZ utf8_textZprevious_utf8_positionrZ last_fontrZfontsZ x_advancer ÚrunZ glyph_itemZ glyph_stringr r!Z pango_fontZhb_fontZhb_faceZ font_hashrZhb_blobZhb_dataZ file_contentÚindexZutf8_positionsr·Z glyph_infor&r‚Z utf8_positionržrŸr r¡ZkerningZ utf8_sliceZsvg_datar…r†rÈrZpng_dataZ pillow_imageZimage_idr”r )rr¤r!r  s.                               r cCs²d}||}|j||d||d|ƒ|jƒ|jƒ||8}|j||ƒx`||kr¬|j||d||||d|d||||d||ƒ|d|7}|d9}qNWdS)Nr r’r»rurØ)rUrLrRrhrj)rrlrmr‚r¢ZradiusZupZmax_xr r r!Ú draw_waveÌs   r-cCs6|jd}t|ƒ��|j|dd…ddiŽ|j|ddd�|dkr\|jd|g|ƒn|d krr|j|g|ƒ|d kr |d 9}t||j|j||j||ƒn.|j |j|j|ƒ|j |j|j|j|ƒ|j |ƒ|d k�r d |}|j |j|j||ƒ|j |j|j|j||ƒ|j ƒWdQRXdS)z=Draw text-decoration of ``textbox`` to a ``document.Stream``.Ztext_decoration_styleNrurNT)rNrÌérËZwavygè?rºr’) r%r"rzrbZset_dashr-ršr›r‚rhriZset_line_widthrN)rr r¢r£rr$r%Údeltar r r!r às6        r )rrrr)NN)rrLr)AÚ__doc__Ú contextlibrÿZcolorsysrrÚiorÚmathrrrrr Z xml.etreer ZPILr Zformatting_structurer ZimagesrrrrZlayout.backgroundrZstackingrZtext.ffirrrrrZtext.line_breakrr¼Úcontextmanagerr"r(r/r0r>rJr<rPr8rCrr¥rªr;r«rÀr¬r`rFr^r]rr r r-r r r r r!ÚsZ          n!oK H 8  &- @