From bc06737408a840daad981c95799d9da92cf2ef0a Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Wed, 12 Mar 2014 22:21:16 +0100 Subject: fdo#75872: ODF import: fix up graphics defaults stroke/fill colors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These have changed a few times, notably in LO 4.0 with commit 895890563cb0cc5fa872bdfd06918a46cdda172d and AOO 4.0 with commit c0eb5e7772c848806db8ab461f77f9549c1d8b2b; unfortunately historic OOo and current AOO do not write the values into ODF files, whereas LO 4.x does (probably by accident, since 45d3577bc5726eee44f491fd30a7f11dc428431a by design). Try to set the defaults depending on the generator; since the defaults are not specified by ODF they are implementation defined anyway so this should be OK. Change-Id: I1270d6e0cdeea5cb493724a0998f661a0cf644f1 (cherry picked from commit 92cb21ebeda98c5193c50c4cf7ef3d60611c2a52) Reviewed-on: https://gerrit.libreoffice.org/8563 Reviewed-by: Miklos Vajna Tested-by: Miklos Vajna (cherry picked from commit 0fc0d2579f6f3e26cd8b56da730184d6933cc8fe) Reviewed-on: https://gerrit.libreoffice.org/8570 Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara Reviewed-by: Andras Timar --- include/xmloff/xmlimp.hxx | 7 ++- sw/qa/extras/odfimport/data/fdo75872_aoo40.odt | Bin 0 -> 8625 bytes sw/qa/extras/odfimport/data/fdo75872_ooo33.odt | Bin 0 -> 8348 bytes sw/qa/extras/odfimport/odfimport.cxx | 20 +++++++++ xmloff/source/core/xmlimp.cxx | 25 ++++++++++- xmloff/source/draw/XMLGraphicsDefaultStyle.cxx | 59 ++++++++++++++++++++++++- 6 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 sw/qa/extras/odfimport/data/fdo75872_aoo40.odt create mode 100644 sw/qa/extras/odfimport/data/fdo75872_ooo33.odt diff --git a/include/xmloff/xmlimp.hxx b/include/xmloff/xmlimp.hxx index 6005677ff252..534158ae9c2c 100644 --- a/include/xmloff/xmlimp.hxx +++ b/include/xmloff/xmlimp.hxx @@ -420,9 +420,14 @@ public: static const sal_uInt16 OOo_32x = 32; static const sal_uInt16 OOo_33x = 33; static const sal_uInt16 OOo_34x = 34; + // for AOO, no release overlaps with OOo, so continue OOo version numbers + static const sal_uInt16 AOO_40x = 40; + static const sal_uInt16 AOO_4x = 41; static const sal_uInt16 LO_flag = 0x100; static const sal_uInt16 LO_3x = 30 | LO_flag; - static const sal_uInt16 LO_4x = 40 | LO_flag; + static const sal_uInt16 LO_41x = 41 | LO_flag; + static const sal_uInt16 LO_42x = 42 | LO_flag; + static const sal_uInt16 LO_4x = 43 | LO_flag; static const sal_uInt16 ProductVersionUnknown = SAL_MAX_UINT16; /** depending on whether the generator version indicates LO, compare diff --git a/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt b/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt new file mode 100644 index 000000000000..549a56706de9 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt b/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt new file mode 100644 index 000000000000..4cc3de7cc9aa Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt differ diff --git a/sw/qa/extras/odfimport/odfimport.cxx b/sw/qa/extras/odfimport/odfimport.cxx index 87e7402fda21..879513bfbbc2 100644 --- a/sw/qa/extras/odfimport/odfimport.cxx +++ b/sw/qa/extras/odfimport/odfimport.cxx @@ -278,6 +278,26 @@ DECLARE_ODFIMPORT_TEST(testFdo56272, "fdo56272.odt") CPPUNIT_ASSERT_EQUAL(sal_Int32(422), xShape->getPosition().Y); // Was -2371 } +DECLARE_ODFIMPORT_TEST(testFdo75872_ooo33, "fdo75872_ooo33.odt") +{ + // graphics default style: line color and fill color changed + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_BLACK), + getProperty(xShape, "LineColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(RGB_COLORDATA(153, 204, 255)), + getProperty(xShape, "FillColor")); +} + +DECLARE_ODFIMPORT_TEST(testFdo75872_aoo40, "fdo75872_aoo40.odt") +{ + // graphics default style: line color and fill color changed + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(RGB_COLORDATA(128, 128, 128)), + getProperty(xShape, "LineColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(RGB_COLORDATA(0xCF, 0xE7, 0xF5)), + getProperty(xShape, "FillColor")); +} + DECLARE_ODFIMPORT_TEST(testFdo55814, "fdo55814.odt") { uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index c46757f70b5d..2127d0eb7bdc 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -193,7 +193,20 @@ getBuildIdsProperty(uno::Reference const& xImportInfo) else { SAL_INFO_IF('4' != loVersion[0], "xmloff.core", "unknown LO version: " << loVersion); - mnGeneratorVersion = SvXMLImport::LO_4x; + if ('4' == loVersion[0] && loVersion.getLength() > 1 + && (loVersion[1] == '0' || loVersion[1] == '1')) + { + mnGeneratorVersion = SvXMLImport::LO_41x; // 4.0/4.1 + } + else if ('4' == loVersion[0] + && loVersion.getLength() > 1 && loVersion[1] == '2') + { + mnGeneratorVersion = SvXMLImport::LO_42x; // 4.2 + } + else + { + mnGeneratorVersion = SvXMLImport::LO_4x; + } } return; // ignore buildIds } @@ -230,6 +243,16 @@ getBuildIdsProperty(uno::Reference const& xImportInfo) { mnGeneratorVersion = SvXMLImport::OOo_34x; } + else if (nUPD == 400) + { + mnGeneratorVersion = SvXMLImport::AOO_40x; + } + else if (nUPD >= 410) + { + // effectively this means "latest", see use + // in XMLGraphicsDefaultStyle::SetDefaults()! + mnGeneratorVersion = SvXMLImport::AOO_4x; + } } } diff --git a/xmloff/source/draw/XMLGraphicsDefaultStyle.cxx b/xmloff/source/draw/XMLGraphicsDefaultStyle.cxx index d5a2f79289d6..aae02d40bae9 100644 --- a/xmloff/source/draw/XMLGraphicsDefaultStyle.cxx +++ b/xmloff/source/draw/XMLGraphicsDefaultStyle.cxx @@ -17,7 +17,12 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include + #include + +#include + #include #include #include @@ -25,7 +30,6 @@ #include #include "XMLShapePropertySetContext.hxx" -#include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -76,6 +80,14 @@ SvXMLImportContext *XMLGraphicsDefaultStyle::CreateChildContext( sal_uInt16 nPre return pContext; } +struct XMLPropertyByIndex { + sal_Int32 const m_nIndex; + XMLPropertyByIndex(sal_Int32 const nIndex) : m_nIndex(nIndex) {} + bool operator()(XMLPropertyState const& rProp) { + return m_nIndex == rProp.mnIndex; + } +}; + // This method is called for every default style void XMLGraphicsDefaultStyle::SetDefaults() { @@ -113,6 +125,51 @@ void XMLGraphicsDefaultStyle::SetDefaults() xDefaults->setPropertyValue("IsFollowingTextFlow", uno::makeAny(true)); } + bool const bIsAOO4( + GetImport().getGeneratorVersion() >= SvXMLImport::AOO_40x + && GetImport().getGeneratorVersion() <= SvXMLImport::AOO_4x); + + // fdo#75872: backward compatibility for pool defaults change + if (GetImport().isGeneratorVersionOlderThan( + SvXMLImport::AOO_40x, SvXMLImport::LO_42x) + // argh... it turns out that LO has also changed defaults for these + // since LO 4.0, and so even the _new_ AOO 4.0+ default needs + // special handling since AOO still does _not_ write it into the file + || bIsAOO4) + { + UniReference const pImpPrMap( + GetStyles()->GetImportPropertyMapper(GetFamily()) + ->getPropertySetMapper()); + sal_Int32 const nStrokeIndex( + pImpPrMap->GetEntryIndex(XML_NAMESPACE_SVG, "stroke-color", 0)); + if (std::find_if(GetProperties().begin(), GetProperties().end(), + XMLPropertyByIndex(nStrokeIndex)) == GetProperties().end()) + { + sal_Int32 const nStroke( + (bIsAOO4) ? RGB_COLORDATA(128, 128, 128) : COL_BLACK); + xDefaults->setPropertyValue("LineColor", makeAny(nStroke)); + } + sal_Int32 const nFillColor( (bIsAOO4) + ? RGB_COLORDATA(0xCF, 0xE7, 0xF5) : RGB_COLORDATA(153, 204, 255)); + sal_Int32 const nFillIndex( + pImpPrMap->GetEntryIndex(XML_NAMESPACE_DRAW, "fill-color", 0)); + if (std::find_if(GetProperties().begin(), GetProperties().end(), + XMLPropertyByIndex(nFillIndex)) == GetProperties().end()) + { + xDefaults->setPropertyValue("FillColor", makeAny(nFillColor)); + } + if (xInfo->hasPropertyByName("FillColor2")) + { + sal_Int32 const nFill2Index(pImpPrMap->GetEntryIndex( + XML_NAMESPACE_DRAW, "secondary-fill-color", 0)); + if (std::find_if(GetProperties().begin(), GetProperties().end(), + XMLPropertyByIndex(nFill2Index)) == GetProperties().end()) + { + xDefaults->setPropertyValue("FillColor2", makeAny(nFillColor)); + } + } + } + FillPropertySet( xDefaults ); } -- cgit v1.2.3