drawinglayer/source/primitive2d/borderlineprimitive2d.cxx | 28 +- svx/source/dialog/framelink.cxx | 20 + svx/source/dialog/framelinkarray.cxx | 8 sw/source/core/layout/paintfrm.cxx | 142 -------------- 4 files changed, 48 insertions(+), 150 deletions(-)
New commits: commit b6cdad8a0cbb3c4b0ef8984179502daa054d8518 Author: arminl <arminl@KRANIX> Date: Thu Jul 27 16:03:48 2017 +0200 borderline: corrections for calc and writer Made corrections/finetuning for Calc and Writer. Had to remove some former code which tried to do corrections Change-Id: Ia7669c9eb7f3338d250cd350bfa5c2bc8e61763b diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx index 724ba8772c44..1dfa77a80f7c 100644 --- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx @@ -104,13 +104,17 @@ namespace drawinglayer // double line with gap. Use mfDiscreteGapDistance (see get2DDecomposition) as distance. // That value is prepared to be at least one pixel (discrete unit) so that the // decomposition is view-dependent in this cases + const BorderLine& rLeft(getBorderLines()[0]); + const BorderLine& rGap(getBorderLines()[1]); + const BorderLine& rRight(getBorderLines()[2]); + const double fFullWidth(rLeft.getWidth() + mfDiscreteGapDistance + rRight.getWidth()); + { - // inside line (left of vector). Create stroke primitive centered on line width - const BorderLine& rLeft(getBorderLines()[0]); - const double fDeltaY((mfDiscreteGapDistance + rLeft.getWidth()) * 0.5); + // inside line (left of vector). Create stroke primitive centered on left line width + const double fDeltaY((rLeft.getWidth() - fFullWidth) * 0.5); const basegfx::B2DVector aDeltaY(aPerpendicular * fDeltaY); - const basegfx::B2DPoint aStart(getStart() - (aVector * rLeft.getExtendStart()) - aDeltaY); - const basegfx::B2DPoint aEnd(getEnd() + (aVector * rLeft.getExtendEnd()) - aDeltaY); + const basegfx::B2DPoint aStart(getStart() - (aVector * rLeft.getExtendStart()) + aDeltaY); + const basegfx::B2DPoint aEnd(getEnd() + (aVector * rLeft.getExtendEnd()) + aDeltaY); const attribute::LineAttribute aLineAttribute(rLeft.getRGBColor(), rLeft.getWidth()); addPolygonStrokePrimitive2D( @@ -124,10 +128,11 @@ namespace drawinglayer if (hasGapColor()) { // gap (if visible, found practical usage in Writer MultiColorBorderLines). - // Create stroke primitive on vector with given color - const BorderLine& rGap(getBorderLines()[1]); - const basegfx::B2DPoint aStart(getStart() - (aVector * rGap.getExtendStart())); - const basegfx::B2DPoint aEnd(getEnd() + (aVector * rGap.getExtendEnd())); + // Create stroke primitive on vector with given color centered on gap position + const double fDeltaY(((fFullWidth - mfDiscreteGapDistance) * 0.5) - rRight.getWidth()); + const basegfx::B2DVector aDeltaY(aPerpendicular * fDeltaY); + const basegfx::B2DPoint aStart(getStart() - (aVector * rGap.getExtendStart()) + aDeltaY); + const basegfx::B2DPoint aEnd(getEnd() + (aVector * rGap.getExtendEnd()) + aDeltaY); const attribute::LineAttribute aLineAttribute(rGap.getRGBColor(), mfDiscreteGapDistance); addPolygonStrokePrimitive2D( @@ -139,9 +144,8 @@ namespace drawinglayer } { - // outside line (right of vector). Create stroke primitive centered on line width - const BorderLine& rRight(getBorderLines()[2]); - const double fDeltaY((mfDiscreteGapDistance + rRight.getWidth()) * 0.5); + // outside line (right of vector). Create stroke primitive centered on right line width + const double fDeltaY((fFullWidth - rRight.getWidth()) * 0.5); const basegfx::B2DVector aDeltaY(aPerpendicular * fDeltaY); const basegfx::B2DPoint aStart(getStart() - (aVector * rRight.getExtendStart()) + aDeltaY); const basegfx::B2DPoint aEnd(getEnd() + (aVector * rRight.getExtendEnd()) + aDeltaY); diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx index c746e881679c..faa408c29dcc 100644 --- a/svx/source/dialog/framelink.cxx +++ b/svx/source/dialog/framelink.cxx @@ -523,7 +523,14 @@ double getSimpleExtendedLineValues( if (pResult) { - return (pResult->mfLeftRight + pResult->mfRightRight) * 0.5 * (bEdgeStart ? -fLength : fLength); + if (bEdgeStart) + { + return (pResult->mfLeftRight + pResult->mfRightRight) * -0.5 * fLength; + } + else + { + return (pResult->mfLeftLeft + pResult->mfRightLeft) * 0.5 * fLength; + } } return 0.0; @@ -552,8 +559,17 @@ double getComplexExtendedLineValues( if (pResult) { - return (pResult->mfLeftRight + pResult->mfRightRight) * 0.5 * (bEdgeStart ? -fLength : fLength); + if (bEdgeStart) + { + return (pResult->mfLeftRight + pResult->mfRightRight) * 0.5 * -fLength; + } + else + { + return (pResult->mfLeftLeft + pResult->mfRightLeft) * 0.5 * fLength; + } } + + return 0.0; } void CreateBorderPrimitives( diff --git a/svx/source/dialog/framelinkarray.cxx b/svx/source/dialog/framelinkarray.cxx index 839e9bef5d77..0817a474320a 100644 --- a/svx/source/dialog/framelinkarray.cxx +++ b/svx/source/dialog/framelinkarray.cxx @@ -1122,7 +1122,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY.normalize(); } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( aSequence, aOrigin, @@ -1188,7 +1188,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY.normalize(); } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( aSequence, aOrigin, @@ -1288,7 +1288,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY = -aY; } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( // This replaces DrawVerFrameBorder which went from top to bottom. To be able to use // the same method as for horizontal (CreateBorderPrimitives), the given borders @@ -1367,7 +1367,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY = -aY; } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( // also reordered, see call to CreateBorderPrimitives above aSequence, diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 407ac441ecf7..493eb8ea3185 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -2448,11 +2448,6 @@ struct SwLineEntry SwTwips mnKey; SwTwips mnStartPos; SwTwips mnEndPos; - SwTwips mnOffset; - - bool mbOffsetPerp; - bool mbOffsetStart; - bool mbOffsetEnd; svx::frame::Style maAttribute; @@ -2474,10 +2469,6 @@ SwLineEntry::SwLineEntry( SwTwips nKey, : mnKey( nKey ), mnStartPos( nStartPos ), mnEndPos( nEndPos ), - mnOffset( 0 ), - mbOffsetPerp(false), - mbOffsetStart(false), - mbOffsetEnd(false), maAttribute( rAttribute ) { } @@ -2556,8 +2547,6 @@ class SwTabFramePainter svx::frame::Style*, bool bHori ) const; - void AdjustTopLeftFrames(); - public: explicit SwTabFramePainter( const SwTabFrame& rTabFrame ); @@ -2568,7 +2557,6 @@ SwTabFramePainter::SwTabFramePainter( const SwTabFrame& rTabFrame ) : mrTabFrame( rTabFrame ) { HandleFrame( rTabFrame ); - AdjustTopLeftFrames(); } void SwTabFramePainter::HandleFrame( const SwLayoutFrame& rLayoutFrame ) @@ -2666,42 +2654,6 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons svx::frame::Style aStyles[ 7 ]; aStyles[ 0 ] = rEntryStyle; FindStylesForLine( aStart, aEnd, aStyles, bHori ); - - // Account for double line thicknesses for the top- and left-most borders. - if (rEntry.mnOffset) - { - if (bHori) - { - if (rEntry.mbOffsetPerp) - { - // Apply offset in perpendicular direction. - aStart.Y() -= rEntry.mnOffset; - aEnd.Y() -= rEntry.mnOffset; - } - if (rEntry.mbOffsetStart) - // Apply offset at the start of a border. - aStart.X() -= rEntry.mnOffset; - if (rEntry.mbOffsetEnd) - // Apply offset at the end of a border. - aEnd.X() += rEntry.mnOffset; - } - else - { - if (rEntry.mbOffsetPerp) - { - // Apply offset in perpendicular direction. - aStart.X() -= rEntry.mnOffset; - aEnd.X() -= rEntry.mnOffset; - } - if (rEntry.mbOffsetStart) - // Apply offset at the start of a border. - aStart.Y() -= rEntry.mnOffset; - if (rEntry.mbOffsetEnd) - // Apply offset at the end of a border. - aEnd.Y() += rEntry.mnOffset; - } - } - SwRect aRepaintRect( aStart, aEnd ); // the repaint rectangle has to be moved a bit for the centered lines: @@ -2769,47 +2721,25 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons aPaintEnd.Y() = aUpperAligned.Bottom_(); } - // logically vertical lines are painted centered on the line, - // logically horizontal lines are painted "below" the line - // - // This does not need to be done here, it is set in SwTabFramePainter::Insert - // already using SetRefMode(...) as property of the BorderLine Style, see there. - // When additionally adding the offset here manually, it will be applied - // double and will be rendered wrong. This did not happen before because - // the setting of the svx::frame::RefMode at svx::frame::Style was ignored there. - // - // bool const isBelow((mrTabFrame.IsVertical()) ? !bHori : bHori); - // double const offsetStart = (isBelow) - // ? aStyles[0].GetWidth() / 2.0 - // : std::max<double>(aStyles[1].GetWidth(), - // aStyles[3].GetWidth()) / 2.0; - // double const offsetEnd = (isBelow) - // ? aStyles[0].GetWidth() / 2.0 - // : std::max<double>(aStyles[4].GetWidth(), - // aStyles[6].GetWidth()) / 2.0; - // if (mrTabFrame.IsVertical()) - // { - // aPaintStart.X() -= static_cast<long>(offsetStart + 0.5); - // aPaintEnd.X() -= static_cast<long>(offsetEnd + 0.5); - // } - // else - // { - // aPaintStart.Y() += static_cast<long>(offsetStart + 0.5); - // aPaintEnd.Y() += static_cast<long>(offsetEnd + 0.5); - // } - if (bHori) { const basegfx::B2DPoint aOrigin(aPaintStart.X(), aPaintStart.Y()); const basegfx::B2DVector aX(basegfx::B2DPoint(aPaintEnd.X(), aPaintEnd.Y()) - aOrigin); const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX)); - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; svx::frame::CreateBorderPrimitives( aSequence, aOrigin, aX, - aY, + + // Writer creates it's vertical BorderLines bottom-to-top (see below). + // To make the horizontal lines correctly 'guess' the line extensions + // for the then mirrored svx::frame::Style for irregular double lines, + // hand over the for that case correct orientatoin of the 'other' + // incoming edges + -aY, + aStyles[ 0 ], // current style aStyles[ 1 ], // aLFromT aStyles[ 2 ], // aLFromL @@ -2825,7 +2755,7 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons const basegfx::B2DPoint aOrigin(aPaintEnd.X(), aPaintEnd.Y()); const basegfx::B2DVector aX(basegfx::B2DPoint(aPaintStart.X(), aPaintStart.Y()) - aOrigin); const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX)); - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; svx::frame::CreateBorderPrimitives( aSequence, @@ -2954,58 +2884,6 @@ void SwTabFramePainter::FindStylesForLine( const Point& rStartPoint, } } -namespace { - -void calcOffsetForDoubleLine( SwLineEntryMap& rLines ) -{ - SwLineEntryMap aNewLines; - SwLineEntryMap::iterator it = rLines.begin(), itEnd = rLines.end(); - bool bFirst = true; - for (; it != itEnd; ++it) - { - if (bFirst) - { - // First line needs to be offset to account for double line thickness. - SwLineEntrySet aNewSet; - const SwLineEntrySet& rSet = it->second; - SwLineEntrySet::iterator itSet = rSet.begin(), itSetEnd = rSet.end(); - size_t nEntryCount = rSet.size(); - for (size_t i = 0; itSet != itSetEnd; ++itSet, ++i) - { - SwLineEntry aLine = *itSet; - if (aLine.maAttribute.Secn()) - { - // Apply offset only for double lines. - aLine.mnOffset = static_cast<SwTwips>(aLine.maAttribute.Dist()); - aLine.mbOffsetPerp = true; - - if (i == 0) - aLine.mbOffsetStart = true; - if (i == nEntryCount - 1) - aLine.mbOffsetEnd = true; - } - - aNewSet.insert(aLine); - } - - aNewLines.insert(SwLineEntryMap::value_type(it->first, aNewSet)); - } - else - aNewLines.insert(SwLineEntryMap::value_type(it->first, it->second)); - - bFirst = false; - } - rLines.swap(aNewLines); -} - -} - -void SwTabFramePainter::AdjustTopLeftFrames() -{ - calcOffsetForDoubleLine(maHoriLines); - calcOffsetForDoubleLine(maVertLines); -} - /** * Special case: #i9860# * first line in follow table without repeated headlines _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits