Revert "tdf#161261 sw: fix lost size of image resized in fixed-height cell"
This reverts commit 4da6f52f5fd164082fd42fc58fc7d31da567c924 plus follow-up
24f65bf5940adb0aa3590443752110119e2bea5e "Fix typo". It caused
CppunitTest_sw_uiwriter6 to fail with
> /sw/source/core/layout/flylay.cxx:1426:51: runtime error: downcast of address 0x606000c4b620 which does not point to an object of type 'const SwDrawContact'
> 0x606000c4b620: note: object is of type 'SwFlyDrawContact'
> 00 00 00 00 50 3d 2f b8 99 7f 00 00 c0 3d 2f b8 99 7f 00 00 00 00 00 00 00 00 00 00 d0 64 50 00
> ^~~~~~~~~~~~~~~~~~~~~~~
> vptr for 'SwFlyDrawContact'
> #0 0x7f99ae257936 in CalcClipRect(SdrObject const*, SwRect&, bool) /sw/source/core/layout/flylay.cxx:1426:51
> #1 0x7f99ad5b2607 in SwDrawView::TakeDragLimit(SdrDragMode, tools::Rectangle&) const /sw/source/core/draw/dview.cxx:694:13
> #2 0x7f99c317c1a0 in SdrDragView::BegDragObj(Point const&, OutputDevice*, SdrHdl*, short, SdrDragMethod*) /svx/source/svdraw/svddrgv.cxx:199:21
> #3 0x7f99c18eef25 in E3dView::BegDragObj(Point const&, OutputDevice*, SdrHdl*, short, SdrDragMethod*) /svx/source/engine3d/view3d.cxx:1243:21
> #4 0x7f99adcfa821 in SwFEShell::BeginDrag(Point const*, bool) /sw/source/core/frmedt/feshview.cxx:741:20
> #5 0x7f99b3ea5ffd in SwWrtShell::BeginFrameDrag(Point const*, bool) /sw/source/uibase/wrtsh/select.cxx:761:20
> #6 0x7f99b27a8238 in SwWrtShell::Drag(Point const*, bool) /sw/source/uibase/inc/wrtsh.hxx:124:56
> #7 0x7f99b2742135 in SwEditWin::MouseMove(MouseEvent const&) /sw/source/uibase/docvw/edtwin.cxx:4489:25
> #8 0x7f99dcdc6f64 in testTdf161261::TestBody() /sw/qa/extras/uiwriter/uiwriter6.cxx:1613:14
(<https://ci.libreoffice.org/job/lo_ubsan/3185/>)
Change-Id: Idf0c0c75d39a28671c852fc526549439892d0902
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168177
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
diff --git a/sw/qa/extras/uiwriter/uiwriter6.cxx b/sw/qa/extras/uiwriter/uiwriter6.cxx
index 6322120..fb3ecb3 100644
--- a/sw/qa/extras/uiwriter/uiwriter6.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter6.cxx
@@ -36,7 +36,6 @@
#include <sfx2/dispatch.hxx>
#include <cmdid.h>
#include <tools/json_writer.hxx>
#include <tools/UnitConversion.hxx>
#include <boost/property_tree/json_parser.hpp>
#include <com/sun/star/text/XTextTable.hpp>
@@ -1560,68 +1559,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf160836)
CPPUNIT_ASSERT_EQUAL(tools::Long(1980), pCellA1->getFrameArea().Height());
}
CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf161261)
{
createSwDoc("tdf160842.fodt");
SwDoc* pDoc = getSwDoc();
CPPUNIT_ASSERT(pDoc);
SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
CPPUNIT_ASSERT(pWrtShell);
// the cursor is not in the table
CPPUNIT_ASSERT(!pWrtShell->IsCursorInTable());
SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout();
auto pPage = dynamic_cast<SwPageFrame*>(pLayout->Lower());
CPPUNIT_ASSERT(pPage);
const SwSortedObjs& rPageObjs = *pPage->GetSortedObjs();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs.size());
auto pPageFly = dynamic_cast<SwFlyAtContentFrame*>(rPageObjs[0]);
CPPUNIT_ASSERT(pPageFly);
auto pTable = dynamic_cast<SwTabFrame*>(pPageFly->GetLower());
CPPUNIT_ASSERT(pTable);
auto pRow1 = pTable->GetLower();
CPPUNIT_ASSERT(pRow1->IsRowFrame());
auto pCellA1 = pRow1->GetLower();
CPPUNIT_ASSERT(pCellA1);
const SwRect& rCellA1Rect = pCellA1->getFrameArea();
auto nRowHeight = rCellA1Rect.Height();
// select image by clicking on it at the center of the upper cell
Point ptFrom(rCellA1Rect.Left() + rCellA1Rect.Width() / 2, rCellA1Rect.Top() + nRowHeight / 2);
vcl::Window& rEditWin = pDoc->GetDocShell()->GetView()->GetEditWin();
Point aFrom = rEditWin.LogicToPixel(ptFrom);
MouseEvent aClickEvent(aFrom, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
rEditWin.MouseButtonDown(aClickEvent);
rEditWin.MouseButtonUp(aClickEvent);
// Then make sure that the image is selected:
SelectionType eType = pWrtShell->GetSelectionType();
CPPUNIT_ASSERT_EQUAL(SelectionType::Graphic, eType);
uno::Reference<drawing::XShape> xShape = getShape(2);
CPPUNIT_ASSERT(xShape.is());
// zoom image by drag & drop using right bottom handle of the image
const SwRect& rSelRect = pWrtShell->GetAnyCurRect(CurRectType::Frame);
Point ptFromHandle(rSelRect.Right(), rSelRect.Bottom());
Point aFromHandle = rEditWin.LogicToPixel(ptFromHandle);
Point ptTo(rSelRect.Left() + rSelRect.Width() * 1.5, rSelRect.Top() + rSelRect.Height() * 1.5);
Point aTo = rEditWin.LogicToPixel(ptTo);
MouseEvent aClickEvent2(aFromHandle, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
rEditWin.MouseButtonDown(aClickEvent2);
MouseEvent aClickEvent3(aTo, 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT);
rEditWin.MouseMove(aClickEvent3);
rEditWin.MouseMove(aClickEvent3);
MouseEvent aClickEvent4(aTo, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
rEditWin.MouseButtonUp(aClickEvent4);
Scheduler::ProcessEventsToIdle();
// Make sure image is greater than before, instead of minimizing it to the cell size
// This was 8707 and 6509
CPPUNIT_ASSERT_GREATER(sal_Int32(10000), xShape->getSize().Width);
CPPUNIT_ASSERT_GREATER(sal_Int32(8000), xShape->getSize().Height);
}
CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf115132)
{
createSwDoc();
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index 35eb225..1a39b73 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -1409,45 +1409,17 @@ bool CalcClipRect( const SdrObject *pSdrObj, SwRect &rRect, bool bMove )
{
const SwFrame *pUp = pFly->GetAnchorFrame()->GetUpper();
SwRectFnSet aRectFnSet(pFly->GetAnchorFrame());
bool bOnlyCellFrame = pUp->IsCellFrame();
while( pUp->IsColumnFrame() || pUp->IsSctFrame() || pUp->IsColBodyFrame())
pUp = pUp->GetUpper();
rRect = pUp->getFrameArea();
if( !pUp->IsBodyFrame() )
{
bool bCropByFixedHeightCell = false;
// allow zoom image cropped by fixed height table cell
if ( bOnlyCellFrame && pUp->IsCellFrame() && pUp->GetUpper() &&
// is a fixed height table row?
pUp->GetUpper()->IsRowFrame() && SwFrameSize::Fixed ==
pUp->GetUpper()->GetAttrSet()->GetFrameSize().GetHeightSizeType() )
rRect += pUp->getFramePrintArea().Pos();
rRect.SSize( pUp->getFramePrintArea().SSize() );
if ( pUp->IsCellFrame() )
{
// is image anchored as character?
if (const SwDrawContact* pC = static_cast<const SwDrawContact*>(GetUserCall(pSdrObj)))
{
const SwFrameFormat* pFormat = pC->GetFormat();
const SwFormatAnchor& rAnch = pFormat->GetAnchor();
if ( RndStdIds::FLY_AS_CHAR == rAnch.GetAnchorId() )
{
const SwPageFrame *pPageFrame = pFly->FindPageFrame();
Size aSize( pPageFrame->getFramePrintArea().SSize() );
// TODO doubled print area is still cropped by full page size, yet
rRect.SSize(Size(aSize.getWidth() * 2, aSize.getHeight() * 2));
bCropByFixedHeightCell = true;
}
}
}
if ( !bCropByFixedHeightCell )
{
rRect += pUp->getFramePrintArea().Pos();
rRect.SSize( pUp->getFramePrintArea().SSize() );
if ( pUp->IsCellFrame() )
{
const SwFrame *pTab = pUp->FindTabFrame();
aRectFnSet.SetBottom( rRect, aRectFnSet.GetPrtBottom(*pTab->GetUpper()) ); // set bottom
}
const SwFrame *pTab = pUp->FindTabFrame();
aRectFnSet.SetBottom( rRect, aRectFnSet.GetPrtBottom(*pTab->GetUpper()) );
}
}
else if ( pUp->GetUpper()->IsPageFrame() )