summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-04-16 10:11:26 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2018-04-25 10:18:27 +0200
commit15593a5421a7f14ac8a4056aa233443130bcda6f (patch)
tree35972a22c83d431101679a1069b7cc51718b80e7
parent33dcd5f61e1966accf9b68c662bac7cb70352ca1 (diff)
tdf#117028 sw: conditionally consider fill of shape for in-textbox auto color
Commit f966767e1ccfa432da33e1a0fd6de69e17a36bc3 (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/52941 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org> (cherry picked from commit d9420a64fbb288020d33b681f40a858db49afca7) Reviewed-on: https://gerrit.libreoffice.org/52972 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r--sw/qa/extras/layout/data/tdf117028.docxbin0 -> 13619 bytes
-rw-r--r--sw/qa/extras/layout/layout.cxx24
-rw-r--r--sw/source/core/access/accpara.cxx2
-rw-r--r--sw/source/core/doc/notxtfrm.cxx2
-rw-r--r--sw/source/core/inc/frame.hxx3
-rw-r--r--sw/source/core/layout/paintfrm.cxx23
-rw-r--r--sw/source/core/text/inftxt.cxx2
-rw-r--r--sw/source/core/txtnode/fntcache.cxx2
8 files changed, 44 insertions, 14 deletions
diff --git a/sw/qa/extras/layout/data/tdf117028.docx b/sw/qa/extras/layout/data/tdf117028.docx
new file mode 100644
index 000000000000..877264b4db33
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf117028.docx
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 3709e306f53d..9a73e2025147 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -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();
diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx
index 0d60a9d09af3..83527b5102c3 100644
--- a/sw/source/core/access/accpara.cxx
+++ b/sw/source/core/access/accpara.cxx
@@ -998,7 +998,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 )
{
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 4a5176d50e6b..fd21b43bb3c7 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -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;
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index 25b65a992ff6..bb5d731def0b 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -555,7 +555,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;
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 4c54017b14b7..fedcd36f2266 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3783,7 +3783,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) &&
@@ -6364,7 +6364,7 @@ void SwFrame::PaintBackground( const SwRect &rRect, const SwPageFrame *pPage,
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 )
@@ -6374,7 +6374,7 @@ void SwFrame::PaintBackground( const SwRect &rRect, const SwPageFrame *pPage,
// <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>
@@ -7164,7 +7164,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())
{
@@ -7328,6 +7328,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(
@@ -7335,7 +7339,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();
@@ -7349,8 +7354,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
@@ -7364,12 +7369,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();
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index de131470c958..8001e94143c4 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -534,7 +534,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();
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index a7484a5ac4a7..a6d89f1add2a 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -2510,7 +2510,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())
{