[Libreoffice-commits] core.git: include/tools include/vcl tools/Library_tl.mk tools/source vcl/source

Chris Sherlock chris.sherlock79 at gmail.com
Sat Nov 1 15:18:24 PDT 2014


 include/tools/gen.hxx          |    5 ++
 include/vcl/outdev.hxx         |    4 --
 tools/Library_tl.mk            |    1 
 tools/source/generic/point.cxx |   79 +++++++++++++++++++++++++++++++++++++++++
 vcl/source/outdev/font.cxx     |   15 ++++++-
 vcl/source/outdev/outdev.cxx   |   53 ---------------------------
 vcl/source/outdev/text.cxx     |    6 ++-
 vcl/source/outdev/textline.cxx |   17 ++++++--
 8 files changed, 112 insertions(+), 68 deletions(-)

New commits:
commit 06bde51ced10e9d2997157b91c85d80100b0dafb
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Sat Nov 1 21:33:09 2014 +1100

    tools & vcl: move OutputDevice::ImplRotatePos() to Point::RotateAbout()
    
    OutputDevice has a private function that rotates a point around another
    point. However, there is no real reason why OutputDevice should be
    responsible for this - it's really the responsibility of the Point
    class in the tools module. Therefore, I've moved this functionality out
    of OutputDevice and into Point, but I've renamed it from the rather
    confusing name "ImplRotatePos" to "RotateAround", which is what it
    actually does.
    
    Change-Id: If12fb40a7b476653224d4edfc01887bc91a80c7d
    Reviewed-on: https://gerrit.libreoffice.org/12171
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
    Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/include/tools/gen.hxx b/include/tools/gen.hxx
index af046df..e8ad8fe 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 c17fd9e..0a775db 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 856471b..d399548 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 0000000..7feaef6
--- /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 b5cbb0e..7d142e04 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 cd43b51..546f36d 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 fe24597..90cd4a4 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 ab29ed3..a5887c8 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;


More information about the Libreoffice-commits mailing list