summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basegfx/source/tools/gradienttools.cxx97
-rw-r--r--cui/source/inc/cuitabarea.hxx12
-rw-r--r--cui/source/tabpages/tpgradnt.cxx38
-rw-r--r--cui/source/tabpages/tptrans.cxx36
-rw-r--r--include/basegfx/utils/gradienttools.hxx5
-rw-r--r--include/oox/export/drawingml.hxx5
-rw-r--r--include/svx/sidebar/AreaPropertyPanelBase.hxx6
-rw-r--r--include/svx/sidebar/AreaTransparencyGradientPopup.hxx4
-rw-r--r--oox/source/export/chartexport.cxx6
-rw-r--r--oox/source/export/drawingml.cxx48
-rw-r--r--sd/source/ui/sidebar/SlideBackground.cxx28
-rw-r--r--sd/source/ui/sidebar/SlideBackground.hxx6
-rw-r--r--svx/source/sidebar/area/AreaPropertyPanelBase.cxx34
-rw-r--r--svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx18
-rw-r--r--svx/source/unodraw/XPropertyTable.cxx21
15 files changed, 272 insertions, 92 deletions
diff --git a/basegfx/source/tools/gradienttools.cxx b/basegfx/source/tools/gradienttools.cxx
index f9e9ad494c4e..372abe08254b 100644
--- a/basegfx/source/tools/gradienttools.cxx
+++ b/basegfx/source/tools/gradienttools.cxx
@@ -22,6 +22,7 @@
#include <basegfx/range/b2drange.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <com/sun/star/awt/Gradient2.hpp>
+#include <osl/endian.h>
#include <algorithm>
#include <cmath>
@@ -264,6 +265,80 @@ namespace basegfx
namespace utils
{
+ /* Internal helper to convert ::Color from tools::color.hxx to BColor
+ without the need to link against tools library. Be on the
+ safe side by using the same union
+ */
+ namespace {
+ struct ColorToBColorConverter
+ {
+ union {
+ sal_uInt32 mValue;
+ struct {
+#ifdef OSL_BIGENDIAN
+ sal_uInt8 T;
+ sal_uInt8 R;
+ sal_uInt8 G;
+ sal_uInt8 B;
+#else
+ sal_uInt8 B;
+ sal_uInt8 G;
+ sal_uInt8 R;
+ sal_uInt8 T;
+#endif
+ };
+ };
+
+ ColorToBColorConverter(sal_uInt32 nColor) : mValue(nColor) { T=0; }
+ BColor getBColor() const
+ {
+ return BColor(R / 255.0, G / 255.0, B / 255.0);
+ }
+ };
+ }
+
+ /// Tooling method to fill awt::Gradient2 from data contained in the given Any
+ bool fillGradient2FromAny(css::awt::Gradient2& rGradient, const css::uno::Any& rVal)
+ {
+ bool bRetval(false);
+
+ if (rVal.has< css::awt::Gradient2 >())
+ {
+ // we can use awt::Gradient2 directly
+ bRetval = (rVal >>= rGradient);
+ }
+ else if (rVal.has< css::awt::Gradient >())
+ {
+ // 1st get awt::Gradient
+ css::awt::Gradient aTmp;
+
+ if (rVal >>= aTmp)
+ {
+ // copy all awt::Gradient data to awt::Gradient2
+ rGradient.Style = aTmp.Style;
+ rGradient.StartColor = aTmp.StartColor;
+ rGradient.EndColor = aTmp.EndColor;
+ rGradient.Angle = aTmp.Angle;
+ rGradient.Border = aTmp.Border;
+ rGradient.XOffset = aTmp.XOffset;
+ rGradient.YOffset = aTmp.YOffset;
+ rGradient.StartIntensity = aTmp.StartIntensity;
+ rGradient.EndIntensity = aTmp.EndIntensity;
+ rGradient.StepCount = aTmp.StepCount;
+
+ // complete data by creating ColorStops for awt::Gradient2
+ fillColorStopSequenceFromColorStops(
+ rGradient.ColorStops,
+ ColorStops {
+ ColorStop(0.0, ColorToBColorConverter(aTmp.StartColor).getBColor()),
+ ColorStop(1.0, ColorToBColorConverter(aTmp.EndColor).getBColor()) });
+ bRetval = true;
+ }
+ }
+
+ return bRetval;
+ }
+
/* Tooling method to extract data from given awt::Gradient2
to ColorStops, doing some corrections, partially based
on given SingleColor.
@@ -314,14 +389,30 @@ namespace basegfx
if (rGradient.Border != 0)
{
// apply Border if set
- // NOTE: no new start node is added. If this is needed,
- // do that in the caller
+ // NOTE: no new start node is added. The new ColorStop
+ // mechanism does not need entries at 0.0 and 1.0.
+ // In case this is needed, do that in the caller
const double fFactor(rGradient.Border * 0.01);
ColorStops aNewStops;
for (const auto& candidate : rColorStops)
{
- aNewStops.emplace_back(candidate.getStopOffset() * fFactor, candidate.getStopColor());
+ if (css::awt::GradientStyle_AXIAL == rGradient.Style)
+ {
+ // for axial add the 'gap' at the start due to reverse used gradient
+ aNewStops.emplace_back((1.0 - fFactor) * candidate.getStopOffset(), candidate.getStopColor());
+ }
+ else
+ {
+ // css::awt::GradientStyle_LINEAR
+ // case awt::GradientStyle_RADIAL
+ // case awt::GradientStyle_ELLIPTICAL
+ // case awt::GradientStyle_RECT
+ // case awt::GradientStyle_SQUARE
+
+ // for all others add the 'gap' at the end
+ aNewStops.emplace_back(fFactor + (candidate.getStopOffset() * (1.0 - fFactor)), candidate.getStopColor());
+ }
}
rColorStops = aNewStops;
diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx
index 836470ab2286..2db104f53c8c 100644
--- a/cui/source/inc/cuitabarea.hxx
+++ b/cui/source/inc/cuitabarea.hxx
@@ -169,6 +169,9 @@ class SvxTransparenceTabPage : public SfxTabPage
std::unique_ptr<weld::CustomWeld> m_xCtlBitmapPreview;
std::unique_ptr<weld::CustomWeld> m_xCtlXRectPreview;
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops maColorStops;
+
DECL_LINK(ClickTransOffHdl_Impl, weld::Toggleable&, void);
DECL_LINK(ClickTransLinearHdl_Impl, weld::Toggleable&, void);
DECL_LINK(ClickTransGradientHdl_Impl, weld::Toggleable&, void );
@@ -184,6 +187,9 @@ class SvxTransparenceTabPage : public SfxTabPage
bool InitPreview ( const SfxItemSet& rSet );
void InvalidatePreview (bool bEnable = true );
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops createColorStops();
+
public:
SvxTransparenceTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
virtual ~SvxTransparenceTabPage() override;
@@ -361,6 +367,9 @@ private:
XFillAttrSetItem m_aXFillAttr;
SfxItemSet& m_rXFSet;
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops m_aColorStops;
+
SvxXRectPreview m_aCtlPreview;
std::unique_ptr<weld::ComboBox> m_xLbGradientType;
std::unique_ptr<weld::Label> m_xFtCenter;
@@ -400,6 +409,9 @@ private:
void SetControlState_Impl( css::awt::GradientStyle eXGS );
sal_Int32 SearchGradientList(std::u16string_view rGradientName);
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops createColorStops();
+
public:
SvxGradientTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
virtual ~SvxGradientTabPage() override;
diff --git a/cui/source/tabpages/tpgradnt.cxx b/cui/source/tabpages/tpgradnt.cxx
index dfe59e878334..57eed4dd4ce5 100644
--- a/cui/source/tabpages/tpgradnt.cxx
+++ b/cui/source/tabpages/tpgradnt.cxx
@@ -197,9 +197,7 @@ bool SvxGradientTabPage::FillItemSet( SfxItemSet* rSet )
// gradient was passed (unidentified)
{
pXGradient.reset(new XGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- m_xLbColorFrom->GetSelectEntryColor().getBColor(),
- m_xLbColorTo->GetSelectEntryColor().getBColor()),
+ createColorStops(),
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)),
@@ -297,9 +295,7 @@ void SvxGradientTabPage::ModifiedHdl_Impl( void const * pControl )
css::awt::GradientStyle eXGS = static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active());
XGradient aXGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- m_xLbColorFrom->GetSelectEntryColor().getBColor(),
- m_xLbColorTo->GetSelectEntryColor().getBColor()),
+ createColorStops(),
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)),
@@ -366,9 +362,7 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickAddHdl_Impl, weld::Button&, void)
if( !nError )
{
XGradient aXGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- m_xLbColorFrom->GetSelectEntryColor().getBColor(),
- m_xLbColorTo->GetSelectEntryColor().getBColor()),
+ createColorStops(),
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)),
@@ -408,9 +402,7 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickModifyHdl_Impl, weld::Button&, void)
OUString aName( m_pGradientList->GetGradient( static_cast<sal_uInt16>(nPos) )->GetName() );
XGradient aXGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- m_xLbColorFrom->GetSelectEntryColor().getBColor(),
- m_xLbColorTo->GetSelectEntryColor().getBColor()),
+ createColorStops(),
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)),
@@ -557,6 +549,12 @@ void SvxGradientTabPage::ChangeGradientHdl_Impl()
m_xLbColorTo->SetNoSelection();
m_xLbColorTo->SelectEntry(Color(pGradient->GetColorStops().back().getStopColor()));
+ // MCGR: preserve in-between ColorStops if given
+ if (pGradient->GetColorStops().size() > 2)
+ m_aColorStops = basegfx::ColorStops(pGradient->GetColorStops().begin() + 1, pGradient->GetColorStops().end() - 1);
+ else
+ m_aColorStops.clear();
+
m_xMtrAngle->set_value(pGradient->GetAngle().get() / 10, FieldUnit::NONE); // should be changed in resource
m_xSliderAngle->set_value(pGradient->GetAngle().get() / 10);
m_xMtrBorder->set_value(pGradient->GetBorder(), FieldUnit::NONE);
@@ -640,4 +638,20 @@ sal_Int32 SvxGradientTabPage::SearchGradientList(std::u16string_view rGradientNa
return nPos;
}
+basegfx::ColorStops SvxGradientTabPage::createColorStops()
+{
+ basegfx::ColorStops aColorStops;
+
+ aColorStops.emplace_back(0.0, m_xLbColorFrom->GetSelectEntryColor().getBColor());
+
+ if(!m_aColorStops.empty())
+ {
+ aColorStops.insert(aColorStops.begin(), m_aColorStops.begin(), m_aColorStops.end());
+ }
+
+ aColorStops.emplace_back(1.0, m_xLbColorTo->GetSelectEntryColor().getBColor());
+
+ return aColorStops;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/tabpages/tptrans.cxx b/cui/source/tabpages/tptrans.cxx
index 259446ef5f46..ef604e6470d5 100644
--- a/cui/source/tabpages/tptrans.cxx
+++ b/cui/source/tabpages/tptrans.cxx
@@ -119,12 +119,8 @@ void SvxTransparenceTabPage::ModifiedTrgrHdl_Impl(const weld::ComboBox* pControl
}
// preview
- 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(
- basegfx::utils::createColorStopsFromStartEndColor(
- Color(nStartCol, nStartCol, nStartCol).getBColor(),
- Color(nEndCol, nEndCol, nEndCol).getBColor()),
+ createColorStops(),
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)),
@@ -291,12 +287,8 @@ bool SvxTransparenceTabPage::FillItemSet(SfxItemSet* rAttrs)
|| m_xMtrTrgrStartValue->get_value_changed_from_saved()
|| m_xMtrTrgrEndValue->get_value_changed_from_saved())
{
- 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(
- basegfx::utils::createColorStopsFromStartEndColor(
- Color(nStartCol, nStartCol, nStartCol).getBColor(),
- Color(nEndCol, nEndCol, nEndCol).getBColor()),
+ createColorStops(),
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)),
@@ -375,6 +367,12 @@ void SvxTransparenceTabPage::Reset(const SfxItemSet* rAttrs)
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);
+ // MCGR: preserve in-between ColorStops if given
+ if (rGradient.GetColorStops().size() > 2)
+ maColorStops = basegfx::ColorStops(rGradient.GetColorStops().begin() + 1, rGradient.GetColorStops().end() - 1);
+ else
+ maColorStops.clear();
+
// linear transparence
sal_uInt16 nTransp = pLinearItem->GetValue();
m_xMtrTransparent->set_value(bLinearActive ? nTransp : 50, FieldUnit::PERCENT);
@@ -510,6 +508,24 @@ void SvxTransparenceTabPage::InvalidatePreview (bool bEnable)
}
}
+basegfx::ColorStops SvxTransparenceTabPage::createColorStops()
+{
+ basegfx::ColorStops aColorStops;
+ const sal_uInt8 nStartCol(static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrStartValue->get_value(FieldUnit::PERCENT)) * 255) / 100));
+ const sal_uInt8 nEndCol(static_cast<sal_uInt8>((static_cast<sal_uInt16>(m_xMtrTrgrEndValue->get_value(FieldUnit::PERCENT)) * 255) / 100));
+
+ aColorStops.emplace_back(0.0, Color(nStartCol, nStartCol, nStartCol).getBColor());
+
+ if(!maColorStops.empty())
+ {
+ aColorStops.insert(aColorStops.begin(), maColorStops.begin(), maColorStops.end());
+ }
+
+ aColorStops.emplace_back(1.0, Color(nEndCol, nEndCol, nEndCol).getBColor());
+
+ return aColorStops;
+}
+
void SvxTransparenceTabPage::PageCreated(const SfxAllItemSet& aSet)
{
const SfxUInt16Item* pPageTypeItem = aSet.GetItem<SfxUInt16Item>(SID_PAGE_TYPE, false);
diff --git a/include/basegfx/utils/gradienttools.hxx b/include/basegfx/utils/gradienttools.hxx
index acc33f179104..502ef190b8ce 100644
--- a/include/basegfx/utils/gradienttools.hxx
+++ b/include/basegfx/utils/gradienttools.hxx
@@ -214,6 +214,11 @@ namespace basegfx
namespace utils
{
+ /// Tooling method to fill awt::Gradient2 from data contained in the given Any
+ BASEGFX_DLLPUBLIC bool fillGradient2FromAny(
+ com::sun::star::awt::Gradient2& rGradient,
+ const com::sun::star::uno::Any& rVal);
+
/* Tooling method to extract data from given awt::Gradient2
to ColorStops, doing some corrections, partially based
on given SingleColor.
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 4bd3802a7820..946afbf5d57b 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -107,11 +107,6 @@ namespace core {
namespace drawingml {
-/// Tooling method to fill awt::Gradient2 from data contained in the given Any
-bool fillGradient2FromAny(
- css::awt::Gradient2& rGradient,
- const css::uno::Any& rVal);
-
class OOX_DLLPUBLIC URLTransformer
{
public:
diff --git a/include/svx/sidebar/AreaPropertyPanelBase.hxx b/include/svx/sidebar/AreaPropertyPanelBase.hxx
index 75675ca140fa..6cf613cad26d 100644
--- a/include/svx/sidebar/AreaPropertyPanelBase.hxx
+++ b/include/svx/sidebar/AreaPropertyPanelBase.hxx
@@ -151,6 +151,9 @@ protected:
std::unique_ptr< XFillFloatTransparenceItem > mpFloatTransparenceItem;
std::unique_ptr< SfxUInt16Item > mpTransparenceItem;
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops maColorStops;
+
DECL_DLLPRIVATE_LINK(SelectFillTypeHdl, weld::ComboBox&, void );
DECL_DLLPRIVATE_LINK(SelectFillAttrHdl, weld::ComboBox&, void );
DECL_DLLPRIVATE_LINK(SelectFillColorHdl, ColorListBox&, void);
@@ -165,6 +168,9 @@ protected:
void SetTransparency(sal_uInt16 nVal);
void SelectFillAttrHdl_Impl();
void FillStyleChanged(bool bUpdateModel);
+
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops createColorStops();
};
} // end of namespace svx::sidebar
diff --git a/include/svx/sidebar/AreaTransparencyGradientPopup.hxx b/include/svx/sidebar/AreaTransparencyGradientPopup.hxx
index 18891e0e2348..78848246c75e 100644
--- a/include/svx/sidebar/AreaTransparencyGradientPopup.hxx
+++ b/include/svx/sidebar/AreaTransparencyGradientPopup.hxx
@@ -21,6 +21,7 @@
#include <vcl/weld.hxx>
#include <svtools/toolbarmenu.hxx>
+#include <basegfx/utils/gradienttools.hxx>
class XFillFloatTransparenceItem;
@@ -44,6 +45,9 @@ private:
std::unique_ptr<weld::MetricSpinButton> mxMtrTrgrEndValue;
std::unique_ptr<weld::MetricSpinButton> mxMtrTrgrBorder;
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops maColorStops;
+
void InitStatus(XFillFloatTransparenceItem const* pGradientItem);
void ExecuteValueModify(sal_uInt8 nStartCol, sal_uInt8 nEndCol);
DECL_LINK(ModifiedTrgrHdl_Impl, weld::MetricSpinButton&, void);
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index 37868d512ce1..a2c30f2e8861 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1935,7 +1935,7 @@ void ChartExport::exportSolidFill(const Reference< XPropertySet >& xPropSet)
uno::Reference< container::XNameAccess > xTransparenceGradient(xFact->createInstance("com.sun.star.drawing.TransparencyGradientTable"), uno::UNO_QUERY);
uno::Any rTransparenceValue = xTransparenceGradient->getByName(sFillTransparenceGradientName);
- if (fillGradient2FromAny(aTransparenceGradient, rTransparenceValue))
+ if (basegfx::utils::fillGradient2FromAny(aTransparenceGradient, rTransparenceValue))
{
basegfx::ColorStops aColorStops;
basegfx::utils::fillColorStopsFromAny(aColorStops, rTransparenceValue);
@@ -2024,7 +2024,7 @@ void ChartExport::exportGradientFill( const Reference< XPropertySet >& xPropSet
uno::Any rGradientValue = xGradient->getByName( sFillGradientName );
awt::Gradient2 aGradient;
- if (fillGradient2FromAny(aGradient, rGradientValue))
+ if (basegfx::utils::fillGradient2FromAny(aGradient, rGradientValue))
{
awt::Gradient2 aTransparenceGradient;
mpFS->startElementNS(XML_a, XML_gradFill);
@@ -2033,7 +2033,7 @@ void ChartExport::exportGradientFill( const Reference< XPropertySet >& xPropSet
{
uno::Reference< container::XNameAccess > xTransparenceGradient(xFact->createInstance("com.sun.star.drawing.TransparencyGradientTable"), uno::UNO_QUERY);
uno::Any rTransparenceValue = xTransparenceGradient->getByName(sFillTransparenceGradientName);
- fillGradient2FromAny(aTransparenceGradient, rTransparenceValue);
+ basegfx::utils::fillGradient2FromAny(aTransparenceGradient, rTransparenceValue);
WriteGradientFill(&aGradient, 0, &aTransparenceGradient, 0);
}
else if (GetProperty(xPropSet, "FillTransparence") )
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 9f02652f2b04..c5047db88392 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -192,48 +192,6 @@ const char* g_aPredefinedClrNames[] = {
namespace oox::drawingml {
-/// Tooling method to fill awt::Gradient2 from data contained in the given Any
-bool fillGradient2FromAny(css::awt::Gradient2& rGradient, const css::uno::Any& rVal)
-{
- bool bRetval(false);
-
- if (rVal.has< css::awt::Gradient2 >())
- {
- // we can use awt::Gradient2 directly
- bRetval = (rVal >>= rGradient);
- }
- else if (rVal.has< css::awt::Gradient >())
- {
- // 1st get awt::Gradient
- css::awt::Gradient aTmp;
-
- if (rVal >>= aTmp)
- {
- // copy all awt::Gradient data to awt::Gradient2
- rGradient.Style = aTmp.Style;
- rGradient.StartColor = aTmp.StartColor;
- rGradient.EndColor = aTmp.EndColor;
- rGradient.Angle = aTmp.Angle;
- rGradient.Border = aTmp.Border;
- rGradient.XOffset = aTmp.XOffset;
- rGradient.YOffset = aTmp.YOffset;
- rGradient.StartIntensity = aTmp.StartIntensity;
- rGradient.EndIntensity = aTmp.EndIntensity;
- rGradient.StepCount = aTmp.StepCount;
-
- // complete data by creating ColorStops for awt::Gradient2
- basegfx::utils::fillColorStopSequenceFromColorStops(
- rGradient.ColorStops,
- basegfx::ColorStops {
- basegfx::ColorStop(0.0, ::Color(ColorTransparency, aTmp.StartColor).getBColor()),
- basegfx::ColorStop(1.0, ::Color(ColorTransparency, aTmp.EndColor).getBColor()) });
- bRetval = true;
- }
- }
-
- return bRetval;
-}
-
URLTransformer::~URLTransformer()
{
}
@@ -557,7 +515,7 @@ void DrawingML::WriteSolidFill( const Reference< XPropertySet >& rXPropSet )
if (GetProperty(rXPropSet, "FillTransparenceGradient"))
{
- if (fillGradient2FromAny(aTransparenceGradient, mAny))
+ if (basegfx::utils::fillGradient2FromAny(aTransparenceGradient, mAny))
{
basegfx::ColorStops aColorStops;
basegfx::utils::fillColorStopsFromAny(aColorStops, mAny);
@@ -727,7 +685,7 @@ void DrawingML::WriteGradientFill( const Reference< XPropertySet >& rXPropSet )
return;
// use fillGradient2FromAny to evtl. take care of Gradient/Gradient2
- fillGradient2FromAny(aGradient, mAny);
+ basegfx::utils::fillGradient2FromAny(aGradient, mAny);
// get InteropGrabBag and search the relevant attributes
awt::Gradient2 aOriginalGradient;
@@ -741,7 +699,7 @@ void DrawingML::WriteGradientFill( const Reference< XPropertySet >& rXPropSet )
rProp.Value >>= aGradientStops;
else if( rProp.Name == "OriginalGradFill" )
// use fillGradient2FromAny to evtl. take care of Gradient/Gradient2
- fillGradient2FromAny(aOriginalGradient, rProp.Value);
+ basegfx::utils::fillGradient2FromAny(aOriginalGradient, rProp.Value);
}
// check if an ooxml gradient had been imported and if the user has modified it
diff --git a/sd/source/ui/sidebar/SlideBackground.cxx b/sd/source/ui/sidebar/SlideBackground.cxx
index 101b8c6133a3..dc7f8f0fd024 100644
--- a/sd/source/ui/sidebar/SlideBackground.cxx
+++ b/sd/source/ui/sidebar/SlideBackground.cxx
@@ -403,6 +403,12 @@ void SlideBackground::Update()
mxFillGrad1->SelectEntry(aStartColor);
const Color aEndColor(xGradient.GetColorStops().back().getStopColor());
mxFillGrad2->SelectEntry(aEndColor);
+
+ // MCGR: preserve in-between ColorStops if given
+ if (xGradient.GetColorStops().size() > 2)
+ maColorStops = basegfx::ColorStops(xGradient.GetColorStops().begin() + 1, xGradient.GetColorStops().end() - 1);
+ else
+ maColorStops.clear();
}
break;
@@ -1127,10 +1133,7 @@ IMPL_LINK_NOARG(SlideBackground, FillColorHdl, ColorListBox&, void)
break;
case drawing::FillStyle_GRADIENT:
{
- XGradient aGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- mxFillGrad1->GetSelectEntryColor().getBColor(),
- mxFillGrad2->GetSelectEntryColor().getBColor()));
+ XGradient aGradient(createColorStops());
// the name doesn't really matter, it'll be converted to unique one eventually,
// but it has to be non-empty
@@ -1283,6 +1286,23 @@ IMPL_LINK_NOARG( SlideBackground, ModifyMarginHdl, weld::ComboBox&, void )
}
}
+basegfx::ColorStops SlideBackground::createColorStops()
+{
+ basegfx::ColorStops aColorStops;
+
+ aColorStops.emplace_back(0.0, mxFillGrad1->GetSelectEntryColor().getBColor());
+
+ if(!maColorStops.empty())
+ {
+ aColorStops.insert(aColorStops.begin(), maColorStops.begin(), maColorStops.end());
+ }
+
+ aColorStops.emplace_back(1.0, mxFillGrad2->GetSelectEntryColor().getBColor());
+
+ return aColorStops;
}
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/SlideBackground.hxx b/sd/source/ui/sidebar/SlideBackground.hxx
index f7599f0c9ab0..5d029296c357 100644
--- a/sd/source/ui/sidebar/SlideBackground.hxx
+++ b/sd/source/ui/sidebar/SlideBackground.hxx
@@ -139,6 +139,9 @@ private:
MapUnit meUnit;
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops maColorStops;
+
DECL_LINK(FillBackgroundHdl, weld::ComboBox&, void);
DECL_LINK(FillStyleModifyHdl, weld::ComboBox&, void);
DECL_LINK(PaperSizeModifyHdl, weld::ComboBox&, void);
@@ -173,6 +176,9 @@ private:
void updateMasterSlideSelection();
static FieldUnit GetCurrentUnit(SfxItemState eState, const SfxPoolItem* pState);
+
+ // MCGR: Preserve in-between ColorStops until we have an UI to edit these
+ basegfx::ColorStops createColorStops();
};
}
diff --git a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
index fcb6dad3e2ea..59a90f887a8b 100644
--- a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
+++ b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
@@ -297,10 +297,7 @@ void AreaPropertyPanelBase::SelectFillAttrHdl_Impl()
if (pSh && pSh->GetItem(SID_COLOR_TABLE))
{
- XGradient aGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- mxLbFillGradFrom->GetSelectEntryColor().getBColor(),
- mxLbFillGradTo->GetSelectEntryColor().getBColor()));
+ XGradient aGradient(createColorStops());
aGradient.SetAngle(Degree10(mxMTRAngle->get_value(FieldUnit::DEGREE) * 10));
aGradient.SetGradientStyle(static_cast<css::awt::GradientStyle>(mxGradientStyle->get_active()));
@@ -491,6 +488,12 @@ void AreaPropertyPanelBase::FillStyleChanged(bool bUpdateModel)
mxLbFillGradFrom->SelectEntry(Color(aGradient.GetColorStops().front().getStopColor()));
mxLbFillGradTo->SelectEntry(Color(aGradient.GetColorStops().back().getStopColor()));
+ // MCGR: preserve in-between ColorStops if given
+ if (aGradient.GetColorStops().size() > 2)
+ maColorStops = basegfx::ColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1);
+ else
+ maColorStops.clear();
+
mxMTRAngle->set_value(toDegrees(aGradient.GetAngle()), FieldUnit::DEGREE);
css::awt::GradientStyle eXGS = aGradient.GetGradientStyle();
mxGradientStyle->set_active(sal::static_int_cast<sal_Int32>(eXGS));
@@ -511,6 +514,13 @@ void AreaPropertyPanelBase::FillStyleChanged(bool bUpdateModel)
const XGradient aGradient = mpFillGradientItem->GetGradientValue();
mxLbFillGradFrom->SelectEntry(Color(aGradient.GetColorStops().front().getStopColor()));
mxLbFillGradTo->SelectEntry(Color(aGradient.GetColorStops().back().getStopColor()));
+
+ // MCGR: preserve in-between ColorStops if given
+ if (aGradient.GetColorStops().size() > 2)
+ maColorStops = basegfx::ColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1);
+ else
+ maColorStops.clear();
+
mxGradientStyle->set_active(
sal::static_int_cast<sal_Int32>(aGradient.GetGradientStyle()));
if (mxGradientStyle->get_active() == sal_Int32(GradientStyle::Radial))
@@ -1355,6 +1365,22 @@ sal_Int32 AreaPropertyPanelBase::GetSelectedTransparencyTypeIndex() const
return mxLBTransType->get_active();
}
+basegfx::ColorStops AreaPropertyPanelBase::createColorStops()
+{
+ basegfx::ColorStops aColorStops;
+
+ aColorStops.emplace_back(0.0, mxLbFillGradFrom->GetSelectEntryColor().getBColor());
+
+ if(!maColorStops.empty())
+ {
+ aColorStops.insert(aColorStops.begin(), maColorStops.begin(), maColorStops.end());
+ }
+
+ aColorStops.emplace_back(1.0, mxLbFillGradTo->GetSelectEntryColor().getBColor());
+
+ return aColorStops;
+}
+
} // end of namespace svx::sidebar
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx b/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx
index 8e1f50ba65a0..34d618e8a2cd 100644
--- a/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx
+++ b/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx
@@ -84,6 +84,13 @@ void AreaTransparencyGradientPopup::InitStatus(XFillFloatTransparenceItem const
aEnd = Color(aGradient.GetColorStops().back().getStopColor());
mxMtrTrgrStartValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(aStart.GetRed()) + 1) * 100) / 255), FieldUnit::PERCENT);
mxMtrTrgrEndValue->set_value(static_cast<sal_uInt16>(((static_cast<sal_uInt16>(aEnd.GetRed()) + 1) * 100) / 255), FieldUnit::PERCENT);
+
+ // MCGR: preserve in-between ColorStops if given
+ if (aGradient.GetColorStops().size() > 2)
+ maColorStops = basegfx::ColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1);
+ else
+ maColorStops.clear();
+
mxMtrTrgrBorder->set_value(aGradient.GetBorder(), FieldUnit::PERCENT);
}
@@ -125,10 +132,15 @@ void AreaTransparencyGradientPopup::ExecuteValueModify(sal_uInt8 nStartCol, sal_
nVal = aMtrValue - nVal*360;
mxMtrTrgrAngle->set_value(nVal, FieldUnit::DEGREE);
//End of new code
+
+ basegfx::ColorStops aColorStops;
+ aColorStops.emplace_back(0.0, Color(nStartCol, nStartCol, nStartCol).getBColor());
+ if(!maColorStops.empty())
+ aColorStops.insert(aColorStops.begin(), maColorStops.begin(), maColorStops.end());
+ aColorStops.emplace_back(1.0, Color(nEndCol, nEndCol, nEndCol).getBColor());
+
XGradient aTmpGradient(
- basegfx::utils::createColorStopsFromStartEndColor(
- Color(nStartCol, nStartCol, nStartCol).getBColor(),
- Color(nEndCol, nEndCol, nEndCol).getBColor()),
+ aColorStops,
static_cast<css::awt::GradientStyle>(mrAreaPropertyPanel.GetSelectedTransparencyTypeIndex()-2),
Degree10(static_cast<sal_Int16>(mxMtrTrgrAngle->get_value(FieldUnit::DEGREE)) * 10),
static_cast<sal_uInt16>(mxMtrTrgrCenterX->get_value(FieldUnit::PERCENT)),
diff --git a/svx/source/unodraw/XPropertyTable.cxx b/svx/source/unodraw/XPropertyTable.cxx
index 586bba387699..a66f7e37b8f7 100644
--- a/svx/source/unodraw/XPropertyTable.cxx
+++ b/svx/source/unodraw/XPropertyTable.cxx
@@ -533,11 +533,12 @@ uno::Reference< container::XNameContainer > SvxUnoXGradientTable_createInstance(
uno::Any SvxUnoXGradientTable::getAny( const XPropertyEntry* pEntry ) const noexcept
{
const XGradient& aXGradient = static_cast<const XGradientEntry*>(pEntry)->GetGradient();
- awt::Gradient aGradient;
+ awt::Gradient2 aGradient;
+ // standard values
aGradient.Style = aXGradient.GetGradientStyle();
- aGradient.StartColor = static_cast<sal_Int32>(Color(aXGradient.GetColorStops().front().getStopColor()));
- aGradient.EndColor = static_cast<sal_Int32>(Color(aXGradient.GetColorStops().back().getStopColor()));
+ // 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();
@@ -546,6 +547,14 @@ uno::Any SvxUnoXGradientTable::getAny( const XPropertyEntry* pEntry ) const noex
aGradient.EndIntensity = aXGradient.GetEndIntens();
aGradient.StepCount = aXGradient.GetSteps();
+ // for compatibility, still set StartColor/EndColor
+ const basegfx::ColorStops& rColorStops(aXGradient.GetColorStops());
+ aGradient.StartColor = static_cast<sal_Int32>(Color(rColorStops.front().getStopColor()));
+ aGradient.EndColor = static_cast<sal_Int32>(Color(rColorStops.back().getStopColor()));
+
+ // fill ColorStops to extended Gradient2
+ basegfx::utils::fillColorStopSequenceFromColorStops(aGradient.ColorStops, rColorStops);
+
return uno::Any(aGradient);
}
@@ -569,6 +578,12 @@ std::unique_ptr<XPropertyEntry> SvxUnoXGradientTable::createEntry(const OUString
aXGradient.SetEndIntens( aGradient.EndIntensity );
aXGradient.SetSteps( aGradient.StepCount );
+ // check if we have a awt::Gradient2 with a ColorStopSequence
+ basegfx::ColorStops aColorStops;
+ basegfx::utils::fillColorStopsFromAny(aColorStops, rAny);
+ if (!aColorStops.empty())
+ aXGradient.SetColorStops(aColorStops);
+
return std::make_unique<XGradientEntry>(aXGradient, rName);
}