Sif2svg.xsl
From Synfig Studio :: Documentation
Revision as of 18:43, 30 December 2018 by Bazza (Talk | contribs) (Created page with "<pre> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math" xmlns:str="http:...")
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math" xmlns:str="http://exslt.org/strings" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:template match="canvas"> <svg version="1.1" width="{@width}" height="{@height}" filter="url(#gamma)"> <xsl:attribute name="viewBox"> <xsl:variable name="view-box" select="str:split(@view-box)"/> <xsl:value-of select="0+$view-box[1]"/> <xsl:text> </xsl:text> <xsl:value-of select="-$view-box[2]"/> <xsl:text> </xsl:text> <xsl:value-of select="-$view-box[1]+$view-box[3]"/> <xsl:text> </xsl:text> <xsl:value-of select="$view-box[2]-$view-box[4]"/> </xsl:attribute> <xsl:if test="@antialias=0"> <xsl:attribute name="shape-rendering">optimizeSpeed</xsl:attribute> </xsl:if> <defs> <filter id="gamma"> <feComponentTransfer> <feFuncR type="gamma" exponent="0.45"/> <feFuncG type="gamma" exponent="0.45"/> <feFuncB type="gamma" exponent="0.45"/> </feComponentTransfer> </filter> </defs> <xsl:apply-templates select="layer|name|desc"/> </svg> </xsl:template> <xsl:template match="name"> <title><xsl:value-of select="."/></title> </xsl:template> <xsl:template match="desc"> <desc><xsl:value-of select="."/></desc> </xsl:template> <xsl:template match="layer"> <error type="{@type}"/> </xsl:template> <xsl:template match="layer[@type='PasteCanvas']"> <g transform="translate({param/vector/x}, {-param/vector/y})"> <xsl:apply-templates select="param[@name='canvas']/canvas/layer"/> </g> </xsl:template> <xsl:template match="layer[@type='rectangle']"> <rect id="{@desc}" x="{math:min(param/vector/x)}" y="{-math:max(param/vector/y)}" width="{math:abs(param[@name='point2']/vector/x - param[@name='point1']/vector/x)}" height="{math:abs(param[@name='point2']/vector/y - param[@name='point1']/vector/y)}" fill-opacity="{param[@name='amount']/real/@value * param/color/a}"> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> </rect> </xsl:template> <xsl:template match="layer[@type='import']"> <image id="{@desc}" xlink:href="{param[@name='filename']/string}" x="{math:min(param/vector/x)}" y="{-math:max(param/vector/y)}" width="{math:abs(param[@name='br']/vector/x - param[@name='tl']/vector/x)}" height="{math:abs(param[@name='br']/vector/y - param[@name='tl']/vector/y)}"> <xsl:if test="param[@name='br']/vector/x < param[@name='tl']/vector/x"> <xsl:attribute name="transform"> <xsl:text>scale(</xsl:text> <xsl:choose> <xsl:when test="param[@name='br']/vector/x < param[@name='tl']/vector/x"> <xsl:text>-1</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>1</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>,</xsl:text> <xsl:text>1</xsl:text> <xsl:text>)</xsl:text> </xsl:attribute> </xsl:if> </image> </xsl:template> <xsl:template match="layer[@type='star']"> <circle id="{@desc}" cx="{param[@name='origin']/vector/x}" cy="{-param[@name='origin']/vector/y}" r="{param[@name='radius1']/real/@value}" r2="{param[@name='radius1']/real/@value}" points="5"> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> </circle> </xsl:template> <xsl:template match="layer[@type='circle']"> <circle id="{@desc}" r="{param[@name='radius']/real/@value}" fill-opacity="{param[@name='amount']/real/@value * param/color/a}"> <xsl:attribute name="cx"> <xsl:choose> <xsl:when test="param[@name='origin']/vector"> <xsl:value-of select="param[@name='origin']/vector/x"/> </xsl:when> <xsl:when test="param[@name='pos']/vector"> <xsl:value-of select="param[@name='pos']/vector/x"/> </xsl:when> <xsl:when test="param[@name='origin']/animated[@type='vector']"> <xsl:value-of select="param[@name='origin']/animated[@type='vector']/waypoint/vector/x"/> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:attribute name="cy"> <xsl:choose> <xsl:when test="param[@name='origin']/vector"> <xsl:value-of select="-param[@name='origin']/vector/y"/> </xsl:when> <xsl:when test="param[@name='pos']/vector"> <xsl:value-of select="-param[@name='pos']/vector/y"/> </xsl:when> <xsl:when test="param[@name='origin']/animated[@type='vector']"> <xsl:value-of select="-param[@name='origin']/animated[@type='vector']/waypoint/vector/y"/> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> <xsl:if test="param[@name='origin']/animated[@type='vector']"> <xsl:call-template name="smilTransform"> <xsl:with-param name="type" select="'translate'"/> <xsl:with-param name="time" select="param[@name='origin']/animated[@type='vector']/waypoint"/> <xsl:with-param name="animate" select="param[@name='origin']/animated[@type='vector']/waypoint/vector"/> </xsl:call-template> <!--<xsl:call-template name="smilXML"> <xsl:with-param name="attribute" select="'cx'"/> <xsl:with-param name="time" select="param[@name='origin']/animated[@type='vector']/waypoint/@time"/> <xsl:with-param name="animate" select="param[@name='origin']/animated[@type='vector']/waypoint/vector/x"/> </xsl:call-template> <xsl:call-template name="smilXML"> <xsl:with-param name="attribute" select="'cy'"/> <xsl:with-param name="time" select="param[@name='origin']/animated[@type='vector']/waypoint/@time"/> <xsl:with-param name="animate" select="param[@name='origin']/animated[@type='vector']/waypoint/vector/y"/> </xsl:call-template>--> </xsl:if> </circle> </xsl:template> <xsl:template match="layer[@type='text']"> <xsl:variable name="text" select="str:split(param[@name='text']/string, ' ')"/> <xsl:variable name="x"> <xsl:if test="param[@name='origin']/vector/x"> <xsl:value-of select="param[@name='origin']/vector/x"/> </xsl:if> <xsl:if test="param[@name='pos']/vector/x"> <xsl:value-of select="param[@name='pos']/vector/x"/> </xsl:if> </xsl:variable> <text id="{@desc}" x="{$x}" font-weight="{param[@name='weight']/integer/@value}" font-family="{param[@name='family']/string}" text-anchor="middle" fill-opacity="{param[@name='amount']/real/@value * param/color/a}"> <xsl:attribute name="y"> <xsl:if test="param[@name='origin']/vector/y"> <xsl:value-of select="-param[@name='origin']/vector/y - count($text) div 8.75"/> </xsl:if> <xsl:if test="param[@name='pos']/vector/y"> <xsl:value-of select="-param[@name='pos']/vector/y - count($text) div 8.75"/> </xsl:if> </xsl:attribute> <xsl:attribute name="font-size"> <xsl:value-of select="param[@name='size']/vector/x * 1"/> </xsl:attribute> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> <xsl:for-each select="$text"> <xsl:choose> <xsl:when test="1 = position()"> <xsl:value-of select="."/> </xsl:when> <xsl:otherwise> <tspan x="{$x}" dy="1em"><xsl:value-of select="."/></tspan> </xsl:otherwise> </xsl:choose> </xsl:for-each> </text> </xsl:template> <xsl:template match="layer[@type='polygon']"> <xsl:variable name="origin" select="param[@name='origin']/vector"/> <polygon id="{@desc}" fill-opacity="{param[@name='amount']/real/@value * param/color/a}"> <xsl:attribute name="points"> <xsl:for-each select="param[@name='vector_list']/dynamic_list[@type='vector']/entry/vector"> <xsl:value-of select="$origin/x + x"/><xsl:text>,</xsl:text> <xsl:value-of select="-$origin/y - y"/><xsl:text> </xsl:text> </xsl:for-each> </xsl:attribute> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> </polygon> </xsl:template> <xsl:template match="layer[@type='region'] | layer[@type='outline']"> <xsl:variable name="x" select="param[@name='origin']/vector/x"/> <xsl:variable name="y" select="-param[@name='origin']/vector/y"/> <xsl:variable name="points"> <xsl:for-each select="param[@name='bline']/bline[@type='bline_point']/entry/composite[@type='bline_point']"> <xsl:choose> <xsl:when test="position() = 1"> <xsl:text>M </xsl:text><xsl:value-of select="$x + point/vector/x"/>,<xsl:value-of select="$y - point/vector/y"/> <xsl:text> C </xsl:text><xsl:value-of select="$x + point/vector/x + t2/radial_composite[@type='vector']/radius/real/@value * -math:cos(t2/radial_composite[@type='vector']/theta/angle/@value) div 3"/>,<xsl:value-of select="$y - point/vector/y + t2/radial_composite[@type='vector']/radius/real/@value * math:sin(t2/radial_composite[@type='vector']/theta/angle/@value) div 3"/> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text><xsl:value-of select="$x + point/vector/x + t1/radial_composite[@type='vector']/radius/real/@value * -math:cos(3.14159 * t1/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/>,<xsl:value-of select="$y - point/vector/y + t1/radial_composite[@type='vector']/radius/real/@value * math:sin(3.14159 * t1/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/> <xsl:text> </xsl:text><xsl:value-of select="$x + point/vector/x"/>,<xsl:value-of select="$y - point/vector/y"/> <xsl:text> C </xsl:text><xsl:value-of select="$x + point/vector/x + t2/radial_composite[@type='vector']/radius/real/@value * math:cos(3.14159 * t2/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/>,<xsl:value-of select="$y - point/vector/y + t2/radial_composite[@type='vector']/radius/real/@value * -math:sin(3.14159 * t2/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:if test="param[@name='bline']/bline[@loop] = 'true'"> <!-- FIXME: reprendre ici demain. --> <xsl:text> </xsl:text><xsl:value-of select="$x + param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/point/vector/x + param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/t1/radial_composite[@type='vector']/radius/real/@value * -math:cos(3.14159 * param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/t1/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/>,<xsl:value-of select="$y - param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/point/vector/y + param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/t1/radial_composite[@type='vector']/radius/real/@value * math:sin(3.14159 * param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/t1/radial_composite[@type='vector']/theta/angle/@value div 180) div 3"/> <xsl:text> </xsl:text><xsl:value-of select="$x + param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/point/vector/x"/>,<xsl:value-of select="$y - param[@name='bline']/bline[@type='bline_point']/entry[1]/composite[@type='bline_point']/point/vector/y"/> </xsl:if> </xsl:variable> <path id="{@desc}" d="{$points}"> <xsl:choose> <xsl:when test="@type='region'"> <xsl:attribute name="fill"> <xsl:apply-templates select="param/color"/> </xsl:attribute> <xsl:attribute name="stroke">none</xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="stroke"> <xsl:apply-templates select="param/color"/> </xsl:attribute> <xsl:attribute name="stroke-width"><xsl:value-of select="param[@name='width']/real/@value"/></xsl:attribute> <xsl:attribute name="fill">none</xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:if test="param[@name='origin']/animated[@type='vector']"> <xsl:call-template name="smilTransform"> <xsl:with-param name="attribute" select="'translate'"/> <xsl:with-param name="time" select="param[@name='origin']/animated[@type='vector']/waypoint"/> <xsl:with-param name="animate" select="param[@name='origin']/animated[@type='vector']/waypoint/vector"/> </xsl:call-template> </xsl:if> </path> </xsl:template> <!--<xsl:template match="layer[@type='linear_gradient']"> <defs> <linearGradient id="{@desc}" x1="0" y1="0" x2="{math:min(param[@name='p2']/vector/x)}" y2="{-math:max(param[@name='p2']/vector/y)}"> <xsl:for-each select="param[@name='gradient']/gradient/color"> <stop offset="{100*@pos}%" stop-color="rgb({str:split(255*r, '.')[1]},{str:split(255*g, '.')[1]},{str:split(255*b, '.')[1]})"/> </xsl:for-each> </linearGradient> </defs> <rect fill="url(#{@desc})"> <xsl:variable name="view-box" select="str:split(/canvas/@view-box)"/> <xsl:attribute name="x"><xsl:value-of select="0+$view-box[1]"/></xsl:attribute> <xsl:attribute name="y"><xsl:value-of select="-$view-box[2]"/></xsl:attribute> <xsl:attribute name="width"><xsl:value-of select="-$view-box[1]+$view-box[3]"/></xsl:attribute> <xsl:attribute name="height"><xsl:value-of select="$view-box[2]-$view-box[4]"/></xsl:attribute> </rect> </xsl:template>--> <xsl:template match="color"> <xsl:text>rgb(</xsl:text> <xsl:value-of select="str:split(r * 255, '.')[1]"/><xsl:text>,</xsl:text> <xsl:value-of select="str:split(g * 255, '.')[1]"/><xsl:text>,</xsl:text> <xsl:value-of select="str:split(b * 255, '.')[1]"/><xsl:text>)</xsl:text> </xsl:template> <xsl:template match="d"> <xsl:param name="vector"/> </xsl:template> <xsl:template name="keyTimes"> <xsl:param name="time"/> <xsl:value-of select="$time/@time"/> <!--<xsl:for-each select="$time"> <xsl:value-of select="str:replace(@time, 's', '') div str:replace(/canvas/@end-time, 's', '')"/> <xsl:if test="not(position()=last())"> <xsl:text>; </xsl:text> </xsl:if> </xsl:for-each>--> </xsl:template> <xsl:template name="smilXML"> <xsl:param name="attribute"/> <xsl:param name="time"/> <xsl:param name="animate"/> <animate attributeName="{$attribute}" dur="{/canvas/@end-time}" fill="freeze" repeatCount="indefinite"> <!--<xsl:attribute name="keyTimes"> <xsl:call-template name="keyTimes"> <xsl:with-param name="time" select="$time" /> </xsl:call-template> </xsl:attribute>--> <xsl:attribute name="values"> <xsl:for-each select="$animate"> <xsl:value-of select="."/> <xsl:if test="not(position()=last())"> <xsl:text>; </xsl:text> </xsl:if> </xsl:for-each> </xsl:attribute> </animate> </xsl:template> <xsl:template name="smilTransform"> <xsl:param name="type"/> <xsl:param name="time"/> <xsl:param name="animate"/> <animateTransform attributeName="transform" type="{$type}" dur="{/canvas/@end-time}" fill="freeze" repeatCount="indefinite"> <!--<xsl:attribute name="keyTimes"> <xsl:call-template name="keyTimes"> <xsl:with-param name="vector" select="$time" /> </xsl:call-template> </xsl:attribute>--> <xsl:attribute name="values"> <xsl:for-each select="$animate"> <xsl:value-of select="-str:split(/canvas/@view-box)[1] + x"/>,<xsl:value-of select="y"/> <xsl:if test="not(position()=last())"> <xsl:text>; </xsl:text> </xsl:if> </xsl:for-each> </xsl:attribute> </animateTransform> </xsl:template> </xsl:stylesheet>