include/sax/tools/converter.hxx | 7 ++++- sax/source/tools/converter.cxx | 35 +++++++++++++++++++---------- xmloff/source/style/GradientStyle.cxx | 11 +++++++-- xmloff/source/style/TransGradientStyle.cxx | 11 +++++++-- 4 files changed, 46 insertions(+), 18 deletions(-)
New commits: commit 693cefb59286daf6ff86f1db16f0d64b4b9b4588 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Mon May 18 18:43:51 2020 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Tue May 19 17:04:33 2020 +0200 tdf#89475 xmloff: ODF import/export: continue fixing draw:angle Continue what commit aadda5d17f6e422da143ea774f759bfc5f629c5b started wrt. unit-less draw:angle attributes in ODF >= 1.2: * ODF 1.3 files don't ever have unit-less draw:angle interpreted as 10th of degree * import unit-less draw:angle as degree, except if it's ODF 1.0/1.1 or it's ODF 1.2 written by OOo/LO < 7.0, then 10th of degree * export draw:angle with "deg", which LO 4.4 and newer can read; except if exporting ODF 1.0/1.1 or ODF 1.2 Extended (compatibility mode), then 10th of degree (unit-less) The only problem with this is that if you store a file as ODF 1.2 Extended (compatibility mode) and load it with LO 7.0 it will interpret the angle wrong, but nothing's perfect... Change-Id: I3771e6571afd40e44b6f7890dacf18c28841610f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94443 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/include/sax/tools/converter.hxx b/include/sax/tools/converter.hxx index 9f7f5b3df50f..e5e6d5764d0f 100644 --- a/include/sax/tools/converter.hxx +++ b/include/sax/tools/converter.hxx @@ -31,6 +31,7 @@ #include <rtl/ustrbuf.hxx> #include <com/sun/star/util/MeasureUnit.hpp> #include <tools/color.hxx> +#include <unotools/saveopt.hxx> namespace com::sun::star { namespace uno { @@ -146,10 +147,12 @@ public: static bool convertDouble(double& rValue, const OUString& rString); /** convert number, 10th of degrees with range [0..3600] to SVG angle */ - static void convertAngle(OUStringBuffer& rBuffer, sal_Int16 nAngle); + static void convertAngle(OUStringBuffer& rBuffer, sal_Int16 nAngle, + SvtSaveOptions::ODFSaneDefaultVersion nVersion); /** convert SVG angle to number, 10th of degrees with range [0..3600] */ - static bool convertAngle(sal_Int16& rAngle, OUString const& rString); + static bool convertAngle(sal_Int16& rAngle, OUString const& rString, + bool isWrongOOo10thDegAngle); /** convert double to XMLSchema-2 "duration" string; negative durations allowed */ static void convertDuration(OUStringBuffer& rBuffer, diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx index 9c19ef5d0b7d..ac6eba928526 100644 --- a/sax/source/tools/converter.cxx +++ b/sax/source/tools/converter.cxx @@ -623,21 +623,25 @@ bool Converter::convertDouble(double& rValue, const OUString& rString) } /** convert number, 10th of degrees with range [0..3600] to SVG angle */ -void Converter::convertAngle(OUStringBuffer& rBuffer, sal_Int16 const nAngle) +void Converter::convertAngle(OUStringBuffer& rBuffer, sal_Int16 const nAngle, + SvtSaveOptions::ODFSaneDefaultVersion const nVersion) { -#if 1 - // wrong, but backward compatible with OOo/LO < 4.4 - rBuffer.append(static_cast<sal_Int32>(nAngle)); -#else - // maybe in the future... (see other convertAngle) - double fAngle(double(nAngle) / 10.0); - ::sax::Converter::convertDouble(rBuffer, fAngle); - rBuffer.append("deg"); -#endif + if (nVersion < SvtSaveOptions::ODFSVER_012 || nVersion == SvtSaveOptions::ODFSVER_012_EXT_COMPAT) + { + // wrong, but backward compatible with OOo/LO < 4.4 + rBuffer.append(static_cast<sal_Int32>(nAngle)); + } + else + { // OFFICE-3774 tdf#89475 write valid ODF 1.2 angle; needs LO 4.4 to import + double fAngle(double(nAngle) / 10.0); + ::sax::Converter::convertDouble(rBuffer, fAngle); + rBuffer.append("deg"); + } } /** convert SVG angle to number, 10th of degrees with range [0..3600] */ -bool Converter::convertAngle(sal_Int16& rAngle, OUString const& rString) +bool Converter::convertAngle(sal_Int16& rAngle, OUString const& rString, + bool const isWrongOOo10thDegAngle) { // ODF 1.1 leaves it undefined what the number means, but ODF 1.2 says it's // degrees, while OOo has historically used 10th of degrees :( @@ -662,7 +666,14 @@ bool Converter::convertAngle(sal_Int16& rAngle, OUString const& rString) } else // no explicit unit { - nValue = fValue; // wrong, but backward compatible with OOo/LO < 4.4 + if (isWrongOOo10thDegAngle) + { + nValue = fValue; // wrong, but backward compatible with OOo/LO < 7.0 + } + else + { + nValue = fValue * 10.0; // ODF 1.2 + } } // limit to valid range [0..3600] nValue = nValue % 3600; diff --git a/xmloff/source/style/GradientStyle.cxx b/xmloff/source/style/GradientStyle.cxx index 97721db74ea3..3a8a5bedc444 100644 --- a/xmloff/source/style/GradientStyle.cxx +++ b/xmloff/source/style/GradientStyle.cxx @@ -22,6 +22,7 @@ #include <com/sun/star/awt/Gradient.hpp> #include <sax/tools/converter.hxx> +#include <comphelper/documentconstants.hxx> #include <xmloff/nmspmap.hxx> #include <xmloff/xmluconv.hxx> @@ -160,8 +161,14 @@ void XMLGradientStyleImport::importXML( break; case XML_TOK_GRADIENT_ANGLE: { + auto const cmp12(rImport.GetODFVersion().compareTo(ODFVER_012_TEXT)); bool const bSuccess = - ::sax::Converter::convertAngle(aGradient.Angle, rStrValue); + ::sax::Converter::convertAngle(aGradient.Angle, rStrValue, + // tdf#89475 try to detect borked OOo angles + (cmp12 < 0) || (cmp12 == 0 + && (rImport.isGeneratorVersionOlderThan(SvXMLImport::AOO_4x, SvXMLImport::LO_7x) + // also for AOO 4.x, assume there won't ever be a 4.2 + || rImport.getGeneratorVersion() == SvXMLImport::AOO_4x))); SAL_INFO_IF(!bSuccess, "xmloff.style", "failed to import draw:angle"); } break; @@ -260,7 +267,7 @@ void XMLGradientStyleExport::exportXML( // Angle if( aGradient.Style != awt::GradientStyle_RADIAL ) { - ::sax::Converter::convertAngle(aOut, aGradient.Angle); + ::sax::Converter::convertAngle(aOut, aGradient.Angle, rExport.getSaneDefaultVersion()); aStrValue = aOut.makeStringAndClear(); rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue ); } diff --git a/xmloff/source/style/TransGradientStyle.cxx b/xmloff/source/style/TransGradientStyle.cxx index 0dce37fcae3e..536ba39d26b3 100644 --- a/xmloff/source/style/TransGradientStyle.cxx +++ b/xmloff/source/style/TransGradientStyle.cxx @@ -22,6 +22,7 @@ #include <com/sun/star/awt/Gradient.hpp> #include <sax/tools/converter.hxx> +#include <comphelper/documentconstants.hxx> #include <xmloff/nmspmap.hxx> #include <xmloff/xmluconv.hxx> @@ -171,8 +172,14 @@ void XMLTransGradientStyleImport::importXML( break; case XML_TOK_GRADIENT_ANGLE: { + auto const cmp12(rImport.GetODFVersion().compareTo(ODFVER_012_TEXT)); bool const bSuccess = - ::sax::Converter::convertAngle(aGradient.Angle, rStrValue); + ::sax::Converter::convertAngle(aGradient.Angle, rStrValue, + // tdf#89475 try to detect borked OOo angles + (cmp12 < 0) || (cmp12 == 0 + && (rImport.isGeneratorVersionOlderThan(SvXMLImport::AOO_4x, SvXMLImport::LO_7x) + // also for AOO 4.x, assume there won't ever be a 4.2 + || rImport.getGeneratorVersion() == SvXMLImport::AOO_4x))); SAL_INFO_IF(!bSuccess, "xmloff.style", "failed to import draw:angle"); } break; @@ -265,7 +272,7 @@ void XMLTransGradientStyleExport::exportXML( // Angle if( aGradient.Style != awt::GradientStyle_RADIAL ) { - ::sax::Converter::convertAngle(aOut, aGradient.Angle); + ::sax::Converter::convertAngle(aOut, aGradient.Angle, rExport.getSaneDefaultVersion()); aStrValue = aOut.makeStringAndClear(); rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits