Kaydet (Commit) 06bde51c authored tarafından Chris Sherlock's avatar Chris Sherlock

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/12171Reviewed-by: 's avatarChris Sherlock <chris.sherlock79@gmail.com>
Tested-by: 's avatarChris Sherlock <chris.sherlock79@gmail.com>
üst 86725e38
......@@ -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 );
......
......@@ -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;
///@}
......
......@@ -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 \
......
/* -*- 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: */
......@@ -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(),
......
......@@ -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,
......
......@@ -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;
}
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment