libreoffice/bnc-945047.diff
2015-12-15 18:15:32 +00:00

105 lines
4.2 KiB
Diff

From 0b6c9ddce0478bbedc36e8531f31b154bbce661c Mon Sep 17 00:00:00 2001
From: Mike Kaganski <mike.kaganski@collabora.com>
Date: Thu, 3 Dec 2015 19:05:03 +1000
Subject: [PATCH] tdf#96206: Avoid scaling objects while copying to clipboard
... to prevent duplicating masters on slide copy-paste.
Also fixed a 10-year copy-paste error (pRefPage wasn't replaced
with pNPage).
Fixed argument evaluation order issue (aStream.GetEndOfData()
depends on Flush() but doesn't call it, so will return incorrect
result if called before aStream.GetBuffer()).
Replaced compare of hashes with results of stringify(),
because it removes useless overhead (hashes are calculated from
stringify() anyway, and are not cached anywhere).
Removed Flush() called from SvMemoryStream::GetBuffer(), because
it calls GetData(), which calls Flush() itself.
Change-Id: Ia46d4e9a017fc628d424949a9d229045a249a4ca
---
sd/source/core/drawdoc3.cxx | 22 ++++++++++++++++------
svx/source/svdraw/svdobj.cxx | 1 +
tools/source/stream/stream.cxx | 1 -
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx
index 3f966e8..cb15650 100644
--- a/sd/source/core/drawdoc3.cxx
+++ b/sd/source/core/drawdoc3.cxx
@@ -51,6 +51,7 @@
#include "strmname.h"
#include "anminfo.hxx"
#include "customshowlist.hxx"
+#include "sdxfer.hxx"
#include "../ui/inc/unmovss.hxx"
#include "../ui/inc/unchss.hxx"
@@ -110,7 +111,7 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc
{
// Ignore Layouts with "Default" these seem to be special - in the sense that there are lot of assumption all over Impress
// about this
- if( bRenameDuplicates && aTest != OUString( SdResId( STR_LAYOUT_DEFAULT_NAME ) ) && pTestPage->getHash() != pBMMPage->getHash() )
+ if( bRenameDuplicates && aTest != OUString( SdResId( STR_LAYOUT_DEFAULT_NAME ) ) && pTestPage->stringify() != pBMMPage->stringify() )
{
pBookmarkDoc->RenameLayoutTemplate( pBMMPage->GetLayoutName(), OUString(pBMMPage->GetName())+=OUString("_") );
aLayout = pBMMPage->GetName();
@@ -438,17 +439,26 @@ bool SdDrawDocument::InsertBookmarkAsPage(
sal_Int32 nNRight = pNPage->GetRgtBorder();
sal_Int32 nNUpper = pNPage->GetUppBorder();
sal_Int32 nNLower = pNPage->GetLwrBorder();
- Orientation eNOrient = pRefPage->GetOrientation();
+ Orientation eNOrient = pNPage->GetOrientation();
// Adapt page size and margins to those of the later pages?
pRefPage = GetSdPage(nSdPageCount - 1, PK_STANDARD);
if( bNoDialogs )
{
- if( rBookmarkList.empty() )
- bScaleObjects = pRefPage->IsScaleObjects();
- else
- bScaleObjects = true;
+ // If this is clipboard, then no need to scale objects:
+ // this will make copied masters to differ from the originals,
+ // and thus InsertBookmarkAsPage_FindDuplicateLayouts will
+ // duplicate masters on insert to same document
+ bool bIsClipBoard = (SD_MOD()->pTransferClip &&
+ SD_MOD()->pTransferClip->GetWorkDocument() == this);
+ if (!bIsClipBoard)
+ {
+ if (rBookmarkList.empty())
+ bScaleObjects = pRefPage->IsScaleObjects();
+ else
+ bScaleObjects = true;
+ }
}
else
{
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index b6d3827..b712850 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -1776,6 +1776,7 @@ OString SdrObject::stringify() const
SfxItemSet aSet(GetMergedItemSet());
aSet.InvalidateDefaultItems();
aSet.Store(aStream, true);
+ aStream.Flush(); // for correct results from aStream.GetEndOfData()
aString.append(static_cast<const char *>(aStream.GetBuffer()), aStream.GetEndOfData());
return aString.makeStringAndClear();
diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx
index bb6d21e..17bdcd1 100644
--- a/tools/source/stream/stream.cxx
+++ b/tools/source/stream/stream.cxx
@@ -1723,7 +1723,6 @@ SvMemoryStream::~SvMemoryStream()
const void* SvMemoryStream::GetBuffer()
{
- Flush();
return GetData();
}
--
2.1.4