basegfx/source/tools/gradienttools.cxx                      |  191 +++++++---
 chart2/source/controller/main/ChartController_Tools.cxx     |    7 
 cui/source/tabpages/tpgradnt.cxx                            |   32 +
 cui/source/tabpages/tptrans.cxx                             |   23 -
 drawinglayer/inc/texture/texture.hxx                        |   16 
 drawinglayer/qa/unit/vclpixelprocessor2d.cxx                |    8 
 drawinglayer/source/attribute/fillgradientattribute.cxx     |   34 -
 drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx |   12 
 drawinglayer/source/primitive3d/textureprimitive3d.cxx      |   10 
 drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx  |    8 
 drawinglayer/source/processor2d/vclpixelprocessor2d.cxx     |   12 
 drawinglayer/source/processor3d/defaultprocessor3d.cxx      |   14 
 drawinglayer/source/texture/texture.cxx                     |  198 +++++-----
 drawinglayer/source/tools/primitive2dxmldump.cxx            |   17 
 drawinglayer/source/tools/wmfemfhelper.cxx                  |   12 
 filter/source/msfilter/msdffimp.cxx                         |    8 
 filter/source/msfilter/svdfppt.cxx                          |    6 
 include/basegfx/utils/gradienttools.hxx                     |  136 ++++---
 include/drawinglayer/attribute/fillgradientattribute.hxx    |   20 -
 include/svx/unomid.hxx                                      |    1 
 include/svx/xgrad.hxx                                       |   21 -
 offapi/UnoApi_offapi.mk                                     |    3 
 offapi/com/sun/star/awt/ColorStop.idl                       |   32 +
 offapi/com/sun/star/awt/ColorStopSequence.idl               |   17 
 offapi/com/sun/star/awt/Gradient2.idl                       |   26 +
 reportdesign/source/ui/misc/UITools.cxx                     |    4 
 reportdesign/source/ui/report/ReportController.cxx          |    3 
 sc/qa/unit/subsequent_filters_test3.cxx                     |   16 
 sd/qa/unit/uiimpress.cxx                                    |    4 
 sd/source/core/drawdoc4.cxx                                 |   49 +-
 sd/source/ui/sidebar/SlideBackground.cxx                    |   11 
 sd/source/ui/view/drviews9.cxx                              |   41 +-
 svx/source/customshapes/EnhancedCustomShape2d.cxx           |   21 -
 svx/source/sdr/attribute/sdrallfillattributeshelper.cxx     |    8 
 svx/source/sdr/primitive2d/sdrattributecreator.cxx          |  113 ++---
 svx/source/sidebar/area/AreaPropertyPanelBase.cxx           |   21 -
 svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx   |   17 
 svx/source/svdraw/gradtrns.cxx                              |   16 
 svx/source/svdraw/svdetc.cxx                                |    4 
 svx/source/svdraw/svdfmtf.cxx                               |   17 
 svx/source/svdraw/svdoashp.cxx                              |   10 
 svx/source/unodraw/XPropertyTable.cxx                       |   11 
 svx/source/unodraw/unobrushitemhelper.cxx                   |    8 
 svx/source/xoutdev/xattr.cxx                                |  227 +++++++-----
 svx/source/xoutdev/xpool.cxx                                |   14 
 svx/source/xoutdev/xtabgrdt.cxx                             |   25 -
 sw/source/core/unocore/unoframe.cxx                         |    6 
 sw/source/filter/ww8/docxattributeoutput.cxx                |    4 
 sw/source/filter/ww8/rtfattributeoutput.cxx                 |    8 
 sw/source/uibase/docvw/HeaderFooterWin.cxx                  |    6 
 sw/source/uibase/docvw/ShadowOverlayObject.cxx              |   21 -
 sw/source/uibase/sidebar/PageStylesPanel.cxx                |   11 
 52 files changed, 959 insertions(+), 601 deletions(-)

New commits:
commit 01d0019c851b9e942f9a3b94d6dd554fb1adb40c
Author:     Armin Le Grand (allotropia) <armin.le.grand.ext...@allotropia.de>
AuthorDate: Mon Mar 13 19:39:34 2023 +0100
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Sun Mar 19 17:38:38 2023 +0000

    MCGR: Model data changes for ColorSteps
    
    Added tooling replaceStart/EndColor to allow simple
    transition for code that does not immediately adapt
    to multi color gradients. Also added
    createColorStepsFromStartEndColor for the same
    purpose.
    
    Adapted XGradient to no longer have Start/EndColor
    at all, but only use ColorSteps.
    
    Adapted all usages of XGradient to no longer use
    Get/Set/Start/EndColor, but access the ColorSteps
    instead.
    
    Replaced quite some XGradient constructors that
    used XGradient() as Start/EndColor since this is
    already the default.
    
    Adapted ColorBlending to black AKA Start/EndIntens
    in XGradient to work now on all ColorSteps in the
    required linearly-scaled manner.
    
    UNO API changes:
    
    Added com::sun::star::awt::ColorStep as basic data
    element that holds a pair of Offset and Color.
    
    Added com::sun::star::awt::ColorStepSequence to
    handle an array of sorted entries.
    
    Added com::sun::star::awt::Gradient2 derived from
    com::sun::star::awt::Gradient, extended by the
    needed com::sun::star::awt::ColorStepSequence.
    
    Added MID_GRADIENT_COLORSTEPSEQUENCE to UNO API
    to provide access to ColorSteps directly.
    
    Adapted XFillGradientItem::QueryValue/PutValue to
    make use of new UNO API data structures. To do so,
    added tooling methods for data transition:
        - fillColorStepSequenceFromColorSteps
        - fillGradient2FromXGradient
        - fillColorStepsFromAny
        - fillXGradientFromAny
    and adapted
        - case '0' (all data)
        - MID_FILLGRADIENT
        - MID_GRADIENT_COLORSTEPSEQUENCE
        - MID_GRADIENT_START/ENDCOLOR
    to make use of these.
    
    Tested usage of these in the office.
    
    Renamed from GradientStep to GradientStop after
    discussions with members on the list to make this
    closer related to other norms/definitions.
    
    Also renamed classes and class members to better
    reflect to GradientStop, so grepping/finding will
    be easier (e.g. 'Color' just exists pretty often,
    but 'StopColor' is more precise).
    
    Changed the used UNO API class for reprsenting the
    Color to better reflect to ranges [0.0 .. 1.0] and
    usage of RGB.
    
    Change-Id: I1eeb3e97e81d6785967615d1ff256551fc3b882d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148849
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/basegfx/source/tools/gradienttools.cxx 
b/basegfx/source/tools/gradienttools.cxx
index 0bb45ba4d523..d43f7899121a 100644
--- a/basegfx/source/tools/gradienttools.cxx
+++ b/basegfx/source/tools/gradienttools.cxx
@@ -21,6 +21,7 @@
 #include <basegfx/point/b2dpoint.hxx>
 #include <basegfx/range/b2drange.hxx>
 #include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <com/sun/star/awt/Gradient2.hpp>
 
 #include <algorithm>
 #include <cmath>
@@ -263,19 +264,123 @@ namespace basegfx
 
     namespace utils
     {
+        /* Tooling method to convert UNO API data to ColorStops
+           This will try to extract ColorStop data from the given
+           Any, so if it's of type awt::Gradient2 that data will be
+           extracted, converted and copied into the given ColorStops.
+        */
+        void fillColorStopsFromAny(ColorStops& rColorStops, const 
css::uno::Any& rVal)
+        {
+            css::awt::Gradient2 aGradient2;
+            if (!(rVal >>= aGradient2))
+                return;
+
+            const sal_Int32 nLen(aGradient2.ColorStops.getLength());
+
+            if (0 == nLen)
+                return;
+
+            // we have ColorStops
+            rColorStops.clear();
+            rColorStops.reserve(nLen);
+            const css::awt::ColorStop* 
pSourceColorStop(aGradient2.ColorStops.getConstArray());
+
+            for (sal_Int32 a(0); a < nLen; a++, pSourceColorStop++)
+            {
+                rColorStops.emplace_back(
+                    pSourceColorStop->StopOffset,
+                    BColor(pSourceColorStop->StopColor.Red, 
pSourceColorStop->StopColor.Green, pSourceColorStop->StopColor.Blue));
+            }
+        }
+
+        /* Tooling method to fill a awt::ColorStopSequence with
+           the data from the given ColorStops. This is used in
+           UNO API implementations.
+        */
+        void fillColorStopSequenceFromColorStops(css::awt::ColorStopSequence& 
rColorStopSequence, const ColorStops& rColorStops)
+        {
+            // fill ColorStops to extended Gradient2
+            rColorStopSequence.realloc(rColorStops.size());
+            css::awt::ColorStop* 
pTargetColorStop(rColorStopSequence.getArray());
+
+            for (const auto& candidate : rColorStops)
+            {
+                pTargetColorStop->StopOffset = candidate.getStopOffset();
+                pTargetColorStop->StopColor = css::rendering::RGBColor(
+                    candidate.getStopColor().getRed(),
+                    candidate.getStopColor().getGreen(),
+                    candidate.getStopColor().getBlue());
+                pTargetColorStop++;
+            }
+        }
+
+        /* Tooling method that allows to replace the StartColor in a
+           vector of ColorStops. A vector in 'ordered state' is expected,
+           so you may use/have used sortAndCorrectColorStops, see below.
+           This method is for convenience & backwards compatibility, please
+           think about handling multi-colored gradients directly.
+        */
+        void replaceStartColor(ColorStops& rColorStops, const BColor& rStart)
+        {
+            ColorStops::iterator a1stNonStartColor(rColorStops.begin());
+
+            // search for highest existing non-StartColor
+            while (a1stNonStartColor != rColorStops.end() && 
basegfx::fTools::lessOrEqual(a1stNonStartColor->getStopOffset(), 0.0))
+                a1stNonStartColor++;
+
+            // create new ColorStops by 1st adding new one and then all
+            // non-StartColor entries
+            ColorStops aNewColorStops;
+
+            aNewColorStops.reserve(rColorStops.size() + 1);
+            aNewColorStops.emplace_back(0.0, rStart);
+            aNewColorStops.insert(aNewColorStops.end(), a1stNonStartColor, 
rColorStops.end());
+
+            // assign & done
+            rColorStops = aNewColorStops;
+        }
+
+        /* Tooling method that allows to replace the EndColor in a
+           vector of ColorStops. A vector in 'ordered state' is expected,
+           so you may use/have used sortAndCorrectColorStops, see below.
+           This method is for convenience & backwards compatibility, please
+           think about handling multi-colored gradients directly.
+        */
+        void replaceEndColor(ColorStops& rColorStops, const BColor& rEnd)
+        {
+            // erase all evtl. existing EndColor(s)
+            while (!rColorStops.empty() && 
basegfx::fTools::moreOrEqual(rColorStops.back().getStopOffset(), 1.0))
+                rColorStops.pop_back();
+
+            // add at the end of existing ColorStops
+            rColorStops.emplace_back(1.0, rEnd);
+        }
+
+        // Tooling method to quickly create a ColorStop vector for a given set 
of Start/EndColor
+        ColorStops createColorStopsFromStartEndColor(const BColor& rStart, 
const BColor& rEnd)
+        {
+            return ColorStops {
+                ColorStop(0.0, rStart),
+                ColorStop(1.0, rEnd) };
+        }
+
         /* Tooling method to guarantee sort and correctness for
-           the given ColorSteps vector.
+           the given ColorStops vector.
+           A vector fulfilling these conditions is called to be
+           in 'ordered state'.
+
            At return, the following conditions are guaranteed:
-           - contains no ColorSteps with offset < 0.0 (will
+           - contains no ColorStops with offset < 0.0 (will
              be removed)
-           - contains no ColorSteps with offset > 0.0 (will
+           - contains no ColorStops with offset > 1.0 (will
              be removed)
-           - contains no ColorSteps with identical offset
-             (will be removed, 1st one wins)
+           - contains no two ColorStops with identical offsets
+             (will be removed, 1st one/smallest offset wins
+             which is also given by sort tooling)
            - will be sorted from lowest offset to highest
            - if all colors are the same, the content will
              be reduced to a single entry with offset 0.0
-             (StartColor)
+             (force to StartColor)
 
            Some more notes:
            - It can happen that the result is empty
@@ -283,30 +388,30 @@ namespace basegfx
              the same color, this represents single-color
              regions inside the gradient
            - A entry with 0.0 is not required or forced, so
-             no 'StartColor' is required on this level
+             no 'StartColor' is technically required
            - A entry with 1.0 is not required or forced, so
-             no 'EndColor' is required on this level
+             no 'EndColor' is technically required
 
            All this is done in one run (sort + O(N)) without
            creating a copy of the data in any form
         */
-        void sortAndCorrectColorSteps(ColorSteps& rColorSteps)
+        void sortAndCorrectColorStops(ColorStops& rColorStops)
         {
             // no content, we are done
-            if (rColorSteps.empty())
+            if (rColorStops.empty())
                 return;
 
-            if (1 == rColorSteps.size())
+            if (1 == rColorStops.size())
             {
                 // no gradient at all, but preserve given color
                 // and force it to be the StartColor
-                rColorSteps[0] = ColorStep(0.0, rColorSteps[0].getColor());
+                rColorStops[0] = ColorStop(0.0, rColorStops[0].getStopColor());
             }
 
             // start with sorting the input data. Remember that
             // this preserves the order of equal entries, where
             // equal is defined here by offset (see use operator==)
-            std::sort(rColorSteps.begin(), rColorSteps.end());
+            std::sort(rColorStops.begin(), rColorStops.end());
 
             // prepare status values
             bool bSameColorInit(false);
@@ -318,10 +423,10 @@ namespace basegfx
             // and write with write <= read all the time. Step over the
             // data using read and check for valid entry. If valid, decide
             // how to keep it
-            for (size_t read(0); read < rColorSteps.size(); read++)
+            for (size_t read(0); read < rColorStops.size(); read++)
             {
                 // get offset of entry at read position
-                const double rOff(rColorSteps[read].getOffset());
+                const double rOff(rColorStops[read].getStopOffset());
 
                 // step over < 0 values
                 if (basegfx::fTools::less(rOff, 0.0))
@@ -338,23 +443,23 @@ namespace basegfx
                 if(bSameColorInit)
                 {
                     // already initialized, compare
-                    bAllTheSameColor = bAllTheSameColor && aFirstColor == 
rColorSteps[read].getColor();
+                    bAllTheSameColor = bAllTheSameColor && aFirstColor == 
rColorStops[read].getStopColor();
                 }
                 else
                 {
                     // do initialize, remember 1st valid color
                     bSameColorInit = true;
-                    aFirstColor = rColorSteps[read].getColor();
+                    aFirstColor = rColorStops[read].getStopColor();
                 }
 
                 // copy if write target is empty (write at start) or when
                 // write target is different to read
-                if (0 == write || rOff != rColorSteps[write-1].getOffset())
+                if (0 == write || rOff != rColorStops[write-1].getStopOffset())
                 {
                     if (write != read)
                     {
                         // copy read to write backwards to close gaps
-                        rColorSteps[write] = rColorSteps[read];
+                        rColorStops[write] = rColorStops[read];
                     }
 
                     // always forward write position
@@ -364,44 +469,44 @@ namespace basegfx
 
             // correct size when length is reduced. write is always at
             // last used position + 1
-            if (rColorSteps.size() > write)
+            if (rColorStops.size() > write)
             {
-                rColorSteps.resize(write);
+                rColorStops.resize(write);
             }
 
-            if (bSameColorInit && bAllTheSameColor && rColorSteps.size() > 1)
+            if (bSameColorInit && bAllTheSameColor && rColorStops.size() > 1)
             {
                 // id all-the-same color is detected, reset to single
                 // entry, but also force to StartColor and preserve the color
-                rColorSteps.resize(1);
-                rColorSteps[0] = ColorStep(0.0, aFirstColor);
+                rColorStops.resize(1);
+                rColorStops[0] = ColorStop(0.0, aFirstColor);
             }
         }
 
         BColor modifyBColor(
-            const ColorSteps& rColorSteps,
+            const ColorStops& rColorStops,
             double fScaler,
             sal_uInt32 nRequestedSteps)
         {
             // no color at all, done
-            if (rColorSteps.empty())
+            if (rColorStops.empty())
                 return BColor();
 
             // outside range -> at start
             if (fScaler <= 0.0)
-                return rColorSteps.front().getColor();
+                return rColorStops.front().getStopColor();
 
             // outside range -> at end
             if (fScaler >= 1.0)
-                return rColorSteps.back().getColor();
+                return rColorStops.back().getStopColor();
 
             // special case for the 'classic' case with just two colors:
             // we can optimize that and keep the speed/resources low
             // by avoiding some calculations and an O(log(N)) array access
-            if (2 == rColorSteps.size())
+            if (2 == rColorStops.size())
             {
-                const basegfx::BColor aCStart(rColorSteps.front().getColor());
-                const basegfx::BColor aCEnd(rColorSteps.back().getColor());
+                const basegfx::BColor 
aCStart(rColorStops.front().getStopColor());
+                const basegfx::BColor aCEnd(rColorStops.back().getStopColor());
                 const sal_uInt32 nSteps(
                     calculateNumberOfSteps(
                         nRequestedSteps,
@@ -421,25 +526,25 @@ namespace basegfx
             //       all is good/fast as expected
             const auto upperBound(
                 std::lower_bound(
-                    rColorSteps.begin(),
-                    rColorSteps.end(),
-                    ColorStep(fScaler),
-                    [](const ColorStep& x, const ColorStep& y) { return 
x.getOffset() < y.getOffset(); }));
+                    rColorStops.begin(),
+                    rColorStops.end(),
+                    ColorStop(fScaler),
+                    [](const ColorStop& x, const ColorStop& y) { return 
x.getStopOffset() < y.getStopOffset(); }));
 
             // no upper bound, done
-            if (rColorSteps.end() == upperBound)
-                return rColorSteps.back().getColor();
+            if (rColorStops.end() == upperBound)
+                return rColorStops.back().getStopColor();
 
             // lower bound is one entry back
             const auto lowerBound(upperBound - 1);
 
             // no lower bound, done
-            if (rColorSteps.end() == lowerBound)
-                return rColorSteps.back().getColor();
+            if (rColorStops.end() == lowerBound)
+                return rColorStops.back().getStopColor();
 
             // we have lower and upper bound, get colors
-            const BColor aCStart(lowerBound->getColor());
-            const BColor aCEnd(upperBound->getColor());
+            const BColor aCStart(lowerBound->getStopColor());
+            const BColor aCEnd(upperBound->getStopColor());
 
             // when there are just two color steps this cannot happen, but 
when using
             // a range of colors this *may* be used inside the range to 
represent
@@ -456,8 +561,8 @@ namespace basegfx
 
             // get offsets and scale to new [0.0 .. 1.0] relative range for
             // partial outer range
-            const double fOffsetStart(lowerBound->getOffset());
-            const double fOffsetEnd(upperBound->getOffset());
+            const double fOffsetStart(lowerBound->getStopOffset());
+            const double fOffsetEnd(upperBound->getStopOffset());
             const double fAdaptedScaler((fScaler - fOffsetStart) / (fOffsetEnd 
- fOffsetStart));
 
             // interpolate & evtl. apply steps
diff --git a/chart2/source/controller/main/ChartController_Tools.cxx 
b/chart2/source/controller/main/ChartController_Tools.cxx
index e2f11c7eb655..8cd3fd99045c 100644
--- a/chart2/source/controller/main/ChartController_Tools.cxx
+++ b/chart2/source/controller/main/ChartController_Tools.cxx
@@ -972,9 +972,10 @@ void 
ChartController::executeDispatch_FillGradient(std::u16string_view sJSONGrad
 
             if( xPropSet.is() )
             {
-                OUString aPrefferedName = 
OUString::number(static_cast<sal_Int32>(aXGradient.GetStartColor()))
-                                + 
OUString::number(static_cast<sal_Int32>(aXGradient.GetEndColor()))
-                                + 
OUString::number(static_cast<sal_Int32>(aXGradient.GetAngle().get()));
+                OUString aPrefferedName =
+                    
OUString::number(static_cast<sal_Int32>(Color(aXGradient.GetColorStops().front().getStopColor())))
+                    + 
OUString::number(static_cast<sal_Int32>(Color(aXGradient.GetColorStops().back().getStopColor())))
+                    + 
OUString::number(static_cast<sal_Int32>(aXGradient.GetAngle().get()));
 
                 OUString aNewName = 
PropertyHelper::addGradientUniqueNameToTable(css::uno::Any(aGradient),
                                         xChartModel,
diff --git a/cui/source/tabpages/tpgradnt.cxx b/cui/source/tabpages/tpgradnt.cxx
index 31a846d9cb96..dfe59e878334 100644
--- a/cui/source/tabpages/tpgradnt.cxx
+++ b/cui/source/tabpages/tpgradnt.cxx
@@ -34,6 +34,7 @@
 #include <dialmgr.hxx>
 #include <svx/dialmgr.hxx>
 #include <svx/strings.hrc>
+#include <basegfx/utils/gradienttools.hxx>
 #include <sal/log.hxx>
 
 #define DEFAULT_GRADIENTSTEP 64
@@ -83,7 +84,8 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
 
     // setting the output device
     m_rXFSet.Put( XFillStyleItem(drawing::FillStyle_GRADIENT) );
-    m_rXFSet.Put( XFillGradientItem(OUString(), XGradient( COL_BLACK, 
COL_WHITE )) );
+    // XGradient() default already creates [COL_BLACK, COL_WHITE] as defaults
+    m_rXFSet.Put( XFillGradientItem(OUString(), XGradient()));
     m_aCtlPreview.SetAttributes(m_aXFillAttr.GetItemSet());
 
     // set handler
@@ -194,8 +196,10 @@ bool SvxGradientTabPage::FillItemSet( SfxItemSet* rSet )
     else
     // gradient was passed (unidentified)
     {
-        pXGradient.reset(new XGradient( m_xLbColorFrom->GetSelectEntryColor(),
-                    m_xLbColorTo->GetSelectEntryColor(),
+        pXGradient.reset(new XGradient(
+                    basegfx::utils::createColorStopsFromStartEndColor(
+                        m_xLbColorFrom->GetSelectEntryColor().getBColor(),
+                        m_xLbColorTo->GetSelectEntryColor().getBColor()),
                     
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
                     
Degree10(static_cast<sal_Int16>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)), 
// should be changed in resource
                     
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
@@ -292,8 +296,10 @@ void SvxGradientTabPage::ModifiedHdl_Impl( void const * 
pControl )
 
     css::awt::GradientStyle eXGS = 
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active());
 
-    XGradient aXGradient( m_xLbColorFrom->GetSelectEntryColor(),
-                          m_xLbColorTo->GetSelectEntryColor(),
+    XGradient aXGradient(
+                          basegfx::utils::createColorStopsFromStartEndColor(
+                              
m_xLbColorFrom->GetSelectEntryColor().getBColor(),
+                              m_xLbColorTo->GetSelectEntryColor().getBColor()),
                           eXGS,
                           
Degree10(static_cast<sal_Int16>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)), 
// should be changed in resource
                           
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
@@ -359,8 +365,10 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickAddHdl_Impl, 
weld::Button&, void)
 
     if( !nError )
     {
-        XGradient aXGradient( m_xLbColorFrom->GetSelectEntryColor(),
-                              m_xLbColorTo->GetSelectEntryColor(),
+        XGradient aXGradient(
+                            basegfx::utils::createColorStopsFromStartEndColor(
+                                
m_xLbColorFrom->GetSelectEntryColor().getBColor(),
+                                
m_xLbColorTo->GetSelectEntryColor().getBColor()),
                               
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
                               
Degree10(static_cast<sal_Int16>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)), 
// should be changed in resource
                               
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
@@ -399,8 +407,10 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickModifyHdl_Impl, 
weld::Button&, void)
 
     OUString aName( m_pGradientList->GetGradient( 
static_cast<sal_uInt16>(nPos) )->GetName() );
 
-    XGradient aXGradient( m_xLbColorFrom->GetSelectEntryColor(),
-                          m_xLbColorTo->GetSelectEntryColor(),
+    XGradient aXGradient(
+                          basegfx::utils::createColorStopsFromStartEndColor(
+                              
m_xLbColorFrom->GetSelectEntryColor().getBColor(),
+                              m_xLbColorTo->GetSelectEntryColor().getBColor()),
                           
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
                           
Degree10(static_cast<sal_Int16>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)), 
// should be changed in resource
                           
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
@@ -542,10 +552,10 @@ void SvxGradientTabPage::ChangeGradientHdl_Impl()
     // if the entry is not in the listbox,
     // colors are added temporarily
     m_xLbColorFrom->SetNoSelection();
-    m_xLbColorFrom->SelectEntry( pGradient->GetStartColor() );
+    
m_xLbColorFrom->SelectEntry(Color(pGradient->GetColorStops().front().getStopColor()));
 
     m_xLbColorTo->SetNoSelection();
-    m_xLbColorTo->SelectEntry( pGradient->GetEndColor() );
+    
m_xLbColorTo->SelectEntry(Color(pGradient->GetColorStops().back().getStopColor()));
 
     m_xMtrAngle->set_value(pGradient->GetAngle().get() / 10, FieldUnit::NONE); 
// should be changed in resource
     m_xSliderAngle->set_value(pGradient->GetAngle().get() / 10);
diff --git a/cui/source/tabpages/tptrans.cxx b/cui/source/tabpages/tptrans.cxx
index 75180022f3a1..259446ef5f46 100644
--- a/cui/source/tabpages/tptrans.cxx
+++ b/cui/source/tabpages/tptrans.cxx
@@ -122,8 +122,9 @@ void SvxTransparenceTabPage::ModifiedTrgrHdl_Impl(const 
weld::ComboBox* pControl
     sal_uInt8 nStartCol = 
static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrStartValue->get_value(FieldUnit::PERCENT))
 * 255) / 100);
     sal_uInt8 nEndCol = 
static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrEndValue->get_value(FieldUnit::PERCENT))
 * 255) / 100);
     XGradient aTmpGradient(
-                Color(nStartCol, nStartCol, nStartCol),
-                Color(nEndCol, nEndCol, nEndCol),
+                basegfx::utils::createColorStopsFromStartEndColor(
+                    Color(nStartCol, nStartCol, nStartCol).getBColor(),
+                    Color(nEndCol, nEndCol, nEndCol).getBColor()),
                 
static_cast<css::awt::GradientStyle>(m_xLbTrgrGradientType->get_active()),
                 
Degree10(static_cast<sal_Int16>(m_xMtrTrgrAngle->get_value(FieldUnit::DEGREE)) 
* 10),
                 
static_cast<sal_uInt16>(m_xMtrTrgrCenterX->get_value(FieldUnit::PERCENT)),
@@ -293,8 +294,9 @@ bool SvxTransparenceTabPage::FillItemSet(SfxItemSet* rAttrs)
             sal_uInt8 nStartCol = 
static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrStartValue->get_value(FieldUnit::PERCENT))
 * 255) / 100);
             sal_uInt8 nEndCol = 
static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrEndValue->get_value(FieldUnit::PERCENT))
 * 255) / 100);
             XGradient aTmpGradient(
-                        Color(nStartCol, nStartCol, nStartCol),
-                        Color(nEndCol, nEndCol, nEndCol),
+                        basegfx::utils::createColorStopsFromStartEndColor(
+                            Color(nStartCol, nStartCol, nStartCol).getBColor(),
+                            Color(nEndCol, nEndCol, nEndCol).getBColor()),
                         
static_cast<css::awt::GradientStyle>(m_xLbTrgrGradientType->get_active()),
                         
Degree10(static_cast<sal_Int16>(m_xMtrTrgrAngle->get_value(FieldUnit::DEGREE)) 
* 10),
                         
static_cast<sal_uInt16>(m_xMtrTrgrCenterX->get_value(FieldUnit::PERCENT)),
@@ -323,9 +325,10 @@ bool SvxTransparenceTabPage::FillItemSet(SfxItemSet* 
rAttrs)
     // disable unused XFillFloatTransparenceItem
     if(bSwitchOffGradient && (bGradActive || bGradUsed))
     {
-        XGradient aGrad(COL_BLACK, COL_WHITE);
-        aGrad.SetStartIntens(100);
-        aGrad.SetEndIntens(100);
+        // XGradient() default already creates [COL_BLACK, COL_WHITE] with 
same defaults
+        // XGradient() default also sets the Start/EndIntensity to 100 already
+        XGradient aGrad;
+
         XFillFloatTransparenceItem aItem(aGrad);
         aItem.SetEnabled(false);
         rAttrs->Put(aItem);
@@ -367,8 +370,10 @@ void SvxTransparenceTabPage::Reset(const SfxItemSet* 
rAttrs)
     m_xMtrTrgrBorder->set_value(rGradient.GetBorder(), FieldUnit::PERCENT);
     m_xMtrTrgrCenterX->set_value(rGradient.GetXOffset(), FieldUnit::PERCENT);
     m_xMtrTrgrCenterY->set_value(rGradient.GetYOffset(), FieldUnit::PERCENT);
-    
m_xMtrTrgrStartValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(rGradient.GetStartColor().GetRed())
 + 1) * 100) / 255), FieldUnit::PERCENT);
-    
m_xMtrTrgrEndValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(rGradient.GetEndColor().GetRed())
 + 1) * 100) / 255), FieldUnit::PERCENT);
+    const Color aStart(rGradient.GetColorStops().front().getStopColor());
+    const Color aEnd(rGradient.GetColorStops().back().getStopColor());
+    
m_xMtrTrgrStartValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(aStart.GetRed())
 + 1) * 100) / 255), FieldUnit::PERCENT);
+    
m_xMtrTrgrEndValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(aEnd.GetRed())
 + 1) * 100) / 255), FieldUnit::PERCENT);
 
     // linear transparence
     sal_uInt16 nTransp = pLinearItem->GetValue();
diff --git a/drawinglayer/inc/texture/texture.hxx 
b/drawinglayer/inc/texture/texture.hxx
index 567a24417f51..8eff5bee261a 100644
--- a/drawinglayer/inc/texture/texture.hxx
+++ b/drawinglayer/inc/texture/texture.hxx
@@ -57,14 +57,14 @@ namespace drawinglayer::texture
             basegfx::ODFGradientInfo            maGradientInfo;
             basegfx::B2DRange                   maDefinitionRange;
             sal_uInt32                          mnRequestedSteps;
-            basegfx::ColorSteps                 mnColorSteps;
+            basegfx::ColorStops                 mnColorStops;
             double                              mfBorder;
 
         public:
             GeoTexSvxGradient(
                 const basegfx::B2DRange& rDefinitionRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder);
             virtual ~GeoTexSvxGradient() override;
 
@@ -88,7 +88,7 @@ namespace drawinglayer::texture
                 const basegfx::B2DRange& rDefinitionRange,
                 const basegfx::B2DRange& rOutputRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fAngle);
             virtual ~GeoTexSvxGradientLinear() override;
@@ -109,7 +109,7 @@ namespace drawinglayer::texture
                 const basegfx::B2DRange& rDefinitionRange,
                 const basegfx::B2DRange& rOutputRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fAngle);
             virtual ~GeoTexSvxGradientAxial() override;
@@ -126,7 +126,7 @@ namespace drawinglayer::texture
             GeoTexSvxGradientRadial(
                 const basegfx::B2DRange& rDefinitionRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fOffsetX,
                 double fOffsetY);
@@ -144,7 +144,7 @@ namespace drawinglayer::texture
             GeoTexSvxGradientElliptical(
                 const basegfx::B2DRange& rDefinitionRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fOffsetX,
                 double fOffsetY,
@@ -163,7 +163,7 @@ namespace drawinglayer::texture
             GeoTexSvxGradientSquare(
                 const basegfx::B2DRange& rDefinitionRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fOffsetX,
                 double fOffsetY,
@@ -182,7 +182,7 @@ namespace drawinglayer::texture
             GeoTexSvxGradientRect(
                 const basegfx::B2DRange& rDefinitionRange,
                 sal_uInt32 nRequestedSteps,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 double fBorder,
                 double fOffsetX,
                 double fOffsetY,
diff --git a/drawinglayer/qa/unit/vclpixelprocessor2d.cxx 
b/drawinglayer/qa/unit/vclpixelprocessor2d.cxx
index 343556aec6d1..4c26c2d4bfde 100644
--- a/drawinglayer/qa/unit/vclpixelprocessor2d.cxx
+++ b/drawinglayer/qa/unit/vclpixelprocessor2d.cxx
@@ -60,10 +60,10 @@ public:
 
         basegfx::B2DRange definitionRange(0, 0, 100, 200);
         basegfx::B2DRange outputRange(0, 100, 100, 200); // Paint only lower 
half of the gradient.
-        const basegfx::ColorSteps aColorSteps{ basegfx::ColorStep(0.0, 
COL_WHITE.getBColor()),
-                                               basegfx::ColorStep(1.0, 
COL_BLACK.getBColor()) };
-        attribute::FillGradientAttribute 
attributes(attribute::GradientStyle::Linear, 0, 0, 0, 0,
-                                                    aColorSteps);
+        attribute::FillGradientAttribute attributes(
+            attribute::GradientStyle::Linear, 0, 0, 0, 0,
+            
basegfx::utils::createColorStopsFromStartEndColor(COL_WHITE.getBColor(),
+                                                              
COL_BLACK.getBColor()));
         rtl::Reference<primitive2d::FillGradientPrimitive2D> gradientPrimitive(
             new primitive2d::FillGradientPrimitive2D(outputRange, 
definitionRange, attributes));
         primitive2d::Primitive2DContainer primitives;
diff --git a/drawinglayer/source/attribute/fillgradientattribute.cxx 
b/drawinglayer/source/attribute/fillgradientattribute.cxx
index 3d78273a6428..62bde03a29f6 100644
--- a/drawinglayer/source/attribute/fillgradientattribute.cxx
+++ b/drawinglayer/source/attribute/fillgradientattribute.cxx
@@ -30,7 +30,7 @@ namespace drawinglayer::attribute
             double                                  mfOffsetX;
             double                                  mfOffsetY;
             double                                  mfAngle;
-            basegfx::ColorSteps                     maColorSteps;
+            basegfx::ColorStops                     maColorStops;
             GradientStyle                           meStyle;
             sal_uInt16                              mnSteps;
 
@@ -40,31 +40,31 @@ namespace drawinglayer::attribute
                 double fOffsetX,
                 double fOffsetY,
                 double fAngle,
-                const basegfx::ColorSteps& rColorSteps,
+                const basegfx::ColorStops& rColorStops,
                 sal_uInt16 nSteps)
             :   mfBorder(fBorder),
                 mfOffsetX(fOffsetX),
                 mfOffsetY(fOffsetY),
                 mfAngle(fAngle),
-                maColorSteps(rColorSteps), // copy ColorSteps
+                maColorStops(rColorStops), // copy ColorStops
                 meStyle(eStyle),
                 mnSteps(nSteps)
             {
-                // Correct the local ColorSteps. That will guarantee that the
+                // Correct the local ColorStops. That will guarantee that the
                 // content does contain no offsets < 0.0, > 1.0 or double
                 // ones, also secures sorted arrangement and checks for
                 // double colors, too (see there for more information).
                 // This is what the usages of this in primitives need.
                 // Since FillGradientAttribute is read-only doing this
                 // once here in the constructor is sufficient
-                basegfx::utils::sortAndCorrectColorSteps(maColorSteps);
+                basegfx::utils::sortAndCorrectColorStops(maColorStops);
 
-                // sortAndCorrectColorSteps is rigid and can return
+                // sortAndCorrectColorStops is rigid and can return
                 // an empty result. To keep things simple, add a single
                 // fallback value
-                if (maColorSteps.empty())
+                if (maColorStops.empty())
                 {
-                    maColorSteps.emplace_back(0.0, basegfx::BColor());
+                    maColorStops.emplace_back(0.0, basegfx::BColor());
                 }
             }
 
@@ -73,12 +73,12 @@ namespace drawinglayer::attribute
                 mfOffsetX(0.0),
                 mfOffsetY(0.0),
                 mfAngle(0.0),
-                maColorSteps(),
+                maColorStops(),
                 meStyle(GradientStyle::Linear),
                 mnSteps(0)
             {
                 // always add a fallback color, see above
-                maColorSteps.emplace_back(0.0, basegfx::BColor());
+                maColorStops.emplace_back(0.0, basegfx::BColor());
             }
 
             // data read access
@@ -87,7 +87,7 @@ namespace drawinglayer::attribute
             double getOffsetX() const { return mfOffsetX; }
             double getOffsetY() const { return mfOffsetY; }
             double getAngle() const { return mfAngle; }
-            const basegfx::ColorSteps& getColorSteps() const { return 
maColorSteps; }
+            const basegfx::ColorStops& getColorStops() const { return 
maColorStops; }
             sal_uInt16 getSteps() const { return mnSteps; }
 
             bool hasSingleColor() const
@@ -96,7 +96,7 @@ namespace drawinglayer::attribute
                 // or single entry -> no gradient.
                 // No need to check for all-the-same color since this is 
checked/done
                 // in the constructor already, see there
-                return maColorSteps.size() < 2;
+                return maColorStops.size() < 2;
             }
 
             bool operator==(const ImpFillGradientAttribute& rCandidate) const
@@ -106,7 +106,7 @@ namespace drawinglayer::attribute
                     && getOffsetX() == rCandidate.getOffsetX()
                     && getOffsetY() == rCandidate.getOffsetY()
                     && getAngle() == rCandidate.getAngle()
-                    && getColorSteps() == rCandidate.getColorSteps()
+                    && getColorStops() == rCandidate.getColorStops()
                     && getSteps() == rCandidate.getSteps());
             }
         };
@@ -126,10 +126,10 @@ namespace drawinglayer::attribute
             double fOffsetX,
             double fOffsetY,
             double fAngle,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             sal_uInt16 nSteps)
         :   mpFillGradientAttribute(ImpFillGradientAttribute(
-                eStyle, fBorder, fOffsetX, fOffsetY, fAngle, rColorSteps, 
nSteps))
+                eStyle, fBorder, fOffsetX, fOffsetY, fAngle, rColorStops, 
nSteps))
         {
         }
 
@@ -167,9 +167,9 @@ namespace drawinglayer::attribute
             return rCandidate.mpFillGradientAttribute == 
mpFillGradientAttribute;
         }
 
-        const basegfx::ColorSteps& FillGradientAttribute::getColorSteps() const
+        const basegfx::ColorStops& FillGradientAttribute::getColorStops() const
         {
-            return mpFillGradientAttribute->getColorSteps();
+            return mpFillGradientAttribute->getColorStops();
         }
 
         double FillGradientAttribute::getBorder() const
diff --git a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx 
b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
index a92a5f9e0d8d..c1246f1cce36 100644
--- a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
@@ -45,7 +45,7 @@ namespace drawinglayer::primitive2d
                         getDefinitionRange(),
                         getOutputRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getAngle());
                     aGradient.appendTransformationsAndColors(rEntries, 
rOuterColor);
@@ -57,7 +57,7 @@ namespace drawinglayer::primitive2d
                         getDefinitionRange(),
                         getOutputRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getAngle());
                     aGradient.appendTransformationsAndColors(rEntries, 
rOuterColor);
@@ -68,7 +68,7 @@ namespace drawinglayer::primitive2d
                     texture::GeoTexSvxGradientRadial aGradient(
                         getDefinitionRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getOffsetX(),
                         getFillGradient().getOffsetY());
@@ -80,7 +80,7 @@ namespace drawinglayer::primitive2d
                     texture::GeoTexSvxGradientElliptical aGradient(
                         getDefinitionRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getOffsetX(),
                         getFillGradient().getOffsetY(),
@@ -93,7 +93,7 @@ namespace drawinglayer::primitive2d
                     texture::GeoTexSvxGradientSquare aGradient(
                         getDefinitionRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getOffsetX(),
                         getFillGradient().getOffsetY(),
@@ -106,7 +106,7 @@ namespace drawinglayer::primitive2d
                     texture::GeoTexSvxGradientRect aGradient(
                         getDefinitionRange(),
                         getFillGradient().getSteps(),
-                        getFillGradient().getColorSteps(),
+                        getFillGradient().getColorStops(),
                         getFillGradient().getBorder(),
                         getFillGradient().getOffsetX(),
                         getFillGradient().getOffsetY(),
diff --git a/drawinglayer/source/primitive3d/textureprimitive3d.cxx 
b/drawinglayer/source/primitive3d/textureprimitive3d.cxx
index ae89ebbe2ddc..977670446c8a 100644
--- a/drawinglayer/source/primitive3d/textureprimitive3d.cxx
+++ b/drawinglayer/source/primitive3d/textureprimitive3d.cxx
@@ -94,12 +94,12 @@ namespace drawinglayer::primitive3d
                 // create TransparenceTexturePrimitive3D with fixed 
transparence as replacement
                 const basegfx::BColor aGray(getTransparence(), 
getTransparence(), getTransparence());
 
-                // create ColorSteps with StartColor == EndColor == aGray
-                const basegfx::ColorSteps aColorSteps {
-                    basegfx::ColorStep(0.0, aGray),
-                    basegfx::ColorStep(1.0, aGray) };
+                // create ColorStops with StartColor == EndColor == aGray
+                const basegfx::ColorStops aColorStops {
+                    basegfx::ColorStop(0.0, aGray),
+                    basegfx::ColorStop(1.0, aGray) };
 
-                const attribute::FillGradientAttribute 
aFillGradient(attribute::GradientStyle::Linear, 0.0, 0.0, 0.0, 0.0, 
aColorSteps);
+                const attribute::FillGradientAttribute 
aFillGradient(attribute::GradientStyle::Linear, 0.0, 0.0, 0.0, 0.0, 
aColorStops);
                 const Primitive3DReference xRef(new 
TransparenceTexturePrimitive3D(aFillGradient, getChildren(), getTextureSize()));
                 return { xRef };
             }
diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index c2c3ad698b40..d75b67716de8 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -259,8 +259,8 @@ void 
VclMetafileProcessor2D::impConvertFillGradientAttributeToVCLGradient(
     Gradient& o_rVCLGradient, const attribute::FillGradientAttribute& rFiGrAtt,
     bool bIsTransparenceGradient) const
 {
-    const basegfx::BColor 
aStartColor(rFiGrAtt.getColorSteps().front().getColor());
-    const basegfx::BColor 
aEndColor(rFiGrAtt.getColorSteps().back().getColor());
+    const basegfx::BColor 
aStartColor(rFiGrAtt.getColorStops().front().getStopColor());
+    const basegfx::BColor 
aEndColor(rFiGrAtt.getColorStops().back().getStopColor());
 
     if (bIsTransparenceGradient)
     {
@@ -2006,9 +2006,9 @@ void 
VclMetafileProcessor2D::processPolyPolygonGradientPrimitive2D(
         return;
     }
 
-    if (!rGradientCandidate.getFillGradient().getColorSteps().empty())
+    if (!rGradientCandidate.getFillGradient().getColorStops().empty())
     {
-        // MCGR: if we have COlorSteps, do not try to fallback to old 
VCL-Gradient,
+        // MCGR: if we have ColorStops, do not try to fallback to old 
VCL-Gradient,
         // that will *not* be capable of representing this properly. Use the
         // correct decomposition instead
         process(rGradientCandidate);
diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
index 7efb80db2dfb..1b85cf9d519f 100644
--- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
@@ -500,9 +500,9 @@ void 
VclPixelProcessor2D::processPolyPolygonGradientPrimitive2D(
     // direct draw of gradient
     const attribute::FillGradientAttribute& 
rGradient(rPolygonCandidate.getFillGradient());
     basegfx::BColor aStartColor(
-        
maBColorModifierStack.getModifiedColor(rGradient.getColorSteps().front().getColor()));
+        
maBColorModifierStack.getModifiedColor(rGradient.getColorStops().front().getStopColor()));
     basegfx::BColor aEndColor(
-        
maBColorModifierStack.getModifiedColor(rGradient.getColorSteps().back().getColor()));
+        
maBColorModifierStack.getModifiedColor(rGradient.getColorStops().back().getStopColor()));
     basegfx::B2DPolyPolygon 
aLocalPolyPolygon(rPolygonCandidate.getB2DPolyPolygon());
 
     if (!aLocalPolyPolygon.count())
@@ -938,9 +938,9 @@ void VclPixelProcessor2D::processFillGradientPrimitive2D(
 {
     const attribute::FillGradientAttribute& rFillGradient = 
rPrimitive.getFillGradient();
 
-    // MCGR: If GradientSteps are used, use decomposition since vcl is not able
+    // MCGR: If GradientStops are used, use decomposition since vcl is not able
     // to render multi-color gradients
-    if (rFillGradient.getColorSteps().size() > 2)
+    if (rFillGradient.getColorStops().size() > 2)
     {
         process(rPrimitive);
         return;
@@ -994,8 +994,8 @@ void VclPixelProcessor2D::processFillGradientPrimitive2D(
 
     GradientStyle eGradientStyle = 
convertGradientStyle(rFillGradient.getStyle());
 
-    Gradient aGradient(eGradientStyle, 
Color(rFillGradient.getColorSteps().front().getColor()),
-                       Color(rFillGradient.getColorSteps().back().getColor()));
+    Gradient aGradient(eGradientStyle, 
Color(rFillGradient.getColorStops().front().getStopColor()),
+                       
Color(rFillGradient.getColorStops().back().getStopColor()));
 
     
aGradient.SetAngle(Degree10(static_cast<int>(basegfx::rad2deg<10>(rFillGradient.getAngle()))));
     aGradient.SetBorder(rFillGradient.getBorder() * 100);
diff --git a/drawinglayer/source/processor3d/defaultprocessor3d.cxx 
b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
index caf31e9aa5dc..a2a5111bc49b 100644
--- a/drawinglayer/source/processor3d/defaultprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
@@ -72,7 +72,7 @@ namespace drawinglayer::processor3d
                                 aOutlineRange,
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getAngle());
                         break;
@@ -83,7 +83,7 @@ namespace drawinglayer::processor3d
                                 aOutlineRange,
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getAngle());
                         break;
@@ -94,7 +94,7 @@ namespace drawinglayer::processor3d
                             std::make_shared<texture::GeoTexSvxGradientRadial>(
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getOffsetX(),
                                 rFillGradient.getOffsetY());
@@ -106,7 +106,7 @@ namespace drawinglayer::processor3d
                             
std::make_shared<texture::GeoTexSvxGradientElliptical>(
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getOffsetX(),
                                 rFillGradient.getOffsetY(),
@@ -119,7 +119,7 @@ namespace drawinglayer::processor3d
                             std::make_shared<texture::GeoTexSvxGradientSquare>(
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getOffsetX(),
                                 rFillGradient.getOffsetY(),
@@ -132,7 +132,7 @@ namespace drawinglayer::processor3d
                             std::make_shared<texture::GeoTexSvxGradientRect>(
                                 aOutlineRange,
                                 rFillGradient.getSteps(),
-                                rFillGradient.getColorSteps(),
+                                rFillGradient.getColorStops(),
                                 rFillGradient.getBorder(),
                                 rFillGradient.getOffsetX(),
                                 rFillGradient.getOffsetY(),
@@ -146,7 +146,7 @@ namespace drawinglayer::processor3d
             else
             {
                 // only one color, so no real gradient -> use simple texture
-                const basegfx::BColor 
aStart(rFillGradient.getColorSteps().front().getColor());
+                const basegfx::BColor 
aStart(rFillGradient.getColorStops().front().getStopColor());
                 pNewTex = std::make_shared<texture::GeoTexSvxMono>(aStart, 1.0 
- aStart.luminance());
                 mbSimpleTextureActive = true;
             }
diff --git a/drawinglayer/source/texture/texture.cxx 
b/drawinglayer/source/texture/texture.cxx
index 375e83f9221c..5cd708243143 100644
--- a/drawinglayer/source/texture/texture.cxx
+++ b/drawinglayer/source/texture/texture.cxx
@@ -72,11 +72,11 @@ namespace drawinglayer::texture
         GeoTexSvxGradient::GeoTexSvxGradient(
             const basegfx::B2DRange& rDefinitionRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder)
         : maDefinitionRange(rDefinitionRange)
         , mnRequestedSteps(nRequestedSteps)
-        , mnColorSteps(rColorSteps)
+        , mnColorStops(rColorStops)
         , mfBorder(fBorder)
         {
         }
@@ -93,7 +93,7 @@ namespace drawinglayer::texture
                 && maGradientInfo == pCompare->maGradientInfo
                 && maDefinitionRange == pCompare->maDefinitionRange
                 && mnRequestedSteps == pCompare->mnRequestedSteps
-                && mnColorSteps == pCompare->mnColorSteps
+                && mnColorStops == pCompare->mnColorStops
                 && mfBorder == pCompare->mfBorder);
         }
 
@@ -101,10 +101,10 @@ namespace drawinglayer::texture
             const basegfx::B2DRange& rDefinitionRange,
             const basegfx::B2DRange& rOutputRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fAngle)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         , mfUnitMinX(0.0)
         , mfUnitWidth(1.0)
         , mfUnitMaxY(1.0)
@@ -135,14 +135,14 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
-            rOuterColor = mnColorSteps.front().getColor();
+            rOuterColor = mnColorStops.front().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
             // prepare unit range transform
@@ -156,19 +156,19 @@ namespace drawinglayer::texture
             aPattern.scale(mfUnitWidth, 1.0);
             aPattern.translate(mfUnitMinX, 0.0);
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
-            for (auto cs_l(mnColorSteps.begin()), cs_r(cs_l + 1); cs_r != 
mnColorSteps.end(); cs_l++, cs_r++)
+            // outer loop over ColorStops, each is from cs_l to cs_r
+            for (auto cs_l(mnColorStops.begin()), cs_r(cs_l + 1); cs_r != 
mnColorStops.end(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
                 // nSteps is >= 1, see getRequestedSteps, so no check needed 
here
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // for the 1st color range we do not need to create the 1st 
step
@@ -177,7 +177,7 @@ namespace drawinglayer::texture
                 // colored using rOuterColor.
                 // We *need* to create this though for all 'inner' color ranges
                 // to get a correct start
-                const sal_uInt32 nStartInnerLoop(cs_l == mnColorSteps.begin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_l == mnColorStops.begin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -211,29 +211,29 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientLinear::modifyBColor(const basegfx::B2DPoint& 
rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
-                rBColor = mnColorSteps.front().getColor();
+                rBColor = mnColorStops.front().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double fScaler(basegfx::utils::getLinearGradientAlpha(rUV, 
maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
         GeoTexSvxGradientAxial::GeoTexSvxGradientAxial(
             const basegfx::B2DRange& rDefinitionRange,
             const basegfx::B2DRange& rOutputRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fAngle)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         , mfUnitMinX(0.0)
         , mfUnitWidth(1.0)
         {
@@ -262,15 +262,15 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
             // CAUTION: for GradientAxial the color range is inverted (!)
-            rOuterColor = mnColorSteps.back().getColor();
+            rOuterColor = mnColorStops.back().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
             // prepare unit range transform
@@ -284,25 +284,25 @@ namespace drawinglayer::texture
             aPattern.scale(mfUnitWidth, 1.0);
             aPattern.translate(mfUnitMinX, 0.0);
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
+            // outer loop over ColorStops, each is from cs_l to cs_r
             // CAUTION: for GradientAxial the color range is used inverted (!)
             //          thus, to loop backward, use rbegin/rend
-            for (auto cs_r(mnColorSteps.rbegin()), cs_l(cs_r + 1); cs_l != 
mnColorSteps.rend(); cs_l++, cs_r++)
+            for (auto cs_r(mnColorStops.rbegin()), cs_l(cs_r + 1); cs_l != 
mnColorStops.rend(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
                 // nSteps is >= 1, see getRequestedSteps, so no check needed 
here
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // for the 1st color range we do not need to create the 1st 
step, see above
-                const sal_uInt32 nStartInnerLoop(cs_r == mnColorSteps.rbegin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_r == mnColorStops.rbegin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -326,31 +326,31 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientAxial::modifyBColor(const basegfx::B2DPoint& 
rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
                 // CAUTION: for GradientAxial the color range is used inverted 
(!)
-                rBColor = mnColorSteps.back().getColor();
+                rBColor = mnColorStops.back().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double fScaler(basegfx::utils::getAxialGradientAlpha(rUV, 
maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
 
         GeoTexSvxGradientRadial::GeoTexSvxGradientRadial(
             const basegfx::B2DRange& rDefinitionRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fOffsetX,
             double fOffsetY)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         {
             maGradientInfo = basegfx::utils::createRadialODFGradientInfo(
                 rDefinitionRange,
@@ -368,32 +368,32 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
-            rOuterColor = mnColorSteps.front().getColor();
+            rOuterColor = mnColorStops.front().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
-            for (auto cs_l(mnColorSteps.begin()), cs_r(cs_l + 1); cs_r != 
mnColorSteps.end(); cs_l++, cs_r++)
+            // outer loop over ColorStops, each is from cs_l to cs_r
+            for (auto cs_l(mnColorStops.begin()), cs_r(cs_l + 1); cs_r != 
mnColorStops.end(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // get correct start for inner loop (see above)
-                const sal_uInt32 nStartInnerLoop(cs_l == mnColorSteps.begin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_l == mnColorStops.begin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -413,31 +413,31 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientRadial::modifyBColor(const basegfx::B2DPoint& 
rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
-                rBColor = mnColorSteps.front().getColor();
+                rBColor = mnColorStops.front().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double fScaler(basegfx::utils::getRadialGradientAlpha(rUV, 
maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
 
         GeoTexSvxGradientElliptical::GeoTexSvxGradientElliptical(
             const basegfx::B2DRange& rDefinitionRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fOffsetX,
             double fOffsetY,
             double fAngle)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         {
             maGradientInfo = basegfx::utils::createEllipticalODFGradientInfo(
                 rDefinitionRange,
@@ -456,36 +456,36 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
-            rOuterColor = mnColorSteps.front().getColor();
+            rOuterColor = mnColorStops.front().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
             // prepare vars dependent on aspect ratio
             const double fAR(maGradientInfo.getAspectRatio());
             const bool bMTO(fAR > 1.0);
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
-            for (auto cs_l(mnColorSteps.begin()), cs_r(cs_l + 1); cs_r != 
mnColorSteps.end(); cs_l++, cs_r++)
+            // outer loop over ColorStops, each is from cs_l to cs_r
+            for (auto cs_l(mnColorStops.begin()), cs_r(cs_l + 1); cs_r != 
mnColorStops.end(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // get correct start for inner loop (see above)
-                const sal_uInt32 nStartInnerLoop(cs_l == mnColorSteps.begin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_l == mnColorStops.begin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -508,31 +508,31 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientElliptical::modifyBColor(const 
basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
-                rBColor = mnColorSteps.front().getColor();
+                rBColor = mnColorStops.front().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double 
fScaler(basegfx::utils::getEllipticalGradientAlpha(rUV, maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
 
         GeoTexSvxGradientSquare::GeoTexSvxGradientSquare(
             const basegfx::B2DRange& rDefinitionRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fOffsetX,
             double fOffsetY,
             double fAngle)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         {
             maGradientInfo = basegfx::utils::createSquareODFGradientInfo(
                 rDefinitionRange,
@@ -551,32 +551,32 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
-            rOuterColor = mnColorSteps.front().getColor();
+            rOuterColor = mnColorStops.front().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
-            for (auto cs_l(mnColorSteps.begin()), cs_r(cs_l + 1); cs_r != 
mnColorSteps.end(); cs_l++, cs_r++)
+            // outer loop over ColorStops, each is from cs_l to cs_r
+            for (auto cs_l(mnColorStops.begin()), cs_r(cs_l + 1); cs_r != 
mnColorStops.end(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // get correct start for inner loop (see above)
-                const sal_uInt32 nStartInnerLoop(cs_l == mnColorSteps.begin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_l == mnColorStops.begin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -596,31 +596,31 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientSquare::modifyBColor(const basegfx::B2DPoint& 
rUV, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
-                rBColor = mnColorSteps.front().getColor();
+                rBColor = mnColorStops.front().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double fScaler(basegfx::utils::getSquareGradientAlpha(rUV, 
maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
 
         GeoTexSvxGradientRect::GeoTexSvxGradientRect(
             const basegfx::B2DRange& rDefinitionRange,
             sal_uInt32 nRequestedSteps,
-            const basegfx::ColorSteps& rColorSteps,
+            const basegfx::ColorStops& rColorStops,
             double fBorder,
             double fOffsetX,
             double fOffsetY,
             double fAngle)
-        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorSteps, 
fBorder)
+        : GeoTexSvxGradient(rDefinitionRange, nRequestedSteps, rColorStops, 
fBorder)
         {
             maGradientInfo = basegfx::utils::createRectangularODFGradientInfo(
                 rDefinitionRange,
@@ -639,36 +639,36 @@ namespace drawinglayer::texture
             basegfx::BColor& rOuterColor)
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // fill in return parameter rOuterColor before returning
-            rOuterColor = mnColorSteps.front().getColor();
+            rOuterColor = mnColorStops.front().getStopColor();
 
             // only one color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
                 return;
 
             // prepare vars dependent on aspect ratio
             const double fAR(maGradientInfo.getAspectRatio());
             const bool bMTO(fAR > 1.0);
 
-            // outer loop over ColorSteps, each is from cs_l to cs_r
-            for (auto cs_l(mnColorSteps.begin()), cs_r(cs_l + 1); cs_r != 
mnColorSteps.end(); cs_l++, cs_r++)
+            // outer loop over ColorStops, each is from cs_l to cs_r
+            for (auto cs_l(mnColorStops.begin()), cs_r(cs_l + 1); cs_r != 
mnColorStops.end(); cs_l++, cs_r++)
             {
                 // get colors & calculate steps
-                const basegfx::BColor aCStart(cs_l->getColor());
-                const basegfx::BColor aCEnd(cs_r->getColor());
+                const basegfx::BColor aCStart(cs_l->getStopColor());
+                const basegfx::BColor aCEnd(cs_r->getStopColor());
                 const sal_uInt32 nSteps(basegfx::utils::calculateNumberOfSteps(
                     maGradientInfo.getRequestedSteps(), aCStart, aCEnd));
 
                 // get offsets & calculate StripeWidth
-                const double fOffsetStart(cs_l->getOffset());
-                const double fOffsetEnd(cs_r->getOffset());
+                const double fOffsetStart(cs_l->getStopOffset());
+                const double fOffsetEnd(cs_r->getStopOffset());
                 const double fStripeWidth((fOffsetEnd - fOffsetStart) / 
nSteps);
 
                 // get correct start for inner loop (see above)
-                const sal_uInt32 nStartInnerLoop(cs_l == mnColorSteps.begin() 
? 1 : 0);
+                const sal_uInt32 nStartInnerLoop(cs_l == mnColorStops.begin() 
? 1 : 0);
 
                 for (sal_uInt32 innerLoop(nStartInnerLoop); innerLoop < 
nSteps; innerLoop++)
                 {
@@ -691,19 +691,19 @@ namespace drawinglayer::texture
         void GeoTexSvxGradientRect::modifyBColor(const basegfx::B2DPoint& rUV, 
basegfx::BColor& rBColor, double& /*rfOpacity*/) const
         {
             // no color at all, done
-            if (mnColorSteps.empty())
+            if (mnColorStops.empty())
                 return;
 
             // just single color, done
-            if (mnColorSteps.size() < 2)
+            if (mnColorStops.size() < 2)
             {
-                rBColor = mnColorSteps.front().getColor();
+                rBColor = mnColorStops.front().getStopColor();
                 return;
             }
 
             // texture-back-transform X/Y -> t [0.0..1.0] and determine color
             const double 
fScaler(basegfx::utils::getRectangularGradientAlpha(rUV, maGradientInfo));
-            rBColor = basegfx::utils::modifyBColor(mnColorSteps, fScaler, 
mnRequestedSteps);
+            rBColor = basegfx::utils::modifyBColor(mnColorStops, fScaler, 
mnRequestedSteps);
         }
 
 
diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx 
b/drawinglayer/source/tools/primitive2dxmldump.cxx
index 55d2c6a8e29a..31c88c6482ed 100644
--- a/drawinglayer/source/tools/primitive2dxmldump.cxx
+++ b/drawinglayer/source/tools/primitive2dxmldump.cxx
@@ -301,18 +301,19 @@ void writeSdrFillAttribute(::tools::XmlWriter& rWriter,
         rWriter.attribute("angle", rGradient.getAngle());
         rWriter.attribute("steps", rGradient.getSteps());
 
-        auto const& rColorSteps(rGradient.getColorSteps());
-        for (size_t a(0); a < rColorSteps.size(); a++)
+        auto const& rColorStops(rGradient.getColorStops());
+        for (size_t a(0); a < rColorStops.size(); a++)
         {
             if (0 == a)
-                rWriter.attribute("startColor", 
convertColorToString(rColorSteps[a].getColor()));
-            else if (rColorSteps.size() == a + 1)
-                rWriter.attribute("endColor", 
convertColorToString(rColorSteps[a].getColor()));
+                rWriter.attribute("startColor",
+                                  
convertColorToString(rColorStops[a].getStopColor()));
+            else if (rColorStops.size() == a + 1)
+                rWriter.attribute("endColor", 
convertColorToString(rColorStops[a].getStopColor()));
             else
             {
-                rWriter.startElement("colorStep");
-                rWriter.attribute("offset", rColorSteps[a].getOffset());
-                rWriter.attribute("color", 
convertColorToString(rColorSteps[a].getColor()));
+                rWriter.startElement("colorStop");
+                rWriter.attribute("stopOffset", 
rColorStops[a].getStopOffset());
+                rWriter.attribute("stopColor", 
convertColorToString(rColorStops[a].getStopColor()));
                 rWriter.endElement();
             }
         }
diff --git a/drawinglayer/source/tools/wmfemfhelper.cxx 
b/drawinglayer/source/tools/wmfemfhelper.cxx
index 27e6a6c94e24..e6eb401833c7 100644
--- a/drawinglayer/source/tools/wmfemfhelper.cxx
+++ b/drawinglayer/source/tools/wmfemfhelper.cxx
@@ -711,17 +711,13 @@ namespace wmfemfhelper
             }
         }
 
-        const basegfx::ColorSteps aColorSteps {
-            basegfx::ColorStep(0.0, aStart),
-            basegfx::ColorStep(1.0, aEnd) };
-
         return drawinglayer::attribute::FillGradientAttribute(
             aGradientStyle,
             static_cast<double>(rGradient.GetBorder()) * 0.01,
             static_cast<double>(rGradient.GetOfsX()) * 0.01,
             static_cast<double>(rGradient.GetOfsY()) * 0.01,
             toRadians(rGradient.GetAngle()),
-            aColorSteps,
+            basegfx::utils::createColorStopsFromStartEndColor(aStart, aEnd),
             rGradient.GetSteps());
     }
 
@@ -926,7 +922,7 @@ namespace wmfemfhelper
         if(aAttribute.hasSingleColor())
         {
             // not really a gradient. Create filled rectangle
-            return CreateColorWallpaper(rRange, 
aAttribute.getColorSteps().front().getColor(), rPropertyHolder);
+            return CreateColorWallpaper(rRange, 
aAttribute.getColorStops().front().getStopColor(), rPropertyHolder);
         }
         else
         {
@@ -2809,7 +2805,7 @@ namespace wmfemfhelper
                                     rTargetHolders.Current().append(
                                         new 
drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
                                             std::move(xSubContent),
-                                            
aAttribute.getColorSteps().front().getColor().luminance()));
+                                            
aAttribute.getColorStops().front().getStopColor().luminance()));
                                 }
                                 else
                                 {
@@ -2929,7 +2925,7 @@ namespace wmfemfhelper
                                     rTargetHolders.Current().append(
                                         new 
drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
                                             std::move(aPolyPolygon),
-                                            
aAttribute.getColorSteps().front().getColor()));
+                                            
aAttribute.getColorStops().front().getStopColor()));
                                 }
                                 else
                                 {
diff --git a/filter/source/msfilter/msdffimp.cxx 
b/filter/source/msfilter/msdffimp.cxx
index 144d64035b8d..53818a550bec 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -2924,7 +2924,9 @@ void DffPropertyReader::ImportGradientColor( SfxItemSet& 
aSet, sal_uInt32 eMSO_F
     }
 
     //Construct gradient item
-    XGradient aGrad( aCol2, aCol1, eGrad, nAngle, nFocusX, nFocusY );
+    XGradient aGrad(
+        basegfx::utils::createColorStopsFromStartEndColor(aCol2.getBColor(), 
aCol1.getBColor()),
+        eGrad, nAngle, nFocusX, nFocusY );
     //Intensity has been merged into color. So here just set is as 100
     aGrad.SetStartIntens( 100 );
     aGrad.SetEndIntens( 100 );
@@ -2937,7 +2939,9 @@ void DffPropertyReader::ImportGradientColor( SfxItemSet& 
aSet, sal_uInt32 eMSO_F
         aCol1 = Color(nStartCol, nStartCol, nStartCol);
         aCol2 = Color(nEndCol, nEndCol, nEndCol);
 
-        XGradient aGrad2( aCol2 ,  aCol1 , eGrad, nAngle, nFocusX, nFocusY );
+        XGradient aGrad2(
+            
basegfx::utils::createColorStopsFromStartEndColor(aCol2.getBColor(), 
aCol1.getBColor()),
+            eGrad, nAngle, nFocusX, nFocusY );
         aSet.Put( XFillFloatTransparenceItem( OUString(), aGrad2 ) );
     }
 }
diff --git a/filter/source/msfilter/svdfppt.cxx 
b/filter/source/msfilter/svdfppt.cxx
index faded37d12e2..013ff44ce528 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -5747,7 +5747,7 @@ void PPTPortionObj::ApplyTo(  SfxItemSet& rSet, 
SdrPowerPointImport& rManager, T
                                 {
                                     const XFillGradientItem* pGradientItem = 
pItemSet->GetItemIfSet( XATTR_FILLGRADIENT, false );
                                     if ( pGradientItem )
-                                        aDefColor = 
pGradientItem->GetGradientValue().GetStartColor();
+                                        aDefColor = 
Color(pGradientItem->GetGradientValue().GetColorStops().front().getStopColor());
                                 }
                                 break;
                                 case drawing::FillStyle_HATCH :
@@ -7399,8 +7399,8 @@ static void ApplyCellAttributes( const SdrObject* pObj, 
Reference< XCell > const
 
                     css::awt::Gradient aGradient;
                     aGradient.Style = aXGradient.GetGradientStyle();
-                    aGradient.StartColor = 
static_cast<sal_Int32>(aXGradient.GetStartColor());
-                    aGradient.EndColor = 
static_cast<sal_Int32>(aXGradient.GetEndColor());
+                    aGradient.StartColor = 
static_cast<sal_Int32>(Color(aXGradient.GetColorStops().front().getStopColor()));
+                    aGradient.EndColor = 
static_cast<sal_Int32>(Color(aXGradient.GetColorStops().back().getStopColor()));
                     aGradient.Angle = 
static_cast<short>(aXGradient.GetAngle());
                     aGradient.Border = aXGradient.GetBorder();
                     aGradient.XOffset = aXGradient.GetXOffset();
diff --git a/include/basegfx/utils/gradienttools.hxx 
b/include/basegfx/utils/gradienttools.hxx
index 4e42efaf86a3..85802749478c 100644
--- a/include/basegfx/utils/gradienttools.hxx
+++ b/include/basegfx/utils/gradienttools.hxx
@@ -27,12 +27,14 @@
 #include <utility>
 #include <basegfx/basegfxdllapi.h>
 #include <vector>
+#include <com/sun/star/awt/ColorStopSequence.hdl>
 
+namespace com { namespace sun { namespace star { namespace uno { class Any; } 
} } }
 namespace basegfx { class B2DRange; }
 
 namespace basegfx
 {
-    /* MCGR: Provide ColorStep definition
+    /* MCGR: Provide ColorStop definition
 
         This is the needed combination of offset and color:
 
@@ -52,59 +54,60 @@ namespace basegfx
         Color is defined as:
         - RGB with unit values [0.0 .. 1.0]
 
-        These definitions are packed in a std::vector<ColorStep> ColorSteps,
+        These definitions are packed in a std::vector<ColorStop> ColorStops,
         see typedef below.
     */
-    class UNLESS_MERGELIBS(BASEGFX_DLLPUBLIC) ColorStep
+    class UNLESS_MERGELIBS(BASEGFX_DLLPUBLIC) ColorStop
     {
     private:
-        // offset in the range of [0.0 .. 1.0], checked & force by constructor
-        double mfOffset;
+        // offset in the range of [0.0 .. 1.0]
+        double mfStopOffset;
 
-        // color of ColorStep entry
-        BColor maColor;
+        // RGB color of ColorStop entry
+        BColor maStopColor;
 
     public:
         // constructor - defaults are needed to have a default constructor
-        // e.g. for usage in std::vector::insert
-        // ensure [0.0 .. 1.0] range for mfOffset
-        ColorStep(double fOffset = 0.0, const BColor& rColor = BColor())
-            : mfOffset(fOffset)
-            , maColor(rColor)
+        // e.g. for usage in std::vector::insert (even when only reducing)
+        // ensure [0.0 .. 1.0] range for mfStopOffset
+        ColorStop(double fStopOffset = 0.0, const BColor& rStopColor = 
BColor())
+            : mfStopOffset(fStopOffset)
+            , maStopColor(rStopColor)
         {
-            // NOTE: I originally *corrected* mfOffset here by using
-            //   mfOffset(std::max(0.0, std::min(fOffset, 1.0)))
+            // NOTE: I originally *corrected* mfStopOffset here by using
+            //   mfStopOffset(std::max(0.0, std::min(fOffset, 1.0)))
             // While that is formally correct, it moves an invalid
             // entry to 0.0 or 1.0, thus creating additional wrong
             // Start/EndColor entries. That may then 'overlay' the
             // correct entry when corrections are applied to the
-            // vector of entries (see sortAndCorrectColorSteps)
+            // vector of entries (see sortAndCorrectColorStops)
             // which leads to getting the wanted Start/EndColor
             // to be factically deleted, what is an error.
         }
 
-        double getOffset() const { return mfOffset; }
-        const BColor& getColor() const { return maColor; }
+        double getStopOffset() const { return mfStopOffset; }
+        const BColor& getStopColor() const { return maStopColor; }
 
-        bool operator<(const ColorStep& rCandidate) const
+        // needed for std::sort
+        bool operator<(const ColorStop& rCandidate) const
         {
-            return getOffset() < rCandidate.getOffset();
+            return getStopOffset() < rCandidate.getStopOffset();
         }
 
-        bool operator==(const ColorStep& rCandidate) const
+        bool operator==(const ColorStop& rCandidate) const
         {
-            return getOffset() == rCandidate.getOffset() && getColor() == 
rCandidate.getColor();
+            return getStopOffset() == rCandidate.getStopOffset() && 
getStopColor() == rCandidate.getStopColor();
         }
     };
 
-    /* MCGR: Provide ColorSteps definition to the FillGradientAttribute
+    /* MCGR: Provide ColorStops definition to the FillGradientAttribute
 
         This array should be sorted ascending by offsets, from lowest to
         highest. Since all the primitive data definition where it is used
         is read-only, this can/will be guaranteed by forcing/checking this
         in the constructor, see ::FillGradientAttribute
     */
-    typedef std::vector<ColorStep> ColorSteps;
+    typedef std::vector<ColorStop> ColorStops;
 
     /** Gradient definition as used in ODF 1.2
 
@@ -193,33 +196,78 @@ namespace basegfx
 
     namespace utils
     {
-        /* Helper to sort and correct ColorSteps. This will
-           sort and then correct the given ColorSteps. The
-           corrected version will
-           - be sorted
-           - have no double values
-           - have no values with offset < 0.0
-           - have no values with offset > 1.0
-           thus be ready to be used in multi-color gradients.
-
-           NOTE: The returned version may be empty (!) if no
-                 valid entries were contained
-           NOTE: It does not necessarily contain values for
-                 offset == 0.0 and 1.0 if there were none
-                 given (so no Start/EndColor)
-           NOTE: If it contains only one entry that entry is
-                 set to StartColor and the Color is preserved.
-                 This is also done when all Colors are the same
+        /* Tooling method to convert UNO API data to ColorStops.
+           This will try to extract ColorStop data from the given
+           Any, so if it's of type awt::Gradient2 that data will be
+           extracted, converted and copied into the given ColorStops.
         */
-        BASEGFX_DLLPUBLIC void sortAndCorrectColorSteps(ColorSteps& 
rColorSteps);
+        BASEGFX_DLLPUBLIC void fillColorStopsFromAny(ColorStops& rColorStops, 
const css::uno::Any& rVal);
 
-        /* Helper to grep the correct ColorStep out of
-           ColorSteps and interpolate as needed for given
+        /* Tooling method to fill a awt::ColorStopSequence with
+           the data from the given ColorStops. This is used in
+           UNO API implementations.
+        */
+        BASEGFX_DLLPUBLIC void 
fillColorStopSequenceFromColorStops(css::awt::ColorStopSequence& 
rColorStopSequence, const ColorStops& rColorStops);
+
+        /* Tooling method that allows to replace the StartColor in a
+           vector of ColorStops. A vector in 'ordered state' is expected,
+           so you may use/have used sortAndCorrectColorStops, see below.
+           This method is for convenience & backwards compatibility, please
+           think about handling multi-colored gradients directly.
+        */
+        BASEGFX_DLLPUBLIC void replaceStartColor(ColorStops& rColorStops, 
const BColor& rStart);
+
+        /* Tooling method that allows to replace the EndColor in a
+           vector of ColorStops. A vector in 'ordered state' is expected,
+           so you may use/have used sortAndCorrectColorStops, see below.
+           This method is for convenience & backwards compatibility, please
+           think about handling multi-colored gradients directly.
+        */
+        BASEGFX_DLLPUBLIC void replaceEndColor(ColorStops& rColorStops, const 
BColor& rEnd);
+
+        // Tooling method to quickly create a ColorStop vector for a given set 
of Start/EndColor
+        BASEGFX_DLLPUBLIC ColorStops createColorStopsFromStartEndColor(const 
BColor& rStart, const BColor& rEnd);
+
+        /* Tooling method to guarantee sort and correctness for
+           the given ColorStops vector.
+           A vector fulfilling these conditions is called to be
+           in 'ordered state'.
+
+           At return, the following conditions are guaranteed:
+           - contains no ColorStops with offset < 0.0 (will
+             be removed)
+           - contains no ColorStops with offset > 1.0 (will
+             be removed)
+           - contains no two ColorStops with identical offsets
+             (will be removed, 1st one/smallest offset wins
+             which is also given by sort tooling)
+           - will be sorted from lowest offset to highest
+           - if all colors are the same, the content will
+             be reduced to a single entry with offset 0.0
+             (force to StartColor)
+
+           Some more notes:
+           - It can happen that the result is empty
+           - It is allowed to have consecutive entries with
+             the same color, this represents single-color
+             regions inside the gradient
+           - A entry with 0.0 is not required or forced, so
+             no 'StartColor' is technically required
+           - A entry with 1.0 is not required or forced, so
+             no 'EndColor' is technically required
+
+           All this is done in one run (sort + O(N)) without
+           creating a copy of the data in any form
+        */
+        BASEGFX_DLLPUBLIC void sortAndCorrectColorStops(ColorStops& 
rColorStops);
+
+        /* Helper to grep the correct ColorStop out of
+           ColorStops and interpolate as needed for given
            relative value in fScaler in the range of [0.0 .. 1.0].
            It also takes care of evtl. given RequestedSteps.
         */
         BASEGFX_DLLPUBLIC BColor modifyBColor(
-            const ColorSteps& rColorSteps,
+            const ColorStops& rColorStops,
             double fScaler,
             sal_uInt32 nRequestedSteps);
 
diff --git a/include/drawinglayer/attribute/fillgradientattribute.hxx 
b/include/drawinglayer/attribute/fillgradientattribute.hxx
index 3a62ee41e43c..8a2df4d6baaf 100644
--- a/include/drawinglayer/attribute/fillgradientattribute.hxx
+++ b/include/drawinglayer/attribute/fillgradientattribute.hxx
@@ -25,9 +25,9 @@
 
 namespace basegfx
 {
-class ColorStep;
+class ColorStop;
 class BColor;
-typedef std::vector<ColorStep> ColorSteps;
+typedef std::vector<ColorStop> ColorStops;
 }
 
 namespace drawinglayer::attribute
@@ -56,17 +56,17 @@ public:
     /* MCGR: Adaptions for MultiColorGradients
 
        Direct Start/EndCOlor is no longer required, instead the
-       full color gradient is handed over as ColorSteps vector.
+       full color gradient is handed over as ColorStops vector.
        To add the former Start/EndColor in a compatible way, just
-       prepare an instance of basegfx::ColorSteps with the
+       prepare an instance of basegfx::ColorStops with the
        StartColor at 0.0 and the EndColor at 1.0.
 
        A rigid correction/input data will be done by the constructor,
-       including to sort the ColorSteps by offset and removing invalid
-       entries (see sortAndCorrectColorSteps)
+       including to sort the ColorStops by offset and removing invalid
+       entries (see sortAndCorrectColorStops)
 
-       To access e.g. the StartColor, use getColorSteps().front(), and
-       getColorSteps().back(), accordingly, for EndColor. The existence
+       To access e.g. the StartColor, use getColorStops().front(), and
+       getColorStops().back(), accordingly, for EndColor. The existence
        of at least one entry is guaranteed, so no need to check before
        accessing using of front()/back() calls. If only one color entry
        exists, start == end color is assumed, so not really a gradient
@@ -74,7 +74,7 @@ public:
     */
     /// constructors/assignmentoperator/destructor
     FillGradientAttribute(GradientStyle eStyle, double fBorder, double 
fOffsetX, double fOffsetY,
-                          double fAngle, const basegfx::ColorSteps& 
rColorSteps,
+                          double fAngle, const basegfx::ColorStops& 
rColorStops,
                           sal_uInt16 nSteps = 0);
     FillGradientAttribute();
     FillGradientAttribute(const FillGradientAttribute&);
@@ -98,7 +98,7 @@ public:
     double getOffsetX() const;
     double getOffsetY() const;
     double getAngle() const;
-    const basegfx::ColorSteps& getColorSteps() const;
+    const basegfx::ColorStops& getColorStops() const;
     sal_uInt16 getSteps() const;
 };
 
diff --git a/include/svx/unomid.hxx b/include/svx/unomid.hxx
index fe07fee51054..766996a57ac0 100644
--- a/include/svx/unomid.hxx
+++ b/include/svx/unomid.hxx
@@ -71,6 +71,7 @@
 #define MID_GRADIENT_STARTINTENSITY 9
 #define MID_GRADIENT_ENDINTENSITY   10
 #define MID_GRADIENT_STEPCOUNT      11
+#define MID_GRADIENT_COLORSTOPSEQUENCE 12
 
 // XFillHatchItem
 // Don't use 0 as it used for the whole struct
diff --git a/include/svx/xgrad.hxx b/include/svx/xgrad.hxx
index 553dfe23b93b..9dda79d06c7c 100644
--- a/include/svx/xgrad.hxx
+++ b/include/svx/xgrad.hxx
@@ -25,15 +25,16 @@
 #include <svx/svxdllapi.h>
 #include <com/sun/star/awt/GradientStyle.hpp>
 #include <boost/property_tree/ptree_fwd.hpp>
-#include <com/sun/star/awt/Gradient.hpp>
-
-class Gradient;
+#include <com/sun/star/awt/Gradient2.hpp>
+#include <basegfx/utils/gradienttools.hxx>
 
 class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC XGradient final
 {
     css::awt::GradientStyle  eStyle;
-    Color               aStartColor;
-    Color               aEndColor;
+
+    // MCGS: ColorStops in the range [0.0 .. 1.0], including 
StartColor/EndColor
+    basegfx::ColorStops aColorStops;
+
     Degree10            nAngle;
     sal_uInt16          nBorder;
     sal_uInt16          nOfsX;
@@ -46,7 +47,7 @@ class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC XGradient final
 
 public:
     XGradient();
-    XGradient( const Color& rStart, const Color& rEnd,
+    XGradient( const basegfx::ColorStops& rColorStops,
                css::awt::GradientStyle eStyle = 
css::awt::GradientStyle_LINEAR, Degree10 nAngle = 0_deg10,
                sal_uInt16 nXOfs = 50, sal_uInt16 nYOfs = 50, sal_uInt16 
nBorder = 0,
                sal_uInt16 nStartIntens = 100, sal_uInt16 nEndIntens = 100,
@@ -55,8 +56,7 @@ public:
     bool operator==(const XGradient& rGradient) const;
 
     void SetGradientStyle(css::awt::GradientStyle eNewStyle) { eStyle = 
eNewStyle; }
-    void SetStartColor(const Color& rColor)         { aStartColor = rColor; }
-    void SetEndColor(const Color& rColor)           { aEndColor = rColor; }
+    void SetColorStops(const basegfx::ColorStops& rSteps);
     void SetAngle(Degree10 nNewAngle)                { nAngle = nNewAngle; }
     void SetBorder(sal_uInt16 nNewBorder)               { nBorder = 
nNewBorder; }
     void SetXOffset(sal_uInt16 nNewOffset)              { nOfsX = nNewOffset; }
@@ -66,8 +66,7 @@ public:
     void SetSteps(sal_uInt16 nSteps)                    { nStepCount = nSteps; 
}
 
     css::awt::GradientStyle GetGradientStyle() const         { return eStyle; }
-    const Color&       GetStartColor() const            { return aStartColor; }
-    const Color&       GetEndColor() const              { return aEndColor; }
+    const basegfx::ColorStops& GetColorStops() const { return aColorStops; }
     Degree10           GetAngle() const                 { return nAngle; }
     sal_uInt16         GetBorder() const                { return nBorder; }
     sal_uInt16         GetXOffset() const               { return nOfsX; }
@@ -78,7 +77,7 @@ public:
 
     boost::property_tree::ptree dumpAsJSON() const;
     static XGradient fromJSON(std::u16string_view rJSON);
-    css::awt::Gradient toGradientUNO() const;
+    css::awt::Gradient2 toGradientUNO() const;
 };
 
 #endif
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 5a592600797e..bdae567ce601 100644
--- a/offapi/UnoApi_offapi.mk

... etc. - the rest is truncated

Reply via email to