[Libreoffice-commits] .: Branch 'libreoffice-3-5' - 3 commits - sw/source

Miklos Vajna vmiklos at kemper.freedesktop.org
Fri Jun 29 00:47:23 PDT 2012


 sw/source/core/layout/paintfrm.cxx |   71 ++++++++++++++++++++++---------------
 1 file changed, 43 insertions(+), 28 deletions(-)

New commits:
commit 3d0d2611b5a2e735fc325e769f8de90e5e0518a2
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Jun 27 23:10:00 2012 +0200

    fdo#39415: sw: fix vertical collapsing border painting:
    
    For borders in vertically oriented text it's necessary to correct
    positions at different sides, i.e., right and left instead of
    top and bottom; refactor SwTabFrmPainter::Insert some more
    to handle this properly.
    
    Change-Id: If20b9477415e9bd12e63aab4eed2f070065eb473
    (cherry picked from commit d0bbbfdef6b31650a351883de09b5338562048a2)

diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 5a78bfc..0bcf3fa 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -2717,42 +2717,44 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
 
     bool const bBottomAsTop(lcl_IsFirstRowInFollowTableWithoutRepeatedHeadlines(
                 mrTabFrm, rFrm, rBoxItem));
-
-    // these are positions of the lines
-    const SwTwips nLeft   = aBorderRect._Left();
-    const SwTwips nRight  = aBorderRect._Right();
-    const SwTwips nTop    = aBorderRect._Top();
-    const SwTwips nBottom = aBorderRect._Bottom();
+    bool const bVert = mrTabFrm.IsVertical();
+    bool const bR2L  = mrTabFrm.IsRightToLeft();
 
     svx::frame::Style aL( rBoxItem.GetLeft() );
     svx::frame::Style aR( rBoxItem.GetRight() );
     svx::frame::Style aT( rBoxItem.GetTop() );
     svx::frame::Style aB( rBoxItem.GetBottom() );
 
+    aR.MirrorSelf();
+    aB.MirrorSelf();
+
     const SwTwips nHalfBottomWidth = aB.GetWidth() / 2;
     const SwTwips nHalfTopWidth = (bBottomAsTop)
             ? nHalfBottomWidth : aT.GetWidth() / 2;
 
-    aR.MirrorSelf();
-    aB.MirrorSelf();
-
-    bool bVert = mrTabFrm.IsVertical();
-    bool bR2L  = mrTabFrm.IsRightToLeft();
+    // these are positions of the lines
+    const SwTwips nLeft   =
+        aBorderRect._Left()  - ((bVert) ? nHalfBottomWidth : 0);
+    const SwTwips nRight  =
+        aBorderRect._Right() - ((bVert) ? nHalfTopWidth : 0);
+    const SwTwips nTop    =
+        aBorderRect._Top()   + ((bVert) ? 0 : nHalfTopWidth);
+    const SwTwips nBottom =
+        aBorderRect._Bottom()+ ((bVert) ? 0 : nHalfBottomWidth);
 
     aL.SetRefMode( svx::frame::REFMODE_CENTERED );
     aR.SetRefMode( svx::frame::REFMODE_CENTERED );
     aT.SetRefMode( !bVert ? svx::frame::REFMODE_BEGIN : svx::frame::REFMODE_END );
     aB.SetRefMode( !bVert ? svx::frame::REFMODE_BEGIN : svx::frame::REFMODE_END );
 
-    SwLineEntry aLeft  ( nLeft,   nTop + nHalfTopWidth,
-            nBottom + nHalfBottomWidth, bVert ? aB : ( bR2L ? aR : aL ) );
-    SwLineEntry aRight ( nRight,  nTop + nHalfTopWidth,
-            nBottom + nHalfBottomWidth,
-            bVert ? ((bBottomAsTop) ? aB : aT) : ( bR2L ? aL : aR ) );
-    SwLineEntry aTop   ( nTop + nHalfTopWidth,
-            nLeft, nRight,  bVert ? aL : ((bBottomAsTop) ? aB : aT) );
-    SwLineEntry aBottom( nBottom + nHalfBottomWidth,
-            nLeft, nRight,  bVert ? aR : aB );
+    SwLineEntry aLeft  (nLeft,   nTop,  nBottom,
+            (bVert) ? aB                         : ((bR2L) ? aR : aL));
+    SwLineEntry aRight (nRight,  nTop,  nBottom,
+            (bVert) ? ((bBottomAsTop) ? aB : aT) : ((bR2L) ? aL : aR));
+    SwLineEntry aTop   (nTop,    nLeft, nRight,
+            (bVert) ? aL                         : ((bBottomAsTop) ? aB : aT));
+    SwLineEntry aBottom(nBottom, nLeft, nRight,
+            (bVert) ? aR                         : aB);
 
     Insert( aLeft, false );
     Insert( aRight, false );
commit bac0e1fccde840f6ec2265c0198648ae6927781d
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Jun 27 20:51:24 2012 +0200

    fdo#39415: sw: fix collapsing border painting more:
    
    There is a special case for i#9860, which is for first line in follow
    table (i.e. continued on new page) without repeated headlines:
    Here the bottom border of the cell is used as the top border in case
    the cell does not have a top border; this is fixed now with a bit of
    refactoring, so the correct half width adjustment can be made.
    
    Change-Id: I58ef81b7e13544014ef75973ea793f673a242488
    (cherry picked from commit 3a4b7c3555f2ffb4e89502bb04ff063d8c08f628)

diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index d851cf0..5a78bfc 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -2682,6 +2682,24 @@ void SwTabFrmPainter::FindStylesForLine( const Point& rStartPoint,
     }
 }
 
+// special case: #i9860#
+// first line in follow table without repeated headlines
+static bool lcl_IsFirstRowInFollowTableWithoutRepeatedHeadlines(
+        SwTabFrm const& rTabFrm, SwFrm const& rFrm, SvxBoxItem const& rBoxItem)
+{
+    SwRowFrm const*const pThisRowFrm =
+        dynamic_cast<const SwRowFrm*>(rFrm.GetUpper());
+    return (pThisRowFrm
+        && (pThisRowFrm->GetUpper() == &rTabFrm)
+        && rTabFrm.IsFollow()
+        && !rTabFrm.GetTable()->GetRowsToRepeat()
+        &&  (  !pThisRowFrm->GetPrev()
+            || static_cast<const SwRowFrm*>(pThisRowFrm->GetPrev())
+                    ->IsRowSpanLine())
+        && !rBoxItem.GetTop()
+        && rBoxItem.GetBottom());
+}
+
 void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
 {
     std::vector< const SwFrm* > aTestVec;
@@ -2697,6 +2715,10 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
         aBorderRect.Pos() += rFrm.Frm().Pos();
     }
 
+    bool const bBottomAsTop(lcl_IsFirstRowInFollowTableWithoutRepeatedHeadlines(
+                mrTabFrm, rFrm, rBoxItem));
+
+    // these are positions of the lines
     const SwTwips nLeft   = aBorderRect._Left();
     const SwTwips nRight  = aBorderRect._Right();
     const SwTwips nTop    = aBorderRect._Top();
@@ -2707,8 +2729,9 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
     svx::frame::Style aT( rBoxItem.GetTop() );
     svx::frame::Style aB( rBoxItem.GetBottom() );
 
-    const SwTwips nHalfTopWidth = aT.GetWidth() / 2;
     const SwTwips nHalfBottomWidth = aB.GetWidth() / 2;
+    const SwTwips nHalfTopWidth = (bBottomAsTop)
+            ? nHalfBottomWidth : aT.GetWidth() / 2;
 
     aR.MirrorSelf();
     aB.MirrorSelf();
@@ -2724,9 +2747,10 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
     SwLineEntry aLeft  ( nLeft,   nTop + nHalfTopWidth,
             nBottom + nHalfBottomWidth, bVert ? aB : ( bR2L ? aR : aL ) );
     SwLineEntry aRight ( nRight,  nTop + nHalfTopWidth,
-            nBottom + nHalfBottomWidth, bVert ? aT : ( bR2L ? aL : aR ) );
+            nBottom + nHalfBottomWidth,
+            bVert ? ((bBottomAsTop) ? aB : aT) : ( bR2L ? aL : aR ) );
     SwLineEntry aTop   ( nTop + nHalfTopWidth,
-            nLeft, nRight,  bVert ? aL : aT );
+            nLeft, nRight,  bVert ? aL : ((bBottomAsTop) ? aB : aT) );
     SwLineEntry aBottom( nBottom + nHalfBottomWidth,
             nLeft, nRight,  bVert ? aR : aB );
 
@@ -2734,22 +2758,6 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
     Insert( aRight, false );
     Insert( aTop, true );
     Insert( aBottom, true );
-
-    const SwRowFrm* pThisRowFrm = dynamic_cast<const SwRowFrm*>(rFrm.GetUpper());
-
-    // special case: #i9860#
-    // first line in follow table without repeated headlines
-    if ( pThisRowFrm &&
-         pThisRowFrm->GetUpper() == &mrTabFrm &&
-         mrTabFrm.IsFollow() &&
-        !mrTabFrm.GetTable()->GetRowsToRepeat() &&
-        (!pThisRowFrm->GetPrev() || static_cast<const SwRowFrm*>(pThisRowFrm->GetPrev())->IsRowSpanLine()) &&
-        !rBoxItem.GetTop() &&
-         rBoxItem.GetBottom() )
-    {
-        SwLineEntry aFollowTop( !bVert ? nTop : nRight, !bVert ? nLeft : nTop, !bVert ? nRight : nBottom, aB );
-        Insert( aFollowTop, !bVert );
-    }
 }
 
 void SwTabFrmPainter::Insert( SwLineEntry& rNew, bool bHori )
commit e21f924439c065239268844d1cabdd0eaee7b313
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Jun 27 15:58:16 2012 +0200

    fdo#39415: sw: fix collapsing border painting:
    
    In a table with collapsing borders, the horizontal borders  need to be
    painted "below" the reference line, and not "centered" on the line like
    the vertical borders.
    a0486f02433703744f487e599422714d03937956 was apparently an attempt to
    fix this, but unfortunately it adjusted both top and bottom borders
    with the top border width, which has horrible results if the top and
    bottom borders have different widths.
    
    Change-Id: I7605eda6ef8111612ceb1ded79c0811de9ca7b25
    (cherry picked from commit aa8240e80394887a4af45710de69aacacec66d25)

diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 2351e02..d851cf0 100755
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -2708,6 +2708,7 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
     svx::frame::Style aB( rBoxItem.GetBottom() );
 
     const SwTwips nHalfTopWidth = aT.GetWidth() / 2;
+    const SwTwips nHalfBottomWidth = aB.GetWidth() / 2;
 
     aR.MirrorSelf();
     aB.MirrorSelf();
@@ -2720,10 +2721,14 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )
     aT.SetRefMode( !bVert ? svx::frame::REFMODE_BEGIN : svx::frame::REFMODE_END );
     aB.SetRefMode( !bVert ? svx::frame::REFMODE_BEGIN : svx::frame::REFMODE_END );
 
-    SwLineEntry aLeft  ( nLeft,   nTop + nHalfTopWidth,  nBottom + nHalfTopWidth, bVert ? aB : ( bR2L ? aR : aL ) );
-    SwLineEntry aRight ( nRight,  nTop + nHalfTopWidth,  nBottom + nHalfTopWidth, bVert ? aT : ( bR2L ? aL : aR ) );
-    SwLineEntry aTop   ( nTop + nHalfTopWidth,    nLeft, nRight,  bVert ? aL : aT );
-    SwLineEntry aBottom( nBottom + nHalfTopWidth, nLeft, nRight,  bVert ? aR : aB );
+    SwLineEntry aLeft  ( nLeft,   nTop + nHalfTopWidth,
+            nBottom + nHalfBottomWidth, bVert ? aB : ( bR2L ? aR : aL ) );
+    SwLineEntry aRight ( nRight,  nTop + nHalfTopWidth,
+            nBottom + nHalfBottomWidth, bVert ? aT : ( bR2L ? aL : aR ) );
+    SwLineEntry aTop   ( nTop + nHalfTopWidth,
+            nLeft, nRight,  bVert ? aL : aT );
+    SwLineEntry aBottom( nBottom + nHalfBottomWidth,
+            nLeft, nRight,  bVert ? aR : aB );
 
     Insert( aLeft, false );
     Insert( aRight, false );


More information about the Libreoffice-commits mailing list