
    'jG{                       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jF                  ZG G d dejF                  ZH G d deG          ZI G d deH          ZJ G d  d!eH          ZK G d" d#eH          ZLdLd*ZMdMd1ZNdNd4ZOdOd6ZPdPdQd<ZQdRd@ZR	 dSdTdHZSdUdKZTdS )V    )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                     e Zd ZU dZ e            Z ej                    Zde	d<   e
j        dBd            Ze
j        dCd
            Ze
j        dDd            Ze
j        dEd            Ze
j        dFd            Ze
j        	 dGdHd            Ze
j        dId             Ze
j        dJd#            Ze
j        dKd&            Ze
j        dLd)            Ze
j        dMd,            Ze
j        dNd/            Ze
j        	 dOdPd6            Ze
j        dQd9            Ze
j        dFd:            Ze
j        dRd=            Ze
j        dSd@            Ze
j        dTdA            ZdS )Ur,   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_entitiescallbackreturnNonec                    d S N selfr0   s     W/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/drawing/pipeline.pyset_draw_entities_callbackz+AbstractPipeline.set_draw_entities_callbackB   s    RURU    configr#   c                    d S r4   r5   r7   r;   s     r8   
set_configzAbstractPipeline.set_configE   s    9<r:   handlestrc                    d S r4   r5   r7   r?   s     r8   set_current_entity_handlez*AbstractPipeline.set_current_entity_handleH   s    >Acr:   shaper   	transformMatrix44 | Nonec                    d S r4   r5   r7   rD   rE   s      r8   push_clipping_shapez$AbstractPipeline.push_clipping_shapeK   	     sr:   c                    d S r4   r5   r7   s    r8   pop_clipping_shapez#AbstractPipeline.pop_clipping_shapeP   s    *-#r:   Nvpr   
layout_ctxr'   
bbox_cacheOptional[ezdxf.bbox.Cache]c                    dS z8Draw the content of the given viewport current viewport.Nr5   )r7   rN   rO   rP   s       r8   draw_viewportzAbstractPipeline.draw_viewportS   s	     	r:   posr   
propertiesr&   c                    d S r4   r5   r7   rU   rV   s      r8   
draw_pointzAbstractPipeline.draw_point]   s    GJsr:   startendc                    d S r4   r5   r7   rZ   r[   rV   s       r8   	draw_linezAbstractPipeline.draw_line`   s    MPSr:   linesIterable[tuple[AnyVec, AnyVec]]c                    d S r4   r5   r7   r_   rV   s      r8   draw_solid_linesz!AbstractPipeline.draw_solid_linesc   rJ   r:   pathr   c                    d S r4   r5   r7   rd   rV   s      r8   	draw_pathzAbstractPipeline.draw_pathh   s    =@Sr:   pathsIterable[Path]c                    d S r4   r5   r7   rh   rV   s      r8   draw_filled_pathsz"AbstractPipeline.draw_filled_pathsk   	    
 sr:   pointsIterable[AnyVec]c                    d S r4   r5   r7   rn   rV   s      r8   draw_filled_polygonz$AbstractPipeline.draw_filled_polygonr   rJ   r:   TEXTtextr   
cap_heightfloatdxftypec                    d S r4   r5   )r7   rt   rE   rV   ru   rw   s         r8   	draw_textzAbstractPipeline.draw_textw   s	     sr:   
image_datar   c                    d S r4   r5   r7   rz   rV   s      r8   
draw_imagezAbstractPipeline.draw_image       QTQTr:   c                    d S r4   r5   rL   s    r8   finalizezAbstractPipeline.finalize   s     #r:   colorr(   c                    d S r4   r5   r7   r   s     r8   set_backgroundzAbstractPipeline.set_background   s    47Cr:   entityr   c                    d S r4   r5   r7   r   rV   s      r8   enter_entityzAbstractPipeline.enter_entity   s	     	r:   c                    d S r4   r5   r7   r   s     r8   exit_entityzAbstractPipeline.exit_entity   s    7:sr:   r0   r+   r1   r2   r;   r#   r1   r2   r?   r@   r1   r2   rD   r   rE   rF   r1   r2   r1   r2   r4   rN   r   rO   r'   rP   rQ   r1   r2   rU   r   rV   r&   r1   r2   rZ   r   r[   r   rV   r&   r_   r`   rV   r&   r1   r2   rd   r   rV   r&   rh   ri   rV   r&   r1   r2   rn   ro   rV   r&   r1   r2   rs   rt   r@   rE   r   rV   r&   ru   rv   rw   r@   r1   r2   rz   r   rV   r&   r1   r2   r   r(   r1   r2   r   r   rV   r&   r1   r2   r   r   r1   r2   )__name__
__module____qualname____doc__r)   text_enginer   FontFacedefault_font_face__annotations__abcabstractmethodr9   r>   rC   rI   rM   rT   rY   r^   rc   rg   rl   rr   ry   r}   r   r   r   r   r5   r:   r8   r,   r,   1   sv        
 
 &%''K&((''''UUU U<<< <AAA A    	--- -
 26	     	JJJ JPPP P    	@@@ @    	    	      	TTT T### #777 7    	::: :::r:   c                     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dS )'RenderStage2d
next_stager;   r#   r1   r2   c                    d S r4   r5   r=   s     r8   r>   zRenderStage2d.set_config   s    r:   rU   r   rV   r&   c                    d S r4   r5   rX   s      r8   rY   zRenderStage2d.draw_point   s    EHSr:   rZ   r[   c                    d S r4   r5   r]   s       r8   r^   zRenderStage2d.draw_line   s    ILr:   r_   list[tuple[Vec2, Vec2]]c                    d S r4   r5   rb   s      r8   rc   zRenderStage2d.draw_solid_lines   rJ   r:   rd   r   c                    d S r4   r5   rf   s      r8   rg   zRenderStage2d.draw_path   s    ADr:   rh   list[BkPath2d]c                    d S r4   r5   rk   s      r8   rl   zRenderStage2d.draw_filled_paths   rm   r:   rn   r   c                    d S r4   r5   rq   s      r8   rr   z!RenderStage2d.draw_filled_polygon   rJ   r:   rz   r   c                    d S r4   r5   r|   s      r8   r}   zRenderStage2d.draw_image   r~   r:   Nr   rU   r   rV   r&   r1   r2   rZ   r   r[   r   rV   r&   r_   r   rV   r&   r1   r2   rd   r   rV   r&   rh   r   rV   r&   r1   r2   rn   r   rV   r&   r1   r2   r   )r   r   r   r   r>   r   r   rY   r^   rc   rg   rl   rr   r}   r5   r:   r8   r   r      s            	HHH HLLL L    	DDD D    	    	TTT TTTr:   r   c                      e Zd ZdZdLdZdMdZdNd	ZdOdZdPdZdQdZ	dRdZ
dSdZdTdZ	 dUdVd%ZdWd'Zd( Z	 dXdYd.ZdTd/ZdZd2Zd[d5Zd\d6Zd]d9Zd^d<Zd_d?Zd`dBZdadEZdbdHZdcdKZdS )dr-   z Render pipeline for 2D backends.backendr   c                J   || _         t                      | _        	 t          j                            d          | _        n# t          j        $ r Y nw xY wt                      | _	        d| _
        d| _        t                      | _        |                                 | _        d S )N       ?)r   r#   r;   r   font_managerget_font_facer   FontNotFoundErrorr   clipping_portalcurrent_vp_scale_current_entity_handledict_color_mappingbuild_render_pipeline	_pipeline)r7   r   s     r8   __init__zRenderPipeline2d.__init__   s    #oo	%*%7%E%Eb%I%ID""& 	 	 	D	  .// #+-#.2ff3355s   $A AAr1   r   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   )r7   backend_stagelinetype_stageclipping_stages       r8   r   z&RenderPipeline2d.build_render_pipeline   sn    &LD$?
 
 
 )K 3$
 
 

 )K-.
 
 
 r:   rv   c                2    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   rL   s    r8   r   z#RenderPipeline2d.get_vp_ltype_scale   s     S.7777r:   rV   r&   r$   c                
   	 | j         |j                 }nI# t          $ r< t          |j        | j        j        | j        j                  }|| j         |j        <   Y nw xY wt          ||j        |j	        |j
        | j                  S r4   )r   r   KeyErrorapply_color_policyr;   color_policycustom_fg_colorr$   
lineweightlayerpenr   )r7   rV   r   s      r8   r   z'RenderPipeline2d.get_backend_properties   s    	:'
(89EE 	: 	: 	:& $+":DK<W E 5:D
 0111		:
 !!N'
 
 	
s    AAAr0   r+   r2   c                    || _         d S r4   )r/   r6   s     r8   r9   z+RenderPipeline2d.set_draw_entities_callback   s    %r:   r;   r#   c                    | j                             |           || _        | j        }	 |                    |           t          |d          sd S |j        }/)NTr   )r   	configurer;   r   r>   hasattrr   )r7   r;   stages      r8   r>   zRenderPipeline2d.set_config   sc    v&&&	%V$$$5,// $E		%r:   r?   r@   c                    |J || _         d S r4   )r   rB   s     r8   rC   z*RenderPipeline2d.set_current_entity_handle   s    !!!&,###r:   rD   r   rE   rF   c                <    | j                             ||           d S r4   )r   pushrH   s      r8   rI   z$RenderPipeline2d.push_clipping_shape   s#     	!!%33333r:   c                8    | j                                          d S r4   )r   poprL   s    r8   rM   z#RenderPipeline2d.pop_clipping_shape  s      """""r:   NrN   r   rO   r'   rP   rQ   c                Z   |j         dS 	 |                                }n# t          $ r Y dS w xY w|                     |          re|                     |                    |          t          |j                                         ||                     |                                  dS dS rS   )	docget_modelspace_limits
ValueErrorenter_viewportr/   from_viewportfilter_vp_entities
modelspaceexit_viewport)r7   rN   rO   rP   
msp_limitss        r8   rT   zRenderPipeline2d.draw_viewport  s     6>F	1133JJ 	 	 	FF	r"" 	!((,,"26#4#4#6#6
JOO        	! 	!s     
..boolc                
   |                                 | _        |                                }t          |          }t	          |          r|                                }|j        rp|                                }t          |t                    rG|j
                            dd          }|dk    rdnd}t          |                    |                    }t          |          }| j                            ||           dS dS )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   )	r7   rN   mclipping_pathverticeslayoutunitsmax_sagittaclipping_shapes	            r8   r   zRenderPipeline2d.enter_viewport  s     "((**!"} 	$5577H' 	Kff-- K
 #JNN+=qAAE16!++K#M$<$<[$I$IJJH5h??N %%na8884ur:   c                F    | j                                          d| _        d S )Nr   )r   r   r   rL   s    r8   r   zRenderPipeline2d.exit_viewport/  s%      """ #r:   rs   rt   r   ru   rw   c                   | j         j        }| j        }|                                r|t          j        k    rdS t          ||          }|j        }|| j        }	 | j	        
                    |||          }	n# t          t          f$ r Y dS w xY w|	D ]}
|
                    |           |	}|t          j        k    rg }|D ])}
|                    |
                                           *t#          |          dk     rdS t%          j        t)          |                                                    }|                    ||           dS |t          j        k    rg }|D ])}
|                    |
                                           *t#          |          dk     rdS t1          t)          |                                                    }|j        t5                      |_        |                    ||           dS | j	                            |          s|t          j        k    r|D ]}|                    ||           dS |j        t5                      |_        |                    ||           dS )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_verticesrg   REPLACE_FILLr   fillingr%   rr   is_stroke_fontOUTLINErl   )r7   rt   rE   rV   ru   rw   r  pipeline	font_faceglyph_pathsptransformed_pathsrn   rectpolygon	text_paths                   r8   ry   zRenderPipeline2d.draw_text4  s    k->zz|| 	{j.???F+D'::O	.I	*??i KK j) 	 	 	FF	 	+ 	+A	****,7 *111F& + +aiikk****6{{Q)-*?*?*M*M*O*OPPDtZ000F*111F& + +aiikk****6{{Q v!6!6!D!D!F!FGGG!)%,YY
"((*===F ++I66	j000. : :	""9j9999F%!(J""#4jAAAAAs   A8 8BBc                8    | j                                          d S r4   )r   r   rL   s    r8   r   zRenderPipeline2d.finalizes  s    r:   r   r(   c                :    | j                             |           d S r4   )r   r   r   s     r8   r   zRenderPipeline2d.set_backgroundv  s    ##E*****r:   r   r   c                <    | j                             ||           d S r4   )r   r   r   s      r8   r   zRenderPipeline2d.enter_entityy  s     !!&*55555r:   c                :    | j                             |           d S r4   )r   r   r   s     r8   r   zRenderPipeline2d.exit_entity|  s      (((((r:   rU   r   c                V    | j                             t          |          |           d S r4   )r   rY   r   rX   s      r8   rY   zRenderPipeline2d.draw_point  s&    !!$s))Z88888r:   rZ   r[   c                r    | j                             t          |          t          |          |           d S r4   )r   r^   r   r]   s       r8   r^   zRenderPipeline2d.draw_line  s.      ed3iiDDDDDr:   r_   r`   c                P    | j                             d |D             |           d S )Nc                P    g | ]#\  }}t          |          t          |          f$S r5   r   .0ses      r8   
<listcomp>z5RenderPipeline2d.draw_solid_lines.<locals>.<listcomp>  s-    222DAqd1ggtAww222r:   )r   rc   rb   s      r8   rc   z!RenderPipeline2d.draw_solid_lines  s;     	''22E222J	
 	
 	
 	
 	
r:   rd   r   c                V    | j                             t          |          |           d S r4   )r   rg   r   rf   s      r8   rg   zRenderPipeline2d.draw_path  s&      $<<<<<r:   rh   ri   c                |    | j                             t          t          t          |                    |           d S r4   )r   rl   r   mapr   rk   s      r8   rl   z"RenderPipeline2d.draw_filled_paths  s4    
 	((c(E.B.B)C)CZPPPPPr:   rn   ro   c                V    | j                             t          |          |           d S r4   )r   rr   r   rq   s      r8   rr   z$RenderPipeline2d.draw_filled_polygon  s*     	**:f+=+=zJJJJJr:   rz   r   c                <    | j                             ||           d S r4   )r   r}   r|   s      r8   r}   zRenderPipeline2d.draw_image  s     !!*j99999r:   )r   r   )r1   r   )r1   rv   )rV   r&   r1   r$   r   r   r   r   r   r4   r   )rN   r   r1   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r9   r>   rC   rI   rM   rT   r   r   ry   r   r   r   r   rY   r^   rc   rg   rl   rr   r}   r5   r:   r8   r-   r-      s       **6 6 6 6   8 8 8 8
 
 
 
 & & & &% % % %- - - -4 4 4 4
# # # # 26	! ! ! ! !(   ,$ $ $ =B =B =B =B =B~       + + + +6 6 6 6) ) ) )9 9 9 9E E E E
 
 
 
= = = =Q Q Q QK K K K
: : : : : :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%S )0r   r;   r#   r   r   r   r   c                0    || _         || _        || _        d S r4   )r   r;   r   )r7   r;   r   r   s       r8   r   zClippingStage2d.__init__  s      /$r:   r1   r2   c                    || _         d S r4   )r;   r=   s     r8   r>   zClippingStage2d.set_config  s    r:   rU   r   rV   r&   c                    | j         j        r| j                             |          }|d S | j                            ||           d S r4   )r   	is_active
clip_pointr   rY   rX   s      r8   rY   zClippingStage2d.draw_point  sN    ) 	&11#66C{""3
33333r:   rZ   r[   c                    | j         }| j        }|j        r>|                    ||          D ]%}|                    |d         |d         |           &d S |                    |||           d S )Nr   r   )r   r   r<  	clip_liner^   )r7   rZ   r[   rV   r   r   segments          r8   r^   zClippingStage2d.draw_line  s    _
.$ 	*44UC@@ I I$$WQZZHHHHFUC44444r:   r_   r   c                    | j         }|j        r5g }|D ].\  }}|                    |                    ||                     /|}| j                            ||           d S r4   )r   r<  r  r?  r   rc   )r7   r_   rV   r   cropped_linesrZ   r[   s          r8   rc   z ClippingStage2d.draw_solid_lines  s{     .$ 	"57M# L L
s$$_%>%>uc%J%JKKKK!E((
;;;;;r:   rd   r   c                    | j         }| j        }| j        j        }|j        r2|                    |g|          D ]}|                    ||           d S |                    ||           d S r4   )r   r   r;   max_flattening_distancer<  
clip_pathsrg   )r7   rd   rV   r   r   r  clipped_paths          r8   rg   zClippingStage2d.draw_path  s    ._
k9$ 	 / : :D6; O O ? ?$$\:>>>>FT:.....r:   rh   r   c                    | j         }| j        j        }|j        r|                    ||          }t          |          dk    rd S | j                            ||           d S Nr   )r   r;   rD  r<  clip_filled_pathsr   r   rl   )r7   rh   rV   r   r  s        r8   rl   z!ClippingStage2d.draw_filled_paths  si    
 .k9$ 	J#55e[IIEu::??F))%<<<<<r:   rn   r   c                   | j         }| j        }|j        rC|                    |          D ]+}t	          |          dk    r|                    ||           ,d S t	          |          dk    r|                    ||           d S d S rH  )r   r   r<  clip_polygonr   rr   )r7   rn   rV   r   r   s        r8   rr   z#ClippingStage2d.draw_filled_polygon  s    ._
$ 	)66v>> G Gv;;??226:FFFFv;;??**6:>>>>> ?r:   rz   r   c           	        g }| j         }|j        s|                     |||           d S |                                |j        z  }|j        }t          |||          }|j        sS|                                \  }}	t          t          j        d|df||	fd|	fg                    }
t          ||
|          }|                    |j                  |_        t          |          dk    r8|d         }||j        ur||_        d|_        |                     |||           d S |D ]F}|                     t          |j                                        |j        |d          ||           Gd S )N)r   r   r   r   T)imagerE   pixel_boundary_pathuse_clipping_boundary)r   r<  _draw_imageflip_matrixrE   rN  _clip_image_polygonremove_outside
image_sizer   r   generatetransform_matrixr   rO  r   rM  copy)r7   rz   rV   outer_boundsr   rE   rN  clipping_pathswidthheightouter_boundarynew_clipping_pathr  s                r8   r}   zClippingStage2d.draw_image  s    *,.( 	ZzBBBF **,,z/CC	(<,0)
 
 ( 
	 '1133ME6'vqzE6?QKPQQ N / L  /??
@TUU
~!## .q 1 
(FFF1B
.37
0ZzBBBBB!/     (.3355","6,9.2	   !	 	 	 		 r:   rX  list[BkPoints2d]c                j    |j         rt          ||           | j                            ||           d S r4   )rO  _mask_imager   r}   )r7   rz   rX  rV   s       r8   rP  zClippingStage2d._draw_image$  s=     + 	2
L111"":z:::::r:   N)r;   r#   r   r   r   r   r   r   r   r   r   r   r   r   )rz   r   rX  r^  rV   r&   r1   r2   )r   r   r   r   r>   rY   r^   rc   rg   rl   rr   r}   rP  r5   r:   r8   r   r     s        % % % %   4 4 4 45 5 5 5
< 
< 
< 
<	/ 	/ 	/ 	/= = = =? ? ? ?1 1 1 1f; ; ; ; ; ;r:   r   c                  f    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
d0d Zd1d#Zd2d&Zd'S )3r   r;   r#   r   Callable[[], float]r   r   c                    || _         d| _        || _        || _        t	                      | _        |                     |           d S )NF)r;   solid_lines_onlyr   r   r   pattern_cacher>   )r7   r;   r   r   s       r8   r   zLinetypeStage2d.__init__0  sF      %$.@Dr:   r1   r2   c                H    || _         |j        t          j        k    | _        d S r4   )r;   line_policyr    SOLIDrd  r=   s     r8   r>   zLinetypeStage2d.set_config=  s"     & 2j6F Fr:   rV   r&   Sequence[float]c                    | j         rd}n|j        |                                 z  }|j        |f}| j                            |          }| |                     ||          }|| j        |<   |S )z2Returns simplified linetype tuple: on-off sequence        )rd  linetype_scaler   linetype_namere  r   _create_pattern)r7   rV   scalekeypattern_s        r8   patternzLinetypeStage2d.patternA  s~      	GEE-0D0D0F0FFE%3U;%))#..++J>>H&.Ds#r:   ro  rv   c                   t          |j                  dk     rt                      S | j        j        |                                 z  fd|j        D             }t          |          dz  r|                                 |S )Nr  c                6    g | ]}t          |z            S r5   )r   )r/  r1  min_dash_lengthro  s     r8   r2  z3LinetypeStage2d._create_pattern.<locals>.<listcomp>U  s'    XXXq3q5y/22XXXr:   )r   linetype_patterntupler;   ru  r   r   )r7   rV   ro  rr  ru  s     ` @r8   rn  zLinetypeStage2d._create_patternO  s    z*++a//77N+58L8L8N8NNXXXXXJ<WXXXw<<! 	KKMMMr:   rU   r   c                <    | j                             ||           d S r4   )r   rY   rX   s      r8   rY   zLinetypeStage2d.draw_pointZ  s     ""3
33333r:   rZ   r[   c                v   t          |          }t          |          }| j        }| j        st          |j                  dk     r|                    |||           d S t          j        |                     |                    }|	                    d |
                    ||          D             |           d S )Nr  c                    g | ]	\  }}||f
S r5   r5   r.  s      r8   r2  z-LinetypeStage2d.draw_line.<locals>.<listcomp>h  s     <<<1aV<<<r:   )r   r   rd  r   rv  r^   r   LineTypeRendererrr  rc   line_segment)r7   rZ   r[   rV   r0  r1  r   renderers           r8   r^   zLinetypeStage2d.draw_line]  s    KKII_
  	C
(C$D$Dq$H$H  Az222F-dll:.F.FGG##<< 5 5a ; ;<<<	
 	
 	
 	
 	
r:   r_   r   c                <    | j                             ||           d S r4   )r   rc   rb   s      r8   rc   z LinetypeStage2d.draw_solid_linesl  s"     	((
;;;;;r:   rd   r   c                x   | j         }| j        st          |j                  dk     r|                    ||           d S t          j        |                     |                    }|                    | j	        j
        d          }|                    d |                    |          D             |           d S )Nr     )segmentsc                P    g | ]#\  }}t          |          t          |          f$S r5   r-  r.  s      r8   r2  z-LinetypeStage2d.draw_path.<locals>.<listcomp>{  s-    MMMDAqd1ggtAwwMMMr:   )r   rd  r   rv  rg   r   r{  rr  r  r;   rD  rc   line_segments)r7   rd   rV   r   r}  r  s         r8   rg   zLinetypeStage2d.draw_pathq  s    _
  	C
(C$D$Dq$H$H  z222F-dll:.F.FGG??4;#FQS?TT##MMH,B,B8,L,LMMM	
 	
 	
 	
 	
r:   rh   r   c                <    | j                             ||           d S r4   )r   rl   rk   s      r8   rl   z!LinetypeStage2d.draw_filled_paths  s"    
 	))%<<<<<r:   rn   r   c                <    | j                             ||           d S r4   )r   rr   rq   s      r8   rr   z#LinetypeStage2d.draw_filled_polygon  s     ++FJ?????r:   rz   r   c                <    | j                             ||           d S r4   )r   r}   r|   s      r8   r}   zLinetypeStage2d.draw_image  s     "":z:::::r:   N)r;   r#   r   rb  r   r   r   )rV   r&   r1   ri  )rV   r&   ro  rv   r1   ri  r   r   r   r   r   r   r   )r   r   r   r   r>   rr  rn  rY   r^   rc   rg   rl   rr   r}   r5   r:   r8   r   r   /  s               G G G G   	 	 	 	4 4 4 4
 
 
 
< < < <

 
 
 
= = = =@ @ @ @; ; ; ; ; ;r:   r   c                  R    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 S ))r   z Send data to the output backend.r   r   r   )Callable[[Properties], BackendProperties]c                V    || _         || _        t          | d          r
J d            d S )Nr   zhas to be the last render stage)r   r   r   )r7   r   r   s      r8   r   zBackendStage2d.__init__  s7    
 "4..QQ0QQQ.QQr:   rU   r   rV   r&   r1   r2   c                b    | j                             ||                     |                     d S r4   )r   rY   r   rX   s      r8   rY   zBackendStage2d.draw_point  s,    T^^J%?%?@@@@@r:   rZ   r[   c                d    | j                             |||                     |                     d S r4   )r   r^   r   r]   s       r8   r^   zBackendStage2d.draw_line  s.    uc4>>*+E+EFFFFFr:   r_   r   c                b    | j                             ||                     |                     d S r4   )r   rc   r   rb   s      r8   rc   zBackendStage2d.draw_solid_lines  s.     	%%eT^^J-G-GHHHHHr:   rd   r   c                b    | j                             ||                     |                     d S r4   )r   rg   r   rf   s      r8   rg   zBackendStage2d.draw_path  s,    tT^^J%?%?@@@@@r:   rh   r   c                b    | j                             ||                     |                     d S r4   )r   rl   r   rk   s      r8   rl   z BackendStage2d.draw_filled_paths  s.    
 	&&udnnZ.H.HIIIIIr:   rn   r   c                b    | j                             ||                     |                     d S r4   )r   rr   r   rq   s      r8   rr   z"BackendStage2d.draw_filled_polygon  s,    ((
1K1KLLLLLr:   rz   r   c                b    | j                             ||                     |                     d S r4   )r   r}   r   r|   s      r8   r}   zBackendStage2d.draw_image  s,    
DNN:,F,FGGGGGr:   N)r   r   r   r  r   r   r   r   r   r   r   )r   r   r   r   r   rY   r^   rc   rg   rl   rr   r}   r5   r:   r8   r   r     s        **R R R RA A A AG G G GI I I I
A A A AJ J J JM M M MH H H H H Hr:   r   rz   r   rX  r^  r1   r2   c                $   d | j                                         D             }t          j                            d|                                 d          }t          j                            |                              |ddd           t          j	        |          }| j
        s|rt          j                            d|                                 d          }|D ]V}d |                                D             }t          j                            |                              |ddd           Wt          j	        |          |z
  }n&t          j        |j        d|j                  }||z
  }| j        ddddd	fxx         |z  cc<   dS )
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)]

    c                *    g | ]}|j         |j        fS r5   xyr/  r   s     r8   r2  z_mask_image.<locals>.<listcomp>  s     RRR1QS!#JRRRr:   Lr   Nr   )outlinerZ  fillc                *    g | ]}|j         |j        fS r5   r  r  s     r8   r2  z_mask_image.<locals>.<listcomp>  s     HHHqac
HHHr:   )
fill_valuedtype   )rN  r  PILImagenewrT  	ImageDrawr#  npasarrayrS  fullrD   r  rM  )rz   rX  rK  clipping_imageclipping_maskvisible_imageboundaryfully_visible_image_masks           r8   r`  r`    s     SR
(F(O(O(Q(QRRRLY]]3
(=(=(?(?CCNMN++33d!! 4    J~..M$ E 	EIMM#z/D/D/F/FJJM(  HHH4E4E4G4GHHH''66>> $aa ?     J}55EMM (*w#9L( ( ($ 5}DMQQQ1W.r:   r   r   
polygon_pxr   r  r   c                t   |g}|                      |          }	 |                                 n# t          $ r |cY S w xY w|                                }|                    |           |                     |          }t          |          dk    r|d         |u r|S |D ]}|                    |           |S )Nr   r   )rV  inverseZeroDivisionErrorcloner  rK  r   )r   r  r  originalr  r#  clipped_polygonss          r8   rR  rR    s     |H ..q11G   
   Ga   &33G<<"")9!)<)G)G# + +!!'****s   / >>r   r(   c                    t          j        |           \  }}}t          d|z
  d|z
  d|z
                                            S )N   )r   from_hexto_hex)r   rgbs       r8   invert_colorr    sA    l5!!GAq!sQwaq))00222r:   r@   c                N    |                                  } | dk    rdS | dk    rdS | S )N#000000#ffffff)lower)r   s    r8   swap_bwr    s4    KKMME	y	yLr:   r   rk  ro  rv   offsetc                    t          j        |           j        |z  |z   }|dk     rd}n|dk    rd}t          |dz            }t          |||                                          S )Nrk  r   r  )r   r  	luminanceroundr  )r   ro  r  lumgrays        r8   color_to_monochromer    sk    
,u


'%
/&
8C
Syy	ssDtT4  '')))r:   policyr"   custom_colorc                   | dd         }| d d         } |t           j        k    rt          |           } n|t           j        k    rt	          |           } n|t           j        k    rt          | dd          } n|t           j        k    rt          | dd          } nl|t           j        k    rt          |           } nL|t           j	        k    rd} n9|t           j
        k    rd} n&|t           j        k    r|}|d d         } |dd         }| |z   S )	N   	   gffffff?g333333?)ro  r  rk  r  r  )r"   COLOR_SWAP_BWr  COLOR_NEGATIVEr  MONOCHROME_DARK_BGr  MONOCHROME_LIGHT_BG
MONOCHROMEBLACKWHITECUSTOM)r   r  r  alphafgs        r8   r   r     s   !A#JE"1"IE***	;-	-	-U##	;1	1	1#ESAAA	;2	2	2#ESAAA	;)	)	)#E**	;$	$	$	;$	$	$	;%	%	%2A21Q35=r:   mspr   limitsri  rP   rQ   Iterator[DXFGraphic]c              #     K   fd}
| E d{V  dS |\  j         s"t          j                            | d           | D ]} ||          r|V  dS )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                                        |           }|#t          j                            | fd          }|j        sdS |j        j        k    rdS |j        j        k    rdS |j        j        k    rdS |j        j        k    rdS dS )NTfastcacheF)	r   ezdxfbboxr  has_dataextmaxr  extminr  )r1  entity_bboxrP   max_xmax_ymin_xmin_ys     r8   
is_visiblez&filter_vp_entities.<locals>.is_visibleL  s     nnQ''*,,aTJ,OOK# 	4K&(((5K&(((5K&(((5K&(((5tr:   NTr  )r  r  r  r  )	r  r  rP   r  r   r  r  r  r  s	     `  @@@@r8   r   r   /  s      :        $ !'E5% =
3T<<<  :f 	LLL r:   rt   rw   c                    d| vs
J d            |dv r(t          | d          } |                     dd          } n=|dk    r(t          | d          } |                     dd	          } nt          |          | S )
N
znot a single line of text>   rs   ATTDEFATTRIB?)replacement	MTEXTu   ▯z        )r   replace	TypeError)rt   rw   s     r8   r  r  l  s    t8.../#FFF||D#&&	G		/%HHH||D*--   Kr:   )rz   r   rX  r^  r1   r2   )r   r   r  r   r  r   r1   r^  )r   r(   r1   r(   )r   r@   r1   r(   )r   rk  )r   r(   ro  rv   r  rv   r1   r(   )r   r(   r  r"   r  r(   r1   r(   r4   )r  r   r  ri  rP   rQ   r1   r  )rt   r@   rw   r@   r1   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#   rV   r$   r%   r&   r'   
type_hintsr(   unified_text_rendererr)   r@   rv   r*   r   r+   __all__ABCr,   r   r-   r   r   r   r`  rR  r  r  r  r   r   r  r5   r:   r8   <module>r     s   # " " " " " "                ( ' ' ' ' ' 



                                 < < < < < < < < < < < < & & & & & & & & " " " " " " / / / / / / / / = = = = = =         
 !           F F F F F F F F F F F F F F F F F F F F F F F F 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1       6 6 6 6 6 6c5j)
 ) ) ) )"*M8J;O+PRV+V"W  W W W W1
2_; _; _; _; _;sw _; _; _;D!U !U !U !U !UCG !U !U !UHf: f: f: f: f:' f: f: f:RL; L; L; L; L;m L; L; L;^[; [; [; [; [;m [; [; [;|%H %H %H %H %H] %H %H %HP,/ ,/ ,/ ,/^   63 3 3 3
   * * * * *   6 .2: : : : :z
 
 
 
 
 
r:   