
    OgAH                       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_installedgjZ@)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    a/var/www/html/public_html/myphp/venv/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9J9JK++D(; 99X&+Ft+L(..8
 / 
 	##))Z)@FB#<<TBL,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	''Cu'=F>>>-- 	+CF8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   ! %4FOO$5+/,, "	,
 ), 
,d %4FOO$5+/'' "	'
 )' 
'* $3FOO$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 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                         | _        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?   )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083L3LLM(

 (+%%%%(A(AAB(
 *-%%%%(C(CCD*
 HH%%b$*?*?AWAWX	r&   c                6    | j                   j                         S rn   )r|   rU   r#   s    r%   rI   z"PyMuPdfRenderBackend.get_pdf_bytes   s    xx!!r&   c                <    | j                   j                  ||      S )NrP   )r?   rT   )r#   rL   rM   s      r%   rT   zPyMuPdfRenderBackend.get_pixmap   s    yy##5#99r&   c                6    | j                   j                         S rn   )r?   get_svg_imager   s    r%   r   z"PyMuPdfRenderBackend.get_svg_image   s    yy&&((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_opacity	new_shape	draw_rectrr   rs   finishcommit)r#   r   rgbopacityshapes        r%   set_backgroundz#PyMuPdfRenderBackend.set_background   s}      '"51:.O#w#~ At44d6L6LMN4t#GLr&   c                6    | j                   j                         S rn   )r?   r   r   s    r%   r   zPyMuPdfRenderBackend.new_shape  s    yy""$$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<8H8H 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,<,<Qq,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)**:*:1Q*?@..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    BQi	$$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''/,>AXAXX  ##'7'@'@@9t,,d.C.CL 444lC*6  's    	c                    | j                         }t        |      }|j                  ||       | j                  ||d       |j	                          y NFr   )r   r   	draw_liner   r   )r#   posr   r   s       r%   
draw_pointzPyMuPdfRenderBackend.draw_pointG  sC     3iS!
%8r&   c                    | j                         }|j                  t        |      t        |             | j                  ||d       |j	                          y r   )r   r   r   r   r   )r#   startendr   r   s        r%   r   zPyMuPdfRenderBackend.draw_lineN  sB     UT#Y/
%8r&   c                    | j                         }|D ]  \  }}|j                  ||        | j                  ||d       |j                          y r   )r   r   r   r   )r#   linesr   r   r   r   s         r%   draw_solid_linesz%PyMuPdfRenderBackend.draw_solid_linesT  sO       	(JE3OOE3'	(
%8r&   c                    t        |      dk(  ry | j                         }t        ||d       | j                  ||d       |j	                          y )Nr   Fr   )lenr   add_path_to_shaper   r   )r#   pathr   r   s       r%   	draw_pathzPyMuPdfRenderBackend.draw_path]  sF    t9> %U3
%8r&   c                    | j                         }|D ]  }t        ||d        | j                  ||       |j                          y )NTr   )r   r   r   r   )r#   pathsr   r   ps        r%   draw_filled_pathsz&PyMuPdfRenderBackend.draw_filled_pathse  sD       	4AeQd3	4E:.r&   c                    |j                         }t        |      dk  ry | j                         }|j                  |       | j	                  ||       |j                          y )N   )to_listr   r   draw_polyliner   r   )r#   pointsr   verticesr   s        r%   draw_filled_polygonz(PyMuPdfRenderBackend.draw_filled_polygonn  sT     >>#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|rt         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_image{  s   ((	  ${{uzz((aT%^T%-@$q&/R

 ##aacc##"#aacc##LL#b'3r7+c"gs2w-?@ gaj(33,,uc22 ))+a/	)		++E+?I%//		0C0C0S0ST	%,,F YY1199*	 - 	 JJy)E#(;; FE5w~~.vuUZZ?PRV

 			!..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                     y rn   r  r   s    r%   finalizezPyMuPdfRenderBackend.finalize  r  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]   r]      s    "*YX":)%
9

$0>O	'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   JJENJ==? kk<<7??*^33C8~6 N\\W__,OOE3'\\W...UGLL#6\\W...eW]]GMM3G
 ^++J7
N3 8ur&   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^4nEVJ!11n~6UVFeJ$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=     5z	ub>C''   		s    	)))r?   ra   r_   re   )r   r   r   r  r_   r`   )rx   gz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 / |4X&& |4~4M+ M` 4 44 
<
<
< 
< 
<Q  !	V !	!s   4C   CC