From 21d39b5a8c36203d18c5d67c9d2f2bb8d89a53de Mon Sep 17 00:00:00 2001 From: Regina Henschel Date: Sun, 17 Mar 2024 16:28:12 +0100 Subject: [PATCH] Clamp extrusion light level to allowed range for ODF With import of shapes in 3D-mode from pptx files, the internal values for light level might be outside the range 0..100 and thus not allowed in ODF. These high levels are needed to get a similar rendering to MS Office. The export to ODF clamps them now to the allowed range. I do not intend to change the export to loext namespace, because the extrusion mode of custom shapes needs a totally new handling. But that will not be possible timely for version 24.8. Change-Id: I839903cbaf1b304c1e0c4374080963bc70352e61 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164948 Tested-by: Jenkins Reviewed-by: Regina Henschel --- .../qa/unit/data/Scene3d_LightRig_threePt.pptx | Bin 0 -> 14520 bytes xmloff/qa/unit/draw.cxx | 12 ++++++++++++ xmloff/source/draw/shapeexport.cxx | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 xmloff/qa/unit/data/Scene3d_LightRig_threePt.pptx diff --git a/xmloff/qa/unit/data/Scene3d_LightRig_threePt.pptx b/xmloff/qa/unit/data/Scene3d_LightRig_threePt.pptx new file mode 100644 index 0000000000000000000000000000000000000000..33121f2590e42363f3628aeed528b150b0537ab7 GIT binary patch literal 14520 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::ThemeColorType::Hyperlink)); CPPUNIT_ASSERT_EQUAL(Color(0x440000), pColorSet->getColor(model::ThemeColorType::Accent1)); } + +CPPUNIT_TEST_FIXTURE(XmloffDrawTest, test_scene3d_ooxml_light) +{ + // The document has a shape in 3D mode. The import of ooxml light rigs can produce light + // levels outside the 0..100 range allowed in ODF. Such high levels are needed for rendering + // similar to MS Office. + loadFromFile(u"Scene3d_LightRig_threePt.pptx"); + + // Without fix this would have failed with validation error. + save("impress8"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx index 2322e6be63d5..01a97c5be666 100644 --- a/xmloff/source/draw/shapeexport.cxx +++ b/xmloff/source/draw/shapeexport.cxx @@ -125,6 +125,7 @@ #include #include #include +#include using namespace ::com::sun::star; using namespace ::xmloff::EnhancedCustomShapeToken; @@ -4523,6 +4524,8 @@ static void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Referenc double fExtrusionFirstLightLevel = 0; if ( rProp.Value >>= fExtrusionFirstLightLevel ) { + fExtrusionFirstLightLevel = + std::clamp(fExtrusionFirstLightLevel, 0.0, 100.0); ::sax::Converter::convertDouble( aStrBuffer, fExtrusionFirstLightLevel, @@ -4540,6 +4543,8 @@ static void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Referenc double fExtrusionSecondLightLevel = 0; if ( rProp.Value >>= fExtrusionSecondLightLevel ) { + fExtrusionSecondLightLevel = + std::clamp(fExtrusionSecondLightLevel, 0.0, 100.0); ::sax::Converter::convertDouble( aStrBuffer, fExtrusionSecondLightLevel,