introduce Degree100 strong_int type

Change-Id: I78f837a1340be0ca5c49097f543a481b7b43a632
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108367
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/chart2/source/controller/dialogs/res_DataLabel.cxx b/chart2/source/controller/dialogs/res_DataLabel.cxx
index c8dee6c..7934e90 100644
--- a/chart2/source/controller/dialogs/res_DataLabel.cxx
+++ b/chart2/source/controller/dialogs/res_DataLabel.cxx
@@ -305,7 +305,7 @@

    if( m_xDC_Dial->IsVisible() )
    {
        sal_Int32 nDegrees = m_xDC_Dial->GetRotation();
        Degree100 nDegrees = m_xDC_Dial->GetRotation();
        rOutAttrs->Put(SdrAngleItem( SCHATTR_TEXT_DEGREES, nDegrees ) );
    }
}
@@ -355,11 +355,11 @@

    if( rInAttrs.GetItemState( SCHATTR_TEXT_DEGREES, true, &pPoolItem ) == SfxItemState::SET )
    {
        sal_Int32 nDegrees = static_cast< const SdrAngleItem * >( pPoolItem )->GetValue();
        Degree100 nDegrees = static_cast< const SdrAngleItem * >( pPoolItem )->GetValue();
        m_xDC_Dial->SetRotation( nDegrees );
    }
    else
        m_xDC_Dial->SetRotation( 0 );
        m_xDC_Dial->SetRotation( 0_deg100 );

    EnableControls();
}
diff --git a/chart2/source/controller/dialogs/tp_AxisLabel.cxx b/chart2/source/controller/dialogs/tp_AxisLabel.cxx
index afe9867..de02815 100644
--- a/chart2/source/controller/dialogs/tp_AxisLabel.cxx
+++ b/chart2/source/controller/dialogs/tp_AxisLabel.cxx
@@ -93,7 +93,7 @@

    if( m_xCtrlDial->HasRotation() )
    {
        sal_Int32 nDegrees = bStacked ? 0 : m_xCtrlDial->GetRotation();
        Degree100 nDegrees = bStacked ? 0_deg100 : m_xCtrlDial->GetRotation();
        if( !m_bHasInitialDegrees || (nDegrees != m_nInitialDegrees) )
            rOutAttrs->Put( SdrAngleItem( SCHATTR_TEXT_DEGREES, nDegrees ) );
    }
@@ -155,7 +155,7 @@
    // Rotation as orient item or in degrees ----------

    // check new degree item
    m_nInitialDegrees = 0;
    m_nInitialDegrees = 0_deg100;
    aState = rInAttrs->GetItemState( SCHATTR_TEXT_DEGREES, false, &pPoolItem );
    if( aState == SfxItemState::SET )
        m_nInitialDegrees = static_cast< const SdrAngleItem * >( pPoolItem )->GetValue();
diff --git a/chart2/source/controller/dialogs/tp_AxisLabel.hxx b/chart2/source/controller/dialogs/tp_AxisLabel.hxx
index 370eda7..0923c91 100644
--- a/chart2/source/controller/dialogs/tp_AxisLabel.hxx
+++ b/chart2/source/controller/dialogs/tp_AxisLabel.hxx
@@ -20,6 +20,7 @@

#include <sfx2/tabdlg.hxx>
#include <svx/dialcontrol.hxx>
#include <tools/degree.hxx>

namespace chart { class TextDirectionListBox; }
namespace weld {
@@ -39,7 +40,7 @@
private:
    bool                m_bShowStaggeringControls;

    sal_Int32           m_nInitialDegrees;
    Degree100           m_nInitialDegrees;
    bool                m_bHasInitialDegrees;       /// false = DialControl in tristate
    bool                m_bInitialStacking;
    bool                m_bHasInitialStacking;      /// false = checkbox in tristate
diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.cxx b/chart2/source/controller/dialogs/tp_PolarOptions.cxx
index 865736b..59422b3 100644
--- a/chart2/source/controller/dialogs/tp_PolarOptions.cxx
+++ b/chart2/source/controller/dialogs/tp_PolarOptions.cxx
@@ -74,7 +74,7 @@

    if (rInAttrs->GetItemState(SCHATTR_STARTING_ANGLE, true, &pPoolItem) == SfxItemState::SET)
    {
        sal_Int32 nTmp = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        Degree100 nTmp = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        m_xAngleDial->SetRotation( nTmp );
    }
    else
diff --git a/chart2/source/controller/dialogs/tp_TitleRotation.cxx b/chart2/source/controller/dialogs/tp_TitleRotation.cxx
index d2e1e02..ede27ed 100644
--- a/chart2/source/controller/dialogs/tp_TitleRotation.cxx
+++ b/chart2/source/controller/dialogs/tp_TitleRotation.cxx
@@ -94,7 +94,7 @@
    bool bStacked = m_xCbStacked->get_active();
    rOutAttrs->Put( SfxBoolItem( SCHATTR_TEXT_STACKED, bStacked ) );

    sal_Int32 nDegrees = bStacked ? 0 : m_xCtrlDial->GetRotation();
    Degree100 nDegrees = bStacked ? 0_deg100 : m_xCtrlDial->GetRotation();
    rOutAttrs->Put( SdrAngleItem( SCHATTR_TEXT_DEGREES, nDegrees ) );

    SvxFrameDirection aDirection( m_xLbTextDirection->get_active_id() );
@@ -107,7 +107,7 @@
{
    const SfxPoolItem* pItem = GetItem( *rInAttrs, SCHATTR_TEXT_DEGREES );

    sal_Int32 nDegrees = pItem ? static_cast<const SdrAngleItem*>(pItem)->GetValue() : 0;
    Degree100 nDegrees = pItem ? static_cast<const SdrAngleItem*>(pItem)->GetValue() : 0_deg100;
    m_xCtrlDial->SetRotation( nDegrees );

    pItem = GetItem( *rInAttrs, SCHATTR_TEXT_STACKED );
diff --git a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
index 7c31c96..297b3de 100644
--- a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
@@ -392,8 +392,8 @@

            if( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fVal )
            {
                rOutItemSet.Put( SdrAngleItem( nWhichId, static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fVal * 100.0 ) ) ));
                rOutItemSet.Put( SdrAngleItem( nWhichId, Degree100(static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fVal * 100.0 )) ) ));
            }
        }
        break;
@@ -881,7 +881,7 @@
            // convert int to double (divided by 100)
            double fVal = static_cast< double >(
                static_cast< const SdrAngleItem & >(
                    rItemSet.Get( nWhichId )).GetValue()) / 100.0;
                    rItemSet.Get( nWhichId )).GetValue().get()) / 100.0;
            double fOldVal = 0.0;
            bool bPropExisted =
                ( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fOldVal );
diff --git a/chart2/source/controller/itemsetwrapper/DataPointItemConverter.cxx b/chart2/source/controller/itemsetwrapper/DataPointItemConverter.cxx
index 97f66d4..7693c6c 100644
--- a/chart2/source/controller/itemsetwrapper/DataPointItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/DataPointItemConverter.cxx
@@ -550,7 +550,7 @@
        {
            double fValue = static_cast< double >(
                static_cast< const SdrAngleItem & >(
                    rItemSet.Get( nWhichId )).GetValue()) / 100.0;
                    rItemSet.Get( nWhichId )).GetValue().get()) / 100.0;
            double fOldValue = 0.0;
            bool bPropExisted =
                ( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fOldValue );
@@ -800,8 +800,8 @@

            if( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fValue )
            {
                rOutItemSet.Put( SdrAngleItem( nWhichId, static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fValue * 100.0 ) ) ));
                rOutItemSet.Put( SdrAngleItem( nWhichId, Degree100(static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fValue * 100.0 ) ) )));
            }
        }
        break;
diff --git a/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx b/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx
index 3c8fbcc..fc25407 100644
--- a/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx
@@ -277,7 +277,7 @@
         {
            if( m_bSupportingStartingAngle )
            {
                m_nStartingAngle = static_cast< const SdrAngleItem & >( rItemSet.Get( nWhichId )).GetValue() / 100;
                m_nStartingAngle = static_cast< const SdrAngleItem & >( rItemSet.Get( nWhichId )).GetValue().get() / 100;
                uno::Reference< beans::XPropertySet > xDiagramProperties( ChartModelHelper::findDiagram(m_xChartModel), uno::UNO_QUERY );
                if( xDiagramProperties.is() )
                {
@@ -399,7 +399,7 @@
        case SCHATTR_STARTING_ANGLE:
        {
            if( m_bSupportingStartingAngle )
                rOutItemSet.Put( SdrAngleItem(nWhichId,m_nStartingAngle*100));
                rOutItemSet.Put( SdrAngleItem(nWhichId, Degree100(m_nStartingAngle*100)) );
            break;
        }
        case SCHATTR_CLOCKWISE:
diff --git a/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx b/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
index dad6ba3..adc0b84 100644
--- a/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
@@ -489,7 +489,7 @@
        {
            double fValue = static_cast<double>(
                static_cast<const SdrAngleItem&>(
                    rItemSet.Get(nWhichId)).GetValue()) / 100.0;
                    rItemSet.Get(nWhichId)).GetValue().get()) / 100.0;
            double fOldValue = 0.0;
            bool bPropExisted =
                (GetPropertySet()->getPropertyValue("TextRotation") >>= fOldValue);
@@ -705,7 +705,7 @@
            if (GetPropertySet()->getPropertyValue("TextRotation") >>= fValue)
            {
                rOutItemSet.Put(
                    SdrAngleItem(nWhichId, static_cast<sal_Int32>(rtl::math::round(fValue * 100.0))));
                    SdrAngleItem(nWhichId, Degree100(static_cast<sal_Int32>(rtl::math::round(fValue * 100.0)))));
            }
        }
        break;
diff --git a/chart2/source/controller/itemsetwrapper/TitleItemConverter.cxx b/chart2/source/controller/itemsetwrapper/TitleItemConverter.cxx
index 6ca3878..9109bc3 100644
--- a/chart2/source/controller/itemsetwrapper/TitleItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/TitleItemConverter.cxx
@@ -169,7 +169,7 @@
            // convert int to double (divided by 100)
            double fVal = static_cast< double >(
                static_cast< const SdrAngleItem & >(
                    rItemSet.Get( nWhichId )).GetValue()) / 100.0;
                    rItemSet.Get( nWhichId )).GetValue().get()) / 100.0;
            double fOldVal = 0.0;
            bool bPropExisted =
                ( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fOldVal );
@@ -198,8 +198,8 @@

            if( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fVal )
            {
                rOutItemSet.Put( SdrAngleItem( nWhichId, static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fVal * 100.0 ) ) ));
                rOutItemSet.Put( SdrAngleItem( nWhichId, Degree100(static_cast< sal_Int32 >(
                                                   ::rtl::math::round( fVal * 100.0 ) ) )));
            }
        }
        break;
diff --git a/chart2/source/controller/main/DrawCommandDispatch.cxx b/chart2/source/controller/main/DrawCommandDispatch.cxx
index 53ed1cf..ef0bdfd 100644
--- a/chart2/source/controller/main/DrawCommandDispatch.cxx
+++ b/chart2/source/controller/main/DrawCommandDispatch.cxx
@@ -142,7 +142,7 @@
                                    EE_ITEMS_START, EE_ITEMS_END>{});
                            aDest.Set( rSource );
                            pObj->SetMergedItemSet( aDest );
                            sal_Int32 nAngle = pSourceObj->GetRotateAngle();
                            Degree100 nAngle = pSourceObj->GetRotateAngle();
                            if ( nAngle )
                                pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle );
                            bAttributesAppliedFromGallery = true;
diff --git a/chart2/source/view/main/ChartItemPool.cxx b/chart2/source/view/main/ChartItemPool.cxx
index 4df7e26..6af1c34 100644
--- a/chart2/source/view/main/ChartItemPool.cxx
+++ b/chart2/source/view/main/ChartItemPool.cxx
@@ -63,7 +63,7 @@
    rPoolDefaults[SCHATTR_LEGEND_NO_OVERLAY        - SCHATTR_START] = new SfxBoolItem(SCHATTR_LEGEND_NO_OVERLAY, true);

    //text
    rPoolDefaults[SCHATTR_TEXT_DEGREES             - SCHATTR_START] = new SdrAngleItem(SCHATTR_TEXT_DEGREES, 0);
    rPoolDefaults[SCHATTR_TEXT_DEGREES             - SCHATTR_START] = new SdrAngleItem(SCHATTR_TEXT_DEGREES, 0_deg100);
    rPoolDefaults[SCHATTR_TEXT_STACKED             - SCHATTR_START] = new SfxBoolItem(SCHATTR_TEXT_STACKED,false);

    //statistic
@@ -142,7 +142,7 @@
    rPoolDefaults[SCHATTR_SPLINE_ORDER         - SCHATTR_START] = new SfxInt32Item( SCHATTR_SPLINE_ORDER, 3 );
    rPoolDefaults[SCHATTR_SPLINE_RESOLUTION    - SCHATTR_START] = new SfxInt32Item( SCHATTR_SPLINE_RESOLUTION, 20 );
    rPoolDefaults[SCHATTR_GROUP_BARS_PER_AXIS  - SCHATTR_START] = new SfxBoolItem(SCHATTR_GROUP_BARS_PER_AXIS, false);
    rPoolDefaults[SCHATTR_STARTING_ANGLE       - SCHATTR_START] = new SdrAngleItem( SCHATTR_STARTING_ANGLE, 9000 );
    rPoolDefaults[SCHATTR_STARTING_ANGLE       - SCHATTR_START] = new SdrAngleItem( SCHATTR_STARTING_ANGLE, 9000_deg100 );
    rPoolDefaults[SCHATTR_CLOCKWISE            - SCHATTR_START] = new SfxBoolItem( SCHATTR_CLOCKWISE, false );

    rPoolDefaults[SCHATTR_MISSING_VALUE_TREATMENT    - SCHATTR_START] = new SfxInt32Item(SCHATTR_MISSING_VALUE_TREATMENT, 0);
diff --git a/cui/source/tabpages/transfrm.cxx b/cui/source/tabpages/transfrm.cxx
index 142bd46..de757f6 100644
--- a/cui/source/tabpages/transfrm.cxx
+++ b/cui/source/tabpages/transfrm.cxx
@@ -22,6 +22,7 @@
#include <algorithm>

#include <svx/EnhancedCustomShape2d.hxx>
#include <svx/sdangitm.hxx>
#include <svx/svdundo.hxx>
#include <svx/svdview.hxx>
#include <svx/svdobj.hxx>
@@ -295,7 +296,7 @@
    }
    else
    {
        m_xCtlAngle->SetRotation(0);
        m_xCtlAngle->SetRotation(0_deg100);
    }
    m_xCtlAngle->SaveValue();
    m_xMtrPosX->save_value();
@@ -461,7 +462,7 @@
    if (m_xMtrAngle->get_value_changed_from_saved())
    {
        sal_Int32 nValue = static_cast<sal_Int32>(m_xMtrAngle->get_value(FieldUnit::NONE));
        rAttrs->Put( SdrAngleItem( SID_ATTR_TRANSFORM_SHEAR, nValue ) );
        rAttrs->Put( SdrAngleItem( SID_ATTR_TRANSFORM_SHEAR, Degree100(nValue) ) );
        bModified = true;
    }

@@ -606,7 +607,7 @@

        if( pItem )
        {
            m_xMtrAngle->set_value(static_cast<const SdrAngleItem*>(pItem)->GetValue(), FieldUnit::NONE);
            m_xMtrAngle->set_value(static_cast<const SdrAngleItem*>(pItem)->GetValue().get(), FieldUnit::NONE);
        }
        else
        {
diff --git a/filter/source/msfilter/escherex.cxx b/filter/source/msfilter/escherex.cxx
index 505e43d..bde7126 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -2102,12 +2102,12 @@
}


static void lcl_Rotate(sal_Int32 nAngle, Point center, Point& pt)
static void lcl_Rotate(Degree100 nAngle, Point center, Point& pt)
{
    nAngle = NormAngle36000(nAngle);

    int cs, sn;
    switch (nAngle)
    switch (nAngle.get())
    {
    case 0:
        cs =1;
@@ -2149,8 +2149,8 @@
    if ( nAngle )
    {
        Point center((aEnd.X()+aStart.X())>>1,(aEnd.Y()+aStart.Y())>>1);
        lcl_Rotate(-nAngle, center,p1);
        lcl_Rotate(-nAngle, center,p2);
        lcl_Rotate(Degree100(-nAngle), center,p1);
        lcl_Rotate(Degree100(-nAngle), center,p2);
    }
    if (  p1.X() > p2.X() )
    {
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 4425096..bddc9c2 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -383,12 +383,12 @@
}


sal_Int32 DffPropertyReader::Fix16ToAngle( sal_Int32 nContent )
Degree100 DffPropertyReader::Fix16ToAngle( sal_Int32 nContent )
{
    sal_Int32 nAngle = 0;
    Degree100 nAngle(0);
    if ( nContent )
    {
        nAngle = ( static_cast<sal_Int16>( nContent >> 16) * 100L ) + ( ( ( nContent & 0x0000ffff) * 100L ) >> 16 );
        nAngle = Degree100(( static_cast<sal_Int16>( nContent >> 16) * 100L ) + ( ( ( nContent & 0x0000ffff) * 100L ) >> 16 ));
        nAngle = NormAngle36000( -nAngle );
    }
    return nAngle;
@@ -1150,7 +1150,7 @@
    rIn.Seek( nPos );
}

static void ApplyRectangularGradientAsBitmap( const SvxMSDffManager& rManager, SvStream& rIn, SfxItemSet& rSet, const std::vector< ShadeColor >& rShadeColors, const DffObjData& rObjData, sal_Int32 nFix16Angle )
static void ApplyRectangularGradientAsBitmap( const SvxMSDffManager& rManager, SvStream& rIn, SfxItemSet& rSet, const std::vector< ShadeColor >& rShadeColors, const DffObjData& rObjData, Degree100 nFix16Angle )
{
    Size aBitmapSizePixel( static_cast< sal_Int32 >( ( rObjData.aBoundRect.GetWidth() / 2540.0 ) * 90.0 ),      // we will create a bitmap with 90 dpi
                           static_cast< sal_Int32 >( ( rObjData.aBoundRect.GetHeight() / 2540.0 ) * 90.0 ) );
@@ -1293,7 +1293,7 @@
        if ( bRotateWithShape )
        {
            // convert from 100th to 10th degrees
            aBitmapEx.Rotate( Degree10(nFix16Angle * 10), rShadeColors[ 0 ].aColor );
            aBitmapEx.Rotate( toDegree10(nFix16Angle), rShadeColors[ 0 ].aColor );

            BmpMirrorFlags nMirrorFlags = BmpMirrorFlags::NONE;
            if ( rObjData.nSpFlags & ShapeFlag::FlipV )
@@ -2770,7 +2770,7 @@
        *pAny >>= fExtraTextRotateAngle;

    if ( rManager.mnFix16Angle )
        fExtraTextRotateAngle += mnFix16Angle / 100.0;
        fExtraTextRotateAngle += mnFix16Angle.get() / 100.0;
    if ( rObjData.nSpFlags & ShapeFlag::FlipV )
        fExtraTextRotateAngle -= 180.0;

@@ -2788,15 +2788,15 @@
    //support this prop. So need some swap for the two color to keep fidelity with AOO and MS shape.
    //So below var is defined.
    sal_Int32 nChgColors = 0;
    sal_Int32 nAngle = GetPropertyValue( DFF_Prop_fillAngle, 0 );
    if(nAngle >= 0)
    sal_Int32 nAngleFix16 = GetPropertyValue( DFF_Prop_fillAngle, 0 );
    if(nAngleFix16 >= 0)
        nChgColors ^= 1;

    //Translate a MS clockwise(+) or count clockwise angle(-) into an AOO count clock wise angle
    nAngle=3600 - ( ( Fix16ToAngle(nAngle) + 5 ) / 10 );
    Degree10 nAngle( 3600 - ( ( Fix16ToAngle(nAngleFix16).get() + 5 ) / 10 ) );
    //Make sure this angle belongs to 0~3600
    while ( nAngle >= 3600 ) nAngle -= 3600;
    while ( nAngle < 0 ) nAngle += 3600;
    while ( nAngle >= Degree10(3600) ) nAngle -= Degree10(3600);
    while ( nAngle < Degree10(0) ) nAngle += Degree10(3600);

    //Rotate angle
    if ( mbRotateGranientFillWithAngle )
@@ -2807,10 +2807,10 @@
        nRotateAngle = ( nRotateAngle + 5 ) / 10 ;//round up
        //nAngle is a clockwise angle. If nRotateAngle is a clockwise angle, then gradient needs to be rotated a little less
        //or it needs to be rotated a little more
        nAngle -=  nRotateAngle;
        nAngle -=  Degree10(nRotateAngle);
    }
    while ( nAngle >= 3600 ) nAngle -= 3600;
    while ( nAngle < 0 ) nAngle += 3600;
    while ( nAngle >= Degree10(3600) ) nAngle -= Degree10(3600);
    while ( nAngle < Degree10(0) ) nAngle += Degree10(3600);

    css::awt::GradientStyle eGrad = css::awt::GradientStyle_LINEAR;

@@ -2870,7 +2870,7 @@
    }

    //Construct gradient item
    XGradient aGrad( aCol2, aCol1, eGrad, Degree10(nAngle), nFocusX, nFocusY );
    XGradient aGrad( aCol2, aCol1, eGrad, nAngle, nFocusX, nFocusY );
    //Intensity has been merged into color. So here just set is as 100
    aGrad.SetStartIntens( 100 );
    aGrad.SetEndIntens( 100 );
@@ -2883,7 +2883,7 @@
        aCol1 = Color(nStartCol, nStartCol, nStartCol);
        aCol2 = Color(nEndCol, nEndCol, nEndCol);

        XGradient aGrad2( aCol2 ,  aCol1 , eGrad, Degree10(nAngle), nFocusX, nFocusY );
        XGradient aGrad2( aCol2 ,  aCol1 , eGrad, nAngle, nFocusX, nFocusY );
        aSet.Put( XFillFloatTransparenceItem( OUString(), aGrad2 ) );
    }
}
@@ -4054,13 +4054,13 @@
    bool bOk = ReadDffRecordHeader(rSt, aRecHd);
    if (bOk && aRecHd.nRecType == DFF_msofbtSpContainer)
    {
        mnFix16Angle = 0;
        mnFix16Angle = 0_deg100;
        if (!aRecHd.SeekToBegOfRecord(rSt))
            return pRet;
        pRet = ImportObj( rSt, rClientData, rClientRect, rGlobalChildRect, nCalledByGroup + 1, pShapeId );
        if ( pRet )
        {
            sal_Int32 nGroupRotateAngle = 0;
            Degree100 nGroupRotateAngle(0);
            ShapeFlag nSpFlags = nGroupShapeFlags;
            nGroupRotateAngle = mnFix16Angle;

@@ -4072,8 +4072,8 @@
            else
                aGlobalChildRect = rGlobalChildRect;

            if ( ( nGroupRotateAngle > 4500 && nGroupRotateAngle <= 13500 )
                || ( nGroupRotateAngle > 22500 && nGroupRotateAngle <= 31500 ) )
            if ( ( nGroupRotateAngle > 4500_deg100 && nGroupRotateAngle <= 13500_deg100 )
                || ( nGroupRotateAngle > 22500_deg100 && nGroupRotateAngle <= 31500_deg100 ) )
            {
                sal_Int32 nHalfWidth = ( aClientRect.GetWidth() + 1 ) >> 1;
                sal_Int32 nHalfHeight = ( aClientRect.GetHeight() + 1 ) >> 1;
@@ -4237,7 +4237,7 @@
    else
    {
        InitializePropSet( DFF_msofbtOPT ); // get the default PropSet
        static_cast<DffPropertyReader*>(this)->mnFix16Angle = 0;
        static_cast<DffPropertyReader*>(this)->mnFix16Angle = 0_deg100;
    }

    aObjData.bOpt2 = maShapeRecords.SeekToContent( rSt, DFF_msofbtUDefProp, SEEK_FROM_CURRENT_AND_RESTART );
@@ -4287,8 +4287,8 @@
    {   // apply rotation to the BoundingBox BEFORE an object has been generated
        if( mnFix16Angle )
        {
            tools::Long nAngle = mnFix16Angle;
            if ( ( nAngle > 4500 && nAngle <= 13500 ) || ( nAngle > 22500 && nAngle <= 31500 ) )
            Degree100 nAngle = mnFix16Angle;
            if ( ( nAngle > 4500_deg100 && nAngle <= 13500_deg100 ) || ( nAngle > 22500_deg100 && nAngle <= 31500_deg100 ) )
            {
                sal_Int32 nHalfWidth = ( aObjData.aBoundRect.GetWidth() + 1 ) >> 1;
                sal_Int32 nHalfHeight = ( aObjData.aBoundRect.GetHeight() + 1 ) >> 1;
@@ -4320,7 +4320,7 @@
            SfxItemSet  aSet( pSdrModel->GetItemPool() );

            bool    bIsConnector = ( ( aObjData.eShapeType >= mso_sptStraightConnector1 ) && ( aObjData.eShapeType <= mso_sptCurvedConnector5 ) );
            sal_Int32   nObjectRotation = mnFix16Angle;
            Degree100   nObjectRotation = mnFix16Angle;
            ShapeFlag   nSpFlags = aObjData.nSpFlags;

            if ( bGraphic )
@@ -4679,12 +4679,12 @@
                        // sj: taking care of the different rotation points, since the new arc is having a bigger snaprect
                        if ( mnFix16Angle )
                        {
                            sal_Int32 nAngle = mnFix16Angle;
                            Degree100 nAngle = mnFix16Angle;
                            if ( nSpFlags & ShapeFlag::FlipH )
                                nAngle = 36000 - nAngle;
                                nAngle = 36000_deg100 - nAngle;
                            if ( nSpFlags & ShapeFlag::FlipV )
                                nAngle = -nAngle;
                            double a = nAngle * F_PI18000;
                            double a = nAngle.get() * F_PI18000;
                            double ss = sin( a );
                            double cc = cos( a );
                            Point aP1( aOldBoundRect.TopLeft() );
@@ -4759,7 +4759,7 @@
                        // pay attention to the rotations
                        if ( nObjectRotation )
                        {
                            double a = nObjectRotation * F_PI18000;
                            double a = nObjectRotation.get() * F_PI18000;
                            Point aCenter( aObjData.aBoundRect.Center() );
                            double ss = sin(a);
                            double cc = cos(a);
@@ -4768,7 +4768,7 @@
                            RotatePoint(aPoint2, aCenter, ss, cc);

                            // #i120437# reset rotation, it is part of the path and shall not be applied again
                            nObjectRotation = 0;
                            nObjectRotation = 0_deg100;
                        }

                        // rotate/mirror line within the area as we need it
@@ -5220,7 +5220,7 @@
            ScaleEmu( nTextTop );
            ScaleEmu( nTextBottom );

            sal_Int32 nTextRotationAngle=0;
            Degree100 nTextRotationAngle(0);
            bool bVerticalText = false;
            if ( IsProperty( DFF_Prop_txflTextFlow ) )
            {
@@ -5228,18 +5228,18 @@
                switch( eTextFlow )
                {
                    case mso_txflBtoT:
                        nTextRotationAngle = 9000;
                        nTextRotationAngle = 9000_deg100;
                    break;
                    case mso_txflVertN:
                    case mso_txflTtoBN:
                        nTextRotationAngle = 27000;
                        nTextRotationAngle = 27000_deg100;
                        break;
                    case mso_txflTtoBA:
                        bVerticalText = true;
                    break;
                    case mso_txflHorzA:
                        bVerticalText = true;
                        nTextRotationAngle = 9000;
                        nTextRotationAngle = 9000_deg100;
                    break;
                    case mso_txflHorzN:
                    default :
@@ -5249,7 +5249,7 @@

            if (nTextRotationAngle)
            {
                switch (nTextRotationAngle)
                switch (nTextRotationAngle.get())
                {
                    case 9000:
                        {
@@ -5436,7 +5436,7 @@
            // rotate text with shape?
            if ( mnFix16Angle )
            {
                double a = mnFix16Angle * F_PI18000;
                double a = mnFix16Angle.get() * F_PI18000;
                pTextObj->NbcRotate( rObjData.aBoundRect.Center(), mnFix16Angle,
                    sin( a ), cos( a ) );
            }
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index 545afd6..7da1450 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -814,14 +814,14 @@
                bool bVerticalText = false;
                // and if the text object is not empty, it must be applied to pRet, the object we
                // initially got from our escher import
                sal_Int32 nTextRotationAngle = 0;
                Degree100 nTextRotationAngle(0);
                if ( IsProperty( DFF_Prop_txflTextFlow ) )
                {
                    auto eTextFlow = GetPropertyValue(DFF_Prop_txflTextFlow, 0) & 0xFFFF;
                    switch( eTextFlow )
                    {
                        case mso_txflBtoT :                     // Bottom to Top non-@
                            nTextRotationAngle += 9000;
                            nTextRotationAngle += 9000_deg100;
                        break;
                        case mso_txflTtoBA :    /* #68110# */   // Top to Bottom @-font
                        case mso_txflTtoBN :                    // Top to Bottom non-@
@@ -840,7 +840,7 @@
                }
                const bool bFail = o3tl::checked_multiply<sal_Int32>(nFontDirection, 9000, nFontDirection);
                if (!bFail)
                    nTextRotationAngle -= nFontDirection;
                    nTextRotationAngle -= Degree100(nFontDirection);
                else
                    SAL_WARN("filter.ms", "Parsing error: bad fontdirection: " << nFontDirection);
                aTextObj.SetVertical( bVerticalText );
@@ -1174,7 +1174,7 @@
                        }
                    }
                    // rotate text with shape?
                    sal_Int32 nAngle = ( rObjData.nSpFlags & ShapeFlag::FlipV ) ? -mnFix16Angle : mnFix16Angle; // #72116# vertical flip -> rotate by using the other way
                    Degree100 nAngle = ( rObjData.nSpFlags & ShapeFlag::FlipV ) ? -mnFix16Angle : mnFix16Angle; // #72116# vertical flip -> rotate by using the other way
                    nAngle += nTextRotationAngle;

                    if ( dynamic_cast< const SdrObjCustomShape* >(pTObj) ==  nullptr )
@@ -1182,10 +1182,10 @@
                        if ( rObjData.nSpFlags & ShapeFlag::FlipV )
                        {
                            double a = 18000 * F_PI18000;
                            pTObj->Rotate( rTextRect.Center(), 18000, sin( a ), cos( a ) );
                            pTObj->Rotate( rTextRect.Center(), 18000_deg100, sin( a ), cos( a ) );
                        }
                        if ( rObjData.nSpFlags & ShapeFlag::FlipH )
                            nAngle = 36000 - nAngle;
                            nAngle = 36000_deg100 - nAngle;
                        if ( nAngle )
                            pTObj->NbcRotate( rObjData.aBoundRect.Center(), nAngle );
                    }
diff --git a/include/filter/msfilter/msdffimp.hxx b/include/filter/msfilter/msdffimp.hxx
index 3561d4a..d3c6657 100644
--- a/include/filter/msfilter/msdffimp.hxx
+++ b/include/filter/msfilter/msdffimp.hxx
@@ -40,6 +40,7 @@
#include <sal/types.h>
#include <svx/msdffdef.hxx>
#include <vcl/errcode.hxx>
#include <tools/degree.hxx>
#include <tools/gen.hxx>
#include <tools/ref.hxx>
#include <tools/solar.h>
@@ -93,7 +94,7 @@
    void ApplyFillAttributes( SvStream& rIn, SfxItemSet& rSet, const DffObjData& rObjData ) const;

public:
    sal_Int32 mnFix16Angle;
    Degree100 mnFix16Angle;
    bool      mbRotateGranientFillWithAngle;

    explicit DffPropertyReader( const SvxMSDffManager& rManager );
@@ -102,7 +103,7 @@
    DffPropertyReader& operator=( DffPropertyReader const & ) = delete; // MSVC2015 workaround
    DffPropertyReader( DffPropertyReader const & ) = delete; // MSVC2015 workaround

    static sal_Int32 Fix16ToAngle( sal_Int32 nAngle );
    static Degree100 Fix16ToAngle( sal_Int32 nAngle );

#ifdef DBG_CUSTOMSHAPE
    void ReadPropSet( SvStream& rIn, SvxMSDffClientData* pClientData, sal_uInt32 nShapeType = 0 ) const;
diff --git a/include/o3tl/strong_int.hxx b/include/o3tl/strong_int.hxx
index 3db9582..8210795 100644
--- a/include/o3tl/strong_int.hxx
+++ b/include/o3tl/strong_int.hxx
@@ -113,10 +113,16 @@
    strong_int& operator+=(strong_int const & other) { m_value += other.m_value; return *this; }
    strong_int& operator-=(strong_int const & other) { m_value -= other.m_value; return *this; }
    strong_int& operator%=(strong_int const & other) { m_value %= other.m_value; return *this; }
    strong_int& operator*=(strong_int const & other) { m_value *= other.m_value; return *this; }
    strong_int& operator/=(strong_int const & other) { m_value /= other.m_value; return *this; }
    [[nodiscard]]
    strong_int operator%(strong_int const & other) const { return strong_int(m_value % other.m_value); }
    [[nodiscard]]
    strong_int operator-() const { return strong_int(-m_value); }
    [[nodiscard]]
    strong_int operator*(strong_int const & other) const { return strong_int(m_value * other.m_value); }
    [[nodiscard]]
    strong_int operator/(strong_int const & other) const { return strong_int(m_value / other.m_value); }

    bool anyOf(strong_int v) const {
      return *this == v;
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 022a0df..2cd17e6 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -111,9 +111,9 @@

// Our rotation is counter-clockwise and is in 100ths of a degree.
// drawingML rotation is clockwise and is in 60000ths of a degree.
template <typename T> T ExportRotateClockwisify(T input)
inline sal_Int32 ExportRotateClockwisify(Degree100 input)
{
    return ((21600000 - input * 600) % 21600000);
    return ((21600000 - input.get() * 600) % 21600000);
}

/// Interface to be implemented by the parent exporter that knows how to handle shape text.
diff --git a/include/oox/vml/vmlformatting.hxx b/include/oox/vml/vmlformatting.hxx
index 3d6cdc5..4bdabbf 100644
--- a/include/oox/vml/vmlformatting.hxx
+++ b/include/oox/vml/vmlformatting.hxx
@@ -32,6 +32,7 @@
#include <oox/helper/helper.hxx>
#include <rtl/ustring.hxx>
#include <sal/types.h>
#include <tools/degree.hxx>

namespace com::sun::star {
    namespace awt { struct Point; }
@@ -87,7 +88,7 @@
            point value will be returned unmodified. If the 'fd' suffix is
            present, the value will be divided by 65536.
    */
    OOX_DLLPUBLIC sal_Int32    decodeRotation( const OUString& rValue );
    OOX_DLLPUBLIC Degree100 decodeRotation( const OUString& rValue );

    /** Converts the passed VML measure string to EMU (English Metric Units).

diff --git a/include/svx/EnhancedCustomShape2d.hxx b/include/svx/EnhancedCustomShape2d.hxx
index 8976b2b..67b0d06 100644
--- a/include/svx/EnhancedCustomShape2d.hxx
+++ b/include/svx/EnhancedCustomShape2d.hxx
@@ -22,6 +22,7 @@

#include <svx/msdffdef.hxx>
#include <svx/sdasitm.hxx>
#include <tools/degree.hxx>
#include <com/sun/star/awt/Size.hpp>
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/beans/PropertyValues.hpp>
@@ -122,7 +123,7 @@

        bool                    bFlipH;
        bool                    bFlipV;
        sal_Int32               nRotateAngle;
        Degree100               nRotateAngle;

        SAL_DLLPRIVATE bool     SetAdjustValueAsDouble( const double& rValue, const sal_Int32 nIndex );
        SAL_DLLPRIVATE sal_Int32 GetLuminanceChange( sal_uInt32 nIndex ) const;
@@ -183,7 +184,7 @@

        SAL_DLLPRIVATE bool     IsFlipVert() const { return bFlipV; };
        SAL_DLLPRIVATE bool     IsFlipHorz() const { return bFlipH; };
        SAL_DLLPRIVATE sal_Int32 GetRotateAngle() const { return nRotateAngle; };
        SAL_DLLPRIVATE Degree100 GetRotateAngle() const { return nRotateAngle; };

        SdrObject*              CreateLineGeometry();
        SdrObject*              CreateObject( bool bLineGeometryNeededOnly );
diff --git a/include/svx/algitem.hxx b/include/svx/algitem.hxx
index cb37a21..c778735 100644
--- a/include/svx/algitem.hxx
+++ b/include/svx/algitem.hxx
@@ -25,6 +25,7 @@
#include <svl/poolitem.hxx>
#include <svl/eitem.hxx>
#include <svx/svxdllapi.h>
#include <tools/degree.hxx>

class IntlWrapper;
class SfxItemPool;
@@ -37,7 +38,7 @@
        const sal_uInt16 nId );

    SvxOrientationItem(
        sal_Int32 nRotation, bool bStacked,
        Degree100 nRotation, bool bStacked,
        const sal_uInt16 nId );

    virtual bool GetPresentation( SfxItemPresentation ePres,
@@ -55,7 +56,7 @@
    /** Returns sal_True, if the item represents STACKED state. */
    bool                    IsStacked() const;
    /** Returns the rotation this item represents (returns nStdAngle for STANDARD and STACKED state). */
    sal_Int32               GetRotation( sal_Int32 nStdAngle ) const;
    Degree100               GetRotation( Degree100 nStdAngle ) const;
};

class SAL_WARN_UNUSED SVX_DLLPUBLIC SvxMarginItem final : public SfxPoolItem
diff --git a/include/svx/dialcontrol.hxx b/include/svx/dialcontrol.hxx
index 3c5435b..75d7d7f 100644
--- a/include/svx/dialcontrol.hxx
+++ b/include/svx/dialcontrol.hxx
@@ -24,6 +24,7 @@
#include <vcl/customweld.hxx>
#include <vcl/virdev.hxx>
#include <svx/svxdllapi.h>
#include <svx/svdtrans.hxx>

class Edit;

@@ -40,7 +41,7 @@
    void                CopyBackground( const DialControlBmp& rSrc );
    void                DrawBackground( const Size& rSize, bool bEnabled );
    void                DrawBackground();
    void                DrawElements( const OUString& rText, sal_Int32 nAngle );
    void                DrawElements( const OUString& rText, Degree100 nAngle );
    Color               GetBackgroundColor() const override;

private:
@@ -90,9 +91,9 @@
    virtual void        Resize() override;

    /** Returns the current rotation angle in 1/100 degrees. */
    sal_Int32           GetRotation() const;
    Degree100           GetRotation() const;
    /** Sets the rotation to the passed value (in 1/100 degrees). */
    void                SetRotation( sal_Int32 nAngle );
    void                SetRotation( Degree100 nAngle );
    /** Returns true, if the control is not in "don't care" state. */
    bool                HasRotation() const;
    /** Sets the control to "don't care" state. */
@@ -138,9 +139,9 @@
        sal_Int32           mnLinkedFieldValueMultiplyer;
        Size                maWinSize;
        vcl::Font           maWinFont;
        sal_Int32           mnAngle;
        sal_Int32           mnInitialAngle;
        sal_Int32           mnOldAngle;
        Degree100           mnAngle;
        Degree100           mnInitialAngle;
        Degree100           mnOldAngle;
        tools::Long                mnCenterX;
        tools::Long                mnCenterY;
        bool                mbNoRot;
@@ -154,7 +155,7 @@
    void                HandleMouseEvent( const Point& rPos, bool bInitial );
    void                HandleEscapeEvent();

    void                SetRotation( sal_Int32 nAngle, bool bBroadcast );
    void                SetRotation( Degree100 nAngle, bool bBroadcast );

    void                Init( const Size& rWinSize, const vcl::Font& rWinFont );

diff --git a/include/svx/obj3d.hxx b/include/svx/obj3d.hxx
index b9f4331..e786cbb 100644
--- a/include/svx/obj3d.hxx
+++ b/include/svx/obj3d.hxx
@@ -116,7 +116,7 @@
    // which is vertical to the screen, plus a shift of the scene.
    // This means that also the scene (E3dScene) must define this
    // routine as virtual in its class.
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;

    // get wireframe polygon for local object. No transform is applied.
    basegfx::B3DPolyPolygon CreateWireframe() const;
diff --git a/include/svx/scene3d.hxx b/include/svx/scene3d.hxx
index 3ff3a55..13d4157 100644
--- a/include/svx/scene3d.hxx
+++ b/include/svx/scene3d.hxx
@@ -137,7 +137,7 @@
    virtual void NbcSetTransform(const basegfx::B3DHomMatrix& rMatrix) override;
    virtual void SetTransform(const basegfx::B3DHomMatrix& rMatrix) override;

    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    void RotateScene(const Point& rRef, double sn, double cs);

    // TakeObjName...() is for the display in the UI, for example "3 frames selected".
diff --git a/include/svx/sdangitm.hxx b/include/svx/sdangitm.hxx
index 81897d4..6177089 100644
--- a/include/svx/sdangitm.hxx
+++ b/include/svx/sdangitm.hxx
@@ -21,12 +21,13 @@

#include <svl/intitem.hxx>
#include <svx/svxdllapi.h>
#include <tools/degree.hxx>



class SVXCORE_DLLPUBLIC SdrAngleItem: public SfxInt32Item {
public:
    SdrAngleItem(sal_uInt16 nId, sal_Int32 nAngle): SfxInt32Item(nId,nAngle) {}
    SdrAngleItem(sal_uInt16 nId, Degree100 nAngle): SfxInt32Item(nId,nAngle.get()) {}
    virtual SdrAngleItem* Clone(SfxItemPool* pPool=nullptr) const override;

    virtual bool GetPresentation(SfxItemPresentation ePres,
@@ -34,6 +35,9 @@
                                 MapUnit ePresMetric,
                                 OUString& rText,
                                 const IntlWrapper& rIntlWrapper) const override;

    Degree100 GetValue() const { return Degree100(SfxInt32Item::GetValue()); }
    void SetValue(Degree100 nTheValue) { SfxInt32Item::SetValue(nTheValue.get()); }
};


diff --git a/include/svx/svdedtv.hxx b/include/svx/svdedtv.hxx
index b215108..560f4cf 100644
--- a/include/svx/svdedtv.hxx
+++ b/include/svx/svdedtv.hxx
@@ -212,13 +212,13 @@
    void MoveMarkedObj(const Size& rSiz, bool bCopy=false);
    void ResizeMarkedObj(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy=false);
    void ResizeMultMarkedObj(const Point& rRef, const Fraction& xFact, const Fraction& yFact, const bool bWdh, const bool bHgt);
    tools::Long GetMarkedObjRotate() const;
    void RotateMarkedObj(const Point& rRef, tools::Long nAngle, bool bCopy=false);
    Degree100 GetMarkedObjRotate() const;
    void RotateMarkedObj(const Point& rRef, Degree100 nAngle, bool bCopy=false);
    void MirrorMarkedObj(const Point& rRef1, const Point& rRef2, bool bCopy=false);
    void MirrorMarkedObjHorizontal();
    void MirrorMarkedObjVertical();
    tools::Long GetMarkedObjShear() const;
    void ShearMarkedObj(const Point& rRef, tools::Long nAngle, bool bVShear=false, bool bCopy=false);
    Degree100 GetMarkedObjShear() const;
    void ShearMarkedObj(const Point& rRef, Degree100 nAngle, bool bVShear=false, bool bCopy=false);
    void CrookMarkedObj(const Point& rRef, const Point& rRad, SdrCrookMode eMode, bool bVertical, bool bNoContortion, bool bCopy=false);
    void DistortMarkedObj(const tools::Rectangle& rRef, const XPolygon& rDistortedRect, bool bNoContortion, bool bCopy=false);

@@ -227,7 +227,7 @@
    void SetAllMarkedRect(const tools::Rectangle& rRect) { SetMarkedObjRect(rRect); }
    void MoveAllMarked(const Size& rSiz, bool bCopy=false) { MoveMarkedObj(rSiz,bCopy); }
    void ResizeAllMarked(const Point& rRef, const Fraction& xFact, const Fraction& yFact) { ResizeMarkedObj(rRef,xFact,yFact); }
    void RotateAllMarked(const Point& rRef, tools::Long nAngle) { RotateMarkedObj(rRef,nAngle); }
    void RotateAllMarked(const Point& rRef, Degree100 nAngle) { RotateMarkedObj(rRef,nAngle); }
    void MirrorAllMarkedHorizontal() { MirrorMarkedObjHorizontal(); }
    void MirrorAllMarkedVertical() { MirrorMarkedObjVertical(); }
    void CopyMarked() { CopyMarkedObj(); }
diff --git a/include/svx/svdglev.hxx b/include/svx/svdglev.hxx
index 7469444..5a7d3a2 100644
--- a/include/svx/svdglev.hxx
+++ b/include/svx/svdglev.hxx
@@ -77,7 +77,7 @@

    void MoveMarkedGluePoints  (const Size& rSiz, bool bCopy);
    void ResizeMarkedGluePoints(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy);
    void RotateMarkedGluePoints(const Point& rRef, tools::Long nAngle, bool bCopy);
    void RotateMarkedGluePoints(const Point& rRef, Degree100 nAngle, bool bCopy);
};

#endif // INCLUDED_SVX_SVDGLEV_HXX
diff --git a/include/svx/svdglue.hxx b/include/svx/svdglue.hxx
index a7eb9b9d..7065b34 100644
--- a/include/svx/svdglue.hxx
+++ b/include/svx/svdglue.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_SVX_SVDGLUE_HXX

#include <tools/gen.hxx>
#include <tools/degree.hxx>
#include <svx/svxdllapi.h>
#include <memory>
#include <vector>
@@ -104,12 +105,12 @@
    void         Invalidate(vcl::Window& rWin, const SdrObject* pObj) const;
    Point        GetAbsolutePos(const SdrObject& rObj) const;
    void         SetAbsolutePos(const Point& rNewPos, const SdrObject& rObj);
    tools::Long         GetAlignAngle() const;
    void         SetAlignAngle(tools::Long nAngle);
    static tools::Long  EscDirToAngle(SdrEscapeDirection nEsc);
    static SdrEscapeDirection EscAngleToDir(tools::Long nAngle);
    void         Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs, const SdrObject* pObj);
    void         Mirror(const Point& rRef1, const Point& rRef2, tools::Long nAngle, const SdrObject* pObj);
    Degree100    GetAlignAngle() const;
    void         SetAlignAngle(Degree100 nAngle);
    static Degree100  EscDirToAngle(SdrEscapeDirection nEsc);
    static SdrEscapeDirection EscAngleToDir(Degree100 nAngle);
    void         Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs, const SdrObject* pObj);
    void         Mirror(const Point& rRef1, const Point& rRef2, Degree100 nAngle, const SdrObject* pObj);
    void         Shear (const Point& rRef, double tn, bool bVShear, const SdrObject* pObj);
};

@@ -137,9 +138,9 @@
    void                Invalidate(vcl::Window& rWin, const SdrObject* pObj) const;
    // temp for transformations on the reference object
    void                SetReallyAbsolute(bool bOn, const SdrObject& rObj);
    void                Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs, const SdrObject* pObj);
    void                Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs, const SdrObject* pObj);
    void                Mirror(const Point& rRef1, const Point& rRef2, const SdrObject* pObj);
    void                Mirror(const Point& rRef1, const Point& rRef2, tools::Long nAngle, const SdrObject* pObj);
    void                Mirror(const Point& rRef1, const Point& rRef2, Degree100 nAngle, const SdrObject* pObj);
    void                Shear (const Point& rRef, double tn, bool bVShear, const SdrObject* pObj);
};

diff --git a/include/svx/svdhdl.hxx b/include/svx/svdhdl.hxx
index e5cc137..707c1dd 100644
--- a/include/svx/svdhdl.hxx
+++ b/include/svx/svdhdl.hxx
@@ -143,7 +143,7 @@

    SdrHdlKind                  eKind;

    tools::Long                        nRotationAngle; // turn handle or mousepointer
    Degree100                   nRotationAngle; // turn handle or mousepointer
    sal_uInt32                  nObjHdlNum;     // required by MarkView
    sal_uInt32                  nPolyNum;       // Polygonpoint
    sal_uInt32                  nPPntNum;       // Point number of the polygon
@@ -207,7 +207,7 @@
    void SetSelected(bool bJa=true);

    void Set1PixMore(bool bJa=true);
    void SetRotationAngle(tools::Long n);
    void SetRotationAngle(Degree100 n);

    bool IsCornerHdl() const { return eKind==SdrHdlKind::UpperLeft || eKind==SdrHdlKind::UpperRight || eKind==SdrHdlKind::LowerLeft || eKind==SdrHdlKind::LowerRight; }
    bool IsVertexHdl() const { return eKind==SdrHdlKind::Upper || eKind==SdrHdlKind::Lower || eKind==SdrHdlKind::Left  || eKind==SdrHdlKind::Right; }
diff --git a/include/svx/svdmodel.hxx b/include/svx/svdmodel.hxx
index 6f4581d16..1d849ac 100644
--- a/include/svx/svdmodel.hxx
+++ b/include/svx/svdmodel.hxx
@@ -27,6 +27,7 @@
#include <rtl/ustring.hxx>
#include <tools/weakbase.h>
#include <svl/SfxBroadcaster.hxx>
#include <tools/degree.hxx>
#include <tools/fldunit.hxx>
#include <tools/fract.hxx>
#include <svl/hint.hxx>
@@ -385,7 +386,7 @@

    static OUString  GetUnitString(FieldUnit eUnit);
    OUString         GetMetricString(tools::Long nVal, bool bNoUnitChars = false, sal_Int32 nNumDigits = -1) const;
    static OUString  GetAngleString(tools::Long nAngle);
    static OUString  GetAngleString(Degree100 nAngle);
    static OUString  GetPercentString(const Fraction& rVal);

    // RecalcPageNums is ordinarily only called by the Page.
diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx
index 2014e09..070cb21 100644
--- a/include/svx/svdoashp.hxx
+++ b/include/svx/svdoashp.hxx
@@ -168,16 +168,16 @@
    virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const override;

    virtual void Move(const Size& rSiz) override;
    virtual void Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual void SetSnapRect(const tools::Rectangle& rRect) override;
    virtual void SetLogicRect(const tools::Rectangle& rRect) override;
    virtual void AdjustToMaxRect( const tools::Rectangle& rMaxRect, bool bShrinkOnly = false ) override;

    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
    virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;

diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index 335eb3d..5beb682 100644
--- a/include/svx/svdobj.hxx
+++ b/include/svx/svdobj.hxx
@@ -27,6 +27,7 @@
#include <svl/lstner.hxx>
#include <svl/poolitem.hxx>
#include <svl/typedwhich.hxx>
#include <tools/degree.hxx>
#include <svx/DiagramDataInterface.hxx>
#include <svx/svdtypes.hxx>
#include <svx/svdobjkind.hxx>
@@ -536,18 +537,18 @@
    virtual void NbcMove  (const Size& rSiz);
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
    virtual void NbcCrop  (const basegfx::B2DPoint& rRef, double fxFact, double fyFact);
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs);
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs);
    // Utility for call sites that don't have sin and cos handy
    void NbcRotate(const Point& rRef, tools::Long nAngle);
    void NbcRotate(const Point& rRef, Degree100 nAngle);
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2);
    virtual void NbcShear (const Point& rRef, tools::Long nAngle, double tn, bool bVShear);
    virtual void NbcShear (const Point& rRef, Degree100 nAngle, double tn, bool bVShear);

    virtual void Move  (const Size& rSiz);
    virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative = true);
    virtual void Crop  (const basegfx::B2DPoint& rRef, double fxFact, double fyFact);
    virtual void Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs);
    virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs);
    virtual void Mirror(const Point& rRef1, const Point& rRef2);
    virtual void Shear (const Point& rRef, tools::Long nAngle, double tn, bool bVShear);
    virtual void Shear (const Point& rRef, Degree100 nAngle, double tn, bool bVShear);

    /// The relative position of a SdrObject is the distance of the upper
    /// left corner of the logic bounding rectangle (SnapRect) to the anchor.
@@ -580,8 +581,8 @@
    virtual void AdjustToMaxRect( const tools::Rectangle& rMaxRect, bool bShrinkOnly = false );

    // rotation and shear angle
    virtual tools::Long GetRotateAngle() const;
    virtual tools::Long GetShearAngle(bool bVertical = false) const;
    virtual Degree100 GetRotateAngle() const;
    virtual Degree100 GetShearAngle(bool bVertical = false) const;

    /// snap to special points of an Object (polygon points, center of circle)
    virtual sal_uInt32 GetSnapPointCount() const;
@@ -678,7 +679,7 @@

    // to be set temporarily when transforming related object(?)
    void SetGlueReallyAbsolute(bool bOn);
    void NbcRotateGluePoints(const Point& rRef, tools::Long nAngle, double sn, double cs);
    void NbcRotateGluePoints(const Point& rRef, Degree100 nAngle, double sn, double cs);
    void NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2);
    void NbcShearGluePoints (const Point& rRef, double tn, bool bVShear);

diff --git a/include/svx/svdocirc.hxx b/include/svx/svdocirc.hxx
index 15c27dd..32ecc1f 100644
--- a/include/svx/svdocirc.hxx
+++ b/include/svx/svdocirc.hxx
@@ -32,8 +32,8 @@
class SdrCircObjGeoData final : public SdrTextObjGeoData
{
public:
    tools::Long                        nStartAngle;
    tools::Long                        nEndAngle;
    Degree100     nStartAngle;
    Degree100     nEndAngle;
};

enum class SdrCircKind { Full, Section, Cut, Arc };
@@ -51,10 +51,10 @@
    virtual std::unique_ptr<sdr::properties::BaseProperties> CreateObjectSpecificProperties() override;

    SdrCircKind                 meCircleKind;
    tools::Long                        nStartAngle;
    tools::Long                        nEndAngle;
    Degree100                   nStartAngle;
    Degree100                   nEndAngle;

    SVX_DLLPRIVATE basegfx::B2DPolygon ImpCalcXPolyCirc(const SdrCircKind eKind, const tools::Rectangle& rRect1, tools::Long nStart, tools::Long nEnd) const;
    SVX_DLLPRIVATE basegfx::B2DPolygon ImpCalcXPolyCirc(const SdrCircKind eKind, const tools::Rectangle& rRect1, Degree100 nStart, Degree100 nEnd) const;
    SVX_DLLPRIVATE static void ImpSetCreateParams(SdrDragStat& rStat);
    SVX_DLLPRIVATE void ImpSetAttrToCircInfo(); // copy values from pool
    SVX_DLLPRIVATE void ImpSetCircInfoToAttr(); // copy values into pool
@@ -86,8 +86,8 @@
        SdrModel& rSdrModel,
        SdrCircKind eNewKind,
        const tools::Rectangle& rRect,
        tools::Long nNewStartAngle,
        tools::Long nNewEndWink);
        Degree100 nNewStartAngle,
        Degree100 nNewEndAngle);

    SdrCircKind GetCircleKind() const { return meCircleKind; }

@@ -129,7 +129,7 @@
    virtual void NbcMove(const Size& aSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear (const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear (const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual SdrObjectUniquePtr DoConvertToPolyObj(bool bBezier, bool bAddText) const override;

private:
@@ -137,8 +137,8 @@
    virtual void SaveGeoData(SdrObjGeoData& rGeo) const override;
    virtual void RestGeoData(const SdrObjGeoData& rGeo) override;
public:
    tools::Long GetStartAngle() const { return nStartAngle; }
    tools::Long GetEndAngle() const { return nEndAngle; }
    Degree100 GetStartAngle() const { return nStartAngle; }
    Degree100 GetEndAngle() const { return nEndAngle; }

};

diff --git a/include/svx/svdoedge.hxx b/include/svx/svdoedge.hxx
index 5d0116c..0bda2fe 100644
--- a/include/svx/svdoedge.hxx
+++ b/include/svx/svdoedge.hxx
@@ -242,9 +242,9 @@
    virtual void NbcResize(const Point& rRefPnt, const Fraction& aXFact, const Fraction& aYFact) override;

    // #i54102# added rotate, mirror and shear support
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;

    // #102344# Added missing implementation
    virtual void NbcSetAnchorPos(const Point& rPnt) override;
diff --git a/include/svx/svdogrp.hxx b/include/svx/svdogrp.hxx
index 355b192..2083c88 100644
--- a/include/svx/svdogrp.hxx
+++ b/include/svx/svdogrp.hxx
@@ -80,15 +80,15 @@

    virtual bool BegCreate(SdrDragStat& rStat) override;

    virtual tools::Long GetRotateAngle() const override;
    virtual tools::Long GetShearAngle(bool bVertical = false) const override;
    virtual Degree100 GetRotateAngle() const override;
    virtual Degree100 GetShearAngle(bool bVertical = false) const override;

    virtual void Move(const Size& rSiz) override;
    virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact,
                        bool bUnsetRelative = true) override;
    virtual void Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void Mirror(const Point& rRef1, const Point& rRef2) override;
    virtual void Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual void SetAnchorPos(const Point& rPnt) override;
    virtual void SetRelativePos(const Point& rPnt) override;
    virtual void SetSnapRect(const tools::Rectangle& rRect) override;
@@ -97,9 +97,9 @@
    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact,
                           const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual void NbcSetAnchorPos(const Point& rPnt) override;
    virtual void NbcSetRelativePos(const Point& rPnt) override;
    virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
diff --git a/include/svx/svdomeas.hxx b/include/svx/svdomeas.hxx
index d72798e..ccc7d2a 100644
--- a/include/svx/svdomeas.hxx
+++ b/include/svx/svdomeas.hxx
@@ -113,10 +113,10 @@

    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual tools::Long GetRotateAngle() const override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
    virtual Degree100 GetRotateAngle() const override;
    virtual void RecalcSnapRect() override;

    virtual sal_uInt32 GetSnapPointCount() const override;
diff --git a/include/svx/svdopath.hxx b/include/svx/svdopath.hxx
index 5f56fd3..f1a5b1b 100644
--- a/include/svx/svdopath.hxx
+++ b/include/svx/svdopath.hxx
@@ -108,9 +108,9 @@

    virtual void NbcMove(const Size& aSize) override;
    virtual void NbcResize(const Point& rRefPnt, const Fraction& aXFact, const Fraction& aYFact) override;
    virtual void NbcRotate(const Point& rRefPnt, tools::Long nAngle, double fSin, double fCos) override;
    virtual void NbcRotate(const Point& rRefPnt, Degree100 nAngle, double fSin, double fCos) override;
    virtual void NbcMirror(const Point& rRefPnt1, const Point& rRefPnt2) override;
    virtual void NbcShear(const Point& rRefPnt, tools::Long nAngle, double fTan, bool bVShear) override;
    virtual void NbcShear(const Point& rRefPnt, Degree100 nAngle, double fTan, bool bVShear) override;

    virtual sal_uInt32 GetSnapPointCount() const override;
    virtual Point GetSnapPoint(sal_uInt32 i) const override;
diff --git a/include/svx/svdorect.hxx b/include/svx/svdorect.hxx
index 9480acd..930fb01 100644
--- a/include/svx/svdorect.hxx
+++ b/include/svx/svdorect.hxx
@@ -112,9 +112,9 @@

    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;

    virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const override;
    virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const override;
diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 9d74bff..fc7a817 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -454,8 +454,8 @@
    virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
    virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;
    virtual const tools::Rectangle& GetLogicRect() const override;
    virtual tools::Long GetRotateAngle() const override;
    virtual tools::Long GetShearAngle(bool bVertical = false) const override;
    virtual Degree100 GetRotateAngle() const override;
    virtual Degree100 GetShearAngle(bool bVertical = false) const override;

    virtual sal_uInt32 GetSnapPointCount() const override;
    virtual Point GetSnapPoint(sal_uInt32 i) const override;
@@ -478,9 +478,9 @@

    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;

    virtual bool HasTextEdit() const override;
    // returns true if TextEditMode started
diff --git a/include/svx/svdovirt.hxx b/include/svx/svdovirt.hxx
index b47bc03..12cd040 100644
--- a/include/svx/svdovirt.hxx
+++ b/include/svx/svdovirt.hxx
@@ -100,16 +100,16 @@
    virtual void NbcMove(const Size& rSiz) override;
    virtual void NbcResize(const Point& rRef, const Fraction& xFact,
                           const Fraction& yFact) override;
    virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
    virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;

    virtual void Move(const Size& rSiz) override;
    virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact,
                        bool bUnsetRelative = true) override;
    virtual void Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
    virtual void Mirror(const Point& rRef1, const Point& rRef2) override;
    virtual void Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
    virtual void Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;

    virtual void RecalcSnapRect() override;
    virtual const tools::Rectangle& GetSnapRect() const override;
@@ -120,8 +120,8 @@
    virtual void SetLogicRect(const tools::Rectangle& rRect) override;
    virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;

    virtual tools::Long GetRotateAngle() const override;
    virtual tools::Long GetShearAngle(bool bVertical = false) const override;
    virtual Degree100 GetRotateAngle() const override;
    virtual Degree100 GetShearAngle(bool bVertical = false) const override;

    virtual sal_uInt32 GetSnapPointCount() const override;
    virtual Point GetSnapPoint(sal_uInt32 i) const override;
diff --git a/include/svx/svdpoev.hxx b/include/svx/svdpoev.hxx
index 538e101..0ad7add 100644
--- a/include/svx/svdpoev.hxx
+++ b/include/svx/svdpoev.hxx
@@ -66,7 +66,7 @@

    void MoveMarkedPoints(const Size& rSiz);
    void ResizeMarkedPoints(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
    void RotateMarkedPoints(const Point& rRef, tools::Long nAngle);
    void RotateMarkedPoints(const Point& rRef, Degree100 nAngle);

    // This probably creates an arbitrary amount of new objects
    void RipUpAtMarkedPoints() override;
diff --git a/include/svx/svdsnpv.hxx b/include/svx/svdsnpv.hxx
index 1930583..b7b06e4 100644
--- a/include/svx/svdsnpv.hxx
+++ b/include/svx/svdsnpv.hxx
@@ -23,6 +23,7 @@
#include <svx/svdpntv.hxx>
#include <svx/svdhlpln.hxx>
#include <svx/svxdllapi.h>
#include <tools/degree.hxx>
#include <o3tl/typed_flags_set.hxx>

/**
@@ -104,8 +105,8 @@
    Fraction                    aSnapWdtY;

    sal_uInt16                  nMagnSizPix;
    tools::Long                        nSnapAngle;
    tools::Long                        nEliminatePolyPointLimitAngle;
    Degree100                   nSnapAngle;
    Degree100                   nEliminatePolyPointLimitAngle;

    SdrCrookMode                eCrookMode;

@@ -220,8 +221,8 @@
    // persistent.
    void SetAngleSnapEnabled(bool bOn) { bAngleSnapEnab=bOn; }
    bool IsAngleSnapEnabled() const { return bAngleSnapEnab; }
    void SetSnapAngle(tools::Long nAngle) { nSnapAngle=nAngle; }
    tools::Long GetSnapAngle() const { return nSnapAngle; }
    void SetSnapAngle(Degree100 nAngle) { nSnapAngle=nAngle; }
    Degree100 GetSnapAngle() const { return nSnapAngle; }

    // different effects from Ortho (depending on the context):
    // - Create
@@ -280,8 +281,8 @@
    // if its adjacent lines are almost a solid line.
    void SetEliminatePolyPoints(bool bOn) { bEliminatePolyPoints=bOn; }
    bool IsEliminatePolyPoints() const { return bEliminatePolyPoints; }
    void SetEliminatePolyPointLimitAngle(tools::Long nAngle) { nEliminatePolyPointLimitAngle=nAngle; }
    tools::Long GetEliminatePolyPointLimitAngle() const { return nEliminatePolyPointLimitAngle; }
    void SetEliminatePolyPointLimitAngle(Degree100 nAngle) { nEliminatePolyPointLimitAngle=nAngle; }
    Degree100 GetEliminatePolyPointLimitAngle() const { return nEliminatePolyPointLimitAngle; }
};

#endif // INCLUDED_SVX_SVDSNPV_HXX
diff --git a/include/svx/svdtrans.hxx b/include/svx/svdtrans.hxx
index a5bd1e64..ccc6308 100644
--- a/include/svx/svdtrans.hxx
+++ b/include/svx/svdtrans.hxx
@@ -22,6 +22,7 @@

#include <rtl/ustring.hxx>
#include <svx/svxdllapi.h>
#include <tools/degree.hxx>
#include <tools/fldunit.hxx>
#include <tools/fract.hxx>
#include <tools/gen.hxx>
@@ -43,7 +44,7 @@
// To convert it back, we use division.

// That maximum shear angle
#define SDRMAXSHEAR 8900
constexpr Degree100 SDRMAXSHEAR(8900);

class XPolygon;
class XPolyPolygon;
@@ -159,13 +160,13 @@
 * @return the returned value is in the range of -180.00..179.99 deg
 * and is in 1/100 deg units
 */
SVXCORE_DLLPUBLIC tools::Long GetAngle(const Point& rPnt);
SVXCORE_DLLPUBLIC Degree100 GetAngle(const Point& rPnt);

tools::Long NormAngle18000(tools::Long a); /// Normalize angle to -180.00..179.99
Degree100 NormAngle18000(Degree100 a); /// Normalize angle to -180.00..179.99

SVXCORE_DLLPUBLIC tools::Long NormAngle36000(tools::Long a); /// Normalize angle to 0.00..359.99
SVXCORE_DLLPUBLIC Degree100 NormAngle36000(Degree100 a); /// Normalize angle to 0.00..359.99

sal_uInt16 GetAngleSector(tools::Long nAngle); /// Determine sector within the cartesian coordinate system
sal_uInt16 GetAngleSector(Degree100 nAngle); /// Determine sector within the cartesian coordinate system

/**
 * Calculates the length of (0,0) via a^2 + b^2 = c^2
@@ -213,8 +214,8 @@

class GeoStat { // Geometric state for a rect
public:
    tools::Long     nRotationAngle;
    tools::Long     nShearAngle;
    Degree100 nRotationAngle;
    Degree100 nShearAngle;
    double   mfTanShearAngle;      // tan(nShearAngle)
    double   mfSinRotationAngle;   // sin(nRotationAngle)
    double   mfCosRotationAngle;   // cos(nRotationAngle)
diff --git a/include/svx/sxciaitm.hxx b/include/svx/sxciaitm.hxx
index f14ba75..9d77c18 100644
--- a/include/svx/sxciaitm.hxx
+++ b/include/svx/sxciaitm.hxx
@@ -22,12 +22,12 @@
#include <svx/svddef.hxx>
#include <svx/sdangitm.hxx>

inline SdrAngleItem makeSdrCircStartAngleItem(tools::Long nAngle)
inline SdrAngleItem makeSdrCircStartAngleItem(Degree100 nAngle)
{
    return SdrAngleItem(SDRATTR_CIRCSTARTANGLE, nAngle);
}

inline SdrAngleItem makeSdrCircEndAngleItem(tools::Long nAngle)
inline SdrAngleItem makeSdrCircEndAngleItem(Degree100 nAngle)
{
    return SdrAngleItem(SDRATTR_CIRCENDANGLE, nAngle);
}
diff --git a/include/svx/sxmtfitm.hxx b/include/svx/sxmtfitm.hxx
index 6591ff2..2e89ebe 100644
--- a/include/svx/sxmtfitm.hxx
+++ b/include/svx/sxmtfitm.hxx
@@ -42,7 +42,7 @@
//Angle of the text in 1/100deg. 0=horizontal; read from left to right. (n.i.)
class SdrMeasureTextFixedAngleItem: public SdrAngleItem {
public:
    SdrMeasureTextFixedAngleItem(tools::Long nVal=0): SdrAngleItem(SDRATTR_MEASURETEXTFIXEDANGLE,nVal)  {}
    SdrMeasureTextFixedAngleItem(Degree100 nVal=0_deg100): SdrAngleItem(SDRATTR_MEASURETEXTFIXEDANGLE,nVal)  {}
    virtual ~SdrMeasureTextFixedAngleItem() override;
    virtual SdrMeasureTextFixedAngleItem* Clone(SfxItemPool* pPool=nullptr) const override;

diff --git a/include/tools/degree.hxx b/include/tools/degree.hxx
index 27bdffa..47dc7a8 100644
--- a/include/tools/degree.hxx
+++ b/include/tools/degree.hxx
@@ -10,6 +10,7 @@

#include <sal/types.h>
#include <o3tl/strong_int.hxx>
#include <cstdlib>
#include <math.h>

/** tenths of a Degree, normally rotation */
@@ -18,10 +19,27 @@
/** custom literal */
constexpr Degree10 operator""_deg10(unsigned long long n) { return Degree10{ n }; }

/** hundredths of a Degree, normally rotation */
typedef o3tl::strong_int<sal_Int32, struct Degree100Tag> Degree100;

// Android has trouble calling the correct overload of std::abs
#ifdef ANDROID
inline Degree100 abs(Degree100 x) { return Degree100(std::abs(static_cast<int>(x.get()))); }
#else
inline Degree100 abs(Degree100 x) { return Degree100(std::abs(x.get())); }
#endif

/** custom literal */
constexpr Degree100 operator""_deg100(unsigned long long n) { return Degree100{ n }; }

/** conversion functions */

inline sal_Int32 toDegree100(Degree10 x) { return x.get() * 10; }
inline double toRadians(Degree10 x) { return x.get() * M_PI / 1800.0; }
inline Degree100 toDegree100(Degree10 x) { return Degree100(x.get() * 10); }
inline double toRadians(Degree10 x) { return x.get() * (M_PI / 1800.0); }
inline double toDegrees(Degree10 x) { return x.get() / 10.0; }

inline Degree10 toDegree10(Degree100 x) { return Degree10((x.get() + 5) / 10); }
inline double toRadians(Degree100 x) { return x.get() * (M_PI / 18000.0); }
inline double toDegrees(Degree100 x) { return x.get() / 100.0; }

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index ce30b43..98ef5de 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1048,7 +1048,7 @@
        aShapeProps.assignUsed( getShapeProperties() );
        aShapeProps.assignUsed( maDefaultShapeProperties );
        if(mnRotation != 0 && bIsCustomShape)
            aShapeProps.setProperty( PROP_RotateAngle, sal_Int32( NormAngle36000( mnRotation / -600 ) ));
            aShapeProps.setProperty( PROP_RotateAngle, sal_Int32( NormAngle36000( Degree100(mnRotation / -600) ) ));
        if ( bIsEmbMedia || aServiceName == "com.sun.star.drawing.GraphicObjectShape" || aServiceName == "com.sun.star.drawing.OLE2Shape" || bIsCustomShape )
            mpGraphicPropertiesPtr->pushToPropMap( aShapeProps, rGraphicHelper );
        if ( mpTablePropertiesPtr && aServiceName == "com.sun.star.drawing.TableShape" )
@@ -1486,7 +1486,8 @@
        if ( !bUseRotationTransform && (mnRotation != 0 || nCameraRotation != 0) )
        {
            // use the same logic for rotation from VML exporter (SimpleShape::implConvertAndInsert at vmlshape.cxx)
            aPropertySet.setAnyProperty( PROP_RotateAngle, makeAny( sal_Int32( NormAngle36000( (mnRotation - nCameraRotation) / -600 ) ) ) );
            Degree100 nAngle = NormAngle36000( Degree100((mnRotation - nCameraRotation) / -600) );
            aPropertySet.setAnyProperty( PROP_RotateAngle, makeAny( sal_Int32( nAngle.get() ) ) );
            aPropertySet.setAnyProperty( PROP_HoriOrientPosition, makeAny( maPosition.X ) );
            aPropertySet.setAnyProperty( PROP_VertOrientPosition, makeAny( maPosition.Y ) );
        }
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 0571aee..da3edf2 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1717,8 +1717,8 @@
{
    SAL_INFO("oox.shape",  "write shape transformation");

    sal_Int32 nRotation = 0;
    sal_Int32 nCameraRotation = 0;
    Degree100 nRotation;
    Degree100 nCameraRotation;
    awt::Point aPos = rXShape->getPosition();
    awt::Size aSize = rXShape->getSize();

@@ -1741,22 +1741,26 @@
    if (!bSuppressRotation)
    {
        SdrObject* pShape = GetSdrObjectFromXShape( rXShape );
        nRotation = pShape ? pShape->GetRotateAngle() : 0;
        nRotation = pShape ? pShape->GetRotateAngle() : 0_deg100;
        if ( GetDocumentType() != DOCUMENT_DOCX )
        {
            int faccos=bFlipV ? -1 : 1;
            int facsin=bFlipH ? -1 : 1;
            aPos.X-=(1-faccos*cos(nRotation*F_PI18000))*aSize.Width/2-facsin*sin(nRotation*F_PI18000)*aSize.Height/2;
            aPos.Y-=(1-faccos*cos(nRotation*F_PI18000))*aSize.Height/2+facsin*sin(nRotation*F_PI18000)*aSize.Width/2;
            aPos.X-=(1-faccos*cos(nRotation.get()*F_PI18000))*aSize.Width/2-facsin*sin(nRotation.get()*F_PI18000)*aSize.Height/2;
            aPos.Y-=(1-faccos*cos(nRotation.get()*F_PI18000))*aSize.Height/2+facsin*sin(nRotation.get()*F_PI18000)*aSize.Width/2;
        }

        // The RotateAngle property's value is independent from any flipping, and that's exactly what we need here.
        uno::Reference<beans::XPropertySet> xPropertySet(rXShape, uno::UNO_QUERY);
        uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo();
        if (xPropertySetInfo->hasPropertyByName("RotateAngle"))
            xPropertySet->getPropertyValue("RotateAngle") >>= nRotation;
        {
            sal_Int32 nTmp;
            if (xPropertySet->getPropertyValue("RotateAngle") >>= nTmp)
                nRotation = Degree100(nTmp);
        }
        // tdf#133037: restore original rotate angle before output
        if (nRotation != 0 && xPropertySetInfo->hasPropertyByName(UNO_NAME_MISC_OBJ_INTEROPGRABBAG))
        if (nRotation && xPropertySetInfo->hasPropertyByName(UNO_NAME_MISC_OBJ_INTEROPGRABBAG))
        {
            uno::Sequence<beans::PropertyValue> aGrabBagProps;
            xPropertySet->getPropertyValue(UNO_NAME_MISC_OBJ_INTEROPGRABBAG) >>= aGrabBagProps;
@@ -1776,8 +1780,9 @@
                        [](const PropertyValue& rProp) { return rProp.Name == "rotRev"; });
                    if (pZRotationProp != std::cend(aCameraProps))
                    {
                        pZRotationProp->Value >>= nCameraRotation;
                        nCameraRotation = NormAngle36000(nCameraRotation / -600);
                        sal_Int32 nTmp;
                        pZRotationProp->Value >>= nTmp;
                        nCameraRotation = NormAngle36000(Degree100(nTmp / -600));
                    }
                }
            }
@@ -1786,7 +1791,7 @@

    // OOXML flips shapes before rotating them.
    if(bFlipH != bFlipV)
        nRotation = nRotation * -1 + 36000;
        nRotation = Degree100(nRotation.get() * -1 + 36000);

    WriteTransformation(tools::Rectangle(Point(aPos.X, aPos.Y), Size(aSize.Width, aSize.Height)), nXmlNamespace,
            bFlipHWrite, bFlipVWrite, ExportRotateClockwisify(nRotation + nCameraRotation), IsGroupShape( rXShape ));
@@ -4981,8 +4986,8 @@
    SdrObject* pObj = SdrObject::getSdrObjectFromXShape(rXShape.get());
    if (pObj)
    {
        sal_Int32 nRotation = pObj->GetRotateAngle();
        if (nRotation != 0)
        Degree100 nRotation = pObj->GetRotateAngle();
        if (nRotation)
        {
            sal_Int16 nHalfWidth = aSize.Width / 2;
            sal_Int16 nHalfHeight = aSize.Height / 2;
@@ -4997,7 +5002,7 @@
            // MSO changes the anchor positions at these angles and that does an extra 90 degrees
            // rotation on our shapes, so we output it in such position that MSO
            // can draw this shape correctly.
            if ((nRotation >= 45 * 100 && nRotation < 135 * 100) || (nRotation >= 225 * 100 && nRotation < 315 * 100))
            if ((nRotation >= 4500_deg100 && nRotation < 13500_deg100) || (nRotation >= 22500_deg100 && nRotation < 31500_deg100))
            {
                aTopLeft.X = aTopLeft.X - nHalfHeight + nHalfWidth;
                aTopLeft.Y = aTopLeft.Y - nHalfWidth + nHalfHeight;
diff --git a/oox/source/shape/WpsContext.cxx b/oox/source/shape/WpsContext.cxx
index 5a42105..834dc9f5 100644
--- a/oox/source/shape/WpsContext.cxx
+++ b/oox/source/shape/WpsContext.cxx
@@ -84,8 +84,8 @@

                    // If the text is not rotated the way the shape wants it already, set the angle.
                    const sal_Int32 nRotation = nVert == XML_vert270 ? -270 : -90;
                    if (static_cast<tools::Long>(basegfx::rad2deg(fRotate))
                        != NormAngle36000(static_cast<tools::Long>(nRotation) * 100) / 100)
                    if (static_cast<sal_Int32>(basegfx::rad2deg(fRotate))
                        != NormAngle36000(Degree100(nRotation * 100)).get() / 100)
                    {
                        comphelper::SequenceAsHashMap aCustomShapeGeometry(
                            xPropertySet->getPropertyValue("CustomShapeGeometry"));
diff --git a/oox/source/vml/vmlformatting.cxx b/oox/source/vml/vmlformatting.cxx
index 62da5de..60ef7f9 100644
--- a/oox/source/vml/vmlformatting.cxx
+++ b/oox/source/vml/vmlformatting.cxx
@@ -118,16 +118,16 @@
    return fDefValue;
}

sal_Int32 ConversionHelper::decodeRotation( const OUString& rValue )
Degree100 ConversionHelper::decodeRotation( const OUString& rValue )
{
    if( rValue.isEmpty() )
        return 0;
        return 0_deg100;

    double fValue = 0.0;
    double fRotation = 0.0;
    sal_Int32 nEndPos = 0;
    if( !lclExtractDouble(fValue, nEndPos, rValue) )
        return 0;
        return 0_deg100;

    if( nEndPos == rValue.getLength() )
        fRotation = fValue;
@@ -136,10 +136,10 @@
    else
    {
        OSL_FAIL("ConversionHelper::decodeRotation - unknown measure unit");
        return 0;
        return 0_deg100;
    }

    return NormAngle36000(fRotation * -100);
    return NormAngle36000(Degree100(static_cast<sal_Int32>(fRotation * -100)));
}

sal_Int64 ConversionHelper::decodeMeasureToEmu( const GraphicHelper& rGraphicHelper,
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 5b08166..32c1ec9 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -405,7 +405,7 @@
                    }

                    if(!maTypeModel.maRotation.isEmpty())
                        aGrabBag.push_back(comphelper::makePropertyValue("mso-rotation-angle", ConversionHelper::decodeRotation(maTypeModel.maRotation)));
                        aGrabBag.push_back(comphelper::makePropertyValue("mso-rotation-angle", ConversionHelper::decodeRotation(maTypeModel.maRotation).get()));
                    propertySet->setPropertyValue("FrameInteropGrabBag", uno::makeAny(comphelper::containerToSequence(aGrabBag)));
                    sal_Int32 backColorTransparency = 0;
                    propertySet->getPropertyValue("BackColorTransparency")
@@ -685,7 +685,7 @@
Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
    awt::Rectangle aShapeRect(rShapeRect);
    std::optional<sal_Int32> oRotation;
    std::optional<Degree100> oRotation;
    bool bFlipX = false, bFlipY = false;
    // tdf#137765: skip this rotation for line shapes
    if (!maTypeModel.maRotation.isEmpty() && maService != "com.sun.star.drawing.LineShape")
@@ -840,7 +840,7 @@
    {
        if (oRotation)
        {
            aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(*oRotation));
            aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny((*oRotation).get()));
            uno::Reference<lang::XServiceInfo> xServiceInfo(rxShapes, uno::UNO_QUERY);
            if (!xServiceInfo->supportsService("com.sun.star.drawing.GroupShape"))
            {
@@ -947,7 +947,7 @@
        }
        // fdo#70457: preserve rotation information
        if ( !maTypeModel.maRotation.isEmpty() )
            aPropSet.setAnyProperty(PROP_RotateAngle, makeAny(ConversionHelper::decodeRotation(maTypeModel.maRotation)));
            aPropSet.setAnyProperty(PROP_RotateAngle, makeAny(ConversionHelper::decodeRotation(maTypeModel.maRotation).get()));

        const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
        lcl_SetAnchorType(aPropSet, maTypeModel, rGraphicHelper);
@@ -1082,7 +1082,7 @@
                // -1 is required because the direction of MSO rotation is the opposite of ours
                // 100 is required because in this part of the code the angle is in a hundredth of
                // degrees.
                auto nAngle = -1 * 100.0 * rTypeModel.maRotation.toDouble();
                Degree100 nAngle( static_cast<sal_Int32>(-1 * 100.0 * rTypeModel.maRotation.toDouble()) );
                pShape->NbcRotate(pShape->GetSnapRect().Center(), nAngle);
            }
        }
@@ -1535,7 +1535,7 @@
    const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
    lcl_SetAnchorType(aPropertySet, maTypeModel, rGraphicHelper);
    if (!maTypeModel.maRotation.isEmpty())
        aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(ConversionHelper::decodeRotation(maTypeModel.maRotation)));
        aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(ConversionHelper::decodeRotation(maTypeModel.maRotation).get()));
    return xGroupShape;
}

diff --git a/reportdesign/source/ui/report/ReportSection.cxx b/reportdesign/source/ui/report/ReportSection.cxx
index d0618c2..a1ea6514 100644
--- a/reportdesign/source/ui/report/ReportSection.cxx
+++ b/reportdesign/source/ui/report/ReportSection.cxx
@@ -604,7 +604,7 @@
                                EE_ITEMS_START, EE_ITEMS_END>{});
                        aDest.Set( rSource );
                        _pObj->SetMergedItemSet( aDest );
                        sal_Int32 nAngle = pSourceObj->GetRotateAngle();
                        Degree100 nAngle = pSourceObj->GetRotateAngle();
                        if ( nAngle )
                            _pObj->NbcRotate( _pObj->GetSnapRect().Center(), nAngle );
                        bAttributesAppliedFromGallery = true;
diff --git a/sc/inc/attrib.hxx b/sc/inc/attrib.hxx
index 4c9206a..63025d9 100644
--- a/sc/inc/attrib.hxx
+++ b/sc/inc/attrib.hxx
@@ -288,7 +288,7 @@
class SC_DLLPUBLIC ScRotateValueItem final : public SdrAngleItem
{
public:
    ScRotateValueItem(sal_Int32 nAngle);
    ScRotateValueItem(Degree100 nAngle);
    virtual ScRotateValueItem* Clone(SfxItemPool* pPool=nullptr) const override;

    virtual bool GetPresentation( SfxItemPresentation ePresentation,
diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx
index 63e854e..bfc162b 100644
--- a/sc/inc/patattr.hxx
+++ b/sc/inc/patattr.hxx
@@ -23,6 +23,7 @@
#include <svl/poolitem.hxx>
#include <svl/itemset.hxx>
#include <svl/languageoptions.hxx>
#include <tools/degree.hxx>
#include <editeng/svxenum.hxx>
#include "scdllapi.h"
#include "fonthelper.hxx"
@@ -139,7 +140,7 @@
    sal_uInt32              GetNumberFormat( SvNumberFormatter* pFormatter,
                                             const SfxItemSet* pCondSet ) const;

    tools::Long                    GetRotateVal( const SfxItemSet* pCondSet ) const;
    Degree100               GetRotateVal( const SfxItemSet* pCondSet ) const;
    ScRotateDir             GetRotateDir( const SfxItemSet* pCondSet ) const;

    void                    SetKey(sal_uInt64 nKey);
diff --git a/sc/qa/unit/scshapetest.cxx b/sc/qa/unit/scshapetest.cxx
index 14dc129..344a26e 100644
--- a/sc/qa/unit/scshapetest.cxx
+++ b/sc/qa/unit/scshapetest.cxx
@@ -234,16 +234,17 @@

    // Verify hiding has changed shape geometry as expected
    tools::Rectangle aSnapRect(pObj->GetSnapRect());
    tools::Long aRotateAngle(pObj->GetRotateAngle());
    tools::Long aShearAngle(pObj->GetShearAngle());
    Degree100 aRotateAngle(pObj->GetRotateAngle());
    Degree100 aShearAngle(pObj->GetShearAngle());
    // mathematical exact would be Point(3868, 4795), Size(9763, 1909)
    // current values as of LO 7.2
    const tools::Rectangle aExpectRect(Point(3871, 4796), Size(9764, 1910));
    const tools::Long aExpectRotateAngle(20923);
    const tools::Long aExpectShearAngle(-6572);
    CPPUNIT_ASSERT_MESSAGE("Hide rows, shear angle: ", abs(aShearAngle - aExpectShearAngle) <= 1);
    const Degree100 aExpectRotateAngle(20923_deg100);
    const Degree100 aExpectShearAngle(-6572_deg100);
    CPPUNIT_ASSERT_MESSAGE("Hide rows, shear angle: ",
                           abs(aShearAngle - aExpectShearAngle) <= 1_deg100);
    CPPUNIT_ASSERT_MESSAGE("Hide rows, rotate angle: ",
                           abs(aRotateAngle - aExpectRotateAngle) <= 1);
                           abs(aRotateAngle - aExpectRotateAngle) <= 1_deg100);
    lcl_AssertRectEqualWithTolerance("Reload: wrong pos or size", aExpectRect, aSnapRect, 1);

    // Save and reload.
@@ -269,8 +270,10 @@
    aSnapRect = pObj->GetSnapRect();
    aRotateAngle = pObj->GetRotateAngle();
    aShearAngle = pObj->GetShearAngle();
    CPPUNIT_ASSERT_MESSAGE("Reload, shear angle: ", abs(aShearAngle - aExpectShearAngle) <= 3);
    CPPUNIT_ASSERT_MESSAGE("Reload, rotate angle: ", abs(aRotateAngle - aExpectRotateAngle) <= 3);
    CPPUNIT_ASSERT_MESSAGE("Reload, shear angle: ",
                           abs(aShearAngle - aExpectShearAngle) <= 3_deg100);
    CPPUNIT_ASSERT_MESSAGE("Reload, rotate angle: ",
                           abs(aRotateAngle - aExpectRotateAngle) <= 3_deg100);
    lcl_AssertRectEqualWithTolerance("Reload: wrong pos or size", aExpectRect, aSnapRect, 4);

    pDocSh->DoClose();
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 774f3eb..cbf2267 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -5715,9 +5715,9 @@
        SdrRectObj *pObj = new SdrRectObj(*pDrawLayer, aRect);
        pPage->InsertObject(pObj);
        Point aRef1(pObj->GetSnapRect().Center());
        int nAngle = 9000; //90 deg.
        double nSin = sin(nAngle * F_PI18000);
        double nCos = cos(nAngle * F_PI18000);
        Degree100 nAngle = 9000_deg100; //90 deg.
        double nSin = sin(nAngle.get() * F_PI18000);
        double nCos = cos(nAngle.get() * F_PI18000);
        pObj->Rotate(aRef1,nAngle,nSin,nCos);

        ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *m_pDoc, 0, true);
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index a44f0024..da8490b 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -1355,8 +1355,8 @@
        const ScRotateValueItem* pRotate = &pPattern->GetItem( ATTR_ROTATE_VALUE );
        // 90 or 270 degrees is former SvxOrientationItem - only look for other values
        // (see ScPatternAttr::GetCellOrientation)
        sal_Int32 nAngle = pRotate->GetValue();
        if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
        Degree100 nAngle = pRotate->GetValue();
        if ( nAngle && nAngle != 9000_deg100 && nAngle != 27000_deg100 )
            bFound = true;
    }
    if ( nMask & HasAttrFlags::NeedHeight )
diff --git a/sc/source/core/data/attrib.cxx b/sc/source/core/data/attrib.cxx
index 1a155a8..cb39fec 100644
--- a/sc/source/core/data/attrib.cxx
+++ b/sc/source/core/data/attrib.cxx
@@ -729,7 +729,7 @@
    xmlTextWriterEndElement(pWriter);
}

ScRotateValueItem::ScRotateValueItem(sal_Int32 nAngle)
ScRotateValueItem::ScRotateValueItem(Degree100 nAngle)
    : SdrAngleItem(ATTR_ROTATE_VALUE, nAngle)
{
}
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index d3d9910..22d5a16 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -211,7 +211,7 @@
    if ( bWidth && bBreak )     // after determining bAsianVertical (bBreak may be reset)
        return 0;

    tools::Long nRotate = 0;
    Degree100 nRotate(0);
    SvxRotateMode eRotMode = SVX_ROTATE_MODE_STANDARD;
    if ( eOrient == SvxCellOrientation::Standard )
    {
@@ -228,7 +228,7 @@
            else
                eRotMode = pPattern->GetItem(ATTR_ROTATE_MODE).GetValue();

            if ( nRotate == 18000 )
            if ( nRotate == 18000_deg100 )
                eRotMode = SVX_ROTATE_MODE_STANDARD;    // no overflow
        }
    }
@@ -237,7 +237,7 @@
    {
        // ignore orientation/rotation if "repeat" is active
        eOrient = SvxCellOrientation::Standard;
        nRotate = 0;
        nRotate = 0_deg100;
        bAsianVertical = false;
    }

@@ -301,7 +301,7 @@
            {
                //TODO: take different X/Y scaling into consideration

                double nRealOrient = nRotate * F_PI18000;   // nRotate is in 1/100 Grad
                double nRealOrient = nRotate.get() * F_PI18000;   // nRotate is in 1/100 Grad
                double nCosAbs = fabs( cos( nRealOrient ) );
                double nSinAbs = fabs( sin( nRealOrient ) );
                tools::Long nHeight = static_cast<tools::Long>( aSize.Height() * nCosAbs + aSize.Width() * nSinAbs );
@@ -482,7 +482,7 @@
            //TODO: take different X/Y scaling into consideration

            Size aSize( pEngine->CalcTextWidth(), pEngine->GetTextHeight() );
            double nRealOrient = nRotate * F_PI18000;   // nRotate is in 1/100 Grad
            double nRealOrient = nRotate.get() * F_PI18000;   // nRotate is in 1/100 Grad
            double nCosAbs = fabs( cos( nRealOrient ) );
            double nSinAbs = fabs( sin( nRealOrient ) );
            tools::Long nHeight = static_cast<tools::Long>( aSize.Height() * nCosAbs + aSize.Width() * nSinAbs );
diff --git a/sc/source/core/data/docpool.cxx b/sc/source/core/data/docpool.cxx
index 011b596..0a96c3b 100644
--- a/sc/source/core/data/docpool.cxx
+++ b/sc/source/core/data/docpool.cxx
@@ -249,7 +249,7 @@
    mvPoolDefaults[ ATTR_VER_JUSTIFY     - ATTR_STARTINDEX ] = new SvxVerJustifyItem( SvxCellVerJustify::Standard, ATTR_VER_JUSTIFY);
    mvPoolDefaults[ ATTR_VER_JUSTIFY_METHOD - ATTR_STARTINDEX ] = new SvxJustifyMethodItem( SvxCellJustifyMethod::Auto, ATTR_VER_JUSTIFY_METHOD);
    mvPoolDefaults[ ATTR_STACKED         - ATTR_STARTINDEX ] = new ScVerticalStackCell(false);
    mvPoolDefaults[ ATTR_ROTATE_VALUE    - ATTR_STARTINDEX ] = new ScRotateValueItem( 0 );
    mvPoolDefaults[ ATTR_ROTATE_VALUE    - ATTR_STARTINDEX ] = new ScRotateValueItem( 0_deg100 );
    mvPoolDefaults[ ATTR_ROTATE_MODE     - ATTR_STARTINDEX ] = new SvxRotateModeItem( SVX_ROTATE_MODE_BOTTOM, ATTR_ROTATE_MODE );
    mvPoolDefaults[ ATTR_VERTICAL_ASIAN  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_VERTICAL_ASIAN );
    //  The default for the ATTR_WRITINGDIR cell attribute must by SvxFrameDirection::Environment,
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index cb3212e..5bbdd06 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -5184,8 +5184,8 @@
        {
            // 90 or 270 degrees is former SvxOrientationItem - only look for other values
            // (see ScPatternAttr::GetCellOrientation)
            sal_Int32 nAngle = static_cast<const ScRotateValueItem*>(pItem)->GetValue();
            if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
            Degree100 nAngle = static_cast<const ScRotateValueItem*>(pItem)->GetValue();
            if ( nAngle && nAngle != 9000_deg100 && nAngle != 27000_deg100 )
            {
                bAnyItem = true;
                break;
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index 0a3433b..2f77588 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -165,10 +165,10 @@
    }
    else
    {
        sal_Int32 nAngle = GetItem( ATTR_ROTATE_VALUE, rItemSet, pCondSet ).GetValue();
        if( nAngle == 9000 )
        Degree100 nAngle = GetItem( ATTR_ROTATE_VALUE, rItemSet, pCondSet ).GetValue();
        if( nAngle == 9000_deg100 )
            eOrient = SvxCellOrientation::BottomUp;
        else if( nAngle == 27000 )
        else if( nAngle == 27000_deg100 )
            eOrient = SvxCellOrientation::TopBottom;
    }

@@ -1312,9 +1312,9 @@

//  GetRotateVal is tested before ATTR_ORIENTATION

tools::Long ScPatternAttr::GetRotateVal( const SfxItemSet* pCondSet ) const
Degree100 ScPatternAttr::GetRotateVal( const SfxItemSet* pCondSet ) const
{
    tools::Long nAttrRotate = 0;
    Degree100 nAttrRotate(0);
    if ( GetCellOrientation() == SvxCellOrientation::Standard )
    {
        bool bRepeat = ( GetItem(ATTR_HOR_JUSTIFY, pCondSet).
@@ -1330,22 +1330,22 @@
{
    ScRotateDir nRet = ScRotateDir::NONE;

    tools::Long nAttrRotate = GetRotateVal( pCondSet );
    Degree100 nAttrRotate = GetRotateVal( pCondSet );
    if ( nAttrRotate )
    {
        SvxRotateMode eRotMode = GetItem(ATTR_ROTATE_MODE, pCondSet).GetValue();

        if ( eRotMode == SVX_ROTATE_MODE_STANDARD || nAttrRotate == 18000 )
        if ( eRotMode == SVX_ROTATE_MODE_STANDARD || nAttrRotate == 18000_deg100 )
            nRet = ScRotateDir::Standard;
        else if ( eRotMode == SVX_ROTATE_MODE_CENTER )
            nRet = ScRotateDir::Center;
        else if ( eRotMode == SVX_ROTATE_MODE_TOP || eRotMode == SVX_ROTATE_MODE_BOTTOM )
        {
            tools::Long nRot180 = nAttrRotate % 18000;     // 1/100 degrees
            if ( nRot180 == 9000 )
            Degree100 nRot180 = nAttrRotate % 18000_deg100;     // 1/100 degrees
            if ( nRot180 == 9000_deg100 )
                nRet = ScRotateDir::Center;
            else if ( ( eRotMode == SVX_ROTATE_MODE_TOP && nRot180 < 9000 ) ||
                      ( eRotMode == SVX_ROTATE_MODE_BOTTOM && nRot180 > 9000 ) )
            else if ( ( eRotMode == SVX_ROTATE_MODE_TOP && nRot180 < 9000_deg100 ) ||
                      ( eRotMode == SVX_ROTATE_MODE_BOTTOM && nRot180 > 9000_deg100 ) )
                nRet = ScRotateDir::Left;
            else
                nRet = ScRotateDir::Right;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index d8fb7fa..1ddf299 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -2172,9 +2172,9 @@
            double nFactor = 0.0;
            if ( nCol > nX2+1 )
            {
                tools::Long nRotVal = pPattern->
                Degree100 nRotVal = pPattern->
                        GetItem( ATTR_ROTATE_VALUE, pCondSet ).GetValue();
                double nRealOrient = nRotVal * F_PI18000;   // 1/100 degree
                double nRealOrient = nRotVal.get() * F_PI18000;   // 1/100 degree
                double nCos = cos( nRealOrient );
                double nSin = sin( nRealOrient );
                //TODO: limit !!!
diff --git a/sc/source/core/tool/autoform.cxx b/sc/source/core/tool/autoform.cxx
index f8bb633..c7d70f4 100644
--- a/sc/source/core/tool/autoform.cxx
+++ b/sc/source/core/tool/autoform.cxx
@@ -189,7 +189,7 @@
    m_aStacked = std::make_unique<ScVerticalStackCell>();
    m_aMargin = std::make_unique<SvxMarginItem>(ATTR_MARGIN);
    m_aLinebreak = std::make_unique<ScLineBreakCell>();
    m_aRotateAngle = std::make_unique<ScRotateValueItem>(0);
    m_aRotateAngle = std::make_unique<ScRotateValueItem>(0_deg100);
    m_aRotateMode = std::make_unique<SvxRotateModeItem>(SVX_ROTATE_MODE_STANDARD, ATTR_ROTATE_MODE);
}

diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index 48bc5df..7a56260 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -1489,7 +1489,7 @@
            else
            {
                // rotation
                sal_Int32 nScRot = rItemSet.Get( ATTR_ROTATE_VALUE ).GetValue();
                Degree100 nScRot = rItemSet.Get( ATTR_ROTATE_VALUE ).GetValue();
                mnRotation = XclTools::GetXclRotation( nScRot );
                bUsed |= ScfTools::CheckItem( rItemSet, ATTR_ROTATE_VALUE, bStyle );
            }
diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx
index 16b64c8..81cee0d 100644
--- a/sc/source/filter/excel/xichart.cxx
+++ b/sc/source/filter/excel/xichart.cxx
@@ -1202,18 +1202,18 @@
        // the call to XShape.getSize() may recalc the chart view
        css::awt::Size aTitleSize = xTitleShape->getSize();
        // rotated titles need special handling...
        sal_Int32 nScRot = XclTools::GetScRotation( GetRotation(), 0 );
        double fRad = nScRot * F_PI18000;
        Degree100 nScRot = XclTools::GetScRotation( GetRotation(), 0_deg100 );
        double fRad = nScRot.get() * F_PI18000;
        double fSin = fabs( sin( fRad ) );
        // calculate the title position from the values in the CHTEXT record
        css::awt::Point aTitlePos(
            CalcHmmFromChartX( maData.maRect.mnX ),
            CalcHmmFromChartY( maData.maRect.mnY ) );
        // add part of height to X direction, if title is rotated down (clockwise)
        if( nScRot > 18000 )
        if( nScRot > 18000_deg100 )
            aTitlePos.X += static_cast< sal_Int32 >( fSin * aTitleSize.Height + 0.5 );
        // add part of width to Y direction, if title is rotated up (counterclockwise)
        else if( nScRot > 0 )
        else if( nScRot > 0_deg100 )
            aTitlePos.Y += static_cast< sal_Int32 >( fSin * aTitleSize.Width + 0.5 );
        // set the resulting position at the title shape
        xTitleShape->setPosition( aTitlePos );
diff --git a/sc/source/filter/excel/xiescher.cxx b/sc/source/filter/excel/xiescher.cxx
index a4ceae5..0e46318 100644
--- a/sc/source/filter/excel/xiescher.cxx
+++ b/sc/source/filter/excel/xiescher.cxx
@@ -1289,32 +1289,32 @@
SdrObjectUniquePtr XclImpArcObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const tools::Rectangle& rAnchorRect ) const
{
    tools::Rectangle aNewRect = rAnchorRect;
    tools::Long nStartAngle = 0;
    tools::Long nEndAngle = 0;
    Degree100 nStartAngle;
    Degree100 nEndAngle;
    switch( mnQuadrant )
    {
        default:
        case EXC_OBJ_ARC_TR:
            nStartAngle = 0;
            nEndAngle = 9000;
            nStartAngle = 0_deg100;
            nEndAngle = 9000_deg100;
            aNewRect.AdjustLeft( -(rAnchorRect.GetWidth()) );
            aNewRect.AdjustBottom(rAnchorRect.GetHeight() );
        break;
        case EXC_OBJ_ARC_TL:
            nStartAngle = 9000;
            nEndAngle = 18000;
            nStartAngle = 9000_deg100;
            nEndAngle = 18000_deg100;
            aNewRect.AdjustRight(rAnchorRect.GetWidth() );
            aNewRect.AdjustBottom(rAnchorRect.GetHeight() );
        break;
        case EXC_OBJ_ARC_BL:
            nStartAngle = 18000;
            nEndAngle = 27000;
            nStartAngle = 18000_deg100;
            nEndAngle = 27000_deg100;
            aNewRect.AdjustRight(rAnchorRect.GetWidth() );
            aNewRect.AdjustTop( -(rAnchorRect.GetHeight()) );
        break;
        case EXC_OBJ_ARC_BR:
            nStartAngle = 27000;
            nEndAngle = 0;
            nStartAngle = 27000_deg100;
            nEndAngle = 0_deg100;
            aNewRect.AdjustLeft( -(rAnchorRect.GetWidth()) );
            aNewRect.AdjustTop( -(rAnchorRect.GetHeight()) );
        break;
diff --git a/sc/source/filter/excel/xistyle.cxx b/sc/source/filter/excel/xistyle.cxx
index 7a263bc..5a0ca785 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -834,7 +834,7 @@
    bool bStacked = (nXclRot == EXC_ROT_STACKED);
    ScfTools::PutItem( rItemSet, ScVerticalStackCell( bStacked ), bSkipPoolDefs );
    // set an angle in the range from -90 to 90 degrees
    sal_Int32 nAngle = XclTools::GetScRotation( nXclRot, 0 );
    Degree100 nAngle = XclTools::GetScRotation( nXclRot, 0_deg100 );
    ScfTools::PutItem( rItemSet, ScRotateValueItem( nAngle ), bSkipPoolDefs );
    // set "Use asian vertical layout", if cell is stacked and font contains CKJ characters
    bool bAsianVert = bStacked && pFont && pFont->HasAsianChars();
diff --git a/sc/source/filter/excel/xlchart.cxx b/sc/source/filter/excel/xlchart.cxx
index 0355a56..3503ba9 100644
--- a/sc/source/filter/excel/xlchart.cxx
+++ b/sc/source/filter/excel/xlchart.cxx
@@ -897,7 +897,7 @@
    rPropSet.GetProperty( fAngle, EXC_CHPROP_TEXTROTATION );
    bool bStacked = bSupportsStacked && rPropSet.GetBoolProperty( EXC_CHPROP_STACKCHARACTERS );
    return bStacked ? EXC_ROT_STACKED :
        XclTools::GetXclRotation( static_cast< sal_Int32 >( fAngle * 100.0 + 0.5 ) );
        XclTools::GetXclRotation( Degree100(static_cast< sal_Int32 >( fAngle * 100.0 + 0.5 )) );
}

// write properties -----------------------------------------------------------
@@ -1097,7 +1097,7 @@
    if( nRotation != EXC_CHART_AUTOROTATION )
    {
        // chart2 handles rotation as double in the range [0,360)
        double fAngle = XclTools::GetScRotation( nRotation, 0 ) / 100.0;
        double fAngle = XclTools::GetScRotation( nRotation, 0_deg100 ).get() / 100.0;
        rPropSet.SetProperty( EXC_CHPROP_TEXTROTATION, fAngle );
        if( bSupportsStacked )
            rPropSet.SetProperty( EXC_CHPROP_STACKCHARACTERS, nRotation == EXC_ROT_STACKED );
diff --git a/sc/source/filter/excel/xltools.cxx b/sc/source/filter/excel/xltools.cxx
index ca0aeb2..1c56279 100644
--- a/sc/source/filter/excel/xltools.cxx
+++ b/sc/source/filter/excel/xltools.cxx
@@ -150,17 +150,17 @@
    return false;
}

sal_Int32 XclTools::GetScRotation( sal_uInt16 nXclRot, sal_Int32 nRotForStacked )
Degree100 XclTools::GetScRotation( sal_uInt16 nXclRot, Degree100 nRotForStacked )
{
    if( nXclRot == EXC_ROT_STACKED )
        return nRotForStacked;
    OSL_ENSURE( nXclRot <= 180, "XclTools::GetScRotation - illegal rotation angle" );
    return static_cast< sal_Int32 >( (nXclRot <= 180) ? (100 * ((nXclRot > 90) ? (450 - nXclRot) : nXclRot)) : 0 );
    return Degree100(static_cast< sal_Int32 >( (nXclRot <= 180) ? (100 * ((nXclRot > 90) ? (450 - nXclRot) : nXclRot)) : 0 ));
}

sal_uInt8 XclTools::GetXclRotation( sal_Int32 nScRot )
sal_uInt8 XclTools::GetXclRotation( Degree100 nScRot )
{
    sal_Int32 nXclRot = nScRot / 100;
    sal_Int32 nXclRot = nScRot.get() / 100;
    if( (0 <= nXclRot) && (nXclRot <= 90) )
        return static_cast< sal_uInt8 >( nXclRot );
    if( nXclRot < 180 )
diff --git a/sc/source/filter/html/htmlexp2.cxx b/sc/source/filter/html/htmlexp2.cxx
index af00edd..3ec4796 100644
--- a/sc/source/filter/html/htmlexp2.cxx
+++ b/sc/source/filter/html/htmlexp2.cxx
@@ -133,7 +133,7 @@
        {
            const SdrGrafObj* pSGO = static_cast<SdrGrafObj*>(pObject);
            const SdrGrafObjGeoData* pGeo = static_cast<SdrGrafObjGeoData*>(pSGO->GetGeoData());
            sal_uInt16 nMirrorCase = (pGeo->aGeo.nRotationAngle == 18000 ?
            sal_uInt16 nMirrorCase = (pGeo->aGeo.nRotationAngle == 18000_deg100 ?
                    ( pGeo->bMirrored ? 3 : 4 ) : ( pGeo->bMirrored ? 2 : 1 ));
            bool bHMirr = ( ( nMirrorCase == 2 ) || ( nMirrorCase == 4 ) );
            bool bVMirr = ( ( nMirrorCase == 3 ) || ( nMirrorCase == 4 ) );
diff --git a/sc/source/filter/inc/stylesbuffer.hxx b/sc/source/filter/inc/stylesbuffer.hxx
index f52cad5..bb786d0 100644
--- a/sc/source/filter/inc/stylesbuffer.hxx
+++ b/sc/source/filter/inc/stylesbuffer.hxx
@@ -290,7 +290,7 @@
    sal_Int32                    mnVerJustify;       /// Vertical alignment.
    sal_Int32                    mnVerJustifyMethod;
    css::table::CellOrientation  meOrientation;      /// Normal or stacked text.
    sal_Int32                    mnRotation;         /// Text rotation angle.
    Degree100                    mnRotation;         /// Text rotation angle.
    sal_Int16                    mnWritingMode;      /// CTL text direction.
    sal_Int16                    mnIndent;           /// Indentation.
    bool                         mbWrapText;         /// True = multi-line text.
diff --git a/sc/source/filter/inc/xltools.hxx b/sc/source/filter/inc/xltools.hxx
index 51f86fe8..9b77c88 100644
--- a/sc/source/filter/inc/xltools.hxx
+++ b/sc/source/filter/inc/xltools.hxx
@@ -24,6 +24,7 @@
#include "ftools.hxx"

#include <tools/long.hxx>
#include <tools/degree.hxx>

class SfxObjectShell;
enum class FormulaError : sal_uInt16;
@@ -108,9 +109,9 @@

    /** Calculates an angle (in 1/100 of degrees) from an Excel angle value.
        @param nRotForStacked  This value will be returned, if nXclRot contains 'stacked'. */
    static sal_Int32    GetScRotation( sal_uInt16 nXclRot, sal_Int32 nRotForStacked );
    static Degree100    GetScRotation( sal_uInt16 nXclRot, Degree100 nRotForStacked );
    /** Calculates the Excel angle value from an angle in 1/100 of degrees. */
    static sal_uInt8    GetXclRotation( sal_Int32 nScRot );
    static sal_uInt8    GetXclRotation( Degree100 nScRot );

    /** Calculates BIFF8 rotation angle from BIFF2-BIFF5 text orientation. */
    static sal_uInt8    GetXclRotFromOrient( sal_uInt8 nXclOrient );
diff --git a/sc/source/filter/oox/stylesbuffer.cxx b/sc/source/filter/oox/stylesbuffer.cxx
index 21fef59..e688a52 100644
--- a/sc/source/filter/oox/stylesbuffer.cxx
+++ b/sc/source/filter/oox/stylesbuffer.cxx
@@ -1196,9 +1196,9 @@

    // rotation: 0-90 means 0 to 90 degrees ccw, 91-180 means 1 to 90 degrees cw, 255 means stacked
    sal_Int32 nOoxRot = maModel.mnRotation;
    maApiData.mnRotation = ((0 <= nOoxRot) && (nOoxRot <= 90)) ?
    maApiData.mnRotation = Degree100(((0 <= nOoxRot) && (nOoxRot <= 90)) ?
        (100 * nOoxRot) :
        (((91 <= nOoxRot) && (nOoxRot <= 180)) ? (100 * (450 - nOoxRot)) : 0);
        (((91 <= nOoxRot) && (nOoxRot <= 180)) ? (100 * (450 - nOoxRot)) : 0));

    // "Orientation" property used for character stacking
    maApiData.meOrientation = (nOoxRot == OOX_XF_ROTATION_STACKED) ?
@@ -2203,7 +2203,7 @@
        sal_Int32 nBorderId = maModel.mbBorderUsed ? maModel.mnBorderId : (pStyleXf ? pStyleXf->maModel.mnBorderId : -1);
        if( const Border* pBorder = rStyles.getBorder( nBorderId ).get() )
        {
            if( (pAlignment->getApiData().mnRotation != 0) && pBorder->getApiData().hasAnyOuterBorder() )
            if( (pAlignment->getApiData().mnRotation) && pBorder->getApiData().hasAnyOuterBorder() )
            {
                meRotationRef = css::table::CellVertJustify2::BOTTOM;
                eRotateMode = SVX_ROTATE_MODE_BOTTOM;
diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx
index da087a9..fa374c4 100644
--- a/sc/source/filter/xcl97/xcl97rec.cxx
+++ b/sc/source/filter/xcl97/xcl97rec.cxx
@@ -866,10 +866,10 @@
    SetVerAlign( lcl_GetVerAlignFromItemSet( rItemSet ) );

    // rotation
    tools::Long nAngle = rTextObj.GetRotateAngle();
    if( (4500 < nAngle) && (nAngle < 13500) )
    Degree100 nAngle = rTextObj.GetRotateAngle();
    if( (4500_deg100 < nAngle) && (nAngle < 13500_deg100) )
        mnRotation = EXC_OBJ_ORIENT_90CCW;
    else if( (22500 < nAngle) && (nAngle < 31500) )
    else if( (22500_deg100 < nAngle) && (nAngle < 31500_deg100) )
        mnRotation = EXC_OBJ_ORIENT_90CW;
    else
        mnRotation = EXC_OBJ_ORIENT_NONE;
@@ -1095,8 +1095,8 @@
    SdrObject* pObj = SdrObject::getSdrObjectFromXShape(rShape.get());
    if (pObj)
    {
        sal_Int32 nRotation = pObj->GetRotateAngle();
        if (nRotation != 0)
        Degree100 nRotation = pObj->GetRotateAngle();
        if (nRotation)
        {
            sal_Int16 nHalfWidth = aSize.Width / 2;
            sal_Int16 nHalfHeight = aSize.Height / 2;
@@ -1111,7 +1111,7 @@
            // MSO changes the anchor positions at these angles and that does an extra 90 degrees
            // rotation on our shapes, so we output it in such position that MSO
            // can draw this shape correctly.
            if ((nRotation >= 45 * 100 && nRotation < 135 * 100) || (nRotation >= 225 * 100 && nRotation < 315 * 100))
            if ((nRotation >= 4500_deg100 && nRotation < 13500_deg100) || (nRotation >= 22500_deg100 && nRotation < 31500_deg100))
            {
                aTopLeft.X = aTopLeft.X - nHalfHeight + nHalfWidth;
                aTopLeft.Y = aTopLeft.Y - nHalfWidth + nHalfHeight;
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index 5bc1ff2..768e42d 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -3511,7 +3511,7 @@
            if (pObj)
            {
                pObjData = ScDrawLayer::GetObjData(pObj);
                bIsShapeTransformed = pObj->GetRotateAngle() != 0 || pObj->GetShearAngle() != 0;
                bIsShapeTransformed = pObj->GetRotateAngle() != 0_deg100 || pObj->GetShearAngle() != 0_deg100;
            }
            if (bIsShapeTransformed && pObjData)
                aSnapStartAddress = pObjData->maStart;
diff --git a/sc/source/ui/Accessibility/AccessibleCell.cxx b/sc/source/ui/Accessibility/AccessibleCell.cxx
index 0f6fd86..734e9e0 100644
--- a/sc/source/ui/Accessibility/AccessibleCell.cxx
+++ b/sc/source/ui/Accessibility/AccessibleCell.cxx
@@ -190,7 +190,7 @@
        if (mpDoc)
        {
            const ScRotateValueItem* pItem = mpDoc->GetAttr( maCellAddress, ATTR_ROTATE_VALUE );
            if( pItem && (pItem->GetValue() != 0) )
            if( pItem && (pItem->GetValue() != 0_deg100) )
            {
                tools::Rectangle aParaRect = GetParagraphBoundingBox();
                if( !aParaRect.IsEmpty() && (aCellRect.GetWidth() < aParaRect.GetWidth()) )
diff --git a/sc/source/ui/Accessibility/AccessibleText.cxx b/sc/source/ui/Accessibility/AccessibleText.cxx
index 3166fbd..31f8586 100644
--- a/sc/source/ui/Accessibility/AccessibleText.cxx
+++ b/sc/source/ui/Accessibility/AccessibleText.cxx
@@ -536,7 +536,7 @@
            the cell bounding box in ScAccessibleCell::GetBoundingBox()
            (see sc/source/ui/Accessibility/AccessibleCell.cxx). */
        const ScRotateValueItem* pItem = rDoc.GetAttr( aCellPos, ATTR_ROTATE_VALUE );
        if( pItem && (pItem->GetValue() != 0) )
        if( pItem && (pItem->GetValue() != 0_deg100) )
        {
            pEditEngine->SetPaperSize( Size( LONG_MAX, aSize.getHeight() ) );
            tools::Long nTxtWidth = static_cast< tools::Long >( pEditEngine->CalcTextWidth() );
diff --git a/sc/source/ui/drawfunc/fuconarc.cxx b/sc/source/ui/drawfunc/fuconarc.cxx
index 368a1fd..5d85181 100644
--- a/sc/source/ui/drawfunc/fuconarc.cxx
+++ b/sc/source/ui/drawfunc/fuconarc.cxx
@@ -136,8 +136,8 @@
            pObj->SetLogicRect(aRect);

            SfxItemSet aAttr(pDrDoc->GetItemPool());
            aAttr.Put(makeSdrCircStartAngleItem(9000));
            aAttr.Put(makeSdrCircEndAngleItem(0));
            aAttr.Put(makeSdrCircStartAngleItem(9000_deg100));
            aAttr.Put(makeSdrCircEndAngleItem(0_deg100));

            pObj->SetMergedItemSet(aAttr);
        }
diff --git a/sc/source/ui/drawfunc/fuconcustomshape.cxx b/sc/source/ui/drawfunc/fuconcustomshape.cxx
index 75edd8b..e73c6d9 100644
--- a/sc/source/ui/drawfunc/fuconcustomshape.cxx
+++ b/sc/source/ui/drawfunc/fuconcustomshape.cxx
@@ -180,7 +180,7 @@
                                    EE_ITEMS_START, EE_ITEMS_END>{});
                            aDest.Set( rSource );
                            pObj->SetMergedItemSet( aDest );
                            sal_Int32 nAngle = pSourceObj->GetRotateAngle();
                            Degree100 nAngle = pSourceObj->GetRotateAngle();
                            if ( nAngle )
                                pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle );
                            bAttributesAppliedFromGallery = true;
diff --git a/sc/source/ui/inc/output.hxx b/sc/source/ui/inc/output.hxx
index 528b4ef..f278d25 100644
--- a/sc/source/ui/inc/output.hxx
+++ b/sc/source/ui/inc/output.hxx
@@ -27,6 +27,7 @@
#include <tools/gen.hxx>
#include <editeng/svxenum.hxx>
#include <vcl/outdev.hxx>
#include <tools/degree.hxx>
#include <o3tl/deleter.hxx>
#include <optional>

@@ -256,7 +257,7 @@

    void            ShrinkEditEngine( EditEngine& rEngine, const tools::Rectangle& rAlignRect,
                                    tools::Long nLeftM, tools::Long nTopM, tools::Long nRightM, tools::Long nBottomM,
                                    bool bWidth, SvxCellOrientation nOrient, tools::Long nAttrRotate, bool bPixelToLogic,
                                    bool bWidth, SvxCellOrientation nOrient, Degree100 nAttrRotate, bool bPixelToLogic,
                                    tools::Long& rEngineWidth, tools::Long& rEngineHeight, tools::Long& rNeededPixel,
                                    bool& rLeftClip, bool& rRightClip );

diff --git a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
index 7c51f5d..24396c7 100644
--- a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
+++ b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
@@ -155,7 +155,7 @@

IMPL_LINK_NOARG( AlignmentPropertyPanel, AngleModifiedHdl, weld::MetricSpinButton&, void )
{
    sal_uInt32 nAngle = mxMtrAngle->get_value(FieldUnit::DEGREE) * 100;
    Degree100 nAngle(mxMtrAngle->get_value(FieldUnit::DEGREE) * 100);
    ScRotateValueItem aAngleItem(nAngle);

    GetBindings()->GetDispatcher()->ExecuteList(
@@ -345,8 +345,8 @@
    case SID_ATTR_ALIGN_DEGREES:
        if (eState >= SfxItemState::DEFAULT)
        {
            tools::Long nTmp = static_cast<const ScRotateValueItem*>(pState)->GetValue();
            mxMtrAngle->set_value(nTmp / 100, FieldUnit::DEGREE);
            Degree100 nTmp = static_cast<const ScRotateValueItem*>(pState)->GetValue();
            mxMtrAngle->set_value(nTmp.get() / 100, FieldUnit::DEGREE);
        }
        else
        {
diff --git a/sc/source/ui/unoobj/afmtuno.cxx b/sc/source/ui/unoobj/afmtuno.cxx
index 6dbf2c5..d56c6d5 100644
--- a/sc/source/ui/unoobj/afmtuno.cxx
+++ b/sc/source/ui/unoobj/afmtuno.cxx
@@ -594,11 +594,11 @@
                            break;
                            case table::CellOrientation_TOPBOTTOM:
                                pData->PutItem( nFieldIndex, ScVerticalStackCell( false ) );
                                pData->PutItem( nFieldIndex, ScRotateValueItem( 27000 ) );
                                pData->PutItem( nFieldIndex, ScRotateValueItem( 27000_deg100 ) );
                            break;
                            case table::CellOrientation_BOTTOMTOP:
                                pData->PutItem( nFieldIndex, ScVerticalStackCell( false ) );
                                pData->PutItem( nFieldIndex, ScRotateValueItem( 9000 ) );
                                pData->PutItem( nFieldIndex, ScRotateValueItem( 9000_deg100 ) );
                            break;
                            case table::CellOrientation_STACKED:
                                pData->PutItem( nFieldIndex, ScVerticalStackCell( true ) );
@@ -684,7 +684,7 @@
                    case ATTR_STACKED:
                    {
                        const ScRotateValueItem* pRotItem = pData->GetItem( nFieldIndex, ATTR_ROTATE_VALUE );
                        sal_Int32 nRot = pRotItem ? pRotItem->GetValue() : 0;
                        Degree100 nRot = pRotItem ? pRotItem->GetValue() : 0_deg100;
                        bool bStacked = static_cast<const ScVerticalStackCell*>(pItem)->GetValue();
                        SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( aVal );
                    }
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 5ab4798..4647b2b 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -2109,7 +2109,7 @@
                if ( nRotVal < 0 )
                    nRotVal += 36000;

                rSet.Put( ScRotateValueItem( nRotVal ) );
                rSet.Put( ScRotateValueItem( Degree100(nRotVal) ) );

            }
            break;
@@ -2125,12 +2125,12 @@
                        break;
                        case table::CellOrientation_TOPBOTTOM:
                            rSet.Put( ScVerticalStackCell( false ) );
                            rSet.Put( ScRotateValueItem( 27000 ) );
                            rSet.Put( ScRotateValueItem( 27000_deg100 ) );
                            rSecondItemId = ATTR_ROTATE_VALUE;
                        break;
                        case table::CellOrientation_BOTTOMTOP:
                            rSet.Put( ScVerticalStackCell( false ) );
                            rSet.Put( ScRotateValueItem( 9000 ) );
                            rSet.Put( ScRotateValueItem( 9000_deg100 ) );
                            rSecondItemId = ATTR_ROTATE_VALUE;
                        break;
                        case table::CellOrientation_STACKED:
@@ -2412,7 +2412,7 @@
                    break;
                case ATTR_STACKED:
                    {
                        sal_Int32 nRot = pDataSet->Get(ATTR_ROTATE_VALUE).GetValue();
                        Degree100 nRot = pDataSet->Get(ATTR_ROTATE_VALUE).GetValue();
                        bool bStacked = static_cast<const ScVerticalStackCell&>(pDataSet->Get(pEntry->nWID)).GetValue();
                        SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( rAny );
                    }
diff --git a/sc/source/ui/unoobj/styleuno.cxx b/sc/source/ui/unoobj/styleuno.cxx
index 81db396..8df4b35 100644
--- a/sc/source/ui/unoobj/styleuno.cxx
+++ b/sc/source/ui/unoobj/styleuno.cxx
@@ -1551,7 +1551,7 @@
                                nRotVal %= 36000;
                                if (nRotVal < 0)
                                    nRotVal += 36000;
                                rSet.Put(ScRotateValueItem(nRotVal));
                                rSet.Put(ScRotateValueItem(Degree100(nRotVal)));
                            }
                        }
                        break;
@@ -1567,11 +1567,11 @@
                                    break;
                                    case table::CellOrientation_TOPBOTTOM:
                                        rSet.Put(ScVerticalStackCell(false));
                                        rSet.Put(ScRotateValueItem(27000));
                                        rSet.Put(ScRotateValueItem(27000_deg100));
                                    break;
                                    case table::CellOrientation_BOTTOMTOP:
                                        rSet.Put(ScVerticalStackCell(false));
                                        rSet.Put(ScRotateValueItem(9000));
                                        rSet.Put(ScRotateValueItem(9000_deg100));
                                    break;
                                    case table::CellOrientation_STACKED:
                                        rSet.Put(ScVerticalStackCell(true));
@@ -1811,7 +1811,7 @@
                        break;
                    case ATTR_STACKED:
                        {
                            sal_Int32 nRot = pItemSet->Get(ATTR_ROTATE_VALUE).GetValue();
                            Degree100 nRot = pItemSet->Get(ATTR_ROTATE_VALUE).GetValue();
                            bool bStacked = static_cast<const ScVerticalStackCell&>(pItemSet->Get(nWhich)).GetValue();
                            SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( aAny );
                        }
diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx
index d46c996..1da5dff 100644
--- a/sc/source/ui/view/output.cxx
+++ b/sc/source/ui/view/output.cxx
@@ -650,9 +650,9 @@
                        if(nTargetX >= 0 && nTargetY >= 0)
                        {
                            // add rotation info to Array information
                            const tools::Long nAttrRotate(pPattern->GetRotateVal(pCondSet));
                            const Degree100 nAttrRotate(pPattern->GetRotateVal(pCondSet));
                            const SvxRotateMode eRotMode(pPattern->GetItem(ATTR_ROTATE_MODE, pCondSet).GetValue());
                            const double fOrient((bLayoutRTL ? -1.0 : 1.0) * nAttrRotate * F_PI18000); // 1/100th degrees -> [0..2PI]
                            const double fOrient((bLayoutRTL ? -1.0 : 1.0) * toRadians(nAttrRotate)); // 1/100th degrees -> [0..2PI]
                            svx::frame::Array& rArray = mrTabInfo.maArray;

                            rArray.SetCellRotation(nTargetX, nTargetY, eRotMode, fOrient);
@@ -671,7 +671,7 @@

    ScRotateDir nRet = ScRotateDir::NONE;

    tools::Long nAttrRotate = pPattern->GetRotateVal( pCondSet );
    Degree100 nAttrRotate = pPattern->GetRotateVal( pCondSet );
    if ( nAttrRotate )
    {
        SvxRotateMode eRotMode =
@@ -683,7 +683,7 @@
            nRet = ScRotateDir::Center;
        else if ( eRotMode == SVX_ROTATE_MODE_TOP || eRotMode == SVX_ROTATE_MODE_BOTTOM )
        {
            tools::Long nRot180 = nAttrRotate % 18000;     // 1/100 degree
            tools::Long nRot180 = nAttrRotate.get() % 18000;     // 1/100 degree
            if ( nRot180 == 9000 )
                nRet = ScRotateDir::Center;
            else if ( ( eRotMode == SVX_ROTATE_MODE_TOP && nRot180 < 9000 ) ||
@@ -1549,7 +1549,7 @@

                    //! LastPattern etc.

                    tools::Long nAttrRotate = pPattern->GetRotateVal( pCondSet );
                    Degree100 nAttrRotate = pPattern->GetRotateVal( pCondSet );
                    SvxRotateMode eRotMode =
                                    pPattern->GetItem(ATTR_ROTATE_MODE, pCondSet).GetValue();

@@ -1578,7 +1578,7 @@

                        // inclusion of the sign here hasn't been decided yet
                        // (if not, the extension of the non-rotated background must also be changed)
                        double nRealOrient = nLayoutSign * nAttrRotate * F_PI18000;     // 1/100th degrees
                        double nRealOrient = nLayoutSign * toRadians(nAttrRotate);     // 1/100th degrees
                        double nCos = cos(nRealOrient);
                        double nSin = sin(nRealOrient);
                        //! restrict !!!
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index a790cb8..764919b 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -360,7 +360,7 @@
    {
        case SvxCellOrientation::Standard:
            nRot = 0;
            bRotated = pPattern->GetItem( ATTR_ROTATE_VALUE, pCondSet ).GetValue() != 0 &&
            bRotated = pPattern->GetItem( ATTR_ROTATE_VALUE, pCondSet ).GetValue() != 0_deg100 &&
                       !bRepeat;
            break;
        case SvxCellOrientation::Stacked:
@@ -2209,7 +2209,7 @@
        rEngine.SetUpdateMode( true );
}

static tools::Long lcl_GetEditSize( EditEngine& rEngine, bool bWidth, bool bSwap, tools::Long nAttrRotate )
static tools::Long lcl_GetEditSize( EditEngine& rEngine, bool bWidth, bool bSwap, Degree100 nAttrRotate )
{
    if ( bSwap )
        bWidth = !bWidth;
@@ -2221,7 +2221,7 @@

        // assuming standard mode, otherwise width isn't used

        double nRealOrient = nAttrRotate * F_PI18000;   // 1/100th degrees
        double nRealOrient = toRadians(nAttrRotate);   // 1/100th degrees
        double nAbsCos = fabs( cos( nRealOrient ) );
        double nAbsSin = fabs( sin( nRealOrient ) );
        if ( bWidth )
@@ -2237,7 +2237,7 @@

void ScOutputData::ShrinkEditEngine( EditEngine& rEngine, const tools::Rectangle& rAlignRect,
            tools::Long nLeftM, tools::Long nTopM, tools::Long nRightM, tools::Long nBottomM,
            bool bWidth, SvxCellOrientation nOrient, tools::Long nAttrRotate, bool bPixelToLogic,
            bool bWidth, SvxCellOrientation nOrient, Degree100 nAttrRotate, bool bPixelToLogic,
            tools::Long& rEngineWidth, tools::Long& rEngineHeight, tools::Long& rNeededPixel, bool& rLeftClip, bool& rRightClip )
{
    if ( !bWidth )
@@ -2815,13 +2815,13 @@

    bool bRepeat = (rParam.meHorJustAttr == SvxCellHorJustify::Repeat && !rParam.mbBreak);
    bool bShrink = !rParam.mbBreak && !bRepeat && lcl_GetBoolValue(*rParam.mpPattern, ATTR_SHRINKTOFIT, rParam.mpCondSet);
    tools::Long nAttrRotate = lcl_GetValue<ScRotateValueItem, long>(*rParam.mpPattern, ATTR_ROTATE_VALUE, rParam.mpCondSet);
    Degree100 nAttrRotate = lcl_GetValue<ScRotateValueItem, Degree100>(*rParam.mpPattern, ATTR_ROTATE_VALUE, rParam.mpCondSet);

    if ( rParam.meHorJustAttr == SvxCellHorJustify::Repeat )
    {
        // ignore orientation/rotation if "repeat" is active
        rParam.meOrient = SvxCellOrientation::Standard;
        nAttrRotate = 0;
        nAttrRotate = 0_deg100;

        // #i31843# "repeat" with "line breaks" is treated as default alignment
        // (but rotation is still disabled).
@@ -2937,7 +2937,7 @@
        {
            ShrinkEditEngine( *rParam.mpEngine, aAreaParam.maAlignRect,
                nLeftM, nTopM, nRightM, nBottomM, true,
                rParam.meOrient, 0, rParam.mbPixelToLogic,
                rParam.meOrient, 0_deg100, rParam.mbPixelToLogic,
                nEngineWidth, nEngineHeight, nNeededPixel,
                aAreaParam.mbLeftClip, aAreaParam.mbRightClip );
        }
@@ -3307,7 +3307,7 @@
        {
            ShrinkEditEngine( *rParam.mpEngine, aAreaParam.maAlignRect,
                nLeftM, nTopM, nRightM, nBottomM, false,
                (rParam.meOrient), 0, rParam.mbPixelToLogic,
                (rParam.meOrient), 0_deg100, rParam.mbPixelToLogic,
                nEngineWidth, nEngineHeight, nNeededPixel,
                aAreaParam.mbLeftClip, aAreaParam.mbRightClip );
        }
@@ -3550,7 +3550,7 @@
        {
            ShrinkEditEngine( *rParam.mpEngine, aAreaParam.maAlignRect,
                nLeftM, nTopM, nRightM, nBottomM, false,
                rParam.meOrient, 0, rParam.mbPixelToLogic,
                rParam.meOrient, 0_deg100, rParam.mbPixelToLogic,
                nEngineWidth, nEngineHeight, nNeededPixel,
                aAreaParam.mbLeftClip, aAreaParam.mbRightClip );
        }
@@ -3805,7 +3805,7 @@

        ShrinkEditEngine( *rParam.mpEngine, aAreaParam.maAlignRect,
            nLeftM, nTopM, nRightM, nBottomM, true,
            rParam.meOrient, 0, rParam.mbPixelToLogic,
            rParam.meOrient, 0_deg100, rParam.mbPixelToLogic,
            nEngineWidth, nEngineHeight, nNeededPixel,
            aAreaParam.mbLeftClip, aAreaParam.mbRightClip );

@@ -3990,7 +3990,7 @@

    bool bHidden = false;
    bool bShrink = !rParam.mbBreak && lcl_GetBoolValue(*rParam.mpPattern, ATTR_SHRINKTOFIT, rParam.mpCondSet);
    tools::Long nAttrRotate = lcl_GetValue<ScRotateValueItem, long>(*rParam.mpPattern, ATTR_ROTATE_VALUE, rParam.mpCondSet);
    Degree100 nAttrRotate = lcl_GetValue<ScRotateValueItem, Degree100>(*rParam.mpPattern, ATTR_ROTATE_VALUE, rParam.mpCondSet);

    if (nAttrRotate)
    {
@@ -4104,7 +4104,7 @@
    {
        ShrinkEditEngine( *rParam.mpEngine, aAreaParam.maAlignRect,
            nLeftM, nTopM, nRightM, nBottomM, false,
            rParam.meOrient, 0, rParam.mbPixelToLogic,
            rParam.meOrient, 0_deg100, rParam.mbPixelToLogic,
            nEngineWidth, nEngineHeight, nNeededPixel,
            aAreaParam.mbLeftClip, aAreaParam.mbRightClip );
    }
@@ -4633,7 +4633,7 @@
                            nOutHeight -= nTopM + nBottomM;

                            // rotate here already, to adjust paper size for page breaks
                            tools::Long nAttrRotate = 0;
                            Degree100 nAttrRotate;
                            double nSin = 0.0;
                            double nCos = 1.0;
                            SvxRotateMode eRotMode = SVX_ROTATE_MODE_STANDARD;
@@ -4645,13 +4645,13 @@
                                {
                                    eRotMode = pPattern->GetItem(ATTR_ROTATE_MODE, pCondSet).GetValue();

                                    if ( nAttrRotate == 18000 )
                                    if ( nAttrRotate == 18000_deg100 )
                                        eRotMode = SVX_ROTATE_MODE_STANDARD;    // no overflow

                                    if ( bLayoutRTL )
                                        nAttrRotate = -nAttrRotate;

                                    double nRealOrient = nAttrRotate * F_PI18000;   // 1/100 degree
                                    double nRealOrient = toRadians(nAttrRotate);   // 1/100 degree
                                    nCos = cos( nRealOrient );
                                    nSin = sin( nRealOrient );
                                }
@@ -4998,11 +4998,11 @@
                                OSL_ENSURE( eOrient == SvxCellOrientation::Standard && nAttrRotate,
                                            "DrawRotated: no rotation" );

                                sal_Int16 nOriVal = 0;
                                Degree10 nOriVal = 0_deg10;
                                if ( nAttrRotate )
                                {
                                    // attribute is 1/100, Font 1/10 degrees
                                    nOriVal = nAttrRotate / 10;
                                    nOriVal = toDegree10(nAttrRotate);

                                    double nAddX = 0.0;
                                    double nAddY = 0.0;
@@ -5054,7 +5054,7 @@

                                //  bSimClip is not used here (because nOriVal is set)

                                pEngine->Draw( mpDev, aLogicStart, Degree10(nOriVal) );
                                pEngine->Draw( mpDev, aLogicStart, nOriVal );

                                if (bMetaFile)
                                    mpDev->Pop();
diff --git a/sd/qa/unit/uiimpress.cxx b/sd/qa/unit/uiimpress.cxx
index 56165d3..ce2ca26 100644
--- a/sd/qa/unit/uiimpress.cxx
+++ b/sd/qa/unit/uiimpress.cxx
@@ -122,7 +122,7 @@

    // Rotate the shape in window 2 & undo.
    pView2->MarkObj(pShape2, pView2->GetSdrPageView());
    pView2->RotateMarkedObj(pShape2->GetLastBoundRect().Center(), /*nAngle=*/45);
    pView2->RotateMarkedObj(pShape2->GetLastBoundRect().Center(), /*nAngle=*/45_deg100);
    // Without the accompanying fix in place, this test would have failed with an assertion failure
    // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr.
    pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON);
diff --git a/sd/source/ui/app/optsitem.cxx b/sd/source/ui/app/optsitem.cxx
index 7944bf5..d70e79c 100644
--- a/sd/source/ui/app/optsitem.cxx
+++ b/sd/source/ui/app/optsitem.cxx
@@ -847,8 +847,8 @@
        maOptionsSnap.SetBigOrtho( pView->IsBigOrtho() );
        maOptionsSnap.SetRotate( pView->IsAngleSnapEnabled() );
        maOptionsSnap.SetSnapArea( pView->GetSnapMagneticPixel() );
        maOptionsSnap.SetAngle( Degree10(pView->GetSnapAngle() / 10) );
        maOptionsSnap.SetEliminatePolyPointLimitAngle( Degree10(pView->GetEliminatePolyPointLimitAngle() / 10) );
        maOptionsSnap.SetAngle( toDegree10(pView->GetSnapAngle()) );
        maOptionsSnap.SetEliminatePolyPointLimitAngle( toDegree10(pView->GetEliminatePolyPointLimitAngle()) );
    }
    else if( pOpts )
    {
diff --git a/sd/source/ui/dlg/copydlg.cxx b/sd/source/ui/dlg/copydlg.cxx
index e1e26a5..5de5d71b 100644
--- a/sd/source/ui/dlg/copydlg.cxx
+++ b/sd/source/ui/dlg/copydlg.cxx
@@ -132,7 +132,7 @@
        SetMetricValue( *m_xMtrFldMoveY, tools::Long(nMoveY / maUIScale), MapUnit::Map100thMM);

        if( SfxItemState::SET == mrOutAttrs.GetItemState( ATTR_COPY_ANGLE, true, &pPoolItem ) )
            m_xMtrFldAngle->set_value(static_cast<const SdrAngleItem*>( pPoolItem )->GetValue(), FieldUnit::NONE);
            m_xMtrFldAngle->set_value(static_cast<const SdrAngleItem*>( pPoolItem )->GetValue().get(), FieldUnit::NONE);
        else
            m_xMtrFldAngle->set_value(0, FieldUnit::NONE);

@@ -188,7 +188,7 @@
    rOutAttrs.Put( SfxUInt16Item( ATTR_COPY_NUMBER, static_cast<sal_uInt16>(m_xNumFldCopies->get_value()) ) );
    rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_X, nMoveX ) );
    rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_Y, nMoveY ) );
    rOutAttrs.Put( SdrAngleItem( ATTR_COPY_ANGLE, static_cast<sal_Int32>(m_xMtrFldAngle->get_value(FieldUnit::DEGREE)) ) );
    rOutAttrs.Put( SdrAngleItem( ATTR_COPY_ANGLE, Degree100(static_cast<sal_Int32>(m_xMtrFldAngle->get_value(FieldUnit::DEGREE))) ) );
    rOutAttrs.Put( SfxInt32Item( ATTR_COPY_WIDTH, nWidth ) );
    rOutAttrs.Put( SfxInt32Item( ATTR_COPY_HEIGHT, nHeight ) );

diff --git a/sd/source/ui/dlg/tpoption.cxx b/sd/source/ui/dlg/tpoption.cxx
index 4c647ea..e0d43be 100644
--- a/sd/source/ui/dlg/tpoption.cxx
+++ b/sd/source/ui/dlg/tpoption.cxx
@@ -89,8 +89,8 @@
    m_xCbxBigOrtho->set_active( aOptsItem.GetOptionsSnap().IsBigOrtho() );
    m_xCbxRotate->set_active( aOptsItem.GetOptionsSnap().IsRotate() );
    m_xMtrFldSnapArea->set_value(aOptsItem.GetOptionsSnap().GetSnapArea(), FieldUnit::PIXEL);
    m_xMtrFldAngle->set_value(aOptsItem.GetOptionsSnap().GetAngle().get() / 10, FieldUnit::DEGREE);
    m_xMtrFldBezAngle->set_value(aOptsItem.GetOptionsSnap().GetEliminatePolyPointLimitAngle().get() / 10, FieldUnit::DEGREE);
    m_xMtrFldAngle->set_value(aOptsItem.GetOptionsSnap().GetAngle().get(), FieldUnit::DEGREE);
    m_xMtrFldBezAngle->set_value(aOptsItem.GetOptionsSnap().GetEliminatePolyPointLimitAngle().get(), FieldUnit::DEGREE);

    ClickRotateHdl_Impl(*m_xCbxRotate);
}
diff --git a/sd/source/ui/func/fuconarc.cxx b/sd/source/ui/func/fuconarc.cxx
index 2671f4e..1ced022 100644
--- a/sd/source/ui/func/fuconarc.cxx
+++ b/sd/source/ui/func/fuconarc.cxx
@@ -94,8 +94,8 @@
            mpView->getSdrModelFromSdrView(),
            ToSdrCircKind(mpView->GetCurrentObjIdentifier()),
            aNewRectangle,
            static_cast<::tools::Long>(pPhiStart->GetValue () * 10.0),
            static_cast<::tools::Long>(pPhiEnd->GetValue () * 10.0));
            pPhiStart->GetValue(),
            pPhiEnd->GetValue());
    SdrPageView *pPV = mpView->GetSdrPageView();

    mpView->InsertObjectAtView(pNewCircle, *pPV, SdrInsertFlags::SETDEFLAYER);
@@ -226,8 +226,8 @@
            pObj->SetLogicRect(aRect);

            SfxItemSet aAttr(mpDoc->GetPool());
            aAttr.Put(makeSdrCircStartAngleItem(9000));
            aAttr.Put(makeSdrCircEndAngleItem(0));
            aAttr.Put(makeSdrCircStartAngleItem(9000_deg100));
            aAttr.Put(makeSdrCircEndAngleItem(0_deg100));

            if(SID_DRAW_PIE_NOFILL == nID ||
                SID_DRAW_CIRCLEPIE_NOFILL == nID ||
diff --git a/sd/source/ui/func/fuconcs.cxx b/sd/source/ui/func/fuconcs.cxx
index 844bd82..d1fcf0f 100644
--- a/sd/source/ui/func/fuconcs.cxx
+++ b/sd/source/ui/func/fuconcs.cxx
@@ -183,7 +183,7 @@
                                        EE_ITEMS_START, EE_ITEMS_END>{});
                                aDest.Set( rSource );
                                pObj->SetMergedItemSet( aDest );
                                sal_Int32 nAngle = pSourceObj->GetRotateAngle();
                                Degree100 nAngle = pSourceObj->GetRotateAngle();
                                if ( nAngle )
                                    pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle );
                                bAttributesAppliedFromGallery = true;
diff --git a/sd/source/ui/func/fucopy.cxx b/sd/source/ui/func/fucopy.cxx
index ba50612..c291e34 100644
--- a/sd/source/ui/func/fucopy.cxx
+++ b/sd/source/ui/func/fucopy.cxx
@@ -120,7 +120,8 @@
    }

    ::tools::Rectangle           aRect;
    sal_Int32               lWidth = 0, lHeight = 0, lSizeX = 0, lSizeY = 0, lAngle = 0;
    sal_Int32               lWidth = 0, lHeight = 0, lSizeX = 0, lSizeY = 0;
    Degree100           lAngle(0);
    sal_uInt16              nNumber = 0;
    Color               aStartColor, aEndColor;
    bool                bColor = false;
diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx
index 904696b..fbcd7ad 100644
--- a/sd/source/ui/func/fusel.cxx
+++ b/sd/source/ui/func/fusel.cxx
@@ -169,10 +169,10 @@
        mpWindow->CaptureMouse();
        pHdl = mpView->PickHandle(aMDPos);

        ::tools::Long nAngle0  = GetAngle(aMDPos - mpView->GetRef1());
        nAngle0 -= 27000;
        Degree100 nAngle0  = GetAngle(aMDPos - mpView->GetRef1());
        nAngle0 -= 27000_deg100;
        nAngle0 = NormAngle36000(nAngle0);
        bMirrorSide0 = nAngle0 < 18000;
        bMirrorSide0 = nAngle0 < 18000_deg100;

        if (!pHdl && mpView->Is3DRotationCreationActive())
        {
@@ -742,10 +742,10 @@
                    * If 3D-rotation bodies are about to be created,
                    * end creation now
                    **********************************************************/
                     ::tools::Long nAngle1  = GetAngle(aPnt - mpView->GetRef1());
                     nAngle1 -= 27000;
                     Degree100 nAngle1  = GetAngle(aPnt - mpView->GetRef1());
                     nAngle1 -= 27000_deg100;
                     nAngle1 = NormAngle36000(nAngle1);
                     bool bMirrorSide1 = nAngle1 < 18000;
                     bool bMirrorSide1 = nAngle1 < 18000_deg100;

                     if (bMirrorSide0 != bMirrorSide1)
                     {
diff --git a/sd/source/ui/inc/optsitem.hxx b/sd/source/ui/inc/optsitem.hxx
index 2c835094..2e03490 100644
--- a/sd/source/ui/inc/optsitem.hxx
+++ b/sd/source/ui/inc/optsitem.hxx
@@ -23,6 +23,7 @@
#include <unotools/configitem.hxx>
#include <sfx2/module.hxx>
#include <svx/optgrid.hxx>
#include <tools/degree.hxx>
#include <sddllapi.h>
#include <memory>

diff --git a/sd/source/ui/view/frmview.cxx b/sd/source/ui/view/frmview.cxx
index 88b04b0..5b873f5 100644
--- a/sd/source/ui/view/frmview.cxx
+++ b/sd/source/ui/view/frmview.cxx
@@ -280,7 +280,7 @@

    mbRuler = pOptions->IsRulerVisible();
    SetGridVisible( pOptions->IsGridVisible() );
    SetSnapAngle( pOptions->GetAngle().get() * 10 ); // convert to hundredths of a degree
    SetSnapAngle( toDegree100(pOptions->GetAngle()) );
    SetGridSnap( pOptions->IsUseGridSnap() );
    SetBordSnap( pOptions->IsSnapBorder()  );
    SetHlplSnap( pOptions->IsSnapHelplines() );
@@ -298,7 +298,7 @@
    SetAngleSnapEnabled( pOptions->IsRotate() );
    SetBigOrtho( pOptions->IsBigOrtho() );
    SetOrtho( pOptions->IsOrtho() );
    SetEliminatePolyPointLimitAngle( pOptions->GetEliminatePolyPointLimitAngle().get() * 10 ); // convert to degree100
    SetEliminatePolyPointLimitAngle( toDegree100(pOptions->GetEliminatePolyPointLimitAngle()) );
    GetModel()->SetPickThroughTransparentTextFrames( pOptions->IsPickThrough() );

    SetSolidDragging( pOptions->IsSolidDragging() );
@@ -770,7 +770,7 @@
        {
            if( rValue.Value >>= nInt32 )
            {
                SetEliminatePolyPointLimitAngle( nInt32 );
                SetEliminatePolyPointLimitAngle( Degree100(nInt32) );
            }
        }
        else if ( rValue.Name == sUNO_View_IsEliminatePolyPoints )
@@ -844,7 +844,7 @@
        {
            if( rValue.Value >>= nInt32 )
            {
                SetSnapAngle( nInt32 );
                SetSnapAngle( Degree100(nInt32) );
            }
        }
        else if ( rValue.Name == sUNO_View_GridSnapWidthXNumerator )
diff --git a/svx/inc/dragmt3d.hxx b/svx/inc/dragmt3d.hxx
index d174d96..79402d0 100644
--- a/svx/inc/dragmt3d.hxx
+++ b/svx/inc/dragmt3d.hxx
@@ -36,8 +36,8 @@
    basegfx::B3DHomMatrix           maInvDisplayTransform;
    basegfx::B3DHomMatrix           maInitTransform;
    basegfx::B3DHomMatrix           maTransform;
    sal_Int32                       mnStartAngle;
    sal_Int32                       mnLastAngle;
    Degree100                       mnStartAngle;
    Degree100                       mnLastAngle;

    E3dDragMethodUnit(E3dObject& r3DObj)
    :   mr3DObj(r3DObj),
diff --git a/svx/inc/sxcaitm.hxx b/svx/inc/sxcaitm.hxx
index d6e216b..26d4a31 100644
--- a/svx/inc/sxcaitm.hxx
+++ b/svx/inc/sxcaitm.hxx
@@ -35,7 +35,7 @@
class SdrCaptionAngleItem final : public SdrAngleItem
{
public:
    SdrCaptionAngleItem(tools::Long nAngle = 0)
    SdrCaptionAngleItem(Degree100 nAngle = 0_deg100)
        : SdrAngleItem(SDRATTR_CAPTIONANGLE, nAngle)
    {
    }
diff --git a/svx/inc/sxmtaitm.hxx b/svx/inc/sxmtaitm.hxx
index ed2c3f4..8798b05 100644
--- a/svx/inc/sxmtaitm.hxx
+++ b/svx/inc/sxmtaitm.hxx
@@ -38,7 +38,7 @@
// Angle in 1/100deg from viewpoint of the user.
class SdrMeasureTextAutoAngleViewItem final : public SdrAngleItem {
public:
    SdrMeasureTextAutoAngleViewItem(tools::Long nVal=31500): SdrAngleItem(SDRATTR_MEASURETEXTAUTOANGLEVIEW,nVal)  {}
    SdrMeasureTextAutoAngleViewItem(Degree100 nVal=31500_deg100): SdrAngleItem(SDRATTR_MEASURETEXTAUTOANGLEVIEW,nVal)  {}
    virtual SdrMeasureTextAutoAngleViewItem* Clone(SfxItemPool*) const override
    {
        return new SdrMeasureTextAutoAngleViewItem(*this);
diff --git a/svx/inc/sxroaitm.hxx b/svx/inc/sxroaitm.hxx
index 66785c6..7f1aec1 100644
--- a/svx/inc/sxroaitm.hxx
+++ b/svx/inc/sxroaitm.hxx
@@ -26,7 +26,7 @@
{
public:
    SdrRotateAllItem()
        : SdrAngleItem(SDRATTR_ROTATEALL, 0)
        : SdrAngleItem(SDRATTR_ROTATEALL, 0_deg100)
    {
    }
    virtual SdrRotateAllItem* Clone(SfxItemPool*) const override
diff --git a/svx/inc/sxrooitm.hxx b/svx/inc/sxrooitm.hxx
index 28ceada..39cef3d 100644
--- a/svx/inc/sxrooitm.hxx
+++ b/svx/inc/sxrooitm.hxx
@@ -24,7 +24,7 @@

class SdrRotateOneItem: public SdrAngleItem {
public:
    SdrRotateOneItem(): SdrAngleItem(SDRATTR_ROTATEONE,0) {}
    SdrRotateOneItem(): SdrAngleItem(SDRATTR_ROTATEONE,0_deg100) {}
    SdrRotateOneItem* Clone(SfxItemPool*) const override
    {
        return new SdrRotateOneItem(*this);
diff --git a/svx/inc/sxsaitm.hxx b/svx/inc/sxsaitm.hxx
index 1591dfa..01824ef 100644
--- a/svx/inc/sxsaitm.hxx
+++ b/svx/inc/sxsaitm.hxx
@@ -25,7 +25,7 @@
class SdrShearAngleItem : public SdrAngleItem
{
public:
    SdrShearAngleItem(tools::Long nAngle = 0)
    SdrShearAngleItem(Degree100 nAngle = 0_deg100)
        : SdrAngleItem(SDRATTR_SHEARANGLE, nAngle)
    {
    }
diff --git a/svx/inc/sxsalitm.hxx b/svx/inc/sxsalitm.hxx
index f73b460..6e0cb2b 100644
--- a/svx/inc/sxsalitm.hxx
+++ b/svx/inc/sxsalitm.hxx
@@ -24,7 +24,7 @@

class SdrHorzShearAllItem: public SdrAngleItem {
public:
    SdrHorzShearAllItem(): SdrAngleItem(SDRATTR_HORZSHEARALL,0) {}
    SdrHorzShearAllItem(): SdrAngleItem(SDRATTR_HORZSHEARALL,0_deg100) {}
    virtual SdrHorzShearAllItem* Clone(SfxItemPool*) const override
    {
        return new SdrHorzShearAllItem(*this);
@@ -33,7 +33,7 @@

class SdrVertShearAllItem: public SdrAngleItem {
public:
    SdrVertShearAllItem(): SdrAngleItem(SDRATTR_VERTSHEARALL,0) {}
    SdrVertShearAllItem(): SdrAngleItem(SDRATTR_VERTSHEARALL,0_deg100) {}
    virtual SdrVertShearAllItem* Clone(SfxItemPool*) const override
    {
        return new SdrVertShearAllItem(*this);
diff --git a/svx/inc/sxsoitm.hxx b/svx/inc/sxsoitm.hxx
index 2c5273a..75faab3 100644
--- a/svx/inc/sxsoitm.hxx
+++ b/svx/inc/sxsoitm.hxx
@@ -24,7 +24,7 @@

class SdrHorzShearOneItem: public SdrAngleItem {
public:
    SdrHorzShearOneItem(): SdrAngleItem(SDRATTR_HORZSHEARONE,0) {}
    SdrHorzShearOneItem(): SdrAngleItem(SDRATTR_HORZSHEARONE,0_deg100) {}
    SdrHorzShearOneItem* Clone(SfxItemPool*) const override
    {
        return new SdrHorzShearOneItem(*this);
@@ -33,7 +33,7 @@

class SdrVertShearOneItem: public SdrAngleItem {
public:
    SdrVertShearOneItem(): SdrAngleItem(SDRATTR_VERTSHEARONE,0) {}
    SdrVertShearOneItem(): SdrAngleItem(SDRATTR_VERTSHEARONE,0_deg100) {}
    SdrVertShearOneItem* Clone(SfxItemPool*) const override
    {
        return new SdrVertShearOneItem(*this);
diff --git a/svx/qa/unit/customshapes.cxx b/svx/qa/unit/customshapes.cxx
index fe4e22f..d0d4ac3 100644
--- a/svx/qa/unit/customshapes.cxx
+++ b/svx/qa/unit/customshapes.cxx
@@ -863,7 +863,7 @@
            static_cast<SdrObjCustomShape&>(*GetSdrObjectFromXShape(xShape)));
        // apply shearing 20deg
        const Point aCenter = rSdrObjCustomShape.GetSnapRect().Center();
        rSdrObjCustomShape.Shear(aCenter, 2000, tan(basegfx::deg2rad(20.0)), false);
        rSdrObjCustomShape.Shear(aCenter, 2000_deg100, tan(basegfx::deg2rad(20.0)), false);
    }

    // Save and reload
diff --git a/svx/source/customshapes/EnhancedCustomShape2d.cxx b/svx/source/customshapes/EnhancedCustomShape2d.cxx
index fb8fce6..57d622e 100644
--- a/svx/source/customshapes/EnhancedCustomShape2d.cxx
+++ b/svx/source/customshapes/EnhancedCustomShape2d.cxx
@@ -749,7 +749,7 @@
    if ( pAny )
        *pAny >>= bFlipV;

    nRotateAngle = static_cast<sal_Int32>(mrSdrObjCustomShape.GetObjectRotation() * 100.0);
    nRotateAngle = Degree100(static_cast<sal_Int32>(mrSdrObjCustomShape.GetObjectRotation() * 100.0));

    /*const sal_Int32* pDefData =*/ ApplyShapeAttributes( rGeometryItem );
    SetPathSize();
@@ -1174,7 +1174,7 @@
            }
            if ( nRotateAngle )
            {
                double a = nRotateAngle * F_PI18000;
                double a = toRadians(nRotateAngle);
                RotatePoint( rReturnPosition, Point( aLogicRect.GetWidth() / 2, aLogicRect.GetHeight() / 2 ), sin( a ), cos( a ) );
            }
            if ( bFlipH )
@@ -1488,7 +1488,7 @@
                aP.setY( aLogicRect.GetHeight() - aP.Y() );
            if ( nRotateAngle )
            {
                double a = -nRotateAngle * F_PI18000;
                double a = -toRadians(nRotateAngle);
                RotatePoint( aP, Point( aLogicRect.GetWidth() / 2, aLogicRect.GetHeight() / 2 ), sin( a ), cos( a ) );
            }
            const GeoStat aGeoStat(mrSdrObjCustomShape.GetGeoStat());
diff --git a/svx/source/customshapes/EnhancedCustomShape3d.cxx b/svx/source/customshapes/EnhancedCustomShape3d.cxx
index f83be9f..651d176 100644
--- a/svx/source/customshapes/EnhancedCustomShape3d.cxx
+++ b/svx/source/customshapes/EnhancedCustomShape3d.cxx
@@ -271,10 +271,10 @@
        bool bIsMirroredX(rSdrObjCustomShape.IsMirroredX());
        bool bIsMirroredY(rSdrObjCustomShape.IsMirroredY());
        tools::Rectangle aSnapRect(rSdrObjCustomShape.GetLogicRect());
        tools::Long nObjectRotation(rSdrObjCustomShape.GetRotateAngle());
        Degree100 nObjectRotation(rSdrObjCustomShape.GetRotateAngle());
        if ( nObjectRotation )
        {
            double a = (36000 - nObjectRotation) * F_PI18000;
            double a = (36000 - nObjectRotation.get()) * F_PI18000;
            tools::Long dx = aSnapRect.Right() - aSnapRect.Left();
            tools::Long dy = aSnapRect.Bottom()- aSnapRect.Top();
            Point aP( aSnapRect.TopLeft() );
diff --git a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
index 11f26ff..d4635c4e 100644
--- a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
@@ -282,7 +282,7 @@
        *pAny >>= bTextPathOn;

    EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
    sal_Int32 nRotateAngle = aCustomShape2d.GetRotateAngle();
    Degree100 nRotateAngle = aCustomShape2d.GetRotateAngle();

    bool bFlipV = aCustomShape2d.IsFlipVert();
    bool bFlipH = aCustomShape2d.IsFlipHorz();
@@ -307,7 +307,7 @@
        if (xRenderedShape3d)
        {
            bFlipV = bFlipH = false;
            nRotateAngle = 0;
            nRotateAngle = 0_deg100;
            xRenderedShape = std::move(xRenderedShape3d);
        }

@@ -316,7 +316,7 @@

        if ( rGeoStat.nShearAngle )
        {
            tools::Long nShearAngle = rGeoStat.nShearAngle;
            Degree100 nShearAngle = rGeoStat.nShearAngle;
            double nTan = rGeoStat.mfTanShearAngle;
            if (bFlipV != bFlipH)
            {
@@ -413,7 +413,7 @@

            if ( rGeoStat.nShearAngle )
            {
                tools::Long nShearAngle = rGeoStat.nShearAngle;
                Degree100 nShearAngle = rGeoStat.nShearAngle;
                double nTan = rGeoStat.mfTanShearAngle;
                if (bFlipV != bFlipH)
                {
@@ -422,7 +422,7 @@
                }
                pObj->Shear( aRect.Center(), nShearAngle, nTan, false);
            }
            sal_Int32 nRotateAngle = aCustomShape2d.GetRotateAngle();
            Degree100 nRotateAngle = aCustomShape2d.GetRotateAngle();
            if( nRotateAngle )
                pObj->NbcRotate( aRect.Center(), nRotateAngle );
            if ( bFlipH )
diff --git a/svx/source/dialog/dialcontrol.cxx b/svx/source/dialog/dialcontrol.cxx
index 9052d43..ff8f0ee 100644
--- a/svx/source/dialog/dialcontrol.cxx
+++ b/svx/source/dialog/dialcontrol.cxx
@@ -63,9 +63,9 @@
    DrawBackground();
}

void DialControlBmp::DrawElements( const OUString& rText, sal_Int32 nAngle )
void DialControlBmp::DrawElements( const OUString& rText, Degree100 nAngle )
{
    double fAngle = basegfx::deg2rad(nAngle) / 100.0;
    double fAngle = toRadians(nAngle);
    double fSin = sin( fAngle );
    double fCos = cos( fAngle );
    double fWidth = GetTextWidth( rText ) / 2.0;
@@ -76,7 +76,7 @@
        // rotated text
        vcl::Font aFont( GetFont() );
        aFont.SetColor( GetTextColor() );
        aFont.SetOrientation( Degree10(static_cast< sal_Int16 >( (nAngle + 5) / 10 )) );  // Font uses 1/10 degrees
        aFont.SetOrientation( toDegree10(nAngle) );  // Font uses 1/10 degrees
        aFont.SetWeight( WEIGHT_BOLD );
        SetFont( aFont );

@@ -99,7 +99,7 @@

    // *** drag button ***

    bool bMain = (nAngle % 4500) != 0;
    bool bMain = (nAngle % 4500_deg100) != 0_deg100;
    SetLineColor( GetButtonLineColor() );
    SetFillColor( GetButtonFillColor( bMain ) );

@@ -348,12 +348,12 @@
    }
}

sal_Int32 DialControl::GetRotation() const
Degree100 DialControl::GetRotation() const
{
    return mpImpl->mnAngle;
}

void DialControl::SetRotation(sal_Int32 nAngle)
void DialControl::SetRotation(Degree100 nAngle)
{
    SetRotation(nAngle, false);
}
@@ -380,7 +380,7 @@

IMPL_LINK_NOARG(DialControl, LinkedFieldModifyHdl, weld::MetricSpinButton&, void)
{
    SetRotation(mpImpl->mpLinkField->get_value(FieldUnit::DEGREE) * mpImpl->mnLinkedFieldValueMultiplyer, true);
    SetRotation(Degree100(mpImpl->mpLinkField->get_value(FieldUnit::DEGREE) * mpImpl->mnLinkedFieldValueMultiplyer), true);
}

void DialControl::SaveValue()
@@ -420,20 +420,19 @@
    Invalidate();
}

void DialControl::SetRotation(sal_Int32 nAngle, bool bBroadcast)
void DialControl::SetRotation(Degree100 nAngle, bool bBroadcast)
{
    bool bOldSel = mpImpl->mbNoRot;
    mpImpl->mbNoRot = false;

    while (nAngle < 0)
        nAngle += 36000;
    nAngle = NormAngle36000(nAngle);

    if (!bOldSel || (mpImpl->mnAngle != nAngle))
    {
        mpImpl->mnAngle = nAngle;
        InvalidateControl();
        if( mpImpl->mpLinkField )
            mpImpl->mpLinkField->set_value(GetRotation() / mpImpl->mnLinkedFieldValueMultiplyer, FieldUnit::DEGREE);
            mpImpl->mpLinkField->set_value(GetRotation().get() / mpImpl->mnLinkedFieldValueMultiplyer, FieldUnit::DEGREE);
        if( bBroadcast )
            mpImpl->maModifyHdl.Call(*this);
    }
@@ -459,7 +458,7 @@
            nAngle = ((nAngle + 750) / 1500) * 1500;
        // Round up to 1 degree
        nAngle = (((nAngle + 50) / 100) * 100) % 36000;
        SetRotation(nAngle, true);
        SetRotation(Degree100(nAngle), true);
    }
}

diff --git a/svx/source/dialog/imapwnd.cxx b/svx/source/dialog/imapwnd.cxx
index 14345a5..6a2c5ef 100644
--- a/svx/source/dialog/imapwnd.cxx
+++ b/svx/source/dialog/imapwnd.cxx
@@ -210,8 +210,8 @@
                    *pModel,
                    SdrCircKind::Full,
                    aCircle,
                    0,
                    36000);
                    0_deg100,
                    36000_deg100);
            pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapCircleObject( *pIMapCircleObj )));
        }
        break;
@@ -232,8 +232,8 @@
                        *pModel,
                        SdrCircKind::Full,
                        aDrawRect,
                        0,
                        36000);
                        0_deg100,
                        36000_deg100);
            }
            else
            {
diff --git a/svx/source/engine3d/dragmt3d.cxx b/svx/source/engine3d/dragmt3d.cxx
index bffd2e5..c27d955 100644
--- a/svx/source/engine3d/dragmt3d.cxx
+++ b/svx/source/engine3d/dragmt3d.cxx
@@ -122,7 +122,7 @@
        {
            E3dDragMethodUnit& rCandidate = maGrp[nOb];
            rCandidate.mnStartAngle = GetAngle(DragStat().GetStart() - DragStat().GetRef1());
            rCandidate.mnLastAngle = 0;
            rCandidate.mnLastAngle = 0_deg100;
        }
    }
    else
@@ -355,10 +355,10 @@

        if(E3dDragConstraint::Z == meConstraint)
        {
            fWAngle = NormAngle36000(GetAngle(rPnt - DragStat().GetRef1()) -
            Degree100 lastAngle = NormAngle36000(GetAngle(rPnt - DragStat().GetRef1()) -
                rCandidate.mnStartAngle) - rCandidate.mnLastAngle;
            rCandidate.mnLastAngle = static_cast<tools::Long>(fWAngle) + rCandidate.mnLastAngle;
            fWAngle /= 100.0;
            rCandidate.mnLastAngle = lastAngle + rCandidate.mnLastAngle;
            fWAngle = toDegrees(lastAngle);
            fHAngle = 0.0;
        }
        else
diff --git a/svx/source/engine3d/obj3d.cxx b/svx/source/engine3d/obj3d.cxx
index 8d81317..dac98b2 100644
--- a/svx/source/engine3d/obj3d.cxx
+++ b/svx/source/engine3d/obj3d.cxx
@@ -432,13 +432,13 @@
// This is however a correct implementation, because everything that has
// happened is a rotation around the axis perpendicular to the screen and that
// is regardless of how the scene has been rotated up until now.
void E3dObject::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void E3dObject::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    // So currently the glue points are defined relative to the scene aOutRect.
    // Before turning the glue points are defined relative to the page. They
    // take no part in the rotation of the scene. To ensure this, there is the
    // SetGlueReallyAbsolute(sal_True);
    double fAngleInRad = basegfx::deg2rad(nAngle/100.0);
    double fAngleInRad = toRadians(nAngle);

    basegfx::B3DHomMatrix aRotateZ;
    aRotateZ.rotate(0.0, 0.0, fAngleInRad);
diff --git a/svx/source/engine3d/scene3d.cxx b/svx/source/engine3d/scene3d.cxx
index 5c99893..0b6632a 100644
--- a/svx/source/engine3d/scene3d.cxx
+++ b/svx/source/engine3d/scene3d.cxx
@@ -614,7 +614,7 @@
    }
}

void E3dScene::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void E3dScene::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    // So currently the glue points are defined relative to the scene aOutRect.
    // Before turning the glue points are defined relative to the page. They
@@ -628,7 +628,7 @@
    // through the enter of aOutRect's (Steiner's theorem), so RotateZ

    RotateScene (rRef, sn, cs);  // Rotates the scene
    double fAngleInRad = basegfx::deg2rad(nAngle/100.0);
    double fAngleInRad = toRadians(nAngle);

    basegfx::B3DHomMatrix aRotation;
    aRotation.rotate(0.0, 0.0, fAngleInRad);
diff --git a/svx/source/items/algitem.cxx b/svx/source/items/algitem.cxx
index 58a71f1..d432963 100644
--- a/svx/source/items/algitem.cxx
+++ b/svx/source/items/algitem.cxx
@@ -42,14 +42,14 @@
{
}

SvxOrientationItem::SvxOrientationItem( sal_Int32 nRotation, bool bStacked, const sal_uInt16 nId ) :
SvxOrientationItem::SvxOrientationItem( Degree100 nRotation, bool bStacked, const sal_uInt16 nId ) :
    SfxEnumItem( nId, SvxCellOrientation::Standard )
{
    if( bStacked )
    {
        SetValue( SvxCellOrientation::Stacked );
    }
    else switch( nRotation )
    else switch( nRotation.get() )
    {
        case 9000:  SetValue( SvxCellOrientation::BottomUp );  break;
        case 27000: SetValue( SvxCellOrientation::TopBottom );  break;
@@ -128,13 +128,13 @@
    return GetValue() == SvxCellOrientation::Stacked;
}

sal_Int32 SvxOrientationItem::GetRotation( sal_Int32 nStdAngle ) const
Degree100 SvxOrientationItem::GetRotation( Degree100 nStdAngle ) const
{
    sal_Int32 nAngle = nStdAngle;
    Degree100 nAngle = nStdAngle;
    switch( GetValue() )
    {
        case SvxCellOrientation::BottomUp: nAngle = 9000;break;
        case SvxCellOrientation::TopBottom: nAngle = 27000;break;
        case SvxCellOrientation::BottomUp: nAngle = 9000_deg100; break;
        case SvxCellOrientation::TopBottom: nAngle = 27000_deg100; break;
        default: ; //prevent warning
    }
    return nAngle;
diff --git a/svx/source/items/autoformathelper.cxx b/svx/source/items/autoformathelper.cxx
index a15af6d..1148fa7 100644
--- a/svx/source/items/autoformathelper.cxx
+++ b/svx/source/items/autoformathelper.cxx
@@ -361,7 +361,7 @@
    }

    m_aStacked->SetValue( aOrientation.IsStacked() );
    m_aRotateAngle->SetValue( aOrientation.GetRotation( m_aRotateAngle->GetValue() ) );
    m_aRotateAngle->SetValue( aOrientation.GetRotation( Degree100(m_aRotateAngle->GetValue()) ).get() );

    return ERRCODE_NONE == rStream.GetError();
}
@@ -407,7 +407,7 @@
{
    legacy::SvxHorJustify::Store(*m_aHorJustify, rStream, legacy::SvxHorJustify::GetVersion(fileVersion));
    legacy::SvxVerJustify::Store(*m_aVerJustify, rStream, legacy::SvxVerJustify::GetVersion(fileVersion));
    SvxOrientationItem aOrientation( m_aRotateAngle->GetValue(), m_aStacked->GetValue(), 0 );
    SvxOrientationItem aOrientation( Degree100(m_aRotateAngle->GetValue()), m_aStacked->GetValue(), 0 );
    legacy::SvxOrientation::Store(aOrientation, rStream, legacy::SvxOrientation::GetVersion(fileVersion));
    legacy::SvxMargin::Store(*m_aMargin, rStream, legacy::SvxMargin::GetVersion(fileVersion));
    legacy::SfxBool::Store(*m_aLinebreak, rStream, legacy::SfxBool::GetVersion(fileVersion));
diff --git a/svx/source/sdr/contact/viewcontactofgraphic.cxx b/svx/source/sdr/contact/viewcontactofgraphic.cxx
index 8014095..e2e0b45 100644
--- a/svx/source/sdr/contact/viewcontactofgraphic.cxx
+++ b/svx/source/sdr/contact/viewcontactofgraphic.cxx
@@ -315,8 +315,8 @@

            // look for mirroring
            const GeoStat& rGeoStat(GetGrafObject().GetGeoStat());
            const sal_Int32 nRotationAngle(rGeoStat.nRotationAngle);
            const bool bRota180(18000 == nRotationAngle);
            const Degree100 nRotationAngle(rGeoStat.nRotationAngle);
            const bool bRota180(18000_deg100 == nRotationAngle);
            const bool bMirrored(GetGrafObject().IsMirrored());
            const sal_uInt16 nMirrorCase(bRota180 ? (bMirrored ? 3 : 4) : (bMirrored ? 2 : 1));
            bool bHMirr((2 == nMirrorCase ) || (4 == nMirrorCase));
@@ -341,7 +341,7 @@

            // fill object matrix
            const double fShearX(-rGeoStat.mfTanShearAngle);
            const double fRotate(nRotationAngle ? (36000 - nRotationAngle) * F_PI18000 : 0.0);
            const double fRotate(nRotationAngle ? (36000 - nRotationAngle.get()) * F_PI18000 : 0.0);
            const basegfx::B2DHomMatrix aObjectMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                aObjectRange.getWidth(), aObjectRange.getHeight(),
                fShearX, fRotate,
diff --git a/svx/source/sdr/contact/viewcontactofsdrcaptionobj.cxx b/svx/source/sdr/contact/viewcontactofsdrcaptionobj.cxx
index 3e14a74..d319880 100644
--- a/svx/source/sdr/contact/viewcontactofsdrcaptionobj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrcaptionobj.cxx
@@ -74,7 +74,7 @@
            basegfx::B2DHomMatrix aObjectMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                aObjectRange.getWidth(), aObjectRange.getHeight(),
                -rGeoStat.mfTanShearAngle,
                rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0,
                rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0,
                aObjectRange.getMinX(), aObjectRange.getMinY()));

            // calculate corner radius
diff --git a/svx/source/sdr/contact/viewcontactofsdrcircobj.cxx b/svx/source/sdr/contact/viewcontactofsdrcircobj.cxx
index beafebf..7462c10 100644
--- a/svx/source/sdr/contact/viewcontactofsdrcircobj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrcircobj.cxx
@@ -57,7 +57,7 @@
                basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                    aObjectRange.getWidth(), aObjectRange.getHeight(),
                    -rGeoStat.mfTanShearAngle,
                    rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0,
                    rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0,
                    aObjectRange.getMinX(), aObjectRange.getMinY()));

            // create primitive data
diff --git a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
index 1ad9b8a..f676bd8 100644
--- a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
@@ -73,7 +73,7 @@

                    if(rGeoStat.nRotationAngle)
                    {
                        aRotMatrix.rotate((36000 - rGeoStat.nRotationAngle) * F_PI18000);
                        aRotMatrix.rotate((36000 - rGeoStat.nRotationAngle.get()) * F_PI18000);
                    }

                    aRotMatrix.translate(aObjectRange.getMinimum().getX(), aObjectRange.getMinimum().getY());
@@ -202,7 +202,7 @@

                        if(rGeoStat.nRotationAngle)
                        {
                            aTextBoxMatrix.rotate((36000 - rGeoStat.nRotationAngle) * F_PI18000);
                            aTextBoxMatrix.rotate((36000 - rGeoStat.nRotationAngle.get()) * F_PI18000);
                        }

                        // give text it's target position
diff --git a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
index ab7a93f..db65802 100644
--- a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
@@ -63,7 +63,7 @@
    // create object matrix
    const GeoStat& rGeoStat(GetOle2Obj().GetGeoStat());
    const double fShearX(-rGeoStat.mfTanShearAngle);
    const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0);
    const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0);

    return basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
        aObjectRange.getWidth(), aObjectRange.getHeight(),
diff --git a/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx b/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx
index bae0147..5d2b0f1 100644
--- a/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx
@@ -158,7 +158,7 @@
                aObjectMatrix = basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                    fScaleX, fScaleY,
                    -rGeoStat.mfTanShearAngle,
                    rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0,
                    rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0,
                    aObjectRange.getMinX(), aObjectRange.getMinY());

                // create unit polygon from object's absolute path
diff --git a/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx b/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx
index 370c1e8..e2c3db4 100644
--- a/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx
@@ -57,7 +57,7 @@
    basegfx::B2DHomMatrix aObjectMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
        aObjectRange.getWidth(), aObjectRange.getHeight(),
        -rGeoStat.mfTanShearAngle,
        rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0,
        rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0,
        aObjectRange.getMinX(), aObjectRange.getMinY()));

    // calculate corner radius
diff --git a/svx/source/sdr/properties/circleproperties.cxx b/svx/source/sdr/properties/circleproperties.cxx
index 895029c..b6965fd 100644
--- a/svx/source/sdr/properties/circleproperties.cxx
+++ b/svx/source/sdr/properties/circleproperties.cxx
@@ -106,7 +106,7 @@
                    mpItemSet->Put(makeSdrCircStartAngleItem(rObj.GetStartAngle()));
                }

                if(rObj.GetEndAngle() != 36000)
                if(rObj.GetEndAngle() != 36000_deg100)
                {
                    mpItemSet->Put(makeSdrCircEndAngleItem(rObj.GetEndAngle()));
                }
diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
index 8f34d70..69e0d42 100644
--- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
@@ -449,11 +449,11 @@

IMPL_LINK_NOARG( PosSizePropertyPanel, RotationHdl, DialControl&, void )
{
    sal_Int32 nTmp = mxCtrlDial->GetRotation();
    Degree100 nTmp = mxCtrlDial->GetRotation();

    // #i123993# Need to take UIScale into account when executing rotations
    const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0);
    SdrAngleItem aAngleItem( SID_ATTR_TRANSFORM_ANGLE,static_cast<sal_uInt32>(nTmp));
    SdrAngleItem aAngleItem( SID_ATTR_TRANSFORM_ANGLE, nTmp);
    SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale));
    SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale));

@@ -680,10 +680,9 @@

                if(pItem)
                {
                    tools::Long nTmp = pItem->GetValue();
                    nTmp = nTmp < 0 ? 36000+nTmp : nTmp;
                    Degree100 nTmp = NormAngle36000(pItem->GetValue());

                    mxMtrAngle->set_value(nTmp, FieldUnit::DEGREE);
                    mxMtrAngle->set_value(nTmp.get(), FieldUnit::DEGREE);
                    mxCtrlDial->SetRotation(nTmp);

                    break;
@@ -691,7 +690,7 @@
            }

            mxMtrAngle->set_text( "" );
            mxCtrlDial->SetRotation( 0 );
            mxCtrlDial->SetRotation( 0_deg100 );
            break;

        case SID_ATTR_METRIC:
diff --git a/svx/source/svdraw/svdattr.cxx b/svx/source/svdraw/svdattr.cxx
index 5f64118..0342f65 100644
--- a/svx/source/svdraw/svdattr.cxx
+++ b/svx/source/svdraw/svdattr.cxx
@@ -203,8 +203,8 @@
    rPoolDefaults[SDRATTR_MEASURETEXTFIXEDANGLE   -SDRATTR_START]=new SdrMeasureTextFixedAngleItem();
    rPoolDefaults[SDRATTR_MEASUREDECIMALPLACES    -SDRATTR_START]=new SdrMeasureDecimalPlacesItem();
    rPoolDefaults[SDRATTR_CIRCKIND      -SDRATTR_START]=new SdrCircKindItem;
    rPoolDefaults[SDRATTR_CIRCSTARTANGLE-SDRATTR_START]=new SdrAngleItem(SDRATTR_CIRCSTARTANGLE, 0);
    rPoolDefaults[SDRATTR_CIRCENDANGLE  -SDRATTR_START]=new SdrAngleItem(SDRATTR_CIRCENDANGLE, 36000);
    rPoolDefaults[SDRATTR_CIRCSTARTANGLE-SDRATTR_START]=new SdrAngleItem(SDRATTR_CIRCSTARTANGLE, 0_deg100);
    rPoolDefaults[SDRATTR_CIRCENDANGLE  -SDRATTR_START]=new SdrAngleItem(SDRATTR_CIRCENDANGLE, 36000_deg100);
    rPoolDefaults[SDRATTR_OBJMOVEPROTECT -SDRATTR_START]=new SdrYesNoItem(SDRATTR_OBJMOVEPROTECT, false);
    rPoolDefaults[SDRATTR_OBJSIZEPROTECT -SDRATTR_START]=new SdrYesNoItem(SDRATTR_OBJSIZEPROTECT, false);
    rPoolDefaults[SDRATTR_OBJPRINTABLE   -SDRATTR_START]=new SdrObjPrintableItem;
@@ -222,7 +222,7 @@
    rPoolDefaults[SDRATTR_ONESIZEHEIGHT  -SDRATTR_START]=new SdrOneSizeHeightItem;
    rPoolDefaults[SDRATTR_LOGICSIZEWIDTH -SDRATTR_START]=new SdrLogicSizeWidthItem;
    rPoolDefaults[SDRATTR_LOGICSIZEHEIGHT-SDRATTR_START]=new SdrLogicSizeHeightItem;
    rPoolDefaults[SDRATTR_ROTATEANGLE    -SDRATTR_START]=new SdrAngleItem(SDRATTR_ROTATEANGLE, 0);
    rPoolDefaults[SDRATTR_ROTATEANGLE    -SDRATTR_START]=new SdrAngleItem(SDRATTR_ROTATEANGLE, 0_deg100);
    rPoolDefaults[SDRATTR_SHEARANGLE     -SDRATTR_START]=new SdrShearAngleItem;
    rPoolDefaults[SDRATTR_MOVEX          -SDRATTR_START]=new SdrMoveXItem;
    rPoolDefaults[SDRATTR_MOVEY          -SDRATTR_START]=new SdrMoveYItem;
diff --git a/svx/source/svdraw/svddrgm1.hxx b/svx/source/svdraw/svddrgm1.hxx
index 25c1a5a..b8aa228 100644
--- a/svx/source/svdraw/svddrgm1.hxx
+++ b/svx/source/svdraw/svddrgm1.hxx
@@ -49,8 +49,8 @@
private:
    double                      nSin;
    double                      nCos;
    tools::Long                        nAngle0;
    tools::Long                        nAngle;
    Degree100                   nAngle0;
    Degree100                   nAngle;
    bool                        bRight;

public:
@@ -70,8 +70,8 @@
{
private:
    Fraction                    aFact;
    tools::Long                        nAngle0;
    tools::Long                        nAngle;
    Degree100                   nAngle0;
    Degree100                   nAngle;
    double                      nTan;
    bool                        bVertical;   // contort vertically
    bool                        bResize;     // shear and resize
@@ -95,7 +95,7 @@
{
private:
    Point                       aDif;
    tools::Long                        nAngle;
    Degree100                   nAngle;
    bool                        bMirrored;
    bool                        bSide0;

@@ -159,7 +159,7 @@
    bool                        bUpr;
    bool                        bLwr;
    bool                        bAtCenter;
    tools::Long                        nAngle;
    Degree100                   nAngle;
    tools::Long                        nMarkSize;
    SdrCrookMode                eMode;

diff --git a/svx/source/svdraw/svddrgmt.cxx b/svx/source/svdraw/svddrgmt.cxx
index 0915dfc..5938171 100644
--- a/svx/source/svdraw/svddrgmt.cxx
+++ b/svx/source/svdraw/svddrgmt.cxx
@@ -1042,21 +1042,21 @@
    else
    {
        if (!DragStat().IsNoSnap()) SnapPos(aPnt);
        tools::Long nSA=0;
        Degree100 nSA(0);

        if (getSdrDragView().IsAngleSnapEnabled())
            nSA=getSdrDragView().GetSnapAngle();

        if (getSdrDragView().IsMirrorAllowed(true,true))
        { // limited
            if (!getSdrDragView().IsMirrorAllowed()) nSA=4500;
            if (!getSdrDragView().IsMirrorAllowed(true)) nSA=9000;
            if (!getSdrDragView().IsMirrorAllowed()) nSA=4500_deg100;
            if (!getSdrDragView().IsMirrorAllowed(true)) nSA=9000_deg100;
        }

        if (getSdrDragView().IsOrtho() && nSA!=9000)
            nSA=4500;
        if (getSdrDragView().IsOrtho() && nSA!=9000_deg100)
            nSA=4500_deg100;

        if (nSA!=0)
        if (nSA!=0_deg100)
        { // angle snapping
            SdrHdlKind eRef=SdrHdlKind::Ref1;

@@ -1068,25 +1068,25 @@
            if (pH!=nullptr)
            {
                Point aRef(pH->GetPos());
                tools::Long nAngle=NormAngle36000(GetAngle(aPnt-aRef));
                tools::Long nNewAngle=nAngle;
                nNewAngle+=nSA/2;
                Degree100 nAngle=NormAngle36000(GetAngle(aPnt-aRef));
                Degree100 nNewAngle=nAngle;
                nNewAngle+=nSA/2_deg100;
                nNewAngle/=nSA;
                nNewAngle*=nSA;
                nNewAngle=NormAngle36000(nNewAngle);
                double a=(nNewAngle-nAngle)*F_PI18000;
                double a=(nNewAngle-nAngle).get()*F_PI18000;
                double nSin=sin(a);
                double nCos=cos(a);
                RotatePoint(aPnt,aRef,nSin,nCos);

                // eliminate rounding errors for certain values
                if (nSA==9000)
                if (nSA==9000_deg100)
                {
                    if (nNewAngle==0    || nNewAngle==18000) aPnt.setY(aRef.Y() );
                    if (nNewAngle==9000 || nNewAngle==27000) aPnt.setX(aRef.X() );
                    if (nNewAngle==0_deg100    || nNewAngle==18000_deg100) aPnt.setY(aRef.Y() );
                    if (nNewAngle==9000_deg100 || nNewAngle==27000_deg100) aPnt.setX(aRef.X() );
                }

                if (nSA==4500)
                if (nSA==4500_deg100)
                    OrthoDistance8(aRef,aPnt,true);
            }
        }
@@ -2062,11 +2062,11 @@
{
    OUString aStr = ImpGetDescriptionStr(STR_DragMethRotate) +
        " (";
    sal_Int32 nTmpAngle(NormAngle36000(nAngle));
    Degree100 nTmpAngle(NormAngle36000(nAngle));

    if(bRight && nAngle)
    {
        nTmpAngle -= 36000;
        nTmpAngle -= 36000_deg100;
    }

    aStr += SdrModel::GetAngleString(nTmpAngle) + ")";
@@ -2117,20 +2117,20 @@
    if (!DragStat().CheckMinMoved(aPnt))
        return;

    tools::Long nNewAngle=NormAngle36000(GetAngle(aPnt-DragStat().GetRef1())-nAngle0);
    tools::Long nSA=0;
    Degree100 nNewAngle=NormAngle36000(GetAngle(aPnt-DragStat().GetRef1())-nAngle0);
    Degree100 nSA(0);

    if (getSdrDragView().IsAngleSnapEnabled())
        nSA=getSdrDragView().GetSnapAngle();

    if (!getSdrDragView().IsRotateAllowed())
        nSA=9000;
        nSA=9000_deg100;

    if (nSA!=0)
    if (nSA!=0_deg100)
    { // angle snapping
        nNewAngle+=nSA/2;
        nNewAngle/=nSA;
        nNewAngle*=nSA;
        nNewAngle += nSA / 2_deg100;
        nNewAngle /= nSA;
        nNewAngle *= nSA;
    }

    nNewAngle=NormAngle18000(nNewAngle);
@@ -2148,7 +2148,7 @@
        bRight=false;

    nAngle=nNewAngle;
    double a = nAngle * F_PI18000;
    double a = nAngle.get() * F_PI18000;
    double nSin1=sin(a); // calculate now, so as little time as possible
    double nCos1=cos(a); // passes between Hide() and Show()
    Hide();
@@ -2162,7 +2162,7 @@
{
    Hide();

    if (nAngle!=0)
    if (nAngle!=0_deg100)
    {
        if (IsDraggingPoints())
        {
@@ -2204,10 +2204,10 @@
    OUString aStr = ImpGetDescriptionStr(STR_DragMethShear) +
        " (";

    sal_Int32 nTmpAngle(nAngle);
    Degree100 nTmpAngle(nAngle);

    if(bUpSideDown)
        nTmpAngle += 18000;
        nTmpAngle += 18000_deg100;

    nTmpAngle = NormAngle18000(nTmpAngle);

@@ -2280,7 +2280,7 @@
        return;

    bResize=!getSdrDragView().IsOrtho();
    tools::Long nSA=0;
    Degree100 nSA(0);

    if (getSdrDragView().IsAngleSnapEnabled())
        nSA=getSdrDragView().GetSnapAngle();
@@ -2290,7 +2290,7 @@
    Fraction aNewFract(1,1);

    // if angle snapping not activated, snap to raster (except when using slant)
    if (nSA==0 && !bSlant)
    if (nSA==0_deg100 && !bSlant)
        aPnt=GetSnapPos(aPnt);

    if (!bSlant && !bResize)
@@ -2304,7 +2304,7 @@
    Point aRef(DragStat().GetRef1());
    Point aDif(aPnt-aRef);

    tools::Long nNewAngle=0;
    Degree100 nNewAngle(0);

    if (bSlant)
    {
@@ -2318,16 +2318,16 @@
        if (bVertical)
            nNewAngle=NormAngle18000(GetAngle(aDif));
        else
            nNewAngle=NormAngle18000(-(GetAngle(aDif)-9000));
            nNewAngle=NormAngle18000(-(GetAngle(aDif)-9000_deg100));

        if (nNewAngle<-9000 || nNewAngle>9000)
            nNewAngle=NormAngle18000(nNewAngle+18000);
        if (nNewAngle<Degree100(-9000) || nNewAngle>9000_deg100)
            nNewAngle=NormAngle18000(nNewAngle+18000_deg100);

        if (bResize)
        {
            Point aPt2(aPnt);

            if (nSA!=0)
            if (nSA!=0_deg100)
                aPt2=GetSnapPos(aPnt); // snap this one in any case

            if (bVertical)
@@ -2341,34 +2341,34 @@
        }
    }

    bool bNeg=nNewAngle<0;
    bool bNeg=nNewAngle<0_deg100;

    if (bNeg)
        nNewAngle=-nNewAngle;

    if (nSA!=0)
    if (nSA!=0_deg100)
    { // angle snapping
        nNewAngle+=nSA/2;
        nNewAngle/=nSA;
        nNewAngle*=nSA;
        nNewAngle += nSA / 2_deg100;
        nNewAngle /= nSA;
        nNewAngle *= nSA;
    }

    nNewAngle=NormAngle36000(nNewAngle);
    bUpSideDown=nNewAngle>9000 && nNewAngle<27000;
    bUpSideDown=nNewAngle>9000_deg100 && nNewAngle<27000_deg100;

    if (bSlant)
    { // calculate resize for slant
        // when angle snapping is activated, disable 89 degree limit
        tools::Long nTmpAngle=nNewAngle;
        if (bUpSideDown) nNewAngle-=18000;
        Degree100 nTmpAngle=nNewAngle;
        if (bUpSideDown) nNewAngle -= 18000_deg100;
        if (bNeg) nTmpAngle=-nTmpAngle;
        bResize=true;
        aNewFract = cos(nTmpAngle * F_PI18000);
        aNewFract = cos(nTmpAngle.get() * F_PI18000);
        aFact.ReduceInaccurate(10); // three decimals should be enough
    }

    if (nNewAngle>8900)
        nNewAngle=8900;
    if (nNewAngle > 8900_deg100)
        nNewAngle = 8900_deg100;

    if (bNeg)
        nNewAngle=-nNewAngle;
@@ -2377,7 +2377,7 @@
    {
        nAngle=nNewAngle;
        aFact=aNewFract;
        double a = nAngle * F_PI18000;
        double a = nAngle.get() * F_PI18000;
        double nTan1=tan(a); // calculate now, so as little time as possible passes between Hide() and Show()
        Hide();
        nTan=nTan1;
@@ -2400,7 +2400,7 @@
        }
    }

    if (nAngle!=0)
    if (nAngle)
    {
        rTarget.Shear(DragStat().GetRef1(), nAngle, nTan, bVertical);
    }
@@ -2413,9 +2413,9 @@
    if (bResize && aFact==Fraction(1,1))
        bResize=false;

    if (nAngle!=0 || bResize)
    if (nAngle || bResize)
    {
        if (nAngle!=0 && bResize)
        if (nAngle && bResize)
        {
            OUString aStr = ImpGetDescriptionStr(STR_EditShear);

@@ -2439,12 +2439,12 @@
            bCopy=false;
        }

        if (nAngle!=0)
        if (nAngle)
        {
            getSdrDragView().ShearMarkedObj(DragStat().GetRef1(),nAngle,bVertical,bCopy);
        }

        if (nAngle!=0 && bResize)
        if (nAngle && bResize)
            getSdrDragView().EndUndo();

        return true;
@@ -2480,11 +2480,11 @@

bool SdrDragMirror::ImpCheckSide(const Point& rPnt) const
{
    tools::Long nAngle1=GetAngle(rPnt-DragStat().GetRef1());
    Degree100 nAngle1=GetAngle(rPnt-DragStat().GetRef1());
    nAngle1-=nAngle;
    nAngle1=NormAngle36000(nAngle1);

    return nAngle1<18000;
    return nAngle1<18000_deg100;
}

OUString SdrDragMirror::GetSdrDragComment() const
@@ -2787,7 +2787,7 @@
            nVal *= 2;

        nVal = std::abs(nVal);
        aStr += SdrModel::GetAngleString(nVal) + ")";
        aStr += SdrModel::GetAngleString(Degree100(nVal)) + ")";
    }

    if(getSdrDragView().IsDragWithCopy())
@@ -3131,12 +3131,12 @@
    }

    tools::Long nNewRad=0;
    nAngle=0;
    nAngle=0_deg100;

    if (bValid)
    {
        double a=0; // slope of the radius
        tools::Long nPntWink=0;
        Degree100 nPntWink(0);

        if (bVertical)
        {
@@ -3150,39 +3150,39 @@
            a=static_cast<double>(dx1)/static_cast<double>(dy1); // slope of the radius
            nNewRad=(static_cast<tools::Long>(dx1*a)+dy1) /2;
            aNewCenter.AdjustY(nNewRad );
            nPntWink=GetAngle(aPnt-aNewCenter)-9000;
            nPntWink=GetAngle(aPnt-aNewCenter)-9000_deg100;
        }

        if (!bAtCenter)
        {
            if (nNewRad<0)
            {
                if (bRgt) nPntWink+=18000;
                if (bLft) nPntWink=18000-nPntWink;
                if (bLwr) nPntWink=-nPntWink;
                if (bRgt) nPntWink += 18000_deg100;
                if (bLft) nPntWink = 18000_deg100 - nPntWink;
                if (bLwr) nPntWink =- nPntWink;
            }
            else
            {
                if (bRgt) nPntWink=-nPntWink;
                if (bUpr) nPntWink=18000-nPntWink;
                if (bLwr) nPntWink+=18000;
                if (bRgt) nPntWink = -nPntWink;
                if (bUpr) nPntWink = 18000_deg100 - nPntWink;
                if (bLwr) nPntWink += 18000_deg100;
            }

            nPntWink=NormAngle36000(nPntWink);
        }
        else
        {
            if (nNewRad<0) nPntWink+=18000;
            if (bVertical) nPntWink=18000-nPntWink;
            nPntWink=NormAngle18000(nPntWink);
            nPntWink = std::abs(nPntWink);
            if (nNewRad<0) nPntWink += 18000_deg100;
            if (bVertical) nPntWink = 18000_deg100 - nPntWink;
            nPntWink = NormAngle18000(nPntWink);
            nPntWink = abs(nPntWink);
        }

        double nUmfang = 2 * std::abs(nNewRad) * M_PI;
        double nCircumference = 2 * std::abs(nNewRad) * M_PI;

        if (bResize)
        {
            tools::Long nMul=static_cast<tools::Long>(nUmfang*NormAngle36000(nPntWink)/36000);
            tools::Long nMul=static_cast<tools::Long>(nCircumference * NormAngle36000(nPntWink).get() / 36000.0);

            if (bAtCenter)
                nMul*=2;
@@ -3192,14 +3192,14 @@
        }
        else
        {
            nAngle=static_cast<tools::Long>((nMarkSize*360/nUmfang)*100)/2;
            nAngle = Degree100(static_cast<tools::Long>((nMarkSize*360/nCircumference)*100)/2);

            if (nAngle==0)
            if (nAngle==0_deg100)
                bValid=false;
        }
    }

    if (nAngle==0 || nNewRad==0)
    if (nAngle==0_deg100 || nNewRad==0)
        bValid=false;

    if (!bValid)
diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx
index 9136ed3..f212882 100644
--- a/svx/source/svdraw/svdedtv1.cxx
+++ b/svx/source/svdraw/svdedtv1.cxx
@@ -280,9 +280,9 @@
        EndUndo();
}

tools::Long SdrEditView::GetMarkedObjRotate() const
Degree100 SdrEditView::GetMarkedObjRotate() const
{
    tools::Long nRetval(0);
    Degree100 nRetval(0);

    if(GetMarkedObjectCount())
    {
@@ -295,7 +295,7 @@
    return nRetval;
}

void SdrEditView::RotateMarkedObj(const Point& rRef, tools::Long nAngle, bool bCopy)
void SdrEditView::RotateMarkedObj(const Point& rRef, Degree100 nAngle, bool bCopy)
{
    const bool bUndo = IsUndoEnabled();
    if( bUndo )
@@ -309,8 +309,8 @@
    if (bCopy)
        CopyMarkedObj();

    double nSin = sin(nAngle * F_PI18000);
    double nCos = cos(nAngle * F_PI18000);
    double nSin = sin(nAngle.get() * F_PI18000);
    double nCos = cos(nAngle.get() * F_PI18000);
    const size_t nMarkCount(GetMarkedObjectCount());

    if(nMarkCount)
@@ -431,27 +431,27 @@
    MirrorMarkedObj(aCenter,aPt2);
}

tools::Long SdrEditView::GetMarkedObjShear() const
Degree100 SdrEditView::GetMarkedObjShear() const
{
    bool b1st=true;
    bool bOk=true;
    tools::Long nAngle=0;
    Degree100 nAngle(0);
    const size_t nMarkCount=GetMarkedObjectCount();
    for (size_t nm=0; nm<nMarkCount && bOk; ++nm) {
        SdrMark* pM=GetSdrMarkByIndex(nm);
        SdrObject* pO=pM->GetMarkedSdrObj();
        tools::Long nAngle2=pO->GetShearAngle();
        Degree100 nAngle2=pO->GetShearAngle();
        if (b1st) nAngle=nAngle2;
        else if (nAngle2!=nAngle) bOk=false;
        b1st=false;
    }
    if (nAngle>SDRMAXSHEAR) nAngle=SDRMAXSHEAR;
    if (nAngle<-SDRMAXSHEAR) nAngle=-SDRMAXSHEAR;
    if (!bOk) nAngle=0;
    if (!bOk) nAngle=0_deg100;
    return nAngle;
}

void SdrEditView::ShearMarkedObj(const Point& rRef, tools::Long nAngle, bool bVShear, bool bCopy)
void SdrEditView::ShearMarkedObj(const Point& rRef, Degree100 nAngle, bool bVShear, bool bCopy)
{
    const bool bUndo = IsUndoEnabled();

@@ -467,7 +467,7 @@
    if (bCopy)
        CopyMarkedObj();

    double nTan = tan(nAngle * F_PI18000);
    double nTan = tan(nAngle.get() * F_PI18000);
    const size_t nMarkCount=GetMarkedObjectCount();
    for (size_t nm=0; nm<nMarkCount; ++nm)
    {
@@ -558,7 +558,7 @@
    aCtr1 -= aCtr0;

    if(bRotOk)
        pO->Rotate(aCtr0, FRound(nAngle / F_PI18000), nSin, nCos);
        pO->Rotate(aCtr0, Degree100(FRound(nAngle / F_PI18000)), nSin, nCos);

    pO->Move(Size(aCtr1.X(),aCtr1.Y()));
}
@@ -741,15 +741,15 @@
        ResizeMarkedObj(aAllSnapRect.TopLeft(),Fraction(1,1),aYFact);
    }
    if (rAttr.GetItemState(SDRATTR_ROTATEALL,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long nAngle=static_cast<const SdrRotateAllItem*>(pPoolItem)->GetValue();
        Degree100 nAngle=static_cast<const SdrRotateAllItem*>(pPoolItem)->GetValue();
        RotateMarkedObj(aAllSnapRect.Center(),nAngle);
    }
    if (rAttr.GetItemState(SDRATTR_HORZSHEARALL,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long nAngle=static_cast<const SdrHorzShearAllItem*>(pPoolItem)->GetValue();
        Degree100 nAngle=static_cast<const SdrHorzShearAllItem*>(pPoolItem)->GetValue();
        ShearMarkedObj(aAllSnapRect.Center(),nAngle);
    }
    if (rAttr.GetItemState(SDRATTR_VERTSHEARALL,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long nAngle=static_cast<const SdrVertShearAllItem*>(pPoolItem)->GetValue();
        Degree100 nAngle=static_cast<const SdrVertShearAllItem*>(pPoolItem)->GetValue();
        ShearMarkedObj(aAllSnapRect.Center(),nAngle,true);
    }

@@ -789,8 +789,8 @@
    tools::Long nSnapHgt=0;       bool bSnapHgtDC=false;
    tools::Long nLogicWdt=0;      bool bLogicWdtDC=false,bLogicWdtDiff=false;
    tools::Long nLogicHgt=0;      bool bLogicHgtDC=false,bLogicHgtDiff=false;
    tools::Long nRotAngle=0;      bool bRotAngleDC=false;
    tools::Long nShrAngle=0;      bool bShrAngleDC=false;
    Degree100 nRotAngle(0);      bool bRotAngleDC=false;
    Degree100 nShrAngle(0);      bool bShrAngleDC=false;
    tools::Rectangle aSnapRect;
    tools::Rectangle aLogicRect;
    const size_t nMarkCount=GetMarkedObjectCount();
@@ -1523,8 +1523,8 @@
        GetSdrPageView()->LogicToPagePos(aRect);
    }

    tools::Long nOldRotateAngle=GetMarkedObjRotate();
    tools::Long nOldShearAngle=GetMarkedObjShear();
    Degree100 nOldRotateAngle=GetMarkedObjRotate();
    Degree100 nOldShearAngle=GetMarkedObjShear();
    const SdrMarkList& rMarkList=GetMarkedObjectList();
    const size_t nMarkCount=rMarkList.GetMarkCount();
    SdrObject* pObj=nullptr;
@@ -1534,7 +1534,7 @@
    tools::Long nPosDY=0;
    tools::Long nSizX=0;
    tools::Long nSizY=0;
    tools::Long nRotateAngle=0;
    Degree100 nRotateAngle(0);

    bool bModeIsRotate(meDragMode == SdrDragMode::Rotate);
    tools::Long nRotateX(0);
@@ -1554,7 +1554,7 @@
        nRotateY = nOldRotateY = aRotateAxe.Y();
    }

    tools::Long nShearAngle=0;
    Degree100 nShearAngle(0);
    tools::Long nShearX=0;
    tools::Long nShearY=0;
    bool bShearVert=false;
@@ -1601,13 +1601,13 @@
    // rotation
    if (SfxItemState::SET == rAttr.GetItemState(SID_ATTR_TRANSFORM_DELTA_ANGLE, true, &pPoolItem)) {
        nRotateAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        bRotate = (nRotateAngle != 0);
        bRotate = (nRotateAngle != 0_deg100);
    }

    // rotation
    if (SfxItemState::SET == rAttr.GetItemState(SID_ATTR_TRANSFORM_ANGLE, true, &pPoolItem)) {
        nRotateAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue() - nOldRotateAngle;
        bRotate = (nRotateAngle != 0);
        bRotate = (nRotateAngle != 0_deg100);
    }

    // position rotation point x
@@ -1620,7 +1620,7 @@

    // shearing
    if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_SHEAR,true,&pPoolItem)) {
        tools::Long nNewShearAngle=static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        Degree100 nNewShearAngle=static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        if (nNewShearAngle>SDRMAXSHEAR) nNewShearAngle=SDRMAXSHEAR;
        if (nNewShearAngle<-SDRMAXSHEAR) nNewShearAngle=-SDRMAXSHEAR;
        if (nNewShearAngle!=nOldShearAngle) {
@@ -1628,18 +1628,18 @@
            if (bShearVert) {
                nShearAngle=nNewShearAngle;
            } else {
                if (nNewShearAngle!=0 && nOldShearAngle!=0) {
                if (nNewShearAngle!=0_deg100 && nOldShearAngle!=0_deg100) {
                    // bug fix
                    double nOld = tan(static_cast<double>(nOldShearAngle) * F_PI18000);
                    double nNew = tan(static_cast<double>(nNewShearAngle) * F_PI18000);
                    double nOld = tan(static_cast<double>(nOldShearAngle.get()) * F_PI18000);
                    double nNew = tan(static_cast<double>(nNewShearAngle.get()) * F_PI18000);
                    nNew-=nOld;
                    nNew = atan(nNew) / F_PI18000;
                    nShearAngle=FRound(nNew);
                    nShearAngle=Degree100(FRound(nNew));
                } else {
                    nShearAngle=nNewShearAngle-nOldShearAngle;
                }
            }
            bShear=nShearAngle!=0;
            bShear=nShearAngle!=0_deg100;
            if (bShear) {
                nShearX=static_cast<const SfxInt32Item&>(rAttr.Get(SID_ATTR_TRANSFORM_SHEAR_X)).GetValue();
                nShearY=static_cast<const SfxInt32Item&>(rAttr.Get(SID_ATTR_TRANSFORM_SHEAR_Y)).GetValue();
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index d761998..5106702 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -1521,7 +1521,7 @@

            pTEObj->EndTextEdit(*pTEOutliner);

            if ((pTEObj->GetRotateAngle() != 0)
            if ((pTEObj->GetRotateAngle() != 0_deg100)
                || (dynamic_cast<const SdrTextObj*>(pTEObj) != nullptr && pTEObj->IsFontwork()))
            {
                pTEObj->ActionChanged();
diff --git a/svx/source/svdraw/svdfmtf.cxx b/svx/source/svdraw/svdfmtf.cxx
index 31624873..34a4912 100644
--- a/svx/source/svdraw/svdfmtf.cxx
+++ b/svx/source/svdraw/svdfmtf.cxx
@@ -742,8 +742,8 @@
void ImpSdrGDIMetaFileImport::DoAction(MetaArcAction const & rAct)
{
    Point aCenter(rAct.GetRect().Center());
    tools::Long nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    tools::Long nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    Degree100 nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    Degree100 nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    SdrCircObj* pCirc = new SdrCircObj(
        *mpModel,
        SdrCircKind::Arc,
@@ -755,8 +755,8 @@
void ImpSdrGDIMetaFileImport::DoAction(MetaPieAction const & rAct)
{
    Point aCenter(rAct.GetRect().Center());
    tools::Long nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    tools::Long nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    Degree100 nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    Degree100 nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    SdrCircObj* pCirc = new SdrCircObj(
        *mpModel,
        SdrCircKind::Section,
@@ -770,8 +770,8 @@
void ImpSdrGDIMetaFileImport::DoAction(MetaChordAction const & rAct)
{
    Point aCenter(rAct.GetRect().Center());
    tools::Long nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    tools::Long nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    Degree100 nStart=GetAngle(rAct.GetStartPoint()-aCenter);
    Degree100 nEnd=GetAngle(rAct.GetEndPoint()-aCenter);
    SdrCircObj* pCirc = new SdrCircObj(
        *mpModel,
        SdrCircKind::Cut,
@@ -1053,12 +1053,9 @@
        aAttr.Put(XFillColorItem(OUString(), aFnt.GetFillColor()));
        pText->SetMergedItemSet(aAttr);
    }
    sal_Int32 nAngle = aFnt.GetOrientation().get();
    Degree100 nAngle = toDegree100(aFnt.GetOrientation());
    if ( nAngle )
    {
        nAngle*=10;
        pText->SdrAttrObj::NbcRotate(aPos,nAngle);
    }
    InsertObj( pText, false );
}

diff --git a/svx/source/svdraw/svdglev.cxx b/svx/source/svdraw/svdglev.cxx
index 370563d..78c92f7 100644
--- a/svx/source/svdraw/svdglev.cxx
+++ b/svx/source/svdraw/svdglev.cxx
@@ -383,15 +383,15 @@
    RotatePoint(rPt,*static_cast<const Point*>(p1),*static_cast<const double*>(p3),*static_cast<const double*>(p4));
}

void SdrGlueEditView::RotateMarkedGluePoints(const Point& rRef, tools::Long nAngle, bool bCopy)
void SdrGlueEditView::RotateMarkedGluePoints(const Point& rRef, Degree100 nAngle, bool bCopy)
{
    ForceUndirtyMrkPnt();
    OUString aStr(SvxResId(STR_EditRotate));
    if (bCopy) aStr+=SvxResId(STR_EditWithCopy);
    BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SdrRepeatFunc::Rotate);
    if (bCopy) ImpCopyMarkedGluePoints();
    double nSin = sin(nAngle * F_PI18000);
    double nCos = cos(nAngle * F_PI18000);
    double nSin = sin(nAngle.get() * F_PI18000);
    double nCos = cos(nAngle.get() * F_PI18000);
    ImpTransformMarkedGluePoints(ImpRotate,&rRef,&nAngle,&nSin,&nCos);
    EndUndo();
    AdjustMarkHdl();
diff --git a/svx/source/svdraw/svdglue.cxx b/svx/source/svdraw/svdglue.cxx
index 0d3db7f..4cce1a5 100644
--- a/svx/source/svdraw/svdglue.cxx
+++ b/svx/source/svdraw/svdglue.cxx
@@ -125,68 +125,68 @@
    aPos=aPt;
}

tools::Long SdrGluePoint::GetAlignAngle() const
Degree100 SdrGluePoint::GetAlignAngle() const
{
    if (nAlign == (SdrAlign::HORZ_CENTER|SdrAlign::VERT_CENTER))
        return 0; // Invalid!
        return 0_deg100; // Invalid!
    else if (nAlign == (SdrAlign::HORZ_RIGHT |SdrAlign::VERT_CENTER))
        return 0;
        return 0_deg100;
    else if (nAlign == (SdrAlign::HORZ_RIGHT |SdrAlign::VERT_TOP))
        return 4500;
        return 4500_deg100;
    else if (nAlign == (SdrAlign::HORZ_CENTER|SdrAlign::VERT_TOP))
        return 9000;
        return 9000_deg100;
    else if (nAlign == (SdrAlign::HORZ_LEFT  |SdrAlign::VERT_TOP))
        return 13500;
        return 13500_deg100;
    else if (nAlign == (SdrAlign::HORZ_LEFT  |SdrAlign::VERT_CENTER))
        return 18000;
        return 18000_deg100;
    else if (nAlign == (SdrAlign::HORZ_LEFT  |SdrAlign::VERT_BOTTOM))
        return 22500;
        return 22500_deg100;
    else if (nAlign == (SdrAlign::HORZ_CENTER|SdrAlign::VERT_BOTTOM))
        return 27000;
        return 27000_deg100;
    else if (nAlign == (SdrAlign::HORZ_RIGHT |SdrAlign::VERT_BOTTOM))
        return 31500;
    return 0;
        return 31500_deg100;
    return 0_deg100;
}

void SdrGluePoint::SetAlignAngle(tools::Long nAngle)
void SdrGluePoint::SetAlignAngle(Degree100 nAngle)
{
    nAngle=NormAngle36000(nAngle);
    if (nAngle>=33750 || nAngle<2250) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_CENTER;
    else if (nAngle< 6750) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_TOP   ;
    else if (nAngle<11250) nAlign=SdrAlign::HORZ_CENTER|SdrAlign::VERT_TOP   ;
    else if (nAngle<15750) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_TOP   ;
    else if (nAngle<20250) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_CENTER;
    else if (nAngle<24750) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_BOTTOM;
    else if (nAngle<29250) nAlign=SdrAlign::HORZ_CENTER|SdrAlign::VERT_BOTTOM;
    else if (nAngle<33750) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_BOTTOM;
    if (nAngle>=33750_deg100 || nAngle<2250_deg100) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_CENTER;
    else if (nAngle< 6750_deg100) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_TOP   ;
    else if (nAngle<11250_deg100) nAlign=SdrAlign::HORZ_CENTER|SdrAlign::VERT_TOP   ;
    else if (nAngle<15750_deg100) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_TOP   ;
    else if (nAngle<20250_deg100) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_CENTER;
    else if (nAngle<24750_deg100) nAlign=SdrAlign::HORZ_LEFT  |SdrAlign::VERT_BOTTOM;
    else if (nAngle<29250_deg100) nAlign=SdrAlign::HORZ_CENTER|SdrAlign::VERT_BOTTOM;
    else if (nAngle<33750_deg100) nAlign=SdrAlign::HORZ_RIGHT |SdrAlign::VERT_BOTTOM;
}

tools::Long SdrGluePoint::EscDirToAngle(SdrEscapeDirection nEsc)
Degree100 SdrGluePoint::EscDirToAngle(SdrEscapeDirection nEsc)
{
    switch (nEsc) {
        case SdrEscapeDirection::RIGHT : return 0;
        case SdrEscapeDirection::TOP   : return 9000;
        case SdrEscapeDirection::LEFT  : return 18000;
        case SdrEscapeDirection::BOTTOM: return 27000;
        case SdrEscapeDirection::RIGHT : return 0_deg100;
        case SdrEscapeDirection::TOP   : return 9000_deg100;
        case SdrEscapeDirection::LEFT  : return 18000_deg100;
        case SdrEscapeDirection::BOTTOM: return 27000_deg100;
        default: break;
    } // switch
    return 0;
    return 0_deg100;
}

SdrEscapeDirection SdrGluePoint::EscAngleToDir(tools::Long nAngle)
SdrEscapeDirection SdrGluePoint::EscAngleToDir(Degree100 nAngle)
{
    nAngle=NormAngle36000(nAngle);
    if (nAngle>=31500 || nAngle<4500)
    if (nAngle>=31500_deg100 || nAngle<4500_deg100)
        return SdrEscapeDirection::RIGHT;
    if (nAngle<13500)
    if (nAngle<13500_deg100)
        return SdrEscapeDirection::TOP;
    if (nAngle<22500)
    if (nAngle<22500_deg100)
        return SdrEscapeDirection::LEFT;
    /* (nAngle<31500)*/
    return SdrEscapeDirection::BOTTOM;
}

void SdrGluePoint::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs, const SdrObject* pObj)
void SdrGluePoint::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs, const SdrObject* pObj)
{
    Point aPt(pObj!=nullptr ? GetAbsolutePos(*pObj) : GetPos());
    RotatePoint(aPt,rRef,sn,cs);
@@ -206,38 +206,38 @@
    if (pObj!=nullptr) SetAbsolutePos(aPt,*pObj); else SetPos(aPt);
}

void SdrGluePoint::Mirror(const Point& rRef1, const Point& rRef2, tools::Long nAngle, const SdrObject* pObj)
void SdrGluePoint::Mirror(const Point& rRef1, const Point& rRef2, Degree100 nAngle, const SdrObject* pObj)
{
    Point aPt(pObj!=nullptr ? GetAbsolutePos(*pObj) : GetPos());
    MirrorPoint(aPt,rRef1,rRef2);
    // mirror reference edge
    if(nAlign != (SdrAlign::HORZ_CENTER|SdrAlign::VERT_CENTER))
    {
        tools::Long nAW=GetAlignAngle();
        nAW+=2*(nAngle-nAW);
        Degree100 nAW=GetAlignAngle();
        nAW+=2_deg100*(nAngle-nAW);
        SetAlignAngle(nAW);
    }
    // mirror exit directions
    SdrEscapeDirection nEscDir0=nEscDir;
    SdrEscapeDirection nEscDir1=SdrEscapeDirection::SMART;
    if (nEscDir0&SdrEscapeDirection::LEFT) {
        tools::Long nEW=EscDirToAngle(SdrEscapeDirection::LEFT);
        nEW+=2*(nAngle-nEW);
        Degree100 nEW=EscDirToAngle(SdrEscapeDirection::LEFT);
        nEW+=2_deg100*(nAngle-nEW);
        nEscDir1|=EscAngleToDir(nEW);
    }
    if (nEscDir0&SdrEscapeDirection::TOP) {
        tools::Long nEW=EscDirToAngle(SdrEscapeDirection::TOP);
        nEW+=2*(nAngle-nEW);
        Degree100 nEW=EscDirToAngle(SdrEscapeDirection::TOP);
        nEW+=2_deg100*(nAngle-nEW);
        nEscDir1|=EscAngleToDir(nEW);
    }
    if (nEscDir0&SdrEscapeDirection::RIGHT) {
        tools::Long nEW=EscDirToAngle(SdrEscapeDirection::RIGHT);
        nEW+=2*(nAngle-nEW);
        Degree100 nEW=EscDirToAngle(SdrEscapeDirection::RIGHT);
        nEW+=2_deg100*(nAngle-nEW);
        nEscDir1|=EscAngleToDir(nEW);
    }
    if (nEscDir0&SdrEscapeDirection::BOTTOM) {
        tools::Long nEW=EscDirToAngle(SdrEscapeDirection::BOTTOM);
        nEW+=2*(nAngle-nEW);
        Degree100 nEW=EscDirToAngle(SdrEscapeDirection::BOTTOM);
        nEW+=2_deg100*(nAngle-nEW);
        nEscDir1|=EscAngleToDir(nEW);
    }
    nEscDir=nEscDir1;
@@ -361,7 +361,7 @@
        xGP->SetReallyAbsolute(bOn,rObj);
}

void SdrGluePointList::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs, const SdrObject* pObj)
void SdrGluePointList::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs, const SdrObject* pObj)
{
    for (auto& xGP : aList)
        xGP->Rotate(rRef,nAngle,sn,cs,pObj);
@@ -370,11 +370,11 @@
void SdrGluePointList::Mirror(const Point& rRef1, const Point& rRef2, const SdrObject* pObj)
{
    Point aPt(rRef2); aPt-=rRef1;
    tools::Long nAngle=GetAngle(aPt);
    Degree100 nAngle=GetAngle(aPt);
    Mirror(rRef1,rRef2,nAngle,pObj);
}

void SdrGluePointList::Mirror(const Point& rRef1, const Point& rRef2, tools::Long nAngle, const SdrObject* pObj)
void SdrGluePointList::Mirror(const Point& rRef1, const Point& rRef2, Degree100 nAngle, const SdrObject* pObj)
{
    for (auto& xGP : aList)
        xGP->Mirror(rRef1,rRef2,nAngle,pObj);
diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx
index 99aae2a..33df3e7 100644
--- a/svx/source/svdraw/svdhdl.cxx
+++ b/svx/source/svdraw/svdhdl.cxx
@@ -327,7 +327,7 @@
    }
}

void SdrHdl::SetRotationAngle(tools::Long n)
void SdrHdl::SetRotationAngle(Degree100 n)
{
    if(nRotationAngle != n)
    {
@@ -965,24 +965,24 @@
        }
    } else {
        // When resizing rotated rectangles, rotate the mouse cursor slightly, too
        if (bSize && nRotationAngle!=0) {
            tools::Long nHdlAngle=0;
        if (bSize && nRotationAngle!=0_deg100) {
            Degree100 nHdlAngle(0);
            switch (eKind) {
                case SdrHdlKind::LowerRight: nHdlAngle=31500; break;
                case SdrHdlKind::Lower: nHdlAngle=27000; break;
                case SdrHdlKind::LowerLeft: nHdlAngle=22500; break;
                case SdrHdlKind::Left : nHdlAngle=18000; break;
                case SdrHdlKind::UpperLeft: nHdlAngle=13500; break;
                case SdrHdlKind::Upper: nHdlAngle=9000;  break;
                case SdrHdlKind::UpperRight: nHdlAngle=4500;  break;
                case SdrHdlKind::Right: nHdlAngle=0;     break;
                case SdrHdlKind::LowerRight: nHdlAngle=31500_deg100; break;
                case SdrHdlKind::Lower: nHdlAngle=27000_deg100; break;
                case SdrHdlKind::LowerLeft: nHdlAngle=22500_deg100; break;
                case SdrHdlKind::Left : nHdlAngle=18000_deg100; break;
                case SdrHdlKind::UpperLeft: nHdlAngle=13500_deg100; break;
                case SdrHdlKind::Upper: nHdlAngle=9000_deg100;  break;
                case SdrHdlKind::UpperRight: nHdlAngle=4500_deg100;  break;
                case SdrHdlKind::Right: nHdlAngle=0_deg100;     break;
                default:
                    break;
            }
            // a little bit more (for rounding)
            nHdlAngle = NormAngle36000(nHdlAngle + nRotationAngle + 2249);
            nHdlAngle/=4500;
            switch (static_cast<sal_uInt8>(nHdlAngle)) {
            nHdlAngle = NormAngle36000(nHdlAngle + nRotationAngle + 2249_deg100);
            nHdlAngle/=4500_deg100;
            switch (static_cast<sal_uInt8>(nHdlAngle.get())) {
                case 0: ePtr=PointerStyle::ESize;  break;
                case 1: ePtr=PointerStyle::NESize; break;
                case 2: ePtr=PointerStyle::NSize;  break;
@@ -1831,7 +1831,7 @@
                    fTransparence,
                    3.0,
                    3.0,
                    nRotationAngle * -F_PI18000,
                    nRotationAngle.get() * -F_PI18000,
                    true)); // allow animation; the Handle is not shown at text edit time

                pNewOverlayObject->setHittable(false);
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx
index e45aaca..1e95644 100644
--- a/svx/source/svdraw/svdmodel.cxx
+++ b/svx/source/svdraw/svdmodel.cxx
@@ -1202,9 +1202,9 @@
    return aBuf.makeStringAndClear();
}

OUString SdrModel::GetAngleString(tools::Long nAngle)
OUString SdrModel::GetAngleString(Degree100 nAngle)
{
    bool bNeg = nAngle < 0;
    bool bNeg = nAngle < 0_deg100;

    if(bNeg)
        nAngle = -nAngle;
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index 0d6911e..dcb8c60 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -738,7 +738,7 @@
        {
            SdrMark* pM = GetSdrMarkByIndex(0);
            SdrObject* pO = pM->GetMarkedSdrObj();
            tools::Long nRotAngle = pO->GetRotateAngle();
            Degree100 nRotAngle = pO->GetRotateAngle();
            // true if we are dealing with a RotGrfFlyFrame
            // (SwVirtFlyDrawObj with a SwGrfNode)
            bool bWriterGraphic = pO->HasLimitedRotation();
@@ -883,7 +883,7 @@
            aExtraInfo.append("}");

            sSelectionText = aSelection.toString() +
                ", " + OString::number(nRotAngle);
                ", " + OString::number(nRotAngle.get());
            if (!aExtraInfo.isEmpty())
            {
                sSelectionText += ", " + aExtraInfo.makeStringAndClear();
diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx
index c935ca6..835d4f13 100644
--- a/svx/source/svdraw/svdoashp.cxx
+++ b/svx/source/svdraw/svdoashp.cxx
@@ -1527,9 +1527,8 @@
    }

    // updating fObjectRotation
    tools::Long nTextObjRotation = aGeo.nRotationAngle;
    double fAngle = nTextObjRotation;
    fAngle /= 100.0;
    Degree100 nTextObjRotation = aGeo.nRotationAngle;
    double fAngle = toDegrees(nTextObjRotation);
    if (IsMirroredX())
    {
        if (IsMirroredY())
@@ -1552,7 +1551,7 @@
    InvalidateRenderGeometry();
}

void SdrObjCustomShape::NbcRotate( const Point& rRef, tools::Long nAngle, double sn, double cs )
void SdrObjCustomShape::NbcRotate( const Point& rRef, Degree100 nAngle, double sn, double cs )
{
    bool bMirroredX = IsMirroredX();
    bool bMirroredY = IsMirroredY();
@@ -1566,7 +1565,7 @@
    SdrTextObj::NbcRotate( maRect.TopLeft(), -aGeo.nRotationAngle,        // retrieving the unrotated text object
                            -aGeo.mfSinRotationAngle,
                            aGeo.mfCosRotationAngle );
    aGeo.nRotationAngle = 0;                                             // resetting aGeo data
    aGeo.nRotationAngle = 0_deg100;                                             // resetting aGeo data
    aGeo.RecalcSinCos();

    tools::Long nW = static_cast<tools::Long>( fObjectRotation * 100 );                      // applying our object rotation
@@ -1577,7 +1576,7 @@
    nW = nW % 36000;
    if ( nW < 0 )
        nW = 36000 + nW;
    SdrTextObj::NbcRotate( maRect.TopLeft(), nW,                     // applying text rotation
    SdrTextObj::NbcRotate( maRect.TopLeft(), Degree100(nW),                     // applying text rotation
                            sin( nW * F_PI18000 ),
                            cos( nW * F_PI18000 ) );

@@ -1587,8 +1586,7 @@
    if ( bMirroredY )
        nSwap ^= 1;

    double fAngle = nAngle;                                                   // updating to our new object rotation
    fAngle /= 100.0;
    double fAngle = toDegrees(nAngle);     // updating to our new object rotation
    fObjectRotation = fmod( nSwap ? fObjectRotation - fAngle : fObjectRotation + fAngle, 360.0 );
    if ( fObjectRotation < 0 )
        fObjectRotation = 360 + fObjectRotation;
@@ -1625,10 +1623,8 @@
            SdrTextObj::NbcMirror( rRef1, rRef2 );

            // update fObjectRotation
            tools::Long nTextObjRotation = aGeo.nRotationAngle;
            double fAngle = nTextObjRotation;

            fAngle /= 100.0;
            Degree100 nTextObjRotation = aGeo.nRotationAngle;
            double fAngle = toDegrees(nTextObjRotation);

            bool bSingleFlip = (IsMirroredX()!= IsMirroredY());

@@ -1644,20 +1640,19 @@
    InvalidateRenderGeometry();
}

void SdrObjCustomShape::Shear( const Point& rRef, tools::Long nAngle, double tn, bool bVShear )
void SdrObjCustomShape::Shear( const Point& rRef, Degree100 nAngle, double tn, bool bVShear )
{
    SdrTextObj::Shear( rRef, nAngle, tn, bVShear );
    InvalidateRenderGeometry();
}
void SdrObjCustomShape::NbcShear( const Point& rRef, tools::Long nAngle, double tn, bool bVShear )
void SdrObjCustomShape::NbcShear( const Point& rRef, Degree100 nAngle, double tn, bool bVShear )
{
    // TTTT: Fix for old mirroring, can be removed again in aw080
    SdrTextObj::NbcShear(rRef,nAngle,tn,bVShear);

    // updating fObjectRotation
    tools::Long nTextObjRotation = aGeo.nRotationAngle;
    double fAngle = nTextObjRotation;
    fAngle /= 100.0;
    Degree100 nTextObjRotation = aGeo.nRotationAngle;
    double fAngle = toDegrees(nTextObjRotation);
    if (IsMirroredX())
    {
        if (IsMirroredY())
@@ -1698,8 +1693,8 @@
        case 2: aPt=maRect.BottomCenter(); aPt.AdjustY(nWdt ); break;
        case 3: aPt=maRect.LeftCenter();   aPt.AdjustX( -nWdt ); break;
    }
    if (aGeo.nShearAngle!=0) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle!=0_deg100) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0_deg100) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    aPt-=GetSnapRect().Center();
    SdrGluePoint aGP(aPt);
    aGP.SetPercent(false);
@@ -1743,7 +1738,7 @@
    bool bMirroredX = IsMirroredX();
    bool bMirroredY = IsMirroredY();

    tools::Long nShearAngle = aGeo.nShearAngle;
    Degree100 nShearAngle = aGeo.nShearAngle;
    double fTan = aGeo.mfTanShearAngle;

    if ( aGeo.nRotationAngle || nShearAngle || bMirroredX || bMirroredY )
@@ -1756,7 +1751,7 @@
                ShearPoint(aPoly[i],maRect.Center(), fTan );
        }
        if ( aGeo.nRotationAngle )
            aPoly.Rotate( maRect.Center(), Degree10(aGeo.nRotationAngle / 10) );
            aPoly.Rotate( maRect.Center(), toDegree10(aGeo.nRotationAngle) );

        tools::Rectangle aBoundRect( aPoly.GetBoundRect() );
        sal_Int32 nXDiff = aBoundRect.Left() - maRect.Left();
@@ -2744,7 +2739,7 @@
        if (eVAdj==SDRTEXTVERTADJUST_BOTTOM)
            aTextPos.AdjustY(nFreeHgt );
    }
    if (aGeo.nRotationAngle!=0)
    if (aGeo.nRotationAngle!=0_deg100)
        RotatePoint(aTextPos,aAnkRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);

    if (pAnchorRect)
@@ -3003,9 +2998,9 @@

    // reset object shear and rotations
    fObjectRotation = 0.0;
    aGeo.nRotationAngle = 0;
    aGeo.nRotationAngle = 0_deg100;
    aGeo.RecalcSinCos();
    aGeo.nShearAngle = 0;
    aGeo.nShearAngle = 0_deg100;
    aGeo.RecalcTan();

    // if anchor is used, make position relative to it
@@ -3038,7 +3033,7 @@
        // #i123181# The fix for #121932# here was wrong, the trunk version does not correct the
        // mirrored shear values, neither at the object level, nor on the API or XML level. Taking
        // back the mirroring of the shear angle
        aGeoStat.nShearAngle = FRound(basegfx::rad2deg(atan(fShearX)) * 100.0);
        aGeoStat.nShearAngle = Degree100(FRound(basegfx::rad2deg(atan(fShearX)) * 100.0));
        aGeoStat.RecalcTan();
        Shear(Point(), aGeoStat.nShearAngle, aGeoStat.mfTanShearAngle, false);
    }
@@ -3051,7 +3046,7 @@
        // #i78696#
        // fRotate is mathematically correct, but aGeoStat.nRotationAngle is
        // mirrored -> mirror value here
        aGeoStat.nRotationAngle = NormAngle36000(FRound(-fRotate / F_PI18000));
        aGeoStat.nRotationAngle = NormAngle36000(Degree100(FRound(-fRotate / F_PI18000)));
        aGeoStat.RecalcSinCos();
        Rotate(Point(), aGeoStat.nRotationAngle, aGeoStat.mfSinRotationAngle, aGeoStat.mfCosRotationAngle);
    }
@@ -3092,7 +3087,7 @@
{
    // get turn and shear
    double fRotate = basegfx::deg2rad(fObjectRotation);
    double fShearX = basegfx::deg2rad(aGeo.nShearAngle / 100.0);
    double fShearX = toRadians(aGeo.nShearAngle);

    // get aRect, this is the unrotated snaprect
    tools::Rectangle aRectangle(maRect);
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index 3dafbfe..a3ef402 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -1401,16 +1401,16 @@
    SetRectsDirty();
}

void SdrObject::NbcRotate(const Point& rRef, tools::Long nAngle)
void SdrObject::NbcRotate(const Point& rRef, Degree100 nAngle)
{
    if (nAngle)
    {
        double a = nAngle * F_PI18000;
        double a = nAngle.get() * F_PI18000;
        NbcRotate( rRef, nAngle, sin( a ), cos( a ) );
    }
}

void SdrObject::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrObject::NbcRotate(const Point& rRef,  Degree100 nAngle, double sn, double cs)
{
    SetGlueReallyAbsolute(true);
    aOutRect.Move(-rRef.X(),-rRef.Y());
@@ -1469,7 +1469,7 @@
    SetGlueReallyAbsolute(false);
}

void SdrObject::NbcShear(const Point& rRef, tools::Long /*nAngle*/, double tn, bool bVShear)
void SdrObject::NbcShear(const Point& rRef, Degree100 /*nAngle*/, double tn, bool bVShear)
{
    SetGlueReallyAbsolute(true);
    NbcShearGluePoints(rRef,tn,bVShear);
@@ -1521,9 +1521,9 @@
    SendUserCall(SdrUserCallType::Resize,aBoundRect0);
}

void SdrObject::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrObject::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    if (nAngle!=0) {
    if (nAngle) {
        tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
        NbcRotate(rRef,nAngle,sn,cs);
        SetChanged();
@@ -1541,9 +1541,9 @@
    SendUserCall(SdrUserCallType::Resize,aBoundRect0);
}

void SdrObject::Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrObject::Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    if (nAngle!=0) {
    if (nAngle) {
        tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
        NbcShear(rRef,nAngle,tn,bVShear);
        SetChanged();
@@ -1650,14 +1650,14 @@
    SendUserCall(SdrUserCallType::Resize,aBoundRect0);
}

tools::Long SdrObject::GetRotateAngle() const
Degree100 SdrObject::GetRotateAngle() const
{
    return 0;
    return 0_deg100;
}

tools::Long SdrObject::GetShearAngle(bool /*bVertical*/) const
Degree100 SdrObject::GetShearAngle(bool /*bVertical*/) const
{
    return 0;
    return 0_deg100;
}

sal_uInt32 SdrObject::GetSnapPointCount() const
@@ -2000,32 +2000,32 @@
    }

    if (rAttr.GetItemState(SDRATTR_SHEARANGLE,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long n=static_cast<const SdrShearAngleItem*>(pPoolItem)->GetValue();
        Degree100 n=static_cast<const SdrShearAngleItem*>(pPoolItem)->GetValue();
        n-=GetShearAngle();
        if (n!=0) {
            double nTan = tan(n * F_PI18000);
        if (n) {
            double nTan = tan(n.get() * F_PI18000);
            NbcShear(aRef1,n,nTan,false);
        }
    }
    if (rAttr.GetItemState(SDRATTR_ROTATEANGLE,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long n=static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        Degree100 n=static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
        n-=GetRotateAngle();
        if (n!=0) {
        if (n) {
            NbcRotate(aRef1,n);
        }
    }
    if (rAttr.GetItemState(SDRATTR_ROTATEONE,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long n=static_cast<const SdrRotateOneItem*>(pPoolItem)->GetValue();
        Degree100 n=static_cast<const SdrRotateOneItem*>(pPoolItem)->GetValue();
        NbcRotate(aRef1,n);
    }
    if (rAttr.GetItemState(SDRATTR_HORZSHEARONE,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long n=static_cast<const SdrHorzShearOneItem*>(pPoolItem)->GetValue();
        double nTan = tan(n * F_PI18000);
        Degree100 n=static_cast<const SdrHorzShearOneItem*>(pPoolItem)->GetValue();
        double nTan = tan(n.get() * F_PI18000);
        NbcShear(aRef1,n,nTan,false);
    }
    if (rAttr.GetItemState(SDRATTR_VERTSHEARONE,true,&pPoolItem)==SfxItemState::SET) {
        tools::Long n=static_cast<const SdrVertShearOneItem*>(pPoolItem)->GetValue();
        double nTan = tan(n * F_PI18000);
        Degree100 n=static_cast<const SdrVertShearOneItem*>(pPoolItem)->GetValue();
        double nTan = tan(n.get() * F_PI18000);
        NbcShear(aRef1,n,nTan,true);
    }

@@ -2235,7 +2235,7 @@
    }
}

void SdrObject::NbcRotateGluePoints(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrObject::NbcRotateGluePoints(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    // First a const call to see whether there are any glue points.
    // Force const call!
diff --git a/svx/source/svdraw/svdocirc.cxx b/svx/source/svdraw/svdocirc.cxx
index c55d935..983adc4 100644
--- a/svx/source/svdraw/svdocirc.cxx
+++ b/svx/source/svdraw/svdocirc.cxx
@@ -50,14 +50,13 @@

using namespace com::sun::star;

static Point GetAnglePnt(const tools::Rectangle& rR, tools::Long nAngle)
static Point GetAnglePnt(const tools::Rectangle& rR, Degree100 nAngle)
{
    Point aCenter(rR.Center());
    tools::Long nWdt=rR.Right()-rR.Left();
    tools::Long nHgt=rR.Bottom()-rR.Top();
    tools::Long nMaxRad=(std::max(nWdt,nHgt)+1) /2;
    double a;
    a = nAngle * F_PI18000;
    double a = nAngle.get() * F_PI18000;
    Point aRetval(FRound(cos(a)*nMaxRad),-FRound(sin(a)*nMaxRad));
    if (nWdt==0) aRetval.setX(0 );
    if (nHgt==0) aRetval.setY(0 );
@@ -120,8 +119,8 @@
    SdrCircKind eNewKind)
:   SdrRectObj(rSdrModel)
{
    nStartAngle=0;
    nEndAngle=36000;
    nStartAngle=0_deg100;
    nEndAngle=36000_deg100;
    meCircleKind=eNewKind;
    bClosedObj=eNewKind!=SdrCircKind::Arc;
}
@@ -132,8 +131,8 @@
    const tools::Rectangle& rRect)
:   SdrRectObj(rSdrModel, rRect)
{
    nStartAngle=0;
    nEndAngle=36000;
    nStartAngle=0_deg100;
    nEndAngle=36000_deg100;
    meCircleKind=eNewKind;
    bClosedObj=eNewKind!=SdrCircKind::Arc;
}
@@ -142,14 +141,14 @@
    SdrModel& rSdrModel,
    SdrCircKind eNewKind,
    const tools::Rectangle& rRect,
    tools::Long nNewStartWink,
    tools::Long nNewEndWink)
    Degree100 nNewStartWink,
    Degree100 nNewEndWink)
:   SdrRectObj(rSdrModel, rRect)
{
    tools::Long nAngleDif=nNewEndWink-nNewStartWink;
    Degree100 nAngleDif=nNewEndWink-nNewStartWink;
    nStartAngle=NormAngle36000(nNewStartWink);
    nEndAngle=NormAngle36000(nNewEndWink);
    if (nAngleDif==36000) nEndAngle+=nAngleDif; // full circle
    if (nAngleDif==36000_deg100) nEndAngle+=nAngleDif; // full circle
    meCircleKind=eNewKind;
    bClosedObj=eNewKind!=SdrCircKind::Arc;
}
@@ -186,7 +185,7 @@
    // ellipse segments.
    // If not WIN, then (for now) also for circle/ellipse segments and circle/
    // ellipse arcs (for precision)
    bool bNeed=aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0 || meCircleKind==SdrCircKind::Cut;
    bool bNeed=aGeo.nRotationAngle || aGeo.nShearAngle || meCircleKind==SdrCircKind::Cut;
    // If not WIN, then for everything except full circle (for now!)
    if (meCircleKind!=SdrCircKind::Full) bNeed = true;

@@ -230,7 +229,7 @@
    return bNeed;
}

basegfx::B2DPolygon SdrCircObj::ImpCalcXPolyCirc(const SdrCircKind eCircleKind, const tools::Rectangle& rRect1, tools::Long nStart, tools::Long nEnd) const
basegfx::B2DPolygon SdrCircObj::ImpCalcXPolyCirc(const SdrCircKind eCircleKind, const tools::Rectangle& rRect1, Degree100 nStart, Degree100 nEnd) const
{
    const basegfx::B2DRange aRange = vcl::unotools::b2DRectangleFromRectangle(rRect1);
    basegfx::B2DPolygon aCircPolygon;
@@ -254,8 +253,8 @@
    {
        // mirror start, end for geometry creation since model coordinate system is mirrored in Y
        // #i111715# increase numerical correctness by first dividing and not using F_PI1800
        const double fStart((((36000 - nEnd) % 36000) / 18000.0) * F_PI);
        const double fEnd((((36000 - nStart) % 36000) / 18000.0) * F_PI);
        const double fStart((((36000 - nEnd.get()) % 36000) / 18000.0) * F_PI);
        const double fEnd((((36000 - nStart.get()) % 36000) / 18000.0) * F_PI);

        // create circle segment. This is not closed by default
        aCircPolygon = basegfx::utils::createPolygonFromEllipseSegment(
@@ -293,7 +292,7 @@
        // shear, rotate and back to top left (if needed)
        aMatrix = basegfx::utils::createShearXRotateTranslateB2DHomMatrix(
            -aGeo.mfTanShearAngle,
            aGeo.nRotationAngle ? (36000 - aGeo.nRotationAngle) * F_PI18000 : 0.0,
            aGeo.nRotationAngle ? (36000_deg100 - aGeo.nRotationAngle).get() * F_PI18000 : 0.0,
            aTopLeft) * aMatrix;

        // apply transformation
@@ -312,7 +311,7 @@
OUString SdrCircObj::TakeObjNameSingul() const
{
    const char* pID=STR_ObjNameSingulCIRC;
    if (maRect.GetWidth() == maRect.GetHeight() && aGeo.nShearAngle==0)
    if (maRect.GetWidth() == maRect.GetHeight() && aGeo.nShearAngle==0_deg100)
    {
        switch (meCircleKind) {
            case SdrCircKind::Full: pID=STR_ObjNameSingulCIRC; break;
@@ -346,7 +345,7 @@
OUString SdrCircObj::TakeObjNamePlural() const
{
    const char* pID=STR_ObjNamePluralCIRC;
    if (maRect.GetWidth() == maRect.GetHeight() && aGeo.nShearAngle==0)
    if (maRect.GetWidth() == maRect.GetHeight() && aGeo.nShearAngle==0_deg100)
    {
        switch (meCircleKind) {
            case SdrCircKind::Full: pID=STR_ObjNamePluralCIRC; break;
@@ -400,8 +399,8 @@
    Point                       aP1;
    tools::Long                        nHgt;
    tools::Long                        nWdt;
    tools::Long                        nStart;
    tools::Long                        nEnd;
    Degree100                          nStart;
    Degree100                          nEnd;

public:
    ImpCircUser()
@@ -530,10 +529,10 @@
    {
        Point aPt(rDrag.GetNow());

        if (aGeo.nRotationAngle!=0)
        if (aGeo.nRotationAngle)
            RotatePoint(aPt,maRect.TopLeft(),-aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);

        if (aGeo.nShearAngle!=0)
        if (aGeo.nShearAngle)
            ShearPoint(aPt,maRect.TopLeft(),-aGeo.mfTanShearAngle);

        aPt -= maRect.Center();
@@ -550,15 +549,15 @@
            aPt.setX(BigMulDiv(aPt.X(),nHgt,nWdt) );
        }

        tools::Long nAngle=NormAngle36000(GetAngle(aPt));
        Degree100 nAngle=NormAngle36000(GetAngle(aPt));

        if (rDrag.GetView() && rDrag.GetView()->IsAngleSnapEnabled())
        {
            tools::Long nSA=rDrag.GetView()->GetSnapAngle();
            Degree100 nSA=rDrag.GetView()->GetSnapAngle();

            if (nSA!=0)
            if (nSA)
            {
                nAngle+=nSA/2;
                nAngle+=nSA/2_deg100;
                nAngle/=nSA;
                nAngle*=nSA;
                nAngle=NormAngle36000(nAngle);
@@ -599,7 +598,7 @@
        if(SdrCircKind::Full != meCircleKind && nPointCount > 2)
        {
            const ImpCircUser* pU = static_cast<const ImpCircUser*>(rDrag.GetUser());
            sal_Int32 nAngle;
            Degree100 nAngle;

            aBuf.append(" (");

@@ -624,7 +623,7 @@

        if(bAngle)
        {
            const sal_Int32 nAngle(1 == rDrag.GetHdl()->GetPointNum() ? nStartAngle : nEndAngle);
            const Degree100 nAngle(1 == rDrag.GetHdl()->GetPointNum() ? nStartAngle : nEndAngle);

            OUStringBuffer aBuf(ImpGetDescriptionStr(STR_DragCircAngle));
            aBuf.append(" (");
@@ -648,8 +647,8 @@
    aCenter=aR.Center();
    nWdt=aR.Right()-aR.Left();
    nHgt=aR.Bottom()-aR.Top();
    nStart=0;
    nEnd=36000;
    nStart=0_deg100;
    nEnd=36000_deg100;
    if (rStat.GetPointCount()>2) {
        Point aP(rStat.GetPoint(2)-aCenter);
        if (nWdt==0) aP.setX(0 );
@@ -661,9 +660,9 @@
        }
        nStart=NormAngle36000(GetAngle(aP));
        if (rStat.GetView()!=nullptr && rStat.GetView()->IsAngleSnapEnabled()) {
            tools::Long nSA=rStat.GetView()->GetSnapAngle();
            if (nSA!=0) { // angle snapping
                nStart+=nSA/2;
            Degree100 nSA=rStat.GetView()->GetSnapAngle();
            if (nSA) { // angle snapping
                nStart+=nSA/2_deg100;
                nStart/=nSA;
                nStart*=nSA;
                nStart=NormAngle36000(nStart);
@@ -683,9 +682,9 @@
    }
    nEnd=NormAngle36000(GetAngle(aP));
    if (rStat.GetView()!=nullptr && rStat.GetView()->IsAngleSnapEnabled()) {
        tools::Long nSA=rStat.GetView()->GetSnapAngle();
        if (nSA!=0) { // angle snapping
            nEnd+=nSA/2;
        Degree100 nSA=rStat.GetView()->GetSnapAngle();
        if (nSA) { // angle snapping
            nEnd+=nSA/2_deg100;
            nEnd/=nSA;
            nEnd*=nSA;
            nEnd=NormAngle36000(nEnd);
@@ -831,10 +830,10 @@

void SdrCircObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
{
    tools::Long nAngle0=aGeo.nRotationAngle;
    bool bNoShearRota=(aGeo.nRotationAngle==0 && aGeo.nShearAngle==0);
    Degree100 nAngle0=aGeo.nRotationAngle;
    bool bNoShearRota=(aGeo.nRotationAngle==0_deg100 && aGeo.nShearAngle==0_deg100);
    SdrTextObj::NbcResize(rRef,xFact,yFact);
    bNoShearRota|=(aGeo.nRotationAngle==0 && aGeo.nShearAngle==0);
    bNoShearRota|=(aGeo.nRotationAngle==0_deg100 && aGeo.nShearAngle==0_deg100);
    if (meCircleKind!=SdrCircKind::Full) {
        bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
        bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
@@ -843,26 +842,26 @@
            // That, however, is pretty bad (because of forced "hard" formatting).
            // Alternatively, we could implement a bMirrored flag (maybe even
            // a more general one, e. g. for mirrored text, ...).
            tools::Long nS0=nStartAngle;
            tools::Long nE0=nEndAngle;
            Degree100 nS0=nStartAngle;
            Degree100 nE0=nEndAngle;
            if (bNoShearRota) {
                // the RectObj already mirrors at VMirror because of a 180deg rotation
                if (! (bXMirr && bYMirr)) {
                    tools::Long nTmp=nS0;
                    nS0=18000-nE0;
                    nE0=18000-nTmp;
                    Degree100 nTmp=nS0;
                    nS0=18000_deg100-nE0;
                    nE0=18000_deg100-nTmp;
                }
            } else { // mirror contorted ellipses
                if (bXMirr!=bYMirr) {
                    nS0+=nAngle0;
                    nE0+=nAngle0;
                    if (bXMirr) {
                        tools::Long nTmp=nS0;
                        nS0=18000-nE0;
                        nE0=18000-nTmp;
                        Degree100 nTmp=nS0;
                        nS0=18000_deg100-nE0;
                        nE0=18000_deg100-nTmp;
                    }
                    if (bYMirr) {
                        tools::Long nTmp=nS0;
                        Degree100 nTmp=nS0;
                        nS0=-nE0;
                        nE0=-nTmp;
                    }
@@ -870,17 +869,17 @@
                    nE0-=aGeo.nRotationAngle;
                }
            }
            tools::Long nAngleDif=nE0-nS0;
            Degree100 nAngleDif=nE0-nS0;
            nStartAngle=NormAngle36000(nS0);
            nEndAngle  =NormAngle36000(nE0);
            if (nAngleDif==36000) nEndAngle+=nAngleDif; // full circle
            if (nAngleDif==36000_deg100) nEndAngle+=nAngleDif; // full circle
        }
    }
    SetXPolyDirty();
    ImpSetCircInfoToAttr();
}

void SdrCircObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrCircObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    SdrTextObj::NbcShear(rRef,nAngle,tn,bVShear);
    SetXPolyDirty();
@@ -899,22 +898,22 @@
        tools::Long nMaxRad=(std::max(nWdt,nHgt)+1) /2;
        double a;
        // starting point
        a = nStartAngle * F_PI18000;
        a = nStartAngle.get() * F_PI18000;
        aTmpPt1=Point(FRound(cos(a)*nMaxRad),-FRound(sin(a)*nMaxRad));
        if (nWdt==0) aTmpPt1.setX(0 );
        if (nHgt==0) aTmpPt1.setY(0 );
        aTmpPt1+=aCenter;
        // finishing point
        a = nEndAngle * F_PI18000;
        a = nEndAngle.get() * F_PI18000;
        aTmpPt2=Point(FRound(cos(a)*nMaxRad),-FRound(sin(a)*nMaxRad));
        if (nWdt==0) aTmpPt2.setX(0 );
        if (nHgt==0) aTmpPt2.setY(0 );
        aTmpPt2+=aCenter;
        if (aGeo.nRotationAngle!=0) {
        if (aGeo.nRotationAngle) {
            RotatePoint(aTmpPt1,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
            RotatePoint(aTmpPt2,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        }
        if (aGeo.nShearAngle!=0) {
        if (aGeo.nShearAngle) {
            ShearPoint(aTmpPt1,maRect.TopLeft(),aGeo.mfTanShearAngle);
            ShearPoint(aTmpPt2,maRect.TopLeft(),aGeo.mfTanShearAngle);
        }
@@ -924,12 +923,12 @@
        MirrorPoint(aTmpPt1,rRef1,rRef2);
        MirrorPoint(aTmpPt2,rRef1,rRef2);
        // unrotate:
        if (aGeo.nRotationAngle!=0) {
        if (aGeo.nRotationAngle) {
            RotatePoint(aTmpPt1,maRect.TopLeft(),-aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle); // -sin for reversion
            RotatePoint(aTmpPt2,maRect.TopLeft(),-aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle); // -sin for reversion
        }
        // unshear:
        if (aGeo.nShearAngle!=0) {
        if (aGeo.nShearAngle) {
            ShearPoint(aTmpPt1,maRect.TopLeft(),-aGeo.mfTanShearAngle); // -tan for reversion
            ShearPoint(aTmpPt2,maRect.TopLeft(),-aGeo.mfTanShearAngle); // -tan for reversion
        }
@@ -939,10 +938,10 @@
        // because it's mirrored, the angles are swapped, too
        nStartAngle=GetAngle(aTmpPt2);
        nEndAngle  =GetAngle(aTmpPt1);
        tools::Long nAngleDif=nEndAngle-nStartAngle;
        Degree100 nAngleDif=nEndAngle-nStartAngle;
        nStartAngle=NormAngle36000(nStartAngle);
        nEndAngle  =NormAngle36000(nEndAngle);
        if (nAngleDif==36000) nEndAngle+=nAngleDif; // full circle
        if (nAngleDif==36000_deg100) nEndAngle+=nAngleDif; // full circle
    }
    SetXPolyDirty();
    ImpSetCircInfoToAttr();
@@ -985,30 +984,30 @@
    if (meCircleKind!=SdrCircKind::Full) {
        const Point aPntStart(GetAnglePnt(maRect,nStartAngle));
        const Point aPntEnd(GetAnglePnt(maRect,nEndAngle));
        tools::Long a=nStartAngle;
        tools::Long e=nEndAngle;
        Degree100 a=nStartAngle;
        Degree100 e=nEndAngle;
        rRect.SetLeft(maRect.Right() );
        rRect.SetRight(maRect.Left() );
        rRect.SetTop(maRect.Bottom() );
        rRect.SetBottom(maRect.Top() );
        Union(rRect,aPntStart);
        Union(rRect,aPntEnd);
        if ((a<=18000 && e>=18000) || (a>e && (a<=18000 || e>=18000))) {
        if ((a<=18000_deg100 && e>=18000_deg100) || (a>e && (a<=18000_deg100 || e>=18000_deg100))) {
            Union(rRect,maRect.LeftCenter());
        }
        if ((a<=27000 && e>=27000) || (a>e && (a<=27000 || e>=27000))) {
        if ((a<=27000_deg100 && e>=27000_deg100) || (a>e && (a<=27000_deg100 || e>=27000_deg100))) {
            Union(rRect,maRect.BottomCenter());
        }
        if (a>e) {
            Union(rRect,maRect.RightCenter());
        }
        if ((a<=9000 && e>=9000) || (a>e && (a<=9000 || e>=9000))) {
        if ((a<=9000_deg100 && e>=9000_deg100) || (a>e && (a<=9000_deg100 || e>=9000_deg100))) {
            Union(rRect,maRect.TopCenter());
        }
        if (meCircleKind==SdrCircKind::Section) {
            Union(rRect,maRect.Center());
        }
        if (aGeo.nRotationAngle!=0) {
        if (aGeo.nRotationAngle) {
            Point aDst(rRect.TopLeft());
            aDst-=maRect.TopLeft();
            Point aDst0(aDst);
@@ -1017,11 +1016,11 @@
            rRect.Move(aDst.X(),aDst.Y());
        }
    }
    if (aGeo.nShearAngle==0)
    if (aGeo.nShearAngle==0_deg100)
        return;

    tools::Long nDst=FRound((rRect.Bottom()-rRect.Top())*aGeo.mfTanShearAngle);
    if (aGeo.nShearAngle>0) {
    if (aGeo.nShearAngle>0_deg100) {
        Point aRef(rRect.TopLeft());
        rRect.AdjustLeft( -nDst );
        Point aTmpPt(rRect.TopLeft());
@@ -1044,7 +1043,7 @@

void SdrCircObj::NbcSetSnapRect(const tools::Rectangle& rRect)
{
    if (aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0 || meCircleKind!=SdrCircKind::Full) {
    if (aGeo.nRotationAngle || aGeo.nShearAngle || meCircleKind!=SdrCircKind::Full) {
        tools::Rectangle aSR0(GetSnapRect());
        tools::Long nWdt0=aSR0.Right()-aSR0.Left();
        tools::Long nHgt0=aSR0.Bottom()-aSR0.Top();
@@ -1092,8 +1091,8 @@
    const SfxItemSet& rSet = GetObjectItemSet();
    SdrCircKind eNewKind = rSet.Get(SDRATTR_CIRCKIND).GetValue();

    sal_Int32 nNewStart = rSet.Get(SDRATTR_CIRCSTARTANGLE).GetValue();
    sal_Int32 nNewEnd = rSet.Get(SDRATTR_CIRCENDANGLE).GetValue();
    Degree100 nNewStart = rSet.Get(SDRATTR_CIRCSTARTANGLE).GetValue();
    Degree100 nNewEnd = rSet.Get(SDRATTR_CIRCENDANGLE).GetValue();

    bool bKindChg = meCircleKind != eNewKind;
    bool bAngleChg = nNewStart != nStartAngle || nNewEnd != nEndAngle;
@@ -1117,8 +1116,8 @@
    const SfxItemSet& rSet = GetObjectItemSet();

    SdrCircKind eOldKindA = rSet.Get(SDRATTR_CIRCKIND).GetValue();
    sal_Int32 nOldStartAngle = rSet.Get(SDRATTR_CIRCSTARTANGLE).GetValue();
    sal_Int32 nOldEndAngle = rSet.Get(SDRATTR_CIRCENDANGLE).GetValue();
    Degree100 nOldStartAngle = rSet.Get(SDRATTR_CIRCSTARTANGLE).GetValue();
    Degree100 nOldEndAngle = rSet.Get(SDRATTR_CIRCENDANGLE).GetValue();

    if(meCircleKind == eOldKindA && nStartAngle == nOldStartAngle && nEndAngle == nOldEndAngle)
        return;
diff --git a/svx/source/svdraw/svdoedge.cxx b/svx/source/svdraw/svdoedge.cxx
index f139576..3e164e2 100644
--- a/svx/source/svdraw/svdoedge.cxx
+++ b/svx/source/svdraw/svdoedge.cxx
@@ -2292,7 +2292,7 @@
}

// #i54102# added rotation support
void SdrEdgeObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrEdgeObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    if(bEdgeTrackUserDefined)
    {
@@ -2354,7 +2354,7 @@
}

// #i54102# added shear support
void SdrEdgeObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrEdgeObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    if(bEdgeTrackUserDefined)
    {
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 991b3b2..e11d1b5 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -362,7 +362,7 @@
    {
        const bool      bMirror = bool( nTransformFlags & SdrGrafObjTransformsAttrs::MIRROR );
        const bool      bRotate = bool( nTransformFlags & SdrGrafObjTransformsAttrs::ROTATE ) &&
            (aGeo.nRotationAngle && aGeo.nRotationAngle != 18000);
            (aGeo.nRotationAngle && aGeo.nRotationAngle != 18000_deg100);

        // Need cropping info earlier
        const_cast<SdrGrafObj*>(this)->ImpSetAttrToGrafInfo();
@@ -373,7 +373,7 @@

        if( bMirror )
        {
            sal_uInt16      nMirrorCase = ( aGeo.nRotationAngle == 18000 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 );
            sal_uInt16      nMirrorCase = ( aGeo.nRotationAngle == 18000_deg100 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 );
            bool bHMirr = nMirrorCase == 2 || nMirrorCase == 4;
            bool bVMirr = nMirrorCase == 3 || nMirrorCase == 4;

@@ -381,7 +381,7 @@
        }

        if( bRotate )
            aActAttr.SetRotation( Degree10(aGeo.nRotationAngle / 10) );
            aActAttr.SetRotation( toDegree10(aGeo.nRotationAngle ) );
    }

    return aActAttr;
@@ -509,9 +509,9 @@
{
    bool bNoPresGrf = ( mpGraphicObject->GetType() != GraphicType::NONE ) && !bEmptyPresObj;

    rInfo.bResizeFreeAllowed = aGeo.nRotationAngle % 9000 == 0 ||
                               aGeo.nRotationAngle % 18000 == 0 ||
                               aGeo.nRotationAngle % 27000 == 0;
    rInfo.bResizeFreeAllowed = aGeo.nRotationAngle.get() % 9000 == 0 ||
                               aGeo.nRotationAngle.get() % 18000 == 0 ||
                               aGeo.nRotationAngle.get() % 27000 == 0;

    rInfo.bResizePropAllowed = true;
    rInfo.bRotateFreeAllowed = bNoPresGrf;
diff --git a/svx/source/svdraw/svdogrp.cxx b/svx/source/svdraw/svdogrp.cxx
index b78a02c..34ae1c5 100644
--- a/svx/source/svdraw/svdogrp.cxx
+++ b/svx/source/svdraw/svdogrp.cxx
@@ -299,9 +299,9 @@
}


tools::Long SdrObjGroup::GetRotateAngle() const
Degree100 SdrObjGroup::GetRotateAngle() const
{
    tools::Long nRetval(0);
    Degree100 nRetval(0);

    if(0 != GetObjCount())
    {
@@ -314,9 +314,9 @@
}


tools::Long SdrObjGroup::GetShearAngle(bool /*bVertical*/) const
Degree100 SdrObjGroup::GetShearAngle(bool /*bVertical*/) const
{
    tools::Long nRetval(0);
    Degree100 nRetval(0);

    if(0 != GetObjCount())
    {
@@ -413,7 +413,7 @@
}


void SdrObjGroup::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrObjGroup::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    SetGlueReallyAbsolute(true);
    RotatePoint(aRefPoint,rRef,sn,cs);
@@ -447,7 +447,7 @@
}


void SdrObjGroup::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrObjGroup::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    SetGlueReallyAbsolute(true);
    ShearPoint(aRefPoint,rRef,tn);
@@ -610,9 +610,9 @@
}


void SdrObjGroup::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrObjGroup::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    if (nAngle==0)
    if (nAngle==0_deg100)
        return;

    SetGlueReallyAbsolute(true);
@@ -673,9 +673,9 @@
}


void SdrObjGroup::Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrObjGroup::Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    if (nAngle==0)
    if (nAngle==0_deg100)
        return;

    SetGlueReallyAbsolute(true);
diff --git a/svx/source/svdraw/svdomeas.cxx b/svx/source/svdraw/svdomeas.cxx
index 4bbfb61..8464d2f 100644
--- a/svx/source/svdraw/svdomeas.cxx
+++ b/svx/source/svdraw/svdomeas.cxx
@@ -263,7 +263,7 @@
    bool                        bTextRota90;
    bool                        bTextUpsideDown;
    bool                        bTextAutoAngle;
    tools::Long                        nTextAutoAngleView;
    Degree100                   nTextAutoAngleView;
};

namespace {
@@ -285,9 +285,9 @@
    ImpLineRec                  aHelpline2;
    Size                        aTextSize;
    tools::Long                        nLineLen;
    tools::Long                        nLineAngle;
    tools::Long                        nTextAngle;
    tools::Long                        nHlpAngle;
    Degree100                   nLineAngle;
    Degree100                   nTextAngle;
    Degree100                   nHlpAngle;
    double                      nLineSin;
    double                      nLineCos;
    sal_uInt16                      nMainlineCnt;
@@ -417,28 +417,28 @@
    rPol.nArrow2Len=nArrow2Len;

    rPol.nLineAngle=GetAngle(aDelt);
    double a = rPol.nLineAngle * F_PI18000;
    double a = rPol.nLineAngle.get() * F_PI18000;
    double nLineSin=sin(a);
    double nLineCos=cos(a);
    rPol.nLineSin=nLineSin;
    rPol.nLineCos=nLineCos;

    rPol.nTextAngle=rPol.nLineAngle;
    if (rRec.bTextRota90) rPol.nTextAngle+=9000;
    if (rRec.bTextRota90) rPol.nTextAngle+=9000_deg100;

    rPol.bAutoUpsideDown=false;
    if (rRec.bTextAutoAngle) {
        tools::Long nTmpAngle=NormAngle36000(rPol.nTextAngle-rRec.nTextAutoAngleView);
        if (nTmpAngle>=18000) {
            rPol.nTextAngle+=18000;
        Degree100 nTmpAngle=NormAngle36000(rPol.nTextAngle-rRec.nTextAutoAngleView);
        if (nTmpAngle>=18000_deg100) {
            rPol.nTextAngle+=18000_deg100;
            rPol.bAutoUpsideDown=true;
        }
    }

    if (rRec.bTextUpsideDown) rPol.nTextAngle+=18000;
    if (rRec.bTextUpsideDown) rPol.nTextAngle+=18000_deg100;
    rPol.nTextAngle=NormAngle36000(rPol.nTextAngle);
    rPol.nHlpAngle=rPol.nLineAngle+9000;
    if (rRec.bBelowRefEdge) rPol.nHlpAngle+=18000;
    rPol.nHlpAngle=rPol.nLineAngle+9000_deg100;
    if (rRec.bBelowRefEdge) rPol.nHlpAngle+=18000_deg100;
    rPol.nHlpAngle=NormAngle36000(rPol.nHlpAngle);
    double nHlpSin=nLineCos;
    double nHlpCos=-nLineSin;
@@ -878,8 +878,8 @@

void SdrMeasureObj::ImpEvalDrag(ImpMeasureRec& rRec, const SdrDragStat& rDrag) const
{
    tools::Long nLineAngle=GetAngle(rRec.aPt2-rRec.aPt1);
    double a = nLineAngle * F_PI18000;
    Degree100 nLineAngle=GetAngle(rRec.aPt2-rRec.aPt1);
    double a = nLineAngle.get() * F_PI18000;
    double nSin=sin(a);
    double nCos=cos(a);

@@ -1016,7 +1016,7 @@
    SetTextDirty();
}

void SdrMeasureObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrMeasureObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    SdrTextObj::NbcRotate(rRef,nAngle,sn,cs);
    tools::Long nLen0=GetLen(aPt2-aPt1);
@@ -1047,7 +1047,7 @@
    SetRectsDirty();
}

void SdrMeasureObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrMeasureObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    SdrTextObj::NbcShear(rRef,nAngle,tn,bVShear);
    ShearPoint(aPt1,rRef,tn,bVShear);
@@ -1056,7 +1056,7 @@
    SetTextDirty();
}

tools::Long SdrMeasureObj::GetRotateAngle() const
Degree100 SdrMeasureObj::GetRotateAngle() const
{
    return GetAngle(aPt2-aPt1);
}
diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx
index 24c93bb..b7655a4 100644
--- a/svx/source/svdraw/svdopath.cxx
+++ b/svx/source/svdraw/svdopath.cxx
@@ -239,8 +239,8 @@
    Point                   aRectP2;
    Point                   aRectP3;
    tools::Long                    nCircRadius;
    tools::Long                    nCircStAngle;
    tools::Long                    nCircRelAngle;
    Degree100               nCircStAngle;
    Degree100               nCircRelAngle;
    bool                    bBezier;
    bool                    bBezHasCtrl0;
    bool                    bCircle;
@@ -308,40 +308,40 @@

void ImpPathCreateUser::CalcCircle(const Point& rP1, const Point& rP2, const Point& rDir, SdrView const * pView)
{
    tools::Long nTangAngle=GetAngle(rDir);
    Degree100 nTangAngle=GetAngle(rDir);
    aCircStart=rP1;
    aCircEnd=rP2;
    aCircCenter=rP1;
    tools::Long dx=rP2.X()-rP1.X();
    tools::Long dy=rP2.Y()-rP1.Y();
    tools::Long dAngle=GetAngle(Point(dx,dy))-nTangAngle;
    Degree100 dAngle=GetAngle(Point(dx,dy))-nTangAngle;
    dAngle=NormAngle36000(dAngle);
    tools::Long nTmpAngle=NormAngle36000(9000-dAngle);
    bool bRet=nTmpAngle!=9000 && nTmpAngle!=27000;
    Degree100 nTmpAngle=NormAngle36000(9000_deg100-dAngle);
    bool bRet=nTmpAngle!=9000_deg100 && nTmpAngle!=27000_deg100;
    tools::Long nRad=0;
    if (bRet) {
        double cs = cos(nTmpAngle * F_PI18000);
        double cs = cos(nTmpAngle.get() * F_PI18000);
        double nR=static_cast<double>(GetLen(Point(dx,dy)))/cs/2;
        nRad=std::abs(FRound(nR));
    }
    if (dAngle<18000) {
        nCircStAngle=NormAngle36000(nTangAngle-9000);
        nCircRelAngle=NormAngle36000(2*dAngle);
        aCircCenter.AdjustX(FRound(nRad * cos((nTangAngle + 9000) * F_PI18000)));
        aCircCenter.AdjustY(-(FRound(nRad * sin((nTangAngle + 9000) * F_PI18000))));
    if (dAngle<18000_deg100) {
        nCircStAngle=NormAngle36000(nTangAngle-9000_deg100);
        nCircRelAngle=NormAngle36000(2_deg100*dAngle);
        aCircCenter.AdjustX(FRound(nRad * cos((nTangAngle.get() + 9000) * F_PI18000)));
        aCircCenter.AdjustY(-(FRound(nRad * sin((nTangAngle.get() + 9000) * F_PI18000))));
    } else {
        nCircStAngle=NormAngle36000(nTangAngle+9000);
        nCircRelAngle=-NormAngle36000(36000-2*dAngle);
        aCircCenter.AdjustX(FRound(nRad * cos((nTangAngle - 9000) * F_PI18000)));
        aCircCenter.AdjustY(-(FRound(nRad * sin((nTangAngle - 9000) * F_PI18000))));
        nCircStAngle=NormAngle36000(nTangAngle+9000_deg100);
        nCircRelAngle=-NormAngle36000(36000_deg100-2_deg100*dAngle);
        aCircCenter.AdjustX(FRound(nRad * cos((nTangAngle.get() - 9000) * F_PI18000)));
        aCircCenter.AdjustY(-(FRound(nRad * sin((nTangAngle.get() - 9000) * F_PI18000))));
    }
    bAngleSnap=pView!=nullptr && pView->IsAngleSnapEnabled();
    if (bAngleSnap) {
        tools::Long nSA=pView->GetSnapAngle();
        if (nSA!=0) { // angle snapping
            bool bNeg=nCircRelAngle<0;
        Degree100 nSA=pView->GetSnapAngle();
        if (nSA) { // angle snapping
            bool bNeg=nCircRelAngle<0_deg100;
            if (bNeg) nCircRelAngle=-nCircRelAngle;
            nCircRelAngle+=nSA/2;
            nCircRelAngle+=nSA/2_deg100;
            nCircRelAngle/=nSA;
            nCircRelAngle*=nSA;
            nCircRelAngle=NormAngle36000(nCircRelAngle);
@@ -349,21 +349,21 @@
        }
    }
    nCircRadius=nRad;
    if (nRad==0 || std::abs(nCircRelAngle)<5) bRet=false;
    if (nRad==0 || abs(nCircRelAngle).get()<5) bRet=false;
    bCircle=bRet;
}

XPolygon ImpPathCreateUser::GetCirclePoly() const
{
    if (nCircRelAngle>=0) {
    if (nCircRelAngle>=0_deg100) {
        XPolygon aXP(aCircCenter,nCircRadius,nCircRadius,
                     Degree10((nCircStAngle+5)/10),Degree10((nCircStAngle+nCircRelAngle+5)/10),false);
                     toDegree10(nCircStAngle), toDegree10(nCircStAngle+nCircRelAngle),false);
        aXP[0]=aCircStart; aXP.SetFlags(0,PolyFlags::Smooth);
        if (!bAngleSnap) aXP[aXP.GetPointCount()-1]=aCircEnd;
        return aXP;
    } else {
        XPolygon aXP(aCircCenter,nCircRadius,nCircRadius,
                     Degree10(NormAngle36000(nCircStAngle+nCircRelAngle+5)/10),Degree10((nCircStAngle+5)/10),false);
                     toDegree10(NormAngle36000(nCircStAngle+nCircRelAngle)), toDegree10(nCircStAngle),false);
        sal_uInt16 nCount=aXP.GetPointCount();
        for (sal_uInt16 nNum=nCount/2; nNum>0;) {
            nNum--; // reverse XPoly's order of points
@@ -449,9 +449,9 @@
    else {
        y=BigMulDiv(x,nDirY,nDirX);
        tools::Long nHypLen=aTmpPt.Y()-y;
        tools::Long nTangAngle=-GetAngle(rDir);
        Degree100 nTangAngle=-GetAngle(rDir);
        // sin=g/h, g=h*sin
        double a = nTangAngle * F_PI18000;
        double a = nTangAngle.get() * F_PI18000;
        double sn=sin(a);
        double cs=cos(a);
        double nGKathLen=nHypLen*sn;
@@ -736,12 +736,12 @@
        {
            Point aPt(mpSdrPathDragData->aXP[nNextPnt]);
            aPt-=rDrag.GetNow();
            tools::Long nAngle1=GetAngle(aPt);
            Degree100 nAngle1=GetAngle(aPt);
            aPt=rDrag.GetNow();
            aPt-=mpSdrPathDragData->aXP[nPrevPnt];
            tools::Long nAngle2=GetAngle(aPt);
            tools::Long nDiff=nAngle1-nAngle2;
            nDiff=std::abs(nDiff);
            Degree100 nAngle2=GetAngle(aPt);
            Degree100 nDiff=nAngle1-nAngle2;
            nDiff=abs(nDiff);
            mpSdrPathDragData->bEliminate=nDiff<=rDrag.GetView()->GetEliminatePolyPointLimitAngle();
            if (mpSdrPathDragData->bEliminate) { // adapt position, Smooth is true for the ends
                aPt=mpSdrPathDragData->aXP[nNextPnt];
@@ -932,7 +932,7 @@

        if(pU->bCircle)
        {
            aStr += SdrModel::GetAngleString(std::abs(pU->nCircRelAngle))
            aStr += SdrModel::GetAngleString(abs(pU->nCircRelAngle))
                    + " r="
                    + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(pU->nCircRadius, true);
        }
@@ -945,7 +945,7 @@
        if(!IsFreeHand(meObjectKind))
        {
            sal_Int32 nLen(GetLen(aNow));
            sal_Int32 nAngle(GetAngle(aNow));
            Degree100 nAngle(GetAngle(aNow));
            aStr += "  l="
                    + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true)
                    + " "
@@ -1027,7 +1027,7 @@
                aNow -= rXPoly[nRef];

                sal_Int32 nLen(GetLen(aNow));
                sal_Int32 nAngle(GetAngle(aNow));
                Degree100 nAngle(GetAngle(aNow));
                aStr += "  l="
                        + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true)
                        + " "
@@ -1070,7 +1070,7 @@
                    aPt -= rXPoly[nPt1];

                    sal_Int32 nLen(GetLen(aPt));
                    sal_Int32 nAngle(GetAngle(aPt));
                    Degree100 nAngle(GetAngle(aPt));
                    aStr += "  l="
                            + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true)
                            + " "
@@ -1088,7 +1088,7 @@
                    aPt -= rXPoly[nPt2];

                    sal_Int32 nLen(GetLen(aPt));
                    sal_Int32 nAngle(GetAngle(aPt));
                    Degree100 nAngle(GetAngle(aPt));
                    aStr += "l="
                            + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true)
                            + " "
@@ -1670,7 +1670,7 @@
    const Point aDelt(FRound(aB2DDelt.getX()), FRound(aB2DDelt.getY()));

    aGeo.nRotationAngle=GetAngle(aDelt);
    aGeo.nShearAngle=0;
    aGeo.nShearAngle=0_deg100;
    aGeo.RecalcSinCos();
    aGeo.RecalcTan();

@@ -2293,18 +2293,18 @@
    SdrTextObj::NbcResize(rRef,xFact,yFact);
}

void SdrPathObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrPathObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    // Thank JOE, the angles are defined mirrored to the mathematical meanings
    const basegfx::B2DHomMatrix aTrans(
        basegfx::utils::createRotateAroundPoint(rRef.X(), rRef.Y(), -nAngle * F_PI18000));
        basegfx::utils::createRotateAroundPoint(rRef.X(), rRef.Y(), -nAngle.get() * F_PI18000));
    maPathPolygon.transform(aTrans);

    // #i19871# first modify locally, then call parent (to get correct SnapRect with GluePoints)
    SdrTextObj::NbcRotate(rRef,nAngle,sn,cs);
}

void SdrPathObj::NbcShear(const Point& rRefPnt, tools::Long nAngle, double fTan, bool bVShear)
void SdrPathObj::NbcShear(const Point& rRefPnt, Degree100 nAngle, double fTan, bool bVShear)
{
    basegfx::B2DHomMatrix aTrans(basegfx::utils::createTranslateB2DHomMatrix(-rRefPnt.X(), -rRefPnt.Y()));

@@ -2811,14 +2811,14 @@
            if(aGeo.nShearAngle || aGeo.nRotationAngle)
            {
                // get rotate and shear in drawingLayer notation
                fRotate = aGeo.nRotationAngle * F_PI18000;
                fShearX = aGeo.nShearAngle * F_PI18000;
                fRotate = aGeo.nRotationAngle.get() * F_PI18000;
                fShearX = aGeo.nShearAngle.get() * F_PI18000;

                // build mathematically correct (negative shear and rotate) object transform
                // containing shear and rotate to extract unsheared, unrotated polygon
                basegfx::B2DHomMatrix aObjectMatrix;
                aObjectMatrix.shearX(-aGeo.mfTanShearAngle);
                aObjectMatrix.rotate((36000 - aGeo.nRotationAngle) * F_PI18000);
                aObjectMatrix.rotate((36000 - aGeo.nRotationAngle.get()) * F_PI18000);

                // create inverse from it and back-transform polygon
                basegfx::B2DHomMatrix aInvObjectMatrix(aObjectMatrix);
@@ -2901,9 +2901,9 @@
    basegfx::B2DPolyPolygon aNewPolyPolygon(rPolyPolygon);

    // reset object shear and rotations
    aGeo.nRotationAngle = 0;
    aGeo.nRotationAngle = 0_deg100;
    aGeo.RecalcSinCos();
    aGeo.nShearAngle = 0;
    aGeo.nShearAngle = 0_deg100;
    aGeo.RecalcTan();

    if( getSdrModelFromSdrObject().IsWriter() )
@@ -2949,7 +2949,7 @@
    if(!basegfx::fTools::equalZero(fShearX))
    {
        aTransform.shearX(tan(-atan(fShearX)));
        aGeo.nShearAngle = FRound(atan(fShearX) / F_PI18000);
        aGeo.nShearAngle = Degree100(FRound(atan(fShearX) / F_PI18000));
        aGeo.RecalcTan();
    }

@@ -2963,7 +2963,7 @@
        // #i78696#
        // fRotate is mathematically correct, but aGeoStat.nRotationAngle is
        // mirrored -> mirror value here
        aGeo.nRotationAngle = NormAngle36000(FRound(-fRotate / F_PI18000));
        aGeo.nRotationAngle = NormAngle36000(Degree100(FRound(-fRotate / F_PI18000)));
        aGeo.RecalcSinCos();
    }

diff --git a/svx/source/svdraw/svdorect.cxx b/svx/source/svdraw/svdorect.cxx
index 7491f6c..111dd2b 100644
--- a/svx/source/svdraw/svdorect.cxx
+++ b/svx/source/svdraw/svdorect.cxx
@@ -115,8 +115,8 @@
    aXPoly=aNewPoly;

    // these angles always relate to the top left corner of aRect
    if (aGeo.nShearAngle!=0) ShearXPoly(aXPoly,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotateXPoly(aXPoly,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle) ShearXPoly(aXPoly,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle) RotateXPoly(aXPoly,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    return aXPoly;
}

@@ -138,7 +138,7 @@
void SdrRectObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
{
    bool bNoTextFrame=!IsTextFrame();
    rInfo.bResizeFreeAllowed=bNoTextFrame || aGeo.nRotationAngle%9000==0;
    rInfo.bResizeFreeAllowed=bNoTextFrame || ((aGeo.nRotationAngle.get() % 9000) == 0);
    rInfo.bResizePropAllowed=true;
    rInfo.bRotateFreeAllowed=true;
    rInfo.bRotate90Allowed  =true;
@@ -170,11 +170,11 @@
void SdrRectObj::TakeUnrotatedSnapRect(tools::Rectangle& rRect) const
{
    rRect = maRect;
    if (aGeo.nShearAngle==0)
    if (aGeo.nShearAngle==0_deg100)
        return;

    tools::Long nDst=FRound((maRect.Bottom()-maRect.Top())*aGeo.mfTanShearAngle);
    if (aGeo.nShearAngle>0)
    if (aGeo.nShearAngle>0_deg100)
    {
        Point aRef(rRect.TopLeft());
        rRect.AdjustLeft( -nDst );
@@ -200,7 +200,7 @@

    bool bRounded = GetEckenradius() != 0; // rounded down
    const char* pResId = bRounded ? STR_ObjNameSingulRECTRND : STR_ObjNameSingulRECT;
    if (aGeo.nShearAngle!=0)
    if (aGeo.nShearAngle)
    {
        pResId = bRounded ? STR_ObjNameSingulPARALRND : STR_ObjNameSingulPARAL;  // parallelogram or, maybe, rhombus
    }
@@ -231,7 +231,7 @@

    bool bRounded = GetEckenradius() != 0; // rounded down
    const char* pResId = bRounded ? STR_ObjNamePluralRECTRND : STR_ObjNamePluralRECT;
    if (aGeo.nShearAngle!=0)
    if (aGeo.nShearAngle)
    {
        pResId = bRounded ? STR_ObjNamePluralPARALRND : STR_ObjNamePluralPARAL;  // parallelogram or rhombus
    }
@@ -273,7 +273,7 @@
void SdrRectObj::RecalcSnapRect()
{
    tools::Long nEckRad=GetEckenradius();
    if ((aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0) && nEckRad!=0) {
    if ((aGeo.nRotationAngle || aGeo.nShearAngle) && nEckRad!=0) {
        maSnapRect=GetXPoly().GetBoundRect();
    } else {
        SdrTextObj::RecalcSnapRect();
@@ -470,13 +470,13 @@
    SetXPolyDirty();
}

void SdrRectObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrRectObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    SdrTextObj::NbcRotate(rRef,nAngle,sn,cs);
    SetXPolyDirty();
}

void SdrRectObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrRectObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    SdrTextObj::NbcShear(rRef,nAngle,tn,bVShear);
    SetXPolyDirty();
@@ -506,8 +506,8 @@
        case 2: aPt=maRect.BottomCenter(); aPt.AdjustY(nWdt ); break;
        case 3: aPt=maRect.LeftCenter();   aPt.AdjustX( -nWdt ); break;
    }
    if (aGeo.nShearAngle!=0) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    aPt-=GetSnapRect().Center();
    SdrGluePoint aGP(aPt);
    aGP.SetPercent(false);
@@ -532,8 +532,8 @@
        case 2: aPt=maRect.BottomRight(); aPt.AdjustX(nWdt ); aPt.AdjustY(nWdt ); break;
        case 3: aPt=maRect.BottomLeft();  aPt.AdjustX( -nWdt ); aPt.AdjustY(nWdt ); break;
    }
    if (aGeo.nShearAngle!=0) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle) ShearPoint(aPt,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle) RotatePoint(aPt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    aPt-=GetSnapRect().Center();
    SdrGluePoint aGP(aPt);
    aGP.SetPercent(false);
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 710e81d..7ffc95a 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -382,8 +382,8 @@

void SdrTextObj::ImpCheckShear()
{
    if (bNoShear && aGeo.nShearAngle!=0) {
        aGeo.nShearAngle=0;
    if (bNoShear && aGeo.nShearAngle) {
        aGeo.nShearAngle=0_deg100;
        aGeo.mfTanShearAngle=0;
    }
}
@@ -391,7 +391,7 @@
void SdrTextObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
{
    bool bNoTextFrame=!IsTextFrame();
    rInfo.bResizeFreeAllowed=bNoTextFrame || aGeo.nRotationAngle%9000==0;
    rInfo.bResizeFreeAllowed=bNoTextFrame || ((aGeo.nRotationAngle.get() % 9000) == 0);
    rInfo.bResizePropAllowed=true;
    rInfo.bRotateFreeAllowed=true;
    rInfo.bRotate90Allowed  =true;
@@ -531,7 +531,7 @@
    if(aGeo.nRotationAngle)
    {
        // Unrotate!
        aMatrix.rotate(-aGeo.nRotationAngle * F_PI18000);
        aMatrix.rotate(-aGeo.nRotationAngle.get() * F_PI18000);
    }

    aXorPolyPolygon.transform(aMatrix);
@@ -609,7 +609,7 @@
        if (aAnkRect.GetWidth()<2) aAnkRect.SetRight(aAnkRect.Left()+1 ); // minimum size h and v: 2 px
        if (aAnkRect.GetHeight()<2) aAnkRect.SetBottom(aAnkRect.Top()+1 );
    }
    if (aGeo.nRotationAngle!=0) {
    if (aGeo.nRotationAngle) {
        Point aTmpPt(aAnkRect.TopLeft());
        RotatePoint(aTmpPt,aRotateRef,aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        aTmpPt-=aAnkRect.TopLeft();
@@ -776,7 +776,7 @@
        if (eVAdj==SDRTEXTVERTADJUST_BOTTOM)
            aTextPos.AdjustY(nFreeHgt );
    }
    if (aGeo.nRotationAngle!=0)
    if (aGeo.nRotationAngle)
        RotatePoint(aTextPos,aAnkRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);

    if (pAnchorRect)
@@ -1053,8 +1053,8 @@
basegfx::B2DPolyPolygon SdrTextObj::TakeXorPoly() const
{
    tools::Polygon aPol(maRect);
    if (aGeo.nShearAngle!=0) ShearPoly(aPol,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotatePoly(aPol,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle) ShearPoly(aPol,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle) RotatePoly(aPol,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);

    basegfx::B2DPolyPolygon aRetval;
    aRetval.append(aPol.getB2DPolygon());
@@ -1080,7 +1080,7 @@
        bool bFitToSize(IsFitToSize());
        if (bFitToSize) aR=aAnchor2;
        tools::Polygon aPol(aR);
        if (aGeo.nRotationAngle!=0) RotatePoly(aPol,aR.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        if (aGeo.nRotationAngle) RotatePoly(aPol,aR.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);

        aRetval.append(aPol.getB2DPolygon());
    }
@@ -1090,11 +1090,11 @@

void SdrTextObj::RecalcSnapRect()
{
    if (aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0)
    if (aGeo.nRotationAngle || aGeo.nShearAngle)
    {
        tools::Polygon aPol(maRect);
        if (aGeo.nShearAngle!=0) ShearPoly(aPol,maRect.TopLeft(),aGeo.mfTanShearAngle);
        if (aGeo.nRotationAngle!=0) RotatePoly(aPol,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        if (aGeo.nShearAngle) ShearPoly(aPol,maRect.TopLeft(),aGeo.mfTanShearAngle);
        if (aGeo.nRotationAngle) RotatePoly(aPol,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        maSnapRect=aPol.GetBoundRect();
    } else {
        maSnapRect = maRect;
@@ -1116,8 +1116,8 @@
        case 3: aP=maRect.BottomRight(); break;
        default: aP=maRect.Center(); break;
    }
    if (aGeo.nShearAngle!=0) ShearPoint(aP,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle!=0) RotatePoint(aP,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nShearAngle) ShearPoint(aP,maRect.TopLeft(),aGeo.mfTanShearAngle);
    if (aGeo.nRotationAngle) RotatePoint(aP,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    return aP;
}

@@ -1585,8 +1585,8 @@
bool SdrTextObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& /*rPolyPolygon*/) const
{
    // get turn and shear
    double fRotate = basegfx::deg2rad(aGeo.nRotationAngle / 100.0);
    double fShearX = basegfx::deg2rad(aGeo.nShearAngle / 100.0);
    double fRotate = basegfx::deg2rad(aGeo.nRotationAngle.get() / 100.0);
    double fShearX = basegfx::deg2rad(aGeo.nShearAngle.get() / 100.0);

    // get aRect, this is the unrotated snaprect
    tools::Rectangle aRectangle(maRect);
@@ -1639,9 +1639,9 @@
    }

    // reset object shear and rotations
    aGeo.nRotationAngle = 0;
    aGeo.nRotationAngle = 0_deg100;
    aGeo.RecalcSinCos();
    aGeo.nShearAngle = 0;
    aGeo.nShearAngle = 0_deg100;
    aGeo.RecalcTan();

    // if anchor is used, make position relative to it
@@ -1672,7 +1672,7 @@
    if(!basegfx::fTools::equalZero(fShearX))
    {
        GeoStat aGeoStat;
        aGeoStat.nShearAngle = FRound(basegfx::rad2deg(atan(fShearX)) * 100.0);
        aGeoStat.nShearAngle = Degree100(FRound(basegfx::rad2deg(atan(fShearX)) * 100.0));
        aGeoStat.RecalcTan();
        Shear(Point(), aGeoStat.nShearAngle, aGeoStat.mfTanShearAngle, false);
    }
@@ -1685,7 +1685,7 @@
        // #i78696#
        // fRotate is matematically correct, but aGeoStat.nRotationAngle is
        // mirrored -> mirror value here
        aGeoStat.nRotationAngle = NormAngle36000(FRound(-fRotate / F_PI18000));
        aGeoStat.nRotationAngle = NormAngle36000(Degree100(FRound(-fRotate / F_PI18000)));
        aGeoStat.RecalcSinCos();
        Rotate(Point(), aGeoStat.nRotationAngle, aGeoStat.mfSinRotationAngle, aGeoStat.mfCosRotationAngle);
    }
@@ -1792,8 +1792,8 @@

    // get outliner set up. To avoid getting a somehow rotated MetaFile,
    // temporarily disable object rotation.
    sal_Int32 nAngle(aGeo.nRotationAngle);
    aGeo.nRotationAngle = 0;
    Degree100 nAngle(aGeo.nRotationAngle);
    aGeo.nRotationAngle = 0_deg100;
    ImpSetupDrawOutlinerForPaint( bContourFrame, rOutliner, aTextRect, aAnchorRect, aPaintRect, aFitXCorrection );
    aGeo.nRotationAngle = nAngle;

diff --git a/svx/source/svdraw/svdotxdr.cxx b/svx/source/svdraw/svdotxdr.cxx
index b7a7f54..e4727eb 100644
--- a/svx/source/svdraw/svdotxdr.cxx
+++ b/svx/source/svdraw/svdotxdr.cxx
@@ -54,8 +54,8 @@
            case 6: aPnt=maRect.BottomCenter(); eKind=SdrHdlKind::Lower; break;
            case 7: aPnt=maRect.BottomRight();  eKind=SdrHdlKind::LowerRight; break;
        }
        if (aGeo.nShearAngle!=0) ShearPoint(aPnt,maRect.TopLeft(),aGeo.mfTanShearAngle);
        if (aGeo.nRotationAngle!=0) RotatePoint(aPnt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        if (aGeo.nShearAngle) ShearPoint(aPnt,maRect.TopLeft(),aGeo.mfTanShearAngle);
        if (aGeo.nRotationAngle) RotatePoint(aPnt,maRect.TopLeft(),aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
        std::unique_ptr<SdrHdl> pH(new SdrHdl(aPnt,eKind));
        pH->SetObj(const_cast<SdrTextObj*>(this));
        pH->SetRotationAngle(aGeo.nRotationAngle);
@@ -79,9 +79,9 @@
    bool bBigOrtho=bEcke && bOrtho && rDrag.GetView()->IsBigOrtho();
    Point aPos(rDrag.GetNow());
    // Unrotate:
    if (aGeo.nRotationAngle!=0) RotatePoint(aPos,aTmpRect.TopLeft(),-aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    if (aGeo.nRotationAngle) RotatePoint(aPos,aTmpRect.TopLeft(),-aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle);
    // Unshear:
    if (aGeo.nShearAngle!=0) ShearPoint(aPos,aTmpRect.TopLeft(),-aGeo.mfTanShearAngle);
    if (aGeo.nShearAngle) ShearPoint(aPos,aTmpRect.TopLeft(),-aGeo.mfTanShearAngle);

    bool bLft=(eHdl==SdrHdlKind::UpperLeft || eHdl==SdrHdlKind::Left  || eHdl==SdrHdlKind::LowerLeft);
    bool bRgt=(eHdl==SdrHdlKind::UpperRight || eHdl==SdrHdlKind::Right || eHdl==SdrHdlKind::LowerRight);
diff --git a/svx/source/svdraw/svdotxed.cxx b/svx/source/svdraw/svdotxed.cxx
index 96341a0..f332bf5 100644
--- a/svx/source/svdraw/svdotxed.cxx
+++ b/svx/source/svdraw/svdotxed.cxx
@@ -134,7 +134,7 @@
    Size aPaperMin,aPaperMax;
    tools::Rectangle aViewInit;
    TakeTextAnchorRect(aViewInit);
    if (aGeo.nRotationAngle!=0) {
    if (aGeo.nRotationAngle) {
        Point aCenter(aViewInit.Center());
        aCenter-=aViewInit.TopLeft();
        Point aCenter0(aCenter);
diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx
index ce2ae53..906ed2b 100644
--- a/svx/source/svdraw/svdotxtr.cxx
+++ b/svx/source/svdraw/svdotxtr.cxx
@@ -41,7 +41,7 @@

void SdrTextObj::NbcSetSnapRect(const tools::Rectangle& rRect)
{
    if (aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0)
    if (aGeo.nRotationAngle || aGeo.nShearAngle)
    {
        // Either the rotation or shear angle exists.
        tools::Rectangle aSR0(GetSnapRect());
@@ -81,12 +81,12 @@
    SetRectsDirty();
}

tools::Long SdrTextObj::GetRotateAngle() const
Degree100 SdrTextObj::GetRotateAngle() const
{
    return aGeo.nRotationAngle;
}

tools::Long SdrTextObj::GetShearAngle(bool /*bVertical*/) const
Degree100 SdrTextObj::GetShearAngle(bool /*bVertical*/) const
{
    return aGeo.nShearAngle;
}
@@ -101,8 +101,8 @@

void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
{
    bool bNotSheared=aGeo.nShearAngle==0;
    bool bRotate90=bNotSheared && aGeo.nRotationAngle % 9000 ==0;
    bool bNotSheared=aGeo.nShearAngle==0_deg100;
    bool bRotate90=bNotSheared && aGeo.nRotationAngle.get() % 9000 ==0;
    bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
    bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
    if (bXMirr || bYMirr) {
@@ -119,12 +119,12 @@
        }
    }

    if (aGeo.nRotationAngle==0 && aGeo.nShearAngle==0) {
    if (aGeo.nRotationAngle==0_deg100 && aGeo.nShearAngle==0_deg100) {
        ResizeRect(maRect,rRef,xFact,yFact);
        if (bYMirr) {
            maRect.Justify();
            maRect.Move(maRect.Right()-maRect.Left(),maRect.Bottom()-maRect.Top());
            aGeo.nRotationAngle=18000;
            aGeo.nRotationAngle=18000_deg100;
            aGeo.RecalcSinCos();
        }
    }
@@ -153,19 +153,19 @@
    }

    if (bRotate90) {
        bool bRota90=aGeo.nRotationAngle % 9000 ==0;
        bool bRota90=aGeo.nRotationAngle.get() % 9000 ==0;
        if (!bRota90) { // there's seems to be a rounding error occurring: correct it
            tools::Long a=NormAngle36000(aGeo.nRotationAngle);
            if (a<4500) a=0;
            else if (a<13500) a=9000;
            else if (a<22500) a=18000;
            else if (a<31500) a=27000;
            else a=0;
            Degree100 a=NormAngle36000(aGeo.nRotationAngle);
            if (a<4500_deg100) a=0_deg100;
            else if (a<13500_deg100) a=9000_deg100;
            else if (a<22500_deg100) a=18000_deg100;
            else if (a<31500_deg100) a=27000_deg100;
            else a=0_deg100;
            aGeo.nRotationAngle=a;
            aGeo.RecalcSinCos();
        }
        if (bNotSheared!=(aGeo.nShearAngle==0)) { // correct a rounding error occurring with Shear
            aGeo.nShearAngle=0;
        if (bNotSheared!=(aGeo.nShearAngle==0_deg100)) { // correct a rounding error occurring with Shear
            aGeo.nShearAngle=0_deg100;
            aGeo.RecalcTan();
        }
    }
@@ -183,7 +183,7 @@
    SetRectsDirty();
}

void SdrTextObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    SetGlueReallyAbsolute(true);
    tools::Long dx=maRect.Right()-maRect.Left();
@@ -194,7 +194,7 @@
    maRect.SetTop(aP.Y() );
    maRect.SetRight(maRect.Left()+dx );
    maRect.SetBottom(maRect.Top()+dy );
    if (aGeo.nRotationAngle==0) {
    if (aGeo.nRotationAngle==0_deg100) {
        aGeo.nRotationAngle=NormAngle36000(nAngle);
        aGeo.mfSinRotationAngle=sn;
        aGeo.mfCosRotationAngle=cs;
@@ -207,7 +207,7 @@
    SetGlueReallyAbsolute(false);
}

void SdrTextObj::NbcShear(const Point& rRef, tools::Long /*nAngle*/, double tn, bool bVShear)
void SdrTextObj::NbcShear(const Point& rRef, Degree100 /*nAngle*/, double tn, bool bVShear)
{
    SetGlueReallyAbsolute(true);

@@ -232,12 +232,12 @@
void SdrTextObj::NbcMirror(const Point& rRef1, const Point& rRef2)
{
    SetGlueReallyAbsolute(true);
    bool bNotSheared=aGeo.nShearAngle==0;
    bool bNotSheared=aGeo.nShearAngle==0_deg100;
    bool bRotate90 = false;
    if (bNotSheared &&
        (rRef1.X()==rRef2.X() || rRef1.Y()==rRef2.Y() ||
         std::abs(rRef1.X()-rRef2.X())==std::abs(rRef1.Y()-rRef2.Y()))) {
        bRotate90=aGeo.nRotationAngle % 9000 ==0;
        bRotate90=aGeo.nRotationAngle.get() % 9000 ==0;
    }
    tools::Polygon aPol(Rect2Poly(maRect,aGeo));
    sal_uInt16 i;
@@ -255,20 +255,20 @@
    Poly2Rect(aPol,maRect,aGeo);

    if (bRotate90) {
        bool bRota90=aGeo.nRotationAngle % 9000 ==0;
        bool bRota90=aGeo.nRotationAngle.get() % 9000 ==0;
        if (bRotate90 && !bRota90) { // there's seems to be a rounding error occurring: correct it
            tools::Long a=NormAngle36000(aGeo.nRotationAngle);
            if (a<4500) a=0;
            else if (a<13500) a=9000;
            else if (a<22500) a=18000;
            else if (a<31500) a=27000;
            else a=0;
            Degree100 a=NormAngle36000(aGeo.nRotationAngle);
            if (a<4500_deg100) a=0_deg100;
            else if (a<13500_deg100) a=9000_deg100;
            else if (a<22500_deg100) a=18000_deg100;
            else if (a<31500_deg100) a=27000_deg100;
            else a=0_deg100;
            aGeo.nRotationAngle=a;
            aGeo.RecalcSinCos();
        }
    }
    if (bNotSheared!=(aGeo.nShearAngle==0)) { // correct a rounding error occurring with Shear
        aGeo.nShearAngle=0;
    if (bNotSheared!=(aGeo.nShearAngle==0_deg100)) { // correct a rounding error occurring with Shear
        aGeo.nShearAngle=0_deg100;
        aGeo.RecalcTan();
    }

diff --git a/svx/source/svdraw/svdouno.cxx b/svx/source/svdraw/svdouno.cxx
index b420368..d6800e2 100644
--- a/svx/source/svdraw/svdouno.cxx
+++ b/svx/source/svdraw/svdouno.cxx
@@ -297,17 +297,17 @@
{
    SdrRectObj::NbcResize(rRef,xFact,yFact);

    if (aGeo.nShearAngle==0 && aGeo.nRotationAngle==0)
    if (aGeo.nShearAngle==0_deg100 && aGeo.nRotationAngle==0_deg100)
        return;

    // small correctors
    if (aGeo.nRotationAngle>=9000 && aGeo.nRotationAngle<27000)
    if (aGeo.nRotationAngle>=9000_deg100 && aGeo.nRotationAngle<27000_deg100)
    {
        maRect.Move(maRect.Left()-maRect.Right(),maRect.Top()-maRect.Bottom());
    }

    aGeo.nRotationAngle  = 0;
    aGeo.nShearAngle = 0;
    aGeo.nRotationAngle  = 0_deg100;
    aGeo.nShearAngle = 0_deg100;
    aGeo.mfSinRotationAngle       = 0.0;
    aGeo.mfCosRotationAngle       = 1.0;
    aGeo.mfTanShearAngle       = 0.0;
diff --git a/svx/source/svdraw/svdovirt.cxx b/svx/source/svdraw/svdovirt.cxx
index 9a1957c..ebd37b9 100644
--- a/svx/source/svdraw/svdovirt.cxx
+++ b/svx/source/svdraw/svdovirt.cxx
@@ -305,7 +305,7 @@
    SetRectsDirty();
}

void SdrVirtObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrVirtObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    rRefObj.NbcRotate(rRef-aAnchor,nAngle,sn,cs);
    SetRectsDirty();
@@ -317,7 +317,7 @@
    SetRectsDirty();
}

void SdrVirtObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrVirtObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    rRefObj.NbcShear(rRef-aAnchor,nAngle,tn,bVShear);
    SetRectsDirty();
@@ -345,9 +345,9 @@
    }
}

void SdrVirtObj::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SdrVirtObj::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    if (nAngle!=0) {
    if (nAngle) {
        tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
        rRefObj.Rotate(rRef-aAnchor,nAngle,sn,cs);
        SetRectsDirty();
@@ -363,9 +363,9 @@
    SendUserCall(SdrUserCallType::Resize,aBoundRect0);
}

void SdrVirtObj::Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SdrVirtObj::Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    if (nAngle!=0) {
    if (nAngle) {
        tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
        rRefObj.Shear(rRef-aAnchor,nAngle,tn,bVShear);
        SetRectsDirty();
@@ -432,12 +432,12 @@
}


tools::Long SdrVirtObj::GetRotateAngle() const
Degree100 SdrVirtObj::GetRotateAngle() const
{
    return rRefObj.GetRotateAngle();
}

tools::Long SdrVirtObj::GetShearAngle(bool bVertical) const
Degree100 SdrVirtObj::GetShearAngle(bool bVertical) const
{
    return rRefObj.GetShearAngle(bVertical);
}
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index f911517..847d752 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -841,12 +841,9 @@
        aAttr.Put(XFillColorItem(OUString(), aFont.GetFillColor()));
        pText->SetMergedItemSet(aAttr);
    }
    sal_uInt32 nAngle = aFont.GetOrientation().get();
    Degree100 nAngle = toDegree100(aFont.GetOrientation());
    if (nAngle)
    {
        nAngle *= 10;
        pText->SdrAttrObj::NbcRotate(aPosition, nAngle);
    }
    InsertObj(pText, false);
}

diff --git a/svx/source/svdraw/svdpoev.cxx b/svx/source/svdraw/svdpoev.cxx
index b5329fb..f6fafcf 100644
--- a/svx/source/svdraw/svdpoev.cxx
+++ b/svx/source/svdraw/svdpoev.cxx
@@ -637,13 +637,13 @@
    if (pC2!=nullptr) RotatePoint(*pC2,*static_cast<const Point*>(p1),*static_cast<const double*>(p3),*static_cast<const double*>(p4));
}

void SdrPolyEditView::RotateMarkedPoints(const Point& rRef, tools::Long nAngle)
void SdrPolyEditView::RotateMarkedPoints(const Point& rRef, Degree100 nAngle)
{
    ForceUndirtyMrkPnt();
    OUString aStr(SvxResId(STR_EditResize));
    BegUndo(aStr,GetDescriptionOfMarkedPoints(),SdrRepeatFunc::Rotate);
    double nSin = sin(nAngle * F_PI18000);
    double nCos = cos(nAngle * F_PI18000);
    double nSin = sin(nAngle.get() * F_PI18000);
    double nCos = cos(nAngle.get() * F_PI18000);
    ImpTransformMarkedPoints(ImpRotate,&rRef,&nAngle,&nSin,&nCos);
    EndUndo();
    AdjustMarkHdl();
diff --git a/svx/source/svdraw/svdtrans.cxx b/svx/source/svdraw/svdtrans.cxx
index f3efd09..17106ee 100644
--- a/svx/source/svdraw/svdtrans.cxx
+++ b/svx/source/svdraw/svdtrans.cxx
@@ -123,11 +123,11 @@
        rPnt.setY(rRef1.Y()-dx1 );
    } else { // arbitrary axis
        // TODO: Optimize this! Raise perpendicular on the mirroring axis..?
        tools::Long nRefWink=GetAngle(rRef2-rRef1);
        Degree100 nRefWink=GetAngle(rRef2-rRef1);
        rPnt-=rRef1;
        tools::Long nPntWink=GetAngle(rPnt);
        tools::Long nAngle=2*(nRefWink-nPntWink);
        double a = nAngle * F_PI18000;
        Degree100 nPntWink=GetAngle(rPnt);
        Degree100 nAngle=2_deg100*(nRefWink-nPntWink);
        double a = nAngle.get() * F_PI18000;
        double nSin=sin(a);
        double nCos=cos(a);
        RotatePoint(rPnt,Point(),nSin,nCos);
@@ -383,42 +383,43 @@
}


tools::Long GetAngle(const Point& rPnt)
Degree100 GetAngle(const Point& rPnt)
{
    tools::Long a=0;
    Degree100 a;
    if (rPnt.Y()==0) {
        if (rPnt.X()<0) a=-18000;
        if (rPnt.X()<0) a=-18000_deg100;
    } else if (rPnt.X()==0) {
        if (rPnt.Y()>0) a=-9000;
        else a=9000;
        if (rPnt.Y()>0) a=-9000_deg100;
        else a=9000_deg100;
    } else {
        a = FRound(atan2(static_cast<double>(-rPnt.Y()), static_cast<double>(rPnt.X()))
                   / F_PI18000);
        a = Degree100(FRound(atan2(static_cast<double>(-rPnt.Y()), static_cast<double>(rPnt.X()))
                   / F_PI18000));
    }
    return a;
}

tools::Long NormAngle18000(tools::Long a)
Degree100 NormAngle18000(Degree100 a)
{
    while (a<-18000) a+=36000;
    while (a>=18000) a-=36000;
    while (a<-18000_deg100) a+=36000_deg100;
    while (a>=18000_deg100) a-=36000_deg100;
    return a;
}

tools::Long NormAngle36000(tools::Long a)
Degree100 NormAngle36000(Degree100 deg100)
{
    while (a<0) a+=36000;
    while (a>=36000) a-=36000;
    return a;
    // do an add because we want -90 to end up as 270
    int a = 36000 + deg100.get();
    a %= 36000;
    a = std::abs(a);
    return Degree100(a);
}

sal_uInt16 GetAngleSector(tools::Long nAngle)
sal_uInt16 GetAngleSector(Degree100 nAngle)
{
    while (nAngle<0) nAngle+=36000;
    while (nAngle>=36000) nAngle-=36000;
    if (nAngle< 9000) return 0;
    if (nAngle<18000) return 1;
    if (nAngle<27000) return 2;
    nAngle = NormAngle36000(nAngle);
    if (nAngle< 9000_deg100) return 0;
    if (nAngle<18000_deg100) return 1;
    if (nAngle<27000_deg100) return 2;
    return 3;
}

@@ -450,11 +451,11 @@

void GeoStat::RecalcSinCos()
{
    if (nRotationAngle==0) {
    if (nRotationAngle==0_deg100) {
        mfSinRotationAngle=0.0;
        mfCosRotationAngle=1.0;
    } else {
        double a = nRotationAngle * F_PI18000;
        double a = nRotationAngle.get() * F_PI18000;
        mfSinRotationAngle=sin(a);
        mfCosRotationAngle=cos(a);
    }
@@ -462,10 +463,10 @@

void GeoStat::RecalcTan()
{
    if (nShearAngle==0) {
    if (nShearAngle==0_deg100) {
        mfTanShearAngle=0.0;
    } else {
        double a = nShearAngle * F_PI18000;
        double a = nShearAngle.get() * F_PI18000;
        mfTanShearAngle=tan(a);
    }
}
@@ -479,8 +480,8 @@
    aPol[2]=rRect.BottomRight();
    aPol[3]=rRect.BottomLeft();
    aPol[4]=rRect.TopLeft();
    if (rGeo.nShearAngle!=0) ShearPoly(aPol,rRect.TopLeft(),rGeo.mfTanShearAngle);
    if (rGeo.nRotationAngle!=0) RotatePoly(aPol,rRect.TopLeft(),rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle);
    if (rGeo.nShearAngle) ShearPoly(aPol,rRect.TopLeft(),rGeo.mfTanShearAngle);
    if (rGeo.nRotationAngle) RotatePoly(aPol,rRect.TopLeft(),rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle);
    return aPol;
}

@@ -492,28 +493,28 @@
    rGeo.RecalcSinCos();

    Point aPt1(rPol[1]-rPol[0]);
    if (rGeo.nRotationAngle!=0) RotatePoint(aPt1,Point(0,0),-rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle); // -Sin to reverse rotation
    if (rGeo.nRotationAngle) RotatePoint(aPt1,Point(0,0),-rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle); // -Sin to reverse rotation
    tools::Long nWdt=aPt1.X();

    Point aPt0(rPol[0]);
    Point aPt3(rPol[3]-rPol[0]);
    if (rGeo.nRotationAngle!=0) RotatePoint(aPt3,Point(0,0),-rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle); // -Sin to reverse rotation
    if (rGeo.nRotationAngle) RotatePoint(aPt3,Point(0,0),-rGeo.mfSinRotationAngle,rGeo.mfCosRotationAngle); // -Sin to reverse rotation
    tools::Long nHgt=aPt3.Y();


    tools::Long nShW=GetAngle(aPt3);
    nShW-=27000; // ShearWink is measured against a vertical line
    Degree100 nShW=GetAngle(aPt3);
    nShW-=27000_deg100; // ShearWink is measured against a vertical line
    nShW=-nShW;  // negating, because '+' is shearing clock-wise

    bool bMirr=aPt3.Y()<0;
    if (bMirr) { // "exchange of points" when mirroring
        nHgt=-nHgt;
        nShW+=18000;
        nShW+=18000_deg100;
        aPt0=rPol[3];
    }
    nShW=NormAngle18000(nShW);
    if (nShW<-9000 || nShW>9000) {
        nShW=NormAngle18000(nShW+18000);
    if (nShW<-9000_deg100 || nShW>9000_deg100) {
        nShW=NormAngle18000(nShW+18000_deg100);
    }
    if (nShW<-SDRMAXSHEAR) nShW=-SDRMAXSHEAR; // limit ShearWinkel (shear angle) to +/- 89.00 deg
    if (nShW>SDRMAXSHEAR)  nShW=SDRMAXSHEAR;
diff --git a/svx/source/table/viewcontactoftableobj.cxx b/svx/source/table/viewcontactoftableobj.cxx
index 9ea6ba0..56f68c0 100644
--- a/svx/source/table/viewcontactoftableobj.cxx
+++ b/svx/source/table/viewcontactoftableobj.cxx
@@ -358,7 +358,7 @@
                        // create object matrix
                        const GeoStat& rGeoStat(rTableObj.GetGeoStat());
                        const double fShearX(-rGeoStat.mfTanShearAngle);
                        const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0);
                        const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0);
                        const basegfx::B2DHomMatrix aObjectMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                            aObjectRange.getWidth(), aObjectRange.getHeight(), fShearX, fRotate,
                            aObjectRange.getMinX(), aObjectRange.getMinY()));
@@ -422,7 +422,7 @@
                // create object matrix
                const GeoStat& rGeoStat(rTableObj.GetGeoStat());
                const double fShearX(-rGeoStat.mfTanShearAngle);
                const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle) * F_PI18000 : 0.0);
                const double fRotate(rGeoStat.nRotationAngle ? (36000 - rGeoStat.nRotationAngle.get()) * F_PI18000 : 0.0);
                const basegfx::B2DHomMatrix aObjectMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
                    aObjectRange.getWidth(), aObjectRange.getHeight(), fShearX, fRotate,
                    aObjectRange.getMinX(), aObjectRange.getMinY()));
diff --git a/svx/source/tbxctrls/grafctrl.cxx b/svx/source/tbxctrls/grafctrl.cxx
index 126e6e0..95c0ee3 100644
--- a/svx/source/tbxctrls/grafctrl.cxx
+++ b/svx/source/tbxctrls/grafctrl.cxx
@@ -694,19 +694,19 @@
                                // #106181# rotate snap rect before setting it
                                const GeoStat& aGeo = pObj->GetGeoStat();

                                if (aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0)
                                if (aGeo.nRotationAngle || aGeo.nShearAngle)
                                {
                                    tools::Polygon aPol(aNewRect);

                                    // also transform origin offset
                                    if (aGeo.nShearAngle!=0)
                                    if (aGeo.nShearAngle)
                                    {
                                        ShearPoly(aPol,
                                                aNewRect.TopLeft(),
                                                aGeo.mfTanShearAngle);
                                        ShearPoint(aOffset, Point(0,0), aGeo.mfTanShearAngle);
                                    }
                                    if (aGeo.nRotationAngle!=0)
                                    if (aGeo.nRotationAngle)
                                    {
                                        RotatePoly(aPol,
                                                aNewRect.TopLeft(),
diff --git a/svx/source/uitest/sdrobject.cxx b/svx/source/uitest/sdrobject.cxx
index 0892556..8229a45 100644
--- a/svx/source/uitest/sdrobject.cxx
+++ b/svx/source/uitest/sdrobject.cxx
@@ -144,7 +144,7 @@
            throw css::uno::RuntimeException("missing parameter ANGLE");

        double nAngle = itrAngle->second.toDouble();
        pObj->Rotate(aPos, nAngle, 0, 0);
        pObj->Rotate(aPos, Degree100(sal_Int32(nAngle)), 0, 0);
    }
    else if (rAction == "Mirror")
    {
@@ -152,7 +152,7 @@
    }
    else if (rAction == "SHEAR")
    {
        pObj->Shear(Point(), 0.0 /*nAngle*/, 0, false);
        pObj->Shear(Point(), 0_deg100 /*nAngle*/, 0, false);
    }
}

diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index 1715a6d..aade016 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -1927,8 +1927,8 @@
        const SfxPoolItem* pPoolItem=nullptr;
        if(aSet.GetItemState(SDRATTR_CIRCSTARTANGLE,false,&pPoolItem)==SfxItemState::SET)
        {
            sal_Int32 nAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
            aAny <<= nAngle;
            Degree100 nAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
            aAny <<= nAngle.get();
        }
        break;
    }
@@ -1938,8 +1938,8 @@
        const SfxPoolItem* pPoolItem=nullptr;
        if (aSet.GetItemState(SDRATTR_CIRCENDANGLE,false,&pPoolItem)==SfxItemState::SET)
        {
            sal_Int32 nAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
            aAny <<= nAngle;
            Degree100 nAngle = static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
            aAny <<= nAngle.get();
        }
        break;
    }
@@ -2353,15 +2353,16 @@
    }
    case SDRATTR_ROTATEANGLE:
    {
        sal_Int32 nAngle = 0;
        if( rValue >>= nAngle )
        sal_Int32 nTmp = 0;
        if( rValue >>= nTmp )
        {
            Degree100 nAngle(nTmp);
            Point aRef1(GetSdrObject()->GetSnapRect().Center());
            nAngle -= GetSdrObject()->GetRotateAngle();
            if (nAngle!=0)
            if (nAngle)
            {
                double nSin = sin(nAngle * F_PI18000);
                double nCos = cos(nAngle * F_PI18000);
                double nSin = sin(nAngle.get() * F_PI18000);
                double nCos = cos(nAngle.get() * F_PI18000);
                GetSdrObject()->Rotate(aRef1,nAngle,nSin,nCos);
            }
            return true;
@@ -2372,14 +2373,15 @@

    case SDRATTR_SHEARANGLE:
    {
        sal_Int32 nShear = 0;
        if( rValue >>= nShear )
        sal_Int32 nTmp = 0;
        if( rValue >>= nTmp )
        {
            Degree100 nShear(nTmp);
            nShear -= GetSdrObject()->GetShearAngle();
            if(nShear != 0 )
            if(nShear)
            {
                Point aRef1(GetSdrObject()->GetSnapRect().Center());
                double nTan = tan(nShear * F_PI18000);
                double nTan = tan(nShear.get() * F_PI18000);
                GetSdrObject()->Shear(aRef1,nShear,nTan,false);
                return true;
            }
diff --git a/sw/inc/dcontact.hxx b/sw/inc/dcontact.hxx
index 1082ebc..07114ee 100644
--- a/sw/inc/dcontact.hxx
+++ b/sw/inc/dcontact.hxx
@@ -264,14 +264,14 @@
        virtual void AddToHdlList(SdrHdlList& rHdlList) const override;
        virtual void NbcMove(const Size& rSiz) override;
        virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
        virtual void NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
        virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
        virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
        virtual void NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
        virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
        virtual void Move(const Size& rSiz) override;
        virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative = true) override;
        virtual void Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
        virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
        virtual void Mirror(const Point& rRef1, const Point& rRef2) override;
        virtual void Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear) override;
        virtual void Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
        virtual void RecalcSnapRect() override;
        virtual const tools::Rectangle& GetSnapRect() const override;
        virtual void SetSnapRect(const tools::Rectangle& rRect) override;
diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx
index 3ae40ccd..3d7fdc1 100644
--- a/sw/source/core/draw/dcontact.cxx
+++ b/sw/source/core/draw/dcontact.cxx
@@ -2393,7 +2393,7 @@
    SetRectsDirty();
}

void SwDrawVirtObj::NbcRotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SwDrawVirtObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    rRefObj.NbcRotate(rRef - GetOffset(), nAngle, sn, cs);
    SetRectsDirty();
@@ -2405,7 +2405,7 @@
    SetRectsDirty();
}

void SwDrawVirtObj::NbcShear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SwDrawVirtObj::NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    rRefObj.NbcShear(rRef - GetOffset(), nAngle, tn, bVShear);
    SetRectsDirty();
@@ -2427,7 +2427,7 @@
    }
}

void SwDrawVirtObj::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SwDrawVirtObj::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
{
    if(nAngle)
    {
@@ -2446,7 +2446,7 @@
    SendUserCall(SdrUserCallType::Resize, aBoundRect0);
}

void SwDrawVirtObj::Shear(const Point& rRef, tools::Long nAngle, double tn, bool bVShear)
void SwDrawVirtObj::Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
{
    if(nAngle)
    {
diff --git a/sw/source/core/draw/dflyobj.cxx b/sw/source/core/draw/dflyobj.cxx
index 31ddcf4..a06f0e8 100644
--- a/sw/source/core/draw/dflyobj.cxx
+++ b/sw/source/core/draw/dflyobj.cxx
@@ -378,20 +378,20 @@
    return ContainsSwGrfNode();
}

void SwVirtFlyDrawObj::Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs)
void SwVirtFlyDrawObj::Rotate(const Point& rRef, Degree100 nAngle100, double sn, double cs)
{
    if(ContainsSwGrfNode())
    {
        // RotGrfFlyFrame: Here is where the positively completed rotate interaction is executed.
        // Rotation is in 1/100th degree and may be signed (!)
        nAngle /= 10;
        Degree10 nAngle10 = toDegree10(nAngle100);

        while(nAngle < 0)
        while(nAngle10 < 0_deg10)
        {
            nAngle += 3600;
            nAngle10 += 3600_deg10;
        }

        SwWrtShell *pShForAngle = nAngle ? dynamic_cast<SwWrtShell*>(GetFlyFrame()->getRootFrame()->GetCurrShell()) : nullptr;
        SwWrtShell *pShForAngle = nAngle10 ? dynamic_cast<SwWrtShell*>(GetFlyFrame()->getRootFrame()->GetCurrShell()) : nullptr;
        if (pShForAngle)
        {
            // RotGrfFlyFrame: Add transformation to placeholder object
@@ -399,13 +399,13 @@
            const Degree10 nOldRot(SwVirtFlyDrawObj::getPossibleRotationFromFraphicFrame(aSize));
            SwFlyFrameAttrMgr aMgr(false, pShForAngle, Frmmgr_Type::NONE, nullptr);

            aMgr.SetRotation(nOldRot, (nOldRot + Degree10(nAngle)) % 3600_deg10, aSize);
            aMgr.SetRotation(nOldRot, (nOldRot + nAngle10) % 3600_deg10, aSize);
        }
    }
    else
    {
        // call parent
        SdrVirtObj::Rotate(rRef, nAngle, sn, cs);
        SdrVirtObj::Rotate(rRef, nAngle100, sn, cs);
    }
}

@@ -1167,7 +1167,7 @@
    return nRetval;
}

tools::Long SwVirtFlyDrawObj::GetRotateAngle() const
Degree100 SwVirtFlyDrawObj::GetRotateAngle() const
{
    if(ContainsSwGrfNode())
    {
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index 767e4e7..4250a11 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -2975,8 +2975,8 @@
        if(dynamic_cast<const SdrCircObj*>( pObj) !=  nullptr)
        {
            SfxItemSet aAttr(pDrawModel->GetItemPool());
            aAttr.Put(makeSdrCircStartAngleItem(9000));
            aAttr.Put(makeSdrCircEndAngleItem(0));
            aAttr.Put(makeSdrCircStartAngleItem(9000_deg100));
            aAttr.Put(makeSdrCircEndAngleItem(0_deg100));
            pObj->SetMergedItemSet(aAttr);
        }
        else if(dynamic_cast<const SdrPathObj*>( pObj) !=  nullptr)
diff --git a/sw/source/core/inc/dflyobj.hxx b/sw/source/core/inc/dflyobj.hxx
index e05fe4e..55d87f6 100644
--- a/sw/source/core/inc/dflyobj.hxx
+++ b/sw/source/core/inc/dflyobj.hxx
@@ -97,7 +97,7 @@
    // we treat the size calculation completely on ourself here
    virtual const tools::Rectangle& GetCurrentBoundRect() const override;
    virtual const tools::Rectangle& GetLastBoundRect() const override;
    virtual       tools::Long       GetRotateAngle() const override;
    virtual       Degree100  GetRotateAngle() const override;
    virtual       void       RecalcBoundRect() override;
    virtual       void       RecalcSnapRect() override;
    virtual const tools::Rectangle& GetSnapRect()  const override;
@@ -116,7 +116,7 @@
                                    const Fraction& yFact, bool bUnsetRelative = true) override;
    virtual       void       Crop(const basegfx::B2DPoint& rRef, double fxFact, double fyFact) override;
    virtual       void       addCropHandles(SdrHdlList& rTarget) const override;
    virtual       void       Rotate(const Point& rRef, tools::Long nAngle, double sn, double cs) override;
    virtual       void       Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;

    // FullDrag support
    virtual SdrObjectUniquePtr getFullDragClone() const override;
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 1134900..0b20b98 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -5030,7 +5030,7 @@
        if (Degree10 nRot = rSet.Get(RES_GRFATR_ROTATION).GetValue())
        {
            // RES_GRFATR_ROTATION is in 10ths of degree; convert to 100ths for macro
            sal_uInt32 mOOXMLRot = oox::drawingml::ExportRotateClockwisify(nRot.get()*10);
            sal_uInt32 mOOXMLRot = oox::drawingml::ExportRotateClockwisify(toDegree100(nRot));
            xFrameAttributes->add(XML_rot, OString::number(mOOXMLRot));
        }
    }
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx
index 54ae415..edba8df 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -77,14 +77,14 @@
    return aResult;
}

void lclMovePositionWithRotation(awt::Point& aPos, const Size& rSize, sal_Int64 nRotation)
void lclMovePositionWithRotation(awt::Point& aPos, const Size& rSize, Degree100 nRotation100)
{
    // code from ImplEESdrWriter::ImplFlipBoundingBox (filter/source/msfilter/eschesdo.cxx)
    // TODO: refactor

    if (nRotation == 0)
    if (nRotation100 == 0_deg100)
        return;

    sal_Int64 nRotation = nRotation100.get();
    if (nRotation < 0)
        nRotation = (36000 + nRotation) % 36000;
    if (nRotation % 18000 == 0)
@@ -147,7 +147,7 @@
    bool m_bDMLAndVMLDrawingOpen;
    /// List of TextBoxes in this document: they are exported as part of their shape, never alone.
    /// Preserved rotation for TextFrames.
    sal_Int32 m_nDMLandVMLTextFrameRotation;
    Degree100 m_nDMLandVMLTextFrameRotation;

public:
    bool m_bFlyFrameGraphic = false;
@@ -166,7 +166,6 @@
        , m_pFlyWrapAttrList(nullptr)
        , m_pBodyPrAttrList(nullptr)
        , m_bDMLAndVMLDrawingOpen(false)
        , m_nDMLandVMLTextFrameRotation(0)
    {
    }

@@ -269,12 +268,12 @@

    DocxExport& getExport() const { return m_rExport; }

    void setDMLandVMLTextFrameRotation(sal_Int32 nDMLandVMLTextFrameRotation)
    void setDMLandVMLTextFrameRotation(Degree100 nDMLandVMLTextFrameRotation)
    {
        m_nDMLandVMLTextFrameRotation = nDMLandVMLTextFrameRotation;
    }

    sal_Int32& getDMLandVMLTextFrameRotation() { return m_nDMLandVMLTextFrameRotation; }
    Degree100& getDMLandVMLTextFrameRotation() { return m_nDMLandVMLTextFrameRotation; }
};

DocxSdrExport::DocxSdrExport(DocxExport& rExport, const sax_fastparser::FSHelperPtr& pSerializer,
@@ -426,7 +425,7 @@
        awt::Point aPos(pFrameFormat->GetHoriOrient().GetPos(),
                        pFrameFormat->GetVertOrient().GetPos());
        const SdrObject* pObj = pFrameFormat->FindRealSdrObject();
        tools::Long nRotation = 0;
        Degree100 nRotation(0);
        if (pObj != nullptr)
        {
            // SdrObjects know their layer, consider that instead of the frame format.
@@ -1274,7 +1273,7 @@
        pFS->singleElementNS(XML_wps, XML_cNvSpPr, XML_txBox, "1");

        uno::Any aRotation;
        m_pImpl->setDMLandVMLTextFrameRotation(0);
        m_pImpl->setDMLandVMLTextFrameRotation(0_deg100);
        if (xPropSetInfo.is() && xPropSetInfo->hasPropertyByName("FrameInteropGrabBag"))
        {
            uno::Sequence<beans::PropertyValue> propList;
@@ -1286,7 +1285,9 @@
            if (pProp != propList.end())
                aRotation = pProp->Value;
        }
        aRotation >>= m_pImpl->getDMLandVMLTextFrameRotation();
        sal_Int32 nTmp;
        if (aRotation >>= nTmp)
            m_pImpl->getDMLandVMLTextFrameRotation() = Degree100(nTmp);
        OString sRotation(OString::number(
            oox::drawingml::ExportRotateClockwisify(m_pImpl->getDMLandVMLTextFrameRotation())));
        // Shape properties
@@ -1526,7 +1527,7 @@
    m_pImpl->getTextFrameStyle() = "position:absolute";
    if (!bTextBoxOnly)
    {
        OString sRotation(OString::number(m_pImpl->getDMLandVMLTextFrameRotation() / -100));
        OString sRotation(OString::number(m_pImpl->getDMLandVMLTextFrameRotation().get() / -100));
        m_pImpl->getExport()
            .SdrExporter()
            .getTextFrameStyle()
diff --git a/sw/source/filter/ww8/rtfsdrexport.cxx b/sw/source/filter/ww8/rtfsdrexport.cxx
index 87a559e..3ad3404 100644
--- a/sw/source/filter/ww8/rtfsdrexport.cxx
+++ b/sw/source/filter/ww8/rtfsdrexport.cxx
@@ -669,7 +669,7 @@
                // RTF angle: 0-360 * 2^16  clockwise
                // LO  angle: 0-360 * 100   counter-clockwise
                sal_Int32 nRotation
                    = -1 * pTextObj->GetGeoStat().nRotationAngle * RTF_MULTIPLIER / 100;
                    = -1 * pTextObj->GetGeoStat().nRotationAngle.get() * RTF_MULTIPLIER / 100;
                lcl_AppendSP(m_rAttrOutput.RunText(), "rotation",
                             msfilter::rtfutil::OutString(OUString::number(nRotation),
                                                          m_rExport.GetCurrentEncoding()));
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
index 73960cb..8b514ba 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -676,9 +676,9 @@
                aRect = pObj->GetLogicRect();

                // rotating to vertical means swapping height and width as seen in SvxMSDffManager::ImportShape
                const tools::Long nAngle = NormAngle36000( pObj->GetRotateAngle() );
                const Degree100 nAngle = NormAngle36000( pObj->GetRotateAngle() );
                const bool bAllowSwap = pObj->GetObjIdentifier() != OBJ_LINE && pObj->GetObjIdentifier() != OBJ_GRUP;
                if ( bAllowSwap && (( nAngle > 4500 && nAngle <= 13500 ) || ( nAngle > 22500 && nAngle <= 31500 )) )
                if ( bAllowSwap && (( nAngle > 4500_deg100 && nAngle <= 13500_deg100 ) || ( nAngle > 22500_deg100 && nAngle <= 31500_deg100 )) )
                {
                    const tools::Long nWidth  = aRect.getWidth();
                    const tools::Long nHeight = aRect.getHeight();
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
index d766142..c2efe73 100644
--- a/sw/source/filter/ww8/ww8graf.cxx
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -415,8 +415,8 @@
        *m_pDrawModel,
        SdrCircKind::Section,
        tools::Rectangle(aP0, aP1),
        nW * 9000,
        ( ( nW + 1 ) & 3 ) * 9000);
        Degree100(nW * 9000),
        Degree100(( ( nW + 1 ) & 3 ) * 9000));

    SetStdAttr( rSet, aArc.aLnt, aArc.aShd );
    SetFill( rSet, aArc.aFill );
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index c8e5256..91b8f84 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -719,7 +719,7 @@
            ScaleEmu( nTextTop );
            ScaleEmu( nTextBottom );

            sal_Int32 nTextRotationAngle=0;
            Degree100 nTextRotationAngle;
            bool bVerticalText = false;
            if ( IsProperty( DFF_Prop_txflTextFlow ) )
            {
@@ -728,18 +728,18 @@
                switch( eTextFlow )
                {
                    case mso_txflBtoT:
                        nTextRotationAngle = 9000;
                        nTextRotationAngle = 9000_deg100;
                    break;
                    case mso_txflVertN:
                    case mso_txflTtoBN:
                        nTextRotationAngle = 27000;
                        nTextRotationAngle = 27000_deg100;
                        break;
                    case mso_txflTtoBA:
                        bVerticalText = true;
                    break;
                    case mso_txflHorzA:
                        bVerticalText = true;
                        nTextRotationAngle = 9000;
                        nTextRotationAngle = 9000_deg100;
                    break;
                    case mso_txflHorzN:
                    default :
@@ -749,7 +749,7 @@

            if (nTextRotationAngle)
            {
                if (nTextRotationAngle == 9000)
                if (nTextRotationAngle == 9000_deg100)
                {
                    tools::Long nWidth = rTextRect.GetWidth();
                    rTextRect.SetRight( rTextRect.Left() + rTextRect.GetHeight() );
@@ -765,7 +765,7 @@
                    nTextTop = nOldTextLeft;
                    nTextBottom = nOldTextRight;
                }
                else if (nTextRotationAngle == 27000)
                else if (nTextRotationAngle == 27000_deg100)
                {
                    tools::Long nWidth = rTextRect.GetWidth();
                    rTextRect.SetRight( rTextRect.Left() + rTextRect.GetHeight() );
@@ -942,13 +942,13 @@
                        double fExtraTextRotation = 0.0;
                        if ( mnFix16Angle && !( GetPropertyValue( DFF_Prop_FitTextToShape, 0 ) & 4 ) )
                        {   // text is already rotated, we have to take back the object rotation if DFF_Prop_RotateText is false
                            fExtraTextRotation = -mnFix16Angle;
                            fExtraTextRotation = -mnFix16Angle.get();
                        }
                        if ( rObjData.nSpFlags & ShapeFlag::FlipV )    // sj: in ppt the text is flipped, whereas in word the text
                        {                                       // remains unchanged, so we have to take back the flipping here
                            fExtraTextRotation += 18000.0;      // because our core will flip text if the shape is flipped.
                        }
                        fExtraTextRotation += nTextRotationAngle;
                        fExtraTextRotation += nTextRotationAngle.get();
                        if ( !::basegfx::fTools::equalZero( fExtraTextRotation ) )
                        {
                            fExtraTextRotation /= 100.0;
@@ -964,9 +964,7 @@
                else if ( mnFix16Angle )
                {
                    // rotate text with shape ?
                    double a = mnFix16Angle * F_PI18000;
                    pObj->NbcRotate( rObjData.aBoundRect.Center(), mnFix16Angle,
                                     sin( a ), cos( a ) );
                    pObj->NbcRotate( rObjData.aBoundRect.Center(), mnFix16Angle );
                }
            }
        }
diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx
index b8eedd8..2581e70 100644
--- a/sw/source/ui/frmdlg/frmpage.cxx
+++ b/sw/source/ui/frmdlg/frmpage.cxx
@@ -2358,7 +2358,7 @@
    }
    else
    {
        m_xCtlAngle->SetRotation(0);
        m_xCtlAngle->SetRotation(0_deg100);
    }
    m_xCtlAngle->SaveValue();

diff --git a/sw/source/uibase/ribbar/concustomshape.cxx b/sw/source/uibase/ribbar/concustomshape.cxx
index be3820da..97914c8 100644
--- a/sw/source/uibase/ribbar/concustomshape.cxx
+++ b/sw/source/uibase/ribbar/concustomshape.cxx
@@ -137,7 +137,7 @@
                                    EE_ITEMS_START, EE_ITEMS_END>{});
                            aDest.Set( rSource );
                            pObj->SetMergedItemSet( aDest );
                            sal_Int32 nAngle = pSourceObj->GetRotateAngle();
                            Degree100 nAngle = pSourceObj->GetRotateAngle();
                            if ( nAngle )
                                pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle );
                            bAttributesAppliedFromGallery = true;
diff --git a/sw/source/uibase/shells/beziersh.cxx b/sw/source/uibase/shells/beziersh.cxx
index 4764dec..73bbc88 100644
--- a/sw/source/uibase/shells/beziersh.cxx
+++ b/sw/source/uibase/shells/beziersh.cxx
@@ -54,7 +54,7 @@

    SwWrtShell *pSh = &GetShell();
    SdrView*    pSdrView = pSh->GetDrawView();
    pSdrView->SetEliminatePolyPointLimitAngle(1500);
    pSdrView->SetEliminatePolyPointLimitAngle(1500_deg100);

    SfxShell::SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Draw));
}
diff --git a/sw/source/uibase/shells/frmsh.cxx b/sw/source/uibase/shells/frmsh.cxx
index 1047655..6e990cd 100644
--- a/sw/source/uibase/shells/frmsh.cxx
+++ b/sw/source/uibase/shells/frmsh.cxx
@@ -400,7 +400,7 @@

                if (pArgs && SfxItemState::SET == pArgs->GetItemState(SID_ATTR_TRANSFORM_DELTA_ANGLE, false, &pItem))
                {
                    const Degree10 nDeltaRot(static_cast<const SdrAngleItem*>(pItem)->GetValue() / 10);
                    const Degree10 nDeltaRot = toDegree10(static_cast<const SdrAngleItem*>(pItem)->GetValue());
                    aMgr.SetRotation(nOldRot, nOldRot + nDeltaRot, rRotation.GetUnrotatedSize());
                }

@@ -410,7 +410,7 @@
                // 100th degrees in SID_ATTR_TRANSFORM_ANGLE to 10th degrees in RES_GRFATR_ROTATION
                if (pArgs && SfxItemState::SET == pArgs->GetItemState(SID_ATTR_TRANSFORM_ANGLE, false, &pItem))
                {
                    const Degree10 nNewRot(static_cast<const SdrAngleItem*>(pItem)->GetValue() / 10);
                    const Degree10 nNewRot = toDegree10(static_cast<const SdrAngleItem*>(pItem)->GetValue());

                    // RotGrfFlyFrame: Rotation change here, SwFlyFrameAttrMgr aMgr is available
                    aMgr.SetRotation(nOldRot, nNewRot, rRotation.GetUnrotatedSize());
diff --git a/sw/source/uibase/shells/grfsh.cxx b/sw/source/uibase/shells/grfsh.cxx
index c3eedb1..d4197cb 100644
--- a/sw/source/uibase/shells/grfsh.cxx
+++ b/sw/source/uibase/shells/grfsh.cxx
@@ -511,7 +511,7 @@
                // RotGrfFlyFrame: Get and process evtl. changed RotationAngle
                if ( SfxItemState::SET == pSet->GetItemState(SID_ATTR_TRANSFORM_ANGLE, false, &pItem ))
                {
                    const Degree10 aNewRotation((static_cast<const SdrAngleItem*>(pItem)->GetValue() / 10) % 3600);
                    const Degree10 aNewRotation = toDegree10(static_cast<const SdrAngleItem*>(pItem)->GetValue() % 36000_deg100);

                    // RotGrfFlyFrame: Possible rotation change here, SwFlyFrameAttrMgr aMgr is available
                    aMgr.SetRotation(nCurrentRotation, aNewRotation, aUnrotatedSize);
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index 59c972e..02c348a0 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -792,7 +792,7 @@
                        if (m_pImpl->isYSizeValis())
                            aSize.Height = m_pImpl->getYSize();

                        sal_Int32 nRotation = 0;
                        Degree100 nRotation;
                        if (bKeepRotation)
                        {
                            // Use internal API, getPropertyValue(RotateAngle)
@@ -804,8 +804,8 @@
                        m_xShape->setSize(aSize);
                        if (bKeepRotation)
                        {
                            xShapeProps->setPropertyValue("RotateAngle", uno::makeAny(nRotation));
                            if (nRotation == 0)
                            xShapeProps->setPropertyValue("RotateAngle", uno::makeAny(nRotation.get()));
                            if (nRotation == 0_deg100)
                            {
                                // Include effect extent in the margin to bring Writer layout closer
                                // to Word. But do this for non-rotated shapes only, where effect
diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx
index be403b0..bf94d9c 100644
--- a/writerfilter/source/rtftok/rtfsdrimport.cxx
+++ b/writerfilter/source/rtftok/rtfsdrimport.cxx
@@ -250,8 +250,7 @@
        uno::Reference<lang::XServiceInfo> xServiceInfo(xShape, uno::UNO_QUERY);
        if (!xServiceInfo->supportsService("com.sun.star.text.TextFrame"))
            xPropertySet->setPropertyValue(
                "RotateAngle",
                uno::makeAny(sal_Int32(NormAngle36000(static_cast<tools::Long>(nRotation) * -1))));
                "RotateAngle", uno::makeAny(NormAngle36000(Degree100(nRotation * -1)).get()));
    }

    if (nHoriOrient != 0 && xPropertySet.is())