diff options
author | Armin Le Grand <alg@apache.org> | 2013-05-17 16:29:11 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-06-17 15:39:48 +0100 |
commit | 3a8dbb63197c5b9298015cbd5b15e607ec9a3705 (patch) | |
tree | d7edd0ed73a7d7ebafd449c924bd54ea0aad9065 /svx/source/svdraw/svdmrkv.cxx | |
parent | 997cc4804d947fdd751e457fda47f95ecf3ac909 (diff) |
Resolves: #i74211# Correct crop of bitmap data when...
logical size and MapMode do not match real pixel size
(cherry picked from commit a24965371f7e881671182bc51432c08cbf667b56)
Conflicts:
svtools/inc/svtools/grfmgr.hxx
svtools/source/graphic/grfmgr.cxx
svx/inc/svx/svdhdl.hxx
svx/inc/svx/svdograf.hxx
svx/source/svdraw/svdhdl.cxx
Change-Id: Icfb9091b55e50081e8daf697c9f00f5b5a10531a
Diffstat (limited to 'svx/source/svdraw/svdmrkv.cxx')
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index ff27728c1d09..cefe73b1cf8b 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -48,6 +48,7 @@ #include <svx/sdrpagewindow.hxx> #include <svx/sdrhittesthelper.hxx> #include <svx/svdocapt.hxx> +#include <svx/svdograf.hxx> #include <editeng/editdata.hxx> @@ -667,6 +668,56 @@ void SdrMarkView::SetMarkHandles() } else if( eDragMode==SDRDRAG_CROP ) { + const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pMarkedObj); + + if(pSdrGrafObj) + { + const SdrGrafCropItem& rCrop = static_cast< const SdrGrafCropItem& >(pSdrGrafObj->GetMergedItem(SDRATTR_GRAFCROP)); + + if(rCrop.GetLeft() || rCrop.GetTop() || rCrop.GetRight() ||rCrop.GetBottom()) + { + basegfx::B2DHomMatrix aMatrix; + basegfx::B2DPolyPolygon aPolyPolygon; + + pSdrGrafObj->TRGetBaseGeometry(aMatrix, aPolyPolygon); + + // decompose to have current translate and scale + basegfx::B2DVector aScale, aTranslate; + double fRotate, fShearX; + + aMatrix.decompose(aScale, aTranslate, fRotate, fShearX); + + if(!aScale.equalZero()) + { + // get crop scale + const basegfx::B2DVector aCropScaleFactor( + pSdrGrafObj->GetGraphicObject().calculateCropScaling( + aScale.getX(), + aScale.getY(), + rCrop.GetLeft(), + rCrop.GetTop(), + rCrop.GetRight(), + rCrop.GetBottom())); + + // apply crop scale + const double fCropLeft(rCrop.GetLeft() * aCropScaleFactor.getX()); + const double fCropTop(rCrop.GetTop() * aCropScaleFactor.getY()); + const double fCropRight(rCrop.GetRight() * aCropScaleFactor.getX()); + const double fCropBottom(rCrop.GetBottom() * aCropScaleFactor.getY()); + + aHdl.AddHdl( + new SdrCropViewHdl( + aMatrix, + pSdrGrafObj->GetGraphicObject().GetGraphic(), + fCropLeft, + fCropTop, + fCropRight, + fCropBottom, + pSdrGrafObj->IsMirrored())); + } + } + } + aHdl.AddHdl(new SdrCropHdl(aRect.TopLeft() ,HDL_UPLFT)); aHdl.AddHdl(new SdrCropHdl(aRect.TopCenter() ,HDL_UPPER)); aHdl.AddHdl(new SdrCropHdl(aRect.TopRight() ,HDL_UPRGT)); |