summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-12-07 00:41:50 +0000
committerCarl Hetherington <carl@carlh.net>2009-12-07 00:41:50 +0000
commit1a447016437727452fdf00e7c762f339c796f736 (patch)
treee22576a33816b113a9a10a7cb5f46558b7c3e903
parentb9876aa1d08f83b9a9ef829e6a4dad94cf344e30 (diff)
Fix a couple of crashes with empty matrices. Some small optimisations.
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
-rw-r--r--doc/port_matrix/cairo_text.svg341
-rw-r--r--doc/port_matrix/top_column_bundle_name.svg801
-rw-r--r--doc/port_matrix/top_column_port_name.svg670
-rw-r--r--gtk2_ardour/ardour3_ui_dark.rc.in1
-rw-r--r--gtk2_ardour/port_matrix.cc42
-rw-r--r--gtk2_ardour/port_matrix.h3
-rw-r--r--gtk2_ardour/port_matrix_body.cc35
-rw-r--r--gtk2_ardour/port_matrix_body.h10
-rw-r--r--gtk2_ardour/port_matrix_column_labels.cc52
-rw-r--r--gtk2_ardour/port_matrix_column_labels.h3
-rw-r--r--gtk2_ardour/port_matrix_grid.cc12
-rw-r--r--gtk2_ardour/port_matrix_row_labels.cc9
12 files changed, 1926 insertions, 53 deletions
diff --git a/doc/port_matrix/cairo_text.svg b/doc/port_matrix/cairo_text.svg
new file mode 100644
index 0000000000..d623ccc01e
--- /dev/null
+++ b/doc/port_matrix/cairo_text.svg
@@ -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
index 0000000000..d5669c3e8d
--- /dev/null
+++ b/doc/port_matrix/top_column_bundle_name.svg
@@ -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
index 0000000000..0a05f15b85
--- /dev/null
+++ b/doc/port_matrix/top_column_port_name.svg
@@ -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>
diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in
index 393ce3c841..0e81e576e9 100644
--- a/gtk2_ardour/ardour3_ui_dark.rc.in
+++ b/gtk2_ardour/ardour3_ui_dark.rc.in
@@ -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
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 3fe27b4fdf..58c8a099bd 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -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 ();
+ }
+
+}
diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h
index 268c898684..f228a4101f 100644
--- a/gtk2_ardour/port_matrix.h
+++ b/gtk2_ardour/port_matrix.h
@@ -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;
diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc
index 41faaa31ef..72da040ed7 100644
--- a/gtk2_ardour/port_matrix_body.cc
+++ b/gtk2_ardour/port_matrix_body.cc
@@ -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;
+}
diff --git a/gtk2_ardour/port_matrix_body.h b/gtk2_ardour/port_matrix_body.h
index c8dc0cce29..0b8facda45 100644
--- a/gtk2_ardour/port_matrix_body.h
+++ b/gtk2_ardour/port_matrix_body.h
@@ -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;
diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc
index 2aeb084b9f..c10bb01a2b 100644
--- a/gtk2_ardour/port_matrix_column_labels.cc
+++ b/gtk2_ardour/port_matrix_column_labels.cc
@@ -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) ||
diff --git a/gtk2_ardour/port_matrix_column_labels.h b/gtk2_ardour/port_matrix_column_labels.h
index 0c725a0803..9ff59ec33b 100644
--- a/gtk2_ardour/port_matrix_column_labels.h
+++ b/gtk2_ardour/port_matrix_column_labels.h
@@ -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;
};
diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc
index 5136285e48..3e5d171690 100644
--- a/gtk2_ardour/port_matrix_grid.cc
+++ b/gtk2_ardour/port_matrix_grid.cc
@@ -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;
}
}
diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc
index 6528f31d76..9878dc23dd 100644
--- a/gtk2_ardour/port_matrix_row_labels.cc
+++ b/gtk2_ardour/port_matrix_row_labels.cc
@@ -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);