for(autoconst& rPolygon : std::as_const(rUnitPolyPolygon))
{
nPointCount += rPolygon.count(); // return early if we definitely have geometry if (nPointCount > 1) return nPolyCount == 1;
}
if(!nPointCount)
{
OSL_FAIL("PolyPolygon object without geometry detected, this should not be created (!)");
basegfx::B2DPolygon aFallbackLine;
aFallbackLine.append(basegfx::B2DPoint(0.0, 0.0));
aFallbackLine.append(basegfx::B2DPoint(1000.0, 1000.0));
rUnitPolyPolygon = basegfx::B2DPolyPolygon(aFallbackLine);
// prepare object transformation and unit polygon (direct model data)
basegfx::B2DHomMatrix aObjectMatrix;
basegfx::B2DPolyPolygon aUnitDefinitionPolyPolygon; constbool bIsLine(
!aUnitPolyPolygon.areControlPointsUsed()
&& bPolyCountIsOne
&& 2 == aUnitPolyPolygon.getB2DPolygon(0).count());
if(bIsLine)
{ // special handling for single line mode (2 points) const basegfx::B2DPolygon & rSubPolygon(aUnitPolyPolygon.getB2DPolygon(0)); const basegfx::B2DPoint aStart(rSubPolygon.getB2DPoint(0)); const basegfx::B2DPoint aEnd(rSubPolygon.getB2DPoint(1)); const basegfx::B2DVector aLine(aEnd - aStart);
// #i102548# create new unit polygon for line (horizontal) staticconst basegfx::B2DPolygon aNewPolygon{basegfx::B2DPoint(0.0, 0.0), basegfx::B2DPoint(1.0, 0.0)};
aUnitPolyPolygon.setB2DPolygon(0, aNewPolygon);
// #i102548# fill objectMatrix with rotation and offset (no shear for lines)
aObjectMatrix = basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
aLine.getLength(), 1.0, 0.0,
atan2(aLine.getY(), aLine.getX()),
aStart.getX(), aStart.getY());
} else
{ // #i102548# create unscaled, unsheared, unrotated and untranslated polygon // (unit polygon) by creating the object matrix and back-transforming the polygon const basegfx::B2DRange aObjectRange(basegfx::utils::getRange(aUnitPolyPolygon)); const GeoStat& rGeoStat(GetPathObj().GetGeoStat()); constdouble fWidth(aObjectRange.getWidth()); constdouble fHeight(aObjectRange.getHeight()); constdouble fScaleX(basegfx::fTools::equalZero(fWidth) ? 1.0 : fWidth); constdouble fScaleY(basegfx::fTools::equalZero(fHeight) ? 1.0 : fHeight);
// create unit polygon from object's absolute path
basegfx::B2DHomMatrix aInverse(aObjectMatrix);
aInverse.invert();
aUnitPolyPolygon.transform(aInverse);
// OperationSmiley: Check if a FillGeometryDefiningShape is set const SdrObject* pFillGeometryDefiningShape(GetPathObj().getFillGeometryDefiningShape());
if(nullptr != pFillGeometryDefiningShape)
{ // If yes, get it's BoundRange and use as defining Geometry for the FillStyle. // If no, aUnitDefinitionPolyPolygon will just be empty and thus be interpreted // as unused. // Using SnapRect will make the FillDefinition to always be extended e.g. // for rotated/sheared objects. const tools::Rectangle& rSnapRect(pFillGeometryDefiningShape->GetSnapRect());
// use same coordinate system as the shape geometry -> this // makes it relative to shape's unit geometry and thus freely // transformable with the shape
aUnitDefinitionPolyPolygon.transform(aInverse);
}
}
// create primitive. Always create primitives to allow the decomposition of // SdrPathPrimitive2D to create needed invisible elements for HitTest and/or BoundRect const drawinglayer::primitive2d::Primitive2DReference xReference( new drawinglayer::primitive2d::SdrPathPrimitive2D(
aObjectMatrix,
aAttribute,
std::move(aUnitPolyPolygon),
std::move(aUnitDefinitionPolyPolygon)));
#ifdef DBG_UTIL // helper to create something that uses InvertPrimitive2D to be able // to check/debug implementations in SDPRs. There is not much left // doing InvertPrimitive2D nowadays (luckily). To use, create a polygon // using one of the polygon tools. staticbool bTestInvert(false); if (bTestInvert)
{
drawinglayer::primitive2d::Primitive2DContainer aContainer;
aContainer.push_back(xReference); const drawinglayer::primitive2d::Primitive2DReference xReference2( new drawinglayer::primitive2d::InvertPrimitive2D(std::move(aContainer)));
rVisitor.visit(xReference2); return;
} #endif
rVisitor.visit(xReference);
}
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.12Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-02)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.