Kaydet (Commit) a130de7e authored tarafından Miklos Vajna's avatar Miklos Vajna

sw: drawingml export of text frame back color transparency

CppunitTest_sw_ooxmlexport's testFdo66688 is a reproducer for this
problem.

Change-Id: Idbde9c0f8581652300ae29adcd27b83469f38b03
üst 0eb1ef39
...@@ -5700,25 +5700,35 @@ void DocxAttributeOutput::FormatAnchor( const SwFmtAnchor& ) ...@@ -5700,25 +5700,35 @@ void DocxAttributeOutput::FormatAnchor( const SwFmtAnchor& )
// Fly frames: anchors here aren't matching the anchors in docx // Fly frames: anchors here aren't matching the anchors in docx
} }
boost::optional<sal_Int32> lcl_getDmlAlpha(const SvxBrushItem& rBrush)
{
boost::optional<sal_Int32> oRet;
sal_Int32 nTransparency = rBrush.GetColor().GetTransparency();
if (nTransparency)
{
// Convert transparency to percent
sal_Int8 nTransparencyPercent = SvxBrushItem::TransparencyToPercent(nTransparency);
// Calculate alpha value
// Consider oox/source/drawingml/color.cxx : getTransparency() function.
sal_Int32 nAlpha = (::oox::drawingml::MAX_PERCENT - ( ::oox::drawingml::PER_PERCENT * nTransparencyPercent ) );
oRet = nAlpha;
}
return oRet;
}
void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush )
{ {
OString sColor = msfilter::util::ConvertColor( rBrush.GetColor( ) ); OString sColor = msfilter::util::ConvertColor( rBrush.GetColor( ) );
boost::optional<sal_Int32> oAlpha = lcl_getDmlAlpha(rBrush);
if (m_bTextFrameSyntax) if (m_bTextFrameSyntax)
{ {
// Handle 'Opacity' // Handle 'Opacity'
sal_Int32 nTransparency = rBrush.GetColor().GetTransparency(); if (oAlpha)
if (nTransparency)
{ {
// Convert transparency to percent
sal_Int8 nTransparencyPercent = SvxBrushItem::TransparencyToPercent(nTransparency);
// Calculate alpha value
// Consider oox/source/drawingml/color.cxx : getTransparency() function.
sal_Int32 nAlpha = (::oox::drawingml::MAX_PERCENT - ( ::oox::drawingml::PER_PERCENT * nTransparencyPercent ) );
// Calculate opacity value // Calculate opacity value
// Consider oox/source/vml/vmlformatting.cxx : decodeColor() function. // Consider oox/source/vml/vmlformatting.cxx : decodeColor() function.
double fOpacity = (double)nAlpha * 65535 / ::oox::drawingml::MAX_PERCENT; double fOpacity = (double)(*oAlpha) * 65535 / ::oox::drawingml::MAX_PERCENT;
OUString sOpacity = OUString::number(fOpacity); OUString sOpacity = OUString::number(fOpacity);
if ( !m_pFlyFillAttrList ) if ( !m_pFlyFillAttrList )
...@@ -5732,9 +5742,14 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) ...@@ -5732,9 +5742,14 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush )
else if (m_bDMLTextFrameSyntax) else if (m_bDMLTextFrameSyntax)
{ {
m_pSerializer->startElementNS(XML_a, XML_solidFill, FSEND); m_pSerializer->startElementNS(XML_a, XML_solidFill, FSEND);
m_pSerializer->singleElementNS(XML_a, XML_srgbClr, m_pSerializer->startElementNS(XML_a, XML_srgbClr,
XML_val, sColor, XML_val, sColor,
FSEND); FSEND);
if (oAlpha)
m_pSerializer->singleElementNS(XML_a, XML_alpha,
XML_val, OString::number(*oAlpha),
FSEND);
m_pSerializer->endElementNS(XML_a, XML_srgbClr);
m_pSerializer->endElementNS(XML_a, XML_solidFill); m_pSerializer->endElementNS(XML_a, XML_solidFill);
} }
else if ( !m_rExport.bOutPageDescs ) else if ( !m_rExport.bOutPageDescs )
......
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