From fbb6c07b4c8168ab1519ac73cfacd493649d4884 Mon Sep 17 00:00:00 2001 From: Regina Henschel Date: Sat, 8 Sep 2018 00:41:47 +0200 Subject: [PATCH] tdf#119392 write bitfield in order The view uses the SdrLayerIDSet bitfield in layer ID order. But file format knows no layer IDs and on loading the bitfield is interpreted in the layer order given by element. Therefore reorder the bits on saving according , which is order in SdrLayerAdmin. Change-Id: Id349dc7f42338e35ca8cc3b6409d061213b01691 --- include/svx/svdlayer.hxx | 4 ++ include/svx/svdsob.hxx | 4 +- sd/qa/unit/data/tdf119392_InsertLayer.odg | Bin 0 -> 12765 bytes sd/qa/unit/misc-tests.cxx | 47 ++++++++++++++ sd/source/ui/view/frmview.cxx | 7 +- svx/source/svdraw/svdlayer.cxx | 74 ++++++++++++++-------- 6 files changed, 103 insertions(+), 33 deletions(-) create mode 100644 sd/qa/unit/data/tdf119392_InsertLayer.odg diff --git a/include/svx/svdlayer.hxx b/include/svx/svdlayer.hxx index 5959ba4dba55..8437cb44a63b 100644 --- a/include/svx/svdlayer.hxx +++ b/include/svx/svdlayer.hxx @@ -164,6 +164,10 @@ public: void getVisibleLayersODF( SdrLayerIDSet& rOutSet) const; void getPrintableLayersODF( SdrLayerIDSet& rOutSet) const; void getLockedLayersODF( SdrLayerIDSet& rOutSet) const; + + // Generates a bitfield for settings.xml from the SdrLayerIDSet. + // Output is a uno sequence of BYTE (which is 'short' in API). + void QueryValue(const SdrLayerIDSet& rViewLayerSet, css::uno::Any& rAny); }; #endif // INCLUDED_SVX_SVDLAYER_HXX diff --git a/include/svx/svdsob.hxx b/include/svx/svdsob.hxx index 21ef323040ff..3d3f8c03488d 100644 --- a/include/svx/svdsob.hxx +++ b/include/svx/svdsob.hxx @@ -82,11 +82,9 @@ public: void operator&=(const SdrLayerIDSet& r2ndSet); - // initialize this set with a uno sequence of sal_Int8 + // initialize this set with a uno sequence of sal_Int8 (e.g. as stored in settings.xml) void PutValue(const css::uno::Any & rAny); - // returns a uno sequence of sal_Int8 - void QueryValue(css::uno::Any & rAny) const; }; #endif // INCLUDED_SVX_SVDSOB_HXX diff --git a/sd/qa/unit/data/tdf119392_InsertLayer.odg b/sd/qa/unit/data/tdf119392_InsertLayer.odg new file mode 100644 index 0000000000000000000000000000000000000000..617624ce9b601b3241b8f2b07480a3b1402718e4 GIT binary patch literal 12765 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 literal 0 HcmV?d00001 diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx index 43828255e0c0..270a0f527178 100644 --- a/sd/qa/unit/misc-tests.cxx +++ b/sd/qa/unit/misc-tests.cxx @@ -66,6 +66,7 @@ public: void testTdf38225(); void testTdf101242_ODF(); void testTdf101242_settings(); + void testTdf119392(); CPPUNIT_TEST_SUITE(SdMiscTest); CPPUNIT_TEST(testTdf96206); @@ -77,6 +78,7 @@ public: CPPUNIT_TEST(testTdf38225); CPPUNIT_TEST(testTdf101242_ODF); CPPUNIT_TEST(testTdf101242_settings); + CPPUNIT_TEST(testTdf119392); CPPUNIT_TEST_SUITE_END(); virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override @@ -488,6 +490,51 @@ void SdMiscTest::testTdf101242_settings() xDocShRef->DoClose(); } +void SdMiscTest::testTdf119392() +{ + // Loads a document which has two user layers "V--" and "V-L". Inserts a new layer "-P-" between them. + // Checks, that the bitfields in the saved file have the bits in the correct order. + + sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("/sd/qa/unit/data/tdf119392_InsertLayer.odg"), ODG); + CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is()); + // Insert layer "-P-", not visible, printable, not locked + SdrView* pView = xDocShRef -> GetViewShell()->GetView(); + pView -> InsertNewLayer("-P-", 6); // 0..4 standard layer, 5 layer "V--" + SdrPageView* pPageView = pView -> GetSdrPageView(); + pPageView -> SetLayerVisible("-P-", false); + pPageView -> SetLayerPrintable("-P-", true); + pPageView -> SetLayerLocked("-P-", false); + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + save(xDocShRef.get(), getFormat(ODG), aTempFile ); + + // Verify correct bit order in bitfield in the items in settings.xml + xmlDocPtr pXmlDoc = parseExport(aTempFile, "settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc); + const OString sPathStart("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry"); + // First Byte is in order 'V-L -P- V-- measurelines controls backgroundobjects background layout' + // Bits need to be: visible=10111111=0xbf=191 printable=01011111=0x5f=95 locked=10000000=0x80=128 + // The values in file are Base64 encoded. + OUString sBase64; + uno::Sequence aDecodedSeq; + sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='VisibleLayers']"); + CPPUNIT_ASSERT_MESSAGE( "Item VisibleLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL( 0xbF, static_cast(aDecodedSeq[0]) & 0xff); // & 0xff forces unambigious types for CPPUNIT_ASSERT_EQUAL + + sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='PrintableLayers']"); + CPPUNIT_ASSERT_MESSAGE( "Item PrintableLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL( 0x5f, static_cast(aDecodedSeq[0]) & 0xff); + + sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='LockedLayers']"); + CPPUNIT_ASSERT_MESSAGE( "Item LockedLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL( 0x80, static_cast(aDecodedSeq[0]) & 0xff); + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdMiscTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/source/ui/view/frmview.cxx b/sd/source/ui/view/frmview.cxx index 1232d9f23692..aa4f7af1a51e 100644 --- a/sd/source/ui/view/frmview.cxx +++ b/sd/source/ui/view/frmview.cxx @@ -395,14 +395,15 @@ void FrameView::WriteUserDataSequence ( css::uno::Sequence < css::beans::Propert aUserData.addValue( sUNO_View_EliminatePolyPointLimitAngle, makeAny( static_cast(GetEliminatePolyPointLimitAngle()) ) ); aUserData.addValue( sUNO_View_IsEliminatePolyPoints, makeAny( IsEliminatePolyPoints() ) ); + SdrLayerAdmin& rLayerAdmin = getSdrModelFromSdrView().GetLayerAdmin(); Any aAny; - GetVisibleLayers().QueryValue( aAny ); + rLayerAdmin.QueryValue(GetVisibleLayers(), aAny); aUserData.addValue( sUNO_View_VisibleLayers, aAny ); - GetPrintableLayers().QueryValue( aAny ); + rLayerAdmin.QueryValue(GetPrintableLayers(), aAny); aUserData.addValue( sUNO_View_PrintableLayers, aAny ); - GetLockedLayers().QueryValue( aAny ); + rLayerAdmin.QueryValue(GetLockedLayers(), aAny); aUserData.addValue( sUNO_View_LockedLayers, aAny ); aUserData.addValue( sUNO_View_NoAttribs, makeAny( IsNoAttribs() ) ); diff --git a/svx/source/svdraw/svdlayer.cxx b/svx/source/svdraw/svdlayer.cxx index d17b61dbf1f0..b40f3fa0dc90 100644 --- a/svx/source/svdraw/svdlayer.cxx +++ b/svx/source/svdraw/svdlayer.cxx @@ -43,7 +43,7 @@ void SdrLayerIDSet::operator&=(const SdrLayerIDSet& r2ndSet) } } -/** initialize this set with a uno sequence of sal_Int8 +/** initialize this set with a uno sequence of sal_Int8 (e.g. as stored in settings.xml) */ void SdrLayerIDSet::PutValue( const css::uno::Any & rAny ) { @@ -67,32 +67,6 @@ void SdrLayerIDSet::PutValue( const css::uno::Any & rAny ) } } -/** returns a uno sequence of sal_Int8 -*/ -void SdrLayerIDSet::QueryValue( css::uno::Any & rAny ) const -{ - sal_Int16 nNumBytesSet = 0; - sal_Int16 nIndex; - for( nIndex = 31; nIndex >= 00; nIndex-- ) - { - if( 0 != aData[nIndex] ) - { - nNumBytesSet = nIndex + 1; - break; - } - } - - css::uno::Sequence< sal_Int8 > aSeq( nNumBytesSet ); - - for( nIndex = 0; nIndex < nNumBytesSet; nIndex++ ) - { - aSeq[nIndex] = static_cast(aData[nIndex]); - } - - rAny <<= aSeq; -} - - SdrLayer::SdrLayer(SdrLayerID nNewID, const OUString& rNewName) : maName(rNewName), pModel(nullptr), nType(0), nID(nNewID) { @@ -366,5 +340,51 @@ void SdrLayerAdmin::getLockedLayersODF( SdrLayerIDSet& rOutSet) const } } + // Generates a bitfield for settings.xml from the SdrLayerIDSet. + // Output is a uno sequence of BYTE (which is 'short' in API). +void SdrLayerAdmin::QueryValue(const SdrLayerIDSet& rViewLayerSet, css::uno::Any& rAny) +{ + // tdf#119392 The SdrLayerIDSet in a view is ordered according LayerID, but in file + // the bitfield is interpreted in order of layers in . + // First generate a new bitfield based on rViewLayerSet in the needed order. + sal_uInt8 aTmp[32]; // 256 bits in settings.xml makes byte 0 to 31 + for (auto nIndex = 0; nIndex <32; nIndex++) + { + aTmp[nIndex] = 0; + } + sal_uInt8 nByteIndex = 0; + sal_uInt8 nBitpos = 0; + sal_uInt16 nLayerPos = 0; // Position of the layer in member aLayer and in in file + for( SdrLayer* pCurrentLayer : aLayer ) + { + SdrLayerID nCurrentID = pCurrentLayer->GetID(); + if ( rViewLayerSet.IsSet(nCurrentID) ) + { + nLayerPos = GetLayerPos(pCurrentLayer); + nByteIndex = nLayerPos / 8; + if (nByteIndex > 31) + continue; // skip position, if too large for bitfield + nBitpos = nLayerPos % 8; + aTmp[nByteIndex] |= (1 << nBitpos); + } + } + + // Second transform the bitfield to byte sequence, same as in previous version of QueryValue + sal_uInt8 nNumBytesSet = 0; + for( auto nIndex = 31; nIndex >= 0; nIndex--) + { + if( 0 != aTmp[nIndex] ) + { + nNumBytesSet = nIndex + 1; + break; + } + } + css::uno::Sequence< sal_Int8 > aSeq( nNumBytesSet ); + for( auto nIndex = 0; nIndex < nNumBytesSet; nIndex++ ) + { + aSeq[nIndex] = static_cast(aTmp[nIndex]); + } + rAny <<= aSeq; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- 2.17.0