Ë
    £èh½~  ã                  ó°  — U d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
 d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlmZ d dlmZmZmZmZ d dl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* d dl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl7m:Z:m;Z; ddl<m=Z= ddl>m?Z? ee@eAf   ZBdeCd<   ee;ee#   gdf   ZDdeCd<   ddgZE G d„ dejŒ                  «      ZG G d„ dejŒ                  «      ZH G d„ deG«      ZI G d„ deH«      ZJ G d „ d!eH«      ZK G d"„ d#eH«      ZLd,d$„ZM	 	 	 	 	 	 	 	 d-d%„ZNd.d&„ZOd/d'„ZPd0d1d(„ZQd2d)„ZR	 d3	 	 	 	 	 	 	 d4d*„ZSd5d+„ZTy)6é    )Úannotations)ÚSequenceÚOptionalÚIterableÚTupleÚIteratorÚCallable)Ú	TypeAliasN)ÚRGB)Úfonts)ÚVec2ÚMatrix44ÚBoundingBox2dÚAnyVec)Ú	make_pathÚPath)Ú	linetypes)Ú
DXFGraphicÚViewport)Ú replace_non_printable_characters)ÚClippingPortalÚClippingShapeÚfind_best_clipping_shape)ÚLayouté   )ÚBackendInterfaceÚBkPath2dÚ
BkPoints2dÚ	ImageData)Ú
LinePolicyÚ
TextPolicyÚColorPolicyÚConfiguration)ÚBackendPropertiesÚFilling)Ú
PropertiesÚRenderContext)ÚColor)ÚUnifiedTextRendererr
   Ú
PatternKeyÚDrawEntitiesCallbackÚAbstractPipelineÚRenderPipeline2dc                  óT  — e Zd ZU dZ e«       Z ej                  «       Zde	d<   e
j                  dd„«       Ze
j                  dd„«       Ze
j                  dd„«       Ze
j                  	 	 	 	 	 	 dd„«       Ze
j                  dd„«       Ze
j                  	 d	 	 	 	 	 	 	 dd
„«       Ze
j                  dd„«       Ze
j                  dd„«       Ze
j                  	 	 	 	 	 	 d d„«       Ze
j                  d!d„«       Ze
j                  	 	 	 	 	 	 d"d„«       Ze
j                  	 	 	 	 	 	 d#d„«       Ze
j                  	 d$	 	 	 	 	 	 	 	 	 	 	 d%d„«       Ze
j                  d&d„«       Ze
j                  dd„«       Ze
j                  d'd„«       Ze
j                  d(d„«       Ze
j                  d)d„«       Zy	)*r,   a@  This drawing pipeline separates the frontend from the backend and implements
    these features:

    - automatically linetype rendering
    - font rendering
    - VIEWPORT rendering
    - foreground color mapping according Frontend.config.color_policy

    The pipeline is organized as concatenated render stages.

    r+   Údraw_entitiesc                 ó   — y ©N© ©ÚselfÚcallbacks     ú=lib/python3.12/site-packages/ezdxf/addons/drawing/pipeline.pyÚset_draw_entities_callbackz+AbstractPipeline.set_draw_entities_callbackB   s   € ØRUó    c                 ó   — y r1   r2   ©r4   Úconfigs     r6   Ú
set_configzAbstractPipeline.set_configE   s   € Ø9<r8   c                 ó   — y r1   r2   ©r4   Úhandles     r6   Úset_current_entity_handlez*AbstractPipeline.set_current_entity_handleH   s   € Ø>Ar8   c                 ó   — y r1   r2   ©r4   ÚshapeÚ	transforms      r6   Úpush_clipping_shapez$AbstractPipeline.push_clipping_shapeK   ó   € ð r8   c                 ó   — y r1   r2   ©r4   s    r6   Úpop_clipping_shapez#AbstractPipeline.pop_clipping_shapeP   s   € Ø*-r8   Nc                 ó   — y©z8Draw the content of the given viewport current viewport.Nr2   )r4   ÚvpÚ
layout_ctxÚ
bbox_caches       r6   Údraw_viewportzAbstractPipeline.draw_viewportS   s   € ð 	r8   c                 ó   — y r1   r2   ©r4   ÚposÚ
propertiess      r6   Ú
draw_pointzAbstractPipeline.draw_point]   s   € ØGJr8   c                 ó   — y r1   r2   ©r4   ÚstartÚendrS   s       r6   Ú	draw_linezAbstractPipeline.draw_line`   s   € ØMPr8   c                 ó   — y r1   r2   ©r4   ÚlinesrS   s      r6   Údraw_solid_linesz!AbstractPipeline.draw_solid_linesc   rF   r8   c                 ó   — y r1   r2   ©r4   ÚpathrS   s      r6   Ú	draw_pathzAbstractPipeline.draw_pathh   s   € Ø=@r8   c                 ó   — y r1   r2   ©r4   ÚpathsrS   s      r6   Údraw_filled_pathsz"AbstractPipeline.draw_filled_pathsk   ó   € ð
 r8   c                 ó   — y r1   r2   ©r4   ÚpointsrS   s      r6   Údraw_filled_polygonz$AbstractPipeline.draw_filled_polygonr   rF   r8   c                 ó   — y r1   r2   )r4   ÚtextrD   rS   Ú
cap_heightÚdxftypes         r6   Ú	draw_textzAbstractPipeline.draw_textw   s   € ð r8   c                 ó   — y r1   r2   ©r4   Ú
image_datarS   s      r6   Ú
draw_imagezAbstractPipeline.draw_image�   ó   € ØQTr8   c                 ó   — y r1   r2   rH   s    r6   ÚfinalizezAbstractPipeline.finalize„   s   € Ø #r8   c                 ó   — y r1   r2   ©r4   Úcolors     r6   Úset_backgroundzAbstractPipeline.set_background‡   s   € Ø47r8   c                 ó   — y r1   r2   ©r4   ÚentityrS   s      r6   Úenter_entityzAbstractPipeline.enter_entityŠ   s   € ð 	r8   c                 ó   — y r1   r2   ©r4   r}   s     r6   Úexit_entityzAbstractPipeline.exit_entity�   s   € Ø7:r8   ©r5   r+   ÚreturnÚNone©r;   r#   rƒ   r„   ©r?   Ústrrƒ   r„   ©rC   r   rD   zMatrix44 | Nonerƒ   r„   ©rƒ   r„   r1   ©rL   r   rM   r'   rN   úOptional[ezdxf.bbox.Cache]rƒ   r„   ©rR   r   rS   r&   rƒ   r„   ©rW   r   rX   r   rS   r&   ©r\   zIterable[tuple[AnyVec, AnyVec]]rS   r&   rƒ   r„   ©r`   r   rS   r&   ©rd   zIterable[Path]rS   r&   rƒ   r„   ©ri   zIterable[AnyVec]rS   r&   rƒ   r„   ©ÚTEXT©rl   r‡   rD   r   rS   r&   rm   Úfloatrn   r‡   rƒ   r„   ©rr   r   rS   r&   rƒ   r„   ©ry   r(   rƒ   r„   ©r}   r   rS   r&   rƒ   r„   ©r}   r   rƒ   r„   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   Útext_enginer   ÚFontFaceÚdefault_font_faceÚ__annotations__ÚabcÚabstractmethodr7   r<   r@   rE   rI   rO   rT   rY   r]   ra   re   rj   ro   rs   rv   rz   r~   r�   r2   r8   r6   r,   r,   1   s†  … ñ
ñ &Ó'€KØ&˜Ÿ™Ó(ÐØ'Ó'à×ÑÚUó ØUà×ÑÚ<ó Ø<à×ÑÚAó ØAà×ÑðØ"ðØ/>ðà	òó ðð 	×ÑÚ-ó Ø-à×Ñð
 26ð	àðð "ðð /ð	ð
 
òó ðð 	×ÑÚJó ØJà×ÑÚPó ØPà×ÑðØ4ðØBLðà	òó ðð 	×ÑÚ@ó Ø@à×Ñðàðð ðð 
ò	ó ðð 	×ÑðØ&ðØ4>ðà	òó ðð 	×Ñð ðàðð ðð ð	ð
 ðð ðð 
òó ðð 	×ÑÚTó ØTà×ÑÚ#ó Ø#à×ÑÚ7ó Ø7à×Ñòó ðð 	×ÑÚ:ó Ù:r8   c                  óN  — e Zd ZU d ed<   dd„Zej                  dd„«       Zej                  dd„«       Zej                  	 	 	 	 	 	 dd„«       Z	ej                  dd„«       Z
ej                  	 	 	 	 	 	 dd„«       Zej                  	 	 	 	 	 	 dd„«       Zej                  dd	„«       Zy
)ÚRenderStage2dÚ
next_stagec                 ó   — y r1   r2   r:   s     r6   r<   zRenderStage2d.set_config–   s   € Ør8   c                 ó   — y r1   r2   rQ   s      r6   rT   zRenderStage2d.draw_point™   s   € ØEHr8   c                 ó   — y r1   r2   rV   s       r6   rY   zRenderStage2d.draw_lineœ   s   € ØILr8   c                 ó   — y r1   r2   r[   s      r6   r]   zRenderStage2d.draw_solid_linesŸ   rF   r8   c                 ó   — y r1   r2   r_   s      r6   ra   zRenderStage2d.draw_path¤   s   € ØADr8   c                 ó   — y r1   r2   rc   s      r6   re   zRenderStage2d.draw_filled_paths§   rf   r8   c                 ó   — y r1   r2   rh   s      r6   rj   z!RenderStage2d.draw_filled_polygon®   rF   r8   c                 ó   — y r1   r2   rq   s      r6   rs   zRenderStage2d.draw_image³   rt   r8   Nr…   ©rR   r   rS   r&   rƒ   r„   ©rW   r   rX   r   rS   r&   ©r\   zlist[tuple[Vec2, Vec2]]rS   r&   rƒ   r„   ©r`   r   rS   r&   ©rd   zlist[BkPath2d]rS   r&   rƒ   r„   ©ri   r   rS   r&   rƒ   r„   r–   )rš   r›   rœ   r¡   r<   r¢   r£   rT   rY   r]   ra   re   rj   rs   r2   r8   r6   r¥   r¥   “   sù   … ØÓóð 	×ÑÚHó ØHà×ÑÚLó ØLà×ÑðØ,ðØ:Dðà	òó ðð 	×ÑÚDó ØDà×Ñðàðð ðð 
ò	ó ðð 	×ÑðØ ðØ.8ðà	òó ðð 	×ÑÚTó ÙTr8   r¥   c                  ó*  — e Zd Z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%d„Zd&d„Z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	 	 	 	 	 	 d0d„Z	 	 	 	 	 	 d1d„Zd2d„Zy)3r-   z Render pipeline for 2D backends.c                ó.  — || _         t        «       | _        	 t        j                  j                  d«      | _        t        «       | _	        d| _
        d| _        t        «       | _        | j                  «       | _        y # t        j                  $ r Y ŒWw xY w)NÚ ç      ð?)Úbackendr#   r;   r   Úfont_managerÚget_font_facer    ÚFontNotFoundErrorr   Úclipping_portalÚcurrent_vp_scaleÚ_current_entity_handleÚdictÚ_color_mappingÚbuild_render_pipelineÚ	_pipeline)r4   r¹   s     r6   Ú__init__zRenderPipeline2d.__init__º   s�   € ØˆŒÜ#“oˆŒð	Ü%*×%7Ñ%7×%EÑ%EÀbÓ%IˆDÔ"ô  .Ó/ˆÔØ #ˆÔØ+-ˆÔ#Ü.2«fˆÔØ×3Ñ3Ó5ˆ�øô ×&Ñ&ò 	áð	ús   ˜$A> Á>BÂBc                óÐ   — t        | j                  | j                  ¬«      }t        | j                  | j
                  |¬«      }t        | j                  | j                  |¬«      }|S )N)Ú	converter)Úget_ltype_scaler¦   )r¦   )ÚBackendStage2dr¹   Úget_backend_propertiesÚLinetypeStage2dr;   Úget_vp_ltype_scaleÚClippingStage2dr½   )r4   Úbackend_stageÚlinetype_stageÚclipping_stages       r6   rÂ   z&RenderPipeline2d.build_render_pipelineÈ   s_   € Ü&Ø�L‰L D×$?Ñ$?ô
ˆô )Ø�K‰KØ ×3Ñ3Ø$ô
ˆô
 )Ø�K‰K˜×-Ñ-¸.ô
ˆð Ðr8   c                ó4   — dt        | j                  d«      z  S )zmThe linetype pattern should look the same in all viewports
        regardless of the viewport scale.
        r¸   g-Cëâ6?)Úmaxr¾   rH   s    r6   rË   z#RenderPipeline2d.get_vp_ltype_scaleÖ   s   € ð ”S˜×.Ñ.°Ó7Ñ7Ð7r8   c                ór  — 	 | j                   |j                     }t        ||j                  |j                  |j                  | j                  «      S # t        $ r[ t        |j                  | j                  j
                  | j                  j                  «      }|| j                   |j                  <   Y Œšw xY wr1   )rÁ   ry   ÚKeyErrorÚapply_color_policyr;   Úcolor_policyÚcustom_fg_colorr$   Ú
lineweightÚlayerÚpenr¿   )r4   rS   ry   s      r6   rÉ   z'RenderPipeline2d.get_backend_propertiesÜ   s¥   € ð	:Ø×'Ñ'¨
×(8Ñ(8Ñ9ˆEô !ØØ×!Ñ!Ø×ÑØ�N‰NØ×'Ñ'ó
ð 	
øô ò 	:Ü&Ø× Ñ  $§+¡+×":Ñ":¸D¿K¹K×<WÑ<WóˆEð 5:ˆD×Ñ 
× 0Ñ 0Ó1ð		:ús   ‚A ÁA!B6Â5B6c                ó   — || _         y r1   )r/   r3   s     r6   r7   z+RenderPipeline2d.set_draw_entities_callbackì   s
   € Ø%ˆÕr8   c                ó¶   — | j                   j                  |«       || _        | j                  }	 |j	                  |«       t        |d«      sy |j                  }Œ+)Nr¦   )r¹   Ú	configurer;   rÃ   r<   Úhasattrr¦   )r4   r;   Ústages      r6   r<   zRenderPipeline2d.set_configï   sR   € Ø�‰×Ñ˜vÔ&ØˆŒØ—‘ˆØØ×Ñ˜VÔ$Ü˜5 ,Ô/ØØ×$Ñ$ˆEð	 r8   c                ó   — |€J ‚|| _         y r1   )r¿   r>   s     r6   r@   z*RenderPipeline2d.set_current_entity_handleù   s   € ØÐ!Ð!Ð!Ø&,ˆÕ#r8   c                ó<   — | j                   j                  ||«       y r1   )r½   ÚpushrB   s      r6   rE   z$RenderPipeline2d.push_clipping_shapeý   s   € ð 	×Ñ×!Ñ! %¨Õ3r8   c                ó8   — | j                   j                  «        y r1   )r½   ÚpoprH   s    r6   rI   z#RenderPipeline2d.pop_clipping_shape  s   € Ø×Ñ× Ñ Õ"r8   Nc                ó*  — |j                   €y	 |j                  «       }| j                  |«      rU| j	                  |j                  |«      t        |j                   j                  «       ||«      «       | j                  «        yy# t        $ r Y yw xY wrK   )	ÚdocÚget_modelspace_limitsÚ
ValueErrorÚenter_viewportr/   Úfrom_viewportÚfilter_vp_entitiesÚ
modelspaceÚexit_viewport)r4   rL   rM   rN   Ú
msp_limitss        r6   rO   zRenderPipeline2d.draw_viewport  s�   € ð �6‰6ˆ>Øð	Ø×1Ñ1Ó3ˆJð ×Ñ˜rÔ"Ø×ÑØ×(Ñ(¨Ó,Ü" 2§6¡6×#4Ñ#4Ó#6¸
ÀJÓOôð ×ÑÕ ð #øô ò 	Ùð	ús   �B Â	BÂBc                óÀ  — |j                  «       | _        |j                  «       }t        |«      }t	        |«      r£|j                  «       }|j                  r_|j                  «       }t        |t        «      r?|j                  j                  dd«      }|dk(  rdnd}t        |j                  |«      «      }t        |«      }| j                  j!                  ||«       yy)z;Set current viewport, returns ``True`` for valid viewports.Úplot_paper_unitsr   r   g�@ p?gš™™™™™¹?TF)Ú	get_scaler¾   Úget_transformation_matrixr   ÚlenÚcontrol_verticesÚ
has_curvesÚ
get_layoutÚ
isinstancer   ÚdxfÚgetÚlistÚ
flatteningr   r½   rá   )	r4   rL   ÚmÚclipping_pathÚverticesÚlayoutÚunitsÚmax_sagittaÚclipping_shapes	            r6   rè   zRenderPipeline2d.enter_viewport  sº   € à "§¡£ˆÔØ×(Ñ(Ó*ˆÜ! "›ˆÜˆ}ÔØ$×5Ñ5Ó7ˆHØ×'Ò'ØŸ™›�Ü˜f¤fÔ-ð
 #ŸJ™JŸN™NÐ+=¸qÓA�EØ16¸!²¡+À�KÜ# M×$<Ñ$<¸[Ó$IÓJ�HÜ5°hÓ?ˆNØ× Ñ ×%Ñ% n°aÔ8ØØr8   c                óF   — | j                   j                  «        d| _        y )Nr¸   )r½   rã   r¾   rH   s    r6   rì   zRenderPipeline2d.exit_viewport/  s   € Ø×Ñ× Ñ Ô"à #ˆÕr8   c                ó¦  — | j                   j                  }| j                  }|j                  «       r|t        j
                  k(  ryt        ||«      }|j                  }|€| j                  }	 | j                  j                  |||«      }	|	D ]  }
|
j                  |«       Œ |	}|t        j                  k(  rvg }|D ]!  }
|j                  |
j!                  «       «       Œ# t#        |«      dk  ryt%        j&                  t)        |«      j+                  «       «      }|j-                  ||«       y|t        j.                  k(  r‡g }|D ]!  }
|j                  |
j!                  «       «       Œ# t#        |«      dk  ryt1        t)        |«      j+                  «       «      }|j2                  €t5        «       |_        |j7                  ||«       y| j                  j9                  |«      s|t        j:                  k(  r|D ]  }|j-                  ||«       Œ y|j2                  €t5        «       |_        |j=                  ||«       y# t        t        f$ r Y yw xY w)zRender text as filled paths.Né   )r;   Útext_policyrÃ   Ústripr!   ÚIGNOREÚprepare_string_for_renderingÚfontr    rž   Úget_text_glyph_pathsÚRuntimeErrorrç   Útransform_inplaceÚREPLACE_RECTÚextendÚextentsrò   r   Úfrom_verticesr   Úrect_verticesra   ÚREPLACE_FILLr   Úfillingr%   rj   Úis_stroke_fontÚOUTLINEre   )r4   rl   rD   rS   rm   rn   r  ÚpipelineÚ	font_faceÚglyph_pathsÚpÚtransformed_pathsri   ÚrectÚpolygonÚ	text_paths                   r6   ro   zRenderPipeline2d.draw_text4  s  € ð —k‘k×-Ñ-ˆØ—>‘>ˆà�z‰zŒ|˜{¬j×.?Ñ.?Ò?ØÜ+¨D°'Ó:ˆØ—O‘Oˆ	ØÐØ×.Ñ.ˆIð	Ø×*Ñ*×?Ñ?Ø�i óˆKó
 ˆAØ×Ñ 	Õ*ð à,7Ðð œ*×1Ñ1Ò1ØˆFÛ&�Ø—‘˜aŸi™i›kÕ*ð 'ä�6‹{˜QŠØÜ×)Ñ)¬-¸Ó*?×*MÑ*MÓ*OÓPˆDØ×Ñ˜t ZÔ0ØØœ*×1Ñ1Ò1ØˆFÛ&�Ø—‘˜aŸi™i›kÕ*ð 'ä�6‹{˜QŠØÜ ¤¨vÓ!6×!DÑ!DÓ!FÓGˆGØ×!Ñ!Ð)Ü%,£Y�
Ô"Ø×(Ñ(¨°*Ô=Øð ×Ñ×+Ñ+¨IÔ6Øœj×0Ñ0Ò0ã.�	Ø×"Ñ" 9¨jÕ9ð /àà×ÑÐ%Ü!(£ˆJÔØ×"Ñ"Ð#4°jÕAøôM œjÐ)ò 	Ùð	ús   Á.H> È>IÉIc                ó8   — | j                   j                  «        y r1   )r¹   rv   rH   s    r6   rv   zRenderPipeline2d.finalizes  s   € Ø�‰×ÑÕr8   c                ó:   — | j                   j                  |«       y r1   )r¹   rz   rx   s     r6   rz   zRenderPipeline2d.set_backgroundv  s   € Ø�‰×#Ñ# EÕ*r8   c                ó<   — | j                   j                  ||«       y r1   )r¹   r~   r|   s      r6   r~   zRenderPipeline2d.enter_entityy  s   € Ø�‰×!Ñ! &¨*Õ5r8   c                ó:   — | j                   j                  |«       y r1   )r¹   r�   r€   s     r6   r�   zRenderPipeline2d.exit_entity|  s   € Ø�‰× Ñ  Õ(r8   c                óN   — | j                   j                  t        |«      |«       y r1   )rÃ   rT   r   rQ   s      r6   rT   zRenderPipeline2d.draw_point€  s   € Ø�‰×!Ñ!¤$ s£)¨ZÕ8r8   c                ób   — | j                   j                  t        |«      t        |«      |«       y r1   )rÃ   rY   r   rV   s       r6   rY   zRenderPipeline2d.draw_lineƒ  s    € Ø�‰× Ñ ¤ e£¬d°3«i¸ÕDr8   c           
     ó–   — | j                   j                  |D ��cg c]  \  }}t        |«      t        |«      f‘Œ c}}|«       y c c}}w r1   )rÃ   r]   r   )r4   r\   rS   ÚsÚes        r6   r]   z!RenderPipeline2d.draw_solid_lines†  s>   € ð 	�‰×'Ñ'Ù,1Ô2©E¡D A qŒd�1‹g”t˜A“wÒ¨EÒ2°Jõ	
ùÛ2s   › A
c                óN   — | j                   j                  t        |«      |«       y r1   )rÃ   ra   r   r_   s      r6   ra   zRenderPipeline2d.draw_path�  s   € Ø�‰× Ñ ¤¨$£°Õ<r8   c                ój   — | j                   j                  t        t        t        |«      «      |«       y r1   )rÃ   re   rù   Úmapr   rc   s      r6   re   z"RenderPipeline2d.draw_filled_paths�  s$   € ð
 	�‰×(Ñ(¬¬c´(¸EÓ.BÓ)CÀZÕPr8   c                óN   — | j                   j                  t        |«      |«       y r1   )rÃ   rj   r   rh   s      r6   rj   z$RenderPipeline2d.draw_filled_polygon—  s   € ð 	�‰×*Ñ*¬:°fÓ+=¸zÕJr8   c                ó<   — | j                   j                  ||«       y r1   )rÃ   rs   rq   s      r6   rs   zRenderPipeline2d.draw_imageœ  s   € Ø�‰×!Ñ! *¨jÕ9r8   )r¹   r   )rƒ   r¥   )rƒ   r•   )rS   r&   rƒ   r$   r‚   r…   r†   rˆ   r‰   r1   rŠ   )rL   r   rƒ   Úboolr’   r”   r—   r˜   r™   rŒ   r�   rŽ   r�   r�   r‘   r–   )rš   r›   rœ   r�   rÄ   rÂ   rË   rÉ   r7   r<   r@   rE   rI   rO   rè   rì   ro   rv   rz   r~   r�   rT   rY   r]   ra   re   rj   rs   r2   r8   r6   r-   r-   ·   s\  „ Ù*ó6óó8ó
ó &ó%ó-ð4Ø"ð4Ø/>ð4à	ó4ó
#ð 26ð	!àð!ð "ð!ð /ð	!ð
 
ó!ó(ò,$ð ð=Bàð=Bð ð=Bð ð	=Bð
 ð=Bð ð=Bð 
ó=Bó~ ó+ó6ó)ó9óEð
Ø4ð
ØBLð
à	ó
ó=ðQàðQð ðQð 
ó	QðKØ&ðKØ4>ðKà	óKô
:r8   c                  ó�   — e Z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y)rÌ   c                ó.   — || _         || _        || _        y r1   )r½   r;   r¦   )r4   r;   r½   r¦   s       r6   rÄ   zClippingStage2d.__init__¡  s   € ð  /ˆÔØˆŒØ$ˆ�r8   c                ó   — || _         y r1   )r;   r:   s     r6   r<   zClippingStage2d.set_config«  s	   € Øˆ�r8   c                ó¤   — | j                   j                  r| j                   j                  |«      }|€y | j                  j	                  ||«       y r1   )r½   Ú	is_activeÚ
clip_pointr¦   rT   rQ   s      r6   rT   zClippingStage2d.draw_point®  sC   € Ø×Ñ×)Ò)Ø×&Ñ&×1Ñ1°#Ó6ˆCØˆ{ØØ�‰×"Ñ" 3¨
Õ3r8   c                óÔ   — | j                   }| j                  }|j                  r1|j                  ||«      D ]  }|j	                  |d   |d   |«       Œ y |j	                  |||«       y )Nr   r   )r¦   r½   r1  Ú	clip_linerY   )r4   rW   rX   rS   r¦   r½   Úsegments          r6   rY   zClippingStage2d.draw_lineµ  sf   € Ø—_‘_ˆ
Ø×.Ñ.ˆà×$Ò$Ø*×4Ñ4°U¸CÖ@�Ø×$Ñ$ W¨Q¡Z°¸±¸ZÕHð AàØ×Ñ˜U C¨Õ4r8   c                óÊ   — | j                   }|j                  r/g }|D ]&  \  }}|j                  |j                  ||«      «       Œ( |}| j                  j                  ||«       y r1   )r½   r1  r  r4  r¦   r]   )r4   r\   rS   r½   Úcropped_linesrW   rX   s          r6   r]   z ClippingStage2d.draw_solid_lines¿  s_   € ð ×.Ñ.ˆà×$Ò$Ø57ˆMÛ#‘
��sØ×$Ñ$ _×%>Ñ%>¸uÀcÓ%JÕKð $à!ˆEØ�‰×(Ñ(¨°
Õ;r8   c                óò   — | j                   }| j                  }| j                  j                  }|j                  r+|j                  |g|«      D ]  }|j                  ||«       Œ y |j                  ||«       y r1   )r½   r¦   r;   Úmax_flattening_distancer1  Ú
clip_pathsra   )r4   r`   rS   r½   r¦   r   Úclipped_paths          r6   ra   zClippingStage2d.draw_pathË  sk   € Ø×.Ñ.ˆØ—_‘_ˆ
Ø—k‘k×9Ñ9ˆà×$Ò$Ø /× :Ñ :¸D¸6À;Ö O�Ø×$Ñ$ \°:Õ>ð !PàØ×Ñ˜T :Õ.r8   c                óÚ   — | j                   }| j                  j                  }|j                  r|j	                  ||«      }t        |«      dk(  ry | j                  j                  ||«       y ©Nr   )r½   r;   r9  r1  Úclip_filled_pathsrò   r¦   re   )r4   rd   rS   r½   r   s        r6   re   z!ClippingStage2d.draw_filled_pathsÖ  s[   € ð
 ×.Ñ.ˆØ—k‘k×9Ñ9ˆà×$Ò$Ø#×5Ñ5°e¸[ÓIˆEÜˆu‹:˜Š?ØØ�‰×)Ñ)¨%°Õ<r8   c                óþ   — | j                   }| j                  }|j                  r8|j                  |«      D ]#  }t	        |«      dkD  sŒ|j                  ||«       Œ% y t	        |«      dkD  r|j                  ||«       y y r=  )r½   r¦   r1  Úclip_polygonrò   rj   )r4   ri   rS   r½   r¦   s        r6   rj   z#ClippingStage2d.draw_filled_polygonä  st   € Ø×.Ñ.ˆØ—_‘_ˆ
à×$Ò$Ø)×6Ñ6°vÖ>�Ü�v“; “?Ø×2Ñ2°6¸:ÕFð ?ð äˆv‹;˜Š?Ø×*Ñ*¨6°:Õ>ð r8   c           	     óÌ  — g }| j                   }|j                  s| j                  |||«       y |j                  «       |j                  z  }|j
                  }t        |||«      }|j                  sH|j                  «       \  }}	t        t        j                  d|df||	fd|	fg«      «      }
t        ||
|«      }|j                  |j                  «      |_        t        |«      dk(  r5|d   }||j
                  ur||_        d|_        | j                  |||«       y |D ]D  }| j                  t        |j                   j#                  «       |j                  |d¬«      ||«       ŒF y )N)r   r   r   r   T)ÚimagerD   Úpixel_boundary_pathÚuse_clipping_boundary)r½   r1  Ú_draw_imageÚflip_matrixrD   rC  Ú_clip_image_polygonÚremove_outsideÚ
image_sizer   r   ÚgenerateÚtransform_matrixrò   rD  r   rB  Úcopy)r4   rr   rS   Úouter_boundsr½   rD   rC  Úclipping_pathsÚwidthÚheightÚouter_boundaryÚnew_clipping_pathrü   s                r6   rs   zClippingStage2d.draw_imageñ  sv  € ð *,ˆØ×.Ñ.ˆà×(Ò(Ø×Ñ˜Z¨°zÔBØð ×*Ñ*Ó,¨z×/CÑ/CÑCˆ	Ø(×<Ñ<ÐÜ,ØÐ0°)ó
ˆð ×(Ò(ð '×1Ñ1Ó3‰MˆE�6Ü'Ü—‘˜v¨¨q z°E¸6°?ÀQÈÀKÐPÓQóˆNô /Ø °óˆLð  /×?Ñ?À
×@TÑ@TÓUˆ
ÔÜˆ~Ó !Ò#Ø .¨qÑ 1ÐØ ¨
×(FÑ(FÑFØ1B�
Ô.à37�
Ô0Ø×Ñ˜Z¨°zÕBã!/�ð × Ñ ÜØ(×.Ñ.×3Ñ3Ó5Ø",×"6Ñ"6Ø,9Ø.2ô	ð !Øõ	ñ	 "0r8   c                ól   — |j                   rt        ||«       | j                  j                  ||«       y r1   )rD  Ú_mask_imager¦   rs   )r4   rr   rM  rS   s       r6   rE  zClippingStage2d._draw_image$  s+   € ð ×+Ò+Ü˜
 LÔ1Ø�‰×"Ñ" :¨zÕ:r8   N)r;   r#   r½   r   r¦   r¥   r…   r¯   r°   r±   r²   r³   r´   r–   )rr   r   rM  úlist[BkPoints2d]rS   r&   rƒ   r„   )rš   r›   rœ   rÄ   r<   rT   rY   r]   ra   re   rj   rs   rE  r2   r8   r6   rÌ   rÌ      s«   „ ð%àð%ð (ð%ð "ó	%óó4ó5ð
<Ø,ð
<Ø:Dð
<à	ó
<ó	/ð=àð=ð ð=ð 
ó	=ó?ó1ðf;àð;ð 'ð;ð ð	;ð
 
ô;r8   rÌ   c                  óˆ   — e Z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y)rÊ   c                ó|   — || _         d| _        || _        || _        t	        «       | _        | j                  |«       y )NF)r;   Úsolid_lines_onlyr¦   rÇ   rÀ   Úpattern_cacher<   )r4   r;   rÇ   r¦   s       r6   rÄ   zLinetypeStage2d.__init__0  s8   € ð ˆŒØ %ˆÔØ$ˆŒØ.ˆÔÜ@DÃˆÔØ�‰˜Õr8   c                óV   — || _         |j                  t        j                  k(  | _        y r1   )r;   Úline_policyr    ÚSOLIDrX  r:   s     r6   r<   zLinetypeStage2d.set_config=  s"   € ØˆŒØ &× 2Ñ 2´j×6FÑ6FÑ FˆÕr8   c                óö   — | j                   rd}n|j                  | j                  «       z  }|j                  |f}| j                  j                  |«      }|€!| j                  ||«      }|| j                  |<   |S )z2Returns simplified linetype tuple: on-off sequenceç        )rX  Úlinetype_scalerÇ   Úlinetype_namerY  rø   Ú_create_pattern)r4   rS   ÚscaleÚkeyÚpattern_s        r6   ÚpatternzLinetypeStage2d.patternA  s|   € à× Ò Ø‰Eà×-Ñ-°×0DÑ0DÓ0FÑFˆEà%×3Ñ3°UÐ;ˆØ×%Ñ%×)Ñ)¨#Ó.ˆØÐØ×+Ñ+¨J¸Ó>ˆHØ&.ˆD×Ñ˜sÑ#Øˆr8   c                ó*  — t        |j                  «      dk  r
t        «       S | j                  j                  | j                  «       z  }|j                  D �cg c]  }t        ||z  |«      ‘Œ }}t        |«      dz  r|j                  «        |S c c}w ©Nr  )rò   Úlinetype_patternÚtupler;   Úmin_dash_lengthrÇ   rÑ   rã   )r4   rS   rb  rj  r&  re  s         r6   ra  zLinetypeStage2d._create_patternO  s€   € Üˆz×*Ñ*Ó+¨aÒ/ä“7ˆNàŸ+™+×5Ñ5¸×8LÑ8LÓ8NÑNˆØ<F×<WÒ<WÓXÑ<W°q”3�q˜5‘y /Õ2Ð<WˆÐXÜˆw‹<˜!ÒØ�K‰KŒMØˆùò Ys   ÁBc                ó<   — | j                   j                  ||«       y r1   )r¦   rT   rQ   s      r6   rT   zLinetypeStage2d.draw_pointZ  s   € Ø�‰×"Ñ" 3¨
Õ3r8   c                óz  — t        |«      }t        |«      }| j                  }| j                  st        |j                  «      dk  r|j                  |||«       y t        j                  | j                  |«      «      }|j                  |j                  ||«      D ��cg c]	  \  }}||f‘Œ c}}|«       y c c}}w rg  )r   r¦   rX  rò   rh  rY   r   ÚLineTypeRendererre  r]   Úline_segment)r4   rW   rX   rS   r%  r&  r¦   Úrenderers           r6   rY   zLinetypeStage2d.draw_line]  s£   € Ü�‹KˆÜ�‹IˆØ—_‘_ˆ
à× Ò ¤C¨
×(CÑ(CÓ$DÀqÒ$HØ× Ñ   A zÔ2Øä×-Ñ-¨d¯l©l¸:Ó.FÓGˆØ×#Ñ#Ø (× 5Ñ 5°a¸Ô ;Ô<Ñ ;™˜˜1ˆa�ŠVÐ ;Ò<Øõ	
ùÛ<s   ÂB7
c                ó<   — | j                   j                  ||«       y r1   )r¦   r]   r[   s      r6   r]   z LinetypeStage2d.draw_solid_linesl  s   € ð 	�‰×(Ñ(¨°
Õ;r8   c           
     ó¼  — | j                   }| j                  st        |j                  «      dk  r|j	                  ||«       y t        j                  | j                  |«      «      }|j                  | j                  j                  d¬«      }|j                  |j                  |«      D ��cg c]  \  }}t        |«      t        |«      f‘Œ c}}|«       y c c}}w )Nr  é   )Úsegments)r¦   rX  rò   rh  ra   r   rm  re  rú   r;   r9  r]   Úline_segmentsr   )r4   r`   rS   r¦   ro  rý   r%  r&  s           r6   ra   zLinetypeStage2d.draw_pathq  s³   € Ø—_‘_ˆ
à× Ò ¤C¨
×(CÑ(CÓ$DÀqÒ$HØ× Ñ   zÔ2Øä×-Ñ-¨d¯l©l¸:Ó.FÓGˆØ—?‘? 4§;¡;×#FÑ#FÐQS�?ÓTˆØ×#Ñ#Ø,4×,BÑ,BÀ8Ô,LÔMÑ,L¡D A qŒd�1‹g”t˜A“wÒÐ,LÒMØõ	
ùÛMs   Â. C
c                ó<   — | j                   j                  ||«       y r1   )r¦   re   rc   s      r6   re   z!LinetypeStage2d.draw_filled_paths  s   € ð
 	�‰×)Ñ)¨%°Õ<r8   c                ó<   — | j                   j                  ||«       y r1   )r¦   rj   rh   s      r6   rj   z#LinetypeStage2d.draw_filled_polygon†  s   € Ø�‰×+Ñ+¨F°JÕ?r8   c                ó<   — | j                   j                  ||«       y r1   )r¦   rs   rq   s      r6   rs   zLinetypeStage2d.draw_image‰  s   € Ø�‰×"Ñ" :¨zÕ:r8   N)r;   r#   rÇ   zCallable[[], float]r¦   r¥   r…   )rS   r&   rƒ   úSequence[float])rS   r&   rb  r•   rƒ   rx  r¯   r°   r±   r²   r³   r´   r–   )rš   r›   rœ   rÄ   r<   re  ra  rT   rY   r]   ra   re   rj   rs   r2   r8   r6   rÊ   rÊ   /  s‹   „ ð àð ð -ð ð "ó	 óGóó	ó4ó
ð<Ø,ð<Ø:Dð<à	ó<ó

ð=àð=ð ð=ð 
ó	=ó@ô;r8   rÊ   c                  óp   — e Zd Z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y
)rÈ   z Send data to the output backend.c                óF   — || _         || _        t        | d«      rJ d«       ‚y )Nr¦   zhas to be the last render stage)r¹   rÆ   rÝ   )r4   r¹   rÆ   s      r6   rÄ   zBackendStage2d.__init__�  s+   € ð
 ˆŒØ"ˆŒÜ˜4 Ô.ÐQÐ0QÓQÐ.Ð.r8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   rT   rÆ   rQ   s      r6   rT   zBackendStage2d.draw_point™  s   € Ø�‰×Ñ  T§^¡^°JÓ%?Õ@r8   c                ó\   — | j                   j                  ||| j                  |«      «       y r1   )r¹   rY   rÆ   rV   s       r6   rY   zBackendStage2d.draw_lineœ  s!   € Ø�‰×Ñ˜u c¨4¯>©>¸*Ó+EÕFr8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   r]   rÆ   r[   s      r6   r]   zBackendStage2d.draw_solid_linesŸ  s!   € ð 	�‰×%Ñ% e¨T¯^©^¸JÓ-GÕHr8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   ra   rÆ   r_   s      r6   ra   zBackendStage2d.draw_path¤  s   € Ø�‰×Ñ˜t T§^¡^°JÓ%?Õ@r8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   re   rÆ   rc   s      r6   re   z BackendStage2d.draw_filled_paths§  s!   € ð
 	�‰×&Ñ& u¨d¯n©n¸ZÓ.HÕIr8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   rj   rÆ   rh   s      r6   rj   z"BackendStage2d.draw_filled_polygon®  s   € Ø�‰×(Ñ(¨°·±À
Ó1KÕLr8   c                óZ   — | j                   j                  || j                  |«      «       y r1   )r¹   rs   rÆ   rq   s      r6   rs   zBackendStage2d.draw_image±  s   € Ø�‰×Ñ 
¨D¯N©N¸:Ó,FÕGr8   N)r¹   r   rÆ   z)Callable[[Properties], BackendProperties]r¯   r°   r±   r²   r³   r´   r–   )rš   r›   rœ   r�   rÄ   rT   rY   r]   ra   re   rj   rs   r2   r8   r6   rÈ   rÈ   �  sƒ   „ Ù*ðRà!ðRð =óRóAóGðIØ,ðIØ:DðIà	óIó
AðJàðJð ðJð 
ó	JóMôHr8   rÈ   c                ó   — | j                   j                  «       D �cg c]  }|j                  |j                  f‘Œ }}t        j
                  j                  d| j                  «       d«      }t        j                  j                  |«      j                  |ddd¬«       t        j                  |«      }| j                  sç|r´t        j
                  j                  d| j                  «       d«      }|D ]g  }|j                  «       D �cg c]  }|j                  |j                  f‘Œ }}t        j                  j                  |«      j                  |ddd¬«       Œi t        j                  |«      |z
  }n1t        j                  |j                  d|j                  ¬«      }||z
  }| j                   dd…dd…dfxx   |z  cc<   yc c}w c c}w )a
  Mask away the clipped parts of the image. The argument `outer_bounds` is only
    used for clip mode "remove_inside". The outer bounds can be composed of multiple
    parts. If `outer_bounds` is empty the image has no removed parts and is fully
    visible before applying the image clipping path.

    Args:
        image_data:
            image_data.pixel_boundary: path contains the image clipping path
            image_data.remove_outside: defines the clipping mode (inside/outside)
        outer_bounds: countain the parts of the image which are __not__ removed by
            clipping through viewports or clipped block references
            e.g. an image without any removed parts has the outer bounds
            [(0, 0) (width, 0), (width, height), (0, height)]

    ÚLr   Nr   )ÚoutlinerO  Úfill)Ú
fill_valueÚdtypeé   )rC  rý   ÚxÚyÚPILÚImageÚnewrI  Ú	ImageDrawr  ÚnpÚasarrayrH  ÚfullrC   r‡  rB  )	rr   rM  r  r@  Úclipping_imageÚclipping_maskÚvisible_imageÚboundaryÚfully_visible_image_masks	            r6   rT  rT  µ  s‡  € ð  )3×(FÑ(F×(OÑ(OÔ(QÓRÑ(Q 1�Q—S‘S˜!Ÿ#™#’JÐ(Q€LÐRä—Y‘Y—]‘] 3¨
×(=Ñ(=Ó(?ÀÓC€Nä‡M�M×Ñ˜NÓ+×3Ñ3Ø˜d¨!°!ð 4ô ô —J‘J˜~Ó.€Mà×$Ò$ÙäŸI™IŸM™M¨#¨z×/DÑ/DÓ/FÈÓJˆMã(�Ø4<×4EÑ4EÔ4GÓHÑ4G¨q §¡ a§c¡c¢
Ð4G�ÐHÜ—‘×'Ñ'¨Ó6×>Ñ>Ø ¨$°a¸að ?õ ð )ô ŸJ™J }Ó5¸ÑE‰Mô (*§w¡wØ×#Ñ#°¸×9LÑ9Lô(Ð$ð 5°}ÑDˆMØ×Ñ’Qš˜1�WÓ Ñ.Ôùò9 Sùò  Is   �GÄGc                ó4  — |g}| j                  |«      }	 |j                  «        |j                  «       }|j	                  |«       | j                  |«      }t        |«      dk(  r	|d   |u r|S |D ]  }|j	                  |«       Œ |S # t        $ r |cY S w xY w)Nr   r   )rK  ÚinverseÚZeroDivisionErrorÚcloner  r@  rò   )r½   Ú
polygon_pxrû   Úoriginalr˜  r  Úclipped_polygonss          r6   rG  rG  ä  s¯   € ð ˆ|€Hð ×.Ñ.¨qÓ1€GðØ�‰Ôð ×ÑÓ €GØ×Ñ˜aÔ à&×3Ñ3°GÓ<ÐÜÐÓ Ò"Ð)9¸!Ñ)<ÀÑ)Gàˆã#ˆØ×!Ñ! 'Õ*ð $àÐøô ò àŠðús   –B	 Â	BÂBc                ó|   — t        j                  | «      \  }}}t        d|z
  d|z
  d|z
  «      j                  «       S )Néÿ   )r   Úfrom_hexÚto_hex)ry   ÚrÚgÚbs       r6   Úinvert_colorr¥  ÿ  s:   € Ü�l‰l˜5Ó!�G€A€qˆ!Üˆs�Q‰w˜˜a™  q¡Ó)×0Ñ0Ó2Ð2r8   c                ó>   — | j                  «       } | dk(  ry| dk(  ry| S )Nú#000000ú#ffffff)Úlower)ry   s    r6   Úswap_bwrª    s(   € Ø�K‰K‹M€EØ�	ÒØØ�	ÒØØ€Lr8   c                ó¼   — t        j                  | «      j                  |z  |z   }|dk  rd}n|dkD  rd}t        |dz  «      }t        |||«      j	                  «       S )Nr^  r¸   rŸ  )r   r   Ú	luminanceÚroundr¡  )ry   rb  ÚoffsetÚlumÚgrays        r6   Úcolor_to_monochromer±    s^   € Ü
�,‰,�uÓ
×
'Ñ
'¨%Ñ
/°&Ñ
8€CØ
ˆS‚yØ‰Ø	ˆsŠØˆÜ��s‘Ó€DÜˆt�T˜4Ó ×'Ñ'Ó)Ð)r8   c                ó0  — | dd }| d d } |t         j                  k(  rt        | «      } | |z   S |t         j                  k(  rt	        | «      } | |z   S |t         j
                  k(  rt        | dd¬«      } | |z   S |t         j                  k(  rt        | dd¬«      } | |z   S |t         j                  k(  rt        | «      } | |z   S |t         j                  k(  rd} | |z   S |t         j                  k(  rd} | |z   S |t         j                  k(  r|}|d d } |dd }| |z   S )	Né   é	   gffffffæ?g333333Ó?)rb  r®  r^  r§  r¨  )r"   ÚCOLOR_SWAP_BWrª  ÚCOLOR_NEGATIVEr¥  ÚMONOCHROME_DARK_BGr±  ÚMONOCHROME_LIGHT_BGÚ
MONOCHROMEÚBLACKÚWHITEÚCUSTOM)ry   ÚpolicyÚcustom_colorÚalphaÚfgs        r6   rÔ   rÔ     sR  € Ø�!�AˆJ€EØ�"�1ˆI€EØ”×*Ñ*Ò*Ü˜“ˆð" �5‰=Ðð! 
”;×-Ñ-Ò	-Ü˜UÓ#ˆð �5‰=Ðð 
”;×1Ñ1Ò	1Ü# E°¸SÔAˆð �5‰=Ðð 
”;×2Ñ2Ò	2Ü# E°¸SÔAˆð �5‰=Ðð 
”;×)Ñ)Ò	)Ü# EÓ*ˆð �5‰=Ðð 
”;×$Ñ$Ò	$Øˆð �5‰=Ðð 
”;×$Ñ$Ò	$Øˆð
 �5‰=Ðð	 
”;×%Ñ%Ò	%ØˆØ�2�A�ˆØ�1�Q�ˆØ�5‰=Ðr8   c              #  óØ   ‡‡‡‡‡K  — ˆˆˆˆˆfd„}‰€| E d{  –—†  y|\  ŠŠŠŠ‰j                   s"t        j                  j                  | d‰¬«       | D ]  } ||«      sŒ|–— Œ y7 ŒO­w)a¬  Yields all DXF entities that need to be processed by the given viewport
    `limits`. The entities may be partially of even complete outside the viewport.
    By passing the bounding box cache of the modelspace entities,
    the function can filter entities outside the viewport to speed up rendering
    time.

    There are two processing modes for the `bbox_cache`:

        1. The `bbox_cache` is``None``: all entities must be processed,
           pass through mode
        2. If the `bbox_cache` is given but does not contain an entity,
           the bounding box is computed and added to the cache.
           Even passing in an empty cache can speed up rendering time when
           multiple viewports need to be processed.

    Args:
        msp: modelspace layout
        limits: modelspace limits of the viewport, as tuple (min_x, min_y, max_x, max_y)
        bbox_cache: the bounding box cache of the modelspace entities

    c                ó\  •— ‰j                  | «      }|€#t        j                  j                  | fd‰¬«      }|j                  sy‰|j
                  j                  k\  ry‰|j                  j                  k  ry‰|j
                  j                  k\  ry‰|j                  j                  k  ryy)NT©ÚfastÚcacheF)	rø   ÚezdxfÚbboxr  Úhas_dataÚextmaxr‰  ÚextminrŠ  )r&  Úentity_bboxrN   Úmax_xÚmax_yÚmin_xÚmin_ys     €€€€€r6   Ú
is_visiblez&filter_vp_entities.<locals>.is_visibleL  sŸ   ø€ Ø —n‘n QÓ'ˆØÐäŸ*™*×,Ñ,¨a¨T¸ÀJÐ,ÓOˆKØ×#Ò#Øà�K×&Ñ&×(Ñ(Ò(ØØ�K×&Ñ&×(Ñ(Ò(ØØ�K×&Ñ&×(Ñ(Ò(ØØ�K×&Ñ&×(Ñ(Ò(ØØr8   NTrÃ  )rÈ  rÆ  rÇ  r  )	ÚmspÚlimitsrN   rÐ  r}   rÌ  rÍ  rÎ  rÏ  s	     `  @@@@r6   rê   rê   /  so   üè ø€ ÷:ð ð$ ÐØ�ˆØà!'Ñ€Eˆ5�%˜Ø×Òä�
‰
×Ñ˜3 T°ÐÔ<ãˆÙ�fÕØ‹Lñ ð 	ús   ‡A*˜A(™AA*Á!A*c                óÄ   — d| vsJ d«       ‚|dv r!t        | d¬«      } | j                  dd«      } | S |dk(  r!t        | d¬«      } | j                  dd	«      } | S t        |«      ‚)
NÚ
znot a single line of text>   r“   ÚATTDEFÚATTRIBÚ?)ÚreplacementÚ	ÚMTEXTu   â–¯z        )r   ÚreplaceÚ	TypeError)rl   rn   s     r6   r  r  l  s|   € Ø�tÑÐ8Ð8Ó8ÐØÐ.Ñ.Ü/°À#ÔFˆØ�|‰|˜D #Ó&ˆð €Kð 
�GÒ	Ü/°À%ÔHˆØ�|‰|˜D *Ó-ˆð €Kô ˜Ó Ð r8   )rr   r   rM  rU  rƒ   r„   )r½   r   r›  r   rû   r   rƒ   rU  )ry   r(   rƒ   r(   )ry   r‡   rƒ   r(   )r¸   r^  )ry   r(   rb  r•   r®  r•   rƒ   r(   )ry   r(   r½  r"   r¾  r(   rƒ   r(   r1   )rÑ  r   rÒ  rx  rN   r‹   rƒ   zIterator[DXFGraphic])rl   r‡   rn   r‡   rƒ   r‡   )UÚ
__future__r   Útypingr   r   r   r   r   r	   Útyping_extensionsr
   r¢   Únumpyr�  Ú	PIL.Imager‹  ÚPIL.ImageDrawÚPIL.ImageOpsÚezdxf.colorsr   Ú
ezdxf.bboxrÆ  Úezdxf.fontsr   Ú
ezdxf.mathr   r   r   r   Ú
ezdxf.pathr   r   Úezdxf.renderr   Úezdxf.entitiesr   r   Úezdxf.tools.textr   Úezdxf.tools.clipping_portalr   r   r   Úezdxf.layoutsr   r¹   r   r   r   r   r;   r    r!   r"   r#   rS   r$   r%   r&   r'   Ú
type_hintsr(   Úunified_text_rendererr)   r‡   r•   r*   r¡   r+   Ú__all__ÚABCr,   r¥   r-   rÌ   rÊ   rÈ   rT  rG  r¥  rª  r±  rÔ   rê   r  r2   r8   r6   Ú<module>rò     s€  ðö #÷÷ õ (Û 
ã Û Û Û õ Û å ß <Ó <ß &Ý "ß /Ý =÷ñ õ
 !ß FÓ Fß FÓ Fß 2ß 1Ý Ý 6à˜c 5˜jÑ)€
ˆIÓ )Ø"*¨M¸8ÀJÑ;OÐ+PÐRVÐ+VÑ"WÐ �iÓ WàÐ1Ð
2€ô_;�s—w‘wô _;ôD!U�C—G‘Gô !UôHf:Ð'ô f:ôRL;�mô L;ô^[;�mô [;ô|%H�]ô %HóP,/ð^Ø#ðØ1;ðØ@Hðàóó63ó
ô*óð6 .2ð:Ø	ð:àð:ð +ð:ð ó	:ôz
r8   