<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="shapes">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="shape"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="shape">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="connections"/>
                <xs:element minOccurs="0" name="background" type="InstructionListType"/>
                <xs:element minOccurs="0" name="foreground" type="InstructionListType"/>
            </xs:sequence>
            <xs:attribute name="name" use="required" type="xs:string"/>
            <xs:attribute name="w" use="optional" type="xs:decimal" default="100"/>
            <xs:attribute name="h" use="optional" type="xs:decimal" default="100"/>
            <xs:attribute name="aspect" use="optional" default="variable">
              <xs:simpleType>
			    <xs:restriction base="xs:string">
			      <xs:enumeration value="variable"/>
			      <xs:enumeration value="fixed"/>
			    </xs:restriction>
			  </xs:simpleType>
			</xs:attribute>
            <xs:attribute name="strokewidth" use="optional" type="xs:string" default="1"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="connections">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="constraint"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="constraint">
        <xs:complexType>
            <xs:attribute name="perimeter" use="required" type="xs:integer"/>
            <xs:attribute name="x" use="required" type="xs:decimal"/>
            <xs:attribute name="y" use="required" type="xs:decimal"/>
            <xs:attribute name="name" use="optional" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="InstructionListType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="save"/>
            <xs:element name="restore"/>
            <xs:element name="path" type="PathType"/>
            <xs:element ref="rect"/>
            <xs:element ref="roundrect"/>
            <xs:element ref="ellipse"/>
            <xs:element ref="text"/>
            <xs:element ref="image"/>
            <xs:element ref="include-shape"/>
            <xs:element name="fill"/>
            <xs:element name="stroke"/>
            <xs:element name="fillstroke"/>
            <xs:element name="strokecolor" type="ColorType"/>
            <xs:element name="fillcolor" type="ColorType"/>
            <xs:element name="fontcolor" type="ColorType"/>
            <xs:element ref="alpha"/>
            <xs:element ref="strokewidth"/>
            <xs:element ref="dashed"/>
            <xs:element ref="dashpattern"/>
            <xs:element ref="miterlimit"/>
			<xs:element ref="linejoin"/>
            <xs:element ref="linecap"/>
            <xs:element ref="fontsize"/>
			<xs:element ref="fontstyle"/>
            <xs:element ref="fontfamily"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="ColorType">
        <xs:attribute name="color" use="required" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="PathType">
        <xs:choice maxOccurs="unbounded">
            <xs:element ref="move"/>
            <xs:element ref="line"/>
            <xs:element ref="quad"/>
            <xs:element ref="curve"/>
            <xs:element ref="arc"/>
            <xs:element name="close"/>
        </xs:choice>
        <xs:attribute ref="crisp" use="optional"/>
    </xs:complexType>
    <xs:element name="move">
        <xs:complexType>
            <xs:attribute name="x" use="required" type="xs:decimal"/>
            <xs:attribute name="y" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="line">
        <xs:complexType>
            <xs:attribute name="x" use="required" type="xs:decimal"/>
            <xs:attribute name="y" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="quad">
        <xs:complexType>
            <xs:attribute name="x1" use="required" type="xs:decimal"/>
            <xs:attribute name="y1" use="required" type="xs:decimal"/>
            <xs:attribute name="x2" use="required" type="xs:decimal"/>
            <xs:attribute name="y2" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="curve">
        <xs:complexType>
            <xs:attribute name="x1" use="required" type="xs:decimal"/>
            <xs:attribute name="y1" use="required" type="xs:decimal"/>
            <xs:attribute name="x2" use="required" type="xs:decimal"/>
            <xs:attribute name="y2" use="required" type="xs:decimal"/>
            <xs:attribute name="x3" use="required" type="xs:decimal"/>
            <xs:attribute name="y3" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
	<xs:element name="arc">
	    <xs:complexType>
	        <xs:attribute name="rx" use="required" type="xs:decimal"/>
	        <xs:attribute name="ry" use="required" type="xs:decimal"/>
	        <xs:attribute name="x-axis-rotation" use="required" type="xs:decimal"/>
	       	<xs:attribute name="large-arc-flag" use="required" type="xs:decimal"/>
	       	<xs:attribute name="sweep-flag" use="required" type="xs:decimal"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	    </xs:complexType>
	</xs:element>
	<xs:element name="rect">
	    <xs:complexType>
			<xs:attribute ref="crisp" use="optional"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="w" use="required" type="xs:decimal"/>
	       	<xs:attribute name="h" use="required" type="xs:decimal"/>
	    </xs:complexType>
	</xs:element>
	<xs:element name="roundrect">
	    <xs:complexType>
			<xs:attribute ref="crisp" use="optional"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="w" use="required" type="xs:decimal"/>
	       	<xs:attribute name="h" use="required" type="xs:decimal"/>
	       	<xs:attribute name="arcsize" use="optional" type="xs:decimal"/>
	    </xs:complexType>
	</xs:element>
	<xs:element name="ellipse">
	    <xs:complexType>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="w" use="required" type="xs:decimal"/>
	       	<xs:attribute name="h" use="required" type="xs:decimal"/>
	    </xs:complexType>
	</xs:element>
    <xs:element name="text">
	    <xs:complexType>
	    	<xs:attribute name="str" use="required" type="xs:string"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="align" use="optional" type="xs:string" default="left"/>
	       	<xs:attribute name="valign" use="optional" type="xs:string" default="top"/>
	       	<xs:attribute name="localized" use="optional" type="xs:integer" default="0"/>
	       	<xs:attribute name="vertical" use="optional" type="xs:integer" default="0"/>
	       	<xs:attribute name="rotation" use="optional" type="xs:decimal" default="0"/>
	       	<xs:attribute name="align-shape" use="optional" type="xs:integer" default="1"/>
	    </xs:complexType>
	</xs:element>
	<xs:element name="image">
	    <xs:complexType>
	    	<xs:attribute name="src" use="required" type="xs:string"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="w" use="required" type="xs:decimal"/>
	       	<xs:attribute name="h" use="required" type="xs:decimal"/>
	       	<xs:attribute name="flipH" use="optional" type="xs:integer" default="0"/>
	       	<xs:attribute name="flipV" use="optional" type="xs:integer" default="0"/>
	    </xs:complexType>
	</xs:element>
	<xs:element name="include-shape">
	    <xs:complexType>
	    	<xs:attribute name="name" use="required" type="xs:string"/>
	        <xs:attribute name="x" use="required" type="xs:decimal"/>
	        <xs:attribute name="y" use="required" type="xs:decimal"/>
	        <xs:attribute name="w" use="required" type="xs:decimal"/>
	       	<xs:attribute name="h" use="required" type="xs:decimal"/>
	    </xs:complexType>
	</xs:element>
    <xs:element name="alpha">
        <xs:complexType>
            <xs:attribute name="alpha" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="strokewidth">
        <xs:complexType>
            <xs:attribute name="width" use="required" type="xs:decimal"/>
            <xs:attribute name="fixed" use="optional" type="xs:integer" default="0"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="dashed">
        <xs:complexType>
            <xs:attribute name="dashed" use="required" type="xs:integer"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="dashpattern">
        <xs:complexType>
            <xs:attribute name="pattern" use="required" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="miterlimit">
        <xs:complexType>
            <xs:attribute name="limit" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="linejoin">
        <xs:complexType>
            <xs:attribute name="join" use="required">
			  <xs:simpleType>
			    <xs:restriction base="xs:string">
			      <xs:enumeration value="miter"/>
			      <xs:enumeration value="round"/>
			      <xs:enumeration value="bevel"/>
			    </xs:restriction>
			  </xs:simpleType>
			</xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="linecap">
        <xs:complexType>
            <xs:attribute name="cap" use="required">
			  <xs:simpleType>
			    <xs:restriction base="xs:string">
			      <xs:enumeration value="flat"/>
			      <xs:enumeration value="square"/>
			      <xs:enumeration value="round"/>
			    </xs:restriction>
			  </xs:simpleType>
			</xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="fontsize">
        <xs:complexType>
            <xs:attribute name="size" use="required" type="xs:decimal"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="fontstyle">
        <xs:complexType>
            <xs:attribute name="style" use="required" type="xs:integer"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="fontfamily">
        <xs:complexType>
            <xs:attribute name="family" use="required" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:attribute name="crisp">
		<xs:simpleType>
      		<xs:restriction base="xs:integer">
  				<xs:minInclusive value="0"/>
  				<xs:maxInclusive value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:attribute>
</xs:schema>
