diff options
author | Michael Stahl <mstahl@redhat.com> | 2015-04-20 20:05:38 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2015-04-21 00:33:58 +0200 |
commit | c3e49660e782816d1203cb936156ef6d6a1ad572 (patch) | |
tree | b07888dd1524abb143d535b815a09ab88baf24af /sw/source | |
parent | 822cb231c9aee2b69d0e645d2fddbab1dfbe3d14 (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
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/unocore/swunohelper.cxx | 53 | ||||
-rw-r--r-- | sw/source/core/unocore/unoframe.cxx | 9 | ||||
-rw-r--r-- | sw/source/core/unocore/unoparagraph.cxx | 5 | ||||
-rw-r--r-- | sw/source/core/unocore/unostyle.cxx | 23 |
4 files changed, 70 insertions, 20 deletions
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; } |