Kaydet (Commit) 0613ce41 authored tarafından Armin Le Grand's avatar Armin Le Grand

tdf#118232 Allow load and insert of SVGs with no Geometry

Change-Id: Iaf3d6a0423c5f11dda1e623dd730af01dbd6551c
Reviewed-on: https://gerrit.libreoffice.org/57284
Tested-by: Jenkins
Reviewed-by: 's avatarArmin Le Grand <Armin.Le.Grand@cib.de>
üst e6b18c1d
...@@ -56,6 +56,7 @@ $(eval $(call gb_Library_use_libraries,svgfilter,\ ...@@ -56,6 +56,7 @@ $(eval $(call gb_Library_use_libraries,svgfilter,\
sax \ sax \
salhelper \ salhelper \
comphelper \ comphelper \
drawinglayer \
basegfx \ basegfx \
cppuhelper \ cppuhelper \
cppu \ cppu \
......
...@@ -49,6 +49,9 @@ ...@@ -49,6 +49,9 @@
#include <unotools/streamwrap.hxx> #include <unotools/streamwrap.hxx>
#include <tools/zcodec.hxx> #include <tools/zcodec.hxx>
#include <drawinglayer/primitive2d/baseprimitive2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include "svgfilter.hxx" #include "svgfilter.hxx"
#include "svgwriter.hxx" #include "svgwriter.hxx"
...@@ -208,17 +211,59 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto ...@@ -208,17 +211,59 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
break; break;
} }
// tdf#118232 Get the sequence of primitives and check if geometry is completely
// hidden. If so, there is no need to add a SdrObject at all
const VectorGraphicDataPtr& rVectorGraphicData(aGraphic.getVectorGraphicData());
bool bContainsNoGeometry(false);
if(bool(rVectorGraphicData) && VectorGraphicDataType::Svg == rVectorGraphicData->getVectorGraphicDataType())
{
const drawinglayer::primitive2d::Primitive2DContainer aContainer(rVectorGraphicData->getPrimitive2DSequence());
if(!aContainer.empty())
{
bool bAllAreHiddenGeometry(true);
for(const auto& rCandidate : aContainer)
{
if(rCandidate.is())
{
// try to cast to BasePrimitive2D implementation
const drawinglayer::primitive2d::BasePrimitive2D* pBasePrimitive(
dynamic_cast< const drawinglayer::primitive2d::BasePrimitive2D* >(rCandidate.get()));
if(pBasePrimitive && PRIMITIVE2D_ID_HIDDENGEOMETRYPRIMITIVE2D != pBasePrimitive->getPrimitive2DID())
{
bAllAreHiddenGeometry = false;
break;
}
}
}
if(bAllAreHiddenGeometry)
{
bContainsNoGeometry = true;
}
}
}
// create a SdrModel-GraphicObject to insert to page // create a SdrModel-GraphicObject to insert to page
SdrPage* pTargetSdrPage(pSvxDrawPage->GetSdrPage()); SdrPage* pTargetSdrPage(pSvxDrawPage->GetSdrPage());
std::unique_ptr< SdrGrafObj, SdrObjectFreeOp > aNewSdrGrafObj( std::unique_ptr< SdrGrafObj, SdrObjectFreeOp > aNewSdrGrafObj;
new SdrGrafObj(
pTargetSdrPage->getSdrModelFromSdrPage(),
aGraphic));
if(!aNewSdrGrafObj.get()) // tdf#118232 only add an SdrGrafObj when we have Geometry
if(!bContainsNoGeometry)
{ {
// could not create GraphicObject aNewSdrGrafObj.reset(
break; new SdrGrafObj(
pTargetSdrPage->getSdrModelFromSdrPage(),
aGraphic));
if(!aNewSdrGrafObj.get())
{
// could not create GraphicObject
break;
}
} }
// Evtl. adapt the GraphicPrefSize to target-MapMode of target-Model // Evtl. adapt the GraphicPrefSize to target-MapMode of target-Model
...@@ -264,15 +309,18 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto ...@@ -264,15 +309,18 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
nAllBorder, nAllBorder,
nAllBorder); nAllBorder);
// set pos/size at SdrGraphicObj - use zero position for // tdf#118232 set pos/size at SdrGraphicObj - use zero position for
// better turn-around results // better turn-around results
aNewSdrGrafObj->SetSnapRect( if(!bContainsNoGeometry)
tools::Rectangle( {
Point(0, 0), aNewSdrGrafObj->SetSnapRect(
aGraphicSize)); tools::Rectangle(
Point(0, 0),
aGraphicSize));
// insert to page (owner change of SdrGrafObj) // insert to page (owner change of SdrGrafObj)
pTargetSdrPage->InsertObject(aNewSdrGrafObj.release()); pTargetSdrPage->InsertObject(aNewSdrGrafObj.release());
}
// done - set positive result now // done - set positive result now
bRet = true; bRet = true;
......
...@@ -713,6 +713,23 @@ namespace svgio ...@@ -713,6 +713,23 @@ namespace svgio
} }
} }
} }
if(aSequence.empty() && !getParent() && getViewBox())
{
// tdf#118232 No geometry, Outermost SVG element and we have a ViewBox.
// Create a HiddenGeometry Primitive containing an expanded
// hairline geometry to have the size contained
const drawinglayer::primitive2d::Primitive2DReference xLine(
new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(
basegfx::utils::createPolygonFromRect(
*getViewBox()),
basegfx::BColor(0.0, 0.0, 0.0)));
const drawinglayer::primitive2d::Primitive2DReference xHidden(
new drawinglayer::primitive2d::HiddenGeometryPrimitive2D(
drawinglayer::primitive2d::Primitive2DContainer { xLine }));
rTarget.push_back(xHidden);
}
} }
const basegfx::B2DRange SvgSvgNode::getCurrentViewPort() const const basegfx::B2DRange SvgSvgNode::getCurrentViewPort() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment