Browse Source

Shaders: initial implementation of a line shader.

The shader requires the input data to be laid out in a rather specific
way, and there will be a dedicated MeshTools utility for it in the
following commits. For independence though, the shader tests use a
custom helper.

The initial implementation has certain corner cases which will be
eventually resolved. For now they are pinned down with repro cases in
the test. But apart from that, it's pretty much usable in practice.

Remaining join styles (round and miter-clip) as well as stipple support
will eventually follow as well.
pull/601/head
Vladimír Vondruš 4 years ago
parent
commit
506841f4a9
  1. 331
      doc/artwork/line-annotation.svg
  2. 247
      doc/artwork/line-caps.svg
  3. 395
      doc/artwork/line-joins.svg
  4. 547
      doc/artwork/line-quad-data-neighbor.svg
  5. 252
      doc/artwork/line-quad-data-other.svg
  6. 2287
      doc/artwork/line-quad-data-overlap.svg
  7. 149
      doc/artwork/line-quad-data.svg
  8. 408
      doc/artwork/line-quad-expansion.svg
  9. 64
      doc/snippets/MagnumShaders-gl.cpp
  10. 24
      doc/snippets/README.md
  11. 61
      doc/snippets/line-annotation.svg
  12. 17
      doc/snippets/line-cap-butt.svg
  13. 35
      doc/snippets/line-cap-round.svg
  14. 21
      doc/snippets/line-cap-square.svg
  15. 21
      doc/snippets/line-cap-triangle.svg
  16. 29
      doc/snippets/line-join-bevel.svg
  17. 32
      doc/snippets/line-join-miter.svg
  18. 70
      doc/snippets/line-quad-data-neighbor.svg
  19. 34
      doc/snippets/line-quad-data-other.svg
  20. 107
      doc/snippets/line-quad-data-overlap-fixedjoin.svg
  21. 116
      doc/snippets/line-quad-data-overlap-generic.svg
  22. 76
      doc/snippets/line-quad-data-overlap-miterjoin.svg
  23. 90
      doc/snippets/line-quad-data-overlap-nojoin.svg
  24. 18
      doc/snippets/line-quad-data.svg
  25. 40
      doc/snippets/line-quad-expansion-joins-caps.svg
  26. 37
      doc/snippets/line-quad-expansion-joins-miter-caps.svg
  27. 33
      doc/snippets/line-quad-expansion.svg
  28. 13
      src/Magnum/Shaders/CMakeLists.txt
  29. 55
      src/Magnum/Shaders/Implementation/lineMiterLimit.h
  30. 76
      src/Magnum/Shaders/Line.cpp
  31. 257
      src/Magnum/Shaders/Line.frag
  32. 472
      src/Magnum/Shaders/Line.h
  33. 666
      src/Magnum/Shaders/Line.vert
  34. 432
      src/Magnum/Shaders/LineGL.cpp
  35. 1150
      src/Magnum/Shaders/LineGL.h
  36. 9
      src/Magnum/Shaders/Shaders.h
  37. 65
      src/Magnum/Shaders/Test/CMakeLists.txt
  38. 2
      src/Magnum/Shaders/Test/GenericGL_Test.cpp
  39. 2760
      src/Magnum/Shaders/Test/LineGLTest.cpp
  40. 157
      src/Magnum/Shaders/Test/LineGL_Test.cpp
  41. 306
      src/Magnum/Shaders/Test/LineTest.cpp
  42. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-butt-joins-bevel.tga
  43. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-butt-joins-miter-flat.tga
  44. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-round-joins-miter.tga
  45. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-bevel.tga
  46. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-flat.tga
  47. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-36.tga
  48. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-70deg.tga
  49. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-91deg.tga
  50. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter.tga
  51. BIN
      src/Magnum/Shaders/Test/LineTestFiles/caps-triangle-joins-bevel.tga
  52. BIN
      src/Magnum/Shaders/Test/LineTestFiles/cube3D-caps-butt-joins-bevel.tga
  53. BIN
      src/Magnum/Shaders/Test/LineTestFiles/cube3D-caps-square-joins-miter.tga
  54. BIN
      src/Magnum/Shaders/Test/LineTestFiles/cube3D-depth.tga
  55. BIN
      src/Magnum/Shaders/Test/LineTestFiles/cube3D-flat-single-pixel.tga
  56. BIN
      src/Magnum/Shaders/Test/LineTestFiles/defaults.tga
  57. BIN
      src/Magnum/Shaders/Test/LineTestFiles/instanced.tga
  58. BIN
      src/Magnum/Shaders/Test/LineTestFiles/multidraw.tga
  59. BIN
      src/Magnum/Shaders/Test/LineTestFiles/perspective3D.tga
  60. BIN
      src/Magnum/Shaders/Test/LineTestFiles/vertex-color.tga
  61. 9
      src/Magnum/Shaders/generic.glsl
  62. 6
      src/Magnum/Shaders/resources-gl.conf
  63. 2
      src/Magnum/Shaders/resources-gles2.conf

331
doc/artwork/line-annotation.svg

@ -0,0 +1,331 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="590.00006"
height="300.00003"
viewBox="0 0 156.10419 79.375008"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-annotation.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="1.1893044"
inkscape:cx="224.92139"
inkscape:cy="87.02566"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-150.81251"
originy="-26.458334" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="matrix(1.0707964,0,0,1,-172.54111,-26.458332)"
style="display:none;stroke-width:0.966377"
sodipodi:insensitive="true">
<rect
y="26.458332"
x="161.13344"
height="79.375008"
width="145.78325"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.255683;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:label="annotation"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-150.81251,-26.458332)">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 156.10417,55.562499 142.875,13.229166"
id="path21655" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 209.02084,68.791665 h 89.95833"
id="path21720" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 161.39584,34.395832 298.97917,68.791664 256.64583,79.374997 H 285.75 V 100.54166 H 169.33333 L 166.6875,79.374997 209.02083,68.791664 156.10417,55.562499 Z"
id="path13551"
sodipodi:nodetypes="cccccccccc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.374997 2.64583,10.583333 v 10.58333"
id="path13553" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:;stop-color:#000000;stop-opacity:1"
d="M 169.33333,89.95833 H 275.16667"
id="path11743" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:;stop-color:#000000;stop-opacity:1"
d="M 169.33333,47.624998 254,68.791664"
id="path11815" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:;stop-color:#000000;stop-opacity:1"
d="M 254,68.791664 169.33333,89.95833"
id="path11817" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 209.02083,68.791664 47.625,10.583333"
id="path13543" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.374997 h 89.95833"
id="path13545" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 256.64583,79.374997 -87.3125,21.166663"
id="path13547" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 256.64583,79.374997 285.75,100.54166"
id="path13549" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="circle3689"
sodipodi:type="arc"
sodipodi:cx="254.00002"
sodipodi:cy="68.791702"
sodipodi:rx="2.5135145"
sodipodi:ry="2.5135176"
sodipodi:start="3.1415927"
sodipodi:end="0"
sodipodi:arc-type="arc"
d="m 251.4865,68.791702 a 2.5135145,2.5135176 0 0 1 2.51352,-2.513517 2.5135145,2.5135176 0 0 1 2.51351,2.513517"
sodipodi:open="true" />
<circle
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="circle11741"
cx="275.16666"
cy="89.958336"
r="2.5135369" />
<circle
style="font-variation-settings:normal;display:inline;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="path3635"
cx="169.33333"
cy="47.625008"
r="2.513551" />
<text
id="text20065"
y="33.113132"
x="162.61926"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="33.113132"
x="162.61926"
id="tspan20063"
sodipodi:role="line">U·B</tspan></text>
<text
id="text20069"
y="59.571465"
x="156.05125"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="59.571465"
x="156.05125"
id="tspan20067"
sodipodi:role="line">··B</tspan></text>
<text
id="text20077"
y="67.508965"
x="300.25552"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="67.508965"
x="300.25552"
id="tspan20075"
sodipodi:role="line">UJ·</tspan></text>
<text
id="text20081"
y="67.508965"
x="209.02083"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="67.508965"
x="209.02083"
id="tspan20079"
sodipodi:role="line">·J·</tspan></text>
<text
id="text20085"
y="72.800629"
x="208.96791"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="72.800629"
x="208.96791"
id="tspan20083"
sodipodi:role="line">·JB</tspan></text>
<text
id="text20089"
y="72.800629"
x="300.20261"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="72.800629"
x="300.20261"
id="tspan20087"
sodipodi:role="line">UJB</tspan></text>
<text
id="text20135"
y="80.738129"
x="162.71875"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="80.738129"
x="162.71875"
id="tspan20133"
sodipodi:role="line">·J·</tspan></text>
<text
id="text20139"
y="101.9048"
x="165.03554"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="101.9048"
x="165.03554"
id="tspan20137"
sodipodi:role="line">·JB</tspan></text>
<text
id="text20143"
y="78.0923"
x="256.59927"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:none;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="78.0923"
x="256.59927"
id="tspan20141"
sodipodi:role="line">UJ·</tspan></text>
<text
id="text20147"
y="83.383965"
x="256.59293"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
y="83.383965"
x="256.59293"
id="tspan20145"
sodipodi:role="line">UJB</tspan></text>
<text
id="text20151"
y="80.738129"
x="289.66583"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="80.738129"
x="289.66583"
id="tspan20149"
sodipodi:role="line">U··</tspan></text>
<text
id="text20155"
y="101.9048"
x="289.67218"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="101.9048"
x="289.67218"
id="tspan20153"
sodipodi:role="line">···</tspan></text>
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="circle20382"
sodipodi:type="arc"
sodipodi:cx="254.00002"
sodipodi:cy="68.791702"
sodipodi:rx="2.5135145"
sodipodi:ry="2.5135176"
sodipodi:start="0"
sodipodi:end="3.1415927"
sodipodi:arc-type="arc"
d="m 256.51353,68.791702 a 2.5135145,2.5135176 0 0 1 -1.25676,2.17677 2.5135145,2.5135176 0 0 1 -2.51351,0 2.5135145,2.5135176 0 0 1 -1.25676,-2.17677"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;display:inline;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="path20546"
sodipodi:type="arc"
sodipodi:cx="169.46559"
sodipodi:cy="89.942223"
sodipodi:rx="2.3811555"
sodipodi:ry="2.3811579"
sodipodi:start="3.0194196"
sodipodi:end="6.1610123"
sodipodi:arc-type="arc"
d="m 167.10218,90.232413 a 2.3811555,2.3811579 0 0 1 0.9304,-2.191868 2.3811555,2.3811579 0 0 1 2.3634,-0.29019 2.3811555,2.3811579 0 0 1 1.43302,1.901678"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path20548"
sodipodi:type="arc"
sodipodi:cx="169.46559"
sodipodi:cy="89.942223"
sodipodi:rx="2.3811555"
sodipodi:ry="2.3811579"
sodipodi:start="6.1610123"
sodipodi:end="3.0194196"
sodipodi:arc-type="arc"
d="m 171.829,89.652033 a 2.3811555,2.3811579 0 0 1 -2.07322,2.653599 2.3811555,2.3811579 0 0 1 -2.6536,-2.073219"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 178.59376,88.635417 2.64583,1.322917 -2.64583,1.322916 v -2.645833"
id="path22082" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 265.90626,88.635417 2.64583,1.322917 -2.64583,1.322916 v -2.645833"
id="path22084" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 177.73266,48.322005 2.24902,1.921577 -2.88667,0.646269 0.63765,-2.567846"
id="path22086" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 242.86108,64.614872 2.24902,1.921577 -2.88667,0.646269 0.63765,-2.567846"
id="path22088" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 244.7139,69.776397 -2.24902,1.921577 2.88667,0.646269 -0.63765,-2.567846"
id="path22090" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 180.42655,85.841132 -2.24902,1.921577 2.88667,0.646269 -0.63765,-2.567846"
id="path22092" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 41 KiB

247
doc/artwork/line-caps.svg

@ -0,0 +1,247 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="275.00003"
height="50.000053"
viewBox="0 0 72.760426 13.229181"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-caps.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="4.7572176"
inkscape:cx="137.16001"
inkscape:cy="1.156138"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g5906">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-166.6875"
originy="-112.44791" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="translate(-166.68748,-112.44791)"
style="display:none"
sodipodi:insensitive="true">
<rect
y="112.44791"
x="166.68748"
height="13.229181"
width="72.760429"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.264579;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="quads"
style="display:inline"
transform="translate(-2.6458214,-14.552066)"
sodipodi:insensitive="true">
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 47.624992,15.878793 H 5.3219349 V 26.454552 H 47.624992 V 15.878793"
id="path4726"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529165;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 5.3219349,21.166673 42.3030571,5e-6"
id="path3579"
sodipodi:nodetypes="cc" />
</g>
<g
inkscape:label="triangle"
inkscape:groupmode="layer"
id="g6070"
style="display:inline"
transform="translate(-166.68748,-112.44791)">
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="M 5.2916574,26.458325 52.916659,15.874991"
id="path2488"
transform="translate(164.04166,97.895844)" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 47.625 v -10.58333 h -47.625 z"
id="path6060" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,113.77084 h 42.33333 l 5.29167,5.29166 -5.29167,5.29167 h -42.33333"
id="path6081" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 226.15826,124.35417 h 10.58333 v -10.58333 h -10.58333 z"
id="path6207" />
<path
style="fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="m 226.21873,124.35417 10.58334,-10.58333"
id="path2494" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 231.44992,113.77084 -5.29166,5.29166 5.29166,5.29167 5.29167,-5.29167 -5.29167,-5.29166"
id="path6828" />
</g>
<g
inkscape:label="round"
inkscape:groupmode="layer"
id="g5947"
style="display:none"
transform="translate(-166.68748,-112.44791)">
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="M 5.2916574,26.458325 52.916659,15.874991"
id="path2543"
transform="translate(164.04166,97.895844)" />
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="m 226.21873,124.35417 10.58334,-10.58333"
id="path2545"
transform="translate(1.0912288e-6)" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 47.625 v -10.58333 h -47.625 z"
id="path5941" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 226.15826,124.35417 h 10.58333 v -10.58333 h -10.58333 z"
id="path6869" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path5956"
sodipodi:type="arc"
sodipodi:cx="211.66666"
sodipodi:cy="119.06251"
sodipodi:rx="5.2916622"
sodipodi:ry="5.2916622"
sodipodi:start="4.712389"
sodipodi:end="1.5707963"
sodipodi:arc-type="arc"
d="m 211.66666,113.77085 a 5.2916622,5.2916622 0 0 1 5.29166,5.29166 5.2916622,5.2916622 0 0 1 -5.29166,5.29166"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,113.77084 h 42.33333"
id="path6021" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 42.33333"
id="path6023" />
<circle
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path9349"
cx="231.44992"
cy="119.06251"
r="5.2916665" />
</g>
<g
inkscape:label="butt"
inkscape:groupmode="layer"
id="g5906"
style="display:none"
transform="translate(-166.68748,-112.44791)">
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 42.33332 v -10.58333 h -42.33332 z"
id="path2973"
transform="translate(1.0912288e-6)"
sodipodi:nodetypes="ccccc" />
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="M 5.2916574,26.458325 47.62499,15.874991"
id="path2549"
transform="translate(164.04166,97.895844)"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.344,124.35417 h 42.32267 V 113.77084 H 169.344"
id="path5902" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 231.44992,113.77084 v 10.58333"
id="path9409" />
</g>
<g
inkscape:label="square"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-166.68748,-112.44791)">
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="M 5.2916574,26.458325 52.916659,15.874991"
id="path2555"
transform="translate(164.04166,97.895844)" />
<path
style="display:inline;fill:none;stroke:#dcdcdc;stroke-width:0.264583;stroke-linejoin:round;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stop-color:#000000"
d="m 226.21873,124.35417 10.58334,-10.58333"
id="path2557"
transform="translate(1.0912288e-6)" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 226.15826,124.35417 h 10.58333 v -10.58333 h -10.58333 z"
id="path6890" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 47.625 v -10.58333 h -47.625 z"
id="path5793" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,124.35417 h 47.625 v -10.58333 h -47.625"
id="path5819" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 226.15825,113.77084 h 10.58334 v 10.58333 h -10.58334 z"
id="path6899" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="points"
style="display:inline"
transform="translate(-2.6458214,-14.552066)"
sodipodi:insensitive="true">
<circle
style="font-variation-settings:normal;display:inline;fill:#747474;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle6892"
cx="67.438499"
cy="21.166664"
r="1.3531623" />
<circle
style="font-variation-settings:normal;display:inline;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle3695"
cx="47.625"
cy="21.136419"
r="1.3531623" />
<circle
style="font-variation-settings:normal;display:inline;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle3693"
cx="5.2916651"
cy="21.166664"
r="1.3229169" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

395
doc/artwork/line-joins.svg

@ -0,0 +1,395 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="264.99997"
height="130.00002"
viewBox="0 0 70.114575 34.395837"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-joins.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="1.6819304"
inkscape:cx="253.87495"
inkscape:cy="50.239891"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-165.36458"
originy="-67.468751" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="translate(-165.36458,-67.46875)"
style="display:none">
<rect
y="67.46875"
x="165.36458"
height="34.395836"
width="70.114578"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.264579;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:groupmode="layer"
id="layer7"
inkscape:label="quads"
style="display:inline"
sodipodi:insensitive="true"
transform="translate(-1.3229082,-35.71875)">
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 44.979167,47.624997 2.6458303,58.208341 5.2916601,68.79167 47.624997,58.208341 44.979167,47.624997"
id="path4724"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 47.624997,47.624997 44.979167,58.208341 2.6458303,47.624997 5.2916601,37.041668 47.624997,47.624997"
id="path4285"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529165;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 3.9687452,42.333337 46.302082,52.916671 3.9687452,63.5"
id="path3451"
sodipodi:nodetypes="ccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="round"
style="display:none"
transform="translate(-165.36458,-67.46875)">
<text
transform="translate(209.76304,-8.5704177)"
id="text460"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan458"
sodipodi:role="line">A</tspan></text>
<text
transform="translate(209.82654,5.2118816)"
id="text972"
y="87.725258"
x="5.9676266"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="5.9676266"
id="tspan970"
sodipodi:role="line">B</tspan></text>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 169.33333,68.791667 -2.64584,10.583331 21.16668,5.29167 -21.16668,5.291665 2.64584,10.583337 46.56667,-11.641672 -1e-5,-8.466665 z"
id="path2527"
sodipodi:nodetypes="cccccccc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 215.89998,80.433333 c -1.93215,0.15163 -28.04581,4.23333 -28.04581,4.23333 L 215.9,88.899998"
id="path2584" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 169.33333,100.54167 187.85416,84.666666"
id="path10785" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 166.6875,79.375 215.9,80.433333"
id="path10787" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,68.791662 42.33333,10.583336"
id="path846" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path2322"
sodipodi:type="arc"
sodipodi:cx="210.34373"
sodipodi:cy="84.666664"
sodipodi:rx="5.4584122"
sodipodi:ry="5.4584122"
sodipodi:start="4.9567351"
sodipodi:end="1.3264502"
sodipodi:arc-type="arc"
d="m 211.66424,79.37039 a 5.4584122,5.4584122 0 0 1 4.13791,5.296274 5.4584122,5.4584122 0 0 1 -4.13791,5.296274"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.374998 21.16666,5.291665 -21.16666,5.29167"
id="path850" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 211.66666,89.958333 169.33333,100.54167"
id="path848" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="miter-clip"
style="display:none"
transform="translate(-165.36458,-67.46875)">
<text
transform="translate(213.53071,4.2175381)"
id="text956"
y="87.725258"
x="5.9676266"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="5.9676266"
id="tspan954"
sodipodi:role="line">B</tspan></text>
<text
transform="translate(213.46721,-7.5993862)"
id="text968"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan966"
sodipodi:role="line">A</tspan></text>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 169.33333,68.791667 -2.64584,10.583331 21.16668,5.29167 -21.16668,5.291665 2.64584,10.583337 50.27084,-12.567712 v -6.61458 z"
id="path2511"
sodipodi:nodetypes="cccccccc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 219.60416,81.359373 c -1.32291,0 -31.75,3.307295 -31.75,3.307295 l 31.75,3.30729"
id="path2582" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 169.33333,100.54167 187.85416,84.666666"
id="path10693" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.375 52.91666,1.984374"
id="path10695" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,68.791667 50.27083,12.567706 v 6.614585 l -50.27083,12.567712"
id="path842" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,89.958333 21.16666,-5.291665 -21.16666,-5.29167"
id="path844" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="bevel"
style="display:inline"
transform="translate(-165.36458,-67.46875)">
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 169.33333,68.79166 -2.64584,10.58333 21.16668,5.29167 -21.16668,5.291666 2.64584,10.583334 42.33334,-10.583334 V 79.37499 Z"
id="path2491" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 211.66667,79.37499 -23.8125,5.29167 23.8125,5.291666"
id="path2497" />
<text
transform="translate(205.52971,-9.6075612)"
id="text452"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan450"
sodipodi:role="line">A</tspan></text>
<text
transform="translate(205.59321,6.2674388)"
id="text456"
y="87.725258"
x="5.9676266"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="5.9676266"
id="tspan454"
sodipodi:role="line">B</tspan></text>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 169.33333,100.54167 187.85416,84.666666"
id="path10603" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.375 h 44.97916"
id="path10605" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 169.33333,68.791665 211.66666,79.375 v 10.583331 l -42.33333,10.583339"
id="path837" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.375 21.16666,5.291665 -21.16666,5.291666"
id="path840" />
</g>
<g
inkscape:label="miter"
inkscape:groupmode="layer"
id="layer1"
style="display:none"
transform="translate(-165.36458,-67.46875)">
<text
transform="translate(226.75987,0.9757728)"
id="text960"
y="87.725258"
x="5.9676266"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="5.9676266"
id="tspan958"
sodipodi:role="line">B</tspan></text>
<text
transform="translate(226.69637,-4.3158939)"
id="text964"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan962"
sodipodi:role="line">A</tspan></text>
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529165;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path2173"
sodipodi:type="arc"
sodipodi:cx="210.34375"
sodipodi:cy="84.666664"
sodipodi:rx="5.953125"
sodipodi:ry="5.953125"
sodipodi:start="2.8972466"
sodipodi:end="3.3859387"
sodipodi:arc-type="arc"
d="m 204.56746,86.106855 a 5.953125,5.953125 0 0 1 0,-2.880382"
sodipodi:open="true" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 187.85417,84.666664 h 44.97916"
id="path2493" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 169.33333,68.791664 63.5,15.875 -63.5,15.875006 -2.64584,-10.583335 21.16668,-5.291671 -21.16668,-5.291665 2.64584,-10.583335"
id="path2475" />
<text
transform="translate(210.19907,0.2751554)"
id="text1561"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan1559"
sodipodi:role="line">l</tspan></text>
<text
transform="translate(200.16819,0.61593911)"
id="text1565"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan1563"
sodipodi:role="line">α</tspan></text>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 169.33333,100.54167 187.85416,84.666666"
id="path10515" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.375 66.14583,5.291666"
id="path10517" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,79.375001 21.16666,5.291666 -21.16666,5.291667"
id="path835" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#2f83cc;stroke-width:0.529165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33333,68.791667 63.5,15.875 -63.5,15.875003"
id="path833" />
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="points"
style="display:inline"
sodipodi:insensitive="true"
transform="translate(-1.3229082,-35.71875)">
<text
transform="translate(-28.944983,-33.420061)"
id="text468"
y="87.725258"
x="43.454727"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="43.454727"
id="tspan466"
sodipodi:role="line">C</tspan></text>
<circle
style="font-variation-settings:normal;display:inline;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="path3635"
cx="3.9687517"
cy="42.333332"
r="1.322922" />
<circle
style="font-variation-settings:normal;display:inline;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle3691"
cx="3.9687464"
cy="63.499996"
r="1.3229175" />
<circle
style="font-variation-settings:normal;display:inline;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264582;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle3689"
cx="46.302071"
cy="52.916664"
r="1.3229085" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

547
doc/artwork/line-quad-data-neighbor.svg

@ -0,0 +1,547 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="465.00003"
height="105"
viewBox="0 0 123.03126 27.78125"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-quad-data-neighbor.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="1.6819304"
inkscape:cx="232.76825"
inkscape:cy="87.102296"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-177.27083"
originy="3.9687503" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="matrix(1.0707964,0,0,1,-198.99941,3.9687548)"
style="display:none;stroke-width:0.966377">
<rect
y="-3.9687548"
x="185.84244"
height="27.78125"
width="114.89697"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.255682;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:label="position"
inkscape:groupmode="layer"
id="g23745"
style="display:inline"
transform="translate(-177.27081,3.9687548)">
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37661"
width="7.9375224"
height="6.614583"
x="179.91664"
y="2.6458399" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37663"
width="7.9375019"
height="6.614583"
x="189.17706"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37665"
width="7.9375105"
height="6.614583"
x="198.43747"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37667"
width="7.9375105"
height="6.614583"
x="207.69789"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37669"
width="7.9374933"
height="6.614583"
x="220.92706"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37671"
width="7.9375238"
height="6.614583"
x="230.18747"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37673"
width="7.9375043"
height="6.614583"
x="239.44789"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37675"
width="7.9375038"
height="6.614583"
x="248.7083"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37677"
width="7.9375076"
height="6.614583"
x="261.93744"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37679"
width="7.9375072"
height="6.614583"
x="271.19788"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37681"
width="7.9375057"
height="6.614583"
x="280.45828"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37683"
width="7.9375157"
height="6.614583"
x="289.71869"
y="5.2916622" />
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="other"
style="display:inline"
transform="translate(-15.874971,1.3229175)">
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37687"
width="7.9375019"
height="2.6458361"
x="207.69791"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37689"
width="7.9375043"
height="2.6458361"
x="220.92706"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37691"
width="7.9375043"
height="2.6458349"
x="230.18748"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37693"
width="7.9374933"
height="2.6458349"
x="179.91666"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37695"
width="7.9374933"
height="2.6458337"
x="189.17706"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37697"
width="7.9374933"
height="2.6458347"
x="239.44791"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37699"
width="7.9374933"
height="2.6458378"
x="248.70831"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37701"
width="7.9375281"
height="2.6458361"
x="280.45825"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37703"
width="7.9375281"
height="2.645839"
x="289.71866"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37705"
width="7.9375057"
height="2.6458361"
x="261.93744"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37707"
width="7.9375057"
height="2.6458349"
x="271.19785"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38598"
width="7.9375019"
height="2.6458333"
x="198.43745"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="neighbor"
style="display:inline"
transform="translate(-15.874993)">
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37685"
width="7.9375019"
height="2.6458333"
x="179.91663"
y="-1.3229158"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37821"
width="7.9375019"
height="2.6458333"
x="220.92705"
y="-1.3229158"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37823"
width="7.9375019"
height="2.6458361"
x="230.18745"
y="1.3229182"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37825"
width="7.9375043"
height="2.6458349"
x="207.69788"
y="13.229168"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37827"
width="7.9375043"
height="2.6458361"
x="198.43745"
y="10.583336"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38474"
width="7.9375019"
height="2.6458361"
x="189.17705"
y="1.3229144"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38476"
width="7.9375019"
height="2.6458333"
x="239.44788"
y="10.583338"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38478"
width="7.9375019"
height="2.6458321"
x="248.7083"
y="13.22917"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38480"
width="7.9375019"
height="2.6458333"
x="261.93747"
y="-1.3229158"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38482"
width="7.9375019"
height="2.6458361"
x="271.19791"
y="1.3229182"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38686"
width="7.9375019"
height="2.6458333"
x="280.45831"
y="10.583336"
transform="translate(-161.39582,3.9687543)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2d3236;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38688"
width="7.9375019"
height="2.6458321"
x="289.71872"
y="13.22917"
transform="translate(-161.39582,3.9687543)" />
<text
transform="translate(98.273927,-62.549619)"
id="text37743"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37741"
sodipodi:role="line">U·B</tspan></text>
<text
transform="translate(107.58091,-62.524219)"
id="text37747"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37745"
sodipodi:role="line">··B</tspan></text>
<text
transform="translate(116.84768,-62.549619)"
id="text37751"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37749"
sodipodi:role="line">U··</tspan></text>
<text
transform="translate(126.15467,-62.547502)"
id="text37755"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37753"
sodipodi:role="line">···</tspan></text>
<text
transform="translate(34.873459,-76.414847)"
id="text37759"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37757"
sodipodi:role="line">A</tspan></text>
<text
transform="translate(44.02804,-73.769011)"
id="text37763"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37761"
sodipodi:role="line">B</tspan></text>
<text
transform="translate(57.320707,-76.414847)"
id="text37767"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37765"
sodipodi:role="line">C</tspan></text>
<text
transform="translate(66.543024,-73.769019)"
id="text37771"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan37769"
sodipodi:role="line">D</tspan></text>
<text
transform="translate(34.826869,-62.549618)"
id="text38486"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38484"
sodipodi:role="line">UJ·</tspan></text>
<text
transform="translate(44.133853,-62.549618)"
id="text38490"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38488"
sodipodi:role="line">·J·</tspan></text>
<text
transform="translate(57.263535,-62.549618)"
id="text38494"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38492"
sodipodi:role="line">UJB</tspan></text>
<text
transform="translate(66.570519,-62.549618)"
id="text38498"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38496"
sodipodi:role="line">·JB</tspan></text>
<text
transform="translate(16.253117,-62.549618)"
id="text38502"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38500"
sodipodi:role="line">U·B</tspan></text>
<text
transform="translate(25.560101,-62.524218)"
id="text38506"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38504"
sodipodi:role="line">··B</tspan></text>
<text
transform="translate(85.144271,-62.547501)"
id="text38510"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38508"
sodipodi:role="line">···</tspan></text>
<text
transform="translate(75.837287,-62.549618)"
id="text38514"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan38512"
sodipodi:role="line">U··</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 57 KiB

252
doc/artwork/line-quad-data-other.svg

@ -0,0 +1,252 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="465.00006"
height="85"
viewBox="0 0 123.03127 22.489583"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-quad-data-other.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="1.6819304"
inkscape:cx="232.76825"
inkscape:cy="87.102296"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-177.27084"
originy="3.96875" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="matrix(1.0707964,0,0,1,-198.99941,3.9687548)"
style="display:none;stroke-width:0.966377">
<rect
y="-3.9687548"
x="185.84244"
height="22.489584"
width="114.89697"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.255682;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:label="position"
inkscape:groupmode="layer"
id="g23745"
style="display:inline"
transform="translate(-177.27081,3.9687548)">
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37661"
width="7.9375224"
height="6.614583"
x="179.91664"
y="2.6458399" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37663"
width="7.9375019"
height="6.614583"
x="189.17706"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37665"
width="7.9375105"
height="6.614583"
x="198.43747"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37667"
width="7.9375105"
height="6.614583"
x="207.69789"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37669"
width="7.9374933"
height="6.614583"
x="220.92706"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37671"
width="7.9375238"
height="6.614583"
x="230.18747"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37673"
width="7.9375043"
height="6.614583"
x="239.44789"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37675"
width="7.9375038"
height="6.614583"
x="248.7083"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37677"
width="7.9375076"
height="6.614583"
x="261.93744"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37679"
width="7.9375072"
height="6.614583"
x="271.19788"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37681"
width="7.9375057"
height="6.614583"
x="280.45828"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37683"
width="7.9375157"
height="6.614583"
x="289.71869"
y="5.2916622" />
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="other"
style="display:inline"
transform="translate(-15.87497,1.3229175)">
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37687"
width="7.9375019"
height="2.6458361"
x="207.69791"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37689"
width="7.9375043"
height="2.6458361"
x="220.92706"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37691"
width="7.9375043"
height="2.6458349"
x="230.18748"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37693"
width="7.9374933"
height="2.6458349"
x="179.91666"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37695"
width="7.9374933"
height="2.6458337"
x="189.17706"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37697"
width="7.9374933"
height="2.6458347"
x="239.44791"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37699"
width="7.9374933"
height="2.6458378"
x="248.70831"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37701"
width="7.9375281"
height="2.6458361"
x="280.45825"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37703"
width="7.9375281"
height="2.645839"
x="289.71866"
y="1.3229163"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37705"
width="7.9375057"
height="2.6458361"
x="261.93744"
y="10.583334"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37707"
width="7.9375057"
height="2.6458349"
x="271.19785"
y="13.22917"
transform="translate(-161.39584,2.6458373)" />
<rect
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect38598"
width="7.9375019"
height="2.6458333"
x="198.43745"
y="-1.3229158"
transform="translate(-161.39584,2.6458373)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

2287
doc/artwork/line-quad-data-overlap.svg

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 238 KiB

149
doc/artwork/line-quad-data.svg

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="465.00003"
height="54.999996"
viewBox="0 0 123.03127 14.552082"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-quad-data.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="1.6819304"
inkscape:cx="235.14647"
inkscape:cy="72.238423"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer2">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-177.27086"
originy="-1.007061e-06" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="matrix(1.0707964,0,0,1,-198.99941,3.5929388e-6)"
style="display:none;stroke-width:0.966377">
<rect
y="-3.5929388e-06"
x="185.84244"
height="14.552083"
width="114.89697"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.255682;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:label="position"
inkscape:groupmode="layer"
id="g23745"
style="display:inline"
transform="translate(-177.27081)">
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37661"
width="7.9375224"
height="6.614583"
x="179.91664"
y="2.6458399" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37663"
width="7.9375019"
height="6.614583"
x="189.17706"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37665"
width="7.9375105"
height="6.614583"
x="198.43747"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37667"
width="7.9375105"
height="6.614583"
x="207.69789"
y="5.2916698" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37669"
width="7.9374933"
height="6.614583"
x="220.92706"
y="2.6458323" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37671"
width="7.9375238"
height="6.614583"
x="230.18747"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37673"
width="7.9375043"
height="6.614583"
x="239.44789"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37675"
width="7.9375038"
height="6.614583"
x="248.7083"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37677"
width="7.9375076"
height="6.614583"
x="261.93744"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37679"
width="7.9375072"
height="6.614583"
x="271.19788"
y="5.2916622" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37681"
width="7.9375057"
height="6.614583"
x="280.45828"
y="2.6458247" />
<rect
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="rect37683"
width="7.9375157"
height="6.614583"
x="289.71869"
y="5.2916622" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

408
doc/artwork/line-quad-expansion.svg

@ -0,0 +1,408 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="449.99994"
height="150"
viewBox="0 0 119.06249 39.6875"
version="1.1"
id="svg1448"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="line-quad-expansion.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1450"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="2.3786088"
inkscape:cx="191.07808"
inkscape:cy="30.480002"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g55009">
<inkscape:grid
type="xygrid"
id="grid2101"
originx="-161.39586"
originy="29.104164" />
</sodipodi:namedview>
<defs
id="defs1445" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg"
transform="matrix(1.0707964,0,0,1,-183.12445,29.104168)"
style="display:none;stroke-width:0.966377"
sodipodi:insensitive="true">
<rect
y="-29.104168"
x="171.01706"
height="39.6875"
width="111.19059"
id="rect845"
style="display:inline;fill:#2f363f;fill-opacity:1;stroke:none;stroke-width:0.255683;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
</g>
<g
inkscape:label="joints and caps"
inkscape:groupmode="layer"
id="g23745"
style="display:none"
transform="translate(-161.39585,29.104168)"
sodipodi:insensitive="true">
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 198.19697,-9.2604196 22.23813,5.2916668 V -14.552086 l -22.23813,5.2916664"
id="path23755"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 276.35729,-3.9687528 h -52.65208 v 10.583334 h 52.65208 v -10.583334"
id="path23707"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 228.86457,1.3229142 42.33333,10e-7"
id="path23715"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 176.46515,-19.804759 2.24902,1.921577 -2.88667,0.646269 0.63765,-2.567846"
id="path23727" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 264.58332,-1.8035111e-6 267.22915,1.3229152 264.58332,2.6458312 V -1.8035111e-6"
id="path23729" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 205.4489,-12.504913 2.24902,1.921577 -2.88667,0.6462694 0.63765,-2.5678464"
id="path23737" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 207.18069,-9.2214252 -2.24902,1.921577 2.88667,0.646269 -0.63765,-2.567846"
id="path23739" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 178.97537,-2.1921973 -2.24902,1.92157701 2.88667,0.646269 -0.63765,-2.56784601"
id="path23741" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 232.83332,-1.8052667e-6 235.47915,1.3229152 232.83332,2.6458312 V -1.8052667e-6"
id="path23743" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 166.6875,7.937497 214.3125,-3.9687528 190.5,-9.2604196 164.04167,-2.6458361 Z"
id="path23751" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 166.6875,-26.458337 47.625,11.906251 -23.8125,5.2916664 -26.45833,-6.6145834 z"
id="path23753" />
<text
transform="translate(210.63722,-102.21173)"
id="text25127"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan25125"
sodipodi:role="line">A</tspan></text>
<text
transform="translate(210.63722,-88.982563)"
id="text25176"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan25174"
sodipodi:role="line">C</tspan></text>
<text
transform="translate(184.3207,-98.24298)"
id="text25180"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan25178"
sodipodi:role="line">B</tspan></text>
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 170.65625,-19.843752 212.98958,-9.2604193 170.65625,1.3229133"
id="path23713"
sodipodi:nodetypes="ccc" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.255687, 0.511375;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 175.95885,7.937497 198.19697,-9.2604196"
id="path23757"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.255687, 0.511375;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 173.48795,-15.875003 46.94715,1.322917"
id="path23759"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.255687, 0.511375;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 229.08325,6.6145803 278.5013,-3.9687528"
id="path23805"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<text
transform="translate(184.3207,-92.951313)"
id="text29034"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan29032"
sodipodi:role="line">D</tspan></text>
</g>
<g
inkscape:label="miter joints and caps"
inkscape:groupmode="layer"
id="g55009"
style="display:inline"
transform="translate(-161.39585,29.104168)">
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 276.35729,-3.9687528 h -52.65208 v 10.583334 h 52.65208 v -10.583334"
id="path54965"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 228.86457,1.3229142 42.33333,10e-7"
id="path54967"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 176.46515,-19.804759 2.24902,1.921577 -2.88667,0.646269 0.63765,-2.567846"
id="path54969" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 264.58332,-1.8035111e-6 267.22915,1.3229152 264.58332,2.6458312 V -1.8035111e-6"
id="path54971" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 205.4489,-12.504913 2.24902,1.921577 -2.88667,0.6462694 0.63765,-2.5678464"
id="path54973" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 207.18069,-9.2214252 -2.24902,1.921577 2.88667,0.646269 -0.63765,-2.567846"
id="path54975" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 178.97537,-2.1921973 -2.24902,1.92157701 2.88667,0.646269 -0.63765,-2.56784601"
id="path54977" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#747474;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 232.83332,-1.8052667e-6 235.47915,1.3229152 232.83332,2.6458312 V -1.8052667e-6"
id="path54979" />
<text
transform="translate(229.3422,-98.24298)"
id="text54987"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan54985"
sodipodi:role="line">A</tspan></text>
<text
transform="translate(229.29987,-92.951313)"
id="text54991"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan54989"
sodipodi:role="line">C</tspan></text>
<text
transform="translate(184.3207,-98.24298)"
id="text54995"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan54993"
sodipodi:role="line">B</tspan></text>
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 170.65625,-19.843752 212.98958,-9.2604193 170.65625,1.3229133"
id="path54997"
sodipodi:nodetypes="ccc" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.255687, 0.511375;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 175.95885,7.937497 198.19697,-9.2604196"
id="path54999"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.255687;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.255687, 0.511375;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 229.08325,6.6145803 278.5013,-3.9687528"
id="path55003"
transform="matrix(1.0707964,0,0,1,-21.7286,-8.508772e-7)" />
<text
transform="translate(184.3207,-92.951313)"
id="text55007"
y="87.725258"
x="6.13696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;display:inline;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:middle;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
y="87.725258"
x="6.13696"
id="tspan55005"
sodipodi:role="line">D</tspan></text>
<path
style="fill:none;stroke:#dcdcdc;stroke-width:0.264583;-inkscape-stroke:none;stop-color:#000000;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-opacity:1"
d="m 166.68749,-26.458338 68.79167,17.1979171 h -44.97917 l -26.45833,-6.6145831 z"
id="path55074" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 164.04166,-2.6458374 26.45833,-6.6145835 h 44.97917 L 166.68749,7.937497 Z"
id="path55110" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.2645831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.2645831,0.52916723;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 164.04166,-15.875004 70.11458,6.6145831"
id="path55112" />
</g>
<g
inkscape:label="quads"
inkscape:groupmode="layer"
id="layer1"
style="display:none"
transform="translate(-161.39585,29.104168)">
<path
style="font-variation-settings:normal;display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 271.1979,-3.9687528 H 228.86457 V 6.6145812 H 271.1979 V -3.9687528"
id="path4726"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 211.66666,-14.552086 -42.33333,10.5833323 2.64583,10.583333 42.33334,-10.583333 -2.64584,-10.5833323"
id="path4724"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 214.3125,-14.552086 -2.64584,10.5833323 -42.33333,-10.5833323 2.64583,-10.583334 42.33334,10.583334"
id="path4285"
sodipodi:nodetypes="ccccc" />
<path
style="font-variation-settings:normal;display:inline;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
d="M 170.65625,-19.843752 212.98958,-9.2604193 170.65625,1.3229133"
id="path3451"
sodipodi:nodetypes="ccc" />
<path
style="font-variation-settings:normal;display:inline;fill:none;fill-opacity:1;stroke:#dcdcdc;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
d="m 228.86457,1.3229142 42.33333,10e-7"
id="path3579"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 176.46515,-19.804759 2.24902,1.921577 -2.88667,0.646269 0.63765,-2.567846"
id="path23439" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 264.58332,-1.8035111e-6 267.22915,1.3229152 264.58332,2.6458312 V -1.8035111e-6"
id="path23441" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 171.97917,6.6145815 39.6875,-21.1666675"
id="path23487" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 169.33334,-14.552086 h 44.97917"
id="path23489" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#747474;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 228.86457,6.6145815 271.1979,-3.9687521"
id="path23491" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 205.4489,-12.504913 2.24902,1.921577 -2.88667,0.6462694 0.63765,-2.5678464"
id="path23493" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 207.18069,-9.2214252 -2.24902,1.921577 2.88667,0.646269 -0.63765,-2.567846"
id="path23495" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 178.97537,-2.1921973 -2.24902,1.92157701 2.88667,0.646269 -0.63765,-2.56784601"
id="path23497" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#dcdcdc;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.529167;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 232.83332,-1.8052667e-6 235.47915,1.3229152 232.83332,2.6458312 V -1.8052667e-6"
id="path23499" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="points"
style="display:inline"
sodipodi:insensitive="true">
<circle
style="font-variation-settings:normal;display:inline;fill:#3bd267;fill-opacity:1;stroke:#2f363f;stroke-width:0.264584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle23717"
cx="170.65627"
cy="-19.843754"
r="2.6458278"
transform="translate(-161.39585,29.104167)" />
<circle
style="font-variation-settings:normal;display:inline;fill:#2f83cc;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle23719"
cx="212.98959"
cy="-9.2604198"
r="2.6458187"
transform="translate(-161.39585,29.104167)" />
<circle
style="font-variation-settings:normal;display:inline;fill:#a5c9ea;fill-opacity:1;stroke:#2f363f;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle23721"
cx="170.65625"
cy="1.3229114"
r="2.6458278"
transform="translate(-161.39585,29.104167)" />
<circle
style="font-variation-settings:normal;display:inline;fill:#cd3431;fill-opacity:1;stroke:#2f363f;stroke-width:0.264584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle23723"
cx="228.86455"
cy="1.3229153"
r="2.6458306"
transform="translate(-161.39585,29.104167)" />
<circle
style="font-variation-settings:normal;display:inline;fill:#c7cf2f;fill-opacity:1;stroke:#2f363f;stroke-width:0.264584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
id="circle23725"
cx="271.19791"
cy="1.3229153"
r="2.6458306"
transform="translate(-161.39585,29.104167)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 42 KiB

64
doc/snippets/MagnumShaders-gl.cpp

@ -42,6 +42,7 @@
#include "Magnum/GL/Shader.h" #include "Magnum/GL/Shader.h"
#include "Magnum/GL/Renderbuffer.h" #include "Magnum/GL/Renderbuffer.h"
#include "Magnum/GL/RenderbufferFormat.h" #include "Magnum/GL/RenderbufferFormat.h"
#include "Magnum/GL/Renderer.h"
#include "Magnum/GL/Texture.h" #include "Magnum/GL/Texture.h"
#include "Magnum/GL/TextureFormat.h" #include "Magnum/GL/TextureFormat.h"
#include "Magnum/GL/Version.h" #include "Magnum/GL/Version.h"
@ -66,6 +67,8 @@
#include "Magnum/Shaders/DistanceFieldVector.h" #include "Magnum/Shaders/DistanceFieldVector.h"
#include "Magnum/Shaders/Flat.h" #include "Magnum/Shaders/Flat.h"
#include "Magnum/Shaders/Generic.h" #include "Magnum/Shaders/Generic.h"
#include "Magnum/Shaders/Line.h"
#include "Magnum/Shaders/LineGL.h"
#include "Magnum/Shaders/MeshVisualizer.h" #include "Magnum/Shaders/MeshVisualizer.h"
#include "Magnum/Shaders/Phong.h" #include "Magnum/Shaders/Phong.h"
#include "Magnum/Shaders/Vector.h" #include "Magnum/Shaders/Vector.h"
@ -694,6 +697,67 @@ vert.addSource(Utility::format(
/* [GenericGL-custom-preprocessor] */ /* [GenericGL-custom-preprocessor] */
} }
#ifndef MAGNUM_TARGET_GLES2
{
GL::Mesh mesh;
Matrix3 transformationMatrix, projectionMatrix;
/* [LineGL-usage2] */
Shaders::LineGL2D shader;
shader
.setViewportSize(Vector2{GL::defaultFramebuffer.viewport().size()})
.setTransformationProjectionMatrix(projectionMatrix*transformationMatrix)
.setColor(0x2f83cc_rgbf)
.setWidth(4.0f)
.draw(mesh);
/* [LineGL-usage2] */
}
{
GL::Mesh mesh;
/* [LineGL-usage-antialiasing] */
GL::Renderer::enable(GL::Renderer::Feature::Blending);
GL::Renderer::setBlendFunction(
GL::Renderer::BlendFunction::One,
GL::Renderer::BlendFunction::OneMinusSourceAlpha);
Shaders::LineGL2D shader;
shader
DOXYGEN_ELLIPSIS()
.setSmoothness(1.0f)
.draw(mesh);
/* [LineGL-usage-antialiasing] */
}
{
GL::Mesh mesh;
Matrix3 transformationMatrix, projectionMatrix;
/* [LineGL-ubo] */
GL::Buffer transformationProjectionUniform, materialUniform, drawUniform;
transformationProjectionUniform.setData({
Shaders::TransformationProjectionUniform2D{}
.setTransformationProjectionMatrix(projectionMatrix*transformationMatrix)
});
materialUniform.setData({
Shaders::LineMaterialUniform{}
.setColor(0x2f83cc_rgbf)
});
drawUniform.setData({
Shaders::LineDrawUniform{}
.setMaterialId(0)
});
Shaders::LineGL2D shader{Shaders::LineGL2D::Configuration{}
.setFlags(Shaders::LineGL2D::Flag::UniformBuffers)};
shader
.setViewportSize(Vector2{GL::defaultFramebuffer.viewport().size()})
.bindTransformationProjectionBuffer(transformationProjectionUniform)
.bindMaterialBuffer(materialUniform)
.bindDrawBuffer(drawUniform)
.draw(mesh);
/* [LineGL-ubo] */
}
#endif
{ {
GL::Mesh mesh; GL::Mesh mesh;
/* [MeshVisualizerGL2D-usage-instancing] */ /* [MeshVisualizerGL2D-usage-instancing] */

24
doc/snippets/README.md

@ -14,13 +14,25 @@ smaller file sizes:
The output printed by the application can be used to update the example output The output printed by the application can be used to update the example output
in `doc/getting-started.dox`. in `doc/getting-started.dox`.
### triangulate.svg, scenedata-tree.svg, scenedata-dod.svg ### triangulate.svg, scenedata-tree.svg, scenedata-dod.svg, line-*.svg
Created by Inkscape from `doc/artwork/triangulate.svg` by saving as Optimized Created by Inkscape from `doc/artwork/triangulate.svg` and `line-*.svg` by
SVG and: saving as Optimized SVG. On fresh installations you need the `scour` package
for it:
- cleaning up the `<svg>` header (removing `version`, `xmlns`) - enabling all possible options in the dialog, saving
- cleaning up the `<svg>` header (removing `version`, `xmlns`) in an editor
- converting to a `style=""`, *keeping* `viewBox` - converting to a `style=""`, *keeping* `viewBox`
- adding `class="m-image"` - adding `class="m-image"`
- removing metadata, the background layer and all layers that have - removing all layers that have `display: none`
`display: none`
In case of the `line-quad-data-expansion*.svg` and
`line-quad-data-overlap-*.svg`, they're all generated from
`doc/artwork/line-quad-expansion.svg` and `doc/artwork/line-quad-overlap.svg`,
each time with different layers shown.
The `doc/artwork/line-quad-data-other.svg` is derived from
`doc/artwork/line-quad-data-neighbor.svg` by removing the "neighbor" layer and
making the canvas smaller, the `doc/artwork/line-quad-data.svg` is then derived
from `doc/artwork/line-quad-data-other.svg` by removing the "other" layer and
making the canvas smaller yet again.

61
doc/snippets/line-annotation.svg

@ -0,0 +1,61 @@
<svg style="width: 590px; height: 300px;" viewBox="0 0 156.1 79.375" class="m-image">
<g transform="translate(-150.81 -26.458)">
<g fill="none" stroke-linejoin="round" stroke-width=".26458">
<g stroke="#747474">
<path d="m156.1 55.562 142.88 13.229" stop-color="#000000" stroke-dasharray="0.264583, 0.529167" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m209.02 68.792h89.958" stop-color="#000000" stroke-dasharray="0.264583, 0.529167" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m161.4 34.396 137.58 34.396-42.333 10.583h29.104v21.167h-116.42l-2.6458-21.167 42.333-10.583-52.917-13.229z" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375 2.6458 10.583v10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.529167" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#dcdcdc" stroke-linecap="round">
<path d="m169.33 89.958h105.83" marker-end="" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 47.625 84.667 21.167" marker-end="" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m254 68.792-84.667 21.167" marker-end="" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#747474" stroke-dasharray="0.264583, 0.529167">
<path d="m209.02 68.792 47.625 10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375h89.958" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m256.65 79.375-87.312 21.167" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m256.65 79.375 29.104 21.167" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<path d="m251.49 68.792a2.5135 2.5135 0 0 1 2.5135-2.5135 2.5135 2.5135 0 0 1 2.5135 2.5135" fill="#a5c9ea" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<circle cx="275.17" cy="89.958" r="2.5135" fill="#dcdcdc" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#3bd267">
<circle cx="169.33" cy="47.625" r="2.5136" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="font-variation-settings:normal"/>
<text x="162.61926" y="33.113132" dominant-baseline="auto" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="162.61926" y="33.113132" dominant-baseline="auto" fill="#3bd267" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text x="156.05125" y="59.571465" dominant-baseline="auto" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="156.05125" y="59.571465" dominant-baseline="auto" fill="#3bd267" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
</g>
<g>
<g font-family="'Source Sans Pro'" font-size="4.2333px" text-anchor="middle">
<g stroke-width=".26458">
<text x="300.25552" y="67.508965" dominant-baseline="auto" fill="#a5c9ea" stop-color="#000000" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="300.25552" y="67.508965" dominant-baseline="auto" fill="#a5c9ea" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ·</tspan></text>
<text x="209.02083" y="67.508965" dominant-baseline="auto" fill="#a5c9ea" stop-color="#000000" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="209.02083" y="67.508965" dominant-baseline="auto" fill="#a5c9ea" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J·</tspan></text>
<text x="208.96791" y="72.800629" dominant-baseline="auto" fill="#cd3431" stop-color="#000000" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="208.96791" y="72.800629" dominant-baseline="auto" fill="#cd3431" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·JB</tspan></text>
<text x="300.20261" y="72.800629" dominant-baseline="auto" fill="#cd3431" stop-color="#000000" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="300.20261" y="72.800629" dominant-baseline="auto" fill="#cd3431" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJB</tspan></text>
</g>
<text x="162.71875" y="80.738129" dominant-baseline="auto" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="162.71875" y="80.738129" dominant-baseline="auto" fill="#2f83cc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J·</tspan></text>
<text x="165.03554" y="101.9048" dominant-baseline="auto" fill="#c7cf2f" stop-color="#000000" stroke-width=".26458" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="165.03554" y="101.9048" dominant-baseline="auto" fill="#c7cf2f" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·JB</tspan></text>
<text x="256.59927" y="78.0923" dominant-baseline="auto" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="256.59927" y="78.0923" dominant-baseline="auto" fill="#2f83cc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ·</tspan></text>
<g stroke-width=".26458">
<text x="256.59293" y="83.383965" dominant-baseline="auto" fill="#c7cf2f" stop-color="#000000" text-align="center" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="256.59293" y="83.383965" dominant-baseline="auto" fill="#c7cf2f" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="-inkscape-stroke:none;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJB</tspan></text>
<text x="289.66583" y="80.738129" dominant-baseline="auto" fill="#dcdcdc" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="289.66583" y="80.738129" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text x="289.67218" y="101.9048" dominant-baseline="auto" fill="#dcdcdc" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="289.67218" y="101.9048" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
</g>
</g>
<g stroke="#2f363f">
<path d="m256.51 68.792a2.5135 2.5135 0 0 1-1.2568 2.1768 2.5135 2.5135 0 0 1-2.5135 0 2.5135 2.5135 0 0 1-1.2568-2.1768" fill="#cd3431" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m167.1 90.232a2.3812 2.3812 0 0 1 0.9304-2.1919 2.3812 2.3812 0 0 1 2.3634-0.29019 2.3812 2.3812 0 0 1 1.433 1.9017" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<path d="m171.83 89.652a2.3812 2.3812 0 0 1-2.0732 2.6536 2.3812 2.3812 0 0 1-2.6536-2.0732" fill="#c7cf2f" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g fill="#dcdcdc">
<path d="m178.59 88.635 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m265.91 88.635 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m177.73 48.322 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m242.86 64.615 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m244.71 69.776-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m180.43 85.841-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

17
doc/snippets/line-cap-butt.svg

@ -0,0 +1,17 @@
<svg style="width: 275px; height: 50px;" viewBox="0 0 72.76 13.229" class="m-image">
<g transform="translate(-2.6458 -14.552)" fill="none" stroke="#747474" stroke-width=".26458">
<path d="m47.625 15.879h-42.303v10.576h42.303v-10.576" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m5.3219 21.167 42.303 5e-6" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-166.69 -112.45)" fill="none" stroke-linejoin="round">
<path transform="translate(1.0912e-6)" d="m169.33 124.35h42.333v-10.583h-42.333z" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path transform="translate(164.04 97.896)" d="m5.2917 26.458 42.333-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-width=".26458"/>
<path d="m169.34 124.35h42.323v-10.583h-42.323" stop-color="#000000" stroke="#2f83cc" stroke-linecap="round" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m231.45 113.77v10.583" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-2.6458 -14.552)" stroke="#2f363f" stroke-width=".26458">
<circle cx="67.438" cy="21.167" r="1.3532" fill="#747474" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="47.625" cy="21.136" r="1.3532" fill="#c7cf2f" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="5.2917" cy="21.167" r="1.3229" fill="#cd3431" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

35
doc/snippets/line-cap-round.svg

@ -0,0 +1,35 @@
<svg style="width: 275px; height: 50px;" viewBox="0 0 72.76 13.229" class="m-image">
<g transform="translate(-2.6458 -14.552)" fill="none" stroke="#747474" stroke-width=".26458">
<path d="m47.625 15.879h-42.303v10.576h42.303v-10.576" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m5.3219 21.167 42.303 5e-6" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-166.69 -112.45)" display="none" fill="none" stroke-linejoin="round">
<path transform="translate(164.04 97.896)" d="m5.2917 26.458 47.625-10.583" display="inline" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-width=".26458"/>
<g stroke-linecap="round">
<path d="m169.33 124.35h47.625v-10.583h-47.625z" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 113.77h42.333l5.2917 5.2917-5.2917 5.2917h-42.333" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m226.16 124.35h10.583v-10.583h-10.583z" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<path d="m226.22 124.35 10.583-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-width=".26458"/>
<path d="m231.45 113.77-5.2917 5.2917 5.2917 5.2917 5.2917-5.2917-5.2917-5.2917" stop-color="#000000" stroke="#2f83cc" stroke-linecap="round" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-166.69 -112.45)" fill="none">
<g stroke="#dcdcdc" stroke-linejoin="round" stroke-width=".26458">
<path transform="translate(164.04 97.896)" d="m5.2917 26.458 47.625-10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458"/>
<path transform="translate(1.0912e-6)" d="m226.22 124.35 10.583-10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458"/>
<path d="m169.33 124.35h47.625v-10.583h-47.625z" stop-color="#000000" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m226.16 124.35h10.583v-10.583h-10.583z" stop-color="#000000" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f83cc" stroke-width=".52916">
<path d="m211.67 113.77a5.2917 5.2917 0 0 1 5.2917 5.2917 5.2917 5.2917 0 0 1-5.2917 5.2917" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 113.77h42.333" stop-color="#000000" stroke-linecap="round" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 124.35h42.333" stop-color="#000000" stroke-linecap="round" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<circle cx="231.45" cy="119.06" r="5.2917" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g transform="translate(-2.6458 -14.552)" stroke="#2f363f" stroke-width=".26458">
<circle cx="67.438" cy="21.167" r="1.3532" fill="#747474" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="47.625" cy="21.136" r="1.3532" fill="#c7cf2f" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="5.2917" cy="21.167" r="1.3229" fill="#cd3431" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

21
doc/snippets/line-cap-square.svg

@ -0,0 +1,21 @@
<svg style="width: 275px; height: 50px;" viewBox="0 0 72.76 13.229" class="m-image">
<g transform="translate(-2.6458 -14.552)" fill="none" stroke="#747474" stroke-width=".26458">
<path d="m47.625 15.879h-42.303v10.576h42.303v-10.576" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m5.3219 21.167 42.303 5e-6" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-166.69 -112.45)" fill="none" stroke-linejoin="round">
<g stroke="#dcdcdc" stroke-width=".26458">
<path transform="translate(164.04 97.896)" d="m5.2917 26.458 47.625-10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458"/>
<path transform="translate(1.0912e-6)" d="m226.22 124.35 10.583-10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458"/>
<path d="m226.16 124.35h10.583v-10.583h-10.583z" stop-color="#000000" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 124.35h47.625v-10.583h-47.625z" stop-color="#000000" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<path d="m169.33 124.35h47.625v-10.583h-47.625" stop-color="#000000" stroke="#2f83cc" stroke-linecap="round" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m226.16 113.77h10.583v10.583h-10.583z" stop-color="#000000" stroke="#2f83cc" stroke-linecap="round" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-2.6458 -14.552)" stroke="#2f363f" stroke-width=".26458">
<circle cx="67.438" cy="21.167" r="1.3532" fill="#747474" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="47.625" cy="21.136" r="1.3532" fill="#c7cf2f" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="5.2917" cy="21.167" r="1.3229" fill="#cd3431" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

21
doc/snippets/line-cap-triangle.svg

@ -0,0 +1,21 @@
<svg style="width: 275px; height: 50px;" viewBox="0 0 72.76 13.229" class="m-image">
<g transform="translate(-2.6458 -14.552)" fill="none" stroke="#747474" stroke-width=".26458">
<path d="m47.625 15.879h-42.303v10.576h42.303v-10.576" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m5.3219 21.167 42.303 5e-6" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-166.69 -112.45)" fill="none" stroke-linejoin="round">
<path transform="translate(164.04 97.896)" d="m5.2917 26.458 47.625-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-width=".26458"/>
<g stroke-linecap="round">
<path d="m169.33 124.35h47.625v-10.583h-47.625z" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 113.77h42.333l5.2917 5.2917-5.2917 5.2917h-42.333" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m226.16 124.35h10.583v-10.583h-10.583z" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<path d="m226.22 124.35 10.583-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-width=".26458"/>
<path d="m231.45 113.77-5.2917 5.2917 5.2917 5.2917 5.2917-5.2917-5.2917-5.2917" stop-color="#000000" stroke="#2f83cc" stroke-linecap="round" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-2.6458 -14.552)" stroke="#2f363f" stroke-width=".26458">
<circle cx="67.438" cy="21.167" r="1.3532" fill="#747474" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="47.625" cy="21.136" r="1.3532" fill="#c7cf2f" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="5.2917" cy="21.167" r="1.3229" fill="#cd3431" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

29
doc/snippets/line-join-bevel.svg

@ -0,0 +1,29 @@
<svg style="width: 265px; height: 130px;" viewBox="0 0 70.115 34.396" class="m-image">
<g transform="translate(-1.3229 -35.719)" fill="none" stroke="#747474">
<path d="m44.979 47.625-42.333 10.583 2.6458 10.583 42.333-10.583-2.6458-10.583" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m47.625 47.625-2.6458 10.583-42.333-10.583 2.6458-10.583 42.333 10.583" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m3.9687 42.333 42.333 10.583-42.333 10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-165.36 -67.469)">
<g stroke-width=".26458">
<path d="m169.33 68.792-2.6458 10.583 21.167 5.2917-21.167 5.2917 2.6458 10.583 42.333-10.583v-10.583z" fill="none" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m211.67 79.375-23.812 5.2917 23.812 5.2917" fill="none" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" stroke-linejoin="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<text transform="translate(205.53 -9.6076)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(205.59 6.2674)" x="5.9676266" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="5.9676266" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
</g>
<g fill="none">
<path d="m169.33 100.54 18.521-15.875" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375h44.979" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 68.792 42.333 10.583v10.583l-42.333 10.583" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375 21.167 5.2917-21.167 5.2917" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g transform="translate(-1.3229 -35.719)">
<text transform="translate(-28.945 -33.42)" x="43.454727" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="43.454727" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<g stroke="#2f363f" stroke-width=".26458">
<circle cx="3.9688" cy="42.333" r="1.3229" fill="#3bd267" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="3.9687" cy="63.5" r="1.3229" fill="#a5c9ea" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="46.302" cy="52.917" r="1.3229" fill="#2f83cc" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

32
doc/snippets/line-join-miter.svg

@ -0,0 +1,32 @@
<svg style="width: 265px; height: 130px;" viewBox="0 0 70.115 34.396" class="m-image">
<g transform="translate(-1.3229 -35.719)" fill="none" stroke="#747474">
<path d="m44.979 47.625-42.333 10.583 2.6458 10.583 42.333-10.583-2.6458-10.583" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m47.625 47.625-2.6458 10.583-42.333-10.583 2.6458-10.583 42.333 10.583" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m3.9687 42.333 42.333 10.583-42.333 10.583" stop-color="#000000" stroke-dasharray="0.264583, 0.529165" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-165.36 -67.469)">
<text transform="translate(226.76 .97577)" x="5.9676266" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="5.9676266" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
<text transform="translate(226.7 -4.3159)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<g fill="none" stroke-linejoin="round" stroke-width=".26458">
<path d="m204.57 86.107a5.9531 5.9531 0 0 1 0-2.8804" stop-color="#000000" stroke="#747474" stroke-dasharray="0.264583, 0.529165" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m187.85 84.667h44.979" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 68.792 63.5 15.875-63.5 15.875-2.6458-10.583 21.167-5.2917-21.167-5.2917 2.6458-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-linecap="round" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<text transform="translate(210.2 .27516)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">l</tspan></text>
<text transform="translate(200.17 .61594)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">α</tspan></text>
<g fill="none">
<path d="m169.33 100.54 18.521-15.875" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375 66.146 5.2917" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.264583, 0.264583" stroke-dashoffset=".26458" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69 79.375 21.167 5.2917-21.167 5.2917" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33 68.792 63.5 15.875-63.5 15.875" stop-color="#000000" stroke="#2f83cc" stroke-width=".52916" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g transform="translate(-1.3229 -35.719)">
<text transform="translate(-28.945 -33.42)" x="43.454727" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="43.454727" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<g stroke="#2f363f" stroke-width=".26458">
<circle cx="3.9688" cy="42.333" r="1.3229" fill="#3bd267" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="3.9687" cy="63.5" r="1.3229" fill="#a5c9ea" stop-color="#000000" style="font-variation-settings:normal"/>
<circle cx="46.302" cy="52.917" r="1.3229" fill="#2f83cc" stop-color="#000000" style="font-variation-settings:normal"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.7 KiB

70
doc/snippets/line-quad-data-neighbor.svg

@ -0,0 +1,70 @@
<svg style="width: 465px; height: 105px;" viewBox="0 0 123.03 27.781" class="m-image">
<g transform="translate(-177.27 3.9688)" stroke="#2f363f" stroke-width=".26458">
<rect x="179.92" y="2.6458" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="189.18" y="5.2917" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc">
<rect x="198.44" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="207.7" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="220.93" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="230.19" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="239.45" y="2.6458" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="248.71" y="5.2917" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="261.94" y="2.6458" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="271.2" y="5.2917" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="280.46" y="2.6458" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="289.72" y="5.2917" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-15.875 1.3229)" stroke="#2f363f" stroke-width=".26458">
<rect transform="translate(-161.4 2.6458)" x="207.7" y="1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="220.93" y="10.583" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="230.19" y="13.229" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc">
<rect transform="translate(-161.4 2.6458)" x="179.92" y="10.583" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="189.18" y="13.229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="239.45" y="-1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="248.71" y="1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect transform="translate(-161.4 2.6458)" x="280.46" y="-1.3229" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="289.72" y="1.3229" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="261.94" y="10.583" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="271.2" y="13.229" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="198.44" y="-1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-15.875)" stroke-width=".26458">
<g stroke="#2f363f">
<rect transform="translate(-161.4 3.9688)" x="179.92" y="-1.3229" width="7.9375" height="2.6458" fill="#2d3236" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="220.93" y="-1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="230.19" y="1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="207.7" y="13.229" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="198.44" y="10.583" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#2d3236" stroke="#2f363f">
<rect transform="translate(-161.4 3.9688)" x="189.18" y="1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="239.45" y="10.583" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="248.71" y="13.229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="261.94" y="-1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="271.2" y="1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="280.46" y="10.583" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 3.9688)" x="289.72" y="13.229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" text-anchor="middle">
<text transform="translate(98.274 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(107.58 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(116.85 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(126.15 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(34.873 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(44.028 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
<text transform="translate(57.321 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<text transform="translate(66.543 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">D</tspan></text>
<text transform="translate(34.827 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ·</tspan></text>
<text transform="translate(44.134 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J·</tspan></text>
<text transform="translate(57.264 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJB</tspan></text>
<text transform="translate(66.571 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·JB</tspan></text>
<text transform="translate(16.253 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(25.56 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(85.144 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(75.837 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

34
doc/snippets/line-quad-data-other.svg

@ -0,0 +1,34 @@
<svg style="width: 465px; height: 85px;" viewBox="0 0 123.03 22.49" class="m-image">
<g transform="translate(-177.27 3.9688)" stroke="#2f363f" stroke-width=".26458">
<rect x="179.92" y="2.6458" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="189.18" y="5.2917" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc">
<rect x="198.44" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="207.7" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="220.93" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="230.19" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="239.45" y="2.6458" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="248.71" y="5.2917" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="261.94" y="2.6458" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="271.2" y="5.2917" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="280.46" y="2.6458" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="289.72" y="5.2917" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g transform="translate(-15.875 1.3229)" stroke="#2f363f" stroke-width=".26458">
<rect transform="translate(-161.4 2.6458)" x="207.7" y="1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="220.93" y="10.583" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="230.19" y="13.229" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc">
<rect transform="translate(-161.4 2.6458)" x="179.92" y="10.583" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="189.18" y="13.229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="239.45" y="-1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="248.71" y="1.3229" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect transform="translate(-161.4 2.6458)" x="280.46" y="-1.3229" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="289.72" y="1.3229" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="261.94" y="10.583" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="271.2" y="13.229" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect transform="translate(-161.4 2.6458)" x="198.44" y="-1.3229" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

107
doc/snippets/line-quad-data-overlap-fixedjoin.svg

@ -0,0 +1,107 @@
<svg style="width: 920px; height: 105px;" viewBox="0 0 243.42 27.781" class="m-image">
<g>
<rect x="55.563" y="6.6146" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="64.823" y="9.2604" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="74.083" y="7.9375" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="85.99" y="7.9375" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="97.87" y="7.9375" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="107.13" y="6.6146" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="116.39" y="9.2604" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="152.11" y="6.6146" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="161.37" y="9.2604" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="170.63" y="6.6146" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="179.89" y="9.2604" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#3bd267" stroke="#2f363f" stroke-width=".26458">
<rect x="74.083" y="3.9687" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="85.99" y="3.9687" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="97.87" y="3.9687" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#a5c9ea" stroke="#2f363f" stroke-width=".26458">
<rect x="74.083" y="15.875" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="85.99" y="15.875" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="97.87" y="15.875" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="55.563" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="64.823" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="107.13" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="116.39" y="5.2917" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="170.63" y="2.6458" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="179.89" y="5.2917" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="152.11" y="14.552" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="161.37" y="17.198" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(71.869 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ·</tspan></text>
<text transform="translate(83.821 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J?</tspan></text>
<text transform="translate(95.603 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJB</tspan></text>
<text transform="translate(53.295 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(62.602 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(114.22 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(104.92 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(149.84 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(159.15 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(168.42 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(177.72 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(71.915 -75.092)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(83.716 -75.092)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B/D</tspan></text>
<text transform="translate(95.66 -75.092)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
</g>
<g stroke="#2f363f">
<g fill="#747474">
<rect x="33.073" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="23.813" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="64.823" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="55.562" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="202.38" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="211.64" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="170.63" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="179.89" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="129.62" y="7.9375" width="7.9375" height="6.6146" fill="#a5c9ea" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="138.88" y="7.9375" width="7.9375" height="6.6146" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="193.12" y="7.9375" width="7.9375" height="6.6146" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="129.62" y="3.9687" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#cd3431" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="107.13" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="116.39" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="129.62" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="193.12" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#a5c9ea" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="138.88" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="152.11" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="161.37" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#c7cf2f" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="138.88" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="202.38" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="211.64" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="42.333" y="7.9375" width="7.9375" height="6.6146" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="42.333" y="15.875" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="33.073" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="23.812" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="220.9" y="3.9687" width="7.9375" height="2.6458" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="14.527" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#747474" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="230.19" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m243.42 6.6146-3.9688-1e-5v-2.6458l3.9688 1e-5" opacity=".25" stop-color="#000000"/>
<rect x="5.2917" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m5e-6 15.875h3.9687v2.6458h-3.9687" opacity=".25" stop-color="#000000"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

116
doc/snippets/line-quad-data-overlap-generic.svg

@ -0,0 +1,116 @@
<svg style="width: 920px; height: 105px;" viewBox="0 0 243.42 27.781" class="m-image">
<g>
<rect x="42.333" y="6.6146" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="51.594" y="9.2604" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="60.854" y="6.6146" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="70.115" y="9.2604" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="83.344" y="6.6146" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.604" y="9.2604" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="101.86" y="6.6146" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="111.12" y="9.2604" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="165.36" y="6.6146" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="174.63" y="9.2604" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="183.89" y="6.6146" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="193.15" y="9.2604" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#3bd267" stroke="#2f363f" stroke-width=".26458">
<rect x="60.854" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="70.115" y="5.2917" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="83.344" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.604" y="5.2917" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#a5c9ea" stroke="#2f363f" stroke-width=".26458">
<rect x="60.854" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="70.115" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="83.344" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.604" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="42.333" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="51.594" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="101.86" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="111.12" y="5.2917" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="183.89" y="2.6458" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="193.15" y="5.2917" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="165.36" y="14.552" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="174.62" y="17.198" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(58.639 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ·</tspan></text>
<text transform="translate(67.946 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J·</tspan></text>
<text transform="translate(81.076 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJB</tspan></text>
<text transform="translate(90.383 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·JB</tspan></text>
<text transform="translate(40.066 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(49.373 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(108.96 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(99.65 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(163.1 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(172.4 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(181.67 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(190.98 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(58.686 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(67.841 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
<text transform="translate(81.133 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<text transform="translate(90.356 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">D</tspan></text>
</g>
<g stroke="#2f363f">
<g fill="#747474">
<rect x="10.583" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="1.3229" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="51.594" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="42.333" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="224.9" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="234.16" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="183.89" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="193.15" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="124.35" y="7.9375" width="7.9375" height="6.6146" fill="#a5c9ea" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="133.61" y="7.9375" width="7.9375" height="6.6146" fill="#a5c9ea" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="142.88" y="7.9375" width="7.9375" height="6.6146" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="152.14" y="7.9375" width="7.9375" height="6.6146" fill="#cd3431" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="206.38" y="7.9375" width="7.9375" height="6.6146" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="215.64" y="7.9375" width="7.9375" height="6.6146" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="124.35" y="3.9688" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="133.61" y="3.9688" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#cd3431" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="101.86" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="111.12" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="124.35" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="133.61" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="206.37" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="215.64" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#a5c9ea" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="142.88" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="152.14" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="165.36" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="174.63" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#c7cf2f" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="142.88" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="152.14" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="224.9" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="234.16" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="29.104" y="7.9375" width="7.9375" height="6.6146" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="19.844" y="7.9375" width="7.9375" height="6.6146" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="29.104" y="15.875" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="19.844" y="15.875" width="7.9375" height="2.6458" fill="#2f83cc" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="10.583" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="1.3229" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 32 KiB

76
doc/snippets/line-quad-data-overlap-miterjoin.svg

@ -0,0 +1,76 @@
<svg style="width: 920px; height: 105px;" viewBox="0 0 243.42 27.781" class="m-image">
<g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="71.438" y="6.6146" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="80.698" y="9.2604" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.579" y="7.9375" width="7.9375" height="6.6146" fill="#2f83cc" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="101.86" y="7.9375" width="7.9375" height="6.6146" fill="#2f83cc" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="113.77" y="6.6146" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="123.03" y="9.2604" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="136.26" y="6.6146" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="145.52" y="9.2604" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="154.78" y="6.6146" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="164.04" y="9.2604" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.579" y="3.9687" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="101.86" y="3.9687" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="92.579" y="15.875" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="101.86" y="15.875" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="71.438" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="80.698" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="113.77" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="123.03" y="5.2916" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="154.78" y="2.6458" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="164.04" y="5.2916" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="136.26" y="14.552" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="145.52" y="17.198" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(120.86 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(161.87 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(90.411 -75.092)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A/C</tspan></text>
<text transform="translate(99.591 -75.092)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B/D</tspan></text>
<text transform="translate(90.364 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">UJ?</tspan></text>
<text transform="translate(99.696 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">·J?</tspan></text>
<text transform="translate(69.17 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(78.477 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(111.56 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(133.99 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(143.3 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(152.57 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
</g>
<g stroke="#2f363f">
<g fill="#747474">
<rect x="58.183" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="48.923" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="80.698" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="71.438" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="177.27" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="186.53" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="154.78" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="164.04" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="113.77" y="14.552" width="7.9375" height="2.6458" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="123.03" y="17.198" width="7.9375" height="2.6458" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="136.26" y="2.6458" width="7.9375" height="2.6458" fill="#a5c9ea" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="145.52" y="5.2917" width="7.9375" height="2.6458" fill="#a5c9ea" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="177.27" y="3.9687" width="7.9375" height="2.6458" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="186.53" y="3.9687" width="7.9375" height="2.6458" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="58.183" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="48.923" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#747474" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="195.79" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="205.05" y="3.9687" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="39.688" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="30.427" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

90
doc/snippets/line-quad-data-overlap-nojoin.svg

@ -0,0 +1,90 @@
<svg style="width: 920px; height: 105px;" viewBox="0 0 243.42 27.781" class="m-image">
<g>
<rect x="62.177" y="6.6146" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="71.438" y="9.2604" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" stroke="#2f363f" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="80.698" y="6.6146" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="89.958" y="9.2604" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="103.19" y="6.6146" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="112.45" y="9.2604" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="121.71" y="6.6146" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="130.97" y="9.2604" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="144.2" y="6.6146" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="153.46" y="9.2604" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="162.72" y="6.6146" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="171.98" y="9.2604" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="80.698" y="2.6458" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="89.958" y="5.2917" width="7.9375" height="2.6458" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="103.19" y="14.552" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="112.45" y="17.198" width="7.9375" height="2.6458" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#2f83cc" stroke="#2f363f" stroke-width=".26458">
<rect x="62.177" y="14.552" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="71.438" y="17.198" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="121.71" y="2.6458" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="130.97" y="5.2917" width="7.9375" height="2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke="#2f363f" stroke-width=".26458">
<rect x="162.72" y="2.6458" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="171.98" y="5.2917" width="7.9375" height="2.6458" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="144.2" y="14.552" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="153.46" y="17.198" width="7.9375" height="2.6458" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(78.483 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(87.79 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(100.92 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(110.23 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(59.909 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(69.216 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(128.8 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(119.49 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(141.93 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U·B</tspan></text>
<text transform="translate(151.24 -62.524)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">··B</tspan></text>
<text transform="translate(160.5 -62.55)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">U··</tspan></text>
<text transform="translate(169.81 -62.548)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">···</tspan></text>
<text transform="translate(78.53 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(87.684 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
<text transform="translate(100.98 -76.415)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<text transform="translate(110.2 -73.769)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">D</tspan></text>
</g>
<g stroke="#2f363f">
<g fill="#2f83cc" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="103.19" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="112.45" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="80.698" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="89.958" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="144.2" y="2.6458" width="7.9375" height="2.6458" fill="#a5c9ea" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="153.46" y="5.2917" width="7.9375" height="2.6458" fill="#a5c9ea" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#747474">
<rect x="48.948" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="39.688" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="71.438" y="5.2917" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="62.177" y="2.6458" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="185.21" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="194.47" y="7.9375" width="7.9375" height="6.6146" opacity=".25" stop-color="#000000" stroke-dasharray="0.264583, 0.264583" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="162.72" y="14.552" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="171.98" y="17.198" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g stroke-dasharray="0.264583, 0.264583" stroke-width=".26458">
<rect x="121.71" y="14.552" width="7.9375" height="2.6458" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="130.97" y="17.198" width="7.9375" height="2.6458" fill="#cd3431" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="185.21" y="3.9688" width="7.9375" height="2.6458" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="194.47" y="3.9688" width="7.9375" height="2.6458" fill="#c7cf2f" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="39.687" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="48.948" y="15.875" width="7.9375" height="2.6458" fill="#3bd267" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#747474" stroke-dasharray="0.264582, 0.264582" stroke-width=".26458">
<rect x="30.427" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="21.167" y="15.875" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="203.73" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="212.99" y="3.9688" width="7.9375" height="2.6458" opacity=".25" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB

18
doc/snippets/line-quad-data.svg

@ -0,0 +1,18 @@
<svg style="width: 465px; height: 55px;" viewBox="0 0 123.03 14.552" class="m-image">
<g transform="translate(-177.27)" stroke="#2f363f" stroke-width=".26458">
<rect x="179.92" y="2.6458" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="189.18" y="5.2917" width="7.9375" height="6.6146" fill="#3bd267" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#2f83cc">
<rect x="198.44" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="207.7" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="220.93" y="2.6458" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="230.19" y="5.2917" width="7.9375" height="6.6146" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<rect x="239.45" y="2.6458" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="248.71" y="5.2917" width="7.9375" height="6.6146" fill="#a5c9ea" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="261.94" y="2.6458" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="271.2" y="5.2917" width="7.9375" height="6.6146" fill="#cd3431" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="280.46" y="2.6458" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<rect x="289.72" y="5.2917" width="7.9375" height="6.6146" fill="#c7cf2f" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

40
doc/snippets/line-quad-expansion-joins-caps.svg

@ -0,0 +1,40 @@
<svg style="width: 450px; height: 150px;" viewBox="0 0 119.06 39.688" class="m-image">
<g transform="translate(-161.4 29.104)">
<g fill="none">
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m198.2-9.2604 22.238 5.2917v-10.583l-22.238 5.2917" stop-color="#000000" stroke="#dcdcdc" stroke-width=".25569" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m276.36-3.9688h-52.652v10.583h52.652v-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m228.86 1.3229 42.333 1e-6" stop-color="#000000" stroke="#747474" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#747474">
<path d="m176.47-19.805 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m264.58-1.8035e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m205.45-12.505 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m207.18-9.2214-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m178.98-2.1922-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m232.83-1.8053e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<path d="m166.69 7.9375 47.625-11.906-23.812-5.2917-26.458 6.6146z" fill="none" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m166.69-26.458 47.625 11.906-23.812 5.2917-26.458-6.6146z" fill="none" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(210.64 -102.21)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(210.64 -88.983)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<text transform="translate(184.32 -98.243)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
</g>
<g fill="none">
<path d="m170.66-19.844 42.333 10.583-42.333 10.583" stop-color="#000000" stroke="#747474" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g stroke="#dcdcdc" stroke-dasharray="0.255687, 0.511375" stroke-linejoin="round" stroke-width=".25569">
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m175.96 7.9375 22.238-17.198" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m173.49-15.875 46.947 1.3229" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m229.08 6.6146 49.418-10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<text transform="translate(184.32 -92.951)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">D</tspan></text>
</g>
<g stroke="#2f363f">
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="-19.844" r="2.6458" fill="#3bd267" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="212.99" cy="-9.2604" r="2.6458" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="1.3229" r="2.6458" fill="#a5c9ea" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="228.86" cy="1.3229" r="2.6458" fill="#cd3431" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="271.2" cy="1.3229" r="2.6458" fill="#c7cf2f" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

37
doc/snippets/line-quad-expansion-joins-miter-caps.svg

@ -0,0 +1,37 @@
<svg style="width: 450px; height: 150px;" viewBox="0 0 119.06 39.688" class="m-image">
<g transform="translate(-161.4 29.104)">
<path d="m276.36-3.9688h-52.652v10.583h52.652v-10.583" fill="none" stop-color="#000000" stroke="#dcdcdc" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m228.86 1.3229 42.333 1e-6" fill="none" stop-color="#000000" stroke="#747474" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="#747474">
<path d="m176.47-19.805 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m264.58-1.8035e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m205.45-12.505 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m207.18-9.2214-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m178.98-2.1922-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m232.83-1.8053e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stroke-width=".26458" text-anchor="middle">
<text transform="translate(229.34 -98.243)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">A</tspan></text>
<text transform="translate(229.3 -92.951)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">C</tspan></text>
<text transform="translate(184.32 -98.243)" x="6.13696" y="87.725258" dominant-baseline="auto" stop-color="#000000" text-align="center" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">B</tspan></text>
</g>
<g fill="none">
<path d="m170.66-19.844 42.333 10.583-42.333 10.583" stop-color="#000000" stroke="#747474" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m175.96 7.9375 22.238-17.198" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.255687, 0.511375" stroke-linejoin="round" stroke-width=".25569" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path transform="matrix(1.0708 0 0 1 -21.729 -8.5088e-7)" d="m229.08 6.6146 49.418-10.583" stop-color="#000000" stroke="#dcdcdc" stroke-dasharray="0.255687, 0.511375" stroke-linejoin="round" stroke-width=".25569" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<text transform="translate(184.32 -92.951)" x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal" xml:space="preserve"><tspan x="6.13696" y="87.725258" dominant-baseline="auto" fill="#dcdcdc" font-family="'Source Sans Pro'" font-size="4.2333px" stop-color="#000000" stroke-width=".26458" text-align="center" text-anchor="middle" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;line-height:1.25;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal">D</tspan></text>
<g fill="none" stroke="#dcdcdc">
<path d="m166.69-26.458 68.792 17.198h-44.979l-26.458-6.6146z" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m164.04-2.6458 26.458-6.6146h44.979l-68.792 17.198z" stop-color="#000000" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m164.04-15.875 70.115 6.6146" stop-color="#000000" stroke-dasharray="0.2645831,0.52916723" stroke-linejoin="round" stroke-width=".26458" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g stroke="#2f363f">
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="-19.844" r="2.6458" fill="#3bd267" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="212.99" cy="-9.2604" r="2.6458" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="1.3229" r="2.6458" fill="#a5c9ea" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="228.86" cy="1.3229" r="2.6458" fill="#cd3431" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="271.2" cy="1.3229" r="2.6458" fill="#c7cf2f" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

33
doc/snippets/line-quad-expansion.svg

@ -0,0 +1,33 @@
<svg style="width: 450px; height: 150px;" viewBox="0 0 119.06 39.688" class="m-image">
<g transform="translate(-161.4 29.104)">
<g fill="none" stroke-width=".26458">
<g stroke="#747474">
<path d="m271.2-3.9688h-42.333v10.583h42.333v-10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m211.67-14.552-42.333 10.583 2.6458 10.583 42.333-10.583-2.6458-10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m214.31-14.552-2.6458 10.583-42.333-10.583 2.6458-10.583 42.333 10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<path d="m170.66-19.844 42.333 10.583-42.333 10.583" stop-color="#000000" stroke="#dcdcdc" style="font-variation-settings:normal"/>
<path d="m228.86 1.3229 42.333 1e-6" stop-color="#000000" stroke="#dcdcdc" style="font-variation-settings:normal"/>
</g>
<path d="m176.47-19.805 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" fill="#dcdcdc" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m264.58-1.8035e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" fill="#dcdcdc" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<g fill="none" stroke="#747474" stroke-dasharray="0.264583, 0.529167" stroke-linejoin="round" stroke-width=".26458">
<path d="m171.98 6.6146 39.688-21.167" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m169.33-14.552h44.979" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m228.86 6.6146 42.333-10.583" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
<g fill="#dcdcdc">
<path d="m205.45-12.505 2.249 1.9216-2.8867 0.64627 0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m207.18-9.2214-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m178.98-2.1922-2.249 1.9216 2.8867 0.64627-0.63765-2.5678" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
<path d="m232.83-1.8053e-6 2.6458 1.3229-2.6458 1.3229v-2.6458" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/>
</g>
</g>
<g stroke="#2f363f">
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="-19.844" r="2.6458" fill="#3bd267" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="212.99" cy="-9.2604" r="2.6458" fill="#2f83cc" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="170.66" cy="1.3229" r="2.6458" fill="#a5c9ea" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="228.86" cy="1.3229" r="2.6458" fill="#cd3431" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
<circle transform="translate(-161.4 29.104)" cx="271.2" cy="1.3229" r="2.6458" fill="#c7cf2f" stop-color="#000000" stroke-width=".26458" style="font-variation-settings:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

13
src/Magnum/Shaders/CMakeLists.txt

@ -73,6 +73,19 @@ set(MagnumShaders_HEADERS
set(MagnumShaders_PRIVATE_HEADERS set(MagnumShaders_PRIVATE_HEADERS
Implementation/CreateCompatibilityShader.h) Implementation/CreateCompatibilityShader.h)
if(NOT MAGNUM_TARGET_GLES2)
list(APPEND MagnumShaders_GracefulAssert_SRCS
Line.cpp
LineGL.cpp)
list(APPEND MagnumShaders_HEADERS
Line.h
LineGL.h)
list(APPEND MagnumShaders_PRIVATE_HEADERS
Implementation/lineMiterLimit.h)
endif()
if(MAGNUM_BUILD_DEPRECATED) if(MAGNUM_BUILD_DEPRECATED)
list(APPEND MagnumShaders_HEADERS list(APPEND MagnumShaders_HEADERS
VertexColor.h) VertexColor.h)

55
src/Magnum/Shaders/Implementation/lineMiterLimit.h

@ -0,0 +1,55 @@
#ifndef Magnum_Shaders_Implementation_lineMiterLimit_h
#define Magnum_Shaders_Implementation_lineMiterLimit_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "Magnum/Math/Functions.h"
namespace Magnum { namespace Shaders { namespace Implementation {
inline Float lineMiterLengthLimit(const char* const name, const Float limit) {
#ifdef CORRADE_NO_ASSERT
static_cast<void>(name);
#endif
CORRADE_ASSERT(limit >= 1.0f && !Math::isInf(limit),
name << "expected a finite value greater than or equal to 1, got" << limit, {});
/* Calculate the half-angle from the length and return a cosine of it */
return Math::cos(2.0f*Math::asin(1.0f/limit));
}
inline Float lineMiterAngleLimit(const char* const name, const Rad limit) {
using namespace Math::Literals;
#ifdef CORRADE_NO_ASSERT
static_cast<void>(name);
#endif
CORRADE_ASSERT(limit > 0.0_radf && limit <= Rad{Constants::pi()},
name << "expected a value greater than 0° and less than or equal to 180°, got" << Float(Deg(limit)) << Debug::nospace << "°", {});
/* Return a cosine of the angle */
return Math::cos(limit);
}
}}}
#endif

76
src/Magnum/Shaders/Line.cpp

@ -0,0 +1,76 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "Line.h"
#include <Corrade/Containers/String.h>
#include "Magnum/Shaders/Implementation/lineMiterLimit.h"
namespace Magnum { namespace Shaders {
LineMaterialUniform& LineMaterialUniform::setMiterLengthLimit(const Float limit) {
miterLimit = Implementation::lineMiterLengthLimit("Shaders::LineMaterialUniform::setMiterLengthLimit():", limit);
return *this;
}
LineMaterialUniform& LineMaterialUniform::setMiterAngleLimit(const Rad limit) {
miterLimit = Implementation::lineMiterAngleLimit("Shaders::LineMaterialUniform::setMiterAngleLimit():", limit);
return *this;
}
Debug& operator<<(Debug& debug, const LineCapStyle value) {
debug << "Shaders::LineCapStyle" << Debug::nospace;
switch(value) {
/* LCOV_EXCL_START */
#define _c(v) case LineCapStyle::v: return debug << "::" #v;
_c(Butt)
_c(Square)
_c(Round)
_c(Triangle)
#undef _c
/* LCOV_EXCL_STOP */
}
return debug << "(" << Debug::nospace << reinterpret_cast<void*>(UnsignedByte(value)) << Debug::nospace << ")";
}
Debug& operator<<(Debug& debug, const LineJoinStyle value) {
debug << "Shaders::LineJoinStyle" << Debug::nospace;
switch(value) {
/* LCOV_EXCL_START */
#define _c(v) case LineJoinStyle::v: return debug << "::" #v;
_c(Miter)
_c(Bevel)
#undef _c
/* LCOV_EXCL_STOP */
}
return debug << "(" << Debug::nospace << reinterpret_cast<void*>(UnsignedByte(value)) << Debug::nospace << ")";
}
}}

257
src/Magnum/Shaders/Line.frag

@ -0,0 +1,257 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#if defined(OBJECT_ID) && !defined(GL_ES) && !defined(NEW_GLSL)
#extension GL_EXT_gpu_shader4: require
#endif
/* See the corresponding block in Line.vert for more information */
#ifndef GL_ES
#define CAN_USE_NOPERSPECTIVE
#elif defined(GL_ES) && defined(GL_NV_shader_noperspective_interpolation)
#extension GL_NV_shader_noperspective_interpolation: require
#define CAN_USE_NOPERSPECTIVE
#endif
#ifndef NEW_GLSL
#define fragmentColor gl_FragColor
#define in varying
#endif
#ifndef RUNTIME_CONST
#define const
#endif
/* Uniforms */
#ifndef UNIFORM_BUFFERS
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 2)
#endif
uniform lowp vec4 backgroundColor
#ifndef GL_ES
= vec4(0.0)
#endif
;
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 3)
#endif
uniform lowp vec4 color
#ifndef GL_ES
= vec4(1.0)
#endif
;
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 4)
#endif
uniform mediump float width
#ifndef GL_ES
= 1.0
#endif
;
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 5)
#endif
uniform mediump float smoothness
#ifndef GL_ES
= 0.0
#endif
;
#ifdef OBJECT_ID
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 7)
#endif
/* mediump is just 2^10, which might not be enough, this is 2^16 */
uniform highp uint objectId; /* defaults to zero */
#endif
/* Uniform buffers */
#else
#ifndef MULTI_DRAW
#if DRAW_COUNT > 1
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 1)
#endif
uniform highp uint drawOffset
#ifndef GL_ES
= 0u
#endif
;
#else
#define drawOffset 0u
#endif
#define drawId drawOffset
#endif
struct DrawUniform {
highp uvec4 materialIdReservedObjectIdReservedReserved;
#define draw_materialIdReserved materialIdReservedObjectIdReservedReserved.x
#define draw_objectId materialIdReservedObjectIdReservedReserved.y
};
layout(std140
#ifdef EXPLICIT_BINDING
, binding = 2
#endif
) uniform Draw {
DrawUniform draws[DRAW_COUNT];
};
struct MaterialUniform {
lowp vec4 backgroundColor;
lowp vec4 color;
highp vec4 widthSmoothnessMiterLimitReserved;
#define material_width widthSmoothnessMiterLimitReserved.x
#define material_smoothness widthSmoothnessMiterLimitReserved.y
#define material_miterLimit widthSmoothnessMiterLimitReserved.z
};
layout(std140
#ifdef EXPLICIT_BINDING
, binding = 3
#endif
) uniform Material {
MaterialUniform materials[MATERIAL_COUNT];
};
#endif
/* Inputs */
#ifdef CAN_USE_NOPERSPECTIVE
noperspective
#endif
in highp vec2 centerDistanceSigned;
in highp float halfSegmentLength;
#ifdef CAN_USE_NOPERSPECTIVE
noperspective
#endif
in highp float hasCap;
#ifdef VERTEX_COLOR
in lowp vec4 interpolatedVertexColor;
#endif
#ifdef INSTANCED_OBJECT_ID
flat in highp uint interpolatedInstanceObjectId;
#endif
#ifdef MULTI_DRAW
flat in highp uint drawId;
#endif
/* Outputs */
#ifdef NEW_GLSL
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = COLOR_OUTPUT_ATTRIBUTE_LOCATION)
#endif
out lowp vec4 fragmentColor;
#endif
#ifdef OBJECT_ID
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = OBJECT_ID_OUTPUT_ATTRIBUTE_LOCATION)
#endif
/* mediump is just 2^10, which might not be enough, this is 2^16 */
out highp uint fragmentObjectId;
#endif
void main() {
#ifdef UNIFORM_BUFFERS
#ifdef OBJECT_ID
highp const uint objectId = draws[drawId].draw_objectId;
#endif
#if MATERIAL_COUNT > 1
mediump const uint materialId = draws[drawId].draw_materialIdReserved & 0xffffu;
#else
#define materialId 0u
#endif
lowp const vec4 backgroundColor = materials[materialId].backgroundColor;
lowp const vec4 color = materials[materialId].color;
mediump const float width = materials[materialId].material_width;
mediump const float smoothness = materials[materialId].material_smoothness;
#endif
/* Calculate a distance from the original line endpoint (B). Assuming a cap
that's not a butt, actual quad vertices (2, 3 on the left diagram) would
be at a distance `width/2` in both X and Y (in the space of the line
segment, where X is in direction of the segment and Y is in direction to
the line edges):
----------2 --------2
| |
[0,0] B | [0,0] B
| |
----------3 --------3
For a butt cap, the endpoint B would be at the edge instead (right
diagram) -- to have handling consistent for all cap styles, add
`width/2` to the center distance in that case. For fragments on the left
of B the X distance would be negative, make it 0 in that case
instead. */
highp const vec2 centerDistance = abs(centerDistanceSigned);
highp vec2 endpointDistance = vec2(max(centerDistance.x
#ifdef CAP_STYLE_BUTT
+ width*0.5
#endif
- halfSegmentLength, 0.0), centerDistance.y);
/* If hasCap is negative, it means the nearest endpoint is a join, not a
cap. Thus no smoothing happens in the direction of a cap, i.e. same as
if we'd be at the center of the line. */
if(hasCap < 0.0) endpointDistance.x = 0.0;
/* Calculate a single distance factor out of the two-dimensional endpoint
distance. This will form the cap shape. */
#if defined(CAP_STYLE_BUTT) || defined(CAP_STYLE_SQUARE)
highp const float distance1D = max(endpointDistance.x, endpointDistance.y);
#elif defined(CAP_STYLE_ROUND)
highp const float distance1D = length(endpointDistance);
#elif defined(CAP_STYLE_TRIANGLE)
highp const float distance1D = endpointDistance.x + endpointDistance.y;
#else
#error
#endif
mediump const float factor = smoothstep(width*0.5 - smoothness, width*0.5 + smoothness, distance1D);
fragmentColor = mix(
#ifdef VERTEX_COLOR
interpolatedVertexColor*
#endif
color, backgroundColor, factor);
#ifdef OBJECT_ID
fragmentObjectId =
#ifdef INSTANCED_OBJECT_ID
interpolatedInstanceObjectId +
#endif
objectId;
#endif
}

472
src/Magnum/Shaders/Line.h

@ -0,0 +1,472 @@
#ifndef Magnum_Shaders_Line_h
#define Magnum_Shaders_Line_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
/** @file
* @brief Struct @ref Magnum::Shaders::LineDrawUniform, @ref Magnum::Shaders::LineMaterialUniform, enum @ref Magnum::Shaders::LineCapStyle, @ref Magnum::Shaders::LineJoinStyle, @ref Magnum::Shaders::LineVertexAnnotation, enum set @ref Magnum::Shaders::LineVertexAnnotations
* @m_since_latest
*/
#include <Corrade/Containers/EnumSet.h>
#include "Magnum/Magnum.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Shaders/visibility.h"
namespace Magnum { namespace Shaders {
/**
@brief Line cap style
@m_since_latest
@see @ref LineGL::capStyle(), @ref LineGL::Configuration::setCapStyle()
*/
enum class LineCapStyle: UnsignedByte {
/**
* [Butt cap](https://en.wikipedia.org/wiki/Butt_joint). The line is cut
* off right at the endpoint. Lines of zero length will be invisible.
*
* @htmlinclude line-cap-butt.svg
*/
Butt,
/**
* Square cap. The line is extended by half of its width past the endpoint.
* Lines of zero length will be shown as squares.
*
* @htmlinclude line-cap-square.svg
*/
Square,
/**
* Round cap. The line is extended by half of its width past the endpoint.
* It's still rendered as a quad but pixels outside of the half-circle have
* the background color. Lines of zero length will be shown as circles.
*
* @htmlinclude line-cap-round.svg
*
* @see @ref LineMaterialUniform::backgroundColor,
* @ref LineGL::setBackgroundColor()
*/
Round,
/**
* Triangle cap. The line is extended by half of its width past the
* endpoint. It's still rendered as a quad but pixels outside of the
* triangle have the background color. Lines of zero length will be shown
* as squares rotated by 45°.
*
* @htmlinclude line-cap-triangle.svg
*
* @see @ref LineMaterialUniform::backgroundColor,
* @ref LineGL::setBackgroundColor()
*/
Triangle
};
/**
@brief Line join style
@m_since_latest
@see @ref LineGL::joinStyle(), @ref LineGL::Configuration::setJoinStyle()
*/
enum class LineJoinStyle: UnsignedByte {
/**
* [Miter join](https://en.wikipedia.org/wiki/Miter_joint). The outer edges
* of both line segments extend until they intersect.
*
* @htmlinclude line-join-miter.svg
*
* In this style, the points `A`, `B` and `C` collapse to a zero-area
* triangle. If the miter length `l` would be larger than the limit set in
* @ref LineGL::setMiterLengthLimit() /
* @ref LineMaterialUniform::setMiterLengthLimit() or the angle between the
* two segments `α` would be less than the limit set in
* @ref LineGL::setMiterAngleLimit() /
* @ref LineMaterialUniform::setMiterAngleLimit(), it switches to
* @ref LineJoinStyle::Bevel instead.
*/
Miter,
/**
* [Bevel join](https://en.wikipedia.org/wiki/Bevel). Outer edges of both
* line segments are cut off at a right angle at their endpoints.
*
* @htmlinclude line-join-bevel.svg
*
* The area between points `A`, `B` and `C` is filled with an extra
* triangle.
*/
Bevel
};
/**
@brief Line vertex annotation
@m_since_latest
A line segment drawn by the @ref LineGL shader consists of four vertices, first
two having the @ref LineGL::Position attribute set to the first point of the
segment and second two having it set to the second point of the segment. In
order to distinguish the direction in which the point should be expanded to
form a quad and whether the expansion should be for a line join or line cap,
each vertex contains @ref LineVertexAnnotations in the @ref LineGL::Annotation
attribute.
@htmlinclude line-annotation.svg
In the above diagram, there's a line strip consisting of three line segments
and six pairs of points, with @m_span{m-label m-success} green @m_endspan and
@m_span{m-label m-default} white @m_endspan forming (square) line caps, while
@m_span{m-label m-primary} azure @m_endspan,
@m_span{m-label m-danger} red @m_endspan form a miter line join, and
@m_span{m-label m-info} blue @m_endspan and
@m_span{m-label m-warning} yellow @m_endspan form a bevel join. The
twelve corresponding annotations, forming three quads (and one extra triangle
for the bevel), are shown with `U`, `J` and `B` letters, color-coded to show
which original line point they correspond to. Line cap style and join style
isn't a part of the annotation, it's set with @ref LineCapStyle and
@ref LineJoinStyle at shader compilation time instead.
The type is 32-bit in order to match the default type of the
@ref LineGL::Annotation attribute, but the values are guaranteed to fit into 8
bits.
*/
enum class LineVertexAnnotation: UnsignedInt {
/**
* The point extends upwards assuming a left-to-right direction of the line
* segment. If not set, it extends downwards. Visualized as `U` in the
* above diagram.
*/
Up = 1 << 0,
/**
* The point is forming a join with a neighboring line segment defined by
* either @ref LineGL::PreviousPosition or @ref LineGL::NextPosition based
* on whether @ref LineVertexAnnotation::Begin is set. If not set, the
* point is forming a line cap, extending in the opposite of the line
* segment direction if @ref LineVertexAnnotation::Begin is set, and in the
* direction if not set. Visualized as `J` in the above diagram.
*/
Join = 1 << 1,
/**
* The point is forming the beginning of the line segment, i.e.
* @ref LineGL::NextPosition contains the other point of the line segment.
* If not set, @ref LineGL::PreviousPosition contains the other point of
* the line segment instead.
*
* If @ref LineVertexAnnotation::Join is set as well, the point is a common
* point of two neighboring line segments and @ref LineGL::PreviousPosition
* contains the other point of the neighboring line segment. If
* @ref LineVertexAnnotation::Join is set and this bit is not set,
* @ref LineGL::NextPosition contaons the other point of the neighboring
* line segment instead. Visualized as `B` in the above diagram.
*/
Begin = 1 << 2,
};
/**
@brief Line vertex annotations
@m_since_latest
Contents of the @ref LineGL::Annotation attribute. See
@ref LineVertexAnnotation for more information.
*/
typedef Containers::EnumSet<LineVertexAnnotation> LineVertexAnnotations;
CORRADE_ENUMSET_OPERATORS(LineVertexAnnotations)
/**
* @debugoperatorenum{LineCapStyle}
* @m_since_latest
*/
MAGNUM_SHADERS_EXPORT Debug& operator<<(Debug& debug, LineCapStyle value);
/**
* @debugoperatorenum{LineJoinStyle}
* @m_since_latest
*/
MAGNUM_SHADERS_EXPORT Debug& operator<<(Debug& debug, LineJoinStyle value);
/**
@brief Per-draw uniform for line shaders
@m_since_latest
Together with the generic @ref TransformationProjectionUniform2D /
@ref TransformationProjectionUniform3D contains parameters that are specific to
each draw call. Material-related properties are expected to be shared among multiple draw calls and thus are provided in a separate
@ref LineMaterialUniform structure, referenced by @ref materialId.
@see @ref LineGL::bindDrawBuffer()
*/
struct LineDrawUniform {
/** @brief Construct with default parameters */
constexpr explicit LineDrawUniform(DefaultInitT = DefaultInit) noexcept: materialId{0}, objectId{0} {}
/** @brief Construct without initializing the contents */
explicit LineDrawUniform(NoInitT) noexcept {}
/** @{
* @name Convenience setters
*
* Provided to allow the use of method chaining for populating a structure
* in a single expression, otherwise equivalent to accessing the fields
* directly. Also guaranteed to provide backwards compatibility when
* packing of the actual fields changes.
*/
/**
* @brief Set the @ref materialId field
* @return Reference to self (for method chaining)
*/
LineDrawUniform& setMaterialId(UnsignedInt id) {
materialId = id;
return *this;
}
/**
* @brief Set the @ref objectId field
* @return Reference to self (for method chaining)
*/
LineDrawUniform& setObjectId(UnsignedInt id) {
objectId = id;
return *this;
}
/**
* @}
*/
/** @var materialId
* @brief Material ID
*
* References a particular material from a @ref LineMaterialUniform array.
* Useful when an UBO with more than one material is supplied or in a
* multi-draw scenario. Should be less than the material count passed to
* @ref LineGL::Configuration::setMaterialCount(), if material count is
* @cpp 1 @ce, this field is assumed to be @cpp 0 @ce and isn't even read
* by the shader. Default value is @cpp 0 @ce, meaning the first material
* gets used.
*/
/* This field is an UnsignedInt in the shader and materialId is extracted
as (value & 0xffff), so the order has to be different on BE */
#ifndef CORRADE_TARGET_BIG_ENDIAN
alignas(4) UnsignedShort materialId;
/* warning: Member __pad0__ is not documented. FFS DOXYGEN WHY DO YOU THINK
I MADE THOSE UNNAMED, YOU DUMB FOOL */
#ifndef DOXYGEN_GENERATING_OUTPUT
UnsignedShort:16; /* reserved */
#endif
#else
alignas(4) UnsignedShort:16; /* reserved */
UnsignedShort materialId;
#endif
/**
* @brief Object ID
*
* Used only for the object ID framebuffer output, not to access any other
* uniform data. Default value is @cpp 0 @ce.
*
* Used only if @ref LineGL::Flag::ObjectId is enabled, ignored otherwise.
* If @ref LineGL::Flag::InstancedObjectId is enabled as well, this value
* is added to the ID coming from the @ref LineGL::ObjectId attribute.
* @see @ref LineGL::setObjectId()
*/
UnsignedInt objectId;
/* warning: Member __pad1__ is not documented. FFS DOXYGEN WHY DO YOU THINK
I MADE THOSE UNNAMED, YOU DUMB FOOL */
#ifndef DOXYGEN_GENERATING_OUTPUT
Int:32;
Int:32;
#endif
};
/**
@brief Material uniform for line shaders
@m_since_latest
Describes material properties referenced from
@ref LineDrawUniform::materialId.
@see @ref LineGL::bindMaterialBuffer()
*/
struct MAGNUM_SHADERS_EXPORT LineMaterialUniform {
/** @brief Construct with default parameters */
constexpr explicit LineMaterialUniform(DefaultInitT = DefaultInit) noexcept: backgroundColor{0.0f, 0.0f, 0.0f, 0.0f}, color{1.0f, 1.0f, 1.0f, 1.0f}, width{1.0f}, smoothness{0.0f}, miterLimit{0.875f} {}
/** @brief Construct without initializing the contents */
explicit LineMaterialUniform(NoInitT) noexcept: color{NoInit} {}
/** @{
* @name Convenience setters
*
* Provided to allow the use of method chaining for populating a structure
* in a single expression, otherwise equivalent to accessing the fields
* directly. Also guaranteed to provide backwards compatibility when
* packing of the actual fields changes.
*/
/**
* @brief Set the @ref color field
* @return Reference to self (for method chaining)
*/
LineMaterialUniform& setColor(const Color4& color) {
this->color = color;
return *this;
}
/**
* @brief Set the @ref backgroundColor field
* @return Reference to self (for method chaining)
*/
LineMaterialUniform& setBackgroundColor(const Color4& color) {
backgroundColor = color;
return *this;
}
/**
* @brief Set the @ref width field
* @return Reference to self (for method chaining)
*/
LineMaterialUniform& setWidth(Float width) {
this->width = width;
return *this;
}
/**
* @brief Set the @ref smoothness field
* @return Reference to self (for method chaining)
*/
LineMaterialUniform& setSmoothness(Float smoothness) {
this->smoothness = smoothness;
return *this;
}
/**
* @brief Set the @ref miterLimit field to a length value
* @return Reference to self (for method chaining)
*
* Expects that @p limit is greater than or equal to @cpp 1.0f @ce and
* finite.
*/
LineMaterialUniform& setMiterLengthLimit(Float limit);
/**
* @brief Set the @ref miterLimit field to an angle value
* @return Reference to self (for method chaining)
*
* Expects that @p limit is greater than @cpp 0.0_radf @ce.
*/
LineMaterialUniform& setMiterAngleLimit(Rad limit);
/**
* @}
*/
/**
* @brief Background color
*
* Default value is @cpp 0x00000000_rgbaf @ce. Used for edge smoothing if
* smoothness is non-zero, and for background areas if
* @ref LineCapStyle::Round or @ref LineCapStyle::Triangle is used. If
* smoothness is zero and @ref LineCapStyle::Butt or
* @ref LineCapStyle::Square is used, only the foreground color is used.
* @see @ref LineGL::setBackgroundColor(), @ref LineGL::setSmoothness(),
* @ref LineGL::Configuration::setCapStyle()
*/
Color4 backgroundColor;
/**
* @brief Color
*
* Default value is @cpp 0xffffffff_rgbaf @ce.
*
* If @ref LineGL::Flag::VertexColor is enabled, the color is multiplied
* with a color coming from the @ref LineGL::Color3 / @ref LineGL::Color4
* attribute.
* @see @ref LineGL::setColor()
*/
Color4 color;
/**
* @brief Line width
*
* Screen-space, interpreted depending on the viewport size --- i.e., a
* value of @cpp 1.0f @ce is one pixel only if @ref LineGL::setViewportSize()
* is called with the actual pixel size of the viewport. Default value is
* @cpp 1.0f @ce.
* @see @ref LineGL::setWidth()
*/
Float width;
/**
* @brief Line smoothness
*
* Larger values will make edges look less aliased (but blurry), smaller
* values will make them more crisp (but possibly aliased). Screen-space,
* interpreted depending on the viewport size --- i.e., a value of
* @cpp 1.0f @ce is one pixel only if @ref LineGL::setViewportSize() is
* called with the actual pixel size of the viewport. Initial value is
* @cpp 0.0f @ce.
* @see @ref LineGL::setSmoothness()
*/
Float smoothness;
/**
* @brief Miter limit
*
* Limit at which a @ref LineJoinStyle::Miter join is converted to a
* @ref LineJoinStyle::Bevel in order to avoid sharp corners extending too
* much. If joint style is not @ref LineJoinStyle::Miter, this value is
* unused.
*
* Represented as a cosine of the angle between two neighboring line
* segments, with @ref LineJoinStyle::Bevel used for angles below the limit
* (thus their cosine larger than this value). For length-based limits,
* the relation between angle @f$ \theta @f$, miter length @f$ l @f$ and
* line half-width @f$ w @f$ is as follows: @f[
* \frac{w}{l} = \sin(\frac{\theta}{2})
* @f]
*
* For convenience it's recommended to use the @ref setMiterLengthLimit()
* and @ref setMiterAngleLimit() helpers instead of setting this value
* directly.
* @see @ref LineGL::setMiterLengthLimit(),
* @ref LineGL::setMiterAngleLimit()
*/
Float miterLimit;
/* warning: Member __pad0__ is not documented. FFS DOXYGEN WHY DO YOU THINK
I MADE THOSE UNNAMED, YOU DUMB FOOL */
#ifndef DOXYGEN_GENERATING_OUTPUT
Int:32; /* reserved for dynamic cap/join style */
#endif
};
}}
#endif

666
src/Magnum/Shaders/Line.vert

@ -0,0 +1,666 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#if !defined(GL_ES) && !defined(NEW_GLSL)
#extension GL_EXT_gpu_shader4: require
#endif
#if defined(UNIFORM_BUFFERS) && defined(TEXTURE_ARRAYS) && !defined(GL_ES)
#extension GL_ARB_shader_bit_encoding: require
#endif
/* Use the noperspective keyword to avoid artifacts in screen-space
interpolation if perspective projection is used in 3D. If not available,
it's worked around by dividing gl_Position with gl_Position.w (which is
extra instructions, so the noperspective keyword is preferred). */
#ifndef GL_ES
#define CAN_USE_NOPERSPECTIVE
#elif defined(GL_ES) && defined(GL_NV_shader_noperspective_interpolation)
#extension GL_NV_shader_noperspective_interpolation: require
#define CAN_USE_NOPERSPECTIVE
#endif
#ifdef MULTI_DRAW
#ifndef GL_ES
#extension GL_ARB_shader_draw_parameters: require
#else /* covers WebGL as well */
#extension GL_ANGLE_multi_draw: require
#endif
#endif
#ifndef NEW_GLSL
#define in attribute
#define out varying
#endif
#ifndef RUNTIME_CONST
#define const
#endif
/* Uniforms */
/* This one is for both classic and UBOs, as it's usually set globally instead
of changing per-draw */
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 0)
#endif
uniform lowp vec2 viewportSize; /* defaults to zero */
#ifndef UNIFORM_BUFFERS
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 1)
#endif
#ifdef TWO_DIMENSIONS
uniform highp mat3 transformationProjectionMatrix
#ifndef GL_ES
= mat3(1.0)
#endif
;
#elif defined(THREE_DIMENSIONS)
uniform highp mat4 transformationProjectionMatrix
#ifndef GL_ES
= mat4(1.0)
#endif
;
#else
#error
#endif
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 4)
#endif
uniform mediump float width
#ifndef GL_ES
= 1.0
#endif
;
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 5)
#endif
uniform mediump float smoothness
#ifndef GL_ES
= 0.0
#endif
;
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 6)
#endif
uniform mediump float miterLimit
#ifndef GL_ES
/* cos(2*asin(1.0/4.0)), with 4 being the documented length limit */
= 0.875
#endif
;
/* Uniform buffers */
#else
#if DRAW_COUNT > 1
#ifdef EXPLICIT_UNIFORM_LOCATION
layout(location = 1)
#endif
uniform highp uint drawOffset
#ifndef GL_ES
= 0u
#endif
;
#else
#define drawOffset 0u
#endif
layout(std140
#ifdef EXPLICIT_BINDING
, binding = 1
#endif
) uniform TransformationProjection {
highp
#ifdef TWO_DIMENSIONS
/* Can't be a mat3 because of ANGLE, see DrawUniform in Phong.vert for
details */
mat3x4
#elif defined(THREE_DIMENSIONS)
mat4
#else
#error
#endif
transformationProjectionMatrices[DRAW_COUNT];
};
struct DrawUniform {
highp uvec4 materialIdReservedObjectIdReservedReserved;
#define draw_materialIdReserved materialIdReservedObjectIdReservedReserved.x
#define draw_objectId materialIdReservedObjectIdReservedReserved.y
};
layout(std140
#ifdef EXPLICIT_BINDING
, binding = 2
#endif
) uniform Draw {
DrawUniform draws[DRAW_COUNT];
};
struct MaterialUniform {
lowp vec4 backgroundColor;
lowp vec4 color;
highp vec4 widthSmoothnessMiterLimitReserved;
#define material_width widthSmoothnessMiterLimitReserved.x
#define material_smoothness widthSmoothnessMiterLimitReserved.y
#define material_miterLimit widthSmoothnessMiterLimitReserved.z
};
layout(std140
#ifdef EXPLICIT_BINDING
, binding = 3
#endif
) uniform Material {
MaterialUniform materials[MATERIAL_COUNT];
};
#endif
/* Inputs */
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = POSITION_ATTRIBUTE_LOCATION)
#endif
#ifdef TWO_DIMENSIONS
in highp vec2 position;
#elif defined(THREE_DIMENSIONS)
/* Last component is reserved for line distance */
in highp vec3 position;
#else
#error
#endif
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = LINE_PREVIOUS_POSITION_ATTRIBUTE_LOCATION)
#endif
#ifdef TWO_DIMENSIONS
in highp vec2 previousPosition;
#elif defined(THREE_DIMENSIONS)
in highp vec3 previousPosition;
#else
#error
#endif
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = LINE_NEXT_POSITION_ATTRIBUTE_LOCATION)
#endif
#ifdef TWO_DIMENSIONS
in highp vec2 nextPosition;
#elif defined(THREE_DIMENSIONS)
in highp vec3 nextPosition;
#else
#error
#endif
/* Point annotation, matching the LineVertexAnnotation enum bits */
#define ANNOTATION_UP_MASK 1u
#define ANNOTATION_JOIN_MASK 2u
#define ANNOTATION_BEGIN_MASK 4u
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = LINE_ANNOTATION_ATTRIBUTE_LOCATION)
#endif
in lowp uint annotation;
#ifdef VERTEX_COLOR
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = COLOR_ATTRIBUTE_LOCATION)
#endif
in lowp vec4 vertexColor;
#endif
#ifdef INSTANCED_OBJECT_ID
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = OBJECT_ID_ATTRIBUTE_LOCATION)
#endif
in highp uint instanceObjectId;
#endif
#ifdef INSTANCED_TRANSFORMATION
#ifdef EXPLICIT_ATTRIB_LOCATION
layout(location = TRANSFORMATION_MATRIX_ATTRIBUTE_LOCATION)
#endif
#ifdef TWO_DIMENSIONS
in highp mat3 instancedTransformationMatrix;
#elif defined(THREE_DIMENSIONS)
in highp mat4 instancedTransformationMatrix;
#else
#error
#endif
#endif
/* Outputs */
#ifdef CAN_USE_NOPERSPECTIVE
noperspective
#endif
out highp vec2 centerDistanceSigned;
out highp float halfSegmentLength;
#ifdef CAN_USE_NOPERSPECTIVE
noperspective
#endif
out highp float hasCap;
#ifdef VERTEX_COLOR
out lowp vec4 interpolatedVertexColor;
#endif
#ifdef INSTANCED_OBJECT_ID
flat out highp uint interpolatedInstanceObjectId;
#endif
#ifdef MULTI_DRAW
flat out highp uint drawId;
#endif
/* Same as Math::Vector2::perpendicular() */
vec2 perpendicular(vec2 a) {
return vec2(-a.y, a.x);
}
void main() {
#ifdef UNIFORM_BUFFERS
#ifdef MULTI_DRAW
drawId = drawOffset + uint(
#ifndef GL_ES
gl_DrawIDARB /* Using GL_ARB_shader_draw_parameters, not GLSL 4.6 */
#else
gl_DrawID
#endif
);
#else
#define drawId drawOffset
#endif
#ifdef TWO_DIMENSIONS
highp const mat3 transformationProjectionMatrix = mat3(transformationProjectionMatrices[drawId]);
#elif defined(THREE_DIMENSIONS)
highp const mat4 transformationProjectionMatrix = transformationProjectionMatrices[drawId];
#else
#error
#endif
#if MATERIAL_COUNT > 1
mediump const uint materialId = draws[drawId].draw_materialIdReserved & 0xffffu;
#else
#define materialId 0u
#endif
mediump const float width = materials[materialId].material_width;
mediump const float smoothness = materials[materialId].material_smoothness;
highp const float miterLimit = materials[materialId].material_miterLimit;
#endif
#ifdef TWO_DIMENSIONS
highp const vec2 transformedPosition = (transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec3(position, 1.0)).xy;
highp const vec2 transformedPreviousPosition = (transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec3(previousPosition, 1.0)).xy;
highp const vec2 transformedNextPosition = (transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec3(nextPosition, 1.0)).xy;
#elif defined(THREE_DIMENSIONS)
highp const vec4 transformedPosition4 = transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec4(position, 1.0);
highp const vec2 transformedPosition = transformedPosition4.xy/transformedPosition4.w;
highp const vec4 transformedPreviousPosition4 = transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec4(previousPosition, 1.0);
highp const vec2 transformedPreviousPosition = transformedPreviousPosition4.xy/transformedPreviousPosition4.w;
highp const vec4 transformedNextPosition4 = transformationProjectionMatrix*
#ifdef INSTANCED_TRANSFORMATION
instancedTransformationMatrix*
#endif
vec4(nextPosition, 1.0);
highp const vec2 transformedNextPosition = transformedNextPosition4.xy/transformedNextPosition4.w;
#else
#error
#endif
/* Decide about the line direction vector `d` and edge direction vector `e`
from the `pointMarkerComponent` input. Quad corners 0 and 1 come from
segment endpoint A, are marked with the POINT_MARKER_BEGIN_MASK bit and
so their line direction is taken from `nextPosition`, quad corners 2 and
3 come from B and are *not* marked with POINT_MARKER_BEGIN_MASK and so
their line direction is taken from `previousPosition`, with the
direction being always from point A to point B. The edge direction is
then perpendicular to the line direction, with points 0 and 2 marked
with POINT_MARKER_UP_MASK using it directly, while points 1 and 3
don't have POINT_MARKER_UP_MASK and have to negate it:
^ ^
e e
| |
[UP, BEGIN] 0-d--> 2-d--> [UP]
A B
[BEGIN] 1-d--> 3-d--> []
| |
e e
v v
The POINT_MARKER_CAP_MASK is then used below. */
highp const vec2 lineDirection = bool(annotation & ANNOTATION_BEGIN_MASK) ?
transformedNextPosition - transformedPosition :
transformedPosition - transformedPreviousPosition;
mediump const float edgeSign = bool(annotation & ANNOTATION_UP_MASK) ? 1.0 : -1.0;
mediump const float neighborSign = bool(annotation & ANNOTATION_BEGIN_MASK) ? -1.0 : 1.0;
/* Line direction and its length converted from the [-1, 1] unit square to
the screen space so we properly take aspect ratio into account. In the
end it undoes the transformation by multiplying by 2.0/viewportSize
again. */
highp const vec2 screenspaceLineDirection = lineDirection*viewportSize/2.0;
highp const float screenspaceLineDirectionLength = length(screenspaceLineDirection);
/* Normalized screenspace line and edge direction. In case of zero-sized
lines (i.e., points) the X axis is picked as line direction instead, and
thus Y axis for edge direction. */
highp const vec2 screenspaceLineDirectionNormalized = screenspaceLineDirectionLength == 0.0 ? vec2(1.0, 0.0) : screenspaceLineDirection/screenspaceLineDirectionLength;
highp const vec2 screenspaceEdgeDirectionNormalized = perpendicular(screenspaceLineDirectionNormalized);
/* Line width includes also twice the smoothness (because it's a radius
instead of a diameter, and is on both sides of the line), and is rounded
to whole pixels. So for the edge distance we need half of it. */
mediump const float edgeDistance = ceil(width + 2.0*smoothness)*0.5;
#ifdef CAP_STYLE_BUTT
mediump const float capDistance = ceil(2.0*smoothness)*0.5;
#elif defined(CAP_STYLE_SQUARE) || defined(CAP_STYLE_ROUND) || defined(CAP_STYLE_TRIANGLE)
mediump const float capDistance = edgeDistance;
#else
#error
#endif
/* Line segment half-length, passed to the fragment shader. Same for all
four points. */
halfSegmentLength = screenspaceLineDirectionLength*0.5;
/* Calculate the actual endpoint parameters depending on whether we're at a
line cap, line join bevel, line join miter etc.
- `screenspacePointDirection` contains screenspace direction from
`transformedPosition` to the actual point. After undoing the
screenspace projection the sum of the two is written to
gl_Position.
- `centerDistanceSigned` contains signed distance from the edge to
center, passed to the fragment shader. It's chosen in a way that
interpolates to zero in the quad center, and the area where
`all(abs(centerDistanceSigned) <= vec2(halfSegmentLength +
capDistance, edgeDistance))` is inside the line.
- `hasCap` contains `abs(centerDistanceSigned.x)` with a sign
positive if the point is a cap and negative if it isn't. Given
segment endpoints A and B (and quad points 0/1 and 2/3
corresponding to these), the following cases can happen:
- if both have a cap, it's a negative value in both, thus has a
constant negative value in the fragment shader
- if neither have a cap, it's a positive value in both, thus has
a constant positive value in the fragment shader
- if one has a cap and the other not, it's a negative value in
one and positive in the other, interpolating to zero in the
quad center
In the fragment shader, `abs(centerDistanceSigned)` and `sign(hasCap)`
is then used to perform cap rendering and antialiasing. For example,
with a standalone line segment that has square caps on both ends, the
value of `centerDistanceSigned` is like in the following diagram, with
`d` being `halfSegmentLength`, `w` being `edgeDistance`, `c` being
`capDistance`, and an extra margin for `smoothness` indicated by `s` and
the double border:
[-d-c-s,+w+s] [+d+c+s,+w+s]
0-----------------------------2
[-d-c,+w]------------------[+d+c,+w]
| | | | hasCap[0] = hasCap[1] = +d+c+s
[-d-c,0] [0,0] [+d+c,0]
| | | | hasCap[2] = hasCap[3] = +d+c+s
[-d-c,-w]------------------[+d+c,-w]
1-----------------------------3
[-d-c-s,-w-s] [+d+c+s,-w+s]
With a cap only on the left side, `centerDistanceSigned` would be like
this. Note the absence of a smoothness margin on the right side:
[-d-c-s,+w+s] [+d,+w+s]
0---------------------------2
[-d-c,+w]-------------------[+d,+w]
| | | hasCap[0] = hasCap[1] = +d+c+s
[-d-c,0] [0,0] [+d,0]
| | | hasCap[2] = hasCap[3] = -d
[-d-c,-w]-------------------[+d,-w]
1---------------------------3
[-d-c-s,-w-s] [+d,-w-s]
*/
centerDistanceSigned =
/* The the Y coordinate is same for all cases, X coordinate gets
further adjusted below */
vec2(halfSegmentLength*neighborSign, edgeDistance*edgeSign);
highp vec2 screenspacePointDirection;
/* Line join */
if(bool(annotation & ANNOTATION_JOIN_MASK)) {
/* Neighbor direction `nd`, needed to distinguish whether this is the
inner or outer join point. Calculated with basically an inverse of
the logic used to calculate `lineDirection`, with the neighbor
direction always pointing from the A/B endpoint to the other
neighbor line endpoint:
<--nd-0 [BEGIN] [END] 2-nd-->
A B
<--nd-1 [BEGIN] [END] 3-nd--> */
highp const vec2 neighborDirection = bool(annotation & ANNOTATION_BEGIN_MASK) ?
transformedPreviousPosition - transformedPosition :
transformedNextPosition - transformedPosition;
/* Screenspace neighbor direction and its length, calculated
equivalently to screenspace line direction above */
highp const vec2 screenspaceNeighborDirectionNormalized = normalize(neighborDirection*viewportSize/2.0);
/* If the edge direction vector `e` and the neighbor direction vector
`nd` point to the opposite direction (i.e., their dot product is
negative), this is an outer point of the line and a candidate for
a bevel.
^
e
|
-d->-2
|\
B | nd
| \
-----3 v
If a miter join is used instead of a bevel, the point is beveled
only if the line direction `d` and neighbor direction `nd` is
sharper than a limit (i.e., their dot product, or a cosine of their
angle, is between `[-1, -miterLimit]`). */
const bool outerBeveledPoint =
dot(screenspaceEdgeDirectionNormalized*edgeSign, screenspaceNeighborDirectionNormalized) < 0.0
#if defined(JOIN_STYLE_MITER)
&& dot(screenspaceLineDirectionNormalized*neighborSign, screenspaceNeighborDirectionNormalized) < -miterLimit
#elif !defined(JOIN_STYLE_BEVEL)
#error
#endif
;
/* Outer point of a beveled join -- although
https://www.w3.org/TR/svg-strokes/#LineJoin doesn't define *what
exactly* is a bevel, it's defined as "Cuts the outside edge off
where a circle the diameter of the stroke intersects the stroke." at
e.g. https://apike.ca/prog_svg_line_cap_join.html.
0--- ----2a
| |^\
| | e -_
| | |ρ \
A-- ----|--B-e->2b
| | | _-|
| | _- |
| | _- | |
1-- --3 | |
| | |
C
Which ultimately means the `2a` and `2b` quad endpoints are simply
the edge direction vector `e` away from point B, in one case with
the `e` calculated from the AB segment, and in the other from the BC
segment. */
if(outerBeveledPoint) {
screenspacePointDirection = screenspaceEdgeDirectionNormalized*edgeDistance*edgeSign;
/* centerDistanceSigned doesn't need any adjustment, hasCap is set
below for both */
/* Otherwise it's either an outer point of a miter join (basically
points 2a and 2b from above evaluated to the same position), or the
inner point, which is the same for bevel and mitter joins. Given
normalized direction `d` and neighbor direction `nd`,
`normalized(d + nd)` is the "average" direction of the two and `perpendicular(normalized(d + nd))` gives us the direction from B to
2 (or from 3 to B):
0--- --------+---2
| | α/ \
| w | / j \
| |/ \
A-- +_-----d->-B \
| -_ α/α\ \
| -_ / nd \
| d + nd /-_ v \
1---- ----3 -_ \
\ -+
\ \
C
With `2α` being the angle between `d` and `nd`, `α` appears in two
right triangles and the following holds, `w` being the edge distance
from above, and `j` having the length that's needed to scale
`perpendicular(normalized(d + nd))` to get point 2:
|d + nd| w 2 w
sin(α) = -------- = --- --> |j| = --------
2 |d| |j| |d + nd|
Then, vector j is the following, meaning we avoid the normalization
square root completely:
perp(d + nd) (2 w)perp(d + nd)
j = |j| ------------ = -----------------
|d + nd| dot(d + nd)
Point 3 is then just in the opposite direction; for the other side
it's done equivalently. */
} else {
highp const vec2 averageDirection = neighborSign*screenspaceLineDirectionNormalized + screenspaceNeighborDirectionNormalized;
screenspacePointDirection = (perpendicular(averageDirection)*(neighborSign*edgeSign*2.0*edgeDistance/dot(averageDirection, averageDirection)));
/* By projecting the point direction onto the line direction we
get a signed distance from the endpoint, adjust center distance
with that */
centerDistanceSigned.x += dot(screenspacePointDirection, screenspaceLineDirectionNormalized);
}
/* No cap here, store a negative value. TODO If
sign(centerDistanceSigned.x) is different from neighborSign, then
the sign here should be taken based on whether the other point is a
join -- add more bits to the vertex annotation? */
hasCap = -abs(centerDistanceSigned.x);
/* Line cap otherwise -- the quad corner 0/1/2/3 a sum of the signed cap
distance (`cdS`) and signed edge distance vectors (`eDS`), which are
formed by the line direction vector `d` and its perpendicular vector.
Neighbor direction (i.e., the other input from the one used to calculate
`lineDirection`) isn't used at all in this case.
cDS
0<---+----------
| ^
| | eDS
| |
| A--d-->
|
|
|
1---
The signed center distance a sum of half segment length and the cap
distance, multiplied by the cap sign (thus negative for points derived
from A and positive for B). */
} else {
screenspacePointDirection =
screenspaceLineDirectionNormalized*capDistance*neighborSign +
screenspaceEdgeDirectionNormalized*edgeDistance*edgeSign;
/* Add signed cap distance to the center distance */
centerDistanceSigned.x += capDistance*neighborSign;
/* Cap is here, store a positive value */
hasCap = abs(centerDistanceSigned.x);
}
/* Undo the screenspace projection */
highp const vec2 pointDirection = screenspacePointDirection*2.0/viewportSize;
#ifdef TWO_DIMENSIONS
gl_Position = vec4(transformedPosition + pointDirection, 0.0, 1.0);
#elif defined(THREE_DIMENSIONS)
gl_Position = vec4(transformedPosition4.xy + pointDirection*transformedPosition4.w, transformedPosition4.zw);
#ifndef CAN_USE_NOPERSPECTIVE
/* See the CAN_USE_NOPERSPECTIVE macro definition at the top for details */
gl_Position /= gl_Position.w;
#endif
#else
#error
#endif
#ifdef VERTEX_COLOR
/* Vertex colors, if enabled */
interpolatedVertexColor = vertexColor;
#endif
#ifdef INSTANCED_OBJECT_ID
/* Instanced object ID, if enabled */
interpolatedInstanceObjectId = instanceObjectId;
#endif
}

432
src/Magnum/Shaders/LineGL.cpp

@ -0,0 +1,432 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "LineGL.h"
#include <Corrade/Containers/EnumSet.hpp>
#include <Corrade/Containers/Iterable.h>
#include <Corrade/Containers/String.h>
#include <Corrade/Utility/Format.h>
#include <Corrade/Utility/Resource.h>
#include "Magnum/GL/Buffer.h"
#include "Magnum/GL/Context.h"
#include "Magnum/GL/Extensions.h"
#include "Magnum/GL/Shader.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Math/Matrix3.h"
#include "Magnum/Math/Matrix4.h"
#include "Magnum/Shaders/Line.h"
#include "Magnum/Shaders/Implementation/CreateCompatibilityShader.h"
#include "Magnum/Shaders/Implementation/lineMiterLimit.h"
namespace Magnum { namespace Shaders {
using namespace Containers::Literals;
using namespace Math::Literals;
namespace {
enum: Int {
/* 0/1/2/3 taken by Phong (A/D/S/N), 4 by MeshVisualizer colormap, 5 by
object ID textures, 6 by Vector */
TextureUnit = 7
};
enum: Int {
/* Not using the zero binding to avoid conflicts with
ProjectionBufferBinding from other shaders which can likely stay
bound to the same buffer for the whole time */
TransformationProjectionBufferBinding = 1,
DrawBufferBinding = 2,
MaterialBufferBinding = 3
};
}
template<UnsignedInt dimensions> typename LineGL<dimensions>::CompileState LineGL<dimensions>::compile(const Configuration& configuration) {
CORRADE_ASSERT(!(configuration.flags() >= Flag::UniformBuffers) || configuration.materialCount(),
"Shaders::LineGL: material count can't be zero", CompileState{NoCreate});
CORRADE_ASSERT(!(configuration.flags() >= Flag::UniformBuffers) || configuration.drawCount(),
"Shaders::LineGL: draw count can't be zero", CompileState{NoCreate});
#ifndef MAGNUM_TARGET_GLES
MAGNUM_ASSERT_GL_EXTENSION_SUPPORTED(GL::Extensions::EXT::gpu_shader4);
if(configuration.flags() >= Flag::UniformBuffers)
MAGNUM_ASSERT_GL_EXTENSION_SUPPORTED(GL::Extensions::ARB::uniform_buffer_object);
#endif
if(configuration.flags() >= Flag::MultiDraw) {
#ifndef MAGNUM_TARGET_GLES
MAGNUM_ASSERT_GL_EXTENSION_SUPPORTED(GL::Extensions::ARB::shader_draw_parameters);
#elif !defined(MAGNUM_TARGET_WEBGL)
MAGNUM_ASSERT_GL_EXTENSION_SUPPORTED(GL::Extensions::ANGLE::multi_draw);
#else
MAGNUM_ASSERT_GL_EXTENSION_SUPPORTED(GL::Extensions::WEBGL::multi_draw);
#endif
}
#ifdef MAGNUM_BUILD_STATIC
/* Import resources on static build, if not already */
if(!Utility::Resource::hasGroup("MagnumShadersGL"_s))
importShaderResources();
#endif
Utility::Resource rs{"MagnumShadersGL"_s};
#ifndef MAGNUM_TARGET_GLES
const GL::Context& context = GL::Context::current();
const GL::Version version = context.supportedVersion({GL::Version::GL320, GL::Version::GL310, GL::Version::GL300, GL::Version::GL210});
#else
constexpr GL::Version version = GL::Version::GLES300;
#endif
/* Cap and join style is needed by both the vertex and fragment shader,
prepare their defines just once for both */
Containers::StringView capStyleDefine, joinStyleDefine;
switch(configuration.capStyle()) {
case LineCapStyle::Butt:
capStyleDefine = "#define CAP_STYLE_BUTT\n"_s;
break;
case LineCapStyle::Square:
capStyleDefine = "#define CAP_STYLE_SQUARE\n"_s;
break;
case LineCapStyle::Round:
capStyleDefine = "#define CAP_STYLE_ROUND\n"_s;
break;
case LineCapStyle::Triangle:
capStyleDefine = "#define CAP_STYLE_TRIANGLE\n"_s;
break;
}
switch(configuration.joinStyle()) {
case LineJoinStyle::Miter:
joinStyleDefine = "#define JOIN_STYLE_MITER\n"_s;
break;
case LineJoinStyle::Bevel:
joinStyleDefine = "#define JOIN_STYLE_BEVEL\n"_s;
break;
}
CORRADE_INTERNAL_ASSERT(capStyleDefine);
CORRADE_INTERNAL_ASSERT(joinStyleDefine);
GL::Shader vert = Implementation::createCompatibilityShader(rs, version, GL::Shader::Type::Vertex);
vert.addSource(capStyleDefine)
.addSource(joinStyleDefine)
.addSource(configuration.flags() & Flag::VertexColor ? "#define VERTEX_COLOR\n"_s : ""_s)
.addSource(dimensions == 2 ? "#define TWO_DIMENSIONS\n"_s : "#define THREE_DIMENSIONS\n"_s)
.addSource(configuration.flags() >= Flag::InstancedObjectId ? "#define INSTANCED_OBJECT_ID\n"_s : ""_s)
.addSource(configuration.flags() & Flag::InstancedTransformation ? "#define INSTANCED_TRANSFORMATION\n"_s : ""_s);
if(configuration.flags() >= Flag::UniformBuffers) {
vert.addSource(Utility::format(
"#define UNIFORM_BUFFERS\n"
"#define DRAW_COUNT {}\n"
"#define MATERIAL_COUNT {}\n",
configuration.drawCount(),
configuration.materialCount()));
vert.addSource(configuration.flags() >= Flag::MultiDraw ? "#define MULTI_DRAW\n"_s : ""_s);
}
vert.addSource(rs.getString("generic.glsl"_s))
.addSource(rs.getString("Line.vert"_s))
.submitCompile();
GL::Shader frag = Implementation::createCompatibilityShader(rs, version, GL::Shader::Type::Fragment);
frag.addSource(capStyleDefine)
.addSource(joinStyleDefine)
.addSource(configuration.flags() & Flag::VertexColor ? "#define VERTEX_COLOR\n"_s : ""_s)
.addSource(configuration.flags() & Flag::ObjectId ? "#define OBJECT_ID\n"_s : ""_s)
.addSource(configuration.flags() >= Flag::InstancedObjectId ? "#define INSTANCED_OBJECT_ID\n"_s : ""_s);
if(configuration.flags() >= Flag::UniformBuffers) {
frag.addSource(Utility::format(
"#define UNIFORM_BUFFERS\n"
"#define DRAW_COUNT {}\n"
"#define MATERIAL_COUNT {}\n",
configuration.drawCount(),
configuration.materialCount()));
frag.addSource(configuration.flags() >= Flag::MultiDraw ? "#define MULTI_DRAW\n"_s : ""_s);
}
frag.addSource(rs.getString("generic.glsl"_s))
.addSource(rs.getString("Line.frag"_s))
.submitCompile();
LineGL<dimensions> out{NoInit};
out._flags = configuration.flags();
out._capStyle = configuration.capStyle();
out._joinStyle = configuration.joinStyle();
out._materialCount = configuration.materialCount();
out._drawCount = configuration.drawCount();
out.attachShaders({vert, frag});
/* ES3 has this done in the shader directly and doesn't even provide
bindFragmentDataLocation() */
#ifndef MAGNUM_TARGET_GLES
if(!context.isExtensionSupported<GL::Extensions::ARB::explicit_attrib_location>(version)) {
out.bindAttributeLocation(Position::Location, "position"_s);
out.bindAttributeLocation(PreviousPosition::Location, "previousPosition"_s);
out.bindAttributeLocation(NextPosition::Location, "nextPosition"_s);
out.bindAttributeLocation(Annotation::Location, "annotation"_s);
if(configuration.flags() & Flag::VertexColor)
out.bindAttributeLocation(Color3::Location, "vertexColor"_s); /* Color4 is the same */
if(configuration.flags() & Flag::ObjectId) {
out.bindFragmentDataLocation(ColorOutput, "color"_s);
out.bindFragmentDataLocation(ObjectIdOutput, "objectId"_s);
}
if(configuration.flags() >= Flag::InstancedObjectId)
out.bindAttributeLocation(ObjectId::Location, "instanceObjectId"_s);
if(configuration.flags() & Flag::InstancedTransformation)
out.bindAttributeLocation(TransformationMatrix::Location, "instancedTransformationMatrix"_s);
}
#endif
out.submitLink();
return CompileState{std::move(out), std::move(vert), std::move(frag)
#ifndef MAGNUM_TARGET_GLES
, version
#endif
};
}
template<UnsignedInt dimensions> LineGL<dimensions>::LineGL(CompileState&& state): LineGL{static_cast<LineGL&&>(std::move(state))} {
#ifdef CORRADE_GRACEFUL_ASSERT
/* When graceful assertions fire from within compile(), we get a NoCreate'd
CompileState. Exiting makes it possible to test the assert. */
if(!id()) return;
#endif
CORRADE_INTERNAL_ASSERT_OUTPUT(checkLink({GL::Shader(state._vert), GL::Shader(state._frag)}));
const GL::Context& context = GL::Context::current();
#ifndef MAGNUM_TARGET_GLES
const GL::Version version = state._version;
if(!context.isExtensionSupported<GL::Extensions::ARB::explicit_uniform_location>(version))
#endif
{
_viewportSizeUniform = uniformLocation("viewportSize"_s);
if(_flags >= Flag::UniformBuffers) {
if(_drawCount > 1)
_drawOffsetUniform = uniformLocation("drawOffset"_s);
} else {
_transformationProjectionMatrixUniform = uniformLocation("transformationProjectionMatrix"_s);
_widthUniform = uniformLocation("width"_s);
_smoothnessUniform = uniformLocation("smoothness"_s);
if(_joinStyle == LineJoinStyle::Miter)
_miterLimitUniform = uniformLocation("miterLimit"_s);
_backgroundColorUniform = uniformLocation("backgroundColor"_s);
_colorUniform = uniformLocation("color"_s);
if(_flags & Flag::ObjectId)
_objectIdUniform = uniformLocation("objectId"_s);
}
}
#ifndef MAGNUM_TARGET_GLES
if(!context.isExtensionSupported<GL::Extensions::ARB::shading_language_420pack>(version))
#endif
{
if(_flags >= Flag::UniformBuffers) {
setUniformBlockBinding(uniformBlockIndex("TransformationProjection"_s), TransformationProjectionBufferBinding);
setUniformBlockBinding(uniformBlockIndex("Draw"_s), DrawBufferBinding);
setUniformBlockBinding(uniformBlockIndex("Material"_s), MaterialBufferBinding);
}
}
/* Set defaults in OpenGL ES (for desktop they are set in shader code itself) */
#ifdef MAGNUM_TARGET_GLES
if(_flags >= Flag::UniformBuffers) {
/* Draw offset is zero by default */
} else {
setTransformationProjectionMatrix(MatrixTypeFor<dimensions, Float>{Math::IdentityInit});
setWidth(1.0f);
/* Smoothness is zero by default */
if(_joinStyle == LineJoinStyle::Miter)
setMiterLengthLimit(4.0f);
setColor(Magnum::Color4{1.0f});
/* Object ID is zero by default */
}
#endif
static_cast<void>(context);
}
template<UnsignedInt dimensions> LineGL<dimensions>::LineGL(const Configuration& configuration): LineGL{compile(configuration)} {}
template<UnsignedInt dimensions> LineGL<dimensions>::LineGL(NoInitT) {}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setViewportSize(const Vector2& size) {
setUniform(_viewportSizeUniform, size);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setTransformationProjectionMatrix(const MatrixTypeFor<dimensions, Float>& matrix) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setTransformationProjectionMatrix(): the shader was created with uniform buffers enabled", *this);
setUniform(_transformationProjectionMatrixUniform, matrix);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setBackgroundColor(const Magnum::Color4& color) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setBackgroundColor(): the shader was created with uniform buffers enabled", *this);
setUniform(_backgroundColorUniform, color);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setColor(const Magnum::Color4& color) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setColor(): the shader was created with uniform buffers enabled", *this);
setUniform(_colorUniform, color);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setWidth(const Float width) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setWidth(): the shader was created with uniform buffers enabled", *this);
setUniform(_widthUniform, width);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setSmoothness(const Float smoothness) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setSmoothness(): the shader was created with uniform buffers enabled", *this);
setUniform(_smoothnessUniform, smoothness);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setMiterLengthLimit(const Float limit) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setMiterLengthLimit(): the shader was created with uniform buffers enabled", *this);
CORRADE_ASSERT(_joinStyle == LineJoinStyle::Miter,
"Shaders::LineGL::setMiterLengthLimit(): the shader was created with" << _joinStyle, *this);
setUniform(_miterLimitUniform, Implementation::lineMiterLengthLimit("Shaders::LineGL::setMiterLengthLimit():", limit));
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setMiterAngleLimit(const Rad limit) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setMiterAngleLimit(): the shader was created with uniform buffers enabled", *this);
CORRADE_ASSERT(_joinStyle == LineJoinStyle::Miter,
"Shaders::LineGL::setMiterAngleLimit(): the shader was created with" << _joinStyle, *this);
setUniform(_miterLimitUniform, Implementation::lineMiterAngleLimit("Shaders::LineGL::setMiterAngleLimit():", limit));
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setObjectId(UnsignedInt id) {
CORRADE_ASSERT(!(_flags >= Flag::UniformBuffers),
"Shaders::LineGL::setObjectId(): the shader was created with uniform buffers enabled", *this);
CORRADE_ASSERT(_flags & Flag::ObjectId,
"Shaders::LineGL::setObjectId(): the shader was not created with object ID enabled", *this);
setUniform(_objectIdUniform, id);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::setDrawOffset(const UnsignedInt offset) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::setDrawOffset(): the shader was not created with uniform buffers enabled", *this);
CORRADE_ASSERT(offset < _drawCount,
"Shaders::LineGL::setDrawOffset(): draw offset" << offset << "is out of bounds for" << _drawCount << "draws", *this);
if(_drawCount > 1) setUniform(_drawOffsetUniform, offset);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindTransformationProjectionBuffer(GL::Buffer& buffer) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindTransformationProjectionBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, TransformationProjectionBufferBinding);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindTransformationProjectionBuffer(GL::Buffer& buffer, const GLintptr offset, const GLsizeiptr size) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindTransformationProjectionBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, TransformationProjectionBufferBinding, offset, size);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindDrawBuffer(GL::Buffer& buffer) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindDrawBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, DrawBufferBinding);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindDrawBuffer(GL::Buffer& buffer, const GLintptr offset, const GLsizeiptr size) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindDrawBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, DrawBufferBinding, offset, size);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindMaterialBuffer(GL::Buffer& buffer) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindMaterialBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, MaterialBufferBinding);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>& LineGL<dimensions>::bindMaterialBuffer(GL::Buffer& buffer, const GLintptr offset, const GLsizeiptr size) {
CORRADE_ASSERT(_flags >= Flag::UniformBuffers,
"Shaders::LineGL::bindMaterialBuffer(): the shader was not created with uniform buffers enabled", *this);
buffer.bind(GL::Buffer::Target::Uniform, MaterialBufferBinding, offset, size);
return *this;
}
template<UnsignedInt dimensions> LineGL<dimensions>::Configuration::Configuration(): _capStyle{LineCapStyle::Square}, _joinStyle{LineJoinStyle::Miter} {}
template class MAGNUM_SHADERS_EXPORT LineGL<2>;
template class MAGNUM_SHADERS_EXPORT LineGL<3>;
namespace Implementation {
Debug& operator<<(Debug& debug, const LineGLFlag value) {
debug << "Shaders::LineGL::Flag" << Debug::nospace;
switch(value) {
/* LCOV_EXCL_START */
#define _c(v) case LineGLFlag::v: return debug << "::" #v;
_c(VertexColor)
_c(ObjectId)
_c(InstancedObjectId)
_c(InstancedTransformation)
_c(UniformBuffers)
_c(MultiDraw)
#undef _c
/* LCOV_EXCL_STOP */
}
return debug << "(" << Debug::nospace << reinterpret_cast<void*>(UnsignedShort(value)) << Debug::nospace << ")";
}
Debug& operator<<(Debug& debug, const LineGLFlags value) {
return Containers::enumSetDebugOutput(debug, value, "Shaders::LineGL::Flags{}", {
LineGLFlag::VertexColor,
LineGLFlag::InstancedObjectId, /* Superset of ObjectId */
LineGLFlag::ObjectId,
LineGLFlag::InstancedTransformation,
LineGLFlag::MultiDraw, /* Superset of UniformBuffers */
LineGLFlag::UniformBuffers
});
}
}
}}

1150
src/Magnum/Shaders/LineGL.h

File diff suppressed because it is too large Load Diff

9
src/Magnum/Shaders/Shaders.h

@ -58,6 +58,15 @@ typedef CORRADE_DEPRECATED("use FlatGL3D instead") FlatGL3D Flat3D;
/* Generic is used only statically */ /* Generic is used only statically */
#ifndef MAGNUM_TARGET_GLES2
enum class LineCapStyle: UnsignedByte;
enum class LineJoinStyle: UnsignedByte;
template<UnsignedInt> class LineGL;
typedef LineGL<2> LineGL2D;
typedef LineGL<3> LineGL3D;
#endif
class MeshVisualizerGL2D; class MeshVisualizerGL2D;
class MeshVisualizerGL3D; class MeshVisualizerGL3D;
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED

65
src/Magnum/Shaders/Test/CMakeLists.txt

@ -45,6 +45,13 @@ corrade_add_test(ShadersPhongGL_Test PhongGL_Test.cpp LIBRARIES MagnumShadersTes
corrade_add_test(ShadersVectorGL_Test VectorGL_Test.cpp LIBRARIES MagnumShaders) corrade_add_test(ShadersVectorGL_Test VectorGL_Test.cpp LIBRARIES MagnumShaders)
corrade_add_test(ShadersVertexColorGL_Test VertexColorGL_Test.cpp LIBRARIES MagnumShaders) corrade_add_test(ShadersVertexColorGL_Test VertexColorGL_Test.cpp LIBRARIES MagnumShaders)
if(NOT MAGNUM_TARGET_GLES2)
corrade_add_test(ShadersLineTest LineTest.cpp LIBRARIES MagnumShadersTestLib)
target_compile_definitions(ShadersLineTest PRIVATE "CORRADE_GRACEFUL_ASSERT")
corrade_add_test(ShadersLineGL_Test LineGL_Test.cpp LIBRARIES MagnumShaders)
endif()
if(MAGNUM_BUILD_GL_TESTS) if(MAGNUM_BUILD_GL_TESTS)
# Otherwise CMake complains that Corrade::PluginManager is not found, wtf # Otherwise CMake complains that Corrade::PluginManager is not found, wtf
find_package(Corrade REQUIRED PluginManager) find_package(Corrade REQUIRED PluginManager)
@ -455,4 +462,62 @@ if(MAGNUM_BUILD_GL_TESTS)
VertexColorTestFiles VertexColorTestFiles
PROPERTIES MACOSX_PACKAGE_LOCATION Resources) PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
endif() endif()
if(NOT MAGNUM_TARGET_GLES2)
set(ShadersLineGLTest_SRCS LineGLTest.cpp)
if(CORRADE_TARGET_IOS)
list(APPEND ShadersLineGLTest_SRCS TestFiles LineTestFiles)
endif()
corrade_add_test(ShadersLineGLTest ${ShadersLineGLTest_SRCS}
LIBRARIES
MagnumDebugTools
MagnumMeshTools
MagnumPrimitives
MagnumShadersTestLib
MagnumOpenGLTester
FILES
LineTestFiles/caps-butt-joins-bevel.tga
LineTestFiles/caps-butt-joins-miter-flat.tga
LineTestFiles/caps-round-joins-miter.tga
LineTestFiles/caps-square-joins-bevel.tga
LineTestFiles/caps-square-joins-miter-flat.tga
LineTestFiles/caps-square-joins-miter-limit-36.tga
LineTestFiles/caps-square-joins-miter-limit-70deg.tga
LineTestFiles/caps-square-joins-miter-limit-91deg.tga
LineTestFiles/caps-square-joins-miter.tga
LineTestFiles/caps-triangle-joins-bevel.tga
LineTestFiles/cube3D-caps-butt-joins-bevel.tga
LineTestFiles/cube3D-caps-square-joins-miter.tga
LineTestFiles/cube3D-depth.tga
LineTestFiles/cube3D-flat-single-pixel.tga
LineTestFiles/defaults.tga
LineTestFiles/instanced.tga
LineTestFiles/multidraw.tga
LineTestFiles/perspective3D.tga
LineTestFiles/vertex-color.tga)
target_include_directories(ShadersLineGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
if(MAGNUM_BUILD_PLUGINS_STATIC)
if(MAGNUM_WITH_ANYIMAGEIMPORTER)
target_link_libraries(ShadersLineGLTest PRIVATE AnyImageImporter)
endif()
if(MAGNUM_WITH_TGAIMPORTER)
target_link_libraries(ShadersLineGLTest PRIVATE TgaImporter)
endif()
else()
# So the plugins get properly built when building the test
if(MAGNUM_WITH_ANYIMAGEIMPORTER)
add_dependencies(ShadersLineGLTest AnyImageImporter)
endif()
if(MAGNUM_WITH_TGAIMPORTER)
add_dependencies(ShadersLineGLTest TgaImporter)
endif()
endif()
if(CORRADE_TARGET_IOS)
set_source_files_properties(
LineTestFiles
PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
endif()
endif()
endif() endif()

2
src/Magnum/Shaders/Test/GenericGL_Test.cpp

@ -89,6 +89,8 @@ void GenericGL_Test::glslMatch() {
CORRADE_COMPARE(TEXTURE_OFFSET_ATTRIBUTE_LOCATION, GenericGL2D::TextureOffset::Location); CORRADE_COMPARE(TEXTURE_OFFSET_ATTRIBUTE_LOCATION, GenericGL2D::TextureOffset::Location);
CORRADE_COMPARE(TEXTURE_OFFSET_ATTRIBUTE_LOCATION, GenericGL3D::TextureOffset::Location); CORRADE_COMPARE(TEXTURE_OFFSET_ATTRIBUTE_LOCATION, GenericGL3D::TextureOffset::Location);
/* Line-specific attributes tested in LineGL_Test instead */
} }
void GenericGL_Test::glslMatchOutput() { void GenericGL_Test::glslMatchOutput() {

2760
src/Magnum/Shaders/Test/LineGLTest.cpp

File diff suppressed because it is too large Load Diff

157
src/Magnum/Shaders/Test/LineGL_Test.cpp

@ -0,0 +1,157 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include <sstream>
#include <Corrade/Containers/String.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Format.h>
#include "Magnum/Shaders/LineGL.h"
/* Yes, really */
#include "Magnum/Shaders/generic.glsl"
namespace Magnum { namespace Shaders { namespace Test { namespace {
/* There's an underscore between GL and Test to disambiguate from GLTest, which
is a common suffix used to mark tests that need a GL context. Ugly, I know. */
struct LineGL_Test: TestSuite::Tester {
explicit LineGL_Test();
void glslAttributeMatch();
template<UnsignedInt dimensions> void constructConfigurationDefault();
template<UnsignedInt dimensions> void constructConfigurationSetters();
template<UnsignedInt dimensions> void constructNoCreate();
template<UnsignedInt dimensions> void constructCopy();
void debugFlag();
void debugFlags();
void debugFlagsSupersets();
};
LineGL_Test::LineGL_Test() {
addTests({&LineGL_Test::glslAttributeMatch,
&LineGL_Test::constructConfigurationDefault<2>,
&LineGL_Test::constructConfigurationDefault<3>,
&LineGL_Test::constructConfigurationSetters<2>,
&LineGL_Test::constructConfigurationSetters<3>,
&LineGL_Test::constructNoCreate<2>,
&LineGL_Test::constructNoCreate<3>,
&LineGL_Test::constructCopy<2>,
&LineGL_Test::constructCopy<3>,
&LineGL_Test::debugFlag,
&LineGL_Test::debugFlags,
&LineGL_Test::debugFlagsSupersets});
}
void LineGL_Test::glslAttributeMatch() {
/* Position, Color and ObjectId tested in GenericGL_Test */
CORRADE_COMPARE(LINE_PREVIOUS_POSITION_ATTRIBUTE_LOCATION, LineGL2D::PreviousPosition::Location);
CORRADE_COMPARE(LINE_PREVIOUS_POSITION_ATTRIBUTE_LOCATION, LineGL3D::PreviousPosition::Location);
CORRADE_COMPARE(LINE_NEXT_POSITION_ATTRIBUTE_LOCATION, LineGL2D::NextPosition::Location);
CORRADE_COMPARE(LINE_NEXT_POSITION_ATTRIBUTE_LOCATION, LineGL3D::NextPosition::Location);
CORRADE_COMPARE(LINE_ANNOTATION_ATTRIBUTE_LOCATION, LineGL2D::Annotation::Location);
CORRADE_COMPARE(LINE_ANNOTATION_ATTRIBUTE_LOCATION, LineGL3D::Annotation::Location);
}
template<UnsignedInt dimensions> void LineGL_Test::constructConfigurationDefault() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
typename LineGL<dimensions>::Configuration configuration;
CORRADE_COMPARE(configuration.flags(), typename LineGL<dimensions>::Flags{});
CORRADE_COMPARE(configuration.materialCount(), 1);
CORRADE_COMPARE(configuration.drawCount(), 1);
}
template<UnsignedInt dimensions> void LineGL_Test::constructConfigurationSetters() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
typename LineGL<dimensions>::Configuration configuration = typename LineGL<dimensions>::Configuration{}
.setFlags(LineGL<dimensions>::Flag::VertexColor)
.setMaterialCount(17)
.setDrawCount(266);
CORRADE_COMPARE(configuration.flags(), LineGL<dimensions>::Flag::VertexColor);
CORRADE_COMPARE(configuration.materialCount(), 17);
CORRADE_COMPARE(configuration.drawCount(), 266);
}
template<UnsignedInt dimensions> void LineGL_Test::constructNoCreate() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
{
LineGL<dimensions> shader{NoCreate};
CORRADE_COMPARE(shader.id(), 0);
CORRADE_COMPARE(shader.flags(), typename LineGL<dimensions>::Flags{});
}
CORRADE_VERIFY(true);
}
template<UnsignedInt dimensions> void LineGL_Test::constructCopy() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
CORRADE_VERIFY(!std::is_copy_constructible<LineGL<dimensions>>{});
CORRADE_VERIFY(!std::is_copy_assignable<LineGL<dimensions>>{});
}
void LineGL_Test::debugFlag() {
std::ostringstream out;
Debug{&out} << LineGL3D::Flag::VertexColor << LineGL3D::Flag(0xf00d);
CORRADE_COMPARE(out.str(), "Shaders::LineGL::Flag::VertexColor Shaders::LineGL::Flag(0xf00d)\n");
}
void LineGL_Test::debugFlags() {
std::ostringstream out;
Debug{&out} << (LineGL3D::Flag::VertexColor|LineGL3D::Flag::InstancedTransformation) << LineGL3D::Flags{};
CORRADE_COMPARE(out.str(), "Shaders::LineGL::Flag::VertexColor|Shaders::LineGL::Flag::InstancedTransformation Shaders::LineGL::Flags{}\n");
}
void LineGL_Test::debugFlagsSupersets() {
/* InstancedObjectId is a superset of ObjectId so only one should be
printed */
{
std::ostringstream out;
Debug{&out} << (LineGL3D::Flag::ObjectId|LineGL3D::Flag::InstancedObjectId);
CORRADE_COMPARE(out.str(), "Shaders::LineGL::Flag::InstancedObjectId\n");
/* MultiDraw is a superset of UniformBuffers so only one should be printed */
} {
std::ostringstream out;
Debug{&out} << (LineGL3D::Flag::MultiDraw|LineGL3D::Flag::UniformBuffers);
CORRADE_COMPARE(out.str(), "Shaders::LineGL::Flag::MultiDraw\n");
}
}
}}}}
CORRADE_TEST_MAIN(Magnum::Shaders::Test::LineGL_Test)

306
src/Magnum/Shaders/Test/LineTest.cpp

@ -0,0 +1,306 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include <new>
#include <sstream>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/FormatStl.h>
#include "Magnum/Shaders/Line.h"
#include "Magnum/Shaders/Implementation/lineMiterLimit.h"
namespace Magnum { namespace Shaders { namespace Test { namespace {
struct LineTest: TestSuite::Tester {
explicit LineTest();
template<class T> void uniformSizeAlignment();
void drawUniformConstructDefault();
void drawUniformConstructNoInit();
void drawUniformSetters();
void drawUniformMaterialIdPacking();
void materialUniformConstructDefault();
void materialUniformConstructNoInit();
void materialUniformSetters();
void materialUniformSetMiterLengthLimitInvalid();
void materialUniformSetMiterAngleLimitInvalid();
void debugCapStyle();
void debugJoinStyle();
};
using namespace Math::Literals;
const struct {
const char* name;
Float limit;
const char* message;
} MaterialUniformSetMiterLengthLimitInvalidData[]{
{"too short", 0.9997f,
"expected a finite value greater than or equal to 1, got 0.9997"},
{"too long", Constants::inf(),
"expected a finite value greater than or equal to 1, got inf"},
};
const struct {
const char* name;
Rad limit;
const char* message;
} MaterialUniformSetMiterAngleLimitInvalidData[]{
{"too small", 0.0_degf,
"expected a value greater than 0° and less than or equal to 180°, got 0°"},
{"too large", 180.1_degf,
"expected a value greater than 0° and less than or equal to 180°, got 180.1°"}
};
LineTest::LineTest() {
addTests({&LineTest::uniformSizeAlignment<LineDrawUniform>,
&LineTest::uniformSizeAlignment<LineMaterialUniform>,
&LineTest::drawUniformConstructDefault,
&LineTest::drawUniformConstructNoInit,
&LineTest::drawUniformSetters,
&LineTest::drawUniformMaterialIdPacking,
&LineTest::materialUniformConstructDefault,
&LineTest::materialUniformConstructNoInit,
&LineTest::materialUniformSetters});
addInstancedTests({&LineTest::materialUniformSetMiterLengthLimitInvalid},
Containers::arraySize(MaterialUniformSetMiterLengthLimitInvalidData));
addInstancedTests({&LineTest::materialUniformSetMiterAngleLimitInvalid},
Containers::arraySize(MaterialUniformSetMiterAngleLimitInvalidData));
addTests({&LineTest::debugCapStyle,
&LineTest::debugJoinStyle});
}
template<class> struct UniformTraits;
template<> struct UniformTraits<LineDrawUniform> {
static const char* name() { return "LineDrawUniform"; }
};
template<> struct UniformTraits<LineMaterialUniform> {
static const char* name() { return "LineMaterialUniform"; }
};
template<class T> void LineTest::uniformSizeAlignment() {
setTestCaseTemplateName(UniformTraits<T>::name());
CORRADE_FAIL_IF(sizeof(T) % sizeof(Vector4) != 0, sizeof(T) << "is not a multiple of vec4 for UBO alignment.");
/* 48-byte structures are fine, we'll align them to 768 bytes and not
256, but warn about that */
CORRADE_FAIL_IF(768 % sizeof(T) != 0, sizeof(T) << "can't fit exactly into 768-byte UBO alignment.");
if(256 % sizeof(T) != 0)
CORRADE_WARN(sizeof(T) << "can't fit exactly into 256-byte UBO alignment, only 768.");
CORRADE_COMPARE(alignof(T), 4);
}
void LineTest::drawUniformConstructDefault() {
LineDrawUniform a;
LineDrawUniform b{DefaultInit};
CORRADE_COMPARE(a.materialId, 0);
CORRADE_COMPARE(b.materialId, 0);
CORRADE_COMPARE(a.objectId, 0);
CORRADE_COMPARE(b.objectId, 0);
constexpr LineDrawUniform ca;
constexpr LineDrawUniform cb{DefaultInit};
CORRADE_COMPARE(ca.materialId, 0);
CORRADE_COMPARE(cb.materialId, 0);
CORRADE_COMPARE(ca.objectId, 0);
CORRADE_COMPARE(cb.objectId, 0);
CORRADE_VERIFY(std::is_nothrow_default_constructible<LineDrawUniform>::value);
CORRADE_VERIFY(std::is_nothrow_constructible<LineDrawUniform, DefaultInitT>::value);
/* Implicit construction is not allowed */
CORRADE_VERIFY(!std::is_convertible<DefaultInitT, LineDrawUniform>::value);
}
void LineTest::drawUniformConstructNoInit() {
/* Testing only some fields, should be enough */
LineDrawUniform a;
a.materialId = 5;
a.objectId = 7;
new(&a) LineDrawUniform{NoInit};
{
/* Explicitly check we're not on Clang because certain Clang-based IDEs
inherit __GNUC__ if GCC is used instead of leaving it at 4 like
Clang itself does */
#if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__
CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value.");
#endif
CORRADE_COMPARE(a.materialId, 5);
CORRADE_COMPARE(a.objectId, 7);
}
CORRADE_VERIFY(std::is_nothrow_constructible<LineDrawUniform, NoInitT>::value);
/* Implicit construction is not allowed */
CORRADE_VERIFY(!std::is_convertible<NoInitT, LineDrawUniform>::value);
}
void LineTest::drawUniformSetters() {
LineDrawUniform a;
a.setMaterialId(5)
.setObjectId(7);
CORRADE_COMPARE(a.materialId, 5);
CORRADE_COMPARE(a.objectId, 7);
}
void LineTest::drawUniformMaterialIdPacking() {
LineDrawUniform a;
a.setMaterialId(13765);
/* materialId should be right at the beginning, in the low 16 bits on both
LE and BE */
CORRADE_COMPARE(reinterpret_cast<UnsignedInt*>(&a)[0] & 0xffff, 13765);
}
void LineTest::materialUniformConstructDefault() {
LineMaterialUniform a;
LineMaterialUniform b{DefaultInit};
CORRADE_COMPARE(a.backgroundColor, 0x00000000_rgbaf);
CORRADE_COMPARE(b.backgroundColor, 0x00000000_rgbaf);
CORRADE_COMPARE(a.color, 0xffffffff_rgbaf);
CORRADE_COMPARE(b.color, 0xffffffff_rgbaf);
CORRADE_COMPARE(a.width, 1.0f);
CORRADE_COMPARE(b.width, 1.0f);
CORRADE_COMPARE(a.smoothness, 0.0f);
CORRADE_COMPARE(b.smoothness, 0.0f);
CORRADE_COMPARE(a.miterLimit, Implementation::lineMiterLengthLimit("", 4.0f));
CORRADE_COMPARE(b.miterLimit, Implementation::lineMiterLengthLimit("", 4.0f));
constexpr LineMaterialUniform ca;
constexpr LineMaterialUniform cb{DefaultInit};
CORRADE_COMPARE(ca.backgroundColor, 0x00000000_rgbaf);
CORRADE_COMPARE(cb.backgroundColor, 0x00000000_rgbaf);
CORRADE_COMPARE(ca.color, 0xffffffff_rgbaf);
CORRADE_COMPARE(cb.color, 0xffffffff_rgbaf);
CORRADE_COMPARE(ca.width, 1.0f);
CORRADE_COMPARE(cb.width, 1.0f);
CORRADE_COMPARE(ca.smoothness, 0.0f);
CORRADE_COMPARE(cb.smoothness, 0.0f);
CORRADE_COMPARE(ca.miterLimit, Implementation::lineMiterLengthLimit("", 4.0f));
CORRADE_COMPARE(cb.miterLimit, Implementation::lineMiterLengthLimit("", 4.0f));
CORRADE_VERIFY(std::is_nothrow_default_constructible<LineDrawUniform>::value);
CORRADE_VERIFY(std::is_nothrow_constructible<LineDrawUniform, DefaultInitT>::value);
/* Implicit construction is not allowed */
CORRADE_VERIFY(!std::is_convertible<DefaultInitT, LineDrawUniform>::value);
}
void LineTest::materialUniformConstructNoInit() {
/* Testing only some fields, should be enough */
LineMaterialUniform a;
a.color = 0x354565fc_rgbaf;
a.smoothness = 7.0f;
new(&a) LineMaterialUniform{NoInit};
{
/* Explicitly check we're not on Clang because certain Clang-based IDEs
inherit __GNUC__ if GCC is used instead of leaving it at 4 like
Clang itself does */
#if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__
CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value.");
#endif
CORRADE_COMPARE(a.color, 0x354565fc_rgbaf);
CORRADE_COMPARE(a.smoothness, 7.0f);
}
CORRADE_VERIFY(std::is_nothrow_constructible<LineMaterialUniform, NoInitT>::value);
/* Implicit construction is not allowed */
CORRADE_VERIFY(!std::is_convertible<NoInitT, LineMaterialUniform>::value);
}
void LineTest::materialUniformSetters() {
LineMaterialUniform a;
a.setBackgroundColor(0x01020304_rgbaf)
.setColor(0x354565fc_rgbaf)
.setWidth(2.5f)
.setSmoothness(7.0f)
.setMiterLengthLimit(25.0f);
CORRADE_COMPARE(a.backgroundColor, 0x01020304_rgbaf);
CORRADE_COMPARE(a.color, 0x354565fc_rgbaf);
CORRADE_COMPARE(a.width, 2.5f);
CORRADE_COMPARE(a.smoothness, 7.0f);
CORRADE_COMPARE(a.miterLimit, 0.9968f);
a.setMiterAngleLimit(35.0_degf);
CORRADE_COMPARE(a.miterLimit, 0.819152f);
}
void LineTest::materialUniformSetMiterLengthLimitInvalid() {
auto&& data = MaterialUniformSetMiterLengthLimitInvalidData[testCaseInstanceId()];
setTestCaseDescription(data.name);
CORRADE_SKIP_IF_NO_ASSERT();
LineMaterialUniform a;
std::ostringstream out;
Error redirectError{&out};
a.setMiterLengthLimit(data.limit);
CORRADE_COMPARE(out.str(), Utility::formatString("Shaders::LineMaterialUniform::setMiterLengthLimit(): {}\n", data.message));
}
void LineTest::materialUniformSetMiterAngleLimitInvalid() {
auto&& data = MaterialUniformSetMiterAngleLimitInvalidData[testCaseInstanceId()];
setTestCaseDescription(data.name);
CORRADE_SKIP_IF_NO_ASSERT();
LineMaterialUniform a;
std::ostringstream out;
Error redirectError{&out};
a.setMiterAngleLimit(data.limit);
CORRADE_COMPARE(out.str(), Utility::formatString("Shaders::LineMaterialUniform::setMiterAngleLimit(): {}\n", data.message));
}
void LineTest::debugCapStyle() {
std::ostringstream out;
Debug{&out} << LineCapStyle::Square << LineCapStyle(0xb0);
CORRADE_COMPARE(out.str(), "Shaders::LineCapStyle::Square Shaders::LineCapStyle(0xb0)\n");
}
void LineTest::debugJoinStyle() {
std::ostringstream out;
Debug{&out} << LineJoinStyle::Bevel << LineJoinStyle(0xb0);
CORRADE_COMPARE(out.str(), "Shaders::LineJoinStyle::Bevel Shaders::LineJoinStyle(0xb0)\n");
}
}}}}
CORRADE_TEST_MAIN(Magnum::Shaders::Test::LineTest)

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-butt-joins-bevel.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-butt-joins-miter-flat.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-round-joins-miter.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-bevel.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-flat.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-36.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-70deg.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter-limit-91deg.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-square-joins-miter.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/caps-triangle-joins-bevel.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/cube3D-caps-butt-joins-bevel.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/cube3D-caps-square-joins-miter.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/cube3D-depth.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/cube3D-flat-single-pixel.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/defaults.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/instanced.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/multidraw.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/perspective3D.tga

Binary file not shown.

BIN
src/Magnum/Shaders/Test/LineTestFiles/vertex-color.tga

Binary file not shown.

9
src/Magnum/Shaders/generic.glsl

@ -27,12 +27,15 @@
/* Kept consistent with GenericGL.h (tested in ShadersGenericGL_Test) */ /* Kept consistent with GenericGL.h (tested in ShadersGenericGL_Test) */
#define POSITION_ATTRIBUTE_LOCATION 0 #define POSITION_ATTRIBUTE_LOCATION 0
#define TEXTURECOORDINATES_ATTRIBUTE_LOCATION 1 #define TEXTURECOORDINATES_ATTRIBUTE_LOCATION 1 /* also LineAnnotation */
#define LINE_ANNOTATION_ATTRIBUTE_LOCATION 1 /* also LineAnnotation */
#define COLOR_ATTRIBUTE_LOCATION 2 #define COLOR_ATTRIBUTE_LOCATION 2
#define TANGENT_ATTRIBUTE_LOCATION 3 #define TANGENT_ATTRIBUTE_LOCATION 3 /* also LinePreviousPosition */
#define LINE_PREVIOUS_POSITION_ATTRIBUTE_LOCATION 3 /* also Tangent */
#define BITANGENT_ATTRIBUTE_LOCATION 4 /* also ObjectId */ #define BITANGENT_ATTRIBUTE_LOCATION 4 /* also ObjectId */
#define OBJECT_ID_ATTRIBUTE_LOCATION 4 /* also Bitangent */ #define OBJECT_ID_ATTRIBUTE_LOCATION 4 /* also Bitangent */
#define NORMAL_ATTRIBUTE_LOCATION 5 #define NORMAL_ATTRIBUTE_LOCATION 5 /* also LineNextPosition */
#define LINE_NEXT_POSITION_ATTRIBUTE_LOCATION 5 /* also Normal */
#define JOINTIDS_ATTRIBUTE_LOCATION 6 #define JOINTIDS_ATTRIBUTE_LOCATION 6
#define WEIGHTS_ATTRIBUTE_LOCATION 7 #define WEIGHTS_ATTRIBUTE_LOCATION 7

6
src/Magnum/Shaders/resources-gl.conf

@ -13,6 +13,12 @@ filename=FullScreenTriangle.glsl
[file] [file]
filename=generic.glsl filename=generic.glsl
[file]
filename=Line.vert
[file]
filename=Line.frag
[file] [file]
filename=MeshVisualizer.vert filename=MeshVisualizer.vert

2
src/Magnum/Shaders/resources-gles2.conf

@ -13,6 +13,8 @@ filename=FullScreenTriangle.glsl
[file] [file]
filename=generic.glsl filename=generic.glsl
# Line.vert and Line.frag missing
[file] [file]
filename=MeshVisualizer.vert filename=MeshVisualizer.vert

Loading…
Cancel
Save