include/svx/framelink.hxx | 107 +---------------------------------- include/svx/framelinkarray.hxx | 10 --- svx/source/dialog/framelink.cxx | 34 ++--------- svx/source/dialog/framelinkarray.cxx | 89 +++++------------------------ svx/source/dialog/frmsel.cxx | 9 +- 5 files changed, 34 insertions(+), 215 deletions(-)
New commits: commit 3e36255a53db5264eaa212edbc81015f465dbaee Author: Armin Le Grand <armin.le.gr...@cib.de> Date: Thu Aug 17 20:19:46 2017 +0200 borderline: Cleanup of DiagStyle and others DiagStyle is not needed anymore due to no longer using angles calculated, but being based on vectors defining the geometry. Also cleaned up quite a bit of no longer needed calculation stuff for the control Change-Id: I10f2702416eea68b9e1541c6ae153d1f6094970b diff --git a/include/svx/framelink.hxx b/include/svx/framelink.hxx index f79b5ed84301..ce4ff50e8524 100644 --- a/include/svx/framelink.hxx +++ b/include/svx/framelink.hxx @@ -187,107 +187,8 @@ SVX_DLLPUBLIC bool operator<( const Style& rL, const Style& rR ); inline bool operator>( const Style& rL, const Style& rR ) { return rR < rL; } inline bool operator<=( const Style& rL, const Style& rR ) { return !(rR < rL); } - -/** Extends the Style struct with an angle for diagonal frame borders. - - The angle is specified in radian (a full circle is equivalent to 2*PI). - It is dependent on the context, how the value is interpreted, i.e. it may - specify the angle to a horizontal or vertical frame border. - */ -class SAL_WARN_UNUSED DiagStyle : public Style -{ -public: - /** Constructs an invisible diagonal frame style. */ - explicit DiagStyle() : mfAngle( 0.0 ) {} - /** Constructs a diagonal frame style passed style and angle. */ - explicit DiagStyle( const Style& rStyle, double fAngle ) : - Style( rStyle ), mfAngle( fAngle ) {} - - double GetAngle() const { return mfAngle; } - - /** Returns this style mirrored, if it is a double frame style, otherwise a simple copy. */ - DiagStyle Mirror() const { return DiagStyle( Style::Mirror(), mfAngle ); } - -private: - double mfAngle; /// Angle between this and hor. or vert. border. -}; - - // Various helper functions - -/** Returns the angle between horizontal border of a rectangle and its diagonal. - - The returned values represents the inner angle between the diagonals and - horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The - passed sizes may be negative, calculation is done with absolute values. - */ -SVX_DLLPUBLIC double GetHorDiagAngle( long nWidth, long nHeight ); - -/** Returns the angle between horizontal border of a rectangle and its diagonal. - - The returned values represents the inner angle between the diagonals and - horizontal borders, and is therefore in the range [0,PI/2] (inclusive). - */ -inline double GetHorDiagAngle( const tools::Rectangle& rRect ) -{ return GetHorDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); } - - -/** Returns the angle between vertical border of a rectangle and its diagonal. - - The returned values represents the inner angle between the diagonals and - vertical borders, and is therefore in the range [0,PI/2] (inclusive). The - passed sizes may be negative, calculation is done with absolute values. - */ -inline double GetVerDiagAngle( long nWidth, long nHeight ) -{ return GetHorDiagAngle( nHeight, nWidth ); } - -/** Returns the angle between vertical border of a rectangle and its diagonal. - - The returned values represents the inner angle between the diagonals and - vertical borders, and is therefore in the range [0,PI/2] (inclusive). - */ -inline double GetVerDiagAngle( const tools::Rectangle& rRect ) -{ return GetVerDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); } - - -/** Returns an X coordinate for a diagonal frame border in the specified height. - - This function is for usage with the top-left end of a top-left to - bottom-right diagonal frame border, connected to the left end of a - horizontal frame border. - - The function returns the relative X position (i.e. for a polygon) of the - diagonal frame border according to the specified relative Y position. The - mentioned positions are relative to the reference point of both frame - borders. - - +---------------------------------------------------------- - | The horizontal frame border. - | | - - - - - - - | --+-- <---- Reference point for horizontal and diagonal frame borders. - ^ | \ | \ - nVerOffs | \ \ <--- The diagonal frame border. - v +---\ \------------------------------------------------ - - - - - - - - - -\- - -X <----- The function calculates the X position of i.e. - \ \ this point (relative from X of reference point). - \ \ - Primary -->\ \<-- Secondary - - @param nVerOffs - The vertical position of the point to be calculated, relative to the Y - coordinate of the reference point. - @param nDiagOffs - The width offset across the diagonal frame border (0 = middle), - regardless of the gradient of the diagonal frame border (always - vertical to the direction of the diagonal frame border). This value is - not related in any way to the reference point. For details about - relative width offsets, see description of class Style. - @param fAngle - Inner (right) angle between diagonal and horizontal frame border. - */ -SVX_DLLPUBLIC long GetTLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle ); - /** Checks whether two horizontal frame borders are "connectable". Two borders are "connectable" in terms of this function, if both can be @@ -377,17 +278,17 @@ SVX_DLLPUBLIC void CreateBorderPrimitives( const Style& rBorder, /// Style of the processed frame border. - const DiagStyle& rLFromTR, /// Diagonal frame border from top-right to left end of rBorder. + const Style& rLFromTR, /// Diagonal frame border from top-right to left end of rBorder. const Style& rLFromT, /// Vertical frame border from top to left end of rBorder. const Style& rLFromL, /// Horizontal frame border from left to left end of rBorder. const Style& rLFromB, /// Vertical frame border from bottom to left end of rBorder. - const DiagStyle& rLFromBR, /// Diagonal frame border from bottom-right to left end of rBorder. + const Style& rLFromBR, /// Diagonal frame border from bottom-right to left end of rBorder. - const DiagStyle& rRFromTL, /// Diagonal frame border from top-left to right end of rBorder. + const Style& rRFromTL, /// Diagonal frame border from top-left to right end of rBorder. const Style& rRFromT, /// Vertical frame border from top to right end of rBorder. const Style& rRFromR, /// Horizontal frame border from right to right end of rBorder. const Style& rRFromB, /// Vertical frame border from bottom to right end of rBorder. - const DiagStyle& rRFromBL, /// Diagonal frame border from bottom-left to right end of rBorder. + const Style& rRFromBL, /// Diagonal frame border from bottom-left to right end of rBorder. const Color* pForceColor /// If specified, overrides frame border color. ); diff --git a/include/svx/framelinkarray.hxx b/include/svx/framelinkarray.hxx index 15d8dcf1d9cf..ade65c111dca 100644 --- a/include/svx/framelinkarray.hxx +++ b/include/svx/framelinkarray.hxx @@ -307,16 +307,6 @@ public: Returns total output rectangle of merged ranges. */ tools::Rectangle GetCellRect( size_t nCol, size_t nRow ) const; - // diagonal frame borders ------------------------------------------------- - - /** Returns the angle between horizontal and diagonal border of the cell (nCol,nRow). - Returns the horizontal angle of merged ranges. */ - double GetHorDiagAngle( size_t nCol, size_t nRow ) const; - - /** Returns the angle between vertical and diagonal border of the cell (nCol,nRow). - Returns the vertical angle of merged ranges. */ - double GetVerDiagAngle( size_t nCol, size_t nRow ) const; - // mirroring -------------------------------------------------------------- /** Mirrors the entire array horizontally. */ diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx index 4a30caad6b6d..41cc29c7973f 100644 --- a/svx/source/dialog/framelink.cxx +++ b/svx/source/dialog/framelink.cxx @@ -44,12 +44,6 @@ namespace frame { namespace { -/** Rounds and casts a double value to a long value. */ -inline long lclD2L( double fValue ) -{ - return static_cast< long >( (fValue < 0.0) ? (fValue - 0.5) : (fValue + 0.5) ); -} - /** Converts a width in twips to a width in another map unit (specified by fScale). */ double lclScaleValue( double nValue, double fScale, sal_uInt16 nMaxWidth ) { @@ -241,18 +235,6 @@ bool operator<( const Style& rL, const Style& rR ) #undef SCALEVALUE - -// Various helper functions -double GetHorDiagAngle( long nWidth, long nHeight ) -{ - return atan2( static_cast< double >( std::abs( nHeight ) ), static_cast< double >( std::abs( nWidth ) ) ); -} - -long GetTLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle ) -{ - return lclD2L( nVerOffs / tan( fAngle ) + nDiagOffs / sin( fAngle ) ); -} - bool CheckFrameBorderConnectable( const Style& rLBorder, const Style& rRBorder, const Style& rTFromTL, const Style& rTFromT, const Style& rTFromTR, const Style& rBFromBL, const Style& rBFromB, const Style& rBFromBR ) @@ -511,16 +493,16 @@ void CreateBorderPrimitives( const basegfx::B2DVector& rX, const basegfx::B2DVector& rY, const Style& rBorder, - const DiagStyle& /*rLFromTR*/, + const Style& /*rLFromTR*/, const Style& rLFromT, const Style& /*rLFromL*/, const Style& rLFromB, - const DiagStyle& /*rLFromBR*/, - const DiagStyle& /*rRFromTL*/, + const Style& /*rLFromBR*/, + const Style& /*rRFromTL*/, const Style& rRFromT, const Style& /*rRFromR*/, const Style& rRFromB, - const DiagStyle& /*rRFromBL*/, + const Style& /*rRFromBL*/, const Color* pForceColor) { if (rBorder.Prim()) @@ -670,16 +652,16 @@ void CreateBorderPrimitives( rX, rY, rBorder, - DiagStyle(), + Style(), rLFromT, rLFromL, rLFromB, - DiagStyle(), - DiagStyle(), + Style(), + Style(), rRFromT, rRFromR, rRFromB, - DiagStyle(), + Style(), pForceColor); } } diff --git a/svx/source/dialog/framelinkarray.cxx b/svx/source/dialog/framelinkarray.cxx index 5c87cf33943b..011bf304fbda 100644 --- a/svx/source/dialog/framelinkarray.cxx +++ b/svx/source/dialog/framelinkarray.cxx @@ -183,9 +183,6 @@ struct ArrayImpl long GetColWidth( size_t nFirstCol, size_t nLastCol ) const; long GetRowHeight( size_t nFirstRow, size_t nLastRow ) const; - double GetHorDiagAngle( size_t nCol, size_t nRow ) const; - double GetVerDiagAngle( size_t nCol, size_t nRow ) const; - bool HasCellRotation() const; }; @@ -319,35 +316,6 @@ long ArrayImpl::GetRowHeight( size_t nFirstRow, size_t nLastRow ) const return GetRowPosition( nLastRow + 1 ) - GetRowPosition( nFirstRow ); } -double ArrayImpl::GetHorDiagAngle( size_t nCol, size_t nRow ) const -{ - double fAngle = 0.0; - if( IsValidPos( nCol, nRow ) ) - { - if( !GetCell( nCol, nRow ).IsMerged() ) - { - fAngle = frame::GetHorDiagAngle( maWidths[ nCol ] + 1, maHeights[ nRow ] + 1 ); - } - else - { - // return correct angle for each cell in the merged range - size_t nFirstCol = GetMergedFirstCol( nCol, nRow ); - size_t nFirstRow = GetMergedFirstRow( nCol, nRow ); - const Cell& rCell = GetCell( nFirstCol, nFirstRow ); - long nWidth = GetColWidth( nFirstCol, GetMergedLastCol( nCol, nRow ) ) + rCell.mnAddLeft + rCell.mnAddRight; - long nHeight = GetRowHeight( nFirstRow, GetMergedLastRow( nCol, nRow ) ) + rCell.mnAddTop + rCell.mnAddBottom; - fAngle = frame::GetHorDiagAngle( nWidth + 1, nHeight + 1 ); - } - } - return fAngle; -} - -double ArrayImpl::GetVerDiagAngle( size_t nCol, size_t nRow ) const -{ - double fAngle = GetHorDiagAngle( nCol, nRow ); - return (fAngle > 0.0) ? (F_PI2 - fAngle) : 0.0; -} - bool ArrayImpl::HasCellRotation() const { // check cell array @@ -884,19 +852,6 @@ tools::Rectangle Array::GetCellRect( size_t nCol, size_t nRow ) const return aRect; } -// diagonal frame borders -double Array::GetHorDiagAngle( size_t nCol, size_t nRow ) const -{ - DBG_FRAME_CHECK_COLROW( nCol, nRow, "GetHorDiagAngle" ); - return mxImpl->GetHorDiagAngle( nCol, nRow ); -} - -double Array::GetVerDiagAngle( size_t nCol, size_t nRow ) const -{ - DBG_FRAME_CHECK_COLROW( nCol, nRow, "GetVerDiagAngle" ); - return mxImpl->GetVerDiagAngle( nCol, nRow ); -} - // mirroring void Array::MirrorSelfX() { @@ -1043,43 +998,37 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, // *** horizontal frame borders *** for( nRow = nFirstRow; nRow <= nLastRow + 1; ++nRow ) { - double fAngle = mxImpl->GetHorDiagAngle( nFirstCol, nRow ); - double fTAngle = mxImpl->GetHorDiagAngle( nFirstCol, nRow - 1 ); - // *Start*** variables store the data of the left end of the cached frame border basegfx::B2DPoint aStartPos( mxImpl->GetColPosition( nFirstCol ), mxImpl->GetRowPosition( nRow ) ); const Style* pStart = &GetCellStyleTop( nFirstCol, nRow ); - DiagStyle aStartLFromTR( GetCellStyleBL( nFirstCol, nRow - 1 ), fTAngle ); + Style aStartLFromTR( GetCellStyleBL( nFirstCol, nRow - 1 )); const Style* pStartLFromT = &GetCellStyleLeft( nFirstCol, nRow - 1 ); const Style* pStartLFromL = &GetCellStyleTop( nFirstCol - 1, nRow ); const Style* pStartLFromB = &GetCellStyleLeft( nFirstCol, nRow ); - DiagStyle aStartLFromBR( GetCellStyleTL( nFirstCol, nRow ), fAngle ); + Style aStartLFromBR( GetCellStyleTL( nFirstCol, nRow )); // *End*** variables store the data of the right end of the cached frame border - DiagStyle aEndRFromTL( GetCellStyleBR( nFirstCol, nRow - 1 ), fTAngle ); + Style aEndRFromTL( GetCellStyleBR( nFirstCol, nRow - 1 )); const Style* pEndRFromT = &GetCellStyleRight( nFirstCol, nRow - 1 ); const Style* pEndRFromR = &GetCellStyleTop( nFirstCol + 1, nRow ); const Style* pEndRFromB = &GetCellStyleRight( nFirstCol, nRow ); - DiagStyle aEndRFromBL( GetCellStyleTR( nFirstCol, nRow ), fAngle ); + Style aEndRFromBL( GetCellStyleTR( nFirstCol, nRow )); for( nCol = nFirstCol + 1; nCol <= nLastCol; ++nCol ) { - fAngle = mxImpl->GetHorDiagAngle( nCol, nRow ); - fTAngle = mxImpl->GetHorDiagAngle( nCol, nRow - 1 ); - const Style& rCurr = *pEndRFromR; - DiagStyle aLFromTR( GetCellStyleBL( nCol, nRow - 1 ), fTAngle ); + Style aLFromTR( GetCellStyleBL( nCol, nRow - 1 )); const Style& rLFromT = *pEndRFromT; const Style& rLFromL = *pStart; const Style& rLFromB = *pEndRFromB; - DiagStyle aLFromBR( GetCellStyleTL( nCol, nRow ), fAngle ); + Style aLFromBR( GetCellStyleTL( nCol, nRow )); - DiagStyle aRFromTL( GetCellStyleBR( nCol, nRow - 1 ), fTAngle ); + Style aRFromTL( GetCellStyleBR( nCol, nRow - 1 )); const Style& rRFromT = GetCellStyleRight( nCol, nRow - 1 ); const Style& rRFromR = GetCellStyleTop( nCol + 1, nRow ); const Style& rRFromB = GetCellStyleRight( nCol, nRow ); - DiagStyle aRFromBL( GetCellStyleTR( nCol, nRow ), fAngle ); + Style aRFromBL( GetCellStyleTR( nCol, nRow )); // check if current frame border can be connected to cached frame border if( !CheckFrameBorderConnectable( *pStart, rCurr, aEndRFromTL, rLFromT, aLFromTR, aEndRFromBL, rLFromB, aLFromBR ) ) @@ -1211,43 +1160,37 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor, // *** vertical frame borders *** for( nCol = nFirstCol; nCol <= nLastCol + 1; ++nCol ) { - double fAngle = mxImpl->GetVerDiagAngle( nCol, nFirstRow ); - double fLAngle = mxImpl->GetVerDiagAngle( nCol - 1, nFirstRow ); - // *Start*** variables store the data of the top end of the cached frame border basegfx::B2DPoint aStartPos( mxImpl->GetColPosition( nCol ), mxImpl->GetRowPosition( nFirstRow ) ); const Style* pStart = &GetCellStyleLeft( nCol, nFirstRow ); - DiagStyle aStartTFromBL( GetCellStyleTR( nCol - 1, nFirstRow ), fLAngle ); + Style aStartTFromBL( GetCellStyleTR( nCol - 1, nFirstRow )); const Style* pStartTFromL = &GetCellStyleTop( nCol - 1, nFirstRow ); const Style* pStartTFromT = &GetCellStyleLeft( nCol, nFirstRow - 1 ); const Style* pStartTFromR = &GetCellStyleTop( nCol, nFirstRow ); - DiagStyle aStartTFromBR( GetCellStyleTL( nCol, nFirstRow ), fAngle ); + Style aStartTFromBR( GetCellStyleTL( nCol, nFirstRow )); // *End*** variables store the data of the bottom end of the cached frame border - DiagStyle aEndBFromTL( GetCellStyleBR( nCol - 1, nFirstRow ), fLAngle ); + Style aEndBFromTL( GetCellStyleBR( nCol - 1, nFirstRow )); const Style* pEndBFromL = &GetCellStyleBottom( nCol - 1, nFirstRow ); const Style* pEndBFromB = &GetCellStyleLeft( nCol, nFirstRow + 1 ); const Style* pEndBFromR = &GetCellStyleBottom( nCol, nFirstRow ); - DiagStyle aEndBFromTR( GetCellStyleBL( nCol, nFirstRow ), fAngle ); + Style aEndBFromTR( GetCellStyleBL( nCol, nFirstRow )); for( nRow = nFirstRow + 1; nRow <= nLastRow; ++nRow ) { - fAngle = mxImpl->GetVerDiagAngle( nCol, nRow ); - fLAngle = mxImpl->GetVerDiagAngle( nCol - 1, nRow ); - const Style& rCurr = *pEndBFromB; - DiagStyle aTFromBL( GetCellStyleTR( nCol - 1, nRow ), fLAngle ); + Style aTFromBL( GetCellStyleTR( nCol - 1, nRow )); const Style& rTFromL = *pEndBFromL; const Style& rTFromT = *pStart; const Style& rTFromR = *pEndBFromR; - DiagStyle aTFromBR( GetCellStyleTL( nCol, nRow ), fAngle ); + Style aTFromBR( GetCellStyleTL( nCol, nRow )); - DiagStyle aBFromTL( GetCellStyleBR( nCol - 1, nRow ), fLAngle ); + Style aBFromTL( GetCellStyleBR( nCol - 1, nRow )); const Style& rBFromL = GetCellStyleBottom( nCol - 1, nRow ); const Style& rBFromB = GetCellStyleLeft( nCol, nRow + 1 ); const Style& rBFromR = GetCellStyleBottom( nCol, nRow ); - DiagStyle aBFromTR( GetCellStyleBL( nCol, nRow ), fAngle ); + Style aBFromTR( GetCellStyleBL( nCol, nRow )); // check if current frame border can be connected to cached frame border if( !CheckFrameBorderConnectable( *pStart, rCurr, diff --git a/svx/source/dialog/frmsel.cxx b/svx/source/dialog/frmsel.cxx index e3ccf03eebc0..0bb928039b07 100644 --- a/svx/source/dialog/frmsel.cxx +++ b/svx/source/dialog/frmsel.cxx @@ -360,8 +360,9 @@ void FrameSelectorImpl::InitGlobalGeometry() /* nBetwBordersSize contains the size between an outer and inner frame border (made odd). */ long nBetwBordersSize = (((nMinSize - nFixedSize) / 2) - 1) | 1; - /* The final size of the usable area. */ + /* The final size of the usable area. At least do not get negative */ mnCtrlSize = 2 * nBetwBordersSize + nFixedSize; + mnCtrlSize = std::max(mnCtrlSize, static_cast<long>(0)); mpVirDev->SetOutputSizePixel( Size( mnCtrlSize, mnCtrlSize ) ); /* Center the virtual device in the control. */ @@ -410,8 +411,10 @@ void FrameSelectorImpl::InitBorderGeometry() for( nRow = 0, nRows = maArray.GetRowCount(); nRow < nRows; ++nRow ) { tools::Rectangle aRect( maArray.GetCellRect( nCol, nRow ) ); - long nDiagFocusOffsX = frame::GetTLDiagOffset( -mnFocusOffs, mnFocusOffs, maArray.GetHorDiagAngle( nCol, nRow ) ); - long nDiagFocusOffsY = frame::GetTLDiagOffset( -mnFocusOffs, mnFocusOffs, maArray.GetVerDiagAngle( nCol, nRow ) ); + const double fHorDiagAngle(atan2(static_cast< double >(std::abs(aRect.GetHeight())), static_cast< double >(std::abs(aRect.GetWidth())))); + const double fVerDiagAngle(fHorDiagAngle > 0.0 ? F_PI2 - fHorDiagAngle : 0.0); + const long nDiagFocusOffsX(basegfx::fround(-mnFocusOffs / tan(fHorDiagAngle) + mnFocusOffs / sin(fHorDiagAngle))); + const long nDiagFocusOffsY(basegfx::fround(-mnFocusOffs / tan(fVerDiagAngle) + mnFocusOffs / sin(fVerDiagAngle))); std::vector< Point > aFocusVec; aFocusVec.push_back( Point( aRect.Left() - mnFocusOffs, aRect.Top() + nDiagFocusOffsY ) ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits