diff options
-rw-r--r-- | include/tools/gen.hxx | 5 | ||||
-rw-r--r-- | include/vcl/outdev.hxx | 4 | ||||
-rw-r--r-- | tools/Library_tl.mk | 1 | ||||
-rw-r--r-- | tools/source/generic/point.cxx | 79 | ||||
-rw-r--r-- | vcl/source/outdev/font.cxx | 15 | ||||
-rw-r--r-- | vcl/source/outdev/outdev.cxx | 53 | ||||
-rw-r--r-- | vcl/source/outdev/text.cxx | 6 | ||||
-rw-r--r-- | vcl/source/outdev/textline.cxx | 17 |
8 files changed, 112 insertions, 68 deletions
diff --git a/include/tools/gen.hxx b/include/tools/gen.hxx index af046dfb9972..e8ad8feeae8b 100644 --- a/include/tools/gen.hxx +++ b/include/tools/gen.hxx @@ -78,7 +78,7 @@ inline bool Pair::operator != ( const Pair& rPair ) const // Point -class SAL_WARN_UNUSED Point : public Pair +class SAL_DLLPUBLIC_EXPORT SAL_WARN_UNUSED Point : public Pair { public: Point(); @@ -96,6 +96,9 @@ public: bool IsLeft( const Point& rPoint ) const; bool IsRight( const Point& rPoint ) const; + void RotateAround( long& rX, long& rY, short nOrientation ) const; + + Point& operator += ( const Point& rPoint ); Point& operator -= ( const Point& rPoint ); Point& operator *= ( const long nVal ); diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index c17fd9ebc0e2..0a775db5ac2a 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -478,10 +478,6 @@ public: void SetExtOutDevData( vcl::ExtOutDevData* pExtOutDevData ) { mpExtOutDevData = pExtOutDevData; } vcl::ExtOutDevData* GetExtOutDevData() const { return mpExtOutDevData; } -private: - - SAL_DLLPRIVATE void ImplRotatePos( long nOriginX, long nOriginY, long& rX, long &rY, - short nOrientation ) const; ///@} diff --git a/tools/Library_tl.mk b/tools/Library_tl.mk index 856471bbf7ba..d399548cd874 100644 --- a/tools/Library_tl.mk +++ b/tools/Library_tl.mk @@ -59,6 +59,7 @@ $(eval $(call gb_Library_add_exception_objects,tl,\ tools/source/generic/gen \ tools/source/generic/line \ tools/source/generic/link \ + tools/source/generic/point \ tools/source/generic/poly \ tools/source/generic/poly2 \ tools/source/generic/svborder \ diff --git a/tools/source/generic/point.cxx b/tools/source/generic/point.cxx new file mode 100644 index 000000000000..7feaef6a2083 --- /dev/null +++ b/tools/source/generic/point.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <numeric> + +#include <tools/gen.hxx> +#include <basegfx/numeric/ftools.hxx> + +void Point::RotateAround( long& rX, long& rY, + short nOrientation ) const +{ + const long nOriginX = X(); + const long nOriginY = Y(); + + if ( (nOrientation >= 0) && !(nOrientation % 900) ) + { + if ( (nOrientation >= 3600) ) + nOrientation %= 3600; + + if ( nOrientation ) + { + rX -= nOriginX; + rY -= nOriginY; + + if ( nOrientation == 900 ) + { + long nTemp = rX; + rX = rY; + rY = -nTemp; + } + else if ( nOrientation == 1800 ) + { + rX = -rX; + rY = -rY; + } + else /* ( nOrientation == 2700 ) */ + { + long nTemp = rX; + rX = -rY; + rY = nTemp; + } + + rX += nOriginX; + rY += nOriginY; + } + } + else + { + double nRealOrientation = nOrientation*F_PI1800; + double nCos = cos( nRealOrientation ); + double nSin = sin( nRealOrientation ); + + // Translation... + long nX = rX-nOriginX; + long nY = rY-nOriginY; + + // Rotation... + rX = +((long)(nCos*nX + nSin*nY)) + nOriginX; + rY = -((long)(nSin*nX - nCos*nY)) + nOriginY; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx index b5cbb0e09f0a..7d142e048277 100644 --- a/vcl/source/outdev/font.cxx +++ b/vcl/source/outdev/font.cxx @@ -1577,14 +1577,20 @@ bool OutputDevice::ImplNewFont() const mnTextOffX = 0; mnTextOffY = +pFontEntry->maMetric.mnAscent + mnEmphasisAscent; if ( pFontEntry->mnOrientation ) - ImplRotatePos( 0, 0, mnTextOffX, mnTextOffY, pFontEntry->mnOrientation ); + { + Point aOriginPt(0, 0); + aOriginPt.RotateAround( mnTextOffX, mnTextOffY, pFontEntry->mnOrientation ); + } } else // eAlign == ALIGN_BOTTOM { mnTextOffX = 0; mnTextOffY = -pFontEntry->maMetric.mnDescent + mnEmphasisDescent; if ( pFontEntry->mnOrientation ) - ImplRotatePos( 0, 0, mnTextOffX, mnTextOffY, pFontEntry->mnOrientation ); + { + Point aOriginPt(0, 0); + aOriginPt.RotateAround( mnTextOffX, mnTextOffY, pFontEntry->mnOrientation ); + } } mbTextLines = ((maFont.GetUnderline() != UNDERLINE_NONE) && (maFont.GetUnderline() != UNDERLINE_DONTKNOW)) || @@ -1958,7 +1964,10 @@ void OutputDevice::ImplDrawEmphasisMarks( SalLayout& rSalLayout ) Point aAdjPoint = aOffset; aAdjPoint.X() += aRectangle.Left() + (aRectangle.GetWidth() - nEmphasisWidth) / 2; if ( mpFontEntry->mnOrientation ) - ImplRotatePos( 0, 0, aAdjPoint.X(), aAdjPoint.Y(), mpFontEntry->mnOrientation ); + { + Point aOriginPt(0, 0); + aOriginPt.RotateAround( aAdjPoint.X(), aAdjPoint.Y(), mpFontEntry->mnOrientation ); + } aOutPoint += aAdjPoint; aOutPoint -= Point( nEmphasisWidth2, nEmphasisHeight2 ); ImplDrawEmphasisMark( rSalLayout.DrawBase().X(), diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx index cd43b519e595..546f36d3da71 100644 --- a/vcl/source/outdev/outdev.cxx +++ b/vcl/source/outdev/outdev.cxx @@ -401,59 +401,6 @@ bool OutputDevice::SupportsOperation( OutDevSupportType eType ) const return bHasSupport; } -// Helper private function - -void OutputDevice::ImplRotatePos( long nOriginX, long nOriginY, long& rX, long& rY, - short nOrientation ) const -{ - if ( (nOrientation >= 0) && !(nOrientation % 900) ) - { - if ( (nOrientation >= 3600) ) - nOrientation %= 3600; - - if ( nOrientation ) - { - rX -= nOriginX; - rY -= nOriginY; - - if ( nOrientation == 900 ) - { - long nTemp = rX; - rX = rY; - rY = -nTemp; - } - else if ( nOrientation == 1800 ) - { - rX = -rX; - rY = -rY; - } - else /* ( nOrientation == 2700 ) */ - { - long nTemp = rX; - rX = -rY; - rY = nTemp; - } - - rX += nOriginX; - rY += nOriginY; - } - } - else - { - double nRealOrientation = nOrientation*F_PI1800; - double nCos = cos( nRealOrientation ); - double nSin = sin( nRealOrientation ); - - // Translation... - long nX = rX-nOriginX; - long nY = rY-nOriginY; - - // Rotation... - rX = +((long)(nCos*nX + nSin*nY)) + nOriginX; - rY = -((long)(nSin*nX - nCos*nY)) + nOriginY; - } -} - // Frame public functions void OutputDevice::ImplGetFrameDev( const Point& rPt, const Point& rDevPt, const Size& rDevSize, diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index fe24597c120a..90cd4a4311b6 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -195,8 +195,10 @@ Rectangle OutputDevice::ImplGetTextBoundRect( const SalLayout& rSalLayout ) { long nX2 = nX+nWidth; long nY2 = nY+nHeight; - ImplRotatePos( nBaseX, nBaseY, nX, nY, mpFontEntry->mnOrientation ); - ImplRotatePos( nBaseX, nBaseY, nX2, nY2, mpFontEntry->mnOrientation ); + + Point aBasePt( nBaseX, nBaseY ); + aBasePt.RotateAround( nX, nY, mpFontEntry->mnOrientation ); + aBasePt.RotateAround( nX2, nY2, mpFontEntry->mnOrientation ); nWidth = nX2-nX; nHeight = nY2-nY; } diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx index ab29ed325bb8..a5887c803809 100644 --- a/vcl/source/outdev/textline.cxx +++ b/vcl/source/outdev/textline.cxx @@ -69,7 +69,10 @@ void OutputDevice::ImplDrawWavePixel( long nOriginX, long nOriginY, long nPixWidth, long nPixHeight ) { if ( nOrientation ) - ImplRotatePos( nOriginX, nOriginY, nCurX, nCurY, nOrientation ); + { + Point aPoint( nOriginX, nOriginY ); + aPoint.RotateAround( nCurX, nCurY, nOrientation ); + } if ( bDrawPixAsRect ) { @@ -104,8 +107,9 @@ void OutputDevice::ImplDrawWaveLine( long nBaseX, long nBaseY, long nEndY = nStartY; if ( nOrientation ) { - ImplRotatePos( nBaseX, nBaseY, nStartX, nStartY, nOrientation ); - ImplRotatePos( nBaseX, nBaseY, nEndX, nEndY, nOrientation ); + Point aOriginPt( nBaseX, nBaseY ); + aOriginPt.RotateAround( nStartX, nStartY, nOrientation ); + aOriginPt.RotateAround( nEndX, nEndY, nOrientation ); } mpGraphics->DrawLine( nStartX, nStartY, nEndX, nEndY, this ); } @@ -619,7 +623,10 @@ void OutputDevice::ImplDrawStrikeoutChar( long nBaseX, long nBaseY, const OUString aStrikeoutText(aChars, nStrikeStrLen); if( mpFontEntry->mnOrientation ) - ImplRotatePos( 0, 0, nDistX, nDistY, mpFontEntry->mnOrientation ); + { + Point aOriginPt(0, 0); + aOriginPt.RotateAround( nDistX, nDistY, mpFontEntry->mnOrientation ); + } nBaseX += nDistX; nBaseY += nDistY; @@ -1008,7 +1015,7 @@ void OutputDevice::DrawWaveLine( const Point& rStartPos, const Point& rEndPos ) double nO = atan2( -nEndY + nStartY, ((nDX == 0L) ? 0.000000001 : nDX) ); nO /= F_PI1800; nOrientation = (short)nO; - ImplRotatePos( nStartX, nStartY, nEndX, nEndY, -nOrientation ); + aStartPt.RotateAround( nEndX, nEndY, -nOrientation ); } long nWaveHeight; |