summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2015-04-20 20:05:38 +0200
committerMichael Stahl <mstahl@redhat.com>2015-04-21 00:33:58 +0200
commitc3e49660e782816d1203cb936156ef6d6a1ad572 (patch)
treeb07888dd1524abb143d535b815a09ab88baf24af
parent822cb231c9aee2b69d0e645d2fddbab1dfbe3d14 (diff)
tdf#90640: sw: ODF export: be consistent when exporting RES_BACKGROUND
The emulation of legacy RES_BACKGROUND properties claims that (unless fillstyle is NONE) all of them are direct values, which causes export of legacy attributes like style:background-transparency without corresponding non-legacy draw:opacity. Especially problematic for style:background-transparency, which is set to 100% if style is bitmap, which is the reasonable default for API backward compatibility of BackColorTransparency, but wrong for ODF. Change-Id: I1fa4fa5df45eb00cbfcd2e171b4862c4e195cc7d
-rw-r--r--sw/inc/swunohelper.hxx2
-rw-r--r--sw/source/core/unocore/swunohelper.cxx53
-rw-r--r--sw/source/core/unocore/unoframe.cxx9
-rw-r--r--sw/source/core/unocore/unoparagraph.cxx5
-rw-r--r--sw/source/core/unocore/unostyle.cxx23
5 files changed, 71 insertions, 21 deletions
diff --git a/sw/inc/swunohelper.hxx b/sw/inc/swunohelper.hxx
index 6ebc335b2ae4..c00404c759c1 100644
--- a/sw/inc/swunohelper.hxx
+++ b/sw/inc/swunohelper.hxx
@@ -77,7 +77,7 @@ bool UCB_IsDirectory( const OUString& rURL );
///UUUU helper to check if fill style is set to color or bitmap
/// and thus formally used SvxBrushItem parts need to be mapped
/// for backwards compatibility
-bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet);
+bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet, sal_uInt16 const nMemberId);
}
diff --git a/sw/source/core/unocore/swunohelper.cxx b/sw/source/core/unocore/swunohelper.cxx
index 8f5c89dbed4e..ceb061b35d59 100644
--- a/sw/source/core/unocore/swunohelper.cxx
+++ b/sw/source/core/unocore/swunohelper.cxx
@@ -39,6 +39,7 @@
//UUUU
#include <svx/xfillit0.hxx>
+#include <editeng/memberids.hrc>
#include <svl/itemset.hxx>
using namespace com::sun::star;
@@ -268,7 +269,8 @@ bool UCB_GetFileListOfFolder( const OUString& rURL,
}
//UUUU
-bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet)
+bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet,
+ sal_uInt16 const nMID)
{
const XFillStyleItem* pXFillStyleItem(static_cast< const XFillStyleItem* >(rSet.GetItem(XATTR_FILLSTYLE, false)));
@@ -280,17 +282,50 @@ bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet)
// here different FillStyles can be excluded for export; it will depend on the
// quality these fallbacks can reach. That again is done in getSvxBrushItemFromSourceSet,
// take a look there how the superset of DrawObject FillStyles is mapped to SvxBrushItem.
- // For now, take them all - except drawing::FillStyle_NONE
-
- if(drawing::FillStyle_NONE != pXFillStyleItem->GetValue())
+ switch (pXFillStyleItem->GetValue())
{
- return true;
+ case drawing::FillStyle_NONE:
+ return false; // ignoring some extremely limited XFillColorItem eval
+ break;
+ case drawing::FillStyle_SOLID:
+ case drawing::FillStyle_GRADIENT: // gradient and hatch don't exist in
+ case drawing::FillStyle_HATCH: // SvxBrushItem so average color is emulated
+ switch (nMID)
+ {
+ case MID_BACK_COLOR:
+ // Gradient/Hatch always have emulated color
+ return (drawing::FillStyle_SOLID != nMID)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLCOLOR)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLTRANSPARENCE)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE);
+ case MID_BACK_COLOR_R_G_B:
+ // Gradient/Hatch always have emulated color
+ return (drawing::FillStyle_SOLID != nMID)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLCOLOR);
+ case MID_BACK_COLOR_TRANSPARENCY:
+ return SfxItemState::SET == rSet.GetItemState(XATTR_FILLTRANSPARENCE)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE);
+ }
+ break;
+ case drawing::FillStyle_BITMAP:
+ switch (nMID)
+ {
+ case MID_GRAPHIC_URL:
+ return SfxItemState::SET == rSet.GetItemState(XATTR_FILLBITMAP);
+ case MID_GRAPHIC_POSITION:
+ return SfxItemState::SET == rSet.GetItemState(XATTR_FILLBMP_STRETCH)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLBMP_TILE)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLBMP_POS);
+ case MID_GRAPHIC_TRANSPARENT:
+ case MID_GRAPHIC_TRANSPARENCY:
+ return SfxItemState::SET == rSet.GetItemState(XATTR_FILLTRANSPARENCE)
+ || SfxItemState::SET == rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE);
+ }
+ break;
+ default:
+ assert(false);
}
- // if(XFILL_SOLID == pXFillStyleItem->GetValue() || XFILL_BITMAP == pXFillStyleItem->GetValue())
- // {
- // return true;
- // }
return false;
}
diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx
index cd7dd0101982..197a83b77d32 100644
--- a/sw/source/core/unocore/unoframe.cxx
+++ b/sw/source/core/unocore/unoframe.cxx
@@ -2406,13 +2406,16 @@ uno::Sequence< beans::PropertyState > SwXFrame::getPropertyStates(
pStates[i] = beans::PropertyState_AMBIGUOUS_VALUE;
}
}
- //UUUU for FlyFrames we need to mark all properties from type RES_BACKGROUND
+ //UUUU for FlyFrames we need to mark the used properties from type RES_BACKGROUND
// as beans::PropertyState_DIRECT_VALUE to let users of this property call
// getPropertyValue where the member properties will be mapped from the
// fill attributes to the according SvxBrushItem entries
- else if(RES_BACKGROUND == pEntry->nWID && SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(rFmtSet))
+ else if (RES_BACKGROUND == pEntry->nWID)
{
- pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ if (SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(rFmtSet, pEntry->nMemberId))
+ pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ else
+ pStates[i] = beans::PropertyState_DEFAULT_VALUE;
}
else
{
diff --git a/sw/source/core/unocore/unoparagraph.cxx b/sw/source/core/unocore/unoparagraph.cxx
index 2ef2c8452c1d..bfc67557d4e3 100644
--- a/sw/source/core/unocore/unoparagraph.cxx
+++ b/sw/source/core/unocore/unoparagraph.cxx
@@ -1031,11 +1031,12 @@ static beans::PropertyState lcl_SwXParagraph_getPropertyState(
{
if(*ppSet)
{
- if(SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(**ppSet))
+ if (SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(**ppSet,
+ rEntry.nMemberId))
{
eRet = beans::PropertyState_DIRECT_VALUE;
- bDone = true;
}
+ bDone = true;
}
break;
}
diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
index 2b13e7254324..800ccf49daf2 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -2920,14 +2920,20 @@ uno::Sequence< beans::PropertyState > SwXStyle::getPropertyStates(
bDone = true;
}
- //UUUU for FlyFrames we need to mark all properties from type RES_BACKGROUND
+ //UUUU for FlyFrames we need to mark the used properties from type RES_BACKGROUND
// as beans::PropertyState_DIRECT_VALUE to let users of this property call
// getPropertyValue where the member properties will be mapped from the
// fill attributes to the according SvxBrushItem entries
- if(!bDone && RES_BACKGROUND == pEntry->nWID
- && SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(*pSourceSet))
+ if (!bDone && RES_BACKGROUND == pEntry->nWID)
{
- pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ if (SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(*pSourceSet, pEntry->nMemberId))
+ {
+ pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ }
+ else
+ {
+ pStates[i] = beans::PropertyState_DEFAULT_VALUE;
+ }
bDone = true;
}
@@ -4870,11 +4876,16 @@ uno::Sequence< beans::PropertyState > SwXAutoStyle::getPropertyStates(
}
case RES_BACKGROUND:
{
- if(SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(*mpSet))
+ if (SWUnoHelper::needToMapFillItemsToSvxBrushItemTypes(*mpSet,
+ pEntry->nMemberId))
{
pStates[i] = beans::PropertyState_DIRECT_VALUE;
- bDone = true;
}
+ else
+ {
+ pStates[i] = beans::PropertyState_DEFAULT_VALUE;
+ }
+ bDone = true;
break;
}