diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2020-05-18 18:43:51 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-05-19 17:04:33 +0200 |
commit | 693cefb59286daf6ff86f1db16f0d64b4b9b4588 (patch) | |
tree | 85ffc717387c77c159ac3dcc3111fb91d2fde7c2 /sax | |
parent | 34a513428d0786578c1c5f38fdc8a0fbd3b8f82f (diff) |
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.stahl@cib.de>
Diffstat (limited to 'sax')
-rw-r--r-- | sax/source/tools/converter.cxx | 35 |
1 files changed, 23 insertions, 12 deletions
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; |