
    OgG{                       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     b/var/www/html/public_html/myphp/venv/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%Eb%ID"  ./ #+-#.2f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_    &LLD$?$?
 )KK 33$

 )KK--.
 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9E !!!NN''
 	
  	:&  $++":":DKK<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     66>	113J r"((,"266#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7H''ff-
 #JJNN+=qAE16!+K#M$<$<[$IJH5h?N  %%na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(  rg }|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!    kk-->>zz|{j.?.??+D':OO	..I	**??iK
  	+A	*	+,7 *111F& +aiik*+6{Q))-*?*M*M*OPDtZ0*111F& +aiik*+6{Q v!6!D!D!FGG!!)%,Y
"((*= ++I6j000. :	""9j9:%!(J""#4jAM 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d3i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2DAqd1gtAw2J	
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)CZ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#6C{""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  sl    __
..$$*44UC@ I$$WQZZHIUC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  sf     ..$$57M# L
s$$_%>%>uc%JKL!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  so    ..__
kk99$$ / : :D6; O ?$$\:>?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[    
 ..kk99$$#55e[IE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  s{    ..__
$$)66v> Gv;?226:FG 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  s{    *,..((ZzB **,z/C/CC	(<<,0)
 (( '113ME6'vqzE6?QKPQN /L  /??
@T@TU
~!# .q 1 
(F(FF1B
.37
0ZzB!/    (..335","6"6,9.2	 !		r8   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 2j6F6F 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--0D0D0FFE%33U;%%))#.++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/7N++558L8L8NN<F<W<WXq3q5y/2XXw<!KKM 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$Dq$H  Az2--dll:.FG## ( 5 5a ;<1a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$Dq$H  z2--dll:.FG??4;;#F#FQS?T##,4,B,B8,LMDAqd1gtAw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    ++FJ?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.Q0Q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!    uc4>>*+EFr8   c                Z    | j                   j                  || j                  |             y r1   )r   r]   r   r[   s      r6   r]   zBackendStage2d.draw_solid_lines  s!     	%%eT^^J-GHr8   c                Z    | j                   j                  || j                  |             y r1   )r   ra   r   r_   s      r6   ra   zBackendStage2d.draw_path  s    tT^^J%?@r8   c                Z    | j                   j                  || j                  |             y r1   )r   re   r   rc   s      r6   re   z BackendStage2d.draw_filled_paths  s!    
 	&&udnnZ.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    
DNN:,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|rt        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R1QSS!##JRLRYY]]3
(=(=(?CNMMN+33d!! 4  JJ~.M$$IIMM#z/D/D/FJM( 4<4E4E4GHqacc
HH''6>> $aa ?  JJ}5EM (*ww##9L9L($ 5}DMQ1W.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1G  Ga &33G<")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:    ll5!GAq!sQw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(    KKME		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

'
'%
/&
8C
Sy	ssDtT4 ''))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   !AJE"1IE***" 5=! 
;--	-U# 5= 
;11	1#ESA 5= 
;22	2#ESA 5= 
;))	)#E* 5= 
;$$	$ 5= 
;$$	$
 5=	 
;%%	%2A1Q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     nnQ'**,,aTJ,OK##K&&(((K&&(((K&&(((K&&(((r8   NTr  )r  r  r  r  )	msplimitsrN   r  r}   r  r  r  r  s	     `  @@@@r6   r   r   /  st     : $ !'E5%

3T< 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c5j)
I )"*M8J;O+PRV+V"W i W1
2_;sww _;D!UCGG !UHf:' f:RL;m L;^[;m [;|%H] %HP,/^#1;@H63
*6 .2:	:: +: 	:z
r8   