
    hG{                       % S SK Jr  S SKJrJrJrJrJrJr  S SK	J
r
  S SKrS SKrS SKrS SKrS SKrS SKJr  S SKrS SKJr  S SKJrJrJrJr  S SKJrJr  S S	K J!r!  S S
K"J#r#J$r$  S SK%J&r&  S SK'J(r(J)r)J*r*  S SK+J,r,  SSK-J.r.J/r/J0r0J1r1  SSK2J3r3J4r4J5r5J6r6  SSK7J8r8J9r9  SSK7J:r:J;r;  SSK<J=r=  SSK>J?r?  \\@\A4   rBS\CS'   \\;\\#   /S4   rDS\CS'   SS/rE " S S\R                  5      rG " S S\R                  5      rH " S S\G5      rI " S S\H5      rJ " S  S!\H5      rK " S" S#\H5      rLS,S$ jrM        S-S% jrNS.S& jrOS/S' jrPS0S1S( jjrQS2S) jrR S3       S4S* jjrSS5S+ jrTg)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                     \ rS rSr% Sr\" 5       r\R                  " 5       r	S\
S'   \R                  SS j5       r\R                  SS j5       r\R                  SS j5       r\R                        SS j5       r\R                  SS	 j5       r\R                   S       SS jj5       r\R                  S S j5       r\R                  S!S j5       r\R                        S"S j5       r\R                  S#S j5       r\R                        S$S j5       r\R                        S%S j5       r\R                   S&           S'S jj5       r\R                  S(S j5       r\R                  SS j5       r\R                  S)S j5       r\R                  S*S j5       r\R                  S+S j5       rSrg
),r,   1   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                    g N selfcallbacks     O/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/drawing/pipeline.pyset_draw_entities_callback+AbstractPipeline.set_draw_entities_callbackB   s    RU    c                    g r2   r3   r5   configs     r7   
set_configAbstractPipeline.set_configE   s    9<r:   c                    g r2   r3   r5   handles     r7   set_current_entity_handle*AbstractPipeline.set_current_entity_handleH   s    >Ar:   c                    g r2   r3   r5   shape	transforms      r7   push_clipping_shape$AbstractPipeline.push_clipping_shapeK        r:   c                    g r2   r3   r5   s    r7   pop_clipping_shape#AbstractPipeline.pop_clipping_shapeP   s    *-r:   Nc                    gz8Draw the content of the given viewport current viewport.Nr3   )r5   vp
layout_ctx
bbox_caches       r7   draw_viewportAbstractPipeline.draw_viewportS   s     	r:   c                    g r2   r3   r5   pos
propertiess      r7   
draw_pointAbstractPipeline.draw_point]   s    GJr:   c                    g r2   r3   r5   startendrZ   s       r7   	draw_lineAbstractPipeline.draw_line`   s    MPr:   c                    g r2   r3   r5   linesrZ   s      r7   draw_solid_lines!AbstractPipeline.draw_solid_linesc   rK   r:   c                    g r2   r3   r5   pathrZ   s      r7   	draw_pathAbstractPipeline.draw_pathh   s    =@r:   c                    g r2   r3   r5   pathsrZ   s      r7   draw_filled_paths"AbstractPipeline.draw_filled_pathsk       
 r:   c                    g r2   r3   r5   pointsrZ   s      r7   draw_filled_polygon$AbstractPipeline.draw_filled_polygonr   rK   r:   c                    g r2   r3   )r5   textrH   rZ   
cap_heightdxftypes         r7   	draw_textAbstractPipeline.draw_textw   s     r:   c                    g r2   r3   r5   
image_datarZ   s      r7   
draw_imageAbstractPipeline.draw_image       QTr:   c                    g r2   r3   rM   s    r7   finalizeAbstractPipeline.finalize   s     #r:   c                    g r2   r3   r5   colors     r7   set_backgroundAbstractPipeline.set_background   s    47r:   c                    g r2   r3   r5   entityrZ   s      r7   enter_entityAbstractPipeline.enter_entity   s     	r:   c                    g r2   r3   r5   r   s     r7   exit_entityAbstractPipeline.exit_entity   s    7:r:   r3   r6   r+   returnNoner=   r#   r   r   rB   strr   r   rG   r   rH   zMatrix44 | Noner   r   r   r   r2   rR   r   rS   r'   rT   Optional[ezdxf.bbox.Cache]r   r   rY   r   rZ   r&   r   r   r_   r   r`   r   rZ   r&   re   zIterable[tuple[AnyVec, AnyVec]]rZ   r&   r   r   rj   r   rZ   r&   ro   zIterable[Path]rZ   r&   r   r   ru   zIterable[AnyVec]rZ   r&   r   r   TEXTry   r   rH   r   rZ   r&   rz   floatr{   r   r   r   r   r   rZ   r&   r   r   r   r(   r   r   r   r   rZ   r&   r   r   r   r   r   r   ) __name__
__module____qualname____firstlineno____doc__r)   text_enginer   FontFacedefault_font_face__annotations__abcabstractmethodr8   r>   rC   rI   rN   rU   r[   ra   rf   rk   rp   rv   r|   r   r   r   r   r   __static_attributes__r3   r:   r7   r,   r,   1   s   
 &'K(''U U< <A A"/>	  	- -
 26	 " /	
 
  	J JP P4BL	  	@ @  
	  	&4>	  	   	
   
  	T T# #7 7  	: :r:   c                  f   \ rS rSr% S \S'   SS jr\R                  SS j5       r\R                  SS j5       r	\R                        SS j5       r
\R                  SS j5       r\R                        SS j5       r\R                        SS	 j5       r\R                  SS
 j5       rSrg)RenderStage2d   
next_stagec                    g r2   r3   r<   s     r7   r>   RenderStage2d.set_config   s    r:   c                    g r2   r3   rX   s      r7   r[   RenderStage2d.draw_point   s    EHr:   c                    g r2   r3   r^   s       r7   ra   RenderStage2d.draw_line   s    ILr:   c                    g r2   r3   rd   s      r7   rf   RenderStage2d.draw_solid_lines   rK   r:   c                    g r2   r3   ri   s      r7   rk   RenderStage2d.draw_path   s    ADr:   c                    g r2   r3   rn   s      r7   rp   RenderStage2d.draw_filled_paths   rr   r:   c                    g r2   r3   rt   s      r7   rv   !RenderStage2d.draw_filled_polygon   rK   r:   c                    g r2   r3   r   s      r7   r   RenderStage2d.draw_image   r   r:   r3   Nr   rY   r   rZ   r&   r   r   r_   r   r`   r   rZ   r&   re   zlist[tuple[Vec2, Vec2]]rZ   r&   r   r   rj   r   rZ   r&   ro   zlist[BkPath2d]rZ   r&   r   r   ru   r   rZ   r&   r   r   r   )r   r   r   r   r   r>   r   r   r[   ra   rf   rk   rp   rv   r   r   r3   r:   r7   r   r      s     	H HL L,:D	  	D D  
	  	 .8	  	T Tr:   r   c                  d   \ rS rSrSrSS jrSS jrSS jrS S jrS!S jr	S"S jr
S#S	 jr      S$S
 jrS%S jr S&       S'S jjrS(S jrS r S)           S*S jjrS%S jrS+S jrS,S jrS-S jrS.S jrS/S jr      S0S jrS1S jr      S2S jr      S3S jrS4S jrSrg)5r-      z Render pipeline for 2D backends.c                .   Xl         [        5       U l         [        R                  R                  S5      U l        [        5       U l	        SU l
        SU l        [        5       U l        U R                  5       U l        g ! [        R                   a     NXf = f)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)r5   r   s     r7   __init__RenderPipeline2d.__init__   s    #o	%*%7%7%E%Eb%ID"  ./ #+-#.2f335 && 		s   $A= =BBc                    [        U R                  U R                  S9n[        U R                  U R
                  US9n[        U R                  U R                  US9nU$ )N)	converter)get_ltype_scaler   )r   )BackendStage2dr   get_backend_propertiesLinetypeStage2dr=   get_vp_ltype_scaleClippingStage2dr   )r5   backend_stagelinetype_stageclipping_stages       r7   r   &RenderPipeline2d.build_render_pipeline   s_    &LLD$?$?
 )KK 33$

 )KK--.
 r:   c                4    S[        U R                  S5      -  $ )z]The linetype pattern should look the same in all viewports
regardless of the viewport scale.
r   g-C6?)maxr   rM   s    r7   r   #RenderPipeline2d.get_vp_ltype_scale   s     S..777r:   c                r    U R                   UR                     n[        UUR                  UR                  UR                  U R                  5      $ ! [         aZ    [        UR                  U R                  R
                  U R                  R                  5      nX R                   UR                  '    Nf = fr2   )r   r   KeyErrorapply_color_policyr=   color_policycustom_fg_colorr$   
lineweightlayerpenr   )r5   rZ   r   s      r7   r   'RenderPipeline2d.get_backend_properties   s    	:''
(8(89E !!!NN''
 	
  	:&  $++":":DKK<W<WE 5:
 0 01		:s   A A!B65B6c                    Xl         g r2   )r0   r4   s     r7   r8   +RenderPipeline2d.set_draw_entities_callback   s    %r:   c                    U R                   R                  U5        Xl        U R                  n UR	                  U5        [        US5      (       d  g UR                  nM1  )Nr   )r   	configurer=   r   r>   hasattrr   )r5   r=   stages      r7   r>   RenderPipeline2d.set_config   sS    v&V$5,//$$E	 r:   c                    Uc   eXl         g r2   )r   rA   s     r7   rC   *RenderPipeline2d.set_current_entity_handle   s    !!!&,#r:   c                :    U R                   R                  X5        g r2   )r   pushrF   s      r7   rI   $RenderPipeline2d.push_clipping_shape   s     	!!%3r:   c                8    U R                   R                  5         g r2   )r   poprM   s    r7   rN   #RenderPipeline2d.pop_clipping_shape  s      "r:   Nc                6   UR                   c  g UR                  5       nU R                  U5      (       aT  U R	                  UR                  U5      [        UR                   R                  5       XC5      5        U R                  5         gg! [         a     gf = frQ   )	docget_modelspace_limits
ValueErrorenter_viewportr0   from_viewportfilter_vp_entities
modelspaceexit_viewport)r5   rR   rS   rT   
msp_limitss        r7   rU   RenderPipeline2d.draw_viewport  s     66>	113J r""((,"266#4#4#6
O   #  		s   B 
BBc                   UR                  5       U l        UR                  5       n[        U5      n[	        U5      (       a  UR                  5       nUR                  (       ae  UR                  5       n[        U[        5      (       a@  UR                  R                  SS5      nUS:X  a  SOSn[        UR                  U5      5      n[        U5      nU R                  R!                  X5        gg)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  )	r5   rR   mclipping_pathverticeslayoutunitsmax_sagittaclipping_shapes	            r7   r  RenderPipeline2d.enter_viewport  s     "((*!"}$557H''ff--
 #JJNN+=qAE16!+K#M$<$<[$IJH5h?N  %%n8r:   c                F    U R                   R                  5         SU l        g )Nr   )r   r
  r   rM   s    r7   r  RenderPipeline2d.exit_viewport/  s      " #r:   c                   U R                   R                  nU R                  nUR                  5       (       a  U[        R
                  :X  a  g[        X5      nUR                  nUc  U R                  n U R                  R                  XU5      n	U	 H  n
U
R                  U5        M     U	nU[        R                  :X  ay  / nU H"  n
UR                  U
R!                  5       5        M$     [#        U5      S:  a  g[$        R&                  " [)        U5      R+                  5       5      nUR-                  X5        gU[        R.                  :X  a  / nU H"  n
UR                  U
R!                  5       5        M$     [#        U5      S:  a  g[1        [)        U5      R+                  5       5      nUR2                  c  [5        5       Ul        UR7                  X5        gU R                  R9                  U5      (       d  U[        R:                  :X  a  U H  nUR-                  X5        M     gUR2                  c  [5        5       Ul        UR=                  X5        g! [        [        4 a     gf = f)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_verticesrk   REPLACE_FILLr   fillingr%   rv   is_stroke_fontOUTLINErp   )r5   ry   rH   rZ   rz   r{   r0  pipeline	font_faceglyph_pathsptransformed_pathsru   rectpolygon	text_paths                   r7   r|   RenderPipeline2d.draw_text4  s    kk-->>zz||{j.?.??+D:OO	..I	**??K
 A	* ,7 *111F&aiik* '6{Q))-*?*M*M*OPDt0*111F&aiik* '6{Q v!6!D!D!FGG!!)%,Y
"((= ++I66j000.	""99 /%!(J""#4AM j) 		s   4I I'&I'c                8    U R                   R                  5         g r2   )r   r   rM   s    r7   r   RenderPipeline2d.finalizes  s    r:   c                :    U R                   R                  U5        g r2   )r   r   r   s     r7   r   RenderPipeline2d.set_backgroundv  s    ##E*r:   c                :    U R                   R                  X5        g r2   )r   r   r   s      r7   r   RenderPipeline2d.enter_entityy  s    !!&5r:   c                :    U R                   R                  U5        g r2   )r   r   r   s     r7   r   RenderPipeline2d.exit_entity|  s      (r:   c                N    U R                   R                  [        U5      U5        g r2   )r   r[   r   rX   s      r7   r[   RenderPipeline2d.draw_point  s    !!$s)Z8r:   c                b    U R                   R                  [        U5      [        U5      U5        g r2   )r   ra   r   r^   s       r7   ra   RenderPipeline2d.draw_line  s       ed3iDr:   c           
         U R                   R                  U VVs/ s H  u  p4[        U5      [        U5      4PM     snnU5        g s  snnf r2   )r   rf   r   )r5   re   rZ   ses        r7   rf   !RenderPipeline2d.draw_solid_lines  s<     	'',12EDAd1gtAwE2J	
2s   "A
c                N    U R                   R                  [        U5      U5        g r2   )r   rk   r   ri   s      r7   rk   RenderPipeline2d.draw_path  s      $<r:   c                j    U R                   R                  [        [        [        U5      5      U5        g r2   )r   rp   r"  mapr   rn   s      r7   rp   "RenderPipeline2d.draw_filled_paths  s$    
 	((c(E.B)CZPr:   c                N    U R                   R                  [        U5      U5        g r2   )r   rv   r   rt   s      r7   rv   $RenderPipeline2d.draw_filled_polygon  s     	**:f+=zJr:   c                :    U R                   R                  X5        g r2   )r   r   r   s      r7   r   RenderPipeline2d.draw_image  s    !!*9r:   )	r   r   r   r   r   r=   r   r   r0   )r   r   )r   r   )r   r   )rZ   r&   r   r$   r   r   r   r   r   r2   r   )rR   r   r   boolr   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r8   r>   rC   rI   rN   rU   r  r  r|   r   r   r   r   r[   ra   rf   rk   rp   rv   r   r   r3   r:   r7   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
:r:   c                      \ rS rSr      SS jrSS jrSS jrSS jr      SS jrSS jr	      SS jr
SS	 jrSS
 jr        SS jrSrg)r   i  c                (    X l         Xl        X0l        g r2   r   r=   r   )r5   r=   r   r   s       r7   r   ClippingStage2d.__init__  s      /$r:   c                    Xl         g r2   )r=   r<   s     r7   r>   ClippingStage2d.set_config  s    r:   c                    U R                   R                  (       a  U R                   R                  U5      nUc  g U R                  R	                  X5        g r2   )r   	is_active
clip_pointr   r[   rX   s      r7   r[   ClippingStage2d.draw_point  sA    ))&&11#6C{""33r:   c                    U R                   nU R                  nUR                  (       a2  UR                  X5       H  nUR	                  US   US   U5        M     g UR	                  XU5        g )Nr   r   )r   r   rk  	clip_linera   )r5   r_   r`   rZ   r   r   segments          r7   ra   ClippingStage2d.draw_line  sb    __
..$$*44U@$$WQZZH AU4r:   c                    U R                   nUR                  (       a/  / nU H%  u  pVUR                  UR                  XV5      5        M'     UnU R                  R                  X5        g r2   )r   rk  r9  ro  r   rf   )r5   re   rZ   r   cropped_linesr_   r`   s          r7   rf    ClippingStage2d.draw_solid_lines  sY     ..$$57M#
$$_%>%>u%JK $!E((;r:   c                    U R                   nU R                  nU R                  R                  nUR                  (       a,  UR                  U/U5       H  nUR                  Xb5        M     g UR                  X5        g r2   )r   r   r=   max_flattening_distancerk  
clip_pathsrk   )r5   rj   rZ   r   r   r)  clipped_paths          r7   rk   ClippingStage2d.draw_path  sg    ..__
kk99$$ / : :D6; O$$\> !PT.r:   c                    U R                   nU R                  R                  nUR                  (       a  UR	                  X5      n[        U5      S:X  a  g U R                  R                  X5        g Nr   )r   r=   rv  rk  clip_filled_pathsr  r   rp   )r5   ro   rZ   r   r)  s        r7   rp   !ClippingStage2d.draw_filled_paths  sW    
 ..kk99$$#55eIEu:?))%<r:   c                   U R                   nU R                  nUR                  (       a;  UR                  U5       H%  n[	        U5      S:  d  M  UR                  X5        M'     g [	        U5      S:  a  UR                  X5        g g r{  )r   r   rk  clip_polygonr  rv   )r5   ru   rZ   r   r   s        r7   rv   #ClippingStage2d.draw_filled_polygon  sp    ..__
$$)66v>v;?226F ? v;?**6> r:   c           
        / nU R                   nUR                  (       d  U R                  XU5        g UR                  5       UR                  -  nUR
                  n[        XFU5      nUR                  (       dF  UR                  5       u  p[        [        R                  " SUS4X4SU	4/5      5      n
[        XJU5      nUR                  UR                  5      Ul        [        U5      S:X  a3  US   nXR
                  La  Xl        SUl        U R                  XU5        g U HB  nU R                  [        UR                   R#                  5       UR                  USS9UU5        MD     g )N)r   r   r   r   T)imagerH   pixel_boundary_pathuse_clipping_boundary)r   rk  _draw_imageflip_matrixrH   r  _clip_image_polygonremove_outside
image_sizer   r   generatetransform_matrixr  r  r   r  copy)r5   r   rZ   outer_boundsr   rH   r  clipping_pathswidthheightouter_boundarynew_clipping_pathr%  s                r7   r   ClippingStage2d.draw_image  se    *,..((ZzB **,z/C/CC	(<<,)
 (( '113ME'vqzE?QKPQN /L  /??
@T@TU
~!# .q 1 (F(FF1B.37
0ZzB!/   (..335","6"6,9.2	 !		 "0r:   c                r    UR                   (       a  [        X5        U R                  R                  X5        g r2   )r  _mask_imager   r   )r5   r   r  rZ   s       r7   r  ClippingStage2d._draw_image$  s'     ++
1""::r:   rf  N)r=   r#   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r  list[BkPoints2d]rZ   r&   r   r   )r   r   r   r   r   r>   r[   ra   rf   rk   rp   rv   r   r  r   r3   r:   r7   r   r     s    %% (% "	%45
<,
<:D
<	
<	/== = 
	=?1f;; '; 	;
 
;r:   r   c                      \ rS rSr      SS jrSS jrSS jrSS jrSS jrSS jr	      SS jr
SS	 jr      SS
 jrSS jrSS jrSrg)r   i/  c                v    Xl         SU l        X0l        X l        [	        5       U l        U R                  U5        g )NF)r=   solid_lines_onlyr   r   r   pattern_cacher>   )r5   r=   r   r   s       r7   r   LinetypeStage2d.__init__0  s2      %$.@Dr:   c                T    Xl         UR                  [        R                  :H  U l        g r2   )r=   line_policyr    SOLIDr  r<   s     r7   r>   LinetypeStage2d.set_config=  s      & 2 2j6F6F Fr:   c                    U R                   (       a  SnOUR                  U R                  5       -  nUR                  U4nU R                  R                  U5      nUc  U R                  X5      nX@R                  U'   U$ )z2Returns simplified linetype tuple: on-off sequence        )r  linetype_scaler   linetype_namer  r!  _create_pattern)r5   rZ   scalekeypattern_s        r7   patternLinetypeStage2d.patternA  sx      E--0D0D0FFE%33U;%%))#.++J>H&.s#r:   c                :   [        UR                  5      S:  a
  [        5       $ U R                  R                  U R                  5       -  nUR                   Vs/ s H  n[        XB-  U5      PM     nn[        U5      S-  (       a  UR                  5         U$ s  snf Nr/  )r  linetype_patterntupler=   min_dash_lengthr   r   r
  )r5   rZ   r  r  rX  r  s         r7   r  LinetypeStage2d._create_patternO  s~    z**+a/7N++558L8L8NN<F<W<WX<Wq3qy/2<WXw<!KKM Ys   Bc                :    U R                   R                  X5        g r2   )r   r[   rX   s      r7   r[   LinetypeStage2d.draw_pointZ  s    ""33r:   c                   [        U5      n[        U5      nU R                  nU R                  (       d  [        UR                  5      S:  a  UR                  XEU5        g [        R                  " U R                  U5      5      nUR                  UR                  XE5       VVs/ s H  u  pEXE4PM
     snnU5        g s  snnf r  )r   r   r  r  r  ra   r   LineTypeRendererr  rf   line_segment)r5   r_   r`   rZ   rW  rX  r   renderers           r7   ra   LinetypeStage2d.draw_line]  s    KI__
  C
(C(C$Dq$H  z2--dll:.FG## ( 5 5a ;< ;aV ;<	
<s   $B=
c                :    U R                   R                  X5        g r2   )r   rf   rd   s      r7   rf    LinetypeStage2d.draw_solid_linesl  s     	((;r:   c           
        U R                   nU R                  (       d  [        UR                  5      S:  a  UR	                  X5        g [
        R                  " U R                  U5      5      nUR                  U R                  R                  SS9nUR                  UR                  U5       VVs/ s H  u  pg[        U5      [        U5      4PM     snnU5        g s  snnf )Nr/     )segments)r   r  r  r  rk   r   r  r  r#  r=   rv  rf   line_segmentsr   )r5   rj   rZ   r   r  r&  rW  rX  s           r7   rk   LinetypeStage2d.draw_pathq  s    __
  C
(C(C$Dq$H  2--dll:.FG??4;;#F#FQS?T##,4,B,B8,LM,LDAd1gtAw,LM	
Ms   1"C
c                :    U R                   R                  X5        g r2   )r   rp   rn   s      r7   rp   !LinetypeStage2d.draw_filled_paths  s    
 	))%<r:   c                :    U R                   R                  X5        g r2   )r   rv   rt   s      r7   rv   #LinetypeStage2d.draw_filled_polygon  s    ++F?r:   c                :    U R                   R                  X5        g r2   )r   r   r   s      r7   r   LinetypeStage2d.draw_image  s    ""::r:   )r=   r   r   r  r  N)r=   r#   r   zCallable[[], float]r   r   r   )rZ   r&   r   Sequence[float])rZ   r&   r  r   r   r  r   r   r   r   r   r   r   )r   r   r   r   r   r>   r  r  r[   ra   rf   rk   rp   rv   r   r   r3   r:   r7   r   r   /  s       -  "	 G	4
<,<:D<	<

== = 
	=@;r:   r   c                      \ rS rSrSr    SS jrSS jrSS jr      SS jrSS jr	      SS jr
SS	 jrSS
 jrSrg)r   i  z Send data to the output backend.c                L    Xl         X l        [        U S5      (       a   S5       eg )Nr   zhas to be the last render stage)r   r   r  )r5   r   r   s      r7   r   BackendStage2d.__init__  s*    
 "4..Q0QQ..r:   c                X    U R                   R                  XR                  U5      5        g r2   )r   r[   r   rX   s      r7   r[   BackendStage2d.draw_point  s    ^^J%?@r:   c                Z    U R                   R                  XU R                  U5      5        g r2   )r   ra   r   r^   s       r7   ra   BackendStage2d.draw_line  s    u4>>*+EFr:   c                X    U R                   R                  XR                  U5      5        g r2   )r   rf   r   rd   s      r7   rf   BackendStage2d.draw_solid_lines  s     	%%e^^J-GHr:   c                X    U R                   R                  XR                  U5      5        g r2   )r   rk   r   ri   s      r7   rk   BackendStage2d.draw_path  s    t^^J%?@r:   c                X    U R                   R                  XR                  U5      5        g r2   )r   rp   r   rn   s      r7   rp    BackendStage2d.draw_filled_paths  s    
 	&&unnZ.HIr:   c                X    U R                   R                  XR                  U5      5        g r2   )r   rv   r   rt   s      r7   rv   "BackendStage2d.draw_filled_polygon  s    ((
1KLr:   c                X    U R                   R                  XR                  U5      5        g r2   )r   r   r   r   s      r7   r   BackendStage2d.draw_image  s    
NN:,FGr:   )r   r   N)r   r   r   z)Callable[[Properties], BackendProperties]r   r   r   r   r   r   r   )r   r   r   r   r   r   r[   ra   rf   rk   rp   rv   r   r   r3   r:   r7   r   r     s    *R!R =RAGI,I:DI	I
AJJ J 
	JMHr:   r   c                   U R                   R                  5        Vs/ s H  o"R                  UR                  4PM     nn[        R
                  R                  SU R                  5       S5      n[        R                  R                  U5      R                  USSSS9  [        R                  " U5      nU R                  (       d  U(       a  [        R
                  R                  SU R                  5       S5      nU Hg  nUR                  5        Vs/ s H  o"R                  UR                  4PM     nn[        R                  R                  U5      R                  USSSS9  Mi     [        R                  " U5      U-
  nO.[        R                  " UR                  SUR                  S9nX-
  nU R                   SS2SS2S4==   U-  ss'   gs  snf s  snf )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   )outliner  fill)
fill_valuedtype   )r  r&  xyPILImagenewr  	ImageDrawrG  npasarrayr  fullrG   r  r  )	r   r  rD  r  clipping_imageclipping_maskvisible_imageboundaryfully_visible_image_masks	            r7   r  r    s     )3(F(F(O(O(QR(Q1SS!##J(QLRYY]]3
(=(=(?CNMMN+33d!! 4  JJ~.M$$IIMM#z/D/D/FJM(4<4E4E4GH4Gqacc
4GH''6>> $aa ?  ) JJ}5EM (*ww##9L9L($ 5DMQ1W.9 S  Is   !G!Gc                >   U/nU R                  U5      n UR                  5         UR                  5       nUR	                  U5        U R                  U5      n[        U5      S:X  a
  US   UL a  U$ U H  nUR	                  U5        M     U$ ! [         a    Us $ f = f)Nr   r   )r  inverseZeroDivisionErrorcloner7  r  r  )r   
polygon_pxr$  originalr  rG  clipped_polygonss          r7   r  r    s     |H ..q1G  Ga &33G<")9!)<)G#!!'* $  s   B BBc                |    [         R                  " U 5      u  pn[        SU-
  SU-
  SU-
  5      R                  5       $ )N   )r   from_hexto_hex)r   rgbs       r7   invert_colorr    s8    ll5!GA!sQwaq)0022r:   c                B    U R                  5       n U S:X  a  gU S:X  a  gU $ )N#000000#ffffff)lower)r   s    r7   swap_bwr    s(    KKME		Lr:   c                    [         R                  " U 5      R                  U-  U-   nUS:  a  SnOUS:  a  Sn[        US-  5      n[        XDU5      R	                  5       $ )Nr  r   r  )r   r  	luminanceroundr  )r   r  offsetlumgrays        r7   color_to_monochromer    s\    
,,u

'
'%
/&
8C
Sy	ssDt4 ''))r:   c                $   U SS nU S S n U[         R                  :X  a  [        U 5      n X-   $ U[         R                  :X  a  [	        U 5      n X-   $ U[         R
                  :X  a  [        U SSS9n X-   $ U[         R                  :X  a  [        U SSS9n X-   $ U[         R                  :X  a  [        U 5      n X-   $ U[         R                  :X  a  Sn X-   $ U[         R                  :X  a  Sn X-   $ U[         R                  :X  a  UnUS S n USS nX-   $ )	N   	   gffffff?g333333?)r  r  r  r  r  )r"   COLOR_SWAP_BWr  COLOR_NEGATIVEr  MONOCHROME_DARK_BGr  MONOCHROME_LIGHT_BG
MONOCHROMEBLACKWHITECUSTOM)r   policycustom_coloralphafgs        r7   r   r     sB   !AJE"1IE***" =! 
;--	-U# = 
;11	1#ESA = 
;22	2#ESA = 
;))	)#E* = 
;$$	$ = 
;$$	$
 =	 
;%%	%2A1Q=r:   c              #     ^^^^^#    UUUUU4S jnTc  U  Sh  vN   gUu  mmmmTR                   (       d  [        R                  R                  U STS9  U  H  nU" U5      (       d  M  Uv   M     g NY7f)al  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R                  U 5      nUc   [        R                  R                  U 4STS9nUR                  (       d  gTUR
                  R                  :  a  gTUR                  R                  ::  a  gTUR
                  R                  :  a  gTUR                  R                  ::  a  gg)NTfastcacheF)	r!  ezdxfbboxr:  has_dataextmaxr  extminr  )rX  entity_bboxrT   max_xmax_ymin_xmin_ys     r7   
is_visible&filter_vp_entities.<locals>.is_visibleL  s     nnQ'**,,aTJ,OK##K&&(((K&&(((K&&(((K&&(((r:   NTr  )r  r  r  r:  )	msplimitsrT   r%  r   r!  r"  r#  r$  s	     `  @@@@r7   r  r  /  sq     : $ !'E5%

3T<fL  	s   A6A4AA6+
A6c                    SU ;  d   S5       eUS;   a  [        U SS9n U R                  SS5      n U $ US:X  a  [        U SS9n U R                  SS	5      n U $ [        U5      e)
N
znot a single line of text>   r   ATTDEFATTRIB?)replacement	MTEXTu   ▯z        )r   replace	TypeError)ry   r{   s     r7   r3  r3  l  s|    t888../#F||D#& K 
G	/%H||D*- K   r:   )r   r   r  r  r   r   )r   r   r  r   r$  r   r   r  )r   r(   r   r(   )r   r   r   r(   )r   r  )r   r(   r  r   r  r   r   r(   )r   r(   r  r"   r  r(   r   r(   r2   )r'  r   r(  r  rT   r   r   zIterator[DXFGraphic])ry   r   r{   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#   rZ   r$   r%   r&   r'   
type_hintsr(   unified_text_rendererr)   r   r   r*   r   r+   __all__ABCr,   r   r-   r   r   r   r  r  r  r  r  r   r  r3  r3   r:   r7   <module>rH     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
r:   