include/svx/svdmodel.hxx | 7 - svx/qa/unit/svdraw.cxx | 89 +++++++++++++++++++++- svx/source/svdraw/svdmodel.cxx | 162 ++++++++++++++++++----------------------- 3 files changed, 161 insertions(+), 97 deletions(-)
New commits: commit b8b02686c8900ef9cab344480e0b0904e573c936 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Jun 24 17:56:50 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Jun 27 03:53:11 2021 +0200 svx: adds a test for SdrRectObj rendering into primitives This adds a new test that checks how a model with a rectangle object is being rendered / transformed into drawinglayer primitives. Change-Id: I81851e122f182ebe5ed8486fdab8d04bb8c9e68a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117886 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx index fa344d80acb4..b0e8ed70de9b 100644 --- a/svx/qa/unit/svdraw.cxx +++ b/svx/qa/unit/svdraw.cxx @@ -23,16 +23,20 @@ #include <drawinglayer/tools/primitive2dxmldump.hxx> #include <rtl/ustring.hxx> +#include <vcl/virdev.hxx> #include <svx/sdr/contact/displayinfo.hxx> #include <svx/sdr/contact/viewcontact.hxx> #include <svx/sdr/contact/viewobjectcontact.hxx> #include <svx/svdpage.hxx> +#include <svx/svdorect.hxx> #include <svx/unopage.hxx> -#include <vcl/virdev.hxx> +#include <svx/unoapi.hxx> +#include <svx/svdview.hxx> +#include <svx/xlineit0.hxx> +#include <svx/xlnstwit.hxx> #include <comphelper/propertyvalue.hxx> #include <sfx2/viewsh.hxx> -#include <svx/svdview.hxx> -#include <svx/unoapi.hxx> +#include <svl/itempool.hxx> #include <sdr/contact/objectcontactofobjlistpainter.hxx> @@ -241,6 +245,85 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testTextEditEmptyGrabBag) // old text. CPPUNIT_ASSERT(!aGrabBag.hasElements()); } + +CPPUNIT_TEST_FIXTURE(SvdrawTest, testRectangleObject) +{ + std::unique_ptr<SdrModel> pModel(new SdrModel(nullptr, nullptr, true)); + pModel->GetItemPool().FreezeIdRanges(); + + rtl::Reference<SdrPage> pPage(new SdrPage(*pModel, false)); + pPage->SetSize(Size(1000, 1000)); + pModel->InsertPage(pPage.get(), 0); + + tools::Rectangle aSize(Point(), Size(100, 100)); + auto* pRectangle = new SdrRectObj(*pModel, aSize); + pPage->NbcInsertObject(pRectangle); + pRectangle->SetMergedItem(XLineStyleItem(drawing::LineStyle_SOLID)); + pRectangle->SetMergedItem(XLineStartWidthItem(200)); + + ScopedVclPtrInstance<VirtualDevice> aVirtualDevice; + aVirtualDevice->SetOutputSize(Size(2000, 2000)); + + SdrView aView(*pModel, aVirtualDevice); + aView.hideMarkHandles(); + aView.ShowSdrPage(pPage.get()); + + sdr::contact::ObjectContactOfObjListPainter aObjectContact(*aVirtualDevice, + { pPage->GetObj(0) }, nullptr); + const sdr::contact::ViewObjectContact& rDrawPageVOContact + = pPage->GetViewContact().GetViewObjectContact(aObjectContact); + + sdr::contact::DisplayInfo aDisplayInfo; + drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence + = rDrawPageVOContact.getPrimitive2DSequenceHierarchy(aDisplayInfo); + + drawinglayer::Primitive2dXmlDump aDumper; + xmlDocUniquePtr pXmlDoc = aDumper.dumpAndParse(xPrimitiveSequence); + + assertXPath(pXmlDoc, "/primitive2D", 1); + + OString aBasePath("/primitive2D/sdrrectangle/polypolygoncolor"); + assertXPath(pXmlDoc, aBasePath, "color", "#729fcf"); + + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "height", + "99"); // weird Rectangle is created with size 100 + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "width", "99"); + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "minx", "0"); + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "miny", "0"); + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "maxx", "99"); + assertXPath(pXmlDoc, aBasePath + "/polypolygon", "maxy", "99"); + + aBasePath = "/primitive2D/sdrrectangle/polypolygoncolor/polypolygon/polygon"; + + assertXPath(pXmlDoc, aBasePath + "/point", 5); + assertXPath(pXmlDoc, aBasePath + "/point[1]", "x", "49.5"); // hmm, weird, why? + assertXPath(pXmlDoc, aBasePath + "/point[1]", "y", "99"); + assertXPath(pXmlDoc, aBasePath + "/point[2]", "x", "0"); + assertXPath(pXmlDoc, aBasePath + "/point[2]", "y", "99"); + assertXPath(pXmlDoc, aBasePath + "/point[3]", "x", "0"); + assertXPath(pXmlDoc, aBasePath + "/point[3]", "y", "0"); + assertXPath(pXmlDoc, aBasePath + "/point[4]", "x", "99"); + assertXPath(pXmlDoc, aBasePath + "/point[4]", "y", "0"); + assertXPath(pXmlDoc, aBasePath + "/point[5]", "x", "99"); + assertXPath(pXmlDoc, aBasePath + "/point[5]", "y", "99"); + + aBasePath = "/primitive2D/sdrrectangle/polygonstroke"; + assertXPath(pXmlDoc, aBasePath, 1); + + assertXPath(pXmlDoc, aBasePath + "/line", "color", "#3465a4"); + assertXPath(pXmlDoc, aBasePath + "/line", "width", "0"); + assertXPath(pXmlDoc, aBasePath + "/line", "linejoin", "Round"); + assertXPath(pXmlDoc, aBasePath + "/line", "linecap", "BUTT"); + + assertXPathContent(pXmlDoc, aBasePath + "/polygon", "49.5,99 0,99 0,0 99,0 99,99"); + + assertXPath(pXmlDoc, aBasePath + "/stroke", "fulldotdashlen", "0"); + + pPage->RemoveObject(0); + + SdrObject* pObject(pRectangle); + SdrObject::Free(pObject); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit f15d50b5ff6f0c8ed1a647a4efa92f5c67077326 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Fri Jun 25 21:06:27 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Jun 27 03:52:58 2021 +0200 svx: clean-up, init in constructor, rename master pages variable - maMaPag to maMasterPages - cleanup the constructor variable initialization - change degree chart from define to const variable Change-Id: Idc607b8b386855b90001ed389df2c7849969ee86 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117887 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/include/svx/svdmodel.hxx b/include/svx/svdmodel.hxx index 5a7aadd7b65a..c681c4878a42 100644 --- a/include/svx/svdmodel.hxx +++ b/include/svx/svdmodel.hxx @@ -48,7 +48,7 @@ class OutputDevice; #include <unordered_set> #endif -#define DEGREE_CHAR u'\x00B0' /* U+00B0 DEGREE SIGN */ +constexpr const sal_Unicode DEGREE_CHAR = u'\x00B0'; /* U+00B0 DEGREE SIGN */ class SdrOutliner; class SdrLayerAdmin; @@ -162,7 +162,7 @@ private: std::unordered_set< const SdrObject* > maAllIncarnatedObjects; #endif protected: - std::vector<rtl::Reference<SdrPage>> maMaPag; // master pages + std::vector<rtl::Reference<SdrPage>> maMasterPages; std::vector<rtl::Reference<SdrPage>> maPages; std::function<void(std::unique_ptr<SdrUndoAction>)> m_aUndoLink; // link to a NotifyUndo-Handler Size m_aMaxObjSize; // e.g. for auto-growing text @@ -176,8 +176,7 @@ protected: std::unique_ptr<SdrLayerAdmin> m_pLayerAdmin; rtl::Reference<SfxItemPool> m_pItemPool; - comphelper::IEmbeddedHelper* - m_pEmbeddedHelper; // helper for embedded objects to get rid of the SfxObjectShell + comphelper::IEmbeddedHelper* m_pEmbeddedHelper; // helper for embedded objects to get rid of the SfxObjectShell std::unique_ptr<SdrOutliner> m_pDrawOutliner; // an Outliner for outputting text std::unique_ptr<SdrOutliner> m_pHitTestOutliner;// an Outliner for the HitTest std::unique_ptr<SdrOutliner> m_pChainingOutliner; // an Outliner for chaining overflowing text diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index e8044ec2fda2..f46a34eaf6ec 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -82,95 +82,80 @@ struct SdrModelImpl { SfxUndoManager* mpUndoManager; SdrUndoFactory* mpUndoFactory; - bool mbAnchoredTextOverflowLegacy; // tdf#99729 compatibility flag -}; + SdrModelImpl() + : mpUndoManager(nullptr) + , mpUndoFactory(nullptr) + , mbAnchoredTextOverflowLegacy(false) + {} +}; -SdrModel::SdrModel( - SfxItemPool* pPool, - ::comphelper::IEmbeddedHelper* _pEmbeddedHelper, - bool bDisablePropertyFiles) -: -#ifdef DBG_UTIL - // SdrObjectLifetimeWatchDog: - maAllIncarnatedObjects(), -#endif - maMaPag(), - maPages() -{ - mpImpl.reset(new SdrModelImpl); - mpImpl->mpUndoManager=nullptr; - mpImpl->mpUndoFactory=nullptr; - mpImpl->mbAnchoredTextOverflowLegacy = false; - mbInDestruction = false; - m_aObjUnit=SdrEngineDefaults::GetMapFraction(); - m_eObjUnit=SdrEngineDefaults::GetMapUnit(); - m_eUIUnit=FieldUnit::MM; - m_aUIScale=Fraction(1,1); - m_nUIUnitDecimalMark=0; - m_pLayerAdmin=nullptr; - m_pItemPool=pPool; - m_bIsWriter=true; - m_pEmbeddedHelper=_pEmbeddedHelper; - m_pDrawOutliner=nullptr; - m_pHitTestOutliner=nullptr; - m_pRefOutDev=nullptr; - m_pDefaultStyleSheet=nullptr; - mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj = nullptr; - m_pLinkManager=nullptr; - m_nMaxUndoCount=16; - m_pCurrentUndoGroup=nullptr; - m_nUndoLevel=0; - mbUndoEnabled=true; - mbChanged = false; - m_bPagNumsDirty=false; - m_bMPgNumsDirty=false; - m_bTransportContainer = false; - m_bSwapGraphics=false; - m_bPasteResize=false; - m_bReadOnly=false; - m_nDefaultTabulator=0; - m_bTransparentTextFrames=false; - m_bStarDrawPreviewMode = false; - mpForbiddenCharactersTable = nullptr; - mbModelLocked = false; - mpOutlinerCache = nullptr; - mbKernAsianPunctuation = false; - mbAddExtLeading = false; - mnHandoutPageCount = 0; - - mbDisableTextEditUsesCommonUndoManager = false; +SdrModel::SdrModel(SfxItemPool* pPool, comphelper::IEmbeddedHelper* pEmbeddedHelper, bool bDisablePropertyFiles) + : m_aObjUnit(SdrEngineDefaults::GetMapFraction()) + , m_eObjUnit(SdrEngineDefaults::GetMapUnit()) + , m_eUIUnit(FieldUnit::MM) + , m_aUIScale(Fraction(1,1)) + , m_nUIUnitDecimalMark(0) + , m_pLayerAdmin(new SdrLayerAdmin) + , m_pItemPool(pPool) + , m_pEmbeddedHelper(pEmbeddedHelper) + , mnDefTextHgt(SdrEngineDefaults::GetFontHeight()) + , m_pRefOutDev(nullptr) + , m_pDefaultStyleSheet(nullptr) + , mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(nullptr) + , m_pLinkManager(nullptr) + , m_nUndoLevel(0) + , m_bIsWriter(true) + , mbUndoEnabled(true) + , mbChanged(false) + , m_bPagNumsDirty(false) + , m_bMPgNumsDirty(false) + , m_bTransportContainer(false) + , m_bReadOnly(false) + , m_bTransparentTextFrames(false) + , m_bSwapGraphics(false) + , m_bPasteResize(false) + , m_bStarDrawPreviewMode(false) + , mbDisableTextEditUsesCommonUndoManager(false) + , m_nDefaultTabulator(0) + , m_nMaxUndoCount(16) + , m_pTextChain(new TextChain) + , mpImpl(new SdrModelImpl) + , mnCharCompressType(CharCompressType::NONE) + , mnHandoutPageCount(0) + , mbModelLocked(false) + , mbKernAsianPunctuation(false) + , mbAddExtLeading(false) + , mbInDestruction(false) +{ if (!utl::ConfigManager::IsFuzzing()) - mnCharCompressType = static_cast<CharCompressType>(officecfg::Office::Common::AsianLayout::CompressCharacterDistance:: - get()); - else - mnCharCompressType = CharCompressType::NONE; + { + mnCharCompressType = static_cast<CharCompressType>( + officecfg::Office::Common::AsianLayout::CompressCharacterDistance::get()); + } - if ( pPool == nullptr ) + if (m_pItemPool == nullptr) { - m_pItemPool=new SdrItemPool(nullptr); + m_pItemPool = new SdrItemPool(nullptr); // Outliner doesn't have its own Pool, so use the EditEngine's rtl::Reference<SfxItemPool> pOutlPool=EditEngine::CreatePool(); // OutlinerPool as SecondaryPool of SdrPool m_pItemPool->SetSecondaryPool(pOutlPool.get()); // remember that I created both pools myself - m_bIsWriter=false; + m_bIsWriter = false; } m_pItemPool->SetDefaultMetric(m_eObjUnit); // using static SdrEngineDefaults only if default SvxFontHeight item is not available const SfxPoolItem* pPoolItem = m_pItemPool->GetPoolDefaultItem( EE_CHAR_FONTHEIGHT ); - if ( pPoolItem ) + if (pPoolItem) mnDefTextHgt = static_cast<const SvxFontHeightItem*>(pPoolItem)->GetHeight(); - else - mnDefTextHgt = SdrEngineDefaults::GetFontHeight(); m_pItemPool->SetPoolDefaultItem( makeSdrTextWordWrapItem( false ) ); SetTextDefaults(); - m_pLayerAdmin.reset(new SdrLayerAdmin); m_pLayerAdmin->SetModel(this); ImpSetUIUnit(); @@ -187,16 +172,11 @@ SdrModel::SdrModel( m_pChainingOutliner = SdrMakeOutliner( OutlinerMode::TextObject, *this ); ImpSetOutlinerDefaults(m_pChainingOutliner.get(), true); - // Make a TextChain - m_pTextChain.reset(new TextChain); - /* End Text Chaining related code */ - ImpCreateTables(bDisablePropertyFiles || utl::ConfigManager::IsFuzzing()); } SdrModel::~SdrModel() { - mbInDestruction = true; Broadcast(SdrHint(SdrHintKind::ModelCleared)); @@ -591,7 +571,7 @@ void SdrModel::ClearModel(bool bCalledFromDestructor) { DeleteMasterPage( static_cast<sal_uInt16>(i) ); } - maMaPag.clear(); + maMasterPages.clear(); MasterPageListChanged(); m_pLayerAdmin->ClearLayers(); @@ -1175,10 +1155,10 @@ void SdrModel::RecalcPageNums(bool bMaster) { if(bMaster) { - sal_uInt16 nCount=sal_uInt16(maMaPag.size()); + sal_uInt16 nCount=sal_uInt16(maMasterPages.size()); sal_uInt16 i; for (i=0; i<nCount; i++) { - SdrPage* pPg = maMaPag[i].get(); + SdrPage* pPg = maMasterPages[i].get(); pPg->SetPageNum(i); } m_bMPgNumsDirty=false; @@ -1197,9 +1177,11 @@ void SdrModel::RecalcPageNums(bool bMaster) void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos) { - sal_uInt16 nCount=GetPageCount(); - if (nPos>nCount) nPos=nCount; - maPages.insert(maPages.begin()+nPos,pPage); + sal_uInt16 nCount = GetPageCount(); + if (nPos > nCount) + nPos = nCount; + + maPages.insert(maPages.begin() + nPos, pPage); PageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); @@ -1250,7 +1232,7 @@ void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) { sal_uInt16 nCount=GetMasterPageCount(); if (nPos>nCount) nPos=nCount; - maMaPag.insert(maMaPag.begin()+nPos,pPage); + maMasterPages.insert(maMasterPages.begin()+nPos,pPage); MasterPageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); @@ -1271,8 +1253,8 @@ void SdrModel::DeleteMasterPage(sal_uInt16 nPgNum) rtl::Reference<SdrPage> SdrModel::RemoveMasterPage(sal_uInt16 nPgNum) { - rtl::Reference<SdrPage> pRetPg = std::move(maMaPag[nPgNum]); - maMaPag.erase(maMaPag.begin()+nPgNum); + rtl::Reference<SdrPage> pRetPg = std::move(maMasterPages[nPgNum]); + maMasterPages.erase(maMasterPages.begin()+nPgNum); MasterPageListChanged(); if(pRetPg) @@ -1297,12 +1279,12 @@ rtl::Reference<SdrPage> SdrModel::RemoveMasterPage(sal_uInt16 nPgNum) void SdrModel::MoveMasterPage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) { - rtl::Reference<SdrPage> pPg = std::move(maMaPag[nPgNum]); - maMaPag.erase(maMaPag.begin()+nPgNum); + rtl::Reference<SdrPage> pPg = std::move(maMasterPages[nPgNum]); + maMasterPages.erase(maMasterPages.begin()+nPgNum); MasterPageListChanged(); if (pPg) { pPg->SetInserted(false); - maMaPag.insert(maMaPag.begin()+nNewPos,pPg); + maMasterPages.insert(maMasterPages.begin()+nNewPos,pPg); MasterPageListChanged(); } m_bMPgNumsDirty=true; @@ -1478,7 +1460,7 @@ void SdrModel::Merge(SdrModel& rSourceModel, // Now append all of them to the end of the DstModel. // Don't use InsertMasterPage(), because everything is // inconsistent until all are in. - maMaPag.insert(maMaPag.begin()+nDstMasterPageCnt, pPg); + maMasterPages.insert(maMasterPages.begin()+nDstMasterPageCnt, pPg); MasterPageListChanged(); pPg->SetInserted(); m_bMPgNumsDirty=true; @@ -1833,19 +1815,19 @@ TextChain *SdrModel::GetTextChain() const const SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) const { - DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)"); - return maMaPag[nPgNum].get(); + DBG_ASSERT(nPgNum < maMasterPages.size(), "SdrModel::GetMasterPage: Access out of range (!)"); + return maMasterPages[nPgNum].get(); } SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) { - DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)"); - return maMaPag[nPgNum].get(); + DBG_ASSERT(nPgNum < maMasterPages.size(), "SdrModel::GetMasterPage: Access out of range (!)"); + return maMasterPages[nPgNum].get(); } sal_uInt16 SdrModel::GetMasterPageCount() const { - return sal_uInt16(maMaPag.size()); + return sal_uInt16(maMasterPages.size()); } void SdrModel::MasterPageListChanged() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits