diff --git a/chart2/uiconfig/toolbar/basicshapes.xml b/chart2/uiconfig/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/chart2/uiconfig/toolbar/basicshapes.xml
+++ b/chart2/uiconfig/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/icon-themes/colibre/cmd/32/basicshapes.sinusoid.png b/icon-themes/colibre/cmd/32/basicshapes.sinusoid.png
new file mode 100644
index 000000000000..9e418857c3b5
Binary files /dev/null and b/icon-themes/colibre/cmd/32/basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre/cmd/lc_basicshapes.sinusoid.png b/icon-themes/colibre/cmd/lc_basicshapes.sinusoid.png
new file mode 100644
index 000000000000..7cf307a3d500
Binary files /dev/null and b/icon-themes/colibre/cmd/lc_basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre/cmd/sc_basicshapes.sinusoid.png b/icon-themes/colibre/cmd/sc_basicshapes.sinusoid.png
new file mode 100644
index 000000000000..c919cc3beb42
Binary files /dev/null and b/icon-themes/colibre/cmd/sc_basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre_dark/cmd/32/basicshapes.sinusoid.png b/icon-themes/colibre_dark/cmd/32/basicshapes.sinusoid.png
new file mode 100644
index 000000000000..66f701ba1dc9
Binary files /dev/null and b/icon-themes/colibre_dark/cmd/32/basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre_dark/cmd/lc_basicshapes.sinusoid.png b/icon-themes/colibre_dark/cmd/lc_basicshapes.sinusoid.png
new file mode 100644
index 000000000000..4f49fa91fb65
Binary files /dev/null and b/icon-themes/colibre_dark/cmd/lc_basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre_dark/cmd/sc_basicshapes.sinusoid.png b/icon-themes/colibre_dark/cmd/sc_basicshapes.sinusoid.png
new file mode 100644
index 000000000000..c3f64f3b0d87
Binary files /dev/null and b/icon-themes/colibre_dark/cmd/sc_basicshapes.sinusoid.png differ
diff --git a/icon-themes/colibre_dark_svg/cmd/32/basicshapes.sinusoid.svg b/icon-themes/colibre_dark_svg/cmd/32/basicshapes.sinusoid.svg
new file mode 100644
index 000000000000..b0bff6dd1235
--- /dev/null
+++ b/icon-themes/colibre_dark_svg/cmd/32/basicshapes.sinusoid.svg
@@ -0,0 +1,3 @@
+
diff --git a/icon-themes/colibre_svg/cmd/32/basicshapes.sinusoid.svg b/icon-themes/colibre_svg/cmd/32/basicshapes.sinusoid.svg
new file mode 100644
index 000000000000..4567c9b427d2
--- /dev/null
+++ b/icon-themes/colibre_svg/cmd/32/basicshapes.sinusoid.svg
@@ -0,0 +1,3 @@
+
diff --git a/include/svx/msdffdef.hxx b/include/svx/msdffdef.hxx
index 373974e67b31..de3b2e8c6c26 100644
--- a/include/svx/msdffdef.hxx
+++ b/include/svx/msdffdef.hxx
@@ -478,6 +478,7 @@ enum MSO_SPT: sal_Int32 {
mso_sptTextBox = 202,
//for pptx shape which doesn't exist in ppt
mso_sptTearDrop = 203,
+ mso_sptSinusoid = 204,
mso_sptMax = 0x0FFF,
mso_sptNil = mso_sptMax
};
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
index 5b438e01ffe1..c8ba600372b4 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
@@ -391,6 +391,14 @@ bit 3 (0x8): #define UICOMMANDDESCRIPTION_PROPERTIES_TOGGLEBUTTON 8
1
+
+
+ Sinusoid
+
+
+ 1
+
+
Cylinder
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 4151c61798f2..25f4aa83a65b 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -621,12 +621,13 @@ constexpr frozen::set constDenySet(
u"flowchart-display"
});
-constexpr frozen::set constAllowSet(
+constexpr frozen::set constAllowSet(
{
u"heart",
u"puzzle",
u"col-60da8460",
- u"col-502ad400"
+ u"col-502ad400",
+ u"sinusoid"
});
} // end anonymous namespace
diff --git a/reportdesign/uiconfig/dbreport/toolbar/basicshapes.xml b/reportdesign/uiconfig/dbreport/toolbar/basicshapes.xml
index 4bd60977eb41..ee50dd9255a3 100644
--- a/reportdesign/uiconfig/dbreport/toolbar/basicshapes.xml
+++ b/reportdesign/uiconfig/dbreport/toolbar/basicshapes.xml
@@ -43,4 +43,6 @@
+
+
\ No newline at end of file
diff --git a/sc/uiconfig/scalc/toolbar/basicshapes.xml b/sc/uiconfig/scalc/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sc/uiconfig/scalc/toolbar/basicshapes.xml
+++ b/sc/uiconfig/scalc/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sd/uiconfig/sdraw/toolbar/basicshapes.xml b/sd/uiconfig/sdraw/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sd/uiconfig/sdraw/toolbar/basicshapes.xml
+++ b/sd/uiconfig/sdraw/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sd/uiconfig/simpress/toolbar/basicshapes.xml b/sd/uiconfig/simpress/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sd/uiconfig/simpress/toolbar/basicshapes.xml
+++ b/sd/uiconfig/simpress/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx b/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx
index 7db0ff931ac4..026eac620416 100644
--- a/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx
@@ -8352,6 +8352,62 @@ const mso_CustomShape msoTearDrop =
std::span(mso_sptTearDropHandle),
};
+///////////////////////////// sinusoid
+const SvxMSDffVertPair mso_sptSinusoidVert[] =
+{
+ // calculations courtesy of section 6.3.2 of
+ // https://documentation.libreoffice.org/assets/Uploads/Documentation/en/Tutorials/CustomShapes7/Custom-Shape-Tutorial.pdf#page=52
+
+ // taking K = (3pi/2 - 3pi^2/8 - 1/2)
+ // transforming points to viewbox of size 21600 x 21600
+
+ // Start point
+ { 0, 10800 }, // (0, 0)
+ // First Bezier
+ { 1757, 5278 }, // (K, K)
+ { 3437, 0 }, // (1, 1)
+ { 5400, 0 }, // (pi/2, 1)
+ // Second Bezier
+ { 7362, 0 }, // (pi - 1, 1)
+ { 9042, 5278 }, // (pi - K, K)
+ { 10800, 10800 }, // (pi, 0)
+ // Third Bezier
+ { 12557, 16321 }, // (pi + K, -K)
+ { 14237, 21600 }, // (pi + 1, -1)
+ { 16200, 21600 }, // (3pi/2, -1)
+ // Fourth Bezier
+ { 18162, 21600 }, // (2pi - 1, -1)
+ { 19842, 16321 }, // (2pi - K, -K)
+ { 21600, 10800 } // (2pi, 0)
+};
+
+const sal_uInt16 mso_sptSinusoidSegm[] =
+{
+ 0x4000, 0x2004, 0x8000
+};
+
+const SvxMSDffVertPair mso_sptSinusoidGluePoints[] =
+{
+ { 0, 10800 }, // x = 0.00
+ { 5400, 0 }, // x = 0.25
+ { 10800, 10800 }, // x = 0.50
+ { 16200, 21600 }, // x = 0.75
+ { 21600, 10800 } // x = 1.00
+};
+
+const mso_CustomShape msoSinusoid =
+{
+ std::span(mso_sptSinusoidVert), // vertices
+ const_cast(mso_sptSinusoidSegm), sizeof(mso_sptSinusoidSegm) >> 1, // segments, count
+ std::span(), // calculations (none)
+ nullptr, // default values (none)
+ std::span(), // text area (default)
+ 21600, 21600, // viewbox w, h (default)
+ MIN_INT32, MIN_INT32, // stretch x, y (unset)
+ std::span(mso_sptSinusoidGluePoints), // glue points
+ std::span(), // handles (none)
+};
+
const mso_CustomShape* GetCustomShapeContent( MSO_SPT eSpType )
{
@@ -8481,6 +8537,7 @@ const mso_CustomShape* GetCustomShapeContent( MSO_SPT eSpType )
case mso_sptCloudCallout : pCustomShape = &msoCloudCallout; break;
case mso_sptWave : pCustomShape = &msoWave; break;
case mso_sptDoubleWave : pCustomShape = &msoDoubleWave; break;
+ case mso_sptSinusoid : pCustomShape = &msoSinusoid; break;
// callout
case mso_sptCallout1 : pCustomShape = &msoCallout1; break;
diff --git a/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx b/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx
index 472e5f265753..cafea3164a16 100644
--- a/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx
@@ -236,7 +236,8 @@ const NameTypeTable pNameTypeTableArray[] =
{ "mso-spt201", mso_sptHostControl },
{ "mso-spt202", mso_sptTextBox },
{ "teardrop", mso_sptTearDrop },
- { "ooxml-rect", mso_sptRectangle }
+ { "ooxml-rect", mso_sptRectangle },
+ { "sinusoid", mso_sptSinusoid }
};
// gallery: quadrat
@@ -518,7 +519,8 @@ const ACCNameTypeTable pACCNameTypeTableArray[] =
{ "mso-spt202", mso_sptTextBox },*/
{ "frame", "Frame" },
{ "col-60da8460", "Octagon Bevel" },
- { "col-502ad400", "Diamond Bevel" }
+ { "col-502ad400", "Diamond Bevel" },
+ { "sinusoid", "Sinusoid" }
};
typedef std::unordered_map TypeACCNameHashMap;
diff --git a/svx/source/sidebar/shapes/ShapesUtil.cxx b/svx/source/sidebar/shapes/ShapesUtil.cxx
index ffd1acb62926..02ac744b6d42 100644
--- a/svx/source/sidebar/shapes/ShapesUtil.cxx
+++ b/svx/source/sidebar/shapes/ShapesUtil.cxx
@@ -87,7 +87,8 @@ SvxShapeCommandsMap::SvxShapeCommandsMap()
{20, ".uno:BasicShapes.cube"},
{21, ".uno:BasicShapes.paper"},
{22, ".uno:BasicShapes.frame"},
- {23, ".uno:BasicShapes.ring"}
+ {23, ".uno:BasicShapes.ring"},
+ {24, ".uno:SymbolShapes.sinusoid"}
};
mpSymbolShapes = decltype(mpSymbolShapes){
diff --git a/sw/uiconfig/sglobal/toolbar/basicshapes.xml b/sw/uiconfig/sglobal/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sw/uiconfig/sglobal/toolbar/basicshapes.xml
+++ b/sw/uiconfig/sglobal/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sw/uiconfig/sweb/toolbar/basicshapes.xml b/sw/uiconfig/sweb/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sw/uiconfig/sweb/toolbar/basicshapes.xml
+++ b/sw/uiconfig/sweb/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sw/uiconfig/swform/toolbar/basicshapes.xml b/sw/uiconfig/swform/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sw/uiconfig/swform/toolbar/basicshapes.xml
+++ b/sw/uiconfig/swform/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sw/uiconfig/swreport/toolbar/basicshapes.xml b/sw/uiconfig/swreport/toolbar/basicshapes.xml
index 5b7194408b0b..7b583dff6d93 100644
--- a/sw/uiconfig/swreport/toolbar/basicshapes.xml
+++ b/sw/uiconfig/swreport/toolbar/basicshapes.xml
@@ -43,4 +43,6 @@
+
+
\ No newline at end of file
diff --git a/sw/uiconfig/swriter/toolbar/basicshapes.xml b/sw/uiconfig/swriter/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sw/uiconfig/swriter/toolbar/basicshapes.xml
+++ b/sw/uiconfig/swriter/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+
diff --git a/sw/uiconfig/swxform/toolbar/basicshapes.xml b/sw/uiconfig/swxform/toolbar/basicshapes.xml
index 148245f66672..a0debaab8fd5 100644
--- a/sw/uiconfig/swxform/toolbar/basicshapes.xml
+++ b/sw/uiconfig/swxform/toolbar/basicshapes.xml
@@ -45,4 +45,6 @@
+
+