[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sw/inc sw/source

Michael Stahl mstahl at redhat.com
Tue Apr 21 07:37:22 PDT 2015


 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 <mstahl at 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 <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at 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;
                 }


More information about the Libreoffice-commits mailing list