Fix a couple of crashes with empty matrices. Some small optimisations.
authorCarl Hetherington <carl@carlh.net>
Mon, 7 Dec 2009 00:41:50 +0000 (00:41 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 7 Dec 2009 00:41:50 +0000 (00:41 +0000)
Correctly handle descenders on text when plotting labels.  Minor layout
improvements.  Add some drawings of what's going on in the port matrix
so that I don't keep losing them.

git-svn-id: svn://localhost/ardour2/branches/3.0@6319 d708f5d6-7413-0410-9779-e7cbd77b26cf

12 files changed:
doc/port_matrix/cairo_text.svg [new file with mode: 0644]
doc/port_matrix/top_column_bundle_name.svg [new file with mode: 0644]
doc/port_matrix/top_column_port_name.svg [new file with mode: 0644]
gtk2_ardour/ardour3_ui_dark.rc.in
gtk2_ardour/port_matrix.cc
gtk2_ardour/port_matrix.h
gtk2_ardour/port_matrix_body.cc
gtk2_ardour/port_matrix_body.h
gtk2_ardour/port_matrix_column_labels.cc
gtk2_ardour/port_matrix_column_labels.h
gtk2_ardour/port_matrix_grid.cc
gtk2_ardour/port_matrix_row_labels.cc

diff --git a/doc/port_matrix/cairo_text.svg b/doc/port_matrix/cairo_text.svg
new file mode 100644 (file)
index 0000000..d623ccc
--- /dev/null
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47pre4 r22446"
+   sodipodi:docname="cairo-text.svg">
+  <defs
+     id="defs4">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3657">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceStart"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L 2,0"
+           id="path2306" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z "
+           id="path2302" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2304" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3610"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3607"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.4) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3601"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path3619"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path3622"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective5912"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart-8"
+       style="overflow:visible">
+      <path
+         id="path3607-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5053356"
+     inkscape:cx="303.3357"
+     inkscape:cy="553.63926"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="950"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:object-paths="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <text
+       xml:space="preserve"
+       style="font-size:56px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="171"
+       y="383.36218"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="171"
+         y="383.36218">ABCjpq</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="147"
+       y="546.36218"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="147"
+         y="546.36218" /></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 76,321.36218 0,155"
+       id="path2824"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="61"
+       y="394.36218"
+       id="text4046"><tspan
+         sodipodi:role="line"
+         id="tspan4048"
+         x="61"
+         y="394.36218">y</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 161,383.77138 353.81569,0"
+       id="path4050"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 165,341.36218 351.1443,0"
+       id="path4073"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 171.92252,279.65032 0,147.02663"
+       id="path4075"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5899"
+       transform="translate(-3.28813,-2.6572148)">
+      <path
+         id="path4077"
+         d="m 175.21065,387.68906 c 7.0385,12.06709 19.57033,19.13349 32.41162,23.4867"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" />
+      <text
+         id="text4661"
+         y="413.99414"
+         x="209.03148"
+         style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           y="413.99414"
+           x="209.03148"
+           id="tspan4663"
+           sodipodi:role="line">origin</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 158.76998,394.73507 354.48534,0"
+       id="path4665"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#DistanceEnd);marker-start:url(#DistanceStart)"
+       d="m 397.86441,341.36218 0,42.4092"
+       id="path4667"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="401.62228"
+       y="365.6116"
+       id="text5053"><tspan
+         sodipodi:role="line"
+         id="tspan5055"
+         x="401.62228"
+         y="365.6116">y_bearing</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd)"
+       d="m 479.62728,394.73507 0,-53.37289"
+       id="path5466"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="484.94171"
+       y="370.12225"
+       id="text5872"><tspan
+         sodipodi:role="line"
+         id="tspan5874"
+         x="484.94171"
+         y="370.12225">height</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="-290.94196"
+       y="603.53894"
+       id="text5876"
+       transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"><tspan
+         sodipodi:role="line"
+         id="tspan5878"
+         x="-290.94196"
+         y="603.53894">ABCjpq</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 221.26042,632.27254 361.61216,491.9208"
+       id="path5880" />
+    <g
+       transform="translate(46.04977,244.58348)"
+       id="g5899-8">
+      <path
+         id="path4077-9"
+         d="m 175.21065,387.68906 c 7.0385,12.06709 19.57033,19.13349 32.41162,23.4867"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" />
+      <text
+         id="text4661-2"
+         y="413.99414"
+         x="209.03148"
+         style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           y="413.99414"
+           x="209.03148"
+           id="tspan4663-9"
+           sodipodi:role="line">origin</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="330.15894"
+       y="597.97845"
+       id="text5941"><tspan
+         sodipodi:role="line"
+         id="tspan5943"
+         x="330.15894"
+         y="597.97845">cairo_rotate (c, - M_PI / 4);</tspan></text>
+  </g>
+</svg>
diff --git a/doc/port_matrix/top_column_bundle_name.svg b/doc/port_matrix/top_column_bundle_name.svg
new file mode 100644 (file)
index 0000000..d5669c3
--- /dev/null
@@ -0,0 +1,801 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47pre4 r22446"
+   sodipodi:docname="top_column_bundle_name.svg">
+  <defs
+     id="defs4">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceStart"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L 2,0"
+           id="path2306" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z "
+           id="path2302" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2304" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4298"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4322"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-0"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-0">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-1" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-3" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-3" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-0"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-0">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-0" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-2" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-2" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective4381"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-01">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-4" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-4" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-32" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-1">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-3" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-26" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-0" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5494"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-9-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-01-2">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-4-3" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-4-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-32-4" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5537"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-1">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-8" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-9" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-6">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-1" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-7" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-5" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5597"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-09">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-7" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-7" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-5" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-4"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-4">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-6" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-6" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5654"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5865"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-3">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-89" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-58" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-91" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-7">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-36" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-56" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-4" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5926"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-3"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-9">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-5" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-9" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-7" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-14">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-7" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-1" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-3" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective3600"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-16"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-19">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-49" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-96" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-94" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-20"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-2">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-368" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-9" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-28" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective3655"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-08"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-5">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-43" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-94" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-6" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-23"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-8">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-62" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-70" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-7" />
+      </g>
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.0901219"
+     inkscape:cx="245.59522"
+     inkscape:cy="493.24267"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:snap-bbox="false"
+     inkscape:object-paths="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="1000"
+     inkscape:window-x="1280"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-midpoints="false"
+     inkscape:snap-grids="false"
+     inkscape:snap-to-guides="true"
+     inkscape:snap-intersection-paths="true">
+    <sodipodi:guide
+       orientation="0,1"
+       position="-139,507"
+       id="guide2818" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="-54,736"
+       id="guide2820" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="107.84461,521.24893"
+       id="guide2855" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="346.19377,502.36563"
+       id="guide2857" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="287.77314,553.84911"
+       id="guide4369" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="187.50484,410.61756"
+       id="guide5523" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="299.44648,566.15686"
+       id="guide5581" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 407.04788,247.31233 29.29042,625.07176 266.23358,624.64489 524,367.36218 407,247.26318"
+       id="path2822"
+       sodipodi:nodetypes="ccccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="78.769989"
+       y="297.07095"
+       id="text2845"><tspan
+         sodipodi:role="line"
+         id="tspan2847"
+         x="78.769989"
+         y="297.07095">Bundle name (top)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="125.84303"
+       y="541.49957"
+       id="text2849"><tspan
+         sodipodi:role="line"
+         id="tspan2851"
+         x="125.84303"
+         y="541.49957">Ï‘</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 346.16456,545.1478 227.68908,426.67232"
+       id="path2853" />
+    <path
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 260.29818,437.3373 73.37226,73.37227"
+       id="path4312"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="305.09753"
+       y="472.22052"
+       id="text4365"><tspan
+         sodipodi:role="line"
+         id="tspan4367"
+         x="305.09753"
+         y="472.22052">h</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 187.98488,624.78586 0,-125.82998"
+       id="path4424-8"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="176.02385"
+       y="570.7243"
+       id="text5525"><tspan
+         sodipodi:role="line"
+         id="tspan5527"
+         x="176.02385"
+         y="570.7243">y</tspan></text>
+    <g
+       id="g3320"
+       transform="translate(-81.151712,83.200997)">
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2859"
+         d="m 107.84461,560.19866 238.34916,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd)" />
+      <text
+         id="text4284"
+         y="574.17139"
+         x="227.0192"
+         style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           y="574.17139"
+           x="227.0192"
+           id="tspan4286"
+           sodipodi:role="line">g</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2859-5"
+         d="M 107.84461,612.92703 380.59819,611.2876"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd)" />
+      <text
+         id="text5583"
+         y="625.0675"
+         x="207.78781"
+         style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           y="625.0675"
+           x="207.78781"
+           id="tspan5585"
+           sodipodi:role="line">x</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 272.01521,382.34589 390.51575,500.84643"
+       id="path5587"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="336.24664"
+       y="433.05533"
+       id="text5640"><tspan
+         sodipodi:role="line"
+         id="tspan5642"
+         x="336.24664"
+         y="433.05533">p</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 299.88553,498.86877 0,46.49341"
+       id="path5644"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.80813789px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="301.71027"
+       y="511.74252"
+       id="text2849-9"><tspan
+         sodipodi:role="line"
+         id="tspan2851-1"
+         x="301.71027"
+         y="511.74252">Ï‘</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 304.9025,493.43771 -21.18965,21.18965"
+       id="path5908" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="312.51556"
+       y="508.66382"
+       id="text5912"><tspan
+         sodipodi:role="line"
+         id="tspan5914"
+         x="312.51556"
+         y="508.66382">d</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 369.3182,522.04398 325.0167,477.74249"
+       id="path5916" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="349.19827"
+       y="494.13678"
+       id="text5969"><tspan
+         sodipodi:role="line"
+         id="tspan5971"
+         x="349.19827"
+         y="494.13678">q</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="78.266083"
+       y="313.79965"
+       id="text2934"><tspan
+         sodipodi:role="line"
+         id="tspan2936"
+         x="78.266083"
+         y="313.79965">Port name (bottom)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 109,545.36218 29.29042,625.07176"
+       id="path3336"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 266.23358,624.64489 147.97513,506.38644"
+       id="path3346"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 121.77859,480.20163 80.28097,-79.92214"
+       id="path3348"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="149.53252"
+       y="437.99329"
+       id="text3643"><tspan
+         sodipodi:role="line"
+         id="tspan3645"
+         x="149.53252"
+         y="437.99329">f</tspan></text>
+  </g>
+</svg>
diff --git a/doc/port_matrix/top_column_port_name.svg b/doc/port_matrix/top_column_port_name.svg
new file mode 100644 (file)
index 0000000..0a05f15
--- /dev/null
@@ -0,0 +1,670 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47pre4 r22446"
+   sodipodi:docname="top_column_port_name.svg">
+  <defs
+     id="defs4">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceStart"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square"
+           d="M 0,0 L 2,0"
+           id="path2306" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z "
+           id="path2302" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 L 0,40"
+           id="path2304" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4298"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4322"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-0"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-0">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-1" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-3" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-3" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-0"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-0">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-0" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-2" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-2" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective4381"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-01">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-4" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-4" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-32" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-1">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-3" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-26" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-0" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5494"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-9-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-01-2">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-4-3" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-4-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-32-4" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5537"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-1">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-8" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-9" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-6">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-1" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-7" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-5" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5597"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-09">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-7" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-7" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-5" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-4"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-4">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-6" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-6" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5654"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5865"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-3">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-89" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-58" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-91" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-7">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-36" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-56" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-4" />
+      </g>
+    </marker>
+    <inkscape:perspective
+       id="perspective5926"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       style="overflow:visible"
+       id="DistanceStart-3"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceStart">
+      <g
+         id="g2300-9">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 2,0"
+           id="path2306-5" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 13,4 9,0 13,-4 0,0 z"
+           id="path2302-9" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2304-7" />
+      </g>
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd">
+      <g
+         id="g3692-14">
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square"
+           d="M 0,0 -2,0"
+           id="path2316-7" />
+        <path
+           style="fill:#000000;fill-rule:evenodd;stroke:none"
+           d="M 0,0 -13,4 -9,0 -13,-4 0,0 z"
+           id="path2312-1" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square"
+           d="M 0,-4 0,40"
+           id="path2314-3" />
+      </g>
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.4398746"
+     inkscape:cx="254.50013"
+     inkscape:cy="579.45775"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:snap-bbox="false"
+     inkscape:object-paths="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="1000"
+     inkscape:window-x="1280"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-midpoints="false"
+     inkscape:snap-grids="false"
+     inkscape:snap-to-guides="true">
+    <sodipodi:guide
+       orientation="0,1"
+       position="-139,507"
+       id="guide2818" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="-54,736"
+       id="guide2820" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="107.84461,521.24893"
+       id="guide2855" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="346.19377,502.36563"
+       id="guide2857" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="287.77314,553.84911"
+       id="guide4369" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="187.50484,410.61756"
+       id="guide5523" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="299.44648,566.15686"
+       id="guide5581" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 407.04788,247.31233 109,545.36218 l 237,0 178,-178 -117,-120.099"
+       id="path2822"
+       sodipodi:nodetypes="ccccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="77.130562"
+       y="369.20581"
+       id="text2845"><tspan
+         sodipodi:role="line"
+         id="tspan2847"
+         x="77.130562"
+         y="369.20581">Column name (top)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="125.84303"
+       y="541.49957"
+       id="text2849"><tspan
+         sodipodi:role="line"
+         id="tspan2851"
+         x="125.84303"
+         y="541.49957">Ï‘</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 346.16456,545.1478 227.68908,426.67232"
+       id="path2853" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd)"
+       d="m 107.84461,560.19866 238.34916,0"
+       id="path2859"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="227.0192"
+       y="574.17139"
+       id="text4284"><tspan
+         sodipodi:role="line"
+         id="tspan4286"
+         x="227.0192"
+         y="574.17139">g</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 260.29818,437.3373 73.37226,73.37227"
+       id="path4312"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="305.09753"
+       y="472.22052"
+       id="text4365"><tspan
+         sodipodi:role="line"
+         id="tspan4367"
+         x="305.09753"
+         y="472.22052">h</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart-9)"
+       d="m 187.50484,498.50303 0,-29.29762"
+       id="path4424"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart-9)"
+       d="m 187.98488,545.36218 0,34.70643"
+       id="path4424-8"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="184.34961"
+       y="522.88019"
+       id="text5525"><tspan
+         sodipodi:role="line"
+         id="tspan5527"
+         x="184.34961"
+         y="522.88019">y</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd)"
+       d="m 107.84461,612.92703 191.60187,0"
+       id="path2859-5"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="207.78781"
+       y="625.0675"
+       id="text5583"><tspan
+         sodipodi:role="line"
+         id="tspan5585"
+         x="207.78781"
+         y="625.0675">x</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 272.01521,382.34589 390.51575,500.84643"
+       id="path5587"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="336.24664"
+       y="433.05533"
+       id="text5640"><tspan
+         sodipodi:role="line"
+         id="tspan5642"
+         x="336.24664"
+         y="433.05533">p</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 299.88553,498.86877 0,46.49341"
+       id="path5644"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.80813789px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="301.71027"
+       y="511.74252"
+       id="text2849-9"><tspan
+         sodipodi:role="line"
+         id="tspan2851-1"
+         x="301.71027"
+         y="511.74252">Ï‘</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 304.9025,493.43771 -21.18965,21.18965"
+       id="path5908" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="312.51556"
+       y="508.66382"
+       id="text5912"><tspan
+         sodipodi:role="line"
+         id="tspan5914"
+         x="312.51556"
+         y="508.66382">d</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-start:url(#DistanceStart);marker-end:url(#DistanceEnd);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 369.3182,522.04398 325.0167,477.74249"
+       id="path5916" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="349.19827"
+       y="494.13678"
+       id="text5969"><tspan
+         sodipodi:role="line"
+         id="tspan5971"
+         x="349.19827"
+         y="494.13678">q</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="76.626656"
+       y="385.11478"
+       id="text3316"><tspan
+         sodipodi:role="line"
+         id="tspan3318"
+         x="76.626656"
+         y="385.11478">Bundle name (bottom)</tspan></text>
+  </g>
+</svg>
index 393ce3c8418b3b0a060b409d9c0c820f3caaf535..0e81e576e9a125cb8af2597ae37f69e7062c32e8 100644 (file)
@@ -1669,3 +1669,4 @@ widget "*OddPortGroups" style:highest "odd_port_groups"
 widget "*EvenPortGroups" style:highest "even_port_groups"
 widget "*MidiListView*" style:highest "white_tree_view"
 widget "*ProcessorSelector*" style:highest "processor_list_display"
+widget "*PortMatrixLabel*" style:highest "small_text"
\ No newline at end of file
index 3fe27b4fdfd1b905f50a61bc04b55b1f5c6a2b92..58c8a099bdc738b99545db8e73f58d80c42be637 100644 (file)
@@ -60,33 +60,41 @@ PortMatrix::PortMatrix (Window* parent, Session* session, DataType type)
          _ignore_notebook_page_selected (false)
 {
        _body = new PortMatrixBody (this);
+       _body->DimensionsChanged.connect (mem_fun (*this, &PortMatrix::body_dimensions_changed));
 
-       _vbox.pack_start (_vnotebook);
-       _vbox.pack_start (_vlabel);
-       _hbox.pack_start (_hnotebook);
-       _hbox.pack_start (_hlabel);
+       _vbox.pack_start (_vspacer, false, false);
+       _vbox.pack_start (_vnotebook, false, false);
+       _vbox.pack_start (_vlabel, true, true);
+       _hbox.pack_start (_hspacer, false, false);
+       _hbox.pack_start (_hnotebook, false, false);
+       _hbox.pack_start (_hlabel, true, true);
 
        _vnotebook.signal_switch_page().connect (mem_fun (*this, &PortMatrix::v_page_selected));
        _vnotebook.property_tab_border() = 4;
+       _vnotebook.set_name (X_("PortMatrixLabel"));
        _hnotebook.signal_switch_page().connect (mem_fun (*this, &PortMatrix::h_page_selected));
        _hnotebook.property_tab_border() = 4;
+       _hnotebook.set_name (X_("PortMatrixLabel"));
 
        for (int i = 0; i < 2; ++i) {
                _ports[i].set_type (type);
        }
 
        _vlabel.set_use_markup ();
-       _vlabel.set_alignment (0.5, 0);
+       _vlabel.set_alignment (1, 1);
        _vlabel.set_padding (4, 16);
+       _vlabel.set_name (X_("PortMatrixLabel"));
        _hlabel.set_use_markup ();
-       _hlabel.set_alignment (0, 0.5);
+       _hlabel.set_alignment (1, 0.5);
        _hlabel.set_padding (16, 4);
+       _hlabel.set_name (X_("PortMatrixLabel"));
 
        _body->show ();
        _vbox.show ();
        _hbox.show ();
        _vlabel.show ();
        _hlabel.show ();
+       _hspacer.show ();
 }
 
 PortMatrix::~PortMatrix ()
@@ -106,7 +114,6 @@ void
 PortMatrix::init ()
 {
        select_arrangement ();
-       setup_notebooks ();
 
        if (!_ports[0].empty()) {
                _visible_ports[0] = *_ports[0].begin();
@@ -674,15 +681,15 @@ PortMatrix::setup_notebooks ()
        }
 
        if (_hnotebook.get_n_pages() <= 1) {
-               _hnotebook.hide ();
+               _hbox.hide ();
        } else {
-               _hnotebook.show ();
+               _vbox.show ();
        }
 
        if (_vnotebook.get_n_pages() <= 1) {
-               _vnotebook.hide ();
+               _vbox.hide ();
        } else {
-               _vnotebook.show ();
+               _vbox.show ();
        }
 }
 
@@ -751,3 +758,16 @@ PortMatrix::session_going_away ()
 {
        _session = 0;
 }
+
+void
+PortMatrix::body_dimensions_changed ()
+{
+       _hspacer.set_size_request (_body->column_labels_border_x (), -1);
+       if (_arrangement == TOP_TO_RIGHT) {
+               _vspacer.set_size_request (-1, _body->column_labels_height ());
+               _vspacer.show ();
+       } else {
+               _vspacer.hide ();
+       }
+
+}
index 268c898684e32d093681bae902968c35872978a0..f228a4101f4126a9d6ee5afa7154532bb57a26a1 100644 (file)
@@ -179,6 +179,7 @@ private:
        void v_page_selected (GtkNotebookPage *, guint);
        void h_page_selected (GtkNotebookPage *, guint);
        void route_processors_changed (ARDOUR::RouteProcessorChange);
+       void body_dimensions_changed ();
        void session_going_away ();
 
        Gtk::Window* _parent;
@@ -196,6 +197,8 @@ private:
        Gtk::Label _hlabel;
        Gtk::VBox _vbox;
        Gtk::HBox _hbox;
+       Gtk::Label _hspacer;
+       Gtk::Label _vspacer;
        Gtk::Menu* _menu;
        Arrangement _arrangement;
        int _row_index;
index 41faaa31eff432bdbe63b57cff65d4e8ab3880b2..72da040ed70f6b5c8ebbd90309c8cba8840a2a73 100644 (file)
@@ -34,6 +34,8 @@ PortMatrixBody::PortMatrixBody (PortMatrix* p)
          _alloc_height (0),
          _xoffset (0),
          _yoffset (0),
+         _column_labels_border_x (0),
+         _column_labels_height (0),
          _ignore_component_size_changed (false)
 {
        _column_labels = new PortMatrixColumnLabels (p, this);
@@ -58,7 +60,10 @@ PortMatrixBody::~PortMatrixBody ()
 bool
 PortMatrixBody::on_expose_event (GdkEventExpose* event)
 {
-       if (_matrix->visible_columns()->bundles().empty() || _matrix->visible_rows()->bundles().empty()) {
+       if (
+               _matrix->visible_columns() == 0 || _matrix->visible_rows() == 0 ||
+               _matrix->visible_columns()->bundles().empty() || _matrix->visible_rows()->bundles().empty()
+               ) {
 
                /* nothing to connect */
 
@@ -171,7 +176,7 @@ PortMatrixBody::compute_rectangles ()
 {
        /* full sizes of components */
        pair<uint32_t, uint32_t> const col = _column_labels->dimensions ();
-       uint32_t col_overhang = _column_labels->overhang ();
+       uint32_t const col_overhang = _column_labels->overhang ();
        pair<uint32_t, uint32_t> const row = _row_labels->dimensions ();
        pair<uint32_t, uint32_t> const grid = _grid->dimensions ();
 
@@ -182,6 +187,7 @@ PortMatrixBody::compute_rectangles ()
        if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
 
                col_rect.set_x (0);
+               _column_labels_border_x = col_overhang;
                col_rect.set_y (0);
                grid_rect.set_x (0);
 
@@ -222,13 +228,17 @@ PortMatrixBody::compute_rectangles ()
 
                col_rect.set_width (grid_rect.get_width () + col_overhang);
                col_rect.set_x (row_rect.get_width() + grid_rect.get_width() - col_rect.get_width());
+               _column_labels_border_x = col_rect.get_x () >= 0 ? col_rect.get_x () : 0;
                col_rect.set_y (row_rect.get_height());
-
        }
 
+       _column_labels_height = col_rect.get_height ();
+
        _row_labels->set_parent_rectangle (row_rect);
        _column_labels->set_parent_rectangle (col_rect);
        _grid->set_parent_rectangle (grid_rect);
+
+       DimensionsChanged (); /* EMIT SIGNAL */
 }
 
 void
@@ -243,7 +253,7 @@ PortMatrixBody::setup ()
 
        /* Connect to bundles so that we find out when their names change */
 
-       PortGroup::BundleList r = _matrix->rows()->bundles ();
+       PortGroup::BundleList r = _matrix->visible_rows()->bundles ();
        for (PortGroup::BundleList::iterator i = r.begin(); i != r.end(); ++i) {
 
                _bundle_connections.push_back (
@@ -252,7 +262,7 @@ PortMatrixBody::setup ()
 
        }
 
-       PortGroup::BundleList c = _matrix->columns()->bundles ();
+       PortGroup::BundleList c = _matrix->visible_columns()->bundles ();
        for (PortGroup::BundleList::iterator i = c.begin(); i != c.end(); ++i) {
                _bundle_connections.push_back (
                        i->bundle->Changed.connect (sigc::hide (sigc::mem_fun (*this, &PortMatrixBody::rebuild_and_draw_column_labels)))
@@ -295,6 +305,7 @@ PortMatrixBody::alloc_scroll_height ()
        return _grid->parent_rectangle().get_height();
 }
 
+/** Set x offset (for scrolling) */
 void
 PortMatrixBody::set_xoffset (uint32_t xo)
 {
@@ -302,6 +313,7 @@ PortMatrixBody::set_xoffset (uint32_t xo)
        queue_draw ();
 }
 
+/** Set y offset (for scrolling) */
 void
 PortMatrixBody::set_yoffset (uint32_t yo)
 {
@@ -494,3 +506,16 @@ PortMatrixBody::max_size () const
 
        return make_pair (std::max (row.first, _column_labels->overhang()) + grid.first, col.second + grid.second);
 }
+
+/** @return x position at which the column labels meet the border of the matrix */
+uint32_t
+PortMatrixBody::column_labels_border_x () const
+{
+       return _column_labels_border_x;
+}
+
+uint32_t
+PortMatrixBody::column_labels_height () const
+{
+       return _column_labels_height;
+}
index c8dc0cce29f320934583455daf190b1e72b32dbc..0b8facda45c2f717f6217ea92f2dc0df42ab8370 100644 (file)
@@ -67,6 +67,11 @@ public:
        void component_size_changed ();
        std::pair<uint32_t, uint32_t> max_size () const;
 
+       uint32_t column_labels_border_x () const;
+       uint32_t column_labels_height () const;
+
+       sigc::signal<void> DimensionsChanged;
+
 protected:
        bool on_expose_event (GdkEventExpose *);
        void on_size_request (Gtk::Requisition *);
@@ -91,11 +96,10 @@ private:
 
        uint32_t _alloc_width; ///< allocated width
        uint32_t _alloc_height; ///< allocated height
-       Gdk::Rectangle _column_labels_rect;
-       Gdk::Rectangle _row_labels_rect;
-       Gdk::Rectangle _grid_rect;
        uint32_t _xoffset;
        uint32_t _yoffset;
+       uint32_t _column_labels_border_x;
+       uint32_t _column_labels_height;
 
        std::list<PortMatrixNode> _mouseover;
        bool _ignore_component_size_changed;
index 2aeb084b9f0c54651b712e5cd65869b2b64893a6..c10bb01a2b5ba061ac9a00ac18705b3f06f9857a 100644 (file)
@@ -45,10 +45,6 @@ PortMatrixColumnLabels::compute_dimensions ()
        _longest_bundle_name = 0;
        /* width of the longest channel name */
        _longest_channel_name = 0;
-       /* height of highest bit of text (apart from group names) */
-       _highest_text = 0;
-       /* width of the whole thing */
-       _width = 0;
 
        /* Compute dimensions using all port groups, so that we allow for the largest and hence
           we can change between visible groups without the size of the labels jumping around.
@@ -64,10 +60,6 @@ PortMatrixColumnLabels::compute_dimensions ()
                                _longest_bundle_name = ext.width;
                        }
 
-                       if (ext.height > _highest_text) {
-                               _highest_text = ext.height;
-                       }
-
                        for (uint32_t k = 0; k < j->bundle->nchannels (); ++k) {
 
                                cairo_text_extents (
@@ -79,14 +71,21 @@ PortMatrixColumnLabels::compute_dimensions ()
                                if (ext.width > _longest_channel_name) {
                                        _longest_channel_name = ext.width;
                                }
-
-                               if (ext.height > _highest_text) {
-                                       _highest_text = ext.height;
-                               }
                        }
                }
+       }
 
-               _width += group_size (*i) * grid_spacing ();
+       /* height metrics */
+       cairo_text_extents_t ext;
+       cairo_text_extents (cr, X_("AQRjpy"), &ext);
+       _text_height = ext.height;
+       _descender_height = ext.height + ext.y_bearing;
+
+       /* width of the whole thing */
+       if (_matrix->visible_columns()) {
+               _width = group_size (_matrix->visible_columns()) * grid_spacing ();
+       } else {
+               _width = 0;
        }
 
        cairo_destroy (cr);
@@ -99,7 +98,7 @@ PortMatrixColumnLabels::compute_dimensions ()
                a += _longest_channel_name;
        }
 
-       _height =  a * sin (angle()) + _highest_text * cos (angle());
+       _height =  a * sin (angle()) + _text_height * cos (angle());
        _overhang = _height / tan (angle ());
        _width += _overhang;
 }
@@ -108,7 +107,7 @@ double
 PortMatrixColumnLabels::basic_text_x_pos (int) const
 {
        return grid_spacing() / 2 +
-               _highest_text / (2 * sin (angle ()));
+               _text_height / (2 * sin (angle ()));
 }
 
 void
@@ -278,6 +277,8 @@ PortMatrixColumnLabels::render_bundle_name (
 
        set_source_rgb (cr, text_colour());
 
+       double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height;
+
        if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
 
                double rl = 0;
@@ -288,16 +289,16 @@ PortMatrixColumnLabels::render_bundle_name (
                }
                cairo_move_to (
                        cr,
-                       xoff + basic_text_x_pos (0) + rl * cos (angle()),
-                       yoff + _height - rl * sin (angle())
+                       xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle()),
+                       yoff + _height - q * cos (angle ()) - rl * sin (angle())
                        );
 
        } else {
 
                cairo_move_to (
                        cr,
-                       xoff + basic_text_x_pos (0) + name_pad() * cos (angle ()),
-                       yoff + _height - name_pad() * sin (angle())
+                       xoff + grid_spacing() - q * sin (angle ()),
+                       yoff + _height - q * cos (angle ())
                        );
        }
 
@@ -328,21 +329,24 @@ PortMatrixColumnLabels::render_channel_name (
 
        set_source_rgb (cr, text_colour());
 
+       double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height;
+
        if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
 
                cairo_move_to (
                        cr,
-                       xoff + basic_text_x_pos(bc.channel),
-                       yoff + _height - name_pad() * sin (angle())
+                       xoff + grid_spacing() - q * sin (angle ()),
+                       yoff + _height - q * cos (angle ())
                        );
+                               
 
        } else {
 
                double const rl = 3 * name_pad() + _longest_bundle_name;
                cairo_move_to (
                        cr,
-                       xoff + basic_text_x_pos(bc.channel) + rl * cos (angle ()),
-                       yoff + _height - rl * sin (angle())
+                       xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle ()),
+                       yoff + _height - q * cos (angle ()) - rl * sin (angle())
                        );
        }
 
@@ -453,7 +457,7 @@ PortMatrixColumnLabels::motion (double x, double y)
                return;
        }
 
-       uint32_t const bh = _longest_channel_name * sin (angle ()) + _highest_text / cos (angle ());
+       uint32_t const bh = _longest_channel_name * sin (angle ()) + _text_height / cos (angle ());
 
        if (
                (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && y > bh) ||
index 0c725a080385c6729774579284c0de746f12f0e4..9ff59ec33bbfb5f8e2448bb8b29e2da0d859f1ea 100644 (file)
@@ -64,7 +64,8 @@ private:
 
        double _longest_bundle_name;
        double _longest_channel_name;
-       double _highest_text;
+       double _text_height;
+       double _descender_height;
        uint32_t _overhang;
 };
 
index 5136285e48b3b472cb1315047e88ac6580baa555..3e5d17169010959f7bdf1adf3c8aaf9067b26208 100644 (file)
@@ -41,16 +41,16 @@ PortMatrixGrid::PortMatrixGrid (PortMatrix* m, PortMatrixBody* b)
 void
 PortMatrixGrid::compute_dimensions ()
 {
-       if (_matrix->visible_columns() == 0) {
-               _width = 0;
-       } else {
+       if (_matrix->visible_columns()) {
                _width = group_size (_matrix->visible_columns()) * grid_spacing ();
+       } else {
+               _width = 0;
        }
 
-       if (_matrix->visible_rows() == 0) {
-               _height = 0;
-       } else {
+       if (_matrix->visible_rows()) {
                _height = group_size (_matrix->visible_rows()) * grid_spacing ();
+       } else {
+               _height = 0;
        }
 }
 
index 6528f31d76f075afb81cd56f527b540a5f61622f..9878dc23dd9ba597723b01fcf4c553e2be9b36dd 100644 (file)
@@ -44,7 +44,6 @@ PortMatrixRowLabels::compute_dimensions ()
 
        _longest_port_name = 0;
        _longest_bundle_name = 0;
-       _height = 0;
 
        /* Compute maximum dimensions using all port groups, so that we allow for the largest and hence
           we can change between visible groups without the size of the labels jumping around.
@@ -71,8 +70,12 @@ PortMatrixRowLabels::compute_dimensions ()
                }
        }
 
-       
-       _height += group_size (_matrix->visible_rows()) * grid_spacing ();
+
+       if (_matrix->visible_rows()) {
+               _height = group_size (_matrix->visible_rows()) * grid_spacing ();
+       } else {
+               _height = 0;
+       }
 
        cairo_destroy (cr);
        gdk_pixmap_unref (pm);