diff options
| -rw-r--r-- | drawinglayer/source/primitive2d/borderlineprimitive2d.cxx | 56 | ||||
| -rw-r--r-- | include/svx/framelink.hxx | 19 | ||||
| -rw-r--r-- | svx/source/dialog/framelink.cxx | 53 | ||||
| -rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 70 | 
4 files changed, 84 insertions, 114 deletions
diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx index 67efa09da581..7b9348dc6fec 100644 --- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx @@ -183,37 +183,33 @@ primitive2d::Primitive2DReference makeSolidLinePrimitive(                      xRetval.realloc(2); -                    { -                        // "inside" line -                        double fWidth = getLeftWidth(); -                        basegfx::BColor aColor = getRGBColorLeft(); -                        bool bIsHairline = lcl_UseHairline( -                                fWidth, getStart(), getEnd(), rViewInformation); -                        fWidth = lcl_GetCorrectedWidth(fWidth, -                                    getStart(), getEnd(), rViewInformation); - -                        if (bIsHairline) -                            xRetval[0] = makeHairLinePrimitive(getStart(), getEnd(), aVector, aColor, 0.0); -                        else -                            xRetval[0] = makeSolidLinePrimitive( -                                aClipRegion, aTmpStart, aTmpEnd, aVector, aColor, fWidth, 0.0); -                    } +                    double fLeftWidth = getLeftWidth(); +                    bool bLeftHairline = lcl_UseHairline(fLeftWidth, getStart(), getEnd(), rViewInformation); +                    if (bLeftHairline) +                        fLeftWidth = 0.0; -                    { -                        // "outside" line -                        double fWidth = getRightWidth(); -                        basegfx::BColor aColor = getRGBColorRight(); -                        bool bIsHairline = lcl_UseHairline( -                                fWidth, getStart(), getEnd(), rViewInformation); -                        fWidth = lcl_GetCorrectedWidth(fWidth, -                                    getStart(), getEnd(), rViewInformation); - -                        if (bIsHairline) -                            xRetval[1] = makeHairLinePrimitive(getStart(), getEnd(), aVector, aColor, mfDistance); -                        else -                            xRetval[1] = makeSolidLinePrimitive( -                                aClipRegion, aTmpStart, aTmpEnd, aVector, aColor, fWidth, mfDistance); -                    } +                    double fRightWidth = getRightWidth(); +                    bool bRightHairline = lcl_UseHairline(fRightWidth, getStart(), getEnd(), rViewInformation); +                    if (bRightHairline) +                        fRightWidth = 0.0; + +                    // "inside" line + +                    if (bLeftHairline) +                        xRetval[0] = makeHairLinePrimitive( +                            getStart(), getEnd(), aVector, getRGBColorLeft(), 0.0); +                    else +                        xRetval[0] = makeSolidLinePrimitive( +                            aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorLeft(), fLeftWidth, -fLeftWidth/2.0); + +                    // "outside" line + +                    if (bRightHairline) +                        xRetval[1] = makeHairLinePrimitive( +                            getStart(), getEnd(), aVector, getRGBColorRight(), fLeftWidth+mfDistance); +                    else +                        xRetval[1] = makeSolidLinePrimitive( +                            aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorRight(), fRightWidth, mfDistance+fRightWidth/2.0);                  }                  else                  { diff --git a/include/svx/framelink.hxx b/include/svx/framelink.hxx index afae83e428e7..708643811eda 100644 --- a/include/svx/framelink.hxx +++ b/include/svx/framelink.hxx @@ -124,14 +124,15 @@ public:      inline const Color& GetColorSecn() const { return maColorSecn; }      inline const Color& GetColorGap() const { return maColorGap; }      inline bool         UseGapColor() const { return mbUseGapColor; } -    inline double       Prim() const { return mnPrim; } -    inline double       Dist() const { return mnDist; } -    inline double       Secn() const { return mnSecn; } -    double Scale() const; +    inline double       Prim() const { return mfPrim; } +    inline double       Dist() const { return mfDist; } +    inline double       Secn() const { return mfSecn; } +    double PatternScale() const; +    void SetPatternScale( double fScale );      inline editeng::SvxBorderStyle Type() const { return mnType; }      /** Returns the total width of this frame style. */ -    inline double       GetWidth() const { return mnPrim + mnDist + mnSecn; } +    inline double       GetWidth() const { return mfPrim + mfDist + mfSecn; }      /** Sets the frame style to invisible state. */      void                Clear(); @@ -165,10 +166,10 @@ private:      Color               maColorGap;      bool                mbUseGapColor;      RefMode             meRefMode;  /// Reference point handling for this frame border. -    double              mnPrim;     /// Width of primary (single, left, or top) line. -    double              mnDist;     /// Distance between primary and secondary line. -    double              mnSecn;     /// Width of secondary (right or bottom) line. -    double              mfScale; +    double              mfPrim;     /// Width of primary (single, left, or top) line. +    double              mfDist;     /// Distance between primary and secondary line. +    double              mfSecn;     /// Width of secondary (right or bottom) line. +    double mfPatternScale; /// Scale used for line pattern spacing.      editeng::SvxBorderStyle      mnType;  }; diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx index 82683743302c..28383a920456 100644 --- a/svx/source/dialog/framelink.cxx +++ b/svx/source/dialog/framelink.cxx @@ -1126,7 +1126,7 @@ void lclDrawDiagFrameBorders(  Style::Style() :      meRefMode(REFMODE_CENTERED), -    mfScale(1.0), +    mfPatternScale(1.0),      mnType(table::BorderLineStyle::SOLID)  {      Clear(); @@ -1134,7 +1134,7 @@ Style::Style() :  Style::Style( double nP, double nD, double nS, editeng::SvxBorderStyle nType ) :      meRefMode(REFMODE_CENTERED), -    mfScale(1.0), +    mfPatternScale(1.0),      mnType(nType)  {      Clear(); @@ -1144,7 +1144,7 @@ Style::Style( double nP, double nD, double nS, editeng::SvxBorderStyle nType ) :  Style::Style( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor,                double nP, double nD, double nS, editeng::SvxBorderStyle nType ) :      meRefMode(REFMODE_CENTERED), -    mfScale(1.0), +    mfPatternScale(1.0),      mnType(nType)  {      Set( rColorPrim, rColorSecn, rColorGap, bUseGapColor, nP, nD, nS ); @@ -1152,21 +1152,26 @@ Style::Style( const Color& rColorPrim, const Color& rColorSecn, const Color& rCo  Style::Style( const editeng::SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWidth ) :      meRefMode(REFMODE_CENTERED), -    mfScale(fScale) +    mfPatternScale(fScale)  {      Set( rBorder, fScale, nMaxWidth );  }  Style::Style( const editeng::SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWidth ) :      meRefMode(REFMODE_CENTERED), -    mfScale(fScale) +    mfPatternScale(fScale)  {      Set( pBorder, fScale, nMaxWidth );  } -double Style::Scale() const +double Style::PatternScale() const  { -    return mfScale; +    return mfPatternScale; +} + +void Style::SetPatternScale( double fScale ) +{ +    mfPatternScale = fScale;  }  void Style::Clear() @@ -1183,9 +1188,9 @@ void Style::Set( double nP, double nD, double nS )          >0  0   >0      nP      0       0          >0  >0  >0      nP      nD      nS       */ -    mnPrim = rtl::math::round(nP ? nP : nS, 2); -    mnDist = rtl::math::round((nP && nS) ? nD : 0, 2); -    mnSecn = rtl::math::round((nP && nD) ? nS : 0, 2); +    mfPrim = rtl::math::round(nP ? nP : nS, 2); +    mfDist = rtl::math::round((nP && nS) ? nD : 0, 2); +    mfSecn = rtl::math::round((nP && nD) ? nS : 0, 2);  }  void Style::Set( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor, double nP, double nD, double nS ) @@ -1219,29 +1224,29 @@ void Style::Set( const SvxBorderLine& rBorder, double fScale, sal_uInt16 nMaxWid          // Enlarge the style if distance is too small due to rounding losses.          double nPixWidth = SCALEVALUE( nPrim + nDist + nSecn );          if( nPixWidth > GetWidth() ) -            mnDist = nPixWidth - mnPrim - mnSecn; +            mfDist = nPixWidth - mfPrim - mfSecn;          // Shrink the style if it is too thick for the control.          while( GetWidth() > nMaxWidth )          {              // First decrease space between lines. -            if( mnDist ) -                --mnDist; +            if( mfDist ) +                --mfDist;              // Still too thick? Decrease the line widths.              if( GetWidth() > nMaxWidth )              { -                if( rtl::math::approxEqual(mnPrim, 0.0) && rtl::math::approxEqual(mnPrim, mnSecn) ) +                if( rtl::math::approxEqual(mfPrim, 0.0) && rtl::math::approxEqual(mfPrim, mfSecn) )                  {                      // Both lines equal - decrease both to keep symmetry. -                    --mnPrim; -                    --mnSecn; +                    --mfPrim; +                    --mfSecn;                  }                  else                  {                      // Decrease each line for itself -                    if( mnPrim ) -                        --mnPrim; -                    if( (GetWidth() > nMaxWidth) && !rtl::math::approxEqual(mnSecn, 0.0) ) -                        --mnSecn; +                    if( mfPrim ) +                        --mfPrim; +                    if( (GetWidth() > nMaxWidth) && !rtl::math::approxEqual(mfSecn, 0.0) ) +                        --mfSecn;                  }              }          } @@ -1261,8 +1266,8 @@ void Style::Set( const SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWid  Style& Style::MirrorSelf()  { -    if( mnSecn ) -        std::swap( mnPrim, mnSecn ); +    if( mfSecn ) +        std::swap( mfPrim, mfSecn );      if( meRefMode != REFMODE_CENTERED )          meRefMode = (meRefMode == REFMODE_BEGIN) ? REFMODE_END : REFMODE_BEGIN;      return *this; @@ -1429,7 +1434,7 @@ drawinglayer::primitive2d::Primitive2DSequence CreateClippedBorderPrimitives (          rBorder.GetColorSecn().getBColor(),          rBorder.GetColorPrim().getBColor(),          rBorder.GetColorGap().getBColor(), -        rBorder.UseGapColor(), rBorder.Type(), rBorder.Scale() ); +        rBorder.UseGapColor(), rBorder.Type(), rBorder.PatternScale() );      return aSequence;  } @@ -1457,7 +1462,7 @@ drawinglayer::primitive2d::Primitive2DSequence CreateBorderPrimitives(          rBorder.GetColorSecn().getBColor(),          rBorder.GetColorPrim().getBColor(),          rBorder.GetColorGap().getBColor(), -        rBorder.UseGapColor(), rBorder.Type(), rBorder.Scale() ); +        rBorder.UseGapColor(), rBorder.Type(), rBorder.PatternScale() );      return aSequence;  } diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index e6b9a66dcfb0..c2719ddbda05 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -2451,9 +2451,6 @@ void SwTabFrmPainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) const      // #i16816# tagged pdf support      SwTaggedPDFHelper aTaggedPDFHelper( 0, 0, 0, rDev ); -    const SwFrm* pTmpFrm = &mrTabFrm; -    const bool bVert = pTmpFrm->IsVertical(); -      SwLineEntryMapConstIter aIter = maHoriLines.begin();      bool bHori = true; @@ -2471,17 +2468,6 @@ void SwTabFrmPainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) const          rDev.SetDrawMode( 0 );      } -    // set clip region: -    rDev.Push( PUSH_CLIPREGION ); -    Size aSize( rRect.SSize() ); -    // Hack! Necessary, because the layout is not pixel aligned! -    aSize.Width() += nPixelSzW; aSize.Height() += nPixelSzH; -    rDev.SetClipRegion(Region(Rectangle(rRect.Pos(), aSize))); - -    // The following stuff is necessary to have the new table borders fit -    // into a ::SwAlignRect adjusted world. -    const SwTwips nTwipXCorr =  bVert ? 0 : std::max( 0L, nHalfPixelSzW - 2 );    // 1 < 2 < 3 ;-) -    const SwTwips nTwipYCorr = !bVert ? 0 : std::max( 0L, nHalfPixelSzW - 2 );    // 1 < 2 < 3 ;-)      const SwFrm* pUpper = mrTabFrm.GetUpper();      SwRect aUpper( pUpper->Prt() );      aUpper.Pos() += pUpper->Frm().Pos(); @@ -2593,25 +2579,6 @@ void SwTabFrmPainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) const              else                  pTmpColor = pHCColor; -            // The line sizes stored in the line style have to be adjusted as -            // well.  This will guarantee that lines with the same twip size -            // will have the same pixel size. -            for ( int i = 0; i < 7; ++i ) -            { -                sal_uInt16 nPrim = aStyles[ i ].Prim(); -                sal_uInt16 nDist = aStyles[ i ].Dist(); -                sal_uInt16 nSecn = aStyles[ i ].Secn(); - -                if (nPrim > 0) -                    nPrim = (sal_uInt16)( std::max( 1L, nPixelSzH * ( nPrim / nPixelSzH ) ) ); -                if (nDist > 0) -                    nDist = (sal_uInt16)( std::max( 1L, nPixelSzH * ( nDist / nPixelSzH ) ) ); -                if (nSecn > 0) -                    nSecn = (sal_uInt16)( std::max( 1L, nPixelSzH * ( nSecn / nPixelSzH ) ) ); - -                aStyles[ i ].Set( nPrim, nDist, nSecn ); -            } -              // The (twip) positions will be adjusted to meet these requirements:              // 1. The y coordinates are located in the middle of the pixel grid              // 2. The x coordinated are located at the beginning of the pixel grid @@ -2669,12 +2636,6 @@ void SwTabFrmPainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) const                  aPaintEnd.Y()   += static_cast<long>(offsetEnd   + 0.5);              } -            aPaintStart.X() -= nTwipXCorr; // nHalfPixelSzW - 2 to assure that we do not leave the pixel -            aPaintEnd.X()   -= nTwipXCorr; -            aPaintStart.Y() -= nTwipYCorr; -            aPaintEnd.Y()   -= nTwipYCorr; - -            // Here comes the painting stuff: Thank you, DR, great job!!!              if (bHori)              {                  mrTabFrm.ProcessPrimitives( svx::frame::CreateBorderPrimitives( @@ -2711,7 +2672,6 @@ void SwTabFrmPainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) const      }      // restore output device: -    rDev.Pop();      rDev.SetDrawMode( nOldDrawMode );  } @@ -2835,13 +2795,17 @@ void calcOffsetForDoubleLine( SwLineEntryMap& rLines )              for (size_t i = 0; itSet != itSetEnd; ++itSet, ++i)              {                  SwLineEntry aLine = *itSet; -                aLine.mnOffset = static_cast<SwTwips>(aLine.maAttribute.Dist()); -                aLine.mbOffsetPerp = true; - -                if (i == 0) -                    aLine.mbOffsetStart = true; -                if (i == nEntryCount - 1) -                    aLine.mbOffsetEnd = true; +                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);              } @@ -2903,10 +2867,14 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem )      const Fraction& rFracX = rMapMode.GetScaleX();      const Fraction& rFracY = rMapMode.GetScaleY(); -    svx::frame::Style aL(rBoxItem.GetLeft(), rFracX); -    svx::frame::Style aR(rBoxItem.GetRight(), rFracY); -    svx::frame::Style aT(rBoxItem.GetTop(), rFracX); -    svx::frame::Style aB(rBoxItem.GetBottom(), rFracY); +    svx::frame::Style aL(rBoxItem.GetLeft()); +    aL.SetPatternScale(rFracY); +    svx::frame::Style aR(rBoxItem.GetRight()); +    aR.SetPatternScale(rFracY); +    svx::frame::Style aT(rBoxItem.GetTop()); +    aT.SetPatternScale(rFracX); +    svx::frame::Style aB(rBoxItem.GetBottom()); +    aB.SetPatternScale(rFracX);      aR.MirrorSelf();      aB.MirrorSelf();  | 
