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