diff options
author | Regina Henschel <rb.henschel@t-online.de> | 2023-06-21 15:01:20 +0200 |
---|---|---|
committer | Regina Henschel <rb.henschel@t-online.de> | 2023-06-23 10:54:24 +0200 |
commit | bb19bda1dc620f0f8662776d9818aedf45486994 (patch) | |
tree | b3642e60db311287a935b54d46fd7b440e2d36f0 /svx/source | |
parent | 8ec8d592e31aebe19075e9f89c4c2c7abcf8d420 (diff) |
tdf#155901 MCGR: preserve first and last gradient stop too
Error was, that only the in-between gradient stops were preserve. First
stop was set with fixed offset 0, last stop with fixed offset 1. The
offsets of first and last gradient stop of the original gradient were
lost. Now in all cases (hopefully) the complete gradient stops vector is
preserved and the original offset is used, if e.g. the user changes the
color.
For calculating transparence the indirect way over Color is removed.
Instead percent is directly transformed to the 0..1 values of BColor.
That avoids rounding errors.
Change-Id: Icdf699a6c2e9c6289d2f77033858448e58396a60
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153395
Tested-by: Jenkins
Reviewed-by: Regina Henschel <rb.henschel@t-online.de>
Diffstat (limited to 'svx/source')
-rw-r--r-- | svx/source/sidebar/area/AreaPropertyPanelBase.cxx | 33 | ||||
-rw-r--r-- | svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx | 42 |
2 files changed, 46 insertions, 29 deletions
diff --git a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx index a1ff31c7186a..b84f5a45244e 100644 --- a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx +++ b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx @@ -488,9 +488,11 @@ 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::BColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1); + // MCGR: preserve ColorStops if given + // tdf#155901 We need offset of first and last stop, so include them. + if (aGradient.GetColorStops().size() >= 2) + maColorStops = basegfx::BColorStops(aGradient.GetColorStops().begin(), + aGradient.GetColorStops().end()); else maColorStops.clear(); @@ -515,9 +517,11 @@ 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::BColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1); + // MCGR: preserve ColorStops if given + // tdf#155901 We need offset of first and last stop, so include them. + if (aGradient.GetColorStops().size() >= 2) + maColorStops = basegfx::BColorStops(aGradient.GetColorStops().begin(), + aGradient.GetColorStops().end()); else maColorStops.clear(); @@ -1369,14 +1373,19 @@ basegfx::BColorStops AreaPropertyPanelBase::createColorStops() { basegfx::BColorStops aColorStops; - aColorStops.emplace_back(0.0, mxLbFillGradFrom->GetSelectEntryColor().getBColor()); - - if(!maColorStops.empty()) + if (maColorStops.size() >= 2) { - aColorStops.insert(aColorStops.begin(), maColorStops.begin(), maColorStops.end()); + aColorStops.emplace_back(maColorStops.front().getStopOffset(), + mxLbFillGradFrom->GetSelectEntryColor().getBColor()); + aColorStops.insert(aColorStops.begin(), maColorStops.begin() + 1, maColorStops.end() - 1); + aColorStops.emplace_back(maColorStops.back().getStopOffset(), + mxLbFillGradTo->GetSelectEntryColor().getBColor()); + } + else + { + aColorStops.emplace_back(0.0, mxLbFillGradFrom->GetSelectEntryColor().getBColor()); + aColorStops.emplace_back(1.0, mxLbFillGradTo->GetSelectEntryColor().getBColor()); } - - aColorStops.emplace_back(1.0, mxLbFillGradTo->GetSelectEntryColor().getBColor()); return aColorStops; } diff --git a/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx b/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx index df943359ff19..6a717551e456 100644 --- a/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx +++ b/svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx @@ -84,9 +84,11 @@ void AreaTransparencyGradientPopup::InitStatus(XFillFloatTransparenceItem const 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::BColorStops(aGradient.GetColorStops().begin() + 1, aGradient.GetColorStops().end() - 1); + // MCGR: preserve ColorStops if given + // tdf#155901 We need offset of first and last stop, so include them. + if (aGradient.GetColorStops().size() >= 2) + maColorStops = basegfx::BColorStops(aGradient.GetColorStops().begin(), + aGradient.GetColorStops().end()); else maColorStops.clear(); @@ -121,7 +123,7 @@ void AreaTransparencyGradientPopup::Rearrange(XFillFloatTransparenceItem const * } } -void AreaTransparencyGradientPopup::ExecuteValueModify(sal_uInt8 nStartCol, sal_uInt8 nEndCol) +void AreaTransparencyGradientPopup::ExecuteValueModify() { //Added sal_Int16 aMtrValue = static_cast<sal_Int16>(mxMtrTrgrAngle->get_value(FieldUnit::DEGREE)); @@ -133,10 +135,22 @@ void AreaTransparencyGradientPopup::ExecuteValueModify(sal_uInt8 nStartCol, sal_ //End of new code basegfx::BColorStops 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()); + basegfx::BColor aStartBColor(mxMtrTrgrStartValue->get_value(FieldUnit::PERCENT) / 100.0); + aStartBColor.clamp(); + basegfx::BColor aEndBColor(mxMtrTrgrEndValue->get_value(FieldUnit::PERCENT) / 100.0); + aEndBColor.clamp(); + + if (maColorStops.size() >= 2) + { + aColorStops.emplace_back(maColorStops.front().getStopOffset(), aStartBColor); + aColorStops.insert(aColorStops.begin(), maColorStops.begin() + 1, maColorStops.end() - 1); + aColorStops.emplace_back(maColorStops.back().getStopOffset(), aEndBColor); + } + else + { + aColorStops.emplace_back(0.0, aStartBColor); + aColorStops.emplace_back(1.0, aEndBColor); + } basegfx::BGradient aTmpGradient( aColorStops, @@ -156,33 +170,27 @@ void AreaTransparencyGradientPopup::ExecuteValueModify(sal_uInt8 nStartCol, sal_ IMPL_LINK_NOARG(AreaTransparencyGradientPopup, ModifiedTrgrHdl_Impl, weld::MetricSpinButton&, void) { - sal_uInt8 nStartCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrStartValue->get_value(FieldUnit::PERCENT)) * 255) / 100); - sal_uInt8 nEndCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrEndValue->get_value(FieldUnit::PERCENT)) * 255) / 100); - ExecuteValueModify( nStartCol, nEndCol ); + ExecuteValueModify(); } IMPL_LINK_NOARG(AreaTransparencyGradientPopup, Left_Click45_Impl, const OUString&, void) { - sal_uInt8 nStartCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrStartValue->get_value(FieldUnit::PERCENT)) * 255) / 100); - sal_uInt8 nEndCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrEndValue->get_value(FieldUnit::PERCENT)) * 255) / 100); sal_uInt16 nTemp = static_cast<sal_uInt16>(mxMtrTrgrAngle->get_value(FieldUnit::DEGREE)); if (nTemp>=315) nTemp -= 360; nTemp += 45; mxMtrTrgrAngle->set_value(nTemp, FieldUnit::DEGREE); - ExecuteValueModify(nStartCol, nEndCol); + ExecuteValueModify(); } IMPL_LINK_NOARG(AreaTransparencyGradientPopup, Right_Click45_Impl, const OUString&, void) { - sal_uInt8 nStartCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrStartValue->get_value(FieldUnit::PERCENT)) * 255) / 100); - sal_uInt8 nEndCol = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxMtrTrgrEndValue->get_value(FieldUnit::PERCENT)) * 255) / 100); sal_uInt16 nTemp = static_cast<sal_uInt16>(mxMtrTrgrAngle->get_value(FieldUnit::DEGREE)); if (nTemp<45) nTemp += 360; nTemp -= 45; mxMtrTrgrAngle->set_value(nTemp, FieldUnit::DEGREE); - ExecuteValueModify(nStartCol, nEndCol); + ExecuteValueModify(); } void AreaTransparencyGradientPopup::GrabFocus() |