chart2/source/view/charttypes/PieChart.cxx | 144 ++++++++++++++++++++++++++++- chart2/source/view/charttypes/PieChart.hxx | 26 ++++- download.lst | 4 3 files changed, 166 insertions(+), 8 deletions(-)
New commits: commit e9658eaa17591e9d1e380054da27ab6c5734f9af Author: Kurt Nordback <[email protected]> AuthorDate: Tue Nov 14 22:10:06 2023 -0700 Commit: Noel Grandin <[email protected]> CommitDate: Fri Feb 16 09:18:35 2024 +0100 tdf#50934: Implementation of bar-of-pie, plus minor of-pie fixes Change-Id: Ib343953ee30124524884859c8fe9e88d2dc7d822 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160726 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> diff --git a/chart2/source/view/charttypes/PieChart.cxx b/chart2/source/view/charttypes/PieChart.cxx index 0424130c8d5e..aee48da35084 100644 --- a/chart2/source/view/charttypes/PieChart.cxx +++ b/chart2/source/view/charttypes/PieChart.cxx @@ -227,6 +227,7 @@ PieChart::~PieChart() void PieChart::setScales( std::vector< ExplicitScaleData >&& rScales, bool /* bSwapXAndYAxis */ ) { OSL_ENSURE(m_nDimension<=static_cast<sal_Int32>(rScales.size()),"Dimension of Plotter does not fit two dimension of given scale sequence"); + m_aCartesianScales = m_pPosHelper->getScales(); m_aPosHelper.setScales( std::move(rScales), true ); } @@ -333,6 +334,50 @@ rtl::Reference<SvxShape> PieChart::createDataPoint( return xShape; } +rtl::Reference<SvxShape> PieChart::createBarDataPoint( + const rtl::Reference<SvxShapeGroupAnyD>& xTarget, + const uno::Reference<beans::XPropertySet>& xObjectProperties, + const ShapeParam& rParam, + double fBarSegBottom, double fBarSegTop) +{ + drawing::Position3D aP0, aP1; + + // Draw the bar for bar-of-pie small and to the right. Width and + // position are hard-coded for now. + +#if 0 + aP0 = cartesianPosHelper.transformLogicToScene(0.75, fBarSegBottom, + rParam.mfLogicZ, false); + aP1 = cartesianPosHelper.transformLogicToScene(1.25, fBarSegTop, + rParam.mfLogicZ, false); +#else + double x0 = m_aPosHelper.transformUnitCircleToScene(0, 0.75, 0).PositionX; + double x1 = m_aPosHelper.transformUnitCircleToScene(0, 1.25, 0).PositionX; + double y0 = m_aPosHelper.transformUnitCircleToScene( + 90, fBarSegBottom, 0).PositionY; + double y1 = m_aPosHelper.transformUnitCircleToScene( + 90, fBarSegTop, 0).PositionY; + + aP0 = drawing::Position3D(x0, y0, rParam.mfLogicZ); + aP1 = drawing::Position3D(x1, y1, rParam.mfLogicZ); +#endif + + const css::awt::Point aPos(aP0.PositionX, aP1.PositionY); + const css::awt::Size aSz(fabs(aP0.PositionX - aP1.PositionX), + fabs(aP0.PositionY - aP1.PositionY)); + + const tNameSequence emptyNameSeq; + const tAnySequence emptyValSeq; + //create point + rtl::Reference<SvxShape> xShape = ShapeFactory::createRectangle( + xTarget, + aSz, aPos, + emptyNameSeq, emptyValSeq); + + PropertyMapper::setMappedProperties( *xShape, xObjectProperties, PropertyMapper::getPropertyNameMapForFilledSeriesProperties() ); + return xShape; +} + void PieChart::createTextLabelShape( const rtl::Reference<SvxShapeGroupAnyD>& xTextTarget, VDataSeries& rSeries, sal_Int32 nPointIndex, ShapeParam& rParam ) @@ -880,6 +925,8 @@ void PieChart::createShapes() pDataSrc = &ofPieSrc; createOneRing(SubPieType::LEFT, 0, aParam, xSeriesTarget, xTextTarget, pSeries, pDataSrc, n3DRelativeHeight); + createOneBar(SubPieType::RIGHT, aParam, xSeriesTarget, + xTextTarget, pSeries, pDataSrc, n3DRelativeHeight); break; case PieChartSubType_PIE: pDataSrc = &ofPieSrc; @@ -926,6 +973,25 @@ void PieChart::createOneRing([[maybe_unused]]enum SubPieType eType, if (!std::isnan(fY) ) ringSum += fY; } + // determine the starting angle around the ring + auto sAngle = [&]() + { + if (eType == SubPieType::LEFT) { + // Left of-pie has the "composite" wedge (the one expanded in the right + // subgraph) facing to the right in the chart, to allow the expansion + // lines to meet it + double compositeVal = pDataSrc->getData(pSeries, nRingPtCnt - 1, eType); + return compositeVal * 360 / (ringSum * 2); + } else { + /// The angle degree offset is set by the same property of the + /// data series. + /// Counter-clockwise offset from the 3 o'clock position. + return static_cast<double>(pSeries->getStartingAngle()); + } + }; + + m_aPosHelper.m_fAngleDegreeOffset = sAngle(); + double fLogicYForNextPoint = 0.0; ///iterate through all points to create shapes for(sal_Int32 nPointIndex = 0; nPointIndex < nRingPtCnt; nPointIndex++ ) @@ -1057,6 +1123,81 @@ void PieChart::createOneRing([[maybe_unused]]enum SubPieType eType, }//next category } +void PieChart::createOneBar( + enum SubPieType eType, + ShapeParam& aParam, + const rtl::Reference<SvxShapeGroupAnyD>& xSeriesTarget, + const rtl::Reference<SvxShapeGroup>& xTextTarget, + VDataSeries* pSeries, + const PieDataSrcBase *pDataSrc, + sal_Int32 n3DRelativeHeight) +{ + bool bHasFillColorMapping = pSeries->hasPropertyMapping("FillColor"); + + sal_Int32 nBarPtCnt = pDataSrc->getNPoints(pSeries, eType); + + // Find sum of entries for this bar chart + double barSum = 0; + for (sal_Int32 nPointIndex = 0; nPointIndex < nBarPtCnt; nPointIndex++ ) { + double fY = pDataSrc->getData(pSeries, nPointIndex, eType); + if (!std::isnan(fY) ) barSum += fY; + } + + double fBarBottom = 0.0; + double fBarTop = -0.5; // make the bar go from -0.5 to 0.5 + ///iterate through all points to create shapes + for(sal_Int32 nPointIndex = 0; nPointIndex < nBarPtCnt; nPointIndex++ ) + { + aParam.mfDepth = getTransformedDepth() * (n3DRelativeHeight / 100.0); + + rtl::Reference<SvxShapeGroupAnyD> xSeriesGroupShape_Shapes = getSeriesGroupShape(pSeries, xSeriesTarget); + + ///collect data point information (logic coordinates, style ): + double fY = pDataSrc->getData(pSeries, nPointIndex, eType) / barSum; + if( std::isnan(fY) ) + continue; + if(fY==0.0)//@todo: continue also if the resolution is too small + continue; + fBarBottom = fBarTop; + fBarTop += fY; + + uno::Reference< beans::XPropertySet > xPointProperties = + pDataSrc->getProps(pSeries, nPointIndex, eType); + + ///create data point + aParam.mfLogicZ = -1.0; // For 3D pie chart label position + + rtl::Reference<SvxShape> xPointShape = + createBarDataPoint(xSeriesGroupShape_Shapes, + xPointProperties, aParam, + fBarBottom, fBarTop); + + ///point color: + if (!pSeries->hasPointOwnColor(nPointIndex) && m_xColorScheme.is()) + { + xPointShape->setPropertyValue("FillColor", + uno::Any(m_xColorScheme->getColorByIndex( nPointIndex ))); + } + + + if(bHasFillColorMapping) + { + double nPropVal = pSeries->getValueByProperty(nPointIndex, "FillColor"); + if(!std::isnan(nPropVal)) + { + xPointShape->setPropertyValue("FillColor", uno::Any(static_cast<sal_Int32>( nPropVal))); + } + } + + ///create label + createTextLabelShape(xTextTarget, *pSeries, nPointIndex, aParam); + + ShapeFactory::setShapeName( xPointShape, + ObjectIdentifier::createPointCID( pSeries->getPointCID_Stub(), + nPointIndex ) ); + }//next category +} + PieChart::PieLabelInfo::PieLabelInfo() : fValue(0.0) , bMovementAllowed(false), bMoved(false) @@ -1859,7 +2000,7 @@ bool PieChart::performLabelBestFitInnerPlacement(ShapeParam& rShapeParam, PieLab // class PieDataSrc //======================= double PieDataSrc::getData(const VDataSeries* pSeries, sal_Int32 nPtIdx, - enum SubPieType /*eType*/) const + [[maybe_unused]] enum SubPieType eType) const { return fabs(pSeries->getYValue( nPtIdx )); } @@ -1941,7 +2082,6 @@ uno::Reference< beans::XPropertySet > OfPieDataSrc::getProps( } } - } //namespace chart /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/view/charttypes/PieChart.hxx b/chart2/source/view/charttypes/PieChart.hxx index 8abd9973865c..731c4e62020d 100644 --- a/chart2/source/view/charttypes/PieChart.hxx +++ b/chart2/source/view/charttypes/PieChart.hxx @@ -45,9 +45,9 @@ public: }; enum class SubPieType { - NONE, - LEFT, - RIGHT + NONE, // solo pie or donut + LEFT, // left pie in pie-of-pie + RIGHT // right pie in pie-of-pie }; @@ -79,11 +79,12 @@ public: //======================= class PieDataSrc : public PieDataSrcBase { +public: sal_Int32 getNPoints(const VDataSeries* pSeries, enum SubPieType eType) const; double getData(const VDataSeries* pSeries, sal_Int32 nPtIdx, - enum SubPieType eType) const; + [[maybe_unused]]enum SubPieType eType) const; virtual uno::Reference< beans::XPropertySet > getProps( const VDataSeries* pSeries, sal_Int32 nPtIdx, @@ -157,6 +158,11 @@ private: //methods const sal_Int32 nPointCount, const bool bConcentricExplosion); + rtl::Reference<SvxShape> createBarDataPoint( + const rtl::Reference<SvxShapeGroupAnyD>& xTarget, + const uno::Reference<beans::XPropertySet>& xObjectProperties, + const ShapeParam& rParam, + double fBarSegBottom, double fBarSegTop); /** This method creates a text shape for a label of a data point. * * @param xTextTarget @@ -195,6 +201,7 @@ struct PieLabelInfo; bool performLabelBestFitInnerPlacement( ShapeParam& rShapeParam , PieLabelInfo const & rPieLabelInfo ); + // A standalone pie, one pie in a pie-of-pie, or one ring of a donut void createOneRing([[maybe_unused]]enum SubPieType eType , double fSlotX , ShapeParam& aParam @@ -204,10 +211,21 @@ struct PieLabelInfo; , const PieDataSrcBase *pDataSrc , sal_Int32 n3DRelativeHeight); + // A bar chart in a bar-of-pie + void createOneBar( + enum SubPieType eType, + ShapeParam& aParam, + const rtl::Reference<SvxShapeGroupAnyD>& xSeriesTarget, + const rtl::Reference<SvxShapeGroup>& xTextTarget, + VDataSeries* pSeries, + const PieDataSrcBase *pDataSrc, + sal_Int32 n3DRelativeHeight); + private: //member PiePositionHelper m_aPosHelper; bool m_bUseRings; bool m_bSizeExcludesLabelsAndExplodedSegments; + std::vector< ExplicitScaleData > m_aCartesianScales; // for bar-of-pie ::css::chart2::PieChartSubType m_eSubType; struct PieLabelInfo commit e808e4643002aa6d2e749afca75fe923c8b2bf8e Author: Xisco Fauli <[email protected]> AuthorDate: Thu Feb 15 21:03:51 2024 +0100 Commit: Xisco Fauli <[email protected]> CommitDate: Fri Feb 16 09:18:25 2024 +0100 harfbuzz: upgrade to 8.3.0 Change-Id: I498658405b3b9fe416295f8a97bc2df7f38e5d3d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163462 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> diff --git a/download.lst b/download.lst index 6a6ed6ec3a27..15482ddb49b1 100644 --- a/download.lst +++ b/download.lst @@ -292,8 +292,8 @@ GRAPHITE_TARBALL := graphite2-minimal-1.3.14.tgz # three static lines # so that git cherry-pick # will not run into conflicts -HARFBUZZ_SHA256SUM := e433ad85fbdf57f680be29479b3f964577379aaf319f557eb76569f0ecbc90f3 -HARFBUZZ_TARBALL := harfbuzz-8.2.2.tar.xz +HARFBUZZ_SHA256SUM := 109501eaeb8bde3eadb25fab4164e993fbace29c3d775bcaa1c1e58e2f15f847 +HARFBUZZ_TARBALL := harfbuzz-8.3.0.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts
