summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@me.com>2018-12-20 16:24:33 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-12-21 23:05:38 +0100
commite42e3f3f28691de2ed8132564066bc3007eac651 (patch)
tree08375108adb973e6f20eb6ff0c2fcd4c3ea6859b /svx
parent2c0c0794a8e287497e460f3f1e6bcba585d675d4 (diff)
tdf#119180 Use 100th_mm in UNO API implementation
Since SvxShape::GetBitmap is UNO API implementation the results have to be in 100th_mm, that is how UNO API is defined. Adapted Bitmap creation common case to do so using primitve embedding if source is not 100_th_mm. Also added a shortcut if object in question already is a SdrGrafObj and contains a Bitmap. Needed to update the checksum of a graphic for testN777345. Change-Id: I995100406a262e2872597dc64e943271e92eb4cb Reviewed-on: https://gerrit.libreoffice.org/65505 Tested-by: Jenkins Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de> (cherry picked from commit df57d50e00820d59b2b7104b6e59883405d0f183) Reviewed-on: https://gerrit.libreoffice.org/65523 Tested-by: Xisco Faulí <xiscofauli@libreoffice.org> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/unodraw/unoshape.cxx59
1 files changed, 54 insertions, 5 deletions
diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index b89188720c65..4430da8af9c9 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -87,6 +87,7 @@
#include <svx/extrud3d.hxx>
#include <svx/sdr/contact/viewcontact.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
+#include <drawinglayer/primitive2d/transformprimitive2d.hxx>
#include <vcl/wmf.hxx>
@@ -691,14 +692,35 @@ uno::Any SvxShape::GetBitmap( bool bMetaFile /* = false */ ) const
return aAny;
}
+ // tdf#119180 If we do not ask for Metafile and we access a SdrGrafObj,
+ // and content exists and is a Bitmap, take the shortcut.
+ // Do *not* do this for Metafile - as can be seen, requested in that case
+ // is a byte-sequence of a saved WMF format file (see below)
+ if(!bMetaFile)
+ {
+ const SdrGrafObj* pSdrGrafObj(dynamic_cast<SdrGrafObj*>(GetSdrObject()));
+
+ if(nullptr != pSdrGrafObj)
+ {
+ const Graphic& rGraphic(pSdrGrafObj->GetGraphic());
+
+ if(GraphicType::Bitmap == rGraphic.GetType())
+ {
+ Reference< awt::XBitmap > xBmp( rGraphic.GetXGraphic(), UNO_QUERY );
+ aAny <<= xBmp;
+
+ return aAny;
+ }
+ }
+ }
+
// tdf#118662 instead of creating an E3dView instance every time to paint
// a single SdrObject, use the existing SdrObject::SingleObjectPainter to
// use less resources and runtime
- ScopedVclPtrInstance< VirtualDevice > pVDev;
- const tools::Rectangle aBoundRect(GetSdrObject()->GetCurrentBoundRect());
-
if(bMetaFile)
{
+ ScopedVclPtrInstance< VirtualDevice > pVDev;
+ const tools::Rectangle aBoundRect(GetSdrObject()->GetCurrentBoundRect());
GDIMetaFile aMtf;
pVDev->SetMapMode(MapMode(MapUnit::Map100thMM));
@@ -727,17 +749,44 @@ uno::Any SvxShape::GetBitmap( bool bMetaFile /* = false */ ) const
}
else
{
- const drawinglayer::primitive2d::Primitive2DContainer xPrimitives(
+ drawinglayer::primitive2d::Primitive2DContainer xPrimitives(
GetSdrObject()->GetViewContact().getViewIndependentPrimitive2DContainer());
if(!xPrimitives.empty())
{
const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
- const basegfx::B2DRange aRange(
+ basegfx::B2DRange aRange(
xPrimitives.getB2DRange(aViewInformation2D));
if(!aRange.isEmpty())
{
+ const MapUnit aSourceMapUnit(GetSdrObject()->getSdrModelFromSdrObject().GetScaleUnit());
+
+ if(MapUnit::Map100thMM != aSourceMapUnit)
+ {
+ // tdf#119180 This is UNO API and thus works in 100th_mm,
+ // so if the MapMode from the used SdrModel is *not* equal
+ // to Map100thMM we need to embed the primitives to an adapting
+ // homogen transformation for correct values
+ const basegfx::B2DHomMatrix aMapTransform(
+ OutputDevice::LogicToLogic(
+ MapMode(aSourceMapUnit),
+ MapMode(MapUnit::Map100thMM)));
+
+ // Embed primitives to get them in 100th mm
+ const drawinglayer::primitive2d::Primitive2DReference xEmbedRef(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ aMapTransform,
+ xPrimitives));
+
+ xPrimitives = drawinglayer::primitive2d::Primitive2DContainer { xEmbedRef };
+
+ // Update basegfx::B2DRange aRange, too. Here we have the
+ // choice of transforming the existing value or get newly by
+ // again using 'xPrimitives.getB2DRange(aViewInformation2D)'
+ aRange.transform(aMapTransform);
+ }
+
const BitmapEx aBmp(
convertPrimitive2DSequenceToBitmapEx(
xPrimitives,