diff options
author | Armin Le Grand <Armin.Le.Grand@cib.de> | 2017-07-27 16:03:48 +0200 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@cib.de> | 2017-07-28 18:09:10 +0200 |
commit | f62c65459100bd45bfc274e2b2587d5c6804feb2 (patch) | |
tree | dabc17be4da16b5427aea3b95cdd244c852218ed | |
parent | 7202cfa0d3bae430f8fcb8508ed389583a14539b (diff) |
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: Id9fc687b9a709d250faaad76c37ecfda8d8feb9b
-rw-r--r-- | drawinglayer/qa/unit/border.cxx | 21 | ||||
-rw-r--r-- | drawinglayer/source/primitive2d/borderlineprimitive2d.cxx | 32 | ||||
-rw-r--r-- | include/drawinglayer/primitive2d/borderlineprimitive2d.hxx | 1 | ||||
-rw-r--r-- | sc/source/ui/inc/output.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/output.cxx | 77 | ||||
-rw-r--r-- | svx/source/dialog/framelink.cxx | 100 | ||||
-rw-r--r-- | svx/source/dialog/framelinkarray.cxx | 10 | ||||
-rw-r--r-- | svx/source/dialog/frmsel.cxx | 3 | ||||
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 142 |
9 files changed, 85 insertions, 303 deletions
diff --git a/drawinglayer/qa/unit/border.cxx b/drawinglayer/qa/unit/border.cxx index ce99965b13f9..326c5deaa163 100644 --- a/drawinglayer/qa/unit/border.cxx +++ b/drawinglayer/qa/unit/border.cxx @@ -61,7 +61,15 @@ void DrawinglayerBorderTest::testDoubleDecompositionSolid() basegfx::BColor aColorGap; bool const bHasGapColor = false; SvxBorderLineStyle const nStyle = SvxBorderLineStyle::DOUBLE; - rtl::Reference<drawinglayer::primitive2d::BorderLinePrimitive2D> aBorder(new drawinglayer::primitive2d::BorderLinePrimitive2D(aStart, aEnd, fLeftWidth, fDistance, fRightWidth, fExtendLeftStart, fExtendLeftEnd, fExtendRightStart, fExtendRightEnd, aColorRight, aColorLeft, aColorGap, bHasGapColor, nStyle)); + rtl::Reference<drawinglayer::primitive2d::BorderLinePrimitive2D> aBorder( + new drawinglayer::primitive2d::BorderLinePrimitive2D( + aStart, + aEnd, + drawinglayer::primitive2d::BorderLine(fLeftWidth, aColorLeft, fExtendLeftStart, fExtendLeftEnd), + drawinglayer::primitive2d::BorderLine(fDistance, aColorGap), + drawinglayer::primitive2d::BorderLine(fRightWidth, aColorRight, fExtendRightStart, fExtendRightEnd), + bHasGapColor, + nStyle)); // Decompose it into polygons. drawinglayer::geometry::ViewInformation2D aView; @@ -109,7 +117,16 @@ void DrawinglayerBorderTest::testDoublePixelProcessing() basegfx::BColor aColorGap; bool const bHasGapColor = false; SvxBorderLineStyle const nStyle = SvxBorderLineStyle::DOUBLE; - rtl::Reference<drawinglayer::primitive2d::BorderLinePrimitive2D> xBorder(new drawinglayer::primitive2d::BorderLinePrimitive2D(aStart, aEnd, fLeftWidth, fDistance, fRightWidth, fExtendLeftStart, fExtendLeftEnd, fExtendRightStart, fExtendRightEnd, aColorRight, aColorLeft, aColorGap, bHasGapColor, nStyle)); + rtl::Reference<drawinglayer::primitive2d::BorderLinePrimitive2D> xBorder( + new drawinglayer::primitive2d::BorderLinePrimitive2D( + aStart, + aEnd, + drawinglayer::primitive2d::BorderLine(fLeftWidth, aColorLeft, fExtendLeftStart, fExtendLeftEnd), + drawinglayer::primitive2d::BorderLine(fDistance, aColorGap), + drawinglayer::primitive2d::BorderLine(fRightWidth, aColorRight, fExtendRightStart, fExtendRightEnd), + bHasGapColor, + nStyle)); + drawinglayer::primitive2d::Primitive2DContainer aPrimitives; aPrimitives.push_back(drawinglayer::primitive2d::Primitive2DReference(xBorder.get())); diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx index 724ba8772c44..dae52a26f0c6 100644 --- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx @@ -49,6 +49,10 @@ namespace drawinglayer { } + BorderLine::~BorderLine() + { + } + bool BorderLine::operator==(const BorderLine& rBorderLine) const { return getWidth() == rBorderLine.getWidth() @@ -104,13 +108,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 +132,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 +148,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/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx b/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx index 3108a81f619b..a174dcb9dd1e 100644 --- a/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx +++ b/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx @@ -58,6 +58,7 @@ namespace drawinglayer const basegfx::BColor& rRGBColor, double fExtendStart = 0.0, double fExtendEnd = 0.0); + virtual ~BorderLine(); double getWidth() const { return mfWidth; } const basegfx::BColor& getRGBColor() const { return maRGBColor; } diff --git a/sc/source/ui/inc/output.hxx b/sc/source/ui/inc/output.hxx index 5345b69141bb..acc7ec251264 100644 --- a/sc/source/ui/inc/output.hxx +++ b/sc/source/ui/inc/output.hxx @@ -231,7 +231,7 @@ private: double GetStretch(); - void DrawRotatedFrame(vcl::RenderContext& rRenderContext, const Color* pForceColor); // pixel + void DrawRotatedFrame(vcl::RenderContext& rRenderContext); // pixel drawinglayer::processor2d::BaseProcessor2D* CreateProcessor2D( ); diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx index f4db5fec5b09..87e495fac4bc 100644 --- a/sc/source/ui/view/output.cxx +++ b/sc/source/ui/view/output.cxx @@ -1387,7 +1387,7 @@ void ScOutputData::DrawFrame(vcl::RenderContext& rRenderContext) if (mrTabInfo.maArray.HasCellRotation()) { - DrawRotatedFrame(rRenderContext, pForceColor); // removes the lines that must not be painted here + DrawRotatedFrame(rRenderContext); // removes the lines that must not be painted here } long nInitPosX = nScrX; @@ -1474,74 +1474,7 @@ void ScOutputData::DrawFrame(vcl::RenderContext& rRenderContext) rRenderContext.SetDrawMode(nOldDrawMode); } -// Line below the cell - -static const ::editeng::SvxBorderLine* lcl_FindHorLine( ScDocument* pDoc, - SCCOL nCol, SCROW nRow, SCTAB nTab, ScRotateDir nRotDir, - bool bTopLine ) -{ - if ( nRotDir != ScRotateDir::Left && nRotDir != ScRotateDir::Right ) - return nullptr; - - bool bFound = false; - while (!bFound) - { - if ( nRotDir == ScRotateDir::Left ) - { - // text to the left -> line from the right - if ( nCol < MAXCOL ) - ++nCol; - else - return nullptr; // couldn't find it - } - else - { - // text to the right -> line from the left - if ( nCol > 0 ) - --nCol; - else - return nullptr; // couldn't find it - } - const ScPatternAttr* pPattern = pDoc->GetPattern( nCol, nRow, nTab ); - const SfxItemSet* pCondSet = pDoc->GetCondResult( nCol, nRow, nTab ); - if ( !pPattern->GetRotateVal( pCondSet ) || - static_cast<const SvxRotateModeItem&>(pPattern->GetItem( - ATTR_ROTATE_MODE, pCondSet)).GetValue() == SVX_ROTATE_MODE_STANDARD ) - bFound = true; - } - - if (bTopLine) - --nRow; - const ::editeng::SvxBorderLine* pThisBottom; - if ( ValidRow(nRow) ) - pThisBottom = static_cast<const SvxBoxItem*>(pDoc->GetAttr( nCol, nRow, nTab, ATTR_BORDER ))->GetBottom(); - else - pThisBottom = nullptr; - const ::editeng::SvxBorderLine* pNextTop; - if ( nRow < MAXROW ) - pNextTop = static_cast<const SvxBoxItem*>(pDoc->GetAttr( nCol, nRow+1, nTab, ATTR_BORDER ))->GetTop(); - else - pNextTop = nullptr; - - if ( ScHasPriority( pThisBottom, pNextTop ) ) - return pThisBottom; - else - return pNextTop; -} - -static long lcl_getRotate( ScDocument* pDoc, SCTAB nTab, SCCOL nX, SCROW nY ) -{ - long nRotate = 0; - - const ScPatternAttr* pPattern = pDoc->GetPattern( nX, nY, nTab ); - const SfxItemSet* pCondSet = pDoc->GetCondResult( nX, nY, nTab ); - - nRotate = pPattern->GetRotateVal( pCondSet ); - - return nRotate; -} - -void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext, const Color* pForceColor) +void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext) { //! save nRotMax SCCOL nRotMax = nX2; @@ -1555,8 +1488,6 @@ void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext, const Co const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); bool bCellContrast = mbUseStyleColor && rStyleSettings.GetHighContrastMode(); - // color (pForceColor) is determined externally, including DrawMode changes - long nInitPosX = nScrX; if ( bLayoutRTL ) { @@ -1575,9 +1506,7 @@ void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext, const Co else rRenderContext.SetClipRegion( vcl::Region( aClipRect ) ); - svx::frame::Array& rArray = mrTabInfo.maArray; std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(CreateProcessor2D( )); - long nPosY = nScrY; for (SCSIZE nArrY=1; nArrY<nArrCount; nArrY++) { @@ -1587,8 +1516,6 @@ void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext, const Co RowInfo& rThisRowInfo = pRowInfo[nArrY]; RowInfo& rNextRowInfo = pRowInfo[nArrY+1]; - size_t nRow = static_cast< size_t >( nArrY ); - long nRowHeight = rThisRowInfo.nHeight; if ( rThisRowInfo.nRotMaxCol != SC_ROTMAX_NONE && ( rThisRowInfo.bChanged || rPrevRowInfo.bChanged || diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx index c746e881679c..9bb3830b421d 100644 --- a/svx/source/dialog/framelink.cxx +++ b/svx/source/dialog/framelink.cxx @@ -278,73 +278,6 @@ bool CheckFrameBorderConnectable( const Style& rLBorder, const Style& rRBorder, // Drawing functions -// get offset to center of line in question -double lcl_getCenterOfLineOffset(const Style& rBorder, bool bLeftEdge) -{ - const bool bPrimUsed(!basegfx::fTools::equalZero(rBorder.Prim())); // left - const bool bDistUsed(!basegfx::fTools::equalZero(rBorder.Dist())); // distance - const bool bSecnUsed(!basegfx::fTools::equalZero(rBorder.Secn())); // right - - if (bDistUsed || bSecnUsed) - { - // double line, get center by adding half distance and half line width. - // bLeftEdge defines which line to use - return (rBorder.Dist() + (bLeftEdge ? rBorder.Prim() : rBorder.Secn())) * 0.5; - } - else if (bPrimUsed) - { - // single line, get center - return rBorder.Prim() * 0.5; - } - - // no line width at all, stay on unit vector - return 0.0; -} - -double lcl_GetExtent( - const Style& rBorder, const Style& rSide, const Style& rOpposite, - long nAngleSide, long nAngleOpposite, - bool bLeftEdge, // left or right of rBorder - bool bOtherLeft ) // left or right of rSide/rOpposite -{ - Style aOtherBorder = rSide; - long nOtherAngle = nAngleSide; - if ( rSide.GetWidth() == 0 && rOpposite.GetWidth() > 0 ) - { - nOtherAngle = nAngleOpposite; - aOtherBorder = rOpposite; - } - else if ( rSide.GetWidth() == 0 && rOpposite.GetWidth() == 0 ) - { - if ( ( nAngleOpposite % 18000 ) == 0 ) - nOtherAngle = nAngleSide; - else if ( ( nAngleSide % 18000 ) == 0 ) - nOtherAngle = nAngleOpposite; - } - - // Let's assume the border we are drawing is horizontal and compute all the angles / distances from this - basegfx::B2DVector aBaseVector( 1.0, 0.0 ); - // added support to get the distances to the centers of the line, *not* the outre edge - basegfx::B2DPoint aBasePoint(0.0, lcl_getCenterOfLineOffset(rBorder, bLeftEdge)); - - basegfx::B2DHomMatrix aRotation; - aRotation.rotate( double( nOtherAngle ) * M_PI / 18000.0 ); - - basegfx::B2DVector aOtherVector = aRotation * aBaseVector; - // Compute a line shifted by half the width of the other border - basegfx::B2DVector aPerpendicular = basegfx::getNormalizedPerpendicular( aOtherVector ); - // added support to get the distances to the centers of the line, *not* the outre edge - basegfx::B2DPoint aOtherPoint = basegfx::B2DPoint() + aPerpendicular * lcl_getCenterOfLineOffset(aOtherBorder, bOtherLeft); - - // Find the cut between the two lines - double nCut = 0.0; - basegfx::tools::findCut( - aBasePoint, aBaseVector, aOtherPoint, aOtherVector, - CutFlagValue::ALL, &nCut ); - - return nCut; -} - struct OffsetPair { double mfLeft; @@ -523,7 +456,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 +492,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( @@ -636,7 +585,10 @@ void CreateBorderPrimitives( else if (2 == myOffsets.size()) { // we are a double edge, calculate cuts with edges coming from above/below - // for both edges to detect the line start/end extensions + // for both edges to detect the line start/end extensions. In the furure this + // needs to be extended to use two values per extension, getComplexExtendedLineValues + // internally prepares these already. drawinglayer::primitive2d::BorderLine will + // then need to take these double entries (maybe a pair) and use them internally. double mfExtendLeftStart(0.0); double mfExtendLeftEnd(0.0); double mfExtendRightStart(0.0); @@ -671,8 +623,12 @@ void CreateBorderPrimitives( drawinglayer::primitive2d::BorderLine( rBorder.Dist(), (pForceColor ? *pForceColor : rBorder.GetColorGap()).getBColor(), - (mfExtendLeftStart + mfExtendRightStart) * 0.5, - (mfExtendLeftEnd + mfExtendRightEnd) * 0.5), + // needs to be determined in detail later, for now use the max prolongation + // from left/right, butz do not less than half (0.0). This works decently, + // but not perfect (see Writer, use three-color-style, look at upper/lower# + // connections) + std::max(0.0, std::max(mfExtendLeftStart, mfExtendRightStart)), + std::max(0.0, std::max(mfExtendLeftEnd, mfExtendRightEnd))), drawinglayer::primitive2d::BorderLine( rBorder.Secn(), (pForceColor ? *pForceColor : rBorder.GetColorSecn()).getBColor(), diff --git a/svx/source/dialog/framelinkarray.cxx b/svx/source/dialog/framelinkarray.cxx index 839e9bef5d77..04d0d2ac2b6d 100644 --- a/svx/source/dialog/framelinkarray.cxx +++ b/svx/source/dialog/framelinkarray.cxx @@ -132,8 +132,6 @@ void lclSetMergedRange( CellVec& rCells, size_t nWidth, size_t nFirstCol, size_t static const Style OBJ_STYLE_NONE; static const Cell OBJ_CELL_NONE; -const bool DIAG_DBL_CLIP_DEFAULT = false; - struct ArrayImpl { CellVec maCells; @@ -1122,7 +1120,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY.normalize(); } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( aSequence, aOrigin, @@ -1188,7 +1186,7 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, aY.normalize(); } - drawinglayer::primitive2d::Primitive2DContainer aSequence(1); + drawinglayer::primitive2d::Primitive2DContainer aSequence; CreateBorderPrimitives( aSequence, aOrigin, @@ -1288,7 +1286,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 +1365,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/svx/source/dialog/frmsel.cxx b/svx/source/dialog/frmsel.cxx index 93567852d1a9..e3ccf03eebc0 100644 --- a/svx/source/dialog/frmsel.cxx +++ b/svx/source/dialog/frmsel.cxx @@ -667,9 +667,6 @@ void FrameSelectorImpl::DrawAllFrameBorders() for( size_t nRow = 0; nRow < maArray.GetRowCount(); ++nRow ) maArray.SetCellStyleDiag( nCol, nRow, maTLBR.GetUIStyle(), maBLTR.GetUIStyle() ); - // Let the helper array draw itself - static bool bUsePrimitives(true); - // This is used in the dialog/control for 'Border' attributes. When using // the original paint below instead of primitives, the advantage currently // is the correct visualization of diagonal line(s) including overlaying, 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 |