Ë
    £èh9J  ã                  óª  — U d dl mZ d dlZd dlmZmZmZ d dlZd dlZ	d dl
Zd dlmZmZ d dlmZ d dlmZ d dlmZ d dlm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Z'dZ(de)d<   	 d dl(Z(ddgZ,dZ-dZ. G d„ de&j^                  «      Z0dd„Z1 G d„ de«      Z2ed d„«       Z3	 	 d!	 	 	 	 	 	 	 d"d„Z4d#d„Z5y# e*$ r  e+d«       dZ'Y ŒYw xY w)$é    )ÚannotationsN)ÚIterableÚno_type_checkÚAny)ÚVec2ÚBoundingBox2d)ÚRGB)ÚCommand)Ú__version__)Úmake_table_keyé   )ÚColor)ÚBackendInterfaceÚBkPath2dÚ
BkPoints2dÚ	ImageData)ÚConfigurationÚLineweightPolicy)ÚBackendProperties)ÚlayoutÚrecorderTr   ÚpymupdfzLPython module PyMuPDF (AGPL!) is required: https://pypi.org/project/PyMuPDF/FÚPyMuPdfBackendÚis_pymupdf_installedg¬ÕjµZ­@)ÚpngÚppmÚpbmc                  ó   ‡ — e Zd ZdZdˆ fd„Z ej                  «       ddœ	 	 	 	 	 	 	 dd„Z ej                  «       ddœ	 	 	 	 	 	 	 dd„Zd ej                  «       dd	dd
œ	 	 	 	 	 	 	 	 	 dd„Z	e
	 	 	 	 	 	 dd„«       Zˆ xZS )r   a¢  This backend uses the `PyMuPdf`_ package to create PDF, PNG, PPM and PBM output.
    This backend support content cropping at page margins.

    PyMuPDF is licensed under the `AGPL`_. Sorry, but it's the best package for the job
    I've found so far.

    Install package::

        pip install pymupdf

    .. _PyMuPdf: https://pypi.org/project/PyMuPDF/
    .. _AGPL: https://www.gnu.org/licenses/agpl-3.0.html

    c                ó0   •— t         ‰| �  «        d| _        y )NT)ÚsuperÚ__init__Ú_init_flip_y)ÚselfÚ	__class__s    €ú<lib/python3.12/site-packages/ezdxf/addons/drawing/pymupdf.pyr!   zPyMuPdfBackend.__init__;   s   ø€ Ü‰ÑÔØ ˆÕó    N©ÚsettingsÚ
render_boxc               óD  — d}| j                  «       }|€|j                  «       }t        j                  || j                  ¬«      }|j                  ||«      }t        j                  |«      }t        |«      |_        |j                  |||¬«      }|j                  |«       |j                  rH|j                  |¬«      \  }}	|j                  |«      }
dt        z  }|j                  ||
z  |	|
z  |«       d| _        | j!                  ||«      }|j#                  |«       |S )á=  Returns the PDF document as bytes.

        Args:
            page: page definition, see :class:`~ezdxf.addons.drawing.layout.Page`
            settings: layout settings, see :class:`~ezdxf.addons.drawing.layout.Settings`
            render_box: set explicit region to render, default is content bounding box
        T)Úflip_y)r(   Ú
top_origin)r-   çš™™™™™¹?F)ÚplayerÚbboxr   ÚLayoutr"   Úget_final_pageÚcopyÚget_coordinate_output_spaceÚoutput_coordinate_spaceÚget_placement_matrixÚ	transformÚcrop_at_marginsÚget_margin_rectÚpage_output_scale_factorÚMM_TO_POINTSÚ	crop_rectÚmake_backendÚreplay)r#   Úpager(   r)   r-   r/   Úoutput_layoutÚmÚp1Úp2Úoutput_scaleÚmax_sagittaÚbackends                r%   Ú
get_replayzPyMuPdfBackend.get_replay?   s  € ð ˆ
à—‘“ˆØÐØŸ™›ˆJô Ÿ™ j¸×9JÑ9JÔKˆØ×+Ñ+¨D°(Ó;ˆô —9‘9˜XÓ&ˆÜ+FÀtÓ+LˆÔ(à×.Ñ.Ø˜8°
ð /ó 
ˆð 	×Ñ˜ÔØ×#Ò#Ø×)Ñ)°ZÐ)Ó@‰FˆB�à#×<Ñ<¸TÓBˆLØ¤Ñ,ˆKà×Ñ˜R ,Ñ.°°\Ñ0AÀ;ÔOà!ˆÔØ×#Ñ# D¨(Ó3ˆØ�‰�gÔØˆr&   c               óJ   — | j                  |||¬«      }|j                  «       S )r+   r'   )rG   Úget_pdf_bytes)r#   r?   r(   r)   rF   s        r%   rI   zPyMuPdfBackend.get_pdf_bytesm   s'   € ð —/‘/ $°Àj�/ÓQˆØ×$Ñ$Ó&Ð&r&   r   é`   F)Úfmtr(   ÚdpiÚalphar)   c               óþ   — |t         vrt        d|› d�«      ‚| j                  |||¬«      }	 |j                  ||¬«      }|j	                  |¬«      S # t
        $ r!}	t        dt        |	«      › �«       Y d}	~	yd}	~	ww xY w)	aª  Returns a pixel image as bytes, supported image formats:

        === =========================
        png Portable Network Graphics
        ppm Portable Pixmap (no alpha channel)
        pbm Portable Bitmap (no alpha channel)
        === =========================

        Args:
            page: page definition, see :class:`~ezdxf.addons.drawing.layout.Page`
            fmt: image format
            settings: layout settings, see :class:`~ezdxf.addons.drawing.layout.Settings`
            dpi: output resolution in dots per inch
            alpha: add alpha channel (transparency)
            render_box: set explicit region to render, default is content bounding box
        zunsupported image format: 'Ú'r'   ©rL   rM   )ÚoutputzPyMuPDF Runtime Error: Nr&   )ÚSUPPORTED_IMAGE_FORMATSÚ
ValueErrorrG   Ú
get_pixmapÚtobytesÚRuntimeErrorÚprintÚstr)
r#   r?   rK   r(   rL   rM   r)   rF   ÚpixmapÚes
             r%   Úget_pixmap_byteszPyMuPdfBackend.get_pixmap_bytes~   sˆ   € ð4 Ô-Ñ-ÜÐ:¸3¸%¸qÐAÓBÐBØ—/‘/ $°Àj�/ÓQˆð	Ø×'Ñ'¨C°uÐ'Ó=ˆFØ—>‘>¨�>Ó-Ð-øÜò 	ÜÐ+¬C°«F¨8Ð4Ô5Üûð	ús   ­$A Á	A<ÁA7Á7A<c                ó   — t        | |«      S )z8Override this method to use a customized render backend.)ÚPyMuPdfRenderBackend)r?   r(   s     r%   r=   zPyMuPdfBackend.make_backend¢   s   € ô
 $ D¨(Ó3Ð3r&   ©ÚreturnÚNone)r?   úlayout.Pager(   úlayout.Settingsr)   úBoundingBox2d | Noner_   r]   )r?   ra   r(   rb   r)   rc   r_   Úbytes)
r?   ra   r(   rb   rL   Úintr)   rc   r_   rd   )r?   ra   r(   rb   r_   r]   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r   ÚSettingsrG   rI   r[   Ústaticmethodr=   Ú__classcell__)r$   s   @r%   r   r   +   s  ø„ ñõ!ð %4 F§O¡OÓ$5Ø+/ñ,àð,ð "ð	,ð
 )ð,ð 
ó,ðd %4 F§O¡OÓ$5Ø+/ñ'àð'ð "ð	'ð
 )ð'ð 
ó'ð* Ø$3 F§O¡OÓ$5ØØØ+/ñ"àð"ð
 "ð"ð ð"ð )ð"ð 
ó"ðH ð4Øð4Ø%4ð4à	ò4ó ô4r&   c                óŠ   — t        | j                  t        z  «      }t        | j                  t        z  «      }t	        ||«      S ©N)re   Úwidth_in_mmr;   Úheight_in_mmÚmax)r?   Úpage_width_in_ptÚpage_height_in_pts      r%   r4   r4   ª   s=   € Ü˜4×+Ñ+¬lÑ:Ó;ÐÜ˜D×-Ñ-´Ñ<Ó=ÐÜÐÐ!2Ó3Ð3r&   c                  óæ   — e Zd ZdZdd„Zd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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]   aq  Creates the PDF/PNG/PSD/SVG output.

    This backend requires some preliminary work, record the frontend output via the
    Recorder backend to accomplish the following requirements:

    - Move content in the first quadrant of the coordinate system.
    - The page is defined by the upper left corner in the origin (0, 0) and
      the lower right corner at (page-width, page-height)
    - The output coordinates are floats in 1/72 inch, scale the content appropriately
    - Replay the recorded output on this backend.

    .. important::

        Python module PyMuPDF is required: https://pypi.org/project/PyMuPDF/

    c                óÞ  — t         sJ d«       ‚t        j                  «       | _        | j                  j	                  dt        j
                  d   › �dt        › �dœ«       || _        i | _        i | _	        i | _
        t        |j                  t        z  «      | _        t        |j                  t        z  «      | _        d| _        d| _        t&        j(                  | _        d| _        t/        | j,                  t        |j0                  |j2                  z  «      «      | _        t/        | j,                  t        | j2                  |j4                  z  «      «      | _        t/        | j,                  t        | j2                  |j6                  z  «      «      | _        | j                  j9                  d	| j                  | j                   «      | _        | j:                  j=                  «       | _        y )
NzDPython module PyMuPDF is required: https://pypi.org/project/PyMuPDF/zPyMuPDF r   zezdxf )ÚproducerÚcreatorçš™™™™™©?ç      ð?r.   éÿÿÿÿ) r   r   ÚopenÚdocÚset_metadataÚversionr   r(   Ú_optional_content_groupsÚ_stroke_width_cacheÚ_color_cachere   ro   r;   rr   rp   rs   Úmin_lineweightÚlineweight_scalingr   ÚABSOLUTEÚlineweight_policyÚabs_min_stroke_widthrq   r5   Úmax_stroke_widthÚmin_stroke_widthÚfixed_stroke_widthÚnew_pager?   Ú	new_shapeÚcontent_shape)r#   r?   r(   s      r%   r!   zPyMuPdfRenderBackend.__init__Â   s¢  € å ð	RàQó	RØ ä—<‘<“>ˆŒØ�‰×Ñà&¤w§¡°qÑ'9Ð&:Ð;Ø#¤K =Ð1ñô	
ð !ˆŒØ8:ˆÔ%Ø79ˆÔ ØCEˆÔÜ # D×$4Ñ$4´|Ñ$CÓ DˆÔÜ!$ T×%6Ñ%6¼Ñ%EÓ!FˆÔà"ˆÔØ"%ˆÔÜ!1×!:Ñ!:ˆÔð %(ˆÔ!ô (+Ø×%Ñ%Ü�×0Ñ0°8×3LÑ3LÑLÓMó(
ˆÔô
 (+Ø×%Ñ%Ü�×%Ñ%¨×(AÑ(AÑAÓBó(
ˆÔô *-Ø×%Ñ%Ü�×%Ñ%¨×(CÑ(CÑCÓDó*
ˆÔð —H‘H×%Ñ% b¨$×*?Ñ*?À×AWÑAWÓXˆŒ	à!ŸY™Y×0Ñ0Ó2ˆÕr&   c                ó6   — | j                   j                  «       S rn   )r|   rU   ©r#   s    r%   rI   z"PyMuPdfRenderBackend.get_pdf_bytesñ   s   € Ø�x‰x×ÑÓ!Ð!r&   c                ó<   — | j                   j                  ||¬«      S )NrP   )r?   rT   )r#   rL   rM   s      r%   rT   zPyMuPdfRenderBackend.get_pixmapô   s   € Ø�y‰y×#Ñ#¨°5Ð#Ó9Ð9r&   c                ó6   — | j                   j                  «       S rn   )r?   Úget_svg_imagerŽ   s    r%   r‘   z"PyMuPdfRenderBackend.get_svg_image÷   s   € Ø�y‰y×&Ñ&Ó(Ð(r&   c                ó  — | j                  |«      }t        |dd «      }|dk(  s|dk(  ry | j                  }|j                  dd| j                  | j
                  g«       |j                  d d ||¬«       |j                  «        y )Né   é	   )ry   ry   ry   ç        r   )ÚwidthÚcolorÚfillÚfill_opacity)Úresolve_colorÚalpha_to_opacityrŒ   Ú	draw_rectrr   rs   ÚfinishÚcommit)r#   r—   ÚrgbÚopacityÚshapes        r%   Úset_backgroundz#PyMuPdfRenderBackend.set_backgroundú   s|   € Ø× Ñ  Ó'ˆÜ" 5¨¨1 :Ó.ˆØ�OÒ# w°#¢~ØØ×"Ñ"ˆØ�‰˜˜A˜t×4Ñ4°d×6LÑ6LÐMÔNØ�‰˜4 t°#ÀGˆÔLØ�‰�r&   c                óÖ   — | j                   j                  syt        |«      }|| j                  vr+| j                  j                  |dd¬«      | j                  |<   | j                  |   S )Nr   rz   T)ÚnameÚconfigÚon)r(   Úoutput_layersÚ	layer_keyr   r|   Úadd_ocg)r#   Ú
layer_names     r%   Úget_optional_content_groupz/PyMuPdfRenderBackend.get_optional_content_group  sk   € Ø�}‰}×*Ò*ØÜ˜zÓ*ˆ
Ø˜T×:Ñ:Ñ:Ø8<¿¹×8HÑ8HØØØð 9Ió 9ˆD×)Ñ)¨*Ñ5ð
 ×,Ñ,¨ZÑ8Ð8r&   c                ó   — | j                  |j                  «      }| j                  |j                  «      }|j	                  ||d ddt        |j                  dd «      || j                  |j                  «      ¬«       y )Nr   r“   r”   )r–   r—   r˜   ÚlineJoinÚlineCapÚstroke_opacityÚ	closePathÚoc)rš   r—   Úresolve_stroke_widthÚ
lineweightr�   r›   r«   Úlayer)r#   r¡   Ú
propertiesÚcloser—   r–   s         r%   Úfinish_linez PyMuPdfRenderBackend.finish_line  sz   € Ø×"Ñ" :×#3Ñ#3Ó4ˆØ×)Ñ)¨*×*?Ñ*?Ó@ˆØ�‰ØØØØØÜ+¨J×,<Ñ,<¸Q¸qÐ,AÓBØØ×.Ñ.¨z×/?Ñ/?Ó@ð 	õ 		
r&   c                óÈ   — |j                  d d | j                  |j                  «      t        |j                  dd «      dddd| j	                  |j
                  «      ¬«	       y )Nr“   r”   r   T)	r–   r—   r˜   r™   r­   r®   r°   Úeven_oddr±   )r�   rš   r—   r›   r«   r´   )r#   r¡   rµ   s      r%   Úfinish_fillingz#PyMuPdfRenderBackend.finish_filling  sb   € Ø�‰ØØØ×#Ñ# J×$4Ñ$4Ó5Ü)¨*×*:Ñ*:¸1¸QÐ*?Ó@ØØØØØ×.Ñ.¨z×/?Ñ/?Ó@ð 	õ 
	
r&   c                ó²   — |d d }	 | j                   |   S # t        $ r Y nw xY wt        j                  |«      j	                  «       }|| j                   |<   |S )Nr“   )r�   ÚKeyErrorr	   Úfrom_hexÚ	to_floats)r#   r—   ÚkeyÚcolor_floatss       r%   rš   z"PyMuPdfRenderBackend.resolve_color+  sb   € Ø�B�Qˆiˆð	Ø×$Ñ$ SÑ)Ð)øÜò 	Ùð	úä—|‘| EÓ*×4Ñ4Ó6ˆØ!-ˆ×Ñ˜#ÑØÐs   ‡ –	"¡"c                ó²  — 	 | j                   |   S # t        $ r Y nw xY w| j                  }| j                  t        j
                  k(  r+t        | j                  |«      t        z  | j                  z  }n>| j                  t        j                  k(  r!t        || j                  | j                  «      }t        | j                  |«      }|| j                   |<   |S rn   )r€   r¼   rˆ   r…   r   r„   rq   r‚   r;   rƒ   ÚRELATIVEÚmap_lineweight_to_stroke_widthr‡   r†   )r#   r–   Ústroke_widths      r%   r²   z)PyMuPdfRenderBackend.resolve_stroke_width5  sÍ   € ð	Ø×+Ñ+¨EÑ2Ð2øÜò 	Ùð	úà×,Ñ,ˆØ×!Ñ!Ô%5×%>Ñ%>Ò>ä�D×'Ñ'¨Ó/´,Ñ>À×AXÑAXÑXñ ð ×#Ñ#Ô'7×'@Ñ'@Ò@Ü9Ø�t×,Ñ,¨d×.CÑ.CóˆLô ˜4×4Ñ4°lÓCˆØ*6ˆ× Ñ  Ñ'ØÐs   ‚ ‘	œc                ó~   — | j                   }t        |«      }|j                  ||«       | j                  ||d¬«       y ©NF©r¶   )rŒ   r   Ú	draw_liner·   )r#   Úposrµ   r¡   s       r%   Ú
draw_pointzPyMuPdfRenderBackend.draw_pointG  s9   € Ø×"Ñ"ˆÜ�3‹iˆØ�‰˜˜SÔ!Ø×Ñ˜ 
°%ÐÕ8r&   c                óŒ   — | j                   }|j                  t        |«      t        |«      «       | j                  ||d¬«       y rÆ   )rŒ   rÈ   r   r·   )r#   ÚstartÚendrµ   r¡   s        r%   rÈ   zPyMuPdfRenderBackend.draw_lineM  s8   € Ø×"Ñ"ˆØ�‰œ˜U›¤T¨#£YÔ/Ø×Ñ˜ 
°%ÐÕ8r&   c                ó|   — | j                   }|D ]  \  }}|j                  ||«       Œ | j                  ||d¬«       y rÆ   )rŒ   rÈ   r·   )r#   Úlinesrµ   r¡   rÌ   rÍ   s         r%   Údraw_solid_linesz%PyMuPdfRenderBackend.draw_solid_linesR  s@   € ð ×"Ñ"ˆÛ‰JˆE�3Ø�O‰O˜E 3Õ'ð  à×Ñ˜ 
°%ÐÕ8r&   c                ó~   — t        |«      dk(  ry | j                  }t        ||d¬«       | j                  ||d¬«       y )Nr   FrÇ   )ÚlenrŒ   Úadd_path_to_shaper·   )r#   Úpathrµ   r¡   s       r%   Ú	draw_pathzPyMuPdfRenderBackend.draw_pathZ  s<   € Üˆt‹9˜Š>ØØ×"Ñ"ˆÜ˜% ¨UÕ3Ø×Ñ˜ 
°%ÐÕ8r&   c                ój   — | j                   }|D ]  }t        ||d¬«       Œ | j                  ||«       y )NTrÇ   )rŒ   rÓ   rº   )r#   Úpathsrµ   r¡   Úps        r%   Údraw_filled_pathsz&PyMuPdfRenderBackend.draw_filled_pathsa  s5   € ð ×"Ñ"ˆÛˆAÜ˜e Q¨dÖ3ð à×Ñ˜E :Õ.r&   c                ó    — |j                  «       }t        |«      dk  ry | j                  }|j                  |«       | j	                  ||«       y )Né   )Úto_listrÒ   rŒ   Údraw_polylinerº   )r#   Úpointsrµ   Úverticesr¡   s        r%   Údraw_filled_polygonz(PyMuPdfRenderBackend.draw_filled_polygoni  sJ   € ð —>‘>Ó#ˆÜˆx‹=˜1ÒØð ×"Ñ"ˆØ×Ñ˜HÔ%Ø×Ñ˜E :Õ.r&   c                óÜ  — |j                   }|j                  }|j                  \  }}}|dk(  sJ ‚t        |j	                  t        dd«      t        |d«      t        ||«      t        d|«      g«      «      }|D �	cg c]  }	|	j                  ‘Œ }
}	|D �	cg c]  }	|	j                  ‘Œ }}	t        j                  t        |
«      t        |«      ft        |
«      t        |«      f«      }|d   |d   z
  j                  }t        j                  |d«       }|j                  «       dkD  }|s|rµt         j"                  j%                  |d¬«      }|r3|j'                  t         j"                  j(                  j*                  «      }|r8|j-                  | t         j"                  j.                  j0                  dd¬	«      }t3        j4                  |«      }|j                  \  }}}t        j6                  t        j8                  t        j:                  «      ||t=        |j>                  «      d«      }| j@                  jC                  |d
|| jE                  |jF                  «      ¬«       y c c}	w c c}	w )Né   r   r   r•   ÚRGBA)ÚmodeT)r   r   r   r   )ÚresampleÚexpandÚ	fillcolorF)Úkeep_proportionrY   r±   )$r7   Úimager¡   ÚlistÚtransform_verticesr   ÚxÚyr   ÚRectÚminrq   Ú	angle_degÚmathÚiscloseÚdeterminantÚPILÚImageÚ	fromarrayÚ	transposeÚ	TransposeÚFLIP_TOP_BOTTOMÚrotateÚ
ResamplingÚBICUBICÚnpÚasarrayÚPixmapÚ
ColorspaceÚCS_RGBrd   Údatar?   Úinsert_imager«   r´   )r#   Ú
image_datarµ   r7   ré   Úheightr–   ÚdepthÚcornersrØ   ÚxsÚysÚrÚangleÚneed_rotateÚ	need_flipÚ	pil_imagerY   s                     r%   Ú
draw_imagezPyMuPdfRenderBackend.draw_imageu  s  € Ø×(Ñ(ˆ	Ø× Ñ ˆØ$Ÿ{™{Ñˆ��uØ˜ŠzÐˆzäØ×(Ñ(Ü�a˜“œT %¨›^¬T°%¸Ó-@Ä$ÀqÈ&Ã/ÐRóó
ˆñ
 #Ó#™7�aˆa�c‹c˜7ˆÐ#Ù"Ó#™7�aˆa�c‹c˜7ˆÐ#Ü�L‰Lœ#˜b›'¤3 r£7Ð+¬c°"«g´s¸2³wÐ-?Ó@ˆð ˜‘˜g a™jÑ(×3Ñ3ˆÜŸ,™, u¨cÓ2Ð2ˆð ×)Ñ)Ó+¨aÑ/ˆ	á™)ÜŸ	™	×+Ñ+¨E¸Ð+Ó?ˆIÙØ%×/Ñ/´·	±	×0CÑ0C×0SÑ0SÓT�	ÙØ%×,Ñ,Ø�FÜ ŸY™Y×1Ñ1×9Ñ9ØØ*ð	 -ó �	ô —J‘J˜yÓ)ˆEØ#(§;¡;Ñ ˆF�E˜5ä—‘Ü×ÑœwŸ~™~Ó.°°v¼uÀUÇZÁZÓ?PÐRVó
ˆð
 	�	‰	×ÑØØ!ØØ×.Ñ.¨z×/?Ñ/?Ó@ð	 	õ 	
ùò= $ùÚ#s   Á:I$ÂI)c                ó¦   — |j                   | _         |j                  r#|j                  dz  dz  }t        d|«      | _        |j                  | _        y )Ngffffff9@i,  rx   )r…   r‚   rq   rƒ   )r#   r¥   Úmin_lineweight_mms      r%   Ú	configurezPyMuPdfRenderBackend.configure¥  sM   € Ø!'×!9Ñ!9ˆÔØ× Ò à &× 5Ñ 5¸Ñ <¸sÑ BÐÜ"% dÐ,=Ó">ˆDÔØ"(×";Ñ";ˆÕr&   c                 ó   — y rn   © rŽ   s    r%   ÚclearzPyMuPdfRenderBackend.clear­  ó   € Ør&   c                ó8   — | j                   j                  «        y rn   )rŒ   rž   rŽ   s    r%   ÚfinalizezPyMuPdfRenderBackend.finalize°  s   € Ø×Ñ×!Ñ!Õ#r&   c                 ó   — y rn   r  )r#   Úentityrµ   s      r%   Úenter_entityz!PyMuPdfRenderBackend.enter_entity³  r  r&   c                 ó   — y rn   r  )r#   r  s     r%   Úexit_entityz PyMuPdfRenderBackend.exit_entity¶  r  r&   N)r?   ra   r(   rb   r_   r`   )r_   rd   )F)rL   re   )r_   rX   )r—   r   r_   r`   )rª   rX   r_   re   )rµ   r   r¶   Úboolr_   r`   )rµ   r   r_   r`   )r—   r   r_   ztuple[float, float, float])r–   Úfloatr_   r  )rÉ   r   rµ   r   r_   r`   )rÌ   r   rÍ   r   rµ   r   r_   r`   )rÏ   zIterable[tuple[Vec2, Vec2]]rµ   r   r_   r`   )rÔ   r   rµ   r   r_   r`   )r×   zIterable[BkPath2d]rµ   r   r_   r`   )rÞ   r   rµ   r   r_   r`   )r  r   rµ   r   r_   r`   )r¥   r   r_   r`   r^   )rf   rg   rh   ri   r!   rI   rT   r‘   r¢   r«   r·   rº   rš   r²   rÊ   rÈ   rÐ   rÕ   rÙ   rà   r  r  r  r  r  r  r  r&   r%   r]   r]   °   s¿   „ ñó",3ó^"ô:ó)óó
9ó
ó
óóó$9ó9ð
9Ø0ð9Ø>Oð9à	ó9ó9ð/Ø'ð/Ø5Fð/à	ó/ð
/Ø ð
/Ø.?ð
/à	ó
/ó.
ó`<óó$óôr&   r]   c                óª  — |j                   }|}|}|j                  «       D �]  }|j                  }|j                  t        j
                  k(  r(|r#|j                  |«      s| j                  ||«       |}n°|j                  t        j                  k(  r| j                  ||«       n€|j                  t        j                  k(  r| j                  ||j                  |«       nE|j                  t        j                  k(  r(| j                  ||j                  |j                  |«       |}|}�Œ |r%|j                  |«      s| j                  ||«       y y y rn   )rÌ   ÚcommandsrÍ   Útyper
   ÚMOVE_TOrò   rÈ   ÚLINE_TOÚ	CURVE3_TOÚ
draw_curveÚctrlÚ	CURVE4_TOÚdraw_bezierÚctrl1Úctrl2)r¡   rÔ   r¶   rÌ   Úsub_path_startÚ
last_pointÚcommandrÍ   s           r%   rÓ   rÓ   º  s  € à�J‰J€EØ€NØ€JØ—=‘=—?ˆØ�k‰kˆØ�<‰<œ7Ÿ?™?Ò*Ù˜^×3Ñ3°CÔ8Ø—‘  ~Ô6Ø ‰NØ�\‰\œWŸ_™_Ò,Ø�O‰O˜E 3Õ'Ø�\‰\œW×.Ñ.Ò.Ø×Ñ˜U G§L¡L°#Õ6Ø�\‰\œW×.Ñ.Ò.Ø×Ñ˜e W§]¡]°G·M±MÀ3ÔGØˆØŠ
ð #ñ �^×+Ñ+¨JÔ7Ø�‰˜
 NÕ3ð 8€ur&   c                ón   — t        t        | |«      |«      |z
  } ||z
  ||z
  z  }|t        | |z  d«      z   S )zDMap the DXF lineweight in mm to stroke-width in viewBox coordinates.r   )rq   rï   Úround)r³   rˆ   r‡   r‚   Úmax_lineweightÚfactors         r%   rÃ   rÃ   Ñ  sH   € ô ”S˜ ^Ó4°nÓEÈÑV€JØÐ!1Ñ1°nÀ~Ñ6UÑV€FØœe J°Ñ$7¸Ó;Ñ;Ð;r&   c                óX   — t        | «      r	 t        | d«      dz  S y# t        $ r Y yw xY w)Né   éÿ   ry   )rÒ   re   rS   )rM   s    r%   r›   r›   Þ  s=   € ô ˆ5„zð	Ü�u˜b“> CÑ'Ð'ð øô ò 	ØØð	ús   � �	)¨))r?   ra   r_   re   )rÔ   r   r¶   r  r_   r`   )rx   gáz®Gá @)r³   r  rˆ   r  r‡   r  r_   r  )rM   rX   r_   r  )6Ú
__future__r   rñ   Útypingr   r   r   r3   Ú	PIL.Imagerô   Únumpyrý   Ú
ezdxf.mathr   r   Úezdxf.colorsr	   Ú
ezdxf.pathr
   Úezdxf.versionr   Úezdxf.lldxf.validatorr   r¨   Ú
type_hintsr   rF   r   r   r   r   r¥   r   r   rµ   r   Ú r   r   r   r   Ú__annotations__ÚImportErrorrW   Ú__all__r;   rR   ÚRecorderr   r4   r]   rÓ   rÃ   r›   r  r&   r%   Ú<module>rE     s  ðö #ã ß /Ñ /Û ã Û ç *Ý Ý Ý %Ý =å ß FÓ Fß 3Ý )ß àÐ Ø€ˆÓ ð!Ûð Ð3Ð
4€ð €à/Ð ô|4�X×&Ñ&ô |4ó~4ôGÐ+ô GðT ò4ó ð4ð4 Øð
<Øð
<àð
<ð ð
<ð ó
<ôøðE ò !Ù	ØVôð !Òð	!ús   Á4C  Ã CÃC