sw/inc/swunohelper.hxx | 2 - sw/source/core/unocore/swunohelper.cxx | 53 ++++++++++++++++++++++++++------ sw/source/core/unocore/unoframe.cxx | 9 +++-- sw/source/core/unocore/unoparagraph.cxx | 5 +-- sw/source/core/unocore/unostyle.cxx | 23 ++++++++++--- 5 files changed, 71 insertions(+), 21 deletions(-)
New commits: commit 04946086b0b08d1ab0de2a91959299312f140ed4 Author: Michael Stahl <mst...@redhat.com> Date: Mon Apr 20 20:05:38 2015 +0200 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 (cherry picked from commit c3e49660e782816d1203cb936156ef6d6a1ad572) Reviewed-on: https://gerrit.libreoffice.org/15462 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/sw/inc/swunohelper.hxx b/sw/inc/swunohelper.hxx index 6ebc335..c00404c 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 8a1bd2a..45af6f3 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 7cd950e..d62fd291 100644 --- a/sw/source/core/unocore/unoframe.cxx +++ b/sw/source/core/unocore/unoframe.cxx @@ -2409,13 +2409,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 3acacd7..8479ef0 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 57ab928..2329c74 100644 --- a/sw/source/core/unocore/unostyle.cxx +++ b/sw/source/core/unocore/unostyle.cxx @@ -2919,14 +2919,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; } @@ -4873,11 +4879,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; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits