summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorRavindra_Vidhate <ravindra.vidhate@synerzip.com>2015-05-15 14:35:40 +0530
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2015-07-20 23:09:07 +0200
commitb71901da42a0429ff759b96bc9dd7cfd1bd189ac (patch)
tree0a0a415409f5b3493f8230e7709ba213ae621dfa /sc/source
parent0a91e08a46118b495f80f7901b2132b194d6d409 (diff)
tdf#68868: better handle xlsx with samecell anchor image
Problem Description : In the bugzill attached file, a image is anchored to the cell, it is shown as stretched image after opening in the LO. The image anchor attribute <xdr:from> and <xdr:to> are having the same value. It means <xdr:col>, <xdr:colOff>, <xdr:row>, <xdr:rowOff> tag values of from and to are the same. So this image will have width and height as 1. Although, this is very rare case, where from and to has the same attribute values. Eventhough, we tried to create such kind of EXCEL file but failed to do so. Solution : When twocellAnchor attributes of from and to has the same value, then hide the shape. If we avoid to add the shape, then the original image file will be shown as stretched. If we don't add it into the shape, the original image will not be preserved. Change-Id: I48ea1cffcdfb013cec115ef8df5401e532fd2efd
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/filter/inc/drawingbase.hxx8
-rw-r--r--sc/source/filter/oox/drawingbase.cxx14
-rw-r--r--sc/source/filter/oox/drawingfragment.cxx4
3 files changed, 26 insertions, 0 deletions
diff --git a/sc/source/filter/inc/drawingbase.hxx b/sc/source/filter/inc/drawingbase.hxx
index 85f529af9ec6..a0dc33740584 100644
--- a/sc/source/filter/inc/drawingbase.hxx
+++ b/sc/source/filter/inc/drawingbase.hxx
@@ -92,6 +92,14 @@ public:
/** Imports the client anchor settings from a VML element. */
void importVmlAnchor( const OUString& rAnchor );
+ /** Checks whether the shape is visible based on the anchor
+
+ If From and To anchor has the same attribute values, the shape
+ will not have width and height and thus we can assume that
+ such kind of shape will be not be visible
+ */
+ bool isAnchorValid() const;
+
/** Calculates the resulting shape anchor in EMUs. */
::oox::drawingml::EmuRectangle calcAnchorRectEmu(
const ::com::sun::star::awt::Size& rPageSizeHmm ) const;
diff --git a/sc/source/filter/oox/drawingbase.cxx b/sc/source/filter/oox/drawingbase.cxx
index c07d5eadebf3..6f6a06cb68fb 100644
--- a/sc/source/filter/oox/drawingbase.cxx
+++ b/sc/source/filter/oox/drawingbase.cxx
@@ -170,6 +170,20 @@ void ShapeAnchor::importVmlAnchor( const OUString& rAnchor )
}
}
+bool ShapeAnchor::isAnchorValid() const
+{
+ // Checks whether the shape is visible based on the anchor
+ // if From and To anchor has the same attribute values, the shape will not have width and height
+ // and thus we can assume that such kind of shape will be not be visible
+ if (meAnchorType == ANCHOR_TWOCELL &&
+ (maTo.mnRow == maFrom.mnRow && maTo.mnCol == maFrom.mnCol) &&
+ (maTo.mnColOffset == maFrom.mnColOffset && maTo.mnRowOffset == maFrom.mnRowOffset))
+ {
+ return false;
+ }
+ return true;
+}
+
EmuRectangle ShapeAnchor::calcAnchorRectEmu( const css::awt::Size& rPageSizeHmm ) const
{
AddressConverter& rAddrConv = getAddressConverter();
diff --git a/sc/source/filter/oox/drawingfragment.cxx b/sc/source/filter/oox/drawingfragment.cxx
index 967b0ff24dd0..d1824eccf04e 100644
--- a/sc/source/filter/oox/drawingfragment.cxx
+++ b/sc/source/filter/oox/drawingfragment.cxx
@@ -256,6 +256,7 @@ void DrawingFragment::onEndElement()
if ( getCurrentElement() == XDR_TOKEN( twoCellAnchor ) )
mxShape->setRotation(0);
EmuRectangle aShapeRectEmu = mxAnchor->calcAnchorRectEmu( getDrawPageSize() );
+ const bool bIsShapeVisible = mxAnchor->isAnchorValid();
if( (aShapeRectEmu.X >= 0) && (aShapeRectEmu.Y >= 0) && (aShapeRectEmu.Width >= 0) && (aShapeRectEmu.Height >= 0) )
{
// TODO: DrawingML implementation expects 32-bit coordinates for EMU rectangles (change that to EmuRectangle)
@@ -270,6 +271,9 @@ void DrawingFragment::onEndElement()
mxShape->setSize(Size(aShapeRectEmu.Width, aShapeRectEmu.Height));
basegfx::B2DHomMatrix aTransformation;
+ if ( !bIsShapeVisible)
+ mxShape->setHidden(true);
+
mxShape->addShape( getOoxFilter(), &getTheme(), mxDrawPage, aTransformation, mxShape->getFillProperties(), &aShapeRectEmu32 );
/* Collect all shape positions in the WorksheetHelper base