[Libreoffice-commits] core.git: oox/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Fri Apr 3 10:18:54 UTC 2020
oox/source/core/filterbase.cxx | 34 -
oox/source/core/filterdetect.cxx | 32
oox/source/core/xmlfilterbase.cxx | 114 +--
oox/source/docprop/docprophandler.cxx | 126 +--
oox/source/docprop/ooxmldocpropimport.cxx | 42 -
oox/source/drawingml/chart/chartdrawingfragment.cxx | 42 -
oox/source/drawingml/chart/converterbase.cxx | 85 +-
oox/source/drawingml/chart/objectformatter.cxx | 232 +++---
oox/source/drawingml/chart/plotareaconverter.cxx | 10
oox/source/drawingml/chart/seriesconverter.cxx | 86 +-
oox/source/drawingml/chart/titleconverter.cxx | 62 +
oox/source/drawingml/chart/typegroupconverter.cxx | 158 ++--
oox/source/drawingml/fillproperties.cxx | 680 ++++++++++----------
oox/source/drawingml/lineproperties.cxx | 108 +--
oox/source/drawingml/shape.cxx | 36 -
oox/source/drawingml/textbodyproperties.cxx | 31
oox/source/dump/dumperbase.cxx | 48 -
oox/source/dump/oledumper.cxx | 96 +-
oox/source/export/chartexport.cxx | 511 +++++++--------
oox/source/export/drawingml.cxx | 380 +++++------
oox/source/export/vmlexport.cxx | 64 -
oox/source/helper/binaryoutputstream.cxx | 24
oox/source/helper/propertymap.cxx | 22
oox/source/helper/storagebase.cxx | 36 -
oox/source/helper/zipstorage.cxx | 5
oox/source/ole/axcontrol.cxx | 5
oox/source/ole/olehelper.cxx | 92 +-
oox/source/ole/vbacontrol.cxx | 225 +++---
oox/source/ole/vbaproject.cxx | 16
oox/source/ppt/pptimport.cxx | 35 -
oox/source/ppt/pptshapegroupcontext.cxx | 30
oox/source/ppt/presentationfragmenthandler.cxx | 84 +-
oox/source/ppt/slidepersist.cxx | 174 ++---
oox/source/ppt/soundactioncontext.cxx | 40 -
oox/source/ppt/timenodelistcontext.cxx | 214 +++---
oox/source/shape/ShapeContextHandler.cxx | 26
oox/source/vml/vmlformatting.cxx | 80 +-
oox/source/vml/vmlshape.cxx | 52 -
oox/source/vml/vmltextbox.cxx | 30
39 files changed, 2104 insertions(+), 2063 deletions(-)
New commits:
commit b8f15244054aea276152494ee9f79318a70658e7
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Apr 3 11:09:04 2020 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Fri Apr 3 12:18:17 2020 +0200
loplugin:flatten in oox
Change-Id: Ia57944653fa10e864822518372acab83555e0f20
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91618
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx
index 0cb7f2a264b1..94f7c08c9b20 100644
--- a/oox/source/core/filterbase.cxx
+++ b/oox/source/core/filterbase.cxx
@@ -407,25 +407,25 @@ void SAL_CALL FilterBase::initialize( const Sequence< Any >& rArgs )
{
}
- if (rArgs.hasElements())
+ if (!rArgs.hasElements())
+ return;
+
+ Sequence<css::beans::PropertyValue> aSeq;
+ rArgs[0] >>= aSeq;
+ for (const auto& rVal : std::as_const(aSeq))
{
- Sequence<css::beans::PropertyValue> aSeq;
- rArgs[0] >>= aSeq;
- for (const auto& rVal : std::as_const(aSeq))
+ if (rVal.Name == "UserData")
+ {
+ css::uno::Sequence<OUString> aUserDataSeq;
+ rVal.Value >>= aUserDataSeq;
+ if (comphelper::findValue(aUserDataSeq, "macro-enabled") != -1)
+ mxImpl->mbExportVBA = true;
+ }
+ else if (rVal.Name == "Flags")
{
- if (rVal.Name == "UserData")
- {
- css::uno::Sequence<OUString> aUserDataSeq;
- rVal.Value >>= aUserDataSeq;
- if (comphelper::findValue(aUserDataSeq, "macro-enabled") != -1)
- mxImpl->mbExportVBA = true;
- }
- else if (rVal.Name == "Flags")
- {
- sal_Int32 nFlags(0);
- rVal.Value >>= nFlags;
- mxImpl->mbExportTemplate = bool(static_cast<SfxFilterFlags>(nFlags) & SfxFilterFlags::TEMPLATE);
- }
+ sal_Int32 nFlags(0);
+ rVal.Value >>= nFlags;
+ mxImpl->mbExportTemplate = bool(static_cast<SfxFilterFlags>(nFlags) & SfxFilterFlags::TEMPLATE);
}
}
}
diff --git a/oox/source/core/filterdetect.cxx b/oox/source/core/filterdetect.cxx
index b63d355ed506..c8ce03acb75c 100644
--- a/oox/source/core/filterdetect.cxx
+++ b/oox/source/core/filterdetect.cxx
@@ -142,25 +142,25 @@ void SAL_CALL FilterDetectDocHandler::characters( const OUString& /*aChars*/ )
void FilterDetectDocHandler::parseRelationship( const AttributeList& rAttribs )
{
OUString aType = rAttribs.getString( XML_Type, OUString() );
- if ( aType == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" // OOXML Transitional
- || aType == "http://purl.oclc.org/ooxml/officeDocument/relationships/officeDocument" ) //OOXML strict
+ if ( !(aType == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" // OOXML Transitional
+ || aType == "http://purl.oclc.org/ooxml/officeDocument/relationships/officeDocument") ) //OOXML strict
+ return;
+
+ Reference<XUriReferenceFactory> xFactory = UriReferenceFactory::create( mxContext );
+ try
{
- Reference<XUriReferenceFactory> xFactory = UriReferenceFactory::create( mxContext );
- try
- {
- // use '/' to representent the root of the zip package ( and provide a 'file' scheme to
- // keep the XUriReference implementation happy )
- Reference< XUriReference > xBase = xFactory->parse( "file:///" );
+ // use '/' to representent the root of the zip package ( and provide a 'file' scheme to
+ // keep the XUriReference implementation happy )
+ Reference< XUriReference > xBase = xFactory->parse( "file:///" );
- Reference< XUriReference > xPart = xFactory->parse( rAttribs.getString( XML_Target, OUString() ) );
- Reference< XUriReference > xAbs = xFactory->makeAbsolute( xBase, xPart, true, RelativeUriExcessParentSegments_RETAIN );
+ Reference< XUriReference > xPart = xFactory->parse( rAttribs.getString( XML_Target, OUString() ) );
+ Reference< XUriReference > xAbs = xFactory->makeAbsolute( xBase, xPart, true, RelativeUriExcessParentSegments_RETAIN );
- if ( xAbs.is() )
- maTargetPath = xAbs->getPath();
- }
- catch( const Exception& )
- {
- }
+ if ( xAbs.is() )
+ maTargetPath = xAbs->getPath();
+ }
+ catch( const Exception& )
+ {
}
}
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index f59b0cbc5821..84aaef6af9db 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -963,76 +963,76 @@ OUString XmlFilterBase::getNamespaceURL(sal_Int32 nNSID) const
void XmlFilterBase::importCustomFragments(css::uno::Reference<css::embed::XStorage> const & xDocumentStorage)
{
Reference<XRelationshipAccess> xRelations(xDocumentStorage, UNO_QUERY);
- if (xRelations.is())
- {
- const uno::Sequence<uno::Sequence<beans::StringPair>> aSeqs = xRelations->getAllRelationships();
+ if (!xRelations.is())
+ return;
+
+ const uno::Sequence<uno::Sequence<beans::StringPair>> aSeqs = xRelations->getAllRelationships();
- std::vector<StreamDataSequence> aCustomFragments;
- std::vector<OUString> aCustomFragmentTypes;
- std::vector<OUString> aCustomFragmentTargets;
- for (const uno::Sequence<beans::StringPair>& aSeq : aSeqs)
+ std::vector<StreamDataSequence> aCustomFragments;
+ std::vector<OUString> aCustomFragmentTypes;
+ std::vector<OUString> aCustomFragmentTargets;
+ for (const uno::Sequence<beans::StringPair>& aSeq : aSeqs)
+ {
+ OUString sType;
+ OUString sTarget;
+ for (const beans::StringPair& aPair : aSeq)
{
- OUString sType;
- OUString sTarget;
- for (const beans::StringPair& aPair : aSeq)
- {
- if (aPair.First == "Target")
- sTarget = aPair.Second;
- else if (aPair.First == "Type")
- sType = aPair.Second;
- }
+ if (aPair.First == "Target")
+ sTarget = aPair.Second;
+ else if (aPair.First == "Type")
+ sType = aPair.Second;
+ }
- // Preserve non-standard (i.e. custom) entries.
- if (!sType.match("http://schemas.openxmlformats.org"))
+ // Preserve non-standard (i.e. custom) entries.
+ if (!sType.match("http://schemas.openxmlformats.org"))
+ {
+ StreamDataSequence aDataSeq;
+ if (importBinaryData(aDataSeq, sTarget))
{
- StreamDataSequence aDataSeq;
- if (importBinaryData(aDataSeq, sTarget))
- {
- aCustomFragments.emplace_back(aDataSeq);
- aCustomFragmentTypes.emplace_back(sType);
- aCustomFragmentTargets.emplace_back(sTarget);
- }
+ aCustomFragments.emplace_back(aDataSeq);
+ aCustomFragmentTypes.emplace_back(sType);
+ aCustomFragmentTargets.emplace_back(sTarget);
}
}
+ }
- // Adding the saved custom xml DOM
- comphelper::SequenceAsHashMap aGrabBagProperties;
- aGrabBagProperties["OOXCustomFragments"] <<= comphelper::containerToSequence(aCustomFragments);
- aGrabBagProperties["OOXCustomFragmentTypes"] <<= comphelper::containerToSequence(aCustomFragmentTypes);
- aGrabBagProperties["OOXCustomFragmentTargets"] <<= comphelper::containerToSequence(aCustomFragmentTargets);
-
- std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomList;
- std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomPropsList;
- //FIXME: Ideally, we should get these the relations, but it seems that is not consistently set.
- // In some cases it's stored in the workbook relationships, which is unexpected. So we discover them directly.
- for (int i = 1; ; ++i)
+ // Adding the saved custom xml DOM
+ comphelper::SequenceAsHashMap aGrabBagProperties;
+ aGrabBagProperties["OOXCustomFragments"] <<= comphelper::containerToSequence(aCustomFragments);
+ aGrabBagProperties["OOXCustomFragmentTypes"] <<= comphelper::containerToSequence(aCustomFragmentTypes);
+ aGrabBagProperties["OOXCustomFragmentTargets"] <<= comphelper::containerToSequence(aCustomFragmentTargets);
+
+ std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomList;
+ std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomPropsList;
+ //FIXME: Ideally, we should get these the relations, but it seems that is not consistently set.
+ // In some cases it's stored in the workbook relationships, which is unexpected. So we discover them directly.
+ for (int i = 1; ; ++i)
+ {
+ Reference<XDocument> xCustDoc = importFragment("customXml/item" + OUString::number(i) + ".xml");
+ Reference<XDocument> xCustDocProps = importFragment("customXml/itemProps" + OUString::number(i) + ".xml");
+ if (xCustDoc && xCustDocProps)
{
- Reference<XDocument> xCustDoc = importFragment("customXml/item" + OUString::number(i) + ".xml");
- Reference<XDocument> xCustDocProps = importFragment("customXml/itemProps" + OUString::number(i) + ".xml");
- if (xCustDoc && xCustDocProps)
- {
- aCustomXmlDomList.emplace_back(xCustDoc);
- aCustomXmlDomPropsList.emplace_back(xCustDocProps);
- }
- else
- break;
+ aCustomXmlDomList.emplace_back(xCustDoc);
+ aCustomXmlDomPropsList.emplace_back(xCustDocProps);
}
+ else
+ break;
+ }
- // Adding the saved custom xml DOM
- aGrabBagProperties["OOXCustomXml"] <<= comphelper::containerToSequence(aCustomXmlDomList);
- aGrabBagProperties["OOXCustomXmlProps"] <<= comphelper::containerToSequence(aCustomXmlDomPropsList);
+ // Adding the saved custom xml DOM
+ aGrabBagProperties["OOXCustomXml"] <<= comphelper::containerToSequence(aCustomXmlDomList);
+ aGrabBagProperties["OOXCustomXmlProps"] <<= comphelper::containerToSequence(aCustomXmlDomPropsList);
- // Save the [Content_Types].xml after parsing.
- uno::Sequence<uno::Sequence<beans::StringPair>> aContentTypeInfo;
- uno::Reference<io::XInputStream> xInputStream = openInputStream("[Content_Types].xml");
- if (xInputStream.is())
- aContentTypeInfo = comphelper::OFOPXMLHelper::ReadContentTypeSequence(xInputStream, getComponentContext());
+ // Save the [Content_Types].xml after parsing.
+ uno::Sequence<uno::Sequence<beans::StringPair>> aContentTypeInfo;
+ uno::Reference<io::XInputStream> xInputStream = openInputStream("[Content_Types].xml");
+ if (xInputStream.is())
+ aContentTypeInfo = comphelper::OFOPXMLHelper::ReadContentTypeSequence(xInputStream, getComponentContext());
- aGrabBagProperties["OOXContentTypes"] <<= aContentTypeInfo;
+ aGrabBagProperties["OOXContentTypes"] <<= aContentTypeInfo;
- Reference<XComponent> xModel = getModel();
- oox::core::XmlFilterBase::putPropertiesToDocumentGrabBag(xModel, aGrabBagProperties);
- }
+ Reference<XComponent> xModel = getModel();
+ oox::core::XmlFilterBase::putPropertiesToDocumentGrabBag(xModel, aGrabBagProperties);
}
void XmlFilterBase::exportCustomFragments()
diff --git a/oox/source/docprop/docprophandler.cxx b/oox/source/docprop/docprophandler.cxx
index 47882a0749de..67de4a8366bd 100644
--- a/oox/source/docprop/docprophandler.cxx
+++ b/oox/source/docprop/docprophandler.cxx
@@ -69,26 +69,26 @@ void OOXMLDocPropHandler::InitNew()
void OOXMLDocPropHandler::AddCustomProperty( const uno::Any& aAny )
{
- if ( !m_aCustomPropertyName.isEmpty() )
- {
- const uno::Reference< beans::XPropertyContainer > xUserProps =
- m_xDocProp->getUserDefinedProperties();
- if ( !xUserProps.is() )
- throw uno::RuntimeException();
+ if ( m_aCustomPropertyName.isEmpty() )
+ return;
- try
- {
- xUserProps->addProperty( m_aCustomPropertyName,
- beans::PropertyAttribute::REMOVABLE, aAny );
- }
- catch( beans::PropertyExistException& )
- {
- // conflicts with core and extended properties are possible
- }
- catch( uno::Exception& )
- {
- OSL_FAIL( "Can not add custom property!" );
- }
+ const uno::Reference< beans::XPropertyContainer > xUserProps =
+ m_xDocProp->getUserDefinedProperties();
+ if ( !xUserProps.is() )
+ throw uno::RuntimeException();
+
+ try
+ {
+ xUserProps->addProperty( m_aCustomPropertyName,
+ beans::PropertyAttribute::REMOVABLE, aAny );
+ }
+ catch( beans::PropertyExistException& )
+ {
+ // conflicts with core and extended properties are possible
+ }
+ catch( uno::Exception& )
+ {
+ OSL_FAIL( "Can not add custom property!" );
}
}
@@ -245,24 +245,24 @@ void OOXMLDocPropHandler::UpdateDocStatistic( const OUString& aChars )
break;
}
- if ( !aName.isEmpty() )
- {
- sal_Int32 nInd = 0;
- for ( auto pProp = aSet.getConstArray(); nInd < aSet.getLength(); ++nInd )
- if ( pProp[nInd].Name == aName )
- break;
+ if ( aName.isEmpty() )
+ return;
- if (nInd == aSet.getLength())
- aSet.realloc( nInd + 1 );
+ sal_Int32 nInd = 0;
+ for ( auto pProp = aSet.getConstArray(); nInd < aSet.getLength(); ++nInd )
+ if ( pProp[nInd].Name == aName )
+ break;
- beans::NamedValue aProp;
- aProp.Name = aName;
- aProp.Value <<= aChars.toInt32();
+ if (nInd == aSet.getLength())
+ aSet.realloc( nInd + 1 );
- aSet[nInd] = aProp;
+ beans::NamedValue aProp;
+ aProp.Name = aName;
+ aProp.Value <<= aChars.toInt32();
- m_xDocProp->setDocumentStatistics( aSet );
- }
+ aSet[nInd] = aProp;
+
+ m_xDocProp->setDocumentStatistics( aSet );
}
// com.sun.star.xml.sax.XFastDocumentHandler
@@ -338,41 +338,41 @@ void SAL_CALL OOXMLDocPropHandler::startUnknownElement( const OUString& aNamespa
void SAL_CALL OOXMLDocPropHandler::endFastElement( ::sal_Int32 )
{
- if ( m_nInBlock )
- {
- m_nInBlock--;
+ if ( !m_nInBlock )
+ return;
- if ( !m_nInBlock )
- m_nState = 0;
- else if ( m_nInBlock == 1 )
- {
- m_nBlock = 0;
- m_aCustomPropertyName.clear();
- }
- else if ( m_nInBlock == 2 )
+ m_nInBlock--;
+
+ if ( !m_nInBlock )
+ m_nState = 0;
+ else if ( m_nInBlock == 1 )
+ {
+ m_nBlock = 0;
+ m_aCustomPropertyName.clear();
+ }
+ else if ( m_nInBlock == 2 )
+ {
+ if ( m_nState == CUSTPR_TOKEN(Properties)
+ && m_nBlock == CUSTPR_TOKEN(property))
{
- if ( m_nState == CUSTPR_TOKEN(Properties)
- && m_nBlock == CUSTPR_TOKEN(property))
+ switch (m_nType)
{
- switch (m_nType)
- {
- case VT_TOKEN(bstr):
- case VT_TOKEN(lpstr):
- case VT_TOKEN(lpwstr):
- if (!m_aCustomPropertyName.isEmpty() &&
- INSERTED != m_CustomStringPropertyState)
- {
- // the property has string type, so it is valid
- // even with an empty value - characters() has
- // not been called in that case
- AddCustomProperty(uno::makeAny(OUString()));
- }
- break;
- }
+ case VT_TOKEN(bstr):
+ case VT_TOKEN(lpstr):
+ case VT_TOKEN(lpwstr):
+ if (!m_aCustomPropertyName.isEmpty() &&
+ INSERTED != m_CustomStringPropertyState)
+ {
+ // the property has string type, so it is valid
+ // even with an empty value - characters() has
+ // not been called in that case
+ AddCustomProperty(uno::makeAny(OUString()));
+ }
+ break;
}
- m_CustomStringPropertyState = NONE;
- m_nType = 0;
}
+ m_CustomStringPropertyState = NONE;
+ m_nType = 0;
}
}
diff --git a/oox/source/docprop/ooxmldocpropimport.cxx b/oox/source/docprop/ooxmldocpropimport.cxx
index 8731ecf56897..621173b6bdea 100644
--- a/oox/source/docprop/ooxmldocpropimport.cxx
+++ b/oox/source/docprop/ooxmldocpropimport.cxx
@@ -136,27 +136,27 @@ void SAL_CALL DocumentPropertiesImport::importProperties(
if( !aCustomStreams.hasElements() )
aCustomStreams = lclGetRelatedStreams( rxSource, CREATE_OFFICEDOC_RELATION_TYPE_STRICT( "custom-properties" ) );
- if( aCoreStreams.hasElements() || aExtStreams.hasElements() || aCustomStreams.hasElements() )
- {
- if( aCoreStreams.getLength() > 1 )
- throw IOException( "Unexpected core properties stream!" );
-
- ::oox::core::FastParser aParser;
- aParser.registerNamespace( NMSP_packageMetaCorePr );
- aParser.registerNamespace( NMSP_dc );
- aParser.registerNamespace( NMSP_dcTerms );
- aParser.registerNamespace( NMSP_officeExtPr );
- aParser.registerNamespace( NMSP_officeCustomPr );
- aParser.registerNamespace( NMSP_officeDocPropsVT );
- aParser.setDocumentHandler( new OOXMLDocPropHandler( mxContext, rxDocumentProperties ) );
-
- if( aCoreStreams.hasElements() )
- aParser.parseStream( aCoreStreams[ 0 ], true );
- for( const auto& rExtStream : std::as_const(aExtStreams) )
- aParser.parseStream( rExtStream, true );
- for( const auto& rCustomStream : std::as_const(aCustomStreams) )
- aParser.parseStream( rCustomStream, true );
- }
+ if( !(aCoreStreams.hasElements() || aExtStreams.hasElements() || aCustomStreams.hasElements()) )
+ return;
+
+ if( aCoreStreams.getLength() > 1 )
+ throw IOException( "Unexpected core properties stream!" );
+
+ ::oox::core::FastParser aParser;
+ aParser.registerNamespace( NMSP_packageMetaCorePr );
+ aParser.registerNamespace( NMSP_dc );
+ aParser.registerNamespace( NMSP_dcTerms );
+ aParser.registerNamespace( NMSP_officeExtPr );
+ aParser.registerNamespace( NMSP_officeCustomPr );
+ aParser.registerNamespace( NMSP_officeDocPropsVT );
+ aParser.setDocumentHandler( new OOXMLDocPropHandler( mxContext, rxDocumentProperties ) );
+
+ if( aCoreStreams.hasElements() )
+ aParser.parseStream( aCoreStreams[ 0 ], true );
+ for( const auto& rExtStream : std::as_const(aExtStreams) )
+ aParser.parseStream( rExtStream, true );
+ for( const auto& rCustomStream : std::as_const(aCustomStreams) )
+ aParser.parseStream( rCustomStream, true );
}
} // namespace oox::docprop
diff --git a/oox/source/drawingml/chart/chartdrawingfragment.cxx b/oox/source/drawingml/chart/chartdrawingfragment.cxx
index af20cd292368..fb775338d90c 100644
--- a/oox/source/drawingml/chart/chartdrawingfragment.cxx
+++ b/oox/source/drawingml/chart/chartdrawingfragment.cxx
@@ -201,31 +201,31 @@ void ChartDrawingFragment::onCharacters( const OUString& rChars )
void ChartDrawingFragment::onEndElement()
{
- if( isCurrentElement( CDR_TOKEN( absSizeAnchor ), CDR_TOKEN( relSizeAnchor ) ) )
+ if( !isCurrentElement( CDR_TOKEN( absSizeAnchor ), CDR_TOKEN( relSizeAnchor ) ) )
+ return;
+
+ if( mxDrawPage.is() && mxShape.get() && mxAnchor.get() )
{
- if( mxDrawPage.is() && mxShape.get() && mxAnchor.get() )
+ EmuRectangle aShapeRectEmu = mxAnchor->calcAnchorRectEmu( maChartRectEmu );
+ if( (aShapeRectEmu.X >= 0) && (aShapeRectEmu.Y >= 0) && (aShapeRectEmu.Width >= 0) && (aShapeRectEmu.Height >= 0) )
{
- EmuRectangle aShapeRectEmu = mxAnchor->calcAnchorRectEmu( maChartRectEmu );
- 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)
- awt::Rectangle aShapeRectEmu32(
- getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.X, 0, SAL_MAX_INT32 ),
- getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Y, 0, SAL_MAX_INT32 ),
- getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Width, 0, SAL_MAX_INT32 ),
- getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Height, 0, SAL_MAX_INT32 ) );
-
- // Set the position and size before calling addShape().
- mxShape->setPosition(awt::Point(aShapeRectEmu32.X, aShapeRectEmu32.Y));
- mxShape->setSize(awt::Size(aShapeRectEmu32.Width, aShapeRectEmu32.Height));
-
- basegfx::B2DHomMatrix aMatrix;
- mxShape->addShape( getFilter(), getFilter().getCurrentTheme(), mxDrawPage, aMatrix, mxShape->getFillProperties() );
- }
+ // TODO: DrawingML implementation expects 32-bit coordinates for EMU rectangles (change that to EmuRectangle)
+ awt::Rectangle aShapeRectEmu32(
+ getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.X, 0, SAL_MAX_INT32 ),
+ getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Y, 0, SAL_MAX_INT32 ),
+ getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Width, 0, SAL_MAX_INT32 ),
+ getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.Height, 0, SAL_MAX_INT32 ) );
+
+ // Set the position and size before calling addShape().
+ mxShape->setPosition(awt::Point(aShapeRectEmu32.X, aShapeRectEmu32.Y));
+ mxShape->setSize(awt::Size(aShapeRectEmu32.Width, aShapeRectEmu32.Height));
+
+ basegfx::B2DHomMatrix aMatrix;
+ mxShape->addShape( getFilter(), getFilter().getCurrentTheme(), mxDrawPage, aMatrix, mxShape->getFillProperties() );
}
- mxShape.reset();
- mxAnchor.reset();
}
+ mxShape.reset();
+ mxAnchor.reset();
}
} // namespace oox::drawingml::chart
diff --git a/oox/source/drawingml/chart/converterbase.cxx b/oox/source/drawingml/chart/converterbase.cxx
index 46494ebd8d8f..e24d6c72821e 100644
--- a/oox/source/drawingml/chart/converterbase.cxx
+++ b/oox/source/drawingml/chart/converterbase.cxx
@@ -76,7 +76,10 @@ struct TitleLayoutInfo
void TitleLayoutInfo::convertTitlePos( ConverterRoot const & rRoot, const Reference< cssc::XChartDocument >& rxChart1Doc )
{
- if( mxTitle.is() && mpGetShape ) try
+ if( !(mxTitle.is() && mpGetShape) )
+ return;
+
+ try
{
// try to get the title shape
Reference< XShape > xTitleShape = mpGetShape( rxChart1Doc );
@@ -387,48 +390,48 @@ bool LayoutConverter::convertFromModel( PropertySet& rPropSet )
void LayoutConverter::convertFromModel( const Reference< XShape >& rxShape, double fRotationAngle )
{
- if( !mrModel.mbAutoLayout )
+ if( mrModel.mbAutoLayout )
+ return;
+
+ awt::Size aChartSize = getChartSize();
+ if( aChartSize.Width <= 0 || aChartSize.Height <= 0 )
{
- awt::Size aChartSize = getChartSize();
- if( aChartSize.Width <= 0 || aChartSize.Height <= 0 )
- {
- aChartSize = getDefaultPageSize();
- }
- awt::Point aShapePos(
- lclCalcPosition( aChartSize.Width, mrModel.mfX, mrModel.mnXMode ),
- lclCalcPosition( aChartSize.Height, mrModel.mfY, mrModel.mnYMode ) );
- if( (aShapePos.X >= 0) && (aShapePos.Y >= 0) )
- {
- bool bPropSet = false;
- // the call to XShape.getSize() may recalc the chart view
- awt::Size aShapeSize = rxShape->getSize();
- // rotated shapes need special handling...
- if( aShapeSize.Height > 0 || aShapeSize.Width > 0 )
- {
- double fSin = fabs(sin(basegfx::deg2rad(fRotationAngle)));
- // add part of height to X direction, if title is rotated down
- if( fRotationAngle > 180.0 )
- aShapePos.X += static_cast<sal_Int32>(fSin * aShapeSize.Height + 0.5);
- // add part of width to Y direction, if title is rotated up
- else if( fRotationAngle > 0.0 )
- aShapePos.Y += static_cast<sal_Int32>(fSin * aShapeSize.Width + 0.5);
- }
- else if( fRotationAngle == 90.0 || fRotationAngle == 270.0 )
- {
- PropertySet aShapeProp( rxShape );
- RelativePosition aPos(
- getLimitedValue< double, double >(mrModel.mfX, 0.0, 1.0),
- getLimitedValue< double, double >(mrModel.mfY, 0.0, 1.0),
- fRotationAngle == 90.0 ? Alignment_TOP_RIGHT : Alignment_BOTTOM_LEFT );
- // set the resulting position at the shape
- if( aShapeProp.setProperty(PROP_RelativePosition, aPos) )
- bPropSet = true;
- }
- // set the resulting position at the shape
- if( !bPropSet )
- rxShape->setPosition( aShapePos );
- }
+ aChartSize = getDefaultPageSize();
+ }
+ awt::Point aShapePos(
+ lclCalcPosition( aChartSize.Width, mrModel.mfX, mrModel.mnXMode ),
+ lclCalcPosition( aChartSize.Height, mrModel.mfY, mrModel.mnYMode ) );
+ if( !((aShapePos.X >= 0) && (aShapePos.Y >= 0)) )
+ return;
+
+ bool bPropSet = false;
+ // the call to XShape.getSize() may recalc the chart view
+ awt::Size aShapeSize = rxShape->getSize();
+ // rotated shapes need special handling...
+ if( aShapeSize.Height > 0 || aShapeSize.Width > 0 )
+ {
+ double fSin = fabs(sin(basegfx::deg2rad(fRotationAngle)));
+ // add part of height to X direction, if title is rotated down
+ if( fRotationAngle > 180.0 )
+ aShapePos.X += static_cast<sal_Int32>(fSin * aShapeSize.Height + 0.5);
+ // add part of width to Y direction, if title is rotated up
+ else if( fRotationAngle > 0.0 )
+ aShapePos.Y += static_cast<sal_Int32>(fSin * aShapeSize.Width + 0.5);
+ }
+ else if( fRotationAngle == 90.0 || fRotationAngle == 270.0 )
+ {
+ PropertySet aShapeProp( rxShape );
+ RelativePosition aPos(
+ getLimitedValue< double, double >(mrModel.mfX, 0.0, 1.0),
+ getLimitedValue< double, double >(mrModel.mfY, 0.0, 1.0),
+ fRotationAngle == 90.0 ? Alignment_TOP_RIGHT : Alignment_BOTTOM_LEFT );
+ // set the resulting position at the shape
+ if( aShapeProp.setProperty(PROP_RelativePosition, aPos) )
+ bPropSet = true;
}
+ // set the resulting position at the shape
+ if( !bPropSet )
+ rxShape->setPosition( aShapePos );
}
} // namespace oox
diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx
index 1a43409dbea0..b82fdbe6e026 100644
--- a/oox/source/drawingml/chart/objectformatter.cxx
+++ b/oox/source/drawingml/chart/objectformatter.cxx
@@ -728,21 +728,21 @@ DetailFormatterBase::DetailFormatterBase( ObjectFormatterData& rData, const Auto
mrData( rData ),
mnPhClr( 0xffffffff )
{
- if( pAutoFormatEntry )
+ if( !pAutoFormatEntry )
+ return;
+
+ if( pAutoFormatEntry->mpPattern )
{
- if( pAutoFormatEntry->mpPattern )
- {
- // prepare multi-color pattern
- for( const AutoFormatPatternEntry* pPatternEntry = pAutoFormatEntry->mpPattern; pPatternEntry->mnColorToken != XML_TOKEN_INVALID; ++pPatternEntry )
- maColorPattern.push_back( getSchemeColor( pPatternEntry->mnColorToken, pPatternEntry->mnModToken, pPatternEntry->mnModValue ) );
- }
- else if( pAutoFormatEntry->mnColorToken != XML_TOKEN_INVALID )
- {
- // prepare color or single-color pattern (color fading)
- mnPhClr = getSchemeColor( pAutoFormatEntry->mnColorToken, pAutoFormatEntry->mnModToken, pAutoFormatEntry->mnModValue );
- if( pAutoFormatEntry->mbFadedColor )
- maColorPattern.push_back( mnPhClr );
- }
+ // prepare multi-color pattern
+ for( const AutoFormatPatternEntry* pPatternEntry = pAutoFormatEntry->mpPattern; pPatternEntry->mnColorToken != XML_TOKEN_INVALID; ++pPatternEntry )
+ maColorPattern.push_back( getSchemeColor( pPatternEntry->mnColorToken, pPatternEntry->mnModToken, pPatternEntry->mnModValue ) );
+ }
+ else if( pAutoFormatEntry->mnColorToken != XML_TOKEN_INVALID )
+ {
+ // prepare color or single-color pattern (color fading)
+ mnPhClr = getSchemeColor( pAutoFormatEntry->mnColorToken, pAutoFormatEntry->mnModToken, pAutoFormatEntry->mnModValue );
+ if( pAutoFormatEntry->mbFadedColor )
+ maColorPattern.push_back( mnPhClr );
}
}
@@ -817,25 +817,25 @@ DetailFormatterBase::DetailFormatterBase( ObjectFormatterData& rData, const Auto
LineFormatter::LineFormatter( ObjectFormatterData& rData, const AutoFormatEntry* pAutoFormatEntry, const ObjectType eObjType ) :
DetailFormatterBase(rData, pAutoFormatEntry)
{
- if( pAutoFormatEntry )
+ if( !pAutoFormatEntry )
+ return;
+
+ mxAutoLine = std::make_shared<LineProperties>();
+ mxAutoLine->maLineFill.moFillType = XML_noFill;
+ if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
+ if( const LineProperties* pLineProps = pTheme->getLineStyle( pAutoFormatEntry->mnThemedIdx ) )
+ *mxAutoLine = *pLineProps;
+ // set automatic border property for chartarea, because of tdf#81437 and tdf#82217
+ if ( eObjType == OBJECTTYPE_CHARTSPACE )
{
- mxAutoLine = std::make_shared<LineProperties>();
- mxAutoLine->maLineFill.moFillType = XML_noFill;
- if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
- if( const LineProperties* pLineProps = pTheme->getLineStyle( pAutoFormatEntry->mnThemedIdx ) )
- *mxAutoLine = *pLineProps;
- // set automatic border property for chartarea, because of tdf#81437 and tdf#82217
- if ( eObjType == OBJECTTYPE_CHARTSPACE )
- {
- mxAutoLine->maLineFill.moFillType = oox::GraphicHelper::getDefaultChartAreaLineStyle();
- mxAutoLine->moLineWidth = oox::GraphicHelper::getDefaultChartAreaLineWidth();
- // this value is what MSO 2016 use as a default color for chartspace border
- mxAutoLine->maLineFill.maFillColor.setSrgbClr( 0xD9D9D9 );
- }
- // change line width according to chart auto style
- if( mxAutoLine->moLineWidth.has() )
- mxAutoLine->moLineWidth = mxAutoLine->moLineWidth.get() * pAutoFormatEntry->mnRelLineWidth / 100;
+ mxAutoLine->maLineFill.moFillType = oox::GraphicHelper::getDefaultChartAreaLineStyle();
+ mxAutoLine->moLineWidth = oox::GraphicHelper::getDefaultChartAreaLineWidth();
+ // this value is what MSO 2016 use as a default color for chartspace border
+ mxAutoLine->maLineFill.maFillColor.setSrgbClr( 0xD9D9D9 );
}
+ // change line width according to chart auto style
+ if( mxAutoLine->moLineWidth.has() )
+ mxAutoLine->moLineWidth = mxAutoLine->moLineWidth.get() * pAutoFormatEntry->mnRelLineWidth / 100;
}
void LineFormatter::convertFormatting( ShapePropertyMap& rPropMap, const ModelRef< Shape >& rxShapeProp, sal_Int32 nSeriesIdx )
@@ -851,19 +851,19 @@ void LineFormatter::convertFormatting( ShapePropertyMap& rPropMap, const ModelRe
FillFormatter::FillFormatter( ObjectFormatterData& rData, const AutoFormatEntry* pAutoFormatEntry, const ObjectType eObjType ) :
DetailFormatterBase( rData, pAutoFormatEntry )
{
- if( pAutoFormatEntry )
+ if( !pAutoFormatEntry )
+ return;
+
+ mxAutoFill = std::make_shared<FillProperties>();
+ if( eObjType != OBJECTTYPE_CHARTSPACE )
+ mxAutoFill->moFillType = XML_noFill;
+ if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
+ if( const FillProperties* pFillProps = pTheme->getFillStyle( pAutoFormatEntry->mnThemedIdx ) )
+ *mxAutoFill = *pFillProps;
+
+ if (eObjType == OBJECTTYPE_CHARTSPACE)
{
- mxAutoFill = std::make_shared<FillProperties>();
- if( eObjType != OBJECTTYPE_CHARTSPACE )
- mxAutoFill->moFillType = XML_noFill;
- if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
- if( const FillProperties* pFillProps = pTheme->getFillStyle( pAutoFormatEntry->mnThemedIdx ) )
- *mxAutoFill = *pFillProps;
-
- if (eObjType == OBJECTTYPE_CHARTSPACE)
- {
- mxAutoFill->moFillType = rData.mrFilter.getGraphicHelper().getDefaultChartAreaFillStyle();
- }
+ mxAutoFill->moFillType = rData.mrFilter.getGraphicHelper().getDefaultChartAreaFillStyle();
}
}
@@ -892,26 +892,26 @@ const TextCharacterProperties* lclGetTextProperties( const ModelRef< TextBody >&
TextFormatter::TextFormatter( ObjectFormatterData& rData, const AutoTextEntry* pAutoTextEntry, const ModelRef< TextBody >& rxGlobalTextProp ) :
DetailFormatterBase( rData, pAutoTextEntry )
{
- if( pAutoTextEntry )
- {
- mxAutoText = std::make_shared<TextCharacterProperties>();
- if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
- if( const TextCharacterProperties* pTextProps = pTheme->getFontStyle( pAutoTextEntry->mnThemedFont ) )
- *mxAutoText = *pTextProps;
- ::Color nTextColor = getPhColor( -1 );
- if( sal_Int32(nTextColor) >= 0 ) {
- mxAutoText->maFillProperties.maFillColor.setSrgbClr( nTextColor );
- mxAutoText->maFillProperties.moFillType.set(XML_solidFill);
- }
- mxAutoText->moHeight = pAutoTextEntry->mnDefFontSize;
- mxAutoText->moBold = pAutoTextEntry->mbBold;
+ if( !pAutoTextEntry )
+ return;
+
+ mxAutoText = std::make_shared<TextCharacterProperties>();
+ if( const Theme* pTheme = mrData.mrFilter.getCurrentTheme() )
+ if( const TextCharacterProperties* pTextProps = pTheme->getFontStyle( pAutoTextEntry->mnThemedFont ) )
+ *mxAutoText = *pTextProps;
+ ::Color nTextColor = getPhColor( -1 );
+ if( sal_Int32(nTextColor) >= 0 ) {
+ mxAutoText->maFillProperties.maFillColor.setSrgbClr( nTextColor );
+ mxAutoText->maFillProperties.moFillType.set(XML_solidFill);
+ }
+ mxAutoText->moHeight = pAutoTextEntry->mnDefFontSize;
+ mxAutoText->moBold = pAutoTextEntry->mbBold;
- if( const TextCharacterProperties* pTextProps = lclGetTextProperties( rxGlobalTextProp ) )
- {
- mxAutoText->assignUsed( *pTextProps );
- if( pTextProps->moHeight.has() )
- mxAutoText->moHeight = pTextProps->moHeight.get() * pAutoTextEntry->mnRelFontSize / 100;
- }
+ if( const TextCharacterProperties* pTextProps = lclGetTextProperties( rxGlobalTextProp ) )
+ {
+ mxAutoText->assignUsed( *pTextProps );
+ if( pTextProps->moHeight.has() )
+ mxAutoText->moHeight = pTextProps->moHeight.get() * pAutoTextEntry->mnRelFontSize / 100;
}
}
@@ -1050,77 +1050,77 @@ void ObjectFormatter::convertTextFormatting( PropertySet& rPropSet, const TextCh
void ObjectFormatter::convertTextRotation( PropertySet& rPropSet, const ModelRef< TextBody >& rxTextProp, bool bSupportsStacked, sal_Int32 nDefaultRotation )
{
- if( rxTextProp.is() )
+ if( !rxTextProp.is() )
+ return;
+
+ bool bStacked = false;
+ if( bSupportsStacked )
{
- bool bStacked = false;
- if( bSupportsStacked )
- {
- sal_Int32 nVert = rxTextProp->getTextProperties().moVert.get( XML_horz );
- bStacked = (nVert == XML_wordArtVert) || (nVert == XML_wordArtVertRtl);
- rPropSet.setProperty( PROP_StackCharacters, bStacked );
- }
+ sal_Int32 nVert = rxTextProp->getTextProperties().moVert.get( XML_horz );
+ bStacked = (nVert == XML_wordArtVert) || (nVert == XML_wordArtVertRtl);
+ rPropSet.setProperty( PROP_StackCharacters, bStacked );
+ }
- /* Chart2 expects rotation angle as double value in range of [0,360).
- OOXML counts clockwise, Chart2 counts counterclockwise. */
- double fAngle = static_cast< double >( bStacked ? 0 : rxTextProp->getTextProperties().moRotation.get( nDefaultRotation ) );
- // MS Office UI allows values only in range of [-90,90].
- if ( fAngle < -5400000.0 || fAngle > 5400000.0 )
- {
- fAngle = 0.0;
- }
- fAngle = getDoubleIntervalValue< double >( -fAngle / 60000.0, 0.0, 360.0 );
- rPropSet.setProperty( PROP_TextRotation, fAngle );
+ /* Chart2 expects rotation angle as double value in range of [0,360).
+ OOXML counts clockwise, Chart2 counts counterclockwise. */
+ double fAngle = static_cast< double >( bStacked ? 0 : rxTextProp->getTextProperties().moRotation.get( nDefaultRotation ) );
+ // MS Office UI allows values only in range of [-90,90].
+ if ( fAngle < -5400000.0 || fAngle > 5400000.0 )
+ {
+ fAngle = 0.0;
}
+ fAngle = getDoubleIntervalValue< double >( -fAngle / 60000.0, 0.0, 360.0 );
+ rPropSet.setProperty( PROP_TextRotation, fAngle );
}
void ObjectFormatter::convertTextWrap( PropertySet& rPropSet, const ModelRef< TextBody >& rxTextProp )
{
- if( rxTextProp.is() )
+ if( !rxTextProp.is() )
+ return;
+
+ PropertyMap& aPropMap = rxTextProp->getTextProperties().maPropertyMap;
+ if( aPropMap.hasProperty(PROP_TextWordWrap) )
{
- PropertyMap& aPropMap = rxTextProp->getTextProperties().maPropertyMap;
- if( aPropMap.hasProperty(PROP_TextWordWrap) )
+ Any aValue = aPropMap.getProperty( PROP_TextWordWrap );
+ if( aValue.hasValue() )
{
- Any aValue = aPropMap.getProperty( PROP_TextWordWrap );
- if( aValue.hasValue() )
- {
- bool bValue = false;
- aValue >>= bValue;
- rPropSet.setProperty( PROP_TextWordWrap, bValue );
- }
+ bool bValue = false;
+ aValue >>= bValue;
+ rPropSet.setProperty( PROP_TextWordWrap, bValue );
}
}
}
void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFormat& rNumberFormat, bool bAxis, bool bShowPercent )
{
- if( mxData->mxNumFmts.is() )
- {
- const bool bGeneral = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general");
- const bool bPercent = !bAxis && bShowPercent && !rNumberFormat.mbSourceLinked;
- sal_Int32 nPropId = bPercent ? PROP_PercentageNumberFormat : PROP_NumberFormat;
- OUString sFormatCode(rNumberFormat.maFormatCode);
- if (bPercent && bGeneral)
- sFormatCode = "0%";
- try
- {
- sal_Int32 nIndex = bGeneral && !bPercent ?
- mxData->mxNumTypes->getStandardIndex( mxData->maFromLocale ) :
- mxData->mxNumFmts->addNewConverted( sFormatCode, mxData->maEnUsLocale, mxData->maFromLocale );
- if( nIndex >= 0 )
- rPropSet.setProperty( nPropId, nIndex );
- }
- catch( Exception& )
- {
- OSL_FAIL( OStringBuffer( "ObjectFormatter::convertNumberFormat - cannot create number format '" ).
- append( OUStringToOString( rNumberFormat.maFormatCode, osl_getThreadTextEncoding() ) ).append( '\'' ).getStr() );
- }
+ if( !mxData->mxNumFmts.is() )
+ return;
- // Setting "LinkNumberFormatToSource" does not really work, at least not for axis :-/
- if (!bAxis)
- rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.mbSourceLinked));
- else
- rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.maFormatCode.isEmpty()));
+ const bool bGeneral = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general");
+ const bool bPercent = !bAxis && bShowPercent && !rNumberFormat.mbSourceLinked;
+ sal_Int32 nPropId = bPercent ? PROP_PercentageNumberFormat : PROP_NumberFormat;
+ OUString sFormatCode(rNumberFormat.maFormatCode);
+ if (bPercent && bGeneral)
+ sFormatCode = "0%";
+ try
+ {
+ sal_Int32 nIndex = bGeneral && !bPercent ?
+ mxData->mxNumTypes->getStandardIndex( mxData->maFromLocale ) :
+ mxData->mxNumFmts->addNewConverted( sFormatCode, mxData->maEnUsLocale, mxData->maFromLocale );
+ if( nIndex >= 0 )
+ rPropSet.setProperty( nPropId, nIndex );
}
+ catch( Exception& )
+ {
+ OSL_FAIL( OStringBuffer( "ObjectFormatter::convertNumberFormat - cannot create number format '" ).
+ append( OUStringToOString( rNumberFormat.maFormatCode, osl_getThreadTextEncoding() ) ).append( '\'' ).getStr() );
+ }
+
+ // Setting "LinkNumberFormatToSource" does not really work, at least not for axis :-/
+ if (!bAxis)
+ rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.mbSourceLinked));
+ else
+ rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.maFormatCode.isEmpty()));
}
void ObjectFormatter::convertAutomaticFill( PropertySet& rPropSet, ObjectType eObjType, sal_Int32 nSeriesIdx )
diff --git a/oox/source/drawingml/chart/plotareaconverter.cxx b/oox/source/drawingml/chart/plotareaconverter.cxx
index 1862dea1c8cb..e5f337a94193 100644
--- a/oox/source/drawingml/chart/plotareaconverter.cxx
+++ b/oox/source/drawingml/chart/plotareaconverter.cxx
@@ -114,7 +114,10 @@ void AxesSetConverter::convertFromModel( const Reference< XDiagram >& rxDiagram,
aTypeGroups.push_back( std::make_shared<TypeGroupConverter>( *this, *typeGroup ) );
OSL_ENSURE( !aTypeGroups.empty(), "AxesSetConverter::convertFromModel - no type groups in axes set" );
- if( !aTypeGroups.empty() ) try
+ if( aTypeGroups.empty() )
+ return;
+
+ try
{
// first type group needed for coordinate system and axis conversion
TypeGroupConverter& rFirstTypeGroup = *aTypeGroups.front();
@@ -452,7 +455,10 @@ void PlotAreaConverter::convertPositionFromModel()
LayoutModel& rLayout = mrModel.mxLayout.getOrCreate();
LayoutConverter aLayoutConv( *this, rLayout );
awt::Rectangle aDiagramRect;
- if( aLayoutConv.calcAbsRectangle( aDiagramRect ) ) try
+ if( !aLayoutConv.calcAbsRectangle( aDiagramRect ) )
+ return;
+
+ try
{
namespace cssc = ::com::sun::star::chart;
Reference< cssc::XChartDocument > xChart1Doc( getChartDocument(), UNO_QUERY_THROW );
diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx
index f063019b8327..01e004f45c59 100644
--- a/oox/source/drawingml/chart/seriesconverter.cxx
+++ b/oox/source/drawingml/chart/seriesconverter.cxx
@@ -134,49 +134,50 @@ void lclConvertLabelFormatting( PropertySet& rPropSet, ObjectFormatter& rFormatt
rPropSet.setProperty( PROP_Label, aPointLabel );
}
- if( !rDataLabel.mbDeleted )
- {
- // data label number format (percentage format wins over value format)
- rFormatter.convertNumberFormat( rPropSet, rDataLabel.maNumberFormat, false, bShowPercent );
-
- // data label text formatting (frame formatting not supported by Chart2)
- if( bDataSeriesLabel || (rDataLabel.mxTextProp.is() && !rDataLabel.mxTextProp->getParagraphs().empty()) )
- convertTextProperty(rPropSet, rFormatter, rDataLabel.mxTextProp);
-
- // data label separator (do not overwrite series separator, if no explicit point separator is present)
- // Set the data label separator to "new line" if the value is shown as percentage with a category name,
- // just like in MS-Office. In any other case the default separator will be a semicolon.
- if( bShowPercent && !bShowValue && ( bDataSeriesLabel || rDataLabel.moaSeparator.has() ) )
- rPropSet.setProperty( PROP_LabelSeparator, rDataLabel.moaSeparator.get( "\n" ) );
- else if( bDataSeriesLabel || rDataLabel.moaSeparator.has() )
- rPropSet.setProperty( PROP_LabelSeparator, rDataLabel.moaSeparator.get( "; " ) );
-
- // data label placement (do not overwrite series placement, if no explicit point placement is present)
- if( bDataSeriesLabel || rDataLabel.monLabelPos.has() )
- {
- namespace csscd = ::com::sun::star::chart::DataLabelPlacement;
- sal_Int32 nPlacement = -1;
- switch( rDataLabel.monLabelPos.get( XML_TOKEN_INVALID ) )
- {
- case XML_outEnd: nPlacement = csscd::OUTSIDE; break;
- case XML_inEnd: nPlacement = csscd::INSIDE; break;
- case XML_ctr: nPlacement = csscd::CENTER; break;
- case XML_inBase: nPlacement = csscd::NEAR_ORIGIN; break;
- case XML_t: nPlacement = csscd::TOP; break;
- case XML_b: nPlacement = csscd::BOTTOM; break;
- case XML_l: nPlacement = csscd::LEFT; break;
- case XML_r: nPlacement = csscd::RIGHT; break;
- case XML_bestFit: nPlacement = csscd::AVOID_OVERLAP; break;
- }
+ if( rDataLabel.mbDeleted )
+ return;
- if( !bDataSeriesLabel && nPlacement == -1 )
- return;
- else if( nPlacement == -1 )
- nPlacement = rTypeInfo.mnDefLabelPos;
+ // data label number format (percentage format wins over value format)
+ rFormatter.convertNumberFormat( rPropSet, rDataLabel.maNumberFormat, false, bShowPercent );
- rPropSet.setProperty( PROP_LabelPlacement, nPlacement );
- }
+ // data label text formatting (frame formatting not supported by Chart2)
+ if( bDataSeriesLabel || (rDataLabel.mxTextProp.is() && !rDataLabel.mxTextProp->getParagraphs().empty()) )
+ convertTextProperty(rPropSet, rFormatter, rDataLabel.mxTextProp);
+
+ // data label separator (do not overwrite series separator, if no explicit point separator is present)
+ // Set the data label separator to "new line" if the value is shown as percentage with a category name,
+ // just like in MS-Office. In any other case the default separator will be a semicolon.
+ if( bShowPercent && !bShowValue && ( bDataSeriesLabel || rDataLabel.moaSeparator.has() ) )
+ rPropSet.setProperty( PROP_LabelSeparator, rDataLabel.moaSeparator.get( "\n" ) );
+ else if( bDataSeriesLabel || rDataLabel.moaSeparator.has() )
+ rPropSet.setProperty( PROP_LabelSeparator, rDataLabel.moaSeparator.get( "; " ) );
+
+ // data label placement (do not overwrite series placement, if no explicit point placement is present)
+ if( !(bDataSeriesLabel || rDataLabel.monLabelPos.has()) )
+ return;
+
+ namespace csscd = ::com::sun::star::chart::DataLabelPlacement;
+ sal_Int32 nPlacement = -1;
+ switch( rDataLabel.monLabelPos.get( XML_TOKEN_INVALID ) )
+ {
+ case XML_outEnd: nPlacement = csscd::OUTSIDE; break;
+ case XML_inEnd: nPlacement = csscd::INSIDE; break;
+ case XML_ctr: nPlacement = csscd::CENTER; break;
+ case XML_inBase: nPlacement = csscd::NEAR_ORIGIN; break;
+ case XML_t: nPlacement = csscd::TOP; break;
+ case XML_b: nPlacement = csscd::BOTTOM; break;
+ case XML_l: nPlacement = csscd::LEFT; break;
+ case XML_r: nPlacement = csscd::RIGHT; break;
+ case XML_bestFit: nPlacement = csscd::AVOID_OVERLAP; break;
}
+
+ if( !bDataSeriesLabel && nPlacement == -1 )
+ return;
+
+ if( nPlacement == -1 )
+ nPlacement = rTypeInfo.mnDefLabelPos;
+
+ rPropSet.setProperty( PROP_LabelPlacement, nPlacement );
}
void importBorderProperties( PropertySet& rPropSet, Shape& rShape, const GraphicHelper& rGraphicHelper )
@@ -356,7 +357,10 @@ void ErrorBarConverter::convertFromModel( const Reference< XDataSeries >& rxData
{
bool bShowPos = (mrModel.mnTypeId == XML_plus) || (mrModel.mnTypeId == XML_both);
bool bShowNeg = (mrModel.mnTypeId == XML_minus) || (mrModel.mnTypeId == XML_both);
- if( bShowPos || bShowNeg ) try
+ if( !(bShowPos || bShowNeg) )
+ return;
+
+ try
{
Reference< XPropertySet > xErrorBar( createInstance( "com.sun.star.chart2.ErrorBar" ), UNO_QUERY_THROW );
PropertySet aBarProp( xErrorBar );
diff --git a/oox/source/drawingml/chart/titleconverter.cxx b/oox/source/drawingml/chart/titleconverter.cxx
index 10ebd308b4fa..a4a2d9c1ec89 100644
--- a/oox/source/drawingml/chart/titleconverter.cxx
+++ b/oox/source/drawingml/chart/titleconverter.cxx
@@ -144,34 +144,37 @@ TitleConverter::~TitleConverter()
void TitleConverter::convertFromModel( const Reference< XTitled >& rxTitled, const OUString& rAutoTitle, ObjectType eObjType, sal_Int32 nMainIdx, sal_Int32 nSubIdx )
{
- if( rxTitled.is() )
+ if( !rxTitled.is() )
+ return;
+
+ // create the formatted strings
+ TextModel& rText = mrModel.mxText.getOrCreate();
+ TextConverter aTextConv( *this, rText );
+ Sequence< Reference< XFormattedString > > aStringSeq = aTextConv.createStringSequence( rAutoTitle, mrModel.mxTextProp, eObjType );
+ if( !aStringSeq.hasElements() )
+ return;
+
+ try
+ {
+ // create the title object and set the string data
+ Reference< XTitle > xTitle( createInstance( "com.sun.star.chart2.Title" ), UNO_QUERY_THROW );
+ xTitle->setText( aStringSeq );
+ rxTitled->setTitleObject( xTitle );
+
+ // frame formatting (text formatting already done in TextConverter::createStringSequence())
+ PropertySet aPropSet( xTitle );
+ getFormatter().convertFrameFormatting( aPropSet, mrModel.mxShapeProp, eObjType );
+
+ // frame rotation
+ OSL_ENSURE( !mrModel.mxTextProp || !rText.mxTextBody, "TitleConverter::convertFromModel - multiple text properties" );
+ ModelRef< TextBody > xTextProp = mrModel.mxTextProp.is() ? mrModel.mxTextProp : rText.mxTextBody;
+ ObjectFormatter::convertTextRotation( aPropSet, xTextProp, true, mrModel.mnDefaultRotation );
+
+ // register the title and layout data for conversion of position
+ registerTitleLayout( xTitle, mrModel.mxLayout, eObjType, nMainIdx, nSubIdx );
+ }
+ catch( Exception& )
{
- // create the formatted strings
- TextModel& rText = mrModel.mxText.getOrCreate();
- TextConverter aTextConv( *this, rText );
- Sequence< Reference< XFormattedString > > aStringSeq = aTextConv.createStringSequence( rAutoTitle, mrModel.mxTextProp, eObjType );
- if( aStringSeq.hasElements() ) try
- {
- // create the title object and set the string data
- Reference< XTitle > xTitle( createInstance( "com.sun.star.chart2.Title" ), UNO_QUERY_THROW );
- xTitle->setText( aStringSeq );
- rxTitled->setTitleObject( xTitle );
-
- // frame formatting (text formatting already done in TextConverter::createStringSequence())
- PropertySet aPropSet( xTitle );
- getFormatter().convertFrameFormatting( aPropSet, mrModel.mxShapeProp, eObjType );
-
- // frame rotation
- OSL_ENSURE( !mrModel.mxTextProp || !rText.mxTextBody, "TitleConverter::convertFromModel - multiple text properties" );
- ModelRef< TextBody > xTextProp = mrModel.mxTextProp.is() ? mrModel.mxTextProp : rText.mxTextBody;
- ObjectFormatter::convertTextRotation( aPropSet, xTextProp, true, mrModel.mnDefaultRotation );
-
- // register the title and layout data for conversion of position
- registerTitleLayout( xTitle, mrModel.mxLayout, eObjType, nMainIdx, nSubIdx );
- }
- catch( Exception& )
- {
- }
}
}
@@ -186,7 +189,10 @@ LegendConverter::~LegendConverter()
void LegendConverter::convertFromModel( const Reference< XDiagram >& rxDiagram )
{
- if( rxDiagram.is() ) try
+ if( !rxDiagram.is() )
+ return;
+
+ try
{
namespace cssc = ::com::sun::star::chart;
namespace cssc2 = ::com::sun::star::chart2;
diff --git a/oox/source/drawingml/chart/typegroupconverter.cxx b/oox/source/drawingml/chart/typegroupconverter.cxx
index 7ce8adc3ffdf..f55ac931fb98 100644
--- a/oox/source/drawingml/chart/typegroupconverter.cxx
+++ b/oox/source/drawingml/chart/typegroupconverter.cxx
@@ -468,50 +468,50 @@ void TypeGroupConverter::convertFromModel( const Reference< XDiagram >& rxDiagra
void TypeGroupConverter::convertMarker( PropertySet& rPropSet, sal_Int32 nOoxSymbol, sal_Int32 nOoxSize,
const ModelRef< Shape >& xShapeProps ) const
{
- if( !isSeriesFrameFormat() )
- {
- namespace cssc = ::com::sun::star::chart2;
+ if( isSeriesFrameFormat() )
+ return;
- // symbol style
- cssc::Symbol aSymbol;
- aSymbol.Style = cssc::SymbolStyle_STANDARD;
- switch( nOoxSymbol ) // compare with XclChPropSetHelper::WriteMarkerProperties in xlchart.cxx
- {
- case XML_auto: aSymbol.Style = cssc::SymbolStyle_AUTO; break;
- case XML_none: aSymbol.Style = cssc::SymbolStyle_NONE; break;
- case XML_square: aSymbol.StandardSymbol = 0; break; // square
- case XML_diamond: aSymbol.StandardSymbol = 1; break; // diamond
- case XML_triangle: aSymbol.StandardSymbol = 3; break; // arrow up
- case XML_x: aSymbol.StandardSymbol = 10; break; // X, legacy bow tie
- case XML_star: aSymbol.StandardSymbol = 12; break; // asterisk, legacy sand glass
- case XML_dot: aSymbol.StandardSymbol = 4; break; // arrow right
- case XML_dash: aSymbol.StandardSymbol = 13; break; // horizontal bar, legacy arrow down
- case XML_circle: aSymbol.StandardSymbol = 8; break; // circle, legacy arrow right
- case XML_plus: aSymbol.StandardSymbol = 11; break; // plus, legacy arrow left
- }
+ namespace cssc = ::com::sun::star::chart2;
- // symbol size (points in OOXML, 1/100 mm in Chart2)
- sal_Int32 nSize = static_cast< sal_Int32 >( nOoxSize * (2540.0 / 72.0) + 0.5 );
- aSymbol.Size.Width = aSymbol.Size.Height = nSize;
+ // symbol style
+ cssc::Symbol aSymbol;
+ aSymbol.Style = cssc::SymbolStyle_STANDARD;
+ switch( nOoxSymbol ) // compare with XclChPropSetHelper::WriteMarkerProperties in xlchart.cxx
+ {
+ case XML_auto: aSymbol.Style = cssc::SymbolStyle_AUTO; break;
+ case XML_none: aSymbol.Style = cssc::SymbolStyle_NONE; break;
+ case XML_square: aSymbol.StandardSymbol = 0; break; // square
+ case XML_diamond: aSymbol.StandardSymbol = 1; break; // diamond
+ case XML_triangle: aSymbol.StandardSymbol = 3; break; // arrow up
+ case XML_x: aSymbol.StandardSymbol = 10; break; // X, legacy bow tie
+ case XML_star: aSymbol.StandardSymbol = 12; break; // asterisk, legacy sand glass
+ case XML_dot: aSymbol.StandardSymbol = 4; break; // arrow right
+ case XML_dash: aSymbol.StandardSymbol = 13; break; // horizontal bar, legacy arrow down
+ case XML_circle: aSymbol.StandardSymbol = 8; break; // circle, legacy arrow right
+ case XML_plus: aSymbol.StandardSymbol = 11; break; // plus, legacy arrow left
+ }
+
+ // symbol size (points in OOXML, 1/100 mm in Chart2)
+ sal_Int32 nSize = static_cast< sal_Int32 >( nOoxSize * (2540.0 / 72.0) + 0.5 );
+ aSymbol.Size.Width = aSymbol.Size.Height = nSize;
- if(xShapeProps.is())
+ if(xShapeProps.is())
+ {
+ Color aFillColor = xShapeProps->getFillProperties().maFillColor;
+ aSymbol.FillColor = sal_Int32(aFillColor.getColor(getFilter().getGraphicHelper()));
+ // tdf#124817: if there is no fill color, use line color of the symbol
+ if( aSymbol.FillColor < 0 )
{
- Color aFillColor = xShapeProps->getFillProperties().maFillColor;
- aSymbol.FillColor = sal_Int32(aFillColor.getColor(getFilter().getGraphicHelper()));
- // tdf#124817: if there is no fill color, use line color of the symbol
- if( aSymbol.FillColor < 0 )
- {
- Color aLineColor = xShapeProps->getLineProperties().maLineFill.maFillColor;
- aSymbol.BorderColor = sal_Int32(aLineColor.getColor(getFilter().getGraphicHelper()));
- rPropSet.setProperty(PROP_Color, aSymbol.BorderColor);
- }
- else
- rPropSet.setProperty(PROP_Color, aSymbol.FillColor);
+ Color aLineColor = xShapeProps->getLineProperties().maLineFill.maFillColor;
+ aSymbol.BorderColor = sal_Int32(aLineColor.getColor(getFilter().getGraphicHelper()));
+ rPropSet.setProperty(PROP_Color, aSymbol.BorderColor);
}
-
- // set the property
- rPropSet.setProperty( PROP_Symbol, aSymbol );
+ else
+ rPropSet.setProperty(PROP_Color, aSymbol.FillColor);
}
+
+ // set the property
+ rPropSet.setProperty( PROP_Symbol, aSymbol );
}
void TypeGroupConverter::convertLineSmooth( PropertySet& rPropSet, bool bOoxSmooth ) const
@@ -526,23 +526,23 @@ void TypeGroupConverter::convertLineSmooth( PropertySet& rPropSet, bool bOoxSmoo
void TypeGroupConverter::convertBarGeometry( PropertySet& rPropSet, sal_Int32 nOoxShape ) const
{
- if( mb3dChart && (maTypeInfo.meTypeCategory == TYPECATEGORY_BAR) )
- {
- namespace cssc = ::com::sun::star::chart2;
+ if( !(mb3dChart && (maTypeInfo.meTypeCategory == TYPECATEGORY_BAR)) )
+ return;
- sal_Int32 nGeom3d = cssc::DataPointGeometry3D::CUBOID;
- switch( nOoxShape )
- {
- case XML_box: nGeom3d = cssc::DataPointGeometry3D::CUBOID; break;
- case XML_cone: nGeom3d = cssc::DataPointGeometry3D::CONE; break;
- case XML_coneToMax: nGeom3d = cssc::DataPointGeometry3D::CONE; break;
- case XML_cylinder: nGeom3d = cssc::DataPointGeometry3D::CYLINDER; break;
- case XML_pyramid: nGeom3d = cssc::DataPointGeometry3D::PYRAMID; break;
- case XML_pyramidToMax: nGeom3d = cssc::DataPointGeometry3D::PYRAMID; break;
- default: OSL_FAIL( "TypeGroupConverter::convertBarGeometry - unknown 3D bar shape type" );
- }
- rPropSet.setProperty( PROP_Geometry3D, nGeom3d );
+ namespace cssc = ::com::sun::star::chart2;
+
+ sal_Int32 nGeom3d = cssc::DataPointGeometry3D::CUBOID;
+ switch( nOoxShape )
+ {
+ case XML_box: nGeom3d = cssc::DataPointGeometry3D::CUBOID; break;
+ case XML_cone: nGeom3d = cssc::DataPointGeometry3D::CONE; break;
+ case XML_coneToMax: nGeom3d = cssc::DataPointGeometry3D::CONE; break;
+ case XML_cylinder: nGeom3d = cssc::DataPointGeometry3D::CYLINDER; break;
+ case XML_pyramid: nGeom3d = cssc::DataPointGeometry3D::PYRAMID; break;
+ case XML_pyramidToMax: nGeom3d = cssc::DataPointGeometry3D::PYRAMID; break;
+ default: OSL_FAIL( "TypeGroupConverter::convertBarGeometry - unknown 3D bar shape type" );
}
+ rPropSet.setProperty( PROP_Geometry3D, nGeom3d );
}
void TypeGroupConverter::convertPieRotation( PropertySet& rPropSet, sal_Int32 nOoxAngle ) const
@@ -569,33 +569,33 @@ void TypeGroupConverter::convertPieExplosion( PropertySet& rPropSet, sal_Int32 n
void TypeGroupConverter::insertDataSeries( const Reference< XChartType >& rxChartType, const Reference< XDataSeries >& rxSeries, sal_Int32 nAxesSetIdx )
{
- if( rxSeries.is() )
- {
- PropertySet aSeriesProp( rxSeries );
+ if( !rxSeries.is() )
+ return;
- // series stacking mode
- namespace cssc = ::com::sun::star::chart2;
- cssc::StackingDirection eStacking = cssc::StackingDirection_NO_STACKING;
- // stacked overrides deep-3d
- if( isStacked() || isPercent() )
- eStacking = cssc::StackingDirection_Y_STACKING;
- else if( isDeep3dChart() )
- eStacking = cssc::StackingDirection_Z_STACKING;
- aSeriesProp.setProperty( PROP_StackingDirection, eStacking );
-
- // additional series properties
- aSeriesProp.setProperty( PROP_AttachedAxisIndex, nAxesSetIdx );
-
- // insert series into container
- try
- {
- Reference< XDataSeriesContainer > xSeriesCont( rxChartType, UNO_QUERY_THROW );
- xSeriesCont->addDataSeries( rxSeries );
- }
- catch( Exception& )
- {
- OSL_FAIL( "TypeGroupConverter::insertDataSeries - cannot add data series" );
- }
+ PropertySet aSeriesProp( rxSeries );
+
+ // series stacking mode
+ namespace cssc = ::com::sun::star::chart2;
+ cssc::StackingDirection eStacking = cssc::StackingDirection_NO_STACKING;
+ // stacked overrides deep-3d
+ if( isStacked() || isPercent() )
+ eStacking = cssc::StackingDirection_Y_STACKING;
+ else if( isDeep3dChart() )
+ eStacking = cssc::StackingDirection_Z_STACKING;
+ aSeriesProp.setProperty( PROP_StackingDirection, eStacking );
+
+ // additional series properties
+ aSeriesProp.setProperty( PROP_AttachedAxisIndex, nAxesSetIdx );
+
+ // insert series into container
+ try
+ {
+ Reference< XDataSeriesContainer > xSeriesCont( rxChartType, UNO_QUERY_THROW );
+ xSeriesCont->addDataSeries( rxSeries );
+ }
+ catch( Exception& )
+ {
+ OSL_FAIL( "TypeGroupConverter::insertDataSeries - cannot add data series" );
}
}
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index c8cc88f7b470..acc13271ebc1 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -325,157 +325,222 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap,
const GraphicHelper& rGraphicHelper, sal_Int32 nShapeRotation, ::Color nPhClr,
bool bFlipH, bool bFlipV ) const
{
- if( moFillType.has() )
+ if( !moFillType.has() )
+ return;
+
+ FillStyle eFillStyle = FillStyle_NONE;
+ OSL_ASSERT((moFillType.get() & sal_Int32(0xFFFF0000))==0);
+ switch( moFillType.get() )
{
- FillStyle eFillStyle = FillStyle_NONE;
- OSL_ASSERT((moFillType.get() & sal_Int32(0xFFFF0000))==0);
- switch( moFillType.get() )
- {
- case XML_noFill:
- eFillStyle = FillStyle_NONE;
- break;
+ case XML_noFill:
+ eFillStyle = FillStyle_NONE;
+ break;
- case XML_solidFill:
- if( maFillColor.isUsed() )
+ case XML_solidFill:
+ if( maFillColor.isUsed() )
+ {
+ rPropMap.setProperty( ShapeProperty::FillColor, maFillColor.getColor( rGraphicHelper, nPhClr ) );
+ if( maFillColor.hasTransparency() )
+ rPropMap.setProperty( ShapeProperty::FillTransparency, maFillColor.getTransparency() );
+ eFillStyle = FillStyle_SOLID;
+ }
+ break;
+
+ case XML_gradFill:
+ // do not create gradient struct if property is not supported...
+ if( rPropMap.supportsProperty( ShapeProperty::FillGradient ) )
+ {
+ sal_Int32 nEndTrans = 0;
+ sal_Int32 nStartTrans = 0;
+ awt::Gradient aGradient;
+ aGradient.Angle = 900;
+ aGradient.StartIntensity = 100;
+ aGradient.EndIntensity = 100;
+
+ // Old code, values in aGradient overwritten in many cases by newer code below
+ if( maGradientProps.maGradientStops.size() > 1 )
{
- rPropMap.setProperty( ShapeProperty::FillColor, maFillColor.getColor( rGraphicHelper, nPhClr ) );
- if( maFillColor.hasTransparency() )
- rPropMap.setProperty( ShapeProperty::FillTransparency, maFillColor.getTransparency() );
- eFillStyle = FillStyle_SOLID;
+ aGradient.StartColor = sal_Int32(maGradientProps.maGradientStops.begin()->second.getColor( rGraphicHelper, nPhClr ));
+ aGradient.EndColor = sal_Int32(maGradientProps.maGradientStops.rbegin()->second.getColor( rGraphicHelper, nPhClr ));
+ if( maGradientProps.maGradientStops.rbegin()->second.hasTransparency() )
+ nEndTrans = maGradientProps.maGradientStops.rbegin()->second.getTransparency()*255/100;
+ if( maGradientProps.maGradientStops.begin()->second.hasTransparency() )
+ nStartTrans = maGradientProps.maGradientStops.begin()->second.getTransparency()*255/100;
}
- break;
- case XML_gradFill:
- // do not create gradient struct if property is not supported...
- if( rPropMap.supportsProperty( ShapeProperty::FillGradient ) )
+ // "rotate with shape" set to false -> do not rotate
+ if ( !maGradientProps.moRotateWithShape.get( true ) )
+ nShapeRotation = 0;
+
+ if( maGradientProps.moGradientPath.has() )
+ {
+ // position of gradient center (limited to [30%;100%], otherwise gradient is too hidden)
+ IntegerRectangle2D aFillToRect = maGradientProps.moFillToRect.get( IntegerRectangle2D( 0, 0, MAX_PERCENT, MAX_PERCENT ) );
+ sal_Int32 nCenterX = (MAX_PERCENT + aFillToRect.X1 - aFillToRect.X2) / 2;
+ aGradient.XOffset = getLimitedValue<sal_Int16, sal_Int32>(
+ nCenterX / PER_PERCENT, 30, 100);
+
+ // Style should be radial at least when the horizontal center is at 50%.
+ awt::GradientStyle eCircle = aGradient.XOffset == 50
+ ? awt::GradientStyle_RADIAL
+ : awt::GradientStyle_ELLIPTICAL;
+ aGradient.Style = (maGradientProps.moGradientPath.get() == XML_circle)
+ ? eCircle
+ : awt::GradientStyle_RECT;
+
+ sal_Int32 nCenterY = (MAX_PERCENT + aFillToRect.Y1 - aFillToRect.Y2) / 2;
+ aGradient.YOffset = getLimitedValue<sal_Int16, sal_Int32>(
+ nCenterY / PER_PERCENT, 30, 100);
+ ::std::swap( aGradient.StartColor, aGradient.EndColor );
+ ::std::swap( nStartTrans, nEndTrans );
+
+ extractGradientBorderFromStops(maGradientProps, rGraphicHelper, nPhClr,
+ aGradient);
+ }
+ else if (!maGradientProps.maGradientStops.empty())
{
- sal_Int32 nEndTrans = 0;
- sal_Int32 nStartTrans = 0;
- awt::Gradient aGradient;
- aGradient.Angle = 900;
- aGradient.StartIntensity = 100;
- aGradient.EndIntensity = 100;
-
- // Old code, values in aGradient overwritten in many cases by newer code below
- if( maGradientProps.maGradientStops.size() > 1 )
+ // A copy of the gradient stops for local modification
+ GradientFillProperties::GradientStopMap aGradientStops(maGradientProps.maGradientStops);
+
+ // Add a fake gradient stop at 0% and 100% if necessary, so that the gradient always starts
+ // at 0% and ends at 100%, to make following logic clearer (?).
+ auto a0 = aGradientStops.find( 0.0 );
+ if( a0 == aGradientStops.end() )
{
- aGradient.StartColor = sal_Int32(maGradientProps.maGradientStops.begin()->second.getColor( rGraphicHelper, nPhClr ));
- aGradient.EndColor = sal_Int32(maGradientProps.maGradientStops.rbegin()->second.getColor( rGraphicHelper, nPhClr ));
- if( maGradientProps.maGradientStops.rbegin()->second.hasTransparency() )
- nEndTrans = maGradientProps.maGradientStops.rbegin()->second.getTransparency()*255/100;
- if( maGradientProps.maGradientStops.begin()->second.hasTransparency() )
- nStartTrans = maGradientProps.maGradientStops.begin()->second.getTransparency()*255/100;
+ // temp variable required
+ Color aFirstColor(aGradientStops.begin()->second);
+ aGradientStops.emplace( 0.0, aFirstColor );
}
- // "rotate with shape" set to false -> do not rotate
- if ( !maGradientProps.moRotateWithShape.get( true ) )
- nShapeRotation = 0;
-
- if( maGradientProps.moGradientPath.has() )
+ auto a1 = aGradientStops.find( 1.0 );
+ if( a1 == aGradientStops.end() )
{
- // position of gradient center (limited to [30%;100%], otherwise gradient is too hidden)
- IntegerRectangle2D aFillToRect = maGradientProps.moFillToRect.get( IntegerRectangle2D( 0, 0, MAX_PERCENT, MAX_PERCENT ) );
- sal_Int32 nCenterX = (MAX_PERCENT + aFillToRect.X1 - aFillToRect.X2) / 2;
- aGradient.XOffset = getLimitedValue<sal_Int16, sal_Int32>(
- nCenterX / PER_PERCENT, 30, 100);
-
- // Style should be radial at least when the horizontal center is at 50%.
- awt::GradientStyle eCircle = aGradient.XOffset == 50
- ? awt::GradientStyle_RADIAL
- : awt::GradientStyle_ELLIPTICAL;
- aGradient.Style = (maGradientProps.moGradientPath.get() == XML_circle)
- ? eCircle
- : awt::GradientStyle_RECT;
-
- sal_Int32 nCenterY = (MAX_PERCENT + aFillToRect.Y1 - aFillToRect.Y2) / 2;
- aGradient.YOffset = getLimitedValue<sal_Int16, sal_Int32>(
- nCenterY / PER_PERCENT, 30, 100);
- ::std::swap( aGradient.StartColor, aGradient.EndColor );
- ::std::swap( nStartTrans, nEndTrans );
-
- extractGradientBorderFromStops(maGradientProps, rGraphicHelper, nPhClr,
- aGradient);
+ // ditto
+ Color aLastColor(aGradientStops.rbegin()->second);
+ aGradientStops.emplace( 1.0, aLastColor );
}
- else if (!maGradientProps.maGradientStops.empty())
- {
- // A copy of the gradient stops for local modification
- GradientFillProperties::GradientStopMap aGradientStops(maGradientProps.maGradientStops);
- // Add a fake gradient stop at 0% and 100% if necessary, so that the gradient always starts
- // at 0% and ends at 100%, to make following logic clearer (?).
- auto a0 = aGradientStops.find( 0.0 );
- if( a0 == aGradientStops.end() )
- {
- // temp variable required
- Color aFirstColor(aGradientStops.begin()->second);
- aGradientStops.emplace( 0.0, aFirstColor );
- }
-
- auto a1 = aGradientStops.find( 1.0 );
- if( a1 == aGradientStops.end() )
+ // Check if the gradient is symmetric, which we will emulate with an "axial" gradient.
+ bool bSymmetric(true);
+ {
+ GradientFillProperties::GradientStopMap::const_iterator aItA( aGradientStops.begin() );
+ GradientFillProperties::GradientStopMap::const_iterator aItZ(std::prev(aGradientStops.end()));
+ while( bSymmetric && aItA->first < aItZ->first )
{
- // ditto
- Color aLastColor(aGradientStops.rbegin()->second);
- aGradientStops.emplace( 1.0, aLastColor );
+ if (!aItA->second.equals(aItZ->second, rGraphicHelper, nPhClr))
+ bSymmetric = false;
+ else
+ {
+ ++aItA;
+ aItZ = std::prev(aItZ);
+ }
}
+ // Don't be fooled if the middlemost stop isn't at 0.5.
+ if( bSymmetric && aItA == aItZ && aItA->first != 0.5 )
+ bSymmetric = false;
- // Check if the gradient is symmetric, which we will emulate with an "axial" gradient.
- bool bSymmetric(true);
+ // If symmetric, do the rest of the logic for just a half.
+ if( bSymmetric )
{
- GradientFillProperties::GradientStopMap::const_iterator aItA( aGradientStops.begin() );
- GradientFillProperties::GradientStopMap::const_iterator aItZ(std::prev(aGradientStops.end()));
- while( bSymmetric && aItA->first < aItZ->first )
+ // aItZ already points to the colour for the middle, but insert a fake stop at the
+ // exact middle if necessary.
+ if( aItA->first != aItZ->first )
{
- if (!aItA->second.equals(aItZ->second, rGraphicHelper, nPhClr))
- bSymmetric = false;
- else
- {
- ++aItA;
- aItZ = std::prev(aItZ);
- }
- }
- // Don't be fooled if the middlemost stop isn't at 0.5.
- if( bSymmetric && aItA == aItZ && aItA->first != 0.5 )
- bSymmetric = false;
+ Color aMiddleColor = aItZ->second;
+ auto a05 = aGradientStops.find( 0.5 );
- // If symmetric, do the rest of the logic for just a half.
- if( bSymmetric )
- {
- // aItZ already points to the colour for the middle, but insert a fake stop at the
- // exact middle if necessary.
- if( aItA->first != aItZ->first )
- {
- Color aMiddleColor = aItZ->second;
- auto a05 = aGradientStops.find( 0.5 );
-
- if( a05 != aGradientStops.end() )
- a05->second = aMiddleColor;
- else
- aGradientStops.emplace( 0.5, aMiddleColor );
- }
- // Drop the rest of the stops
- while( aGradientStops.rbegin()->first > 0.5 )
- aGradientStops.erase( aGradientStops.rbegin()->first );
+ if( a05 != aGradientStops.end() )
+ a05->second = aMiddleColor;
+ else
+ aGradientStops.emplace( 0.5, aMiddleColor );
}
+ // Drop the rest of the stops
+ while( aGradientStops.rbegin()->first > 0.5 )
+ aGradientStops.erase( aGradientStops.rbegin()->first );
}
+ }
- SAL_INFO("oox.drawingml.gradient", "symmetric: " << (bSymmetric ? "YES" : "NO") <<
- ", number of stops: " << aGradientStops.size());
- size_t nIndex = 0;
- for (auto const& gradientStop : aGradientStops)
- SAL_INFO("oox.drawingml.gradient", " " << nIndex++ << ": " <<
- gradientStop.first << ": " <<
- std::hex << sal_Int32(gradientStop.second.getColor( rGraphicHelper, nPhClr )) << std::dec <<
- "@" << (100 - gradientStop.second.getTransparency()) << "%");
-
- // Now estimate the simple LO style gradient (only two stops, at n% and 100%, where n ==
- // the "border") that best emulates the gradient between begin() and prior(end()).
-
- // First look for the largest segment in the gradient.
- GradientFillProperties::GradientStopMap::iterator aIt(aGradientStops.begin());
- double nWidestWidth = -1;
- GradientFillProperties::GradientStopMap::iterator aWidestSegmentStart;
+ SAL_INFO("oox.drawingml.gradient", "symmetric: " << (bSymmetric ? "YES" : "NO") <<
+ ", number of stops: " << aGradientStops.size());
+ size_t nIndex = 0;
+ for (auto const& gradientStop : aGradientStops)
+ SAL_INFO("oox.drawingml.gradient", " " << nIndex++ << ": " <<
+ gradientStop.first << ": " <<
+ std::hex << sal_Int32(gradientStop.second.getColor( rGraphicHelper, nPhClr )) << std::dec <<
+ "@" << (100 - gradientStop.second.getTransparency()) << "%");
+
+ // Now estimate the simple LO style gradient (only two stops, at n% and 100%, where n ==
+ // the "border") that best emulates the gradient between begin() and prior(end()).
+
+ // First look for the largest segment in the gradient.
+ GradientFillProperties::GradientStopMap::iterator aIt(aGradientStops.begin());
+ double nWidestWidth = -1;
+ GradientFillProperties::GradientStopMap::iterator aWidestSegmentStart;
+ ++aIt;
+ while( aIt != aGradientStops.end() )
+ {
+ if (aIt->first - std::prev(aIt)->first > nWidestWidth)
+ {
+ nWidestWidth = aIt->first - std::prev(aIt)->first;
+ aWidestSegmentStart = std::prev(aIt);
+ }
++aIt;
+ }
+ assert( nWidestWidth > 0 );
+
+ double nBorder = 0;
+ bool bSwap(false);
+
+ // Do we have just two segments, and either one is of uniform colour, or three or more
+ // segments, and the widest one is the first or last one, and is it of uniform colour? If
+ // so, deduce the border from it, and drop that segment.
+ if( aGradientStops.size() == 3 &&
+ aGradientStops.begin()->second.getColor(rGraphicHelper, nPhClr) == std::next(aGradientStops.begin())->second.getColor(rGraphicHelper, nPhClr) &&
+ aGradientStops.begin()->second.getTransparency() == std::next(aGradientStops.begin())->second.getTransparency())
+ {
+ // Two segments, first is uniformly coloured
+ SAL_INFO("oox.drawingml.gradient", "two segments, first is uniformly coloured");
+ nBorder = std::next(aGradientStops.begin())->first - aGradientStops.begin()->first;
+ aGradientStops.erase(aGradientStops.begin());
+ aWidestSegmentStart = aGradientStops.begin();
+ }
+ else if( !bSymmetric &&
+ aGradientStops.size() == 3 &&
+ std::next(aGradientStops.begin())->second.getColor(rGraphicHelper, nPhClr) == std::prev(aGradientStops.end())->second.getColor(rGraphicHelper, nPhClr) &&
+ std::next(aGradientStops.begin())->second.getTransparency() == std::prev(aGradientStops.end())->second.getTransparency())
+ {
+ // Two segments, second is uniformly coloured
+ SAL_INFO("oox.drawingml.gradient", "two segments, second is uniformly coloured");
+ nBorder = std::prev(aGradientStops.end())->first - std::next(aGradientStops.begin())->first;
+ aGradientStops.erase(std::next(aGradientStops.begin()));
+ aWidestSegmentStart = aGradientStops.begin();
+ bSwap = true;
+ nShapeRotation = 180*60000 - nShapeRotation;
+ }
+ else if( !bSymmetric &&
+ aGradientStops.size() >= 4 &&
+ aWidestSegmentStart->second.getColor( rGraphicHelper, nPhClr ) == std::next(aWidestSegmentStart)->second.getColor(rGraphicHelper, nPhClr) &&
+ aWidestSegmentStart->second.getTransparency() == std::next(aWidestSegmentStart)->second.getTransparency() &&
+ ( aWidestSegmentStart == aGradientStops.begin() ||
+ std::next(aWidestSegmentStart) == std::prev(aGradientStops.end())))
+ {
+ // Not symmetric, three or more segments, the widest is first or last and is uniformly coloured
+ SAL_INFO("oox.drawingml.gradient", "first or last segment is widest and is uniformly coloured");
+ nBorder = std::next(aWidestSegmentStart)->first - aWidestSegmentStart->first;
+
+ // If it's the last segment that is uniformly coloured, rotate the gradient 180
+ // degrees and swap start and end colours
+ if (std::next(aWidestSegmentStart) == std::prev(aGradientStops.end()))
+ {
+ bSwap = true;
+ nShapeRotation = 180*60000 - nShapeRotation;
+ }
+
+ aGradientStops.erase( aWidestSegmentStart++ );
+
+ // Look for which is widest now
+ aIt = std::next(aGradientStops.begin());
+ nWidestWidth = -1;
while( aIt != aGradientStops.end() )
{
if (aIt->first - std::prev(aIt)->first > nWidestWidth)
@@ -485,253 +550,188 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap,
}
++aIt;
}
- assert( nWidestWidth > 0 );
+ }
+ SAL_INFO("oox.drawingml.gradient", "widest segment start: " << aWidestSegmentStart->first << ", border: " << nBorder);
+ assert( (!bSymmetric && !bSwap) || !(bSymmetric && bSwap) );
+
+ // Now we have a potential border and a largest segment. Use those.
+
+ aGradient.Style = bSymmetric ? awt::GradientStyle_AXIAL : awt::GradientStyle_LINEAR;
+ sal_Int32 nShadeAngle = maGradientProps.moShadeAngle.get( 0 );
+ // Adjust for flips
+ if ( bFlipH )
+ nShadeAngle = 180*60000 - nShadeAngle;
+ if ( bFlipV )
+ nShadeAngle = -nShadeAngle;
+ sal_Int32 nDmlAngle = nShadeAngle + nShapeRotation;
+ // convert DrawingML angle (in 1/60000 degrees) to API angle (in 1/10 degrees)
+ aGradient.Angle = static_cast< sal_Int16 >( (8100 - (nDmlAngle / (PER_DEGREE / 10))) % 3600 );
+ Color aStartColor, aEndColor;
+ if( bSymmetric )
+ {
+ aStartColor = std::next(aWidestSegmentStart)->second;
+ aEndColor = aWidestSegmentStart->second;
+ nBorder *= 2;
+ }
+ else if( bSwap )
+ {
+ aStartColor = std::next(aWidestSegmentStart)->second;
+ aEndColor = aWidestSegmentStart->second;
+ }
+ else
+ {
+ aStartColor = aWidestSegmentStart->second;
+ aEndColor = std::next(aWidestSegmentStart)->second;
+ }
- double nBorder = 0;
- bool bSwap(false);
+ SAL_INFO("oox.drawingml.gradient", "start color: " << std::hex << sal_Int32(aStartColor.getColor( rGraphicHelper, nPhClr )) << std::dec <<
+ "@" << (100-aStartColor.getTransparency()) << "%"
+ ", end color: " << std::hex << sal_Int32(aEndColor.getColor( rGraphicHelper, nPhClr )) << std::dec <<
+ "@" << (100-aEndColor.getTransparency()) << "%");
- // Do we have just two segments, and either one is of uniform colour, or three or more
- // segments, and the widest one is the first or last one, and is it of uniform colour? If
- // so, deduce the border from it, and drop that segment.
- if( aGradientStops.size() == 3 &&
- aGradientStops.begin()->second.getColor(rGraphicHelper, nPhClr) == std::next(aGradientStops.begin())->second.getColor(rGraphicHelper, nPhClr) &&
- aGradientStops.begin()->second.getTransparency() == std::next(aGradientStops.begin())->second.getTransparency())
- {
- // Two segments, first is uniformly coloured
- SAL_INFO("oox.drawingml.gradient", "two segments, first is uniformly coloured");
- nBorder = std::next(aGradientStops.begin())->first - aGradientStops.begin()->first;
- aGradientStops.erase(aGradientStops.begin());
- aWidestSegmentStart = aGradientStops.begin();
- }
- else if( !bSymmetric &&
- aGradientStops.size() == 3 &&
- std::next(aGradientStops.begin())->second.getColor(rGraphicHelper, nPhClr) == std::prev(aGradientStops.end())->second.getColor(rGraphicHelper, nPhClr) &&
- std::next(aGradientStops.begin())->second.getTransparency() == std::prev(aGradientStops.end())->second.getTransparency())
- {
- // Two segments, second is uniformly coloured
- SAL_INFO("oox.drawingml.gradient", "two segments, second is uniformly coloured");
- nBorder = std::prev(aGradientStops.end())->first - std::next(aGradientStops.begin())->first;
- aGradientStops.erase(std::next(aGradientStops.begin()));
- aWidestSegmentStart = aGradientStops.begin();
- bSwap = true;
- nShapeRotation = 180*60000 - nShapeRotation;
- }
- else if( !bSymmetric &&
- aGradientStops.size() >= 4 &&
- aWidestSegmentStart->second.getColor( rGraphicHelper, nPhClr ) == std::next(aWidestSegmentStart)->second.getColor(rGraphicHelper, nPhClr) &&
- aWidestSegmentStart->second.getTransparency() == std::next(aWidestSegmentStart)->second.getTransparency() &&
- ( aWidestSegmentStart == aGradientStops.begin() ||
- std::next(aWidestSegmentStart) == std::prev(aGradientStops.end())))
- {
- // Not symmetric, three or more segments, the widest is first or last and is uniformly coloured
- SAL_INFO("oox.drawingml.gradient", "first or last segment is widest and is uniformly coloured");
- nBorder = std::next(aWidestSegmentStart)->first - aWidestSegmentStart->first;
+ aGradient.StartColor = sal_Int32(aStartColor.getColor( rGraphicHelper, nPhClr ));
+ aGradient.EndColor = sal_Int32(aEndColor.getColor( rGraphicHelper, nPhClr ));
- // If it's the last segment that is uniformly coloured, rotate the gradient 180
- // degrees and swap start and end colours
- if (std::next(aWidestSegmentStart) == std::prev(aGradientStops.end()))
- {
- bSwap = true;
- nShapeRotation = 180*60000 - nShapeRotation;
- }
+ if( aStartColor.hasTransparency() )
+ nStartTrans = aStartColor.getTransparency()*255/100;
+ if( aEndColor.hasTransparency() )
+ nEndTrans = aEndColor.getTransparency()*255/100;
- aGradientStops.erase( aWidestSegmentStart++ );
+ aGradient.Border = rtl::math::round(100*nBorder);
+ }
- // Look for which is widest now
- aIt = std::next(aGradientStops.begin());
- nWidestWidth = -1;
- while( aIt != aGradientStops.end() )
- {
- if (aIt->first - std::prev(aIt)->first > nWidestWidth)
- {
- nWidestWidth = aIt->first - std::prev(aIt)->first;
- aWidestSegmentStart = std::prev(aIt);
- }
- ++aIt;
- }
- }
- SAL_INFO("oox.drawingml.gradient", "widest segment start: " << aWidestSegmentStart->first << ", border: " << nBorder);
- assert( (!bSymmetric && !bSwap) || !(bSymmetric && bSwap) );
-
- // Now we have a potential border and a largest segment. Use those.
-
- aGradient.Style = bSymmetric ? awt::GradientStyle_AXIAL : awt::GradientStyle_LINEAR;
- sal_Int32 nShadeAngle = maGradientProps.moShadeAngle.get( 0 );
- // Adjust for flips
- if ( bFlipH )
- nShadeAngle = 180*60000 - nShadeAngle;
- if ( bFlipV )
- nShadeAngle = -nShadeAngle;
- sal_Int32 nDmlAngle = nShadeAngle + nShapeRotation;
- // convert DrawingML angle (in 1/60000 degrees) to API angle (in 1/10 degrees)
- aGradient.Angle = static_cast< sal_Int16 >( (8100 - (nDmlAngle / (PER_DEGREE / 10))) % 3600 );
- Color aStartColor, aEndColor;
- if( bSymmetric )
- {
- aStartColor = std::next(aWidestSegmentStart)->second;
- aEndColor = aWidestSegmentStart->second;
- nBorder *= 2;
- }
- else if( bSwap )
- {
- aStartColor = std::next(aWidestSegmentStart)->second;
- aEndColor = aWidestSegmentStart->second;
- }
- else
- {
- aStartColor = aWidestSegmentStart->second;
- aEndColor = std::next(aWidestSegmentStart)->second;
- }
+ // push gradient or named gradient to property map
+ if( rPropMap.setProperty( ShapeProperty::FillGradient, aGradient ) )
+ eFillStyle = FillStyle_GRADIENT;
- SAL_INFO("oox.drawingml.gradient", "start color: " << std::hex << sal_Int32(aStartColor.getColor( rGraphicHelper, nPhClr )) << std::dec <<
- "@" << (100-aStartColor.getTransparency()) << "%"
- ", end color: " << std::hex << sal_Int32(aEndColor.getColor( rGraphicHelper, nPhClr )) << std::dec <<
- "@" << (100-aEndColor.getTransparency()) << "%");
+ // push gradient transparency to property map
+ if( nStartTrans != 0 || nEndTrans != 0 )
+ {
+ awt::Gradient aGrad(aGradient);
+ uno::Any aVal;
+ aGrad.EndColor = static_cast<sal_Int32>( nEndTrans | nEndTrans << 8 | nEndTrans << 16 );
+ aGrad.StartColor = static_cast<sal_Int32>( nStartTrans | nStartTrans << 8 | nStartTrans << 16 );
+ aVal <<= aGrad;
+ rPropMap.setProperty( ShapeProperty::GradientTransparency, aGrad );
+ }
- aGradient.StartColor = sal_Int32(aStartColor.getColor( rGraphicHelper, nPhClr ));
- aGradient.EndColor = sal_Int32(aEndColor.getColor( rGraphicHelper, nPhClr ));
+ }
+ break;
- if( aStartColor.hasTransparency() )
- nStartTrans = aStartColor.getTransparency()*255/100;
- if( aEndColor.hasTransparency() )
- nEndTrans = aEndColor.getTransparency()*255/100;
+ case XML_blipFill:
+ // do not start complex graphic transformation if property is not supported...
+ if (maBlipProps.mxFillGraphic.is() && rPropMap.supportsProperty(ShapeProperty::FillBitmap))
+ {
+ uno::Reference<graphic::XGraphic> xGraphic = lclCheckAndApplyDuotoneTransform(maBlipProps, maBlipProps.mxFillGraphic, rGraphicHelper, nPhClr);
+ // TODO: "rotate with shape" is not possible with our current core
- aGradient.Border = rtl::math::round(100*nBorder);
+ if (xGraphic.is())
+ {
+ if (rPropMap.supportsProperty(ShapeProperty::FillBitmapName) &&
+ rPropMap.setProperty(ShapeProperty::FillBitmapName, xGraphic))
+ {
+ eFillStyle = FillStyle_BITMAP;
}
-
- // push gradient or named gradient to property map
- if( rPropMap.setProperty( ShapeProperty::FillGradient, aGradient ) )
- eFillStyle = FillStyle_GRADIENT;
-
- // push gradient transparency to property map
- if( nStartTrans != 0 || nEndTrans != 0 )
+ else if (rPropMap.setProperty(ShapeProperty::FillBitmap, xGraphic))
{
- awt::Gradient aGrad(aGradient);
- uno::Any aVal;
- aGrad.EndColor = static_cast<sal_Int32>( nEndTrans | nEndTrans << 8 | nEndTrans << 16 );
- aGrad.StartColor = static_cast<sal_Int32>( nStartTrans | nStartTrans << 8 | nStartTrans << 16 );
- aVal <<= aGrad;
- rPropMap.setProperty( ShapeProperty::GradientTransparency, aGrad );
+ eFillStyle = FillStyle_BITMAP;
}
-
}
- break;
- case XML_blipFill:
- // do not start complex graphic transformation if property is not supported...
- if (maBlipProps.mxFillGraphic.is() && rPropMap.supportsProperty(ShapeProperty::FillBitmap))
+ // set other bitmap properties, if bitmap has been inserted into the map
+ if( eFillStyle == FillStyle_BITMAP )
{
- uno::Reference<graphic::XGraphic> xGraphic = lclCheckAndApplyDuotoneTransform(maBlipProps, maBlipProps.mxFillGraphic, rGraphicHelper, nPhClr);
- // TODO: "rotate with shape" is not possible with our current core
+ // bitmap mode (single, repeat, stretch)
+ BitmapMode eBitmapMode = lclGetBitmapMode( maBlipProps.moBitmapMode.get( XML_TOKEN_INVALID ) );
+ rPropMap.setProperty( ShapeProperty::FillBitmapMode, eBitmapMode );
- if (xGraphic.is())
+ // additional settings for repeated bitmap
+ if( eBitmapMode == BitmapMode_REPEAT )
{
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list