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 ||