Author: alg
Date: Wed Jul  2 16:06:42 2014
New Revision: 1607407

URL: http://svn.apache.org/r1607407
Log:
i125189 corrected used transparency and handling to values used in the fallback 
SvxBrushItem

Modified:
    openoffice/trunk/main/svx/source/unodraw/unobrushitemhelper.cxx
    openoffice/trunk/main/sw/source/core/layout/paintfrm.cxx

Modified: openoffice/trunk/main/svx/source/unodraw/unobrushitemhelper.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/svx/source/unodraw/unobrushitemhelper.cxx?rev=1607407&r1=1607406&r2=1607407&view=diff
==============================================================================
--- openoffice/trunk/main/svx/source/unodraw/unobrushitemhelper.cxx (original)
+++ openoffice/trunk/main/svx/source/unodraw/unobrushitemhelper.cxx Wed Jul  2 
16:06:42 2014
@@ -62,8 +62,9 @@ void setSvxBrushItemAsFillAttributesToTa
         rToSet.Put(XFillStyleItem(XFILL_SOLID));
         rToSet.Put(XFillColorItem(String(), aColor));
 
-        // nTransparency is in range [0..255], convert to [0..100] which is 
used in XFillTransparenceItem
-        rToSet.Put(XFillTransparenceItem((((sal_Int32)nTransparency * 100) + 
127) / 255));
+        // #125189# nTransparency is in range [0..254], convert to [0..100] 
which is used in 
+        // XFillTransparenceItem (caution with the range which is in an 
*item-specific* range)
+        rToSet.Put(XFillTransparenceItem((((sal_Int32)nTransparency * 100) + 
127) / 254));
     }
     else if(GPOS_NONE != rBrush.GetGraphicPos())
     {
@@ -182,8 +183,12 @@ SvxBrushItem getSvxBrushItemForSolid(con
 
     if(0 != nFillTransparence)
     {
-        // nFillTransparence is in range [0..100] and needs to be in [0..255] 
unsigned
-        aFillColor.SetTransparency(static_cast< sal_uInt8 >((nFillTransparence 
* 255) / 100));
+        // #i125189# nFillTransparence is in range [0..100] and needs to be in 
[0..254] unsigned
+        // It is necessary to use the maximum of 0xfe for transparence for the 
SvxBrushItem
+        // since the oxff value is used for special purposes (like no fill and 
derive from parent)
+        const sal_uInt8 aTargetTrans(std::min(sal_uInt8(0xfe), static_cast< 
sal_uInt8 >((nFillTransparence * 254) / 100)));
+
+        aFillColor.SetTransparency(aTargetTrans);
     }
 
     return SvxBrushItem(aFillColor, nBackgroundID);
@@ -233,8 +238,12 @@ SvxBrushItem getSvxBrushItemFromSourceSe
 
             if(0 != nFillTransparence)
             {
-                // nFillTransparence is in range [0..100] and needs to be in 
[0..255] unsigned
-                aMixedColor.SetTransparency(static_cast< sal_uInt8 
>((nFillTransparence * 255) / 100));
+                // #i125189# nFillTransparence is in range [0..100] and needs 
to be in [0..254] unsigned
+                // It is necessary to use the maximum of 0xfe for transparence 
for the SvxBrushItem
+                // since the oxff value is used for special purposes (like no 
fill and derive from parent)
+                const sal_uInt8 aTargetTrans(std::min(sal_uInt8(0xfe), 
static_cast< sal_uInt8 >((nFillTransparence * 254) / 100)));
+
+                aMixedColor.SetTransparency(aTargetTrans);
             }
 
             aRetval = SvxBrushItem(aMixedColor, nBackgroundID);
@@ -263,9 +272,12 @@ SvxBrushItem getSvxBrushItemFromSourceSe
                 // take half orig transparence, add half transparent, clamp 
result
                 nFillTransparence = 
basegfx::clamp((sal_uInt16)((nFillTransparence / 2) + 50), (sal_uInt16)0, 
(sal_uInt16)255);
 
-                // nFillTransparence is in range [0..100] and needs to be in 
[0..255] unsigned
-                aHatchColor.SetTransparency(static_cast< sal_uInt8 
>((nFillTransparence * 255) / 100));
+                // #i125189# nFillTransparence is in range [0..100] and needs 
to be in [0..254] unsigned
+                // It is necessary to use the maximum of 0xfe for transparence 
for the SvxBrushItem
+                // since the oxff value is used for special purposes (like no 
fill and derive from parent)
+                const sal_uInt8 aTargetTrans(std::min(sal_uInt8(0xfe), 
static_cast< sal_uInt8 >((nFillTransparence * 254) / 100)));
 
+                aHatchColor.SetTransparency(aTargetTrans);
                 aRetval = SvxBrushItem(aHatchColor, nBackgroundID);
             }
 
@@ -316,7 +328,7 @@ SvxBrushItem getSvxBrushItemFromSourceSe
 
             if(0 != nFillTransparence)
             {
-                // nFillTransparence is in range [0..100] and needs to be in 
[0..100] signed
+                // #i125189# nFillTransparence is in range [0..100] and needs 
to be in [0..100] signed
                 aRetval.setGraphicTransparency(static_cast< sal_Int8 
>(nFillTransparence));
             }
 

Modified: openoffice/trunk/main/sw/source/core/layout/paintfrm.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/layout/paintfrm.cxx?rev=1607407&r1=1607406&r2=1607407&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/layout/paintfrm.cxx (original)
+++ openoffice/trunk/main/sw/source/core/layout/paintfrm.cxx Wed Jul  2 
16:06:42 2014
@@ -5915,9 +5915,29 @@ void SwFrm::PaintBackground( const SwRec
                     const sal_Bool bConsiderBackgroundTransparency = 
IsFlyFrm();
                     bool bDone(false);
 
-                    if(pOut && aFillAttributes.get() && 
aFillAttributes->isUsed())
+                    // #i125189# We are also done when the new DrawingLayer 
FillAttributes are used
+                    // or the FillStyle is set (different from XFILL_NONE)
+                    if(pOut && aFillAttributes.get())
                     {
-                        bDone = DrawFillAttributes(aFillAttributes, 
aOrigBackRect, aRect, *pOut);
+                        if(aFillAttributes->isUsed())
+                        {
+                            // check if really something is painted
+                            bDone = DrawFillAttributes(aFillAttributes, 
aOrigBackRect, aRect, *pOut);
+                        }
+
+                        if(!bDone)
+                        {
+                            // if not, still a FillStyle could be set but the 
transparency is at 100%,
+                            // thus need to check the model data itself for 
FillStyle (do not rely on
+                            // SdrAllFillAttributesHelper since it already 
contains optimized information,
+                            // e.g. transparency leads to no fill)
+                            const XFillStyle eFillStyle(static_cast< const 
XFillStyleItem& >(GetAttrSet()->Get(XATTR_FILLSTYLE)).GetValue());
+
+                            if(XFILL_NONE != eFillStyle)
+                            {
+                                bDone = true;
+                            }
+                        }
                     }
 
                     if(!bDone)
@@ -6724,13 +6744,41 @@ sal_Bool SwFrm::GetBackgroundBrush( 
         ///                     considered for fly frames
         const sal_Bool bConsiderBackgroundTransparency = pFrm->IsFlyFrm();
 
+        // #i125189# Do not base the decision for using the parent's fill 
style for this
+        // frame when the new DrawingLayer FillAttributes are used on the 
SdrAllFillAttributesHelper
+        // information. There the data is already optimized to no fill in the 
case that the 
+        // transparence is at 100% while no fill is the criteria for derivation
+        bool bNewDrawingLayerFillStyleIsUsedAndNotNoFill(false);
+
+        if(rFillAttributes.get())
+        {
+            // the new DrawingLayer FillStyle is used
+            if(rFillAttributes->isUsed())
+            {
+                // it's not XFILL_NONE
+                bNewDrawingLayerFillStyleIsUsedAndNotNoFill = true;
+            }
+            else
+            {
+                // maybe optimized already when 100% transparency is used 
somewhere, need to test
+                // XFillStyleItem directly from the model data
+                const XFillStyle eFillStyle(static_cast< const XFillStyleItem& 
>(pFrm->GetAttrSet()->Get(XATTR_FILLSTYLE)).GetValue());
+
+                if(XFILL_NONE != eFillStyle)
+                {
+                    bNewDrawingLayerFillStyleIsUsedAndNotNoFill = true;
+                }
+            }
+        }
+
         /// OD 20.08.2002 #99657#
         ///     add condition:
         ///     If <bConsiderBackgroundTransparency> is set - see above -,
         ///     return brush of frame <pFrm>, if its color is *not* "no 
fill"/"auto fill"
         if (
-            // done when FillAttributesare set
-            (rFillAttributes.get() && rFillAttributes->isUsed()) ||
+            // #i125189# Done when the new DrawingLayer FillAttributes are 
used and 
+            // not XFILL_NONE (see above)
+            bNewDrawingLayerFillStyleIsUsedAndNotNoFill ||
 
             // done when SvxBrushItem is used
             !rBack.GetColor().GetTransparency() || rBack.GetGraphicPos() != 
GPOS_NONE ||


Reply via email to