
    BPc~                     P   d Z ddlZddlZddlmZ ddlmZ ddlZddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZ ddlZddlmZmZmZ  G d de          Z G d	 d
e          Zdg dg dgfdZd Zd Zd Z  G d de          Z!e"dk    r e!            #                                 dS dS )z9
An Inkscape extension for exporting Synfig files (.sif)
    N)deepcopy)etree)GroupLayerAnchorSwitchPathElementMetadata	NamedViewGradientSvgDocumentElementPath	Transform)MalformedSVGError
SynfigPrepget_dimensionc                       e Zd ZdZdS )UnsupportedExceptionzbWhen part of an element is not supported, this exception is raised to invalidate the whole elementN)__name__
__module____qualname____doc__     //usr/share/inkscape/extensions/synfig_output.pyr   r   1   s        llDr   r   c                      e Zd ZdZd7dZd Zd Zd Zd	 Zd
 Z	d Z
d Zd Zd Z eee	          Z ee
e          Z eee          Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd8dZd Zd Zd9dZi i dddfdZ	 d:d!Z i i d fd"Z!d;d#Z"d$ Z#g d%g d&gg d'd(fd)Z$g d%g d&gg d'd(fd*Z%d+ Z&d, Z'd<d.Z(d=d/Z)d>d1Z*d=d2Z+d=d3Z,d=d4Z-d?d6Z.dS )@SynfigDocumentzGA synfig document, with commands for adding layers and layer parameters      Synfig Animation 1c                     t          j        d                    |||                    | _        |                                  i | _        i | _        d S )Nz
    <canvas
        version="0.5"
        width="{:f}"
        height="{:f}"
        xres="2834.645752"
        yres="2834.645752"
        view-box="0 0 0 0"
        >
      <name>{}</name>
    </canvas>
    )r   
fromstringformatroot_canvas_update_viewbox	gradientsfilters)selfwidthheightnames       r   __init__zSynfigDocument.__init__:   sZ     + 	vt	 	
 
" 	r   c                     | j         S N)r$   r(   s    r   get_root_canvaszSynfigDocument.get_root_canvasS   s    r   c                 4    | j                                         S r.   )r$   getroottreer/   s    r   get_root_treezSynfigDocument.get_root_treeV   s    ++---r   c                    d                     | j         dz  t          j        z  | j        dz  t          j        z  | j        dz  t          j        z  | j         dz  t          j        z            }| j                            d|           dS )z5Update the viewbox to match document width and heightz{:f} {:f} {:f} {:f}       @zview-boxN)r#   r)   sifkuxr*   r$   set)r(   attr_viewboxs     r   r%   zSynfigDocument._update_viewboxY   s    ,33ZK#'K#'Jsw&[L3(	
 
 	Z66666r   c                 R    t          | j                            dd                    S )Nr)   0floatr$   getr/   s    r   	get_widthzSynfigDocument.get_widthc   s#    T%))'377888r   c                 ~    | j                             dt          |                     |                                  d S )Nr)   r$   r8   strr%   r(   values     r   	set_widthzSynfigDocument.set_widthf   s9    Wc%jj111r   c                 R    t          | j                            dd                    S )Nr*   r;   r<   r/   s    r   
get_heightzSynfigDocument.get_heightj   s#    T%))(C88999r   c                 ~    | j                             dt          |                     |                                  d S )Nr*   rA   rC   s     r   
set_heightzSynfigDocument.set_heightm   s9    Xs5zz222r   c                 8    | j                             dd          S )Nr+    )r$   r>   r/   s    r   get_namezSynfigDocument.get_nameq   s    ##FB///r   c                 d    | j                             d|           |                                  d S )Nr+   )r$   r8   r%   rC   s     r   set_namezSynfigDocument.set_namet   s3    VU+++r   c                 2    t          j                    j        S )zGenerate a new GUID)uuiduuid4hexr/   s    r   new_guidzSynfigDocument.new_guid~   s    z||r   c                      |t           j        z  S )z)Convert distance from SVG to Synfig unitsr6   r7   r(   distances     r   distance_svg2sifzSynfigDocument.distance_svg2sif       #'!!r   c                      |t           j        z  S )z)Convert distance from Synfig to SVG unitsrU   rV   s     r   distance_sif2svgzSynfigDocument.distance_sif2svg   rY   r   c                     |d         }| j         |d         z
  }|| j        dz  z  }|| j         dz  z  }|t          j        z  }|t          j        z  }||gS )z-Convert SVG coordinate [x, y] to Synfig unitsr      r5   )r*   r)   r6   r7   r(   vectorxys       r   coor_svg2sifzSynfigDocument.coor_svg2sif   s\    1IK&)#	TZ#	T[3	SW	SW1vr   c                     |d         t           j        z  | j        dz  z   }|d         t           j        z  | j        dz  z   }| j        |z
  }|                     ||g          |k    s
J d            ||gS )z-Convert Synfig coordinate [x, y] to SVG unitsr   r5   r]   z&sif to svg coordinate conversion error)r6   r7   r)   r*   rb   r^   s       r   coor_sif2svgzSynfigDocument.coor_sif2svg   s    1I$*s"221I$+"33K!O q!f%%///3 0// 1vr   c                 
   t          |          t          k    rt          |          dk    rt          |d                   t          k    st          |d                   t          k    rit          |d                   t          k    st          |d                   t          k    r-|                     |          }|d         |d<   |d         |d<   dS |D ]/}t          |          t          k    r|                     |           0dS )zAScan a list for coordinate pairs and convert them to Synfig units   r   r]   N)typelistlenintr=   rb   list_coor_svg2sifr(   ll_sifr`   s       r   rk   z SynfigDocument.list_coor_svg2sif        77d??s1vv{{AaDzzS  D1JJ%$7$7!::$$QqT

e(;(; --a00E 8AaD 8AaDF  	* 	*AAww$&&q)))	* 	*r   c                 
   t          |          t          k    rt          |          dk    rt          |d                   t          k    st          |d                   t          k    rit          |d                   t          k    st          |d                   t          k    r-|                     |          }|d         |d<   |d         |d<   dS |D ]/}t          |          t          k    r|                     |           0dS )z>Scan a list for coordinate pairs and convert them to SVG unitsrf   r   r]   N)rg   rh   ri   rj   r=   rd   list_coor_sif2svgrl   s       r   rq   z SynfigDocument.list_coor_sif2svg   ro   r   c                 <    |                      |d                    dS )z3Convert a BLine from SVG to Synfig coordinate unitspointsN)rk   r(   bs     r   bline_coor_svg2sifz!SynfigDocument.bline_coor_svg2sif        q{+++++r   c                 <    |                      |d                    dS )z3Convert a BLine from Synfig to SVG coordinate unitsrs   N)rq   rt   s     r   bline_coor_sif2svgz!SynfigDocument.bline_coor_sif2svg   rw   r   NTautoc                    || j                             d          }nt          j        |d          }|                    d|           |                    d|           |r|                    dd           n|                    dd           |dk    rt          j        |          }t          |          t          k    rt          |          }|                    d	|           |S )
zBuild an empty layerNlayerrg   descactivetruefalserz   version)
r$   makeelementr   
SubElementr8   r6   defaultLayerVersionrg   r=   rB   )r(   
layer_typer}   canvasr~   r   r|   s          r   build_layerzSynfigDocument.build_layer   s    >$0099EE$VW55E		&*%%%		&$ 	)IIh''''IIh(((f-j99G==E!!'llG		)W%%%r   c                 b    t           j        t          j        ||z
  dz  ||z
  dz  z             z  S )z.Calculate radius of a tangent given two pointsrf   )r6   tangent_scalemathsqrt)r(   p1xp1yp2xp2ys        r   _calc_radiuszSynfigDocument._calc_radius   s3      49cCiA-=sq@P-P#Q#QQQr   c                    ||z
  }||z
  }|dk    r,|dk    r&t           j        t          j        ||z            z   }n|dcxk    r|k    r(n n%t           j        t          j        ||z            z   }n|dk     r|dk     rt          j        ||z            }n|dcxk     r|k     r+n n(dt           j        z  t          j        ||z            z   }nq|dk    r|dk    rdt           j        z  dz  }nR|dk    r|dk     rt           j        dz  }n6|dk    r	|dk    rd}n'|dk     r	|dk    rd}n|dk    r|dk    rt           j        }|dz  t           j        z  S )z:Calculate angle (in radians) of a tangent given two pointsr   rf      )r   piatan)r(   r   r   r   r   dxdyags           r   _calc_anglezSynfigDocument._calc_angle   so   3Y3Y66b1ff49R"W---BB![[[[b[[[[[49R"W---BB!VVQ27##BB![[[[b[[[[[TWtyb111BB1WWadg!BB1WWa1BB1WWqBB!VVaBB!VVaBSDG##r   c           	         || j                             d          }nt          j        |d          }|                    d|           |dk    rC|+|                    d          }t          j        ||          }nt          j        d||          }|dk    rGt          j        |d          }|                    dt          t          |                               	n|dk    rGt          j        |d          }|                    dt          t          |                               	n|d	k    rt          j        |d	          }t          j        |d
          }	t          t          |d                             |	_        t          j        |d          }
t          t          |d                             |
_        n|dk    rt          j        |d          }t          j        |d          }t          t          |d                             |_        t          j        |d          }t          t          |d                             |_        t          j        |d          }t          t          |d                             |_        t          j        |d          }t          |          dk    r"t          t          |d                             nd|_        n|dk    rt          j        |d          }|                                D ]U}t          j        |d          }|                    dt          t          |                               ||         }t          j        |d          }t          t          |d                             |_        t          j        |d          }t          t          |d                             |_        t          j        |d          }t          t          |d                             |_        t          j        |d          }t          |          dk    r"t          t          |d                             nd|_        WnQ|dk    rGt          j        |d          }|r|                    dd           n|                    dd           n|dk    rt          j        |d          }t          |          t          k    r+|                    dd                    |                     nt          |          t          k    r+|                    dd                    |                     nct          |          t          k    r|                    d|           n3|dk    rt          j        |d          }|                    dd           |d          r|                    d d           n|                    d d           |d!         D ];}t          |d         d                   }	t          |d         d                   }
t          |d         d                   }t          |d         d                   }t          |d         d                   }t          |d         d                   }|                     |	|
||          }|                     |	|
||          }|                     |	|
||          }|                     |	|
||          d"z
  }|d         rd}nd}t          j        |d#          }t          j        |d$          }|                    dd           t          j        |d%          }t          j        |d	          }t          |	          t          j        |d
          _        t          |
          t          j        |d          _        t          j        |d&          } t          j        | d                              dd           t          j        |d'          }!t          j        |!d                              dd(           t          j        |d)          }"t          j        |"d                              d|           t          j        |d*          }#t          j        |d+          }$t          j        |#d,          }%|%                    dd	           t          j        |$d,          }&|&                    dd	           t          j        |%d-          }'t          j        |&d-          }(t          j        |'d          })t          j        |(d          }*|)                    dt          |                     |*                    dt          |                     t          j        |%d.          }+t          j        |&d.          },t          j        |+d/          }-t          j        |,d/          }.|-                    dt          |                     |.                    dt          |                     =n|d0k    r^t          j        |d0          }|                    d1d2           |                    d3d2           ||D ]}|                    |           n"t'          d4                    |                    |r|                    d5|           n(|                    d5|                                            |S )6zAdd a parameter node to a layerNparamr+   rz   rg   realrD   integerr_   r`   r   ra   r]   colorrgru   rf   a   z1.0gradientposboolr   r   timez{:d}sz{:f}sblinebline_pointlooprs   g     f@entry	compositepointr)   originz0.5splitt1t2radial_compositeradiusthetaangler   xresz10.0yreszUnsupported param type {}guid)r$   r   r   r   r8   r>   r6   	paramTyperB   r=   rj   textri   keysrg   r#   r   r   appendAssertionErrorrS   )/r(   r|   r+   rD   
param_typer   r   r   elr`   ra   r   r   ru   r   r   r   cvertextg1xtg1ytg2xtg2y
tg1_radius	tg1_angle
tg2_radius	tg2_angler   r   r   r   r_   r)   r   split_elr   r   t1_rct2_rct1_rt2_r	t1_radius	t2_radiust1_tt2_tt1_anglet2_angles/                                                  r   build_paramzSynfigDocument.build_param  s	   =$0099EE$UG44E		&$  "YYv..
 ]:t<<

 ]4u==
!%00BFF7Ce--....9$$!%33BFF7CE

OO,,,,8##!%22B S))AuQx))AF S))AuQx))AFF7""!%11B S))AuQx))AF S))AuQx))AF S))AuQx))AF S))A-0ZZ!^^SuQx)))AFF:%%!%44B zz|| C C(W55		%U3ZZ111#J$UC00U1Q4[[))$UC00U1Q4[[))$UC00U1Q4[[))$UC00-0VVaZZU1Q4[[)))UC 6!!!%00B )w''''w((((6!!!%00BE{{c!!wu 5 56666e%%wu 5 56666e##w&&&7""!%11BFF6=))) V} (vv&&&&vw'''/ <6 <6&)A,''&)A,''VAYq\**VAYq\**VAYq\**VAYq\**!..q!T4@@
 ,,Q4>>	!..q!T4@@
 ,,Q4>>F	!9 $"EE#E(W55!,UK@@	fm444(G<<)%::58VV --258VV --2(G<< //33GUCCC))X>> 0044WeDDD +Iw?? 62266wFFF%i66%i66(-?@@		&(+++(-?@@		&(+++'x88'x88!,T6::	!,T6::	gs:777gs:777'w77'w77 +D':: +D'::Wc)nn555Wc)nn5555y<6z 8##!%22BFF66"""FF66"""  " % %EIIe$$$$ !<!C!CJ!O!OPPP 	,FF64    FF64==??+++r   c                 ~   |                      |||||          }t          j        |          }	|	                                D ]z}
|	|
         d         }|
|                                v r	||
         }n|	|
         d         }|
|                                v r	||
         }nd}||                     ||
|||           {|S )ab  Create a new layer

        Keyword arguments:
        layer_type -- layer type string used internally by Synfig
        desc -- layer description
        params -- a dictionary of parameter names and their values
        guids -- a dictionary of parameter types and their guids (optional)
        active -- set to False to create a hidden layer
        r   r]   N)r   )r   r6   defaultLayerParamsr   r   )r(   r   r}   paramsguidsr   r~   r   r|   default_layer_params
param_namer   param_value
param_guids                 r   create_layerzSynfigDocument.create_layer  s    &   T667KK"5jAA.3355 	 	J-j9!<JV[[]]**$Z02:>qAUZZ\\))":.

!
&  :{JZ !    r   Fc                 8   |rt          d          |                    d          }|s
J d            |dk    rt          j        ||          }g }|                                D ]0}	|	                    d          |k    r|                    |	           1t          |          dk    r|                     |||||           d	S t          |          dk    rt          d          |                     d	||||          }
|                    |d         |
           d	S )
a  Set a layer parameter

        Keyword arguments:
        layer -- the layer to set the parameter for
        name -- parameter name
        value -- parameter value
        param_type -- parameter type (default "auto")
        guid -- guid of the parameter value
        z,Modifying linked parameters is not supportedrg   Layer does not have a typerz   r+   r   r]   z,Found multiple parameters with the same nameN)	r   r>   r6   r   iterchildrenr   ri   r   replace)r(   r|   r+   rD   r   r   modify_linkedr   existingr   	new_params              r   	set_paramzSynfigDocument.set_param  s6     	Q !OPPPYYv&&
777777z488J '')) 	' 	'Eyy  D((&&&x==AUD%TBBBBB]]Q !OPPP((tUJMMIMM(1+y11111r   c                     |                                 D ]^}||                                 v r'|                     ||||         ||         |           ?|                     ||||         |           _dS )zSet layer parameters

        Keyword arguments:
        layer -- the layer to set the parameter for
        params -- a dictionary of parameter names and their values
        guids -- a dictionary of parameter types and their guids (optional)
        )r   r   )r   N)r   r   )r(   r|   r   r   r   r   s         r   
set_paramszSynfigDocument.set_params  s     !++-- 	 	JUZZ\\)):&z*"/      :vj'9     	 	r   c                    |                     d          }|s
J d            |dk    rt          j        ||          }|                                D ]}|                     d          |k    rq|dk    r+t	          |d                              dd                    c S |d	k    r+t          |d                              d	d                    c S t          d
          dS )zGet the value of a layer parameter

        Keyword arguments:
        layer -- the layer to get the parameter from
        name -- param name
        param_type -- parameter type (default "auto")

        NOT FULLY IMPLEMENTED
        rg   r   rz   r+   r   r   rD   r;   r   z2Getting this type of parameter not yet implementedN)r>   r6   r   r   r=   rj   	Exception)r(   r|   r+   r   r   r   s         r   	get_paramzSynfigDocument.get_param  s     YYv&&
777777z488J'')) 		 		Eyy  D(('' qgs!;!;<<<<<9,,uQx||Is;;<<<<<#L   )		 		r   c                     || j         |<   dS )zRegister a filterN)r'   )r(   	filter_idfs      r   
add_filterzSynfigDocument.add_filter+  s    "#Yr         ?        r   r   r   r   rK   padc                     d||||d}|r||d<   |                                  |d<   n|dk    r||d<   nt          d          || j        |<   dS )	z%Register a linear gradient definitionlinear)rg   p1p2mtxspreadMethodstops
stops_guidrK   link#Gradient has neither stops nor linkNrS   r   r&   )	r(   gradient_idr   r   r   r   r   spread_methodr   s	            r   add_linear_gradientz"SynfigDocument.add_linear_gradient0  s     )
 
  	K %HW%)]]__H\""RZZ#HV#$IJJJ&.{###r   c	                     d|||||d}	|r||	d<   |                                  |	d<   n|dk    r||	d<   nt          d          |	| j        |<   dS )	z%Register a radial gradient definitionradial)rg   centerr   focusr   r   r   r   rK   r   r   Nr   )
r(   r   r  r   r  r   r   r   r   r   s
             r   add_radial_gradientz"SynfigDocument.add_radial_gradientK  s     )
 
  	K %HW%)]]__H\""RZZ#HV#$IJJJ&.{###r   c                 ~   || j                                         vrdS | j         |         }d|                                vs|d         dk    r|S |d         | j                                         vrt          d          |                     |d                   }|d         |d<   |d         |d<   |d= || j         |<   |S )ad  
        Return a gradient with a given id

        Linear gradient format:
        {
        "type"      : "linear",
        "p1"        : [x, y],
        "p2"        : [x, y],
        "mtx"       : mtx,
        "stops"     : color stops,
        "stops_guid": color stops guid,
        "spreadMethod": "pad", "reflect", or "repeat"
        }

        Radial gradient format:
        {
        "type"      : "radial",
        "center"    : [x, y],
        "radius"    : r,
        "focus"     : [x, y],
        "mtx"       : mtx,
        "stops"     : color stops,
        "stops_guid": color stops guid,
        "spreadMethod": "pad", "reflect", or "repeat"
        }

        Color stops format
        {
        0.0         : color ([r,g,b,a] or [r,g,b]) at start,
        [a number]  : color at that position,
        1.0         : color at end
        }
        Nr   rK   zLinked gradient ID not foundr   r   )r&   r   r   get_gradient)r(   r   r   linked_gradients       r   r  zSynfigDocument.get_gradienth  s    F dn1133334>+. ((HV,<,B,BO F4>#6#6#8#888#$BCCC++HV,<==+G4!0!>V '/{#r   c                    |                                 }|d         dk    rd|d<   n|d         dk    rd|d<   i }|d         D ]2}|d         |         }|dk    r	|||dz  <   |||dz  <   ||d	|dz  z
  <   3||d<   |d
         dk    ra|d         d         d|d         d         |d         d         z
  z  z   |d         d	         d|d         d	         |d         d	         z
  z  z   g|d<   |d
         dk    r|dxx         dz  cc<   |d         |d<   |d
         dk    r<|                     |d                   |d<   |                     |d                   |d<   |d
         dk    r<|                     |d                   |d<   |                     |d                   |d<   g d}|D ]}||                                v r||= |S )zDTransform gradient to a list of parameters to pass to a Synfig layerr   repeatTr   reflectr   r   r5   r]   rg   r   r   r   r   r  r   r   r  )rg   r   r   r   r  r   )copyrb   rX   r   )r(   r   r   	new_stopsr   valremoved_attribsr`   s           r   gradient_to_paramsz!SynfigDocument.gradient_to_params  s(    MMOO ^((AfII~)++AfI
 I z 3 3jo#::+.IcCi((+.IcCi(/2Ia#)m,,"AgJ yH$$dGAJ$
QtWQZ(?!@@dGAJ$
QtWQZ(?!@@$ yH$$(s" '
* V9  ''$00AdG''$00AdGV9  ++AhK88AhK//(<<AhK
 
 
 ! 	 	AAFFHH}}aDr   Blurc                     |                      d|t          j        d         ||gd          }|r||gz   S |                     ||gz             S )a!  Gaussian blur the given layers by the given x and y amounts

        Keyword arguments:
        layers -- list of layers
        x -- x-amount of blur
        y -- x-amount of blur
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        blurstraight)blend_methodsizer   )r   r6   blend_methodsop_encapsulate)r(   layersr`   ra   r+   is_endr  s          r   op_blurzSynfigDocument.op_blur  sk       $'$5j$AAq6RR ! 
 
  	8TF?"&&v777r   c                     |s|S ||S |                      |g          }|                     |d         dt          j        d                    ||z   }|r|S |                      |          S )a=  Apply a color overlay to the given layers

        Should be used to apply a gradient or pattern to a shape

        Keyword arguments:
        layers -- list of layers
        overlay -- color layer to apply
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        Nr   r  zstraight onto)r  r   r6   r  )r(   r  overlayr  overlay_encrets         r   op_colorzSynfigDocument.op_color  s      	M?M))7)44NNC,=o,N	
 	
 	
 {" 	,J&&s+++r   Inline Canvasc                 D    |s|S |                      d|d|i          }|gS )a  Encapsulate the given layers

        Keyword arguments:
        layers -- list of layers
        name -- Name of the PasteCanvas layer that is created
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of one layer
        PasteCanvasr   r  )r   )r(   r  r+   r  r|   s        r   r  zSynfigDocument.op_encapsulate  s7      	M!!-x>P!QQwr   c                 &   |D ]X}|                      |d          t          j        d         k    r,|                     |                     |          ||          c S Y|D ]2}|                      |d          }|                     |d||z             3|S )ac  Increase the opacity of the given layers by a certain amount

        Keyword arguments:
        layers -- list of layers
        opacity -- the opacity to apply (float between 0.0 to 1.0)
        name -- name of the Transform layer that is added
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        r  r   amount)r   r6   r  op_fader  r   )r(   r  opacityr  r|   r'  s         r   r(  zSynfigDocument.op_fade(  s      	R 	RE~~e^448I+8VVV||D$7$7$?$?&QQQQQ W  	> 	>E^^E844FNN5(FW,<====r   c                 
   || j                                         vr"t          d                    |                    	  | j         |         | ||          }t	          |          t
          k    sJ |S # t          $ r |cY S w xY w)zApply a filter to the given layers

        Keyword arguments:
        layers -- list of layers
        filter_id -- id of the filter
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        zFilter {} not found)r'   r   r   r#   rg   rh   r   )r(   r  r   r  r!  s        r   	op_filterzSynfigDocument.op_filter?  s     DL--////#$9$@$@$K$KLLL	)$,y)$??C99$$$$J# 	 	 	MMM	s   3A3 3BBc                 8   |s|S |dk    r|S |d         }t          |          dk    s |                     |d         d          dk    r|                     |          d         }t          |          }|                     |dt
          j        |                    |gS )a[  Set the blend method of the given group of layers

        If more than one layer is supplied, they will be encapsulated.

        Keyword arguments:
        layers -- list of layers
        blend_method -- blend method to give the layers
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        r   r   r]   r'  r   r  )ri   r   r  r   r   r6   r  )r(   r  r  r  r|   s        r   op_set_blendzSynfigDocument.op_set_blendT  s      	M;&&Mq	v;;??dnnVAYAASHH''//2Eunc.?.MNNNwr   r   c                    |s|S ||g dg dgk    r|S ddg}ddg}ddg}ddg}ddg}	ddg}
t          |                              |          }t          |                              |          }t          |                              |	          }	t          |                              |
          }
|                     d||                     |          |                     |          |                     |          |                     |          |                     |	          |                     |
          d          }|r||gz   S |                     ||gz             S )	a:  Apply a matrix transformation to the given layers

        Keyword arguments:
        layers -- list of layers
        mtx -- transformation matrix
        name -- name of the Transform layer that is added
        is_end -- set to True if layers are at the end of a canvas

        Returns: list of layers
        Nr   r   d      warp)src_tlsrc_brdest_tldest_trdest_brdest_blr  )r   apply_to_pointr   rb   r  )r(   r  r   r+   r  r2  r3  r4  r5  r6  r7  r1  s               r   op_transformzSynfigDocument.op_transformo  s     	M;#///???!CCCMss****C..//88C..//88C..//88C..//88  ++F33++F33,,W55,,W55,,W55,,W55  ! 
 
  	8TF?"&&v777r   )r   r   r    )NTrz   )rz   N)rz   NF)rz   )r  FF)r#  F)r   F)/r   r   r   r   r,   r0   r3   r%   r?   rE   rG   rI   rL   rN   propertyr)   r*   r+   rS   rX   r[   rb   rd   rk   rq   rv   ry   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r"  r  r(  r+  r-  r9  r   r   r   r   r   7   sL       QQ   2     . . .7 7 79 9 9  : : :  0 0 0   HY	**EXj*--F8Hh''D     " " "" " "
 
 
  * * *"* * *", , ,, , ,   0R R R
$ $ $2^ ^ ^ ^N ' ' ' 'T OT!2 !2 !2 !2F (*5    ,   <$ $ $ __ooo./ / / /B __ooo./ / / /:9 9 9v; ; ;D8 8 8 8,, , , ,8   "   .   *   6-8 -8 -8 -8 -8 -8r   r   r   r   c                 "   | sg S t          |                                           }|d}n|}t          t          |                    D ]}|dz  }g }g }g }g }	d}
|D ]}|\  }}|dk    r)|g k    r#t	          d                    ||                    |dk    r|r=|d         d                             |	dd         |dd         |dd         |
g           |                    dd	g d
           |dd         }|dd         }|dd         }	|d         dk    rd	nd}
|dd         }|dv r|d         d                             |	dd         |dd         |dd         |
g           |dk    r!|d         |d         g}|d         |d         g}	n;|dk    r!|d         |d         g}|d         |d         g}	n|dd         }|dd         }	|d         dk    rd	nd}
|dd         }|dk    rm|d         d                             |	dd         |dd         |dd         |
g           |dd         }|dd         }	|d         dk    rd	nd}
|dd         } |dk    r|dd         }|dd         }|dd         }|d         }d|d         z  d|d         z  z   }d|d         z  d|d         z  z   }|d         }|d         }d|d         z  d|d         z  z   }d|d         z  d|d         z  z   }|d         }|d         d                             |	dd         ||g||g|
g           ||g}||g}	|d         dk    rd	nd}
|dd         }|dk    rddlm}  ||dd         |dd                   }|	dd         |d         d<   |d         d         }|d         d         }	|d         dk    rd	nd}
|dd         }|dd         D ]8}|                    d           |d         d                             |           9|dk    rt          |d         d                   dk    r>|d         d                             |	dd         |dd         |dd         d	g           nc||k    r |	dd         |d         d         d         d<   n=|d         d                             |	dd         |dd         |dd         |
g           g }g }	d}
d|d         d<   |r=|d         d                             |	dd         |dd         |dd         |
g           |g dg dgk    rc|D ]`}|d         D ]U}|D ]P}t          |t                    s9t          |                              |          }|d         |d         c|d<   |d<   QVa|S )a  
    Convert a path to a BLine List

    bline_list format:

    Vertex:
    [[tg1x, tg1y], [x,y], [tg2x, tg2y], split = T/F]
    Vertex list:
    [ vertex, vertex, vertex, ...]
    Bline:
    {
    "points"    : vertex_list,
    "loop"      : True / False
    }
    NrK   r   TMz5Bad path data: path doesn't start with moveto, {}, {}r   rs   F)	nodetypesr   rs   r   zr]   LHVHVCrf      QgUUUUUU?gUUUUUU?A)arc_to_pathZr   r   r   )r   	to_arraysrangeri   r   r#   r   inkex.pathsrH  
isinstancer   r   r8  ) path_dr>  r   pathnt_
bline_listsubpathstartlastlastctrl	lastsplitscmdr   q0q1q2x0x1x2x3y0y1y2y3rH  arcpr   r   r   r   pnts                                    r   path_to_bline_listrf    s   $  	 <<!!##D 3t99  
c	 JLDHI ]* ]*V#::***#GNNqRVWW   CZZ 2x(//aaa[$qqq'47I>   BLLMMM!!!!9L!!!9DaaayH!#A#4IABBBBE\\rN8$++Xaaa[$qqq'47I,VWWWczzq	47+"1ItAw/Q+ GVAY/aaay!!!!9!#A#4IABBBBCZZrN8$++!!!d111gvbqbz9=   "##;Dac{H!#A#4IABBBBCZZaaaB!B!BAB2a57RU?2B2a57RU?2BABAB2a57RU?2B2a57RU?2BABrN8$++!!!r2hR)<   8DBxH!#A#4IABBBBCZZ//////;tAAAwqqq	22D!!!!DGAJ8A;DBx{H!#A#4IABBB3B3i 4 4		$2x(//33334 CZZ:b>(+,,11 2x(//!!!d111gtAAAwPU0VWWWW%% 2:!!!
2x(+A.. 2x(//aaa[$qqq'47I>  
 DHI &*JrN6" T2x ''!!!d111gtAAAw	(RSSS 000 	< 	<E/ < <# < <E%eT22 <'nn;;EBB-0VSV*a%(<< r   c                    ||                                  v r=| |         dk    rg dS t          j        | |                                                   }nd}t	          |d         dz  t
          j                  t	          |d         dz  t
          j                  t	          |d         dz  t
          j                  dg}|D ];}||                                  v r#|d	xx         t          | |                   z  cc<   <|S )
Nnone)r]   r]   r]   r   )r   r   r   r   g     o@r]   rf   r   r   )r   inkexColorto_rgbpowr6   gammar=   )stylecolor_attribopacity_attribsr   r   r)  s         r   extract_colorrq  F  s    uzz||##&((<<Kl+,,3355 	AaD5L#)$$AaD5L#)$$AaD5L#)$$	E # . .ejjll""!HHHeGn---HHHLr   c                 p    d}|D ]0}||                                  v r|t          | |                   z  }1|S )Nr   )r   r=   )rn  rp  r!  r)  s       r   extract_opacityrs  \  sE    
C" ) )ejjll""5w(((CJr   c                 :   ||                                  v rt          | |                   }nd}|d         d         |d         d         z  |d         d         |d         d         z  z
  }t          j        t	          |                    }||z  t
          j        z  S )Nr]   r   )r   r   r   r   absr6   r7   )rn  width_attribr   r)   area_scale_factorlinear_scale_factors         r   extract_widthry  d  s    uzz||##eL122Aq	CF1I-Aq	CF1I0EE)C(9$:$:;;&&00r   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )SynfigExportc                 .    t          j        |            d S r.   )r   r,   r/   s    r   r,   zSynfigExport.__init__r  s    D!!!!!r   c                 j   t          j        |            | j                                        }t	          |                    dd                    }t	          |                    dd                    }|                    d          }||j        }n|                    dd          }t          |||          }g }|	                                D ]}|| 
                    ||          z  }|                                }	|D ]}
|	                    |
           |                                | _        d S )Nr)   r   r*   r   z	svg:titlezsodipodi:docnamer    )r   effectdocumentgetrootr   r>   
getElementr   r   r   convert_noder0   r   r3   synfig_document)r(   svgr)   r*   titler+   docr  noder$   r|   s              r   r~  zSynfigExport.effectu  s/   $m##%%cgggt4455swwx5566{++:DD77-/CDDDUFD11$$&& 	3 	3Dd''c222FF))++ 	& 	&Eu%%%%"0022r   c                 :    | j                             |           d S r.   )r  write)r(   streams     r   savezSynfigExport.save  s    ""6*****r   c           	         t          |t                    r|                     ||           g S t          |t          t          t
          t          t          t          f          sg S g }t          |t                    rT|D ]}|| 	                    ||          z  }t          |t                    r |j        pd}|                    ||          }nft          |t          t
          f          r|D ]}|| 	                    ||          z  }n+t          |t                    r|                     ||          }|j        }d|                                v rZ|d                             d          r?|d         dd                             d          d         }|                    ||          }t'          |d	          }|d
k    r|                    ||          }|S )z.Convert an SVG node to a list of Synfig layersr#  )r+   filterurl   N)r   r)  r   )rM  r   
parse_defsr   r   r   r	   r
   r   r  r   labelr  convert_pathrn  r   
startswithr   r+  rs  r(  )	r(   r  dr  subnoder+   rn  r   r)  s	            r   r  zSynfigExport.convert_node  s    d.// 	OOD!$$$I5&&+xK
 
 	 IdE"" 	0 8 8$++GQ777$&& =z4_))&t)<<vv.// 	0 8 8$++GQ7778k** 	0&&tQ//F
uzz||##h(B(B5(I(I#h+11#66q9I[[33F!%33c>>YYvw//Fr   c                     |                                 D ]O}t          |t                    r|                     ||           .|j        dk    r|                     ||           Pd S )Nr  )r   rM  r   parse_gradientTAGparse_filter)r(   r  r  childs       r   r  zSynfigExport.parse_defs  sv    &&(( 	, 	,E%** ,##E1----h&&!!%+++		, 	,r   c           	         |j         dk    rZ|                    dt          t          |                              }t	          |                    dd                    }t	          |                    dd                    }t	          |                    dd                    }t	          |                    dd                    }|j        j        }|                    dd	          d
d          }	|                    dd          }
|	dk    r7|                     ||          }|                    |||g||g|||
           d S |                    |||g||g||	|
           d S |j         dk    r|                    dt          t          |                              }t	          |                    dd                    }t	          |                    dd                    }t	          |                    dd                    }t	          |                    dd                    }t	          |                    dd                    }|j        j        }|                    dd	          d
d          }	|                    dd          }
|	dk    r8|                     ||          }|	                    |||g|||g|||
           d S |	                    |||g|||g||	|
           d S d S )NlinearGradientidr]  z0.0r^  ra  rb  z
xlink:href#r]   r   r   rK   )r   r   )r   r   radialGradientcxcyr   fxfy)
r  r>   rB   r  r=   gradientTransformmatrixparse_stopsr  r  )r(   r  r  r   r]  r^  ra  rb  r   r   r   r   r  r  r   r  r  s                    r   r  zSynfigExport.parse_gradient  s   8'''((4RXX77Ktxxe,,--Btxxe,,--Btxxe,,--Btxxe,,--B(/C88L#..qrr2D HH^U;;Mrzz((q11%%HH"/ &      %%HH"/ &      X)))((4RXX77Ktxxe,,--Btxxe,,--BdhhsE**++Atxxe,,--Btxxe,,--B(/C88L#..qrr2D HH^U;;Mrzz((q11%%HH"/ &      %%HH"/ &     1 *)r   c                     i }|                                 D ]Y}|j        dk    r>t          |                    d                    }|j        }t          |dd          ||<   Kt          d          |S )Nstopoffsetz
stop-colorzstop-opacityzChild of gradient is not a stop)r   r  r=   r>   rn  rq  r   )r(   r  r  r   r  r  rn  s          r   r  zSynfigExport.parse_stops  s|    %%'' 	K 	KDx6!!txx1122
 -e\> R Rf'(IJJJr   c                                          dt          t                                        }dfd	}|                    ||           d S )Nr  Fc                 X   ||d}| }                                 D ]N}|                    d          |vrt          ||                    d                   }g }|j        dk    r|                    dd          }|                    dd                                          }t          |d                   }	t          |          d	k    rt          |d	                   }
n|	}
|	dk    r
|
dk    r|}nE|                     |	          }	|                     |
          }
| 	                    ||	|
d
          }n |j        dk    r|                    dd          }|dk    rd}n3|dk    rd}n*|dk    rd}n!|dk    rd}n|dk    rd}nt          d          |                    d          dk    r0d}|                     ||          |                     |d          z   }nZ|                    d          |vrt          ||                    d                   }||                     ||          z   }nt          |                    d          r|||                    d          <   ||d <   Pt          |d                    d	k    r|r|                     |d                    S |d          S )N)NSourceGraphicinfeGaussianBlurstdDeviationr;   , r   r]   T)r  feBlendmodenormalr   multiplyscreendarkenlightenbrightenzInvalid blend methodin2BackgroundImageFbehindresult)r   r>   r   r  r   r   r=   ri   rX   r  r   r-  r  )r  r  r  refsencapsulate_resultr  l_inl_outstd_devr`   ra   r  r  l_in2r  s                 r   
the_filterz-SynfigExport.parse_filter.<locals>.the_filter  s    6::D%+**,, =# =#99T??$.. /.EIIdOO,9 000#ii<<G%ooc377==??Ggaj))A7||a''!'!*--Avv!q&& $..q11..q11 !		$1T	 B BY)++ !99VX66Dx'''2++'1))'/))'/**'1/0FGGGyy''+<<<-2* !t\ B BQ^^ (F F ! 5))5522 $UYYu%5%5 6 %t\(J(J J /. 99X&& 605D8,,- #T

 4:""'9"''T
333Dz!r   r:  )r>   rB   r  r   )r(   r  r  r   r  s    `   r   r  zSynfigExport.parse_filter  sc    HHT3r$xx==11	G	" G	" G	" G	" G	" G	"R 	
Y
+++++r   c                    g }|                     dt          t          |                              }|j        }|j        j        }t          |                     d          |                     d          |          }|D ]}|                    |           |                                }	|	                    dd          dk    r)|d         
                    d          rg d}
nt          |dd	          }
|                    d
|||
|	                    dd          dk    rdnddd|	i          }|d         
                    d          r|                     |d         dd                             d          d         ||          d         }|                    |g|          d         }|                    |gt#          |d	                    d         }|                    |           |	                    dd          dk    rs|d         
                    d          rg d}
nt          |dd          }
|                    d|||
t'          |d|          |	                    dd          dk    rdnd|	                    dd           d k    rdnd|	                    dd           d k    rdndd!d|	i          }|d         
                    d          r|                     |d         dd                             d          d         ||          d         }|                    |g|          d         }|                    |gt#          |d                    d         }|                    |            |S )"z3Convert an SVG path node to a list of Synfig layersr  r  zsodipodi:nodetypesfillz#000000rh  r  )r   r   r   r]   zfill-opacityregionz	fill-rulenonzeroevenoddr]   r   )r   r   winding_styler   r   r  Nr  )r  strokezstroke-opacityoutlinezstroke-widthzstroke-linejoinmiterTFzstroke-linecapbutt)r   r   r)   sharp_cuspszround_tip[0]zround_tip[1])r>   rB   r  rn  	transformr  rf  rv   rS   
setdefaultr  rq  r   convert_urlr   r"  r(  rs  r   ry  )r(   r  r  r  node_idrn  r   blinesr   
bline_guidr   r|   color_layers                r   r  zSynfigExport.convert_path[  s   ((4RXX//
n##DHHSMM488<P3Q3QSVWW I	% I	%E  '''J	22f<<=++E22 I )LLEE)%HHE!&!& ++KCCyPP *+  #J/ '   =++E22 "&"2"2fabb)//44Q7a# ##K JJwJDDQGEIIugun/U/UVVE e$$$&11V;;?--e44 M )LLEE)%;KLLE!&!&!.unc!J!J ++,=wGG7RR (,t" ++,<fEEOO ).! ++,<fEEOO ).!  #J/# '  ( ?--e44 "&"2"2h+11#66q93# ##K JJwJDDQGEII8H!I!I E e$$$r   c                    |                     |          }|dgS |d         dk    r4|                    d||                    |          d|d         i          }|d         dk    r4|                    d	||                    |          d|d         i          }t          |          t          |d
                   z  }|                    |g|j                  S )zIReturn a list Synfig layers that represent the gradient with the given idNrg   r   linear_gradientr   r   r  r  radial_gradientr   )r  r   r  r   r9  r  )r(   url_idr   r  r   r|   trms          r   r  zSynfigExport.convert_url  s    >>&))6MFx''NN!$$X..!8L#9:	 #  E Fx''NN!$$X..!8L#9:	 #  E nny%999~~ugsz222r   N)r   r   r   r,   r~  r  r  r  r  r  r  r  r  r   r   r   r{  r{  q  s        " " "3 3 32+ + +$ $ $L, , ,? ? ?B
 
 
N, N, N,`T T Tl3 3 3 3 3r   r{  __main__)$r   r   rP   r  r   lxmlr   ri  r   r   r   r   r	   r
   r   r   r   r   r   synfig_fileformatr6   synfig_preparer   r   r   r   r   objectr   rf  rq  rs  ry  r{  r   runr   r   r   <module>r     s  (                                               G G G G G G G G G G	 	 	 	 	9 	 	 	e8 e8 e8 e8 e8V e8 e8 e8Z *.OOO___3U \ \ \ \D  ,  	1 	1 	1X3 X3 X3 X3 X3: X3 X3 X3v
 zLNN r   