summaryrefslogtreecommitdiff
path: root/slideshow
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow')
-rw-r--r--slideshow/source/engine/slideshowimpl.cxx148
1 files changed, 103 insertions, 45 deletions
diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx
index f02647097ea8..f681dc2a9559 100644
--- a/slideshow/source/engine/slideshowimpl.cxx
+++ b/slideshow/source/engine/slideshowimpl.cxx
@@ -48,6 +48,7 @@
#include <com/sun/star/lang/NoSupportException.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/drawing/LineCap.hpp>
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
#include <com/sun/star/drawing/PointSequence.hpp>
#include <com/sun/star/drawing/XLayer.hpp>
@@ -1398,6 +1399,59 @@ sal_Bool SlideShowImpl::removeView(
return true;
}
+drawing::PointSequenceSequence
+lcl_createPointSequenceSequenceFromB2DPolygon(const basegfx::B2DPolygon& rPoly)
+{
+ drawing::PointSequenceSequence aRetval;
+ //Create only one sequence for one pen drawing.
+ aRetval.realloc(1);
+ // Retrieve the sequence of points from aRetval
+ drawing::PointSequence* pOuterSequence = aRetval.getArray();
+ // Create points in this sequence from rPoly
+ pOuterSequence->realloc(rPoly.count());
+ // Get these points which are in an array
+ awt::Point* pInnerSequence = pOuterSequence->getArray();
+ for( sal_uInt32 n = 0; n < rPoly.count(); n++ )
+ {
+ //Create a point from the polygon
+ *pInnerSequence++ = awt::Point(basegfx::fround(rPoly.getB2DPoint(n).getX()),
+ basegfx::fround(rPoly.getB2DPoint(n).getY()));
+ }
+ return aRetval;
+}
+
+void lcl_setPropertiesToShape(const drawing::PointSequenceSequence& rPoints,
+ const cppcanvas::PolyPolygonSharedPtr pCanvasPolyPoly,
+ uno::Reference< drawing::XShape >& rPolyShape)
+{
+ uno::Reference< beans::XPropertySet > aXPropSet(rPolyShape, uno::UNO_QUERY);
+ //Give the built PointSequenceSequence.
+ uno::Any aParam;
+ aParam <<= rPoints;
+ aXPropSet->setPropertyValue("PolyPolygon", aParam);
+
+ //LineStyle : SOLID by default
+ drawing::LineStyle eLS;
+ eLS = drawing::LineStyle_SOLID;
+ aXPropSet->setPropertyValue("LineStyle", uno::Any(eLS));
+
+ //LineCap : ROUND by default, same as in show mode
+ drawing::LineCap eLC;
+ eLC = drawing::LineCap_ROUND;
+ aXPropSet->setPropertyValue("LineCap", uno::Any(eLC));
+
+ //LineColor
+ sal_uInt32 nLineColor;
+ nLineColor = pCanvasPolyPoly->getRGBALineColor();
+ //Transform polygon color from RRGGBBAA to AARRGGBB
+ aXPropSet->setPropertyValue("LineColor", uno::Any(RGBAColor2UnoColor(nLineColor)));
+
+ //LineWidth
+ double fLineWidth;
+ fLineWidth = pCanvasPolyPoly->getStrokeWidth();
+ aXPropSet->setPropertyValue("LineWidth", uno::Any(static_cast<sal_Int32>(fLineWidth)));
+}
+
void SlideShowImpl::registerUserPaintPolygons( const uno::Reference< lang::XMultiServiceFactory >& xDocFactory )
{
//Retrieve Polygons if user ends presentation by context menu
@@ -1444,74 +1498,78 @@ void SlideShowImpl::registerUserPaintPolygons( const uno::Reference< lang::XMult
PolyPolygonVector aPolygons = rPoly.second;
//Get shapes for the slide
css::uno::Reference< css::drawing::XShapes > Shapes = rPoly.first;
+
//Retrieve polygons for one slide
+ // #tdf112687 A pen drawing in slideshow is actually a chain of individual line shapes, where
+ // the end point of one line shape equals the start point of the next line shape.
+ // We collect these points into one B2DPolygon and use that to generate the shape on the
+ // slide.
+ ::basegfx::B2DPolygon aDrawingPoints;
+ cppcanvas::PolyPolygonSharedPtr pFirstPolyPoly; // for style properties
for( const auto& pPolyPoly : aPolygons )
{
+ // Actually, each item in aPolygons has two points, but wrapped in a cppcanvas::PopyPolygon.
::basegfx::B2DPolyPolygon b2DPolyPoly = ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(pPolyPoly->getUNOPolyPolygon());
//Normally there is only one polygon
for(sal_uInt32 i=0; i< b2DPolyPoly.count();i++)
{
const ::basegfx::B2DPolygon& aPoly = b2DPolyPoly.getB2DPolygon(i);
- sal_uInt32 nPoints = aPoly.count();
- if( nPoints > 1)
+ if (aPoly.count() > 1) // otherwise skip it, count should be 2
{
- //create the PolyLineShape
+ if (aDrawingPoints.count() == 0)
+ {
+ aDrawingPoints.append(aPoly);
+ pFirstPolyPoly = pPolyPoly;
+ continue;
+ }
+
+ basegfx::B2DPoint aLast = aDrawingPoints.getB2DPoint(aDrawingPoints.count() - 1);
+ if (aPoly.getB2DPoint(0).equal(aLast))
+ {
+ aDrawingPoints.append(aPoly, 1);
+ continue;
+ }
+
+ // Put what we have collected to the slide and then start a new pen drawing object
+ //create the PolyLineShape. The points will be in its PolyPolygon property.
uno::Reference< uno::XInterface > polyshape(xDocFactory->createInstance(
"com.sun.star.drawing.PolyLineShape" ) );
uno::Reference< drawing::XShape > rPolyShape(polyshape, uno::UNO_QUERY);
-
//Add the shape to the slide
Shapes->add(rPolyShape);
-
- //Retrieve shape properties
- uno::Reference< beans::XPropertySet > aXPropSet( rPolyShape, uno::UNO_QUERY );
//Construct a sequence of points sequence
- drawing::PointSequenceSequence aRetval;
- //Create only one sequence for one polygon
- aRetval.realloc( 1 );
- // Retrieve the sequence of points from aRetval
- drawing::PointSequence* pOuterSequence = aRetval.getArray();
- // Create 2 points in this sequence
- pOuterSequence->realloc(nPoints);
- // Get these points which are in an array
- awt::Point* pInnerSequence = pOuterSequence->getArray();
- for( sal_uInt32 n = 0; n < nPoints; n++ )
- {
- //Create a point from the polygon
- *pInnerSequence++ = awt::Point(
- basegfx::fround(aPoly.getB2DPoint(n).getX()),
- basegfx::fround(aPoly.getB2DPoint(n).getY()));
- }
-
+ const drawing::PointSequenceSequence aRetval
+ = lcl_createPointSequenceSequenceFromB2DPolygon(aDrawingPoints);
//Fill the properties
- //Give the built PointSequenceSequence.
- uno::Any aParam;
- aParam <<= aRetval;
- aXPropSet->setPropertyValue("PolyPolygon", aParam );
-
- //LineStyle : SOLID by default
- drawing::LineStyle eLS;
- eLS = drawing::LineStyle_SOLID;
- aXPropSet->setPropertyValue("LineStyle", uno::Any(eLS) );
-
- //LineColor
- sal_uInt32 nLineColor;
- nLineColor = pPolyPoly->getRGBALineColor();
- //Transform polygon color from RRGGBBAA to AARRGGBB
- aXPropSet->setPropertyValue("LineColor", uno::Any(RGBAColor2UnoColor(nLineColor)) );
-
- //LineWidth
- double fLineWidth;
- fLineWidth = pPolyPoly->getStrokeWidth();
- aXPropSet->setPropertyValue("LineWidth", uno::Any(static_cast<sal_Int32>(fLineWidth)) );
-
+ lcl_setPropertiesToShape(aRetval, pFirstPolyPoly, rPolyShape);
// make polygons special
xLayerManager->attachShapeToLayer(rPolyShape, xDrawnInSlideshow);
+ // Start next pen drawing object
+ aDrawingPoints.clear();
+ aDrawingPoints.append(aPoly);
+ pFirstPolyPoly = pPolyPoly;
}
}
}
+ // Bring remaining points to slide
+ if (aDrawingPoints.count() > 1)
+ {
+ //create the PolyLineShape. The points will be in its PolyPolygon property.
+ uno::Reference< uno::XInterface > polyshape(
+ xDocFactory->createInstance("com.sun.star.drawing.PolyLineShape"));
+ uno::Reference< drawing::XShape > rPolyShape(polyshape, uno::UNO_QUERY);
+ //Add the shape to the slide
+ Shapes->add(rPolyShape);
+ //Construct a sequence of points sequence
+ drawing::PointSequenceSequence aRetval
+ = lcl_createPointSequenceSequenceFromB2DPolygon(aDrawingPoints);
+ //Fill the properties
+ lcl_setPropertiesToShape(aRetval, aPolygons.back(), rPolyShape);
+ // make polygons special
+ xLayerManager->attachShapeToLayer(rPolyShape, xDrawnInSlideshow);
+ }
}
}