Kaydet (Commit) d9420a64 authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#117028 sw: conditionally consider fill of shape for in-textbox auto color

Commit f966767e (tdf#116925 sw: consider
fill styles of shape for in-textbox auto color, 2018-04-10) did this
unconditionally, but there are two cases:

1) Shape (with textbox) has a fill, in that case auto text color of
textbox should consider the shape fill.

2) Shape has no fill, in that case the shape fill should not be
considered when counting the background of a transparent fly frame.

Fix 2) without breaking 1) by making the change to
SwFrame::GetBackgroundBrush() opt-in, and only use it for auto font
color, not in other cases.

Change-Id: I761a1b7d6ecf47586edbe5641ec012f22f6a53d7
Reviewed-on: https://gerrit.libreoffice.org/52941Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst ceb4bc41
......@@ -18,10 +18,12 @@ class SwLayoutWriter : public SwModelTestBase
public:
void testTdf116830();
void testTdf116925();
void testTdf117028();
CPPUNIT_TEST_SUITE(SwLayoutWriter);
CPPUNIT_TEST(testTdf116830);
CPPUNIT_TEST(testTdf116925);
CPPUNIT_TEST(testTdf117028);
CPPUNIT_TEST_SUITE_END();
private:
......@@ -84,6 +86,28 @@ void SwLayoutWriter::testTdf116925()
"/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[3]/textcolor[@color='#ffffff']", 1);
}
void SwLayoutWriter::testTdf117028()
{
SwDoc* pDoc = createDoc("tdf117028.docx");
SwDocShell* pShell = pDoc->GetDocShell();
// Dump the rendering of the first page as an XML file.
std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
MetafileXmlDump dumper;
xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile);
CPPUNIT_ASSERT(pXmlDoc);
// The only polypolygon in the rendering result was the white background we
// want to avoid.
xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "//polypolygon");
xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval;
CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlNodes));
xmlXPathFreeObject(pXmlObj);
// Make sure the text is still rendered.
assertXPathContent(pXmlDoc, "//textarray/text", "Hello");
}
CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter);
CPPUNIT_PLUGIN_IMPLEMENT();
......
......@@ -994,7 +994,7 @@ static bool lcl_GetBackgroundColor( Color & rColor,
drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes;
if ( pFrame &&
pFrame->GetBackgroundBrush( aFillAttributes, pBackgrdBrush, pSectionTOXColor, aDummyRect, false ) )
pFrame->GetBackgroundBrush( aFillAttributes, pBackgrdBrush, pSectionTOXColor, aDummyRect, false, /*bConsiderTextBox=*/false ) )
{
if ( pSectionTOXColor )
{
......
......@@ -187,7 +187,7 @@ static void lcl_ClearArea( const SwFrame &rFrame,
SwRect aOrigRect;
drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes;
if ( rFrame.GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigRect, false ) )
if ( rFrame.GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigRect, false, /*bConsiderTextBox=*/false ) )
{
SwRegionRects const region(rPtArea);
basegfx::utils::B2DClipState aClipState;
......
......@@ -557,7 +557,8 @@ public:
const SvxBrushItem*& rpBrush,
const Color*& rpColor,
SwRect &rOrigRect,
bool bLowerMode ) const;
bool bLowerMode,
bool bConsiderTextBox ) const;
inline void SetCompletePaint() const;
inline void ResetCompletePaint() const;
......
......@@ -3725,7 +3725,7 @@ bool SwFlyFrame::IsBackgroundTransparent() const
SwRect aDummyRect;
drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes;
if ( GetBackgroundBrush( aFillAttributes, pBackgrdBrush, pSectionTOXColor, aDummyRect, false) )
if ( GetBackgroundBrush( aFillAttributes, pBackgrdBrush, pSectionTOXColor, aDummyRect, false, /*bConsiderTextBox=*/false) )
{
if ( pSectionTOXColor &&
(pSectionTOXColor->GetTransparency() != 0) &&
......@@ -6137,7 +6137,7 @@ void SwFrame::PaintSwFrameBackground( const SwRect &rRect, const SwPageFrame *pP
bool bLowMode = true;
drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes;
bool bBack = GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, bLowerMode );
bool bBack = GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, bLowerMode, /*bConsiderTextBox=*/false );
//- Output if a separate background is used.
bool bNoFlyBackground = !gProp.bSFlyMetafile && !bBack && IsFlyFrame();
if ( bNoFlyBackground )
......@@ -6147,7 +6147,7 @@ void SwFrame::PaintSwFrameBackground( const SwRect &rRect, const SwPageFrame *pP
// <GetBackgroundBrush> disabled this option with the parameter <bLowerMode>
if ( bLowerMode )
{
bBack = GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false );
bBack = GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false, /*bConsiderTextBox=*/false );
}
// If still no background found for the fly frame, initialize the
// background brush <pItem> with global retouche color and set <bBack>
......@@ -6946,7 +6946,7 @@ const Color SwPageFrame::GetDrawBackgrdColor() const
SwRect aDummyRect;
drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes;
if ( GetBackgroundBrush( aFillAttributes, pBrushItem, pDummyColor, aDummyRect, true) )
if ( GetBackgroundBrush( aFillAttributes, pBrushItem, pDummyColor, aDummyRect, true, /*bConsiderTextBox=*/false) )
{
if(aFillAttributes.get() && aFillAttributes->isUsed())
{
......@@ -7110,6 +7110,10 @@ void SwFrame::Retouch( const SwPageFrame * pPage, const SwRect &rRect ) const
* input parameter - boolean indicating, if background brush should *not* be
* taken from parent.
*
* @param bConsiderTextBox
* consider the TextBox of this fly frame (if there is any) when determining
* the background color, useful for automatic font color.
*
* @return true, if a background brush for the frame is found
*/
bool SwFrame::GetBackgroundBrush(
......@@ -7117,7 +7121,8 @@ bool SwFrame::GetBackgroundBrush(
const SvxBrushItem* & rpBrush,
const Color*& rpCol,
SwRect &rOrigRect,
bool bLowerMode ) const
bool bLowerMode,
bool bConsiderTextBox ) const
{
const SwFrame *pFrame = this;
SwViewShell *pSh = getRootFrame()->GetCurrShell();
......@@ -7131,8 +7136,8 @@ bool SwFrame::GetBackgroundBrush(
if (pFrame->supportsFullDrawingLayerFillAttributeSet())
{
bool bTextBox = false;
if (pFrame->IsFlyFrame())
bool bHandledTextBox = false;
if (pFrame->IsFlyFrame() && bConsiderTextBox)
{
const SwFlyFrame* pFlyFrame = static_cast<const SwFlyFrame*>(pFrame);
SwFrameFormat* pShape
......@@ -7146,12 +7151,12 @@ bool SwFrame::GetBackgroundBrush(
rFillAttributes.reset(
new drawinglayer::attribute::SdrAllFillAttributesHelper(
pObject->GetMergedItemSet()));
bTextBox = true;
bHandledTextBox = true;
}
}
}
if (!bTextBox)
if (!bHandledTextBox)
rFillAttributes = pFrame->getSdrAllFillAttributesHelper();
}
const SvxBrushItem &rBack = pFrame->GetAttrSet()->GetBackground();
......
......@@ -535,7 +535,7 @@ static bool lcl_IsDarkBackground( const SwTextPaintInfo& rInf )
// See implementation in /core/layout/paintfrm.cxx
// There is a background color, if there is a background brush and
// its color is *not* "no fill"/"auto fill".
if( rInf.GetTextFrame()->GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false ) )
if( rInf.GetTextFrame()->GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false, /*bConsiderTextBox=*/false ) )
{
if ( !pCol )
pCol = &pItem->GetColor();
......
......@@ -2511,7 +2511,7 @@ bool SwDrawTextInfo::ApplyAutoColor( vcl::Font* pFont )
/// OD 21.08.2002 #99657#
/// There is a user defined setting for the background, if there
/// is a background brush and its color is *not* "no fill"/"auto fill".
if( GetFrame()->GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false ) )
if( GetFrame()->GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, false, /*bConsiderTextBox=*/true ) )
{
if (aFillAttributes.get() && aFillAttributes->isUsed())
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment