diff options
-rw-r--r-- | basegfx/source/tools/gradienttools.cxx | 97 | ||||
-rw-r--r-- | cui/source/inc/cuitabarea.hxx | 12 | ||||
-rw-r--r-- | cui/source/tabpages/tpgradnt.cxx | 38 | ||||
-rw-r--r-- | cui/source/tabpages/tptrans.cxx | 36 | ||||
-rw-r--r-- | include/basegfx/utils/gradienttools.hxx | 5 | ||||
-rw-r--r-- | include/oox/export/drawingml.hxx | 5 | ||||
-rw-r--r-- | include/svx/sidebar/AreaPropertyPanelBase.hxx | 6 | ||||
-rw-r--r-- | include/svx/sidebar/AreaTransparencyGradientPopup.hxx | 4 | ||||
-rw-r--r-- | oox/source/export/chartexport.cxx | 6 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 48 | ||||
-rw-r--r-- | sd/source/ui/sidebar/SlideBackground.cxx | 28 | ||||
-rw-r--r-- | sd/source/ui/sidebar/SlideBackground.hxx | 6 | ||||
-rw-r--r-- | svx/source/sidebar/area/AreaPropertyPanelBase.cxx | 34 | ||||
-rw-r--r-- | svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx | 18 | ||||
-rw-r--r-- | svx/source/unodraw/XPropertyTable.cxx | 21 |
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); } |