[libcamera-devel,v6,03/12] Documentation: Add figures to document Orientation
diff mbox series

Message ID 20231019140133.32090-4-jacopo.mondi@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera: Replace CameraConfiguration::transform
Related show

Commit Message

Jacopo Mondi Oct. 19, 2023, 2:01 p.m. UTC
Add figures in Documentation/rotation/ to document the plane
transformations defined by the Orientation enumeration.

Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 Documentation/Doxyfile.in                  |   2 +
 Documentation/rotation/rotate0.svg         | 132 ++++++++++++++++++++
 Documentation/rotation/rotate0Mirror.svg   | 135 +++++++++++++++++++++
 Documentation/rotation/rotate180.svg       | 135 +++++++++++++++++++++
 Documentation/rotation/rotate180Mirror.svg | 135 +++++++++++++++++++++
 Documentation/rotation/rotate270.svg       | 135 +++++++++++++++++++++
 Documentation/rotation/rotate270Mirror.svg | 135 +++++++++++++++++++++
 Documentation/rotation/rotate90.svg        | 135 +++++++++++++++++++++
 Documentation/rotation/rotate90Mirror.svg  | 135 +++++++++++++++++++++
 src/libcamera/orientation.cpp              |  17 +++
 10 files changed, 1096 insertions(+)
 create mode 100644 Documentation/rotation/rotate0.svg
 create mode 100644 Documentation/rotation/rotate0Mirror.svg
 create mode 100644 Documentation/rotation/rotate180.svg
 create mode 100644 Documentation/rotation/rotate180Mirror.svg
 create mode 100644 Documentation/rotation/rotate270.svg
 create mode 100644 Documentation/rotation/rotate270Mirror.svg
 create mode 100644 Documentation/rotation/rotate90.svg
 create mode 100644 Documentation/rotation/rotate90Mirror.svg

Comments

Laurent Pinchart Oct. 23, 2023, 11:25 a.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Thu, Oct 19, 2023 at 04:01:24PM +0200, Jacopo Mondi via libcamera-devel wrote:
> Add figures in Documentation/rotation/ to document the plane
> transformations defined by the Orientation enumeration.
> 
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> ---
>  Documentation/Doxyfile.in                  |   2 +
>  Documentation/rotation/rotate0.svg         | 132 ++++++++++++++++++++
>  Documentation/rotation/rotate0Mirror.svg   | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate180.svg       | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate180Mirror.svg | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate270.svg       | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate270Mirror.svg | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate90.svg        | 135 +++++++++++++++++++++
>  Documentation/rotation/rotate90Mirror.svg  | 135 +++++++++++++++++++++
>  src/libcamera/orientation.cpp              |  17 +++
>  10 files changed, 1096 insertions(+)
>  create mode 100644 Documentation/rotation/rotate0.svg
>  create mode 100644 Documentation/rotation/rotate0Mirror.svg
>  create mode 100644 Documentation/rotation/rotate180.svg
>  create mode 100644 Documentation/rotation/rotate180Mirror.svg
>  create mode 100644 Documentation/rotation/rotate270.svg
>  create mode 100644 Documentation/rotation/rotate270Mirror.svg
>  create mode 100644 Documentation/rotation/rotate90.svg
>  create mode 100644 Documentation/rotation/rotate90Mirror.svg
> 
> diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
> index 697a14d1dfe2..67ee51afb6e3 100644
> --- a/Documentation/Doxyfile.in
> +++ b/Documentation/Doxyfile.in
> @@ -78,6 +78,8 @@ EXPAND_ONLY_PREDEF     = YES
>  INCLUDE_PATH           = "@TOP_SRCDIR@/include/libcamera"
>  INCLUDE_FILE_PATTERNS  = *.h
>  
> +IMAGE_PATH             = "@TOP_SRCDIR@/Documentation"

I'll move images to an images/ directory, in order to avoid clashes
between Doxygen and Sphinx documentation.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +
>  PREDEFINED             = __DOXYGEN__ \
>                           __cplusplus \
>                           __attribute__(x)= \
> diff --git a/Documentation/rotation/rotate0.svg b/Documentation/rotation/rotate0.svg
> new file mode 100644
> index 000000000000..13cde16ada51
> --- /dev/null
> +++ b/Documentation/rotation/rotate0.svg
> @@ -0,0 +1,132 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate0.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="1.4854147"
> +     inkscape:cx="666.48052"
> +     inkscape:cy="448.35962"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="77.237244"
> +       y="81.982094" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="92.612343"
> +       y="98.912964" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="167.25099"
> +       y="98.912964" />
> +    <g
> +       id="g4"
> +       transform="translate(-0.98582077)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 244.95942,81.765726 62.444825,81.97209 154.25639,28.65633 Z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
> +       d="m 199.76751,33.368887 0.0285,21.581353"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
> +       d="m 215.59016,33.189206 0.0959,31.330304"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 194.42835,33.189356 25.2821,-0.220612"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
> +       d="m 195.19248,33.096339 -0.0701,-5.375793 23.77787,-0.05613 0.0553,5.315811"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 194.20874,25.616264 25.25485,-0.02536"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 195.03436,26.298566 -0.0455,-5.426692 23.77787,-0.05613 0.0553,5.315811"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate0Mirror.svg b/Documentation/rotation/rotate0Mirror.svg
> new file mode 100644
> index 000000000000..a7edda873bf5
> --- /dev/null
> +++ b/Documentation/rotation/rotate0Mirror.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate0Mirror.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.82900578"
> +     inkscape:cx="599.51331"
> +     inkscape:cy="579.00682"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="-230.13463"
> +       y="81.982094"
> +       transform="scale(-1,1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-214.75954"
> +       y="98.912964"
> +       transform="scale(-1,1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-140.12088"
> +       y="98.912964"
> +       transform="scale(-1,1)" />
> +    <g
> +       id="g4"
> +       transform="matrix(-1,0,0,1,308.35769,0)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 62.412454,81.765726 244.92705,81.97209 153.11548,28.65633 Z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 107.60436,33.368887 -0.0285,21.581353"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 91.781714,33.189206 -0.0959,31.330304"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 112.94352,33.189356 87.661424,32.968744"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 112.17939,33.096339 0.0701,-5.375793 -23.777866,-0.05613 -0.0553,5.315811"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 113.16313,25.616264 87.908284,25.590904"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 112.33751,26.298566 0.0455,-5.426692 -23.777866,-0.05613 -0.0553,5.315811"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate180.svg b/Documentation/rotation/rotate180.svg
> new file mode 100644
> index 000000000000..d092a5322fb1
> --- /dev/null
> +++ b/Documentation/rotation/rotate180.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate180.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.79489"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="-230.13461"
> +       y="-140.22527"
> +       transform="scale(-1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-214.75951"
> +       y="-123.2944"
> +       transform="scale(-1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-140.12086"
> +       y="-123.2944"
> +       transform="scale(-1)" />
> +    <g
> +       id="g4"
> +       transform="rotate(180,154.17884,111.10368)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 62.412437,140.44163 182.514593,-0.20636 -91.81156,53.31576 z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 107.60435,188.83847 -0.0285,-21.58135"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 91.781697,189.01815 -0.0959,-31.3303"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 112.94351,189.018 -25.282103,0.22061"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 112.17938,189.11102 0.0701,5.37579 -23.777873,0.0561 -0.0553,-5.31581"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 113.16312,196.59109 -25.254853,0.0254"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 112.3375,195.90879 0.0455,5.42669 -23.777873,0.0561 -0.0553,-5.31581"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate180Mirror.svg b/Documentation/rotation/rotate180Mirror.svg
> new file mode 100644
> index 000000000000..d4a77d500d94
> --- /dev/null
> +++ b/Documentation/rotation/rotate180Mirror.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate180Mirror.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.79489"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="77.237228"
> +       y="-140.22527"
> +       transform="scale(1,-1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="92.612335"
> +       y="-123.2944"
> +       transform="scale(1,-1)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="167.25098"
> +       y="-123.2944"
> +       transform="scale(1,-1)" />
> +    <g
> +       id="g4"
> +       transform="matrix(1,0,0,-1,-0.98584226,222.20736)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 244.9594,140.44163 62.444808,140.23527 154.25637,193.55103 Z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 199.76749,188.83847 0.0285,-21.58135"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 215.59014,189.01815 0.0959,-31.3303"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 194.42833,189.018 25.2821,0.22061"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 195.19246,189.11102 -0.0701,5.37579 23.77787,0.0561 0.0553,-5.31581"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 194.20872,196.59109 25.25485,0.0254"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 195.03434,195.90879 -0.0455,5.42669 23.77787,0.0561 0.0553,-5.31581"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate270.svg b/Documentation/rotation/rotate270.svg
> new file mode 100644
> index 000000000000..13ea1e5df918
> --- /dev/null
> +++ b/Documentation/rotation/rotate270.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate270.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.26451"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="-187.55237"
> +       y="124.56432"
> +       transform="rotate(-90)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-172.17726"
> +       y="141.49518"
> +       transform="rotate(-90)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-97.538612"
> +       y="141.49518"
> +       transform="rotate(-90)" />
> +    <g
> +       id="g4"
> +       transform="rotate(-90,154.17883,111.5966)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 124.34796,19.830188 124.55432,202.34478 71.238559,110.53322 Z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.951119,65.022101 21.58135,-0.0285"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.771439,49.199448 31.330301,-0.0959"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 75.771589,70.361261 75.550979,45.079158"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.678569,69.597131 -5.37579,0.0701 -0.0561,-23.777873 5.31581,-0.0553"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 68.198499,70.580871 -0.0254,-25.254853"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 68.880799,69.755251 -5.42669,0.0455 -0.0561,-23.777873 5.31581,-0.0553"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate270Mirror.svg b/Documentation/rotation/rotate270Mirror.svg
> new file mode 100644
> index 000000000000..6116f50aa96e
> --- /dev/null
> +++ b/Documentation/rotation/rotate270Mirror.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate270Mirror.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.79489"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="-187.55237"
> +       y="-182.80751"
> +       transform="matrix(0,-1,-1,0,0,0)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-172.17726"
> +       y="-165.87666"
> +       transform="matrix(0,-1,-1,0,0,0)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="-97.538612"
> +       y="-165.87666"
> +       transform="matrix(0,-1,-1,0,0,0)" />
> +    <g
> +       id="g4"
> +       transform="matrix(0,-1,-1,0,264.78961,265.77543)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 183.02388,19.830188 -0.20636,182.514592 53.31576,-91.81156 z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.42072,65.022101 -21.58135,-0.0285"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.6004,49.199448 -31.3303,-0.0959"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.60025,70.361261 0.22061,-25.282103"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.69327,69.597131 5.37579,0.0701 0.0561,-23.777873 -5.31581,-0.0553"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 239.17334,70.580871 0.0254,-25.254853"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 238.49104,69.755251 5.42669,0.0455 0.0561,-23.777873 -5.31581,-0.0553"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate90.svg b/Documentation/rotation/rotate90.svg
> new file mode 100644
> index 000000000000..af6276383c79
> --- /dev/null
> +++ b/Documentation/rotation/rotate90.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate90.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.26451"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="34.65498"
> +       y="-182.80751"
> +       transform="rotate(90)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="50.030079"
> +       y="-165.87665"
> +       transform="rotate(90)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="124.66872"
> +       y="-165.87665"
> +       transform="rotate(90)" />
> +    <g
> +       id="g4"
> +       transform="rotate(90,154.17885,110.61076)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 183.02388,202.37715 -0.20636,-182.51459 53.31576,91.81156 z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.42072,157.18524 -21.58135,0.0285"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.6004,173.00789 -31.3303,0.0959"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.60025,151.84608 0.22061,25.2821"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 231.69327,152.61021 5.37579,-0.0701 0.0561,23.77787 -5.31581,0.0553"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 239.17334,151.62647 0.0254,25.25485"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 238.49104,152.45209 5.42669,-0.0455 0.0561,23.77787 -5.31581,0.0553"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/Documentation/rotation/rotate90Mirror.svg b/Documentation/rotation/rotate90Mirror.svg
> new file mode 100644
> index 000000000000..1760c46226ab
> --- /dev/null
> +++ b/Documentation/rotation/rotate90Mirror.svg
> @@ -0,0 +1,135 @@
> +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
> +<!-- Created with Inkscape (http://www.inkscape.org/) -->
> +
> +<svg
> +   width="297mm"
> +   height="210mm"
> +   viewBox="0 0 297 210"
> +   version="1.1"
> +   id="svg1"
> +   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
> +   sodipodi:docname="rotate90Mirror.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="namedview1"
> +     pagecolor="#ffffff"
> +     bordercolor="#666666"
> +     borderopacity="1.0"
> +     inkscape:showpageshadow="2"
> +     inkscape:pageopacity="0.0"
> +     inkscape:pagecheckerboard="0"
> +     inkscape:deskcolor="#d1d1d1"
> +     inkscape:document-units="mm"
> +     showgrid="true"
> +     showguides="false"
> +     inkscape:zoom="0.94272086"
> +     inkscape:cx="467.79489"
> +     inkscape:cy="423.24299"
> +     inkscape:window-width="1916"
> +     inkscape:window-height="1040"
> +     inkscape:window-x="0"
> +     inkscape:window-y="38"
> +     inkscape:window-maximized="1"
> +     inkscape:current-layer="layer1">
> +    <inkscape:grid
> +       id="grid1"
> +       units="px"
> +       originx="0"
> +       originy="0"
> +       spacingx="0.26458334"
> +       spacingy="0.26458333"
> +       empcolor="#0000ff"
> +       empopacity="0.25098039"
> +       color="#0000ff"
> +       opacity="0.1254902"
> +       empspacing="5"
> +       dotted="false"
> +       gridanglex="30"
> +       gridanglez="30"
> +       visible="true" />
> +  </sodipodi:namedview>
> +  <defs
> +     id="defs1" />
> +  <g
> +     inkscape:label="Layer 1"
> +     inkscape:groupmode="layer"
> +     id="layer1">
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect1"
> +       width="152.88184"
> +       height="119.41136"
> +       x="34.65498"
> +       y="124.56432"
> +       transform="matrix(0,1,1,0,0,0)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2"
> +       width="49.755535"
> +       height="36.468258"
> +       x="50.030079"
> +       y="141.49519"
> +       transform="matrix(0,1,1,0,0,0)" />
> +    <rect
> +       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +       id="rect2-5"
> +       width="49.755535"
> +       height="36.468258"
> +       x="124.66872"
> +       y="141.49519"
> +       transform="matrix(0,1,1,0,0,0)" />
> +    <g
> +       id="g4"
> +       transform="matrix(0,1,1,0,42.582224,-43.56809)"
> +       style="stroke-width:1.5875;stroke-dasharray:none">
> +      <rect
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="rect3"
> +         width="40.994682"
> +         height="43.605846"
> +         x="134.16664"
> +         y="157.24184" />
> +      <ellipse
> +         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
> +         id="path3"
> +         cx="140.15703"
> +         cy="176.44627"
> +         rx="1.889045"
> +         ry="1.925626" />
> +    </g>
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="M 124.34795,202.37715 124.55431,19.86256 71.238554,111.67412 Z"
> +       id="path4"
> +       sodipodi:nodetypes="cccc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.951114,157.18524 21.58135,0.0285"
> +       id="path5" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.771434,173.00789 31.330296,0.0959"
> +       id="path6" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.771584,151.84608 -0.22061,25.2821"
> +       id="path7" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 75.678564,152.61021 -5.37579,-0.0701 -0.0561,23.77787 5.31581,0.0553"
> +       id="path8" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 68.198494,151.62647 -0.0254,25.25485"
> +       id="path7-5"
> +       sodipodi:nodetypes="cc" />
> +    <path
> +       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
> +       d="m 68.880794,152.45209 -5.42669,-0.0455 -0.0561,23.77787 5.31581,0.0553"
> +       id="path8-9"
> +       sodipodi:nodetypes="cccc" />
> +  </g>
> +</svg>
> diff --git a/src/libcamera/orientation.cpp b/src/libcamera/orientation.cpp
> index 61f26cfda31b..5caf76f73865 100644
> --- a/src/libcamera/orientation.cpp
> +++ b/src/libcamera/orientation.cpp
> @@ -37,6 +37,23 @@ namespace libcamera {
>   * In example Orientation::Rotate90Mirror describes the image transformation
>   * obtained by rotating 90 degrees clockwise first and then applying an
>   * horizontal mirroring.
> + *
> + * \var CameraConfiguration::Rotate0
> + * \image html rotation/rotate0.svg
> + * \var CameraConfiguration::Rotate0Mirror
> + * \image html rotation/rotate0Mirror.svg
> + * \var CameraConfiguration::Rotate180
> + * \image html rotation/rotate180.svg
> + * \var CameraConfiguration::Rotate180Mirror
> + * \image html rotation/rotate180Mirror.svg
> + * \var CameraConfiguration::Rotate90Mirror
> + * \image html rotation/rotate90Mirror.svg
> + * \var CameraConfiguration::Rotate270
> + * \image html rotation/rotate270.svg
> + * \var CameraConfiguration::Rotate270Mirror
> + * \image html rotation/rotate270Mirror.svg
> + * \var CameraConfiguration::Rotate90
> + * \image html rotation/rotate90.svg
>   */
>  
>  /**

Patch
diff mbox series

diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
index 697a14d1dfe2..67ee51afb6e3 100644
--- a/Documentation/Doxyfile.in
+++ b/Documentation/Doxyfile.in
@@ -78,6 +78,8 @@  EXPAND_ONLY_PREDEF     = YES
 INCLUDE_PATH           = "@TOP_SRCDIR@/include/libcamera"
 INCLUDE_FILE_PATTERNS  = *.h
 
+IMAGE_PATH             = "@TOP_SRCDIR@/Documentation"
+
 PREDEFINED             = __DOXYGEN__ \
                          __cplusplus \
                          __attribute__(x)= \
diff --git a/Documentation/rotation/rotate0.svg b/Documentation/rotation/rotate0.svg
new file mode 100644
index 000000000000..13cde16ada51
--- /dev/null
+++ b/Documentation/rotation/rotate0.svg
@@ -0,0 +1,132 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate0.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="1.4854147"
+     inkscape:cx="666.48052"
+     inkscape:cy="448.35962"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="77.237244"
+       y="81.982094" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="92.612343"
+       y="98.912964" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="167.25099"
+       y="98.912964" />
+    <g
+       id="g4"
+       transform="translate(-0.98582077)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 244.95942,81.765726 62.444825,81.97209 154.25639,28.65633 Z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+       d="m 199.76751,33.368887 0.0285,21.581353"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+       d="m 215.59016,33.189206 0.0959,31.330304"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 194.42835,33.189356 25.2821,-0.220612"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+       d="m 195.19248,33.096339 -0.0701,-5.375793 23.77787,-0.05613 0.0553,5.315811"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 194.20874,25.616264 25.25485,-0.02536"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 195.03436,26.298566 -0.0455,-5.426692 23.77787,-0.05613 0.0553,5.315811"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate0Mirror.svg b/Documentation/rotation/rotate0Mirror.svg
new file mode 100644
index 000000000000..a7edda873bf5
--- /dev/null
+++ b/Documentation/rotation/rotate0Mirror.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate0Mirror.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.82900578"
+     inkscape:cx="599.51331"
+     inkscape:cy="579.00682"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="-230.13463"
+       y="81.982094"
+       transform="scale(-1,1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="-214.75954"
+       y="98.912964"
+       transform="scale(-1,1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="-140.12088"
+       y="98.912964"
+       transform="scale(-1,1)" />
+    <g
+       id="g4"
+       transform="matrix(-1,0,0,1,308.35769,0)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 62.412454,81.765726 244.92705,81.97209 153.11548,28.65633 Z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 107.60436,33.368887 -0.0285,21.581353"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 91.781714,33.189206 -0.0959,31.330304"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 112.94352,33.189356 87.661424,32.968744"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 112.17939,33.096339 0.0701,-5.375793 -23.777866,-0.05613 -0.0553,5.315811"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 113.16313,25.616264 87.908284,25.590904"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 112.33751,26.298566 0.0455,-5.426692 -23.777866,-0.05613 -0.0553,5.315811"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate180.svg b/Documentation/rotation/rotate180.svg
new file mode 100644
index 000000000000..d092a5322fb1
--- /dev/null
+++ b/Documentation/rotation/rotate180.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate180.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.79489"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="-230.13461"
+       y="-140.22527"
+       transform="scale(-1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="-214.75951"
+       y="-123.2944"
+       transform="scale(-1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="-140.12086"
+       y="-123.2944"
+       transform="scale(-1)" />
+    <g
+       id="g4"
+       transform="rotate(180,154.17884,111.10368)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 62.412437,140.44163 182.514593,-0.20636 -91.81156,53.31576 z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 107.60435,188.83847 -0.0285,-21.58135"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 91.781697,189.01815 -0.0959,-31.3303"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 112.94351,189.018 -25.282103,0.22061"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 112.17938,189.11102 0.0701,5.37579 -23.777873,0.0561 -0.0553,-5.31581"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 113.16312,196.59109 -25.254853,0.0254"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 112.3375,195.90879 0.0455,5.42669 -23.777873,0.0561 -0.0553,-5.31581"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate180Mirror.svg b/Documentation/rotation/rotate180Mirror.svg
new file mode 100644
index 000000000000..d4a77d500d94
--- /dev/null
+++ b/Documentation/rotation/rotate180Mirror.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate180Mirror.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.79489"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="77.237228"
+       y="-140.22527"
+       transform="scale(1,-1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="92.612335"
+       y="-123.2944"
+       transform="scale(1,-1)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="167.25098"
+       y="-123.2944"
+       transform="scale(1,-1)" />
+    <g
+       id="g4"
+       transform="matrix(1,0,0,-1,-0.98584226,222.20736)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 244.9594,140.44163 62.444808,140.23527 154.25637,193.55103 Z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 199.76749,188.83847 0.0285,-21.58135"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 215.59014,189.01815 0.0959,-31.3303"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 194.42833,189.018 25.2821,0.22061"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 195.19246,189.11102 -0.0701,5.37579 23.77787,0.0561 0.0553,-5.31581"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 194.20872,196.59109 25.25485,0.0254"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 195.03434,195.90879 -0.0455,5.42669 23.77787,0.0561 0.0553,-5.31581"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate270.svg b/Documentation/rotation/rotate270.svg
new file mode 100644
index 000000000000..13ea1e5df918
--- /dev/null
+++ b/Documentation/rotation/rotate270.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate270.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.26451"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="-187.55237"
+       y="124.56432"
+       transform="rotate(-90)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="-172.17726"
+       y="141.49518"
+       transform="rotate(-90)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="-97.538612"
+       y="141.49518"
+       transform="rotate(-90)" />
+    <g
+       id="g4"
+       transform="rotate(-90,154.17883,111.5966)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 124.34796,19.830188 124.55432,202.34478 71.238559,110.53322 Z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.951119,65.022101 21.58135,-0.0285"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.771439,49.199448 31.330301,-0.0959"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.771589,70.361261 75.550979,45.079158"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.678569,69.597131 -5.37579,0.0701 -0.0561,-23.777873 5.31581,-0.0553"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 68.198499,70.580871 -0.0254,-25.254853"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 68.880799,69.755251 -5.42669,0.0455 -0.0561,-23.777873 5.31581,-0.0553"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate270Mirror.svg b/Documentation/rotation/rotate270Mirror.svg
new file mode 100644
index 000000000000..6116f50aa96e
--- /dev/null
+++ b/Documentation/rotation/rotate270Mirror.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate270Mirror.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.79489"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="-187.55237"
+       y="-182.80751"
+       transform="matrix(0,-1,-1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="-172.17726"
+       y="-165.87666"
+       transform="matrix(0,-1,-1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="-97.538612"
+       y="-165.87666"
+       transform="matrix(0,-1,-1,0,0,0)" />
+    <g
+       id="g4"
+       transform="matrix(0,-1,-1,0,264.78961,265.77543)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 183.02388,19.830188 -0.20636,182.514592 53.31576,-91.81156 z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.42072,65.022101 -21.58135,-0.0285"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.6004,49.199448 -31.3303,-0.0959"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.60025,70.361261 0.22061,-25.282103"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.69327,69.597131 5.37579,0.0701 0.0561,-23.777873 -5.31581,-0.0553"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 239.17334,70.580871 0.0254,-25.254853"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 238.49104,69.755251 5.42669,0.0455 0.0561,-23.777873 -5.31581,-0.0553"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate90.svg b/Documentation/rotation/rotate90.svg
new file mode 100644
index 000000000000..af6276383c79
--- /dev/null
+++ b/Documentation/rotation/rotate90.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate90.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.26451"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="34.65498"
+       y="-182.80751"
+       transform="rotate(90)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="50.030079"
+       y="-165.87665"
+       transform="rotate(90)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="124.66872"
+       y="-165.87665"
+       transform="rotate(90)" />
+    <g
+       id="g4"
+       transform="rotate(90,154.17885,110.61076)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 183.02388,202.37715 -0.20636,-182.51459 53.31576,91.81156 z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.42072,157.18524 -21.58135,0.0285"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.6004,173.00789 -31.3303,0.0959"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.60025,151.84608 0.22061,25.2821"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 231.69327,152.61021 5.37579,-0.0701 0.0561,23.77787 -5.31581,0.0553"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 239.17334,151.62647 0.0254,25.25485"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 238.49104,152.45209 5.42669,-0.0455 0.0561,23.77787 -5.31581,0.0553"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/Documentation/rotation/rotate90Mirror.svg b/Documentation/rotation/rotate90Mirror.svg
new file mode 100644
index 000000000000..1760c46226ab
--- /dev/null
+++ b/Documentation/rotation/rotate90Mirror.svg
@@ -0,0 +1,135 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="297mm"
+   height="210mm"
+   viewBox="0 0 297 210"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   sodipodi:docname="rotate90Mirror.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="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="true"
+     showguides="false"
+     inkscape:zoom="0.94272086"
+     inkscape:cx="467.79489"
+     inkscape:cy="423.24299"
+     inkscape:window-width="1916"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="38"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       id="grid1"
+       units="px"
+       originx="0"
+       originy="0"
+       spacingx="0.26458334"
+       spacingy="0.26458333"
+       empcolor="#0000ff"
+       empopacity="0.25098039"
+       color="#0000ff"
+       opacity="0.1254902"
+       empspacing="5"
+       dotted="false"
+       gridanglex="30"
+       gridanglez="30"
+       visible="true" />
+  </sodipodi:namedview>
+  <defs
+     id="defs1" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect1"
+       width="152.88184"
+       height="119.41136"
+       x="34.65498"
+       y="124.56432"
+       transform="matrix(0,1,1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2"
+       width="49.755535"
+       height="36.468258"
+       x="50.030079"
+       y="141.49519"
+       transform="matrix(0,1,1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="rect2-5"
+       width="49.755535"
+       height="36.468258"
+       x="124.66872"
+       y="141.49519"
+       transform="matrix(0,1,1,0,0,0)" />
+    <g
+       id="g4"
+       transform="matrix(0,1,1,0,42.582224,-43.56809)"
+       style="stroke-width:1.5875;stroke-dasharray:none">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="rect3"
+         width="40.994682"
+         height="43.605846"
+         x="134.16664"
+         y="157.24184" />
+      <ellipse
+         style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path3"
+         cx="140.15703"
+         cy="176.44627"
+         rx="1.889045"
+         ry="1.925626" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="M 124.34795,202.37715 124.55431,19.86256 71.238554,111.67412 Z"
+       id="path4"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.951114,157.18524 21.58135,0.0285"
+       id="path5" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.771434,173.00789 31.330296,0.0959"
+       id="path6" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.771584,151.84608 -0.22061,25.2821"
+       id="path7" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 75.678564,152.61021 -5.37579,-0.0701 -0.0561,23.77787 5.31581,0.0553"
+       id="path8" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 68.198494,151.62647 -0.0254,25.25485"
+       id="path7-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+       d="m 68.880794,152.45209 -5.42669,-0.0455 -0.0561,23.77787 5.31581,0.0553"
+       id="path8-9"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/src/libcamera/orientation.cpp b/src/libcamera/orientation.cpp
index 61f26cfda31b..5caf76f73865 100644
--- a/src/libcamera/orientation.cpp
+++ b/src/libcamera/orientation.cpp
@@ -37,6 +37,23 @@  namespace libcamera {
  * In example Orientation::Rotate90Mirror describes the image transformation
  * obtained by rotating 90 degrees clockwise first and then applying an
  * horizontal mirroring.
+ *
+ * \var CameraConfiguration::Rotate0
+ * \image html rotation/rotate0.svg
+ * \var CameraConfiguration::Rotate0Mirror
+ * \image html rotation/rotate0Mirror.svg
+ * \var CameraConfiguration::Rotate180
+ * \image html rotation/rotate180.svg
+ * \var CameraConfiguration::Rotate180Mirror
+ * \image html rotation/rotate180Mirror.svg
+ * \var CameraConfiguration::Rotate90Mirror
+ * \image html rotation/rotate90Mirror.svg
+ * \var CameraConfiguration::Rotate270
+ * \image html rotation/rotate270.svg
+ * \var CameraConfiguration::Rotate270Mirror
+ * \image html rotation/rotate270Mirror.svg
+ * \var CameraConfiguration::Rotate90
+ * \image html rotation/rotate90.svg
  */
 
 /**