// decompose children
SvgNode::decomposeSvgNode(aNewTarget, bReferenced);
if(aNewTarget.empty()) return;
if(getTransform())
{ // create embedding group element with transformation
aNewTarget = drawinglayer::primitive2d::Primitive2DContainer { new drawinglayer::primitive2d::TransformPrimitive2D(
*getTransform(),
std::move(aNewTarget))
};
}
// append to current target
rTarget.append(aNewTarget);
}
// get mask definition as primitives
decomposeSvgNode(aMaskTarget, true);
if(!aMaskTarget.empty())
{ // get range of content to be masked const basegfx::B2DRange aContentRange(
rTarget.getB2DRange(
drawinglayer::geometry::ViewInformation2D())); constdouble fContentWidth(aContentRange.getWidth()); constdouble fContentHeight(aContentRange.getHeight());
if (SvgUnits::objectBoundingBox == maMaskContentUnits)
{ // mask is object-relative, embed in content transformation
aMaskTarget = drawinglayer::primitive2d::Primitive2DContainer { new drawinglayer::primitive2d::TransformPrimitive2D(
basegfx::utils::createScaleTranslateB2DHomMatrix(
aContentRange.getRange(),
aContentRange.getMinimum()),
std::move(aMaskTarget))
};
} else// userSpaceOnUse
{ // #i124852# if(pTransform)
{
aMaskTarget = drawinglayer::primitive2d::Primitive2DContainer { new drawinglayer::primitive2d::TransformPrimitive2D(
*pTransform,
std::move(aMaskTarget))
};
}
}
// embed content to a ModifiedColorPrimitive2D since the definitions // how content is used as alpha is special for Svg
{
aMaskTarget = drawinglayer::primitive2d::Primitive2DContainer { new drawinglayer::primitive2d::ModifiedColorPrimitive2D(
std::move(aMaskTarget),
std::make_shared<basegfx::BColorModifier_luminance_to_alpha>())
};
}
// prepare new content
drawinglayer::primitive2d::Primitive2DReference xNewContent( new drawinglayer::primitive2d::TransparencePrimitive2D(
std::move(rTarget),
std::move(aMaskTarget)));
// output up to now is defined by aContentRange and mask is oriented // relative to it. It is possible that aOffscreenBufferRange defines // a smaller area. In that case, embed to a mask primitive if(!aOffscreenBufferRange.isInside(aContentRange))
{
xNewContent = new drawinglayer::primitive2d::MaskPrimitive2D(
basegfx::B2DPolyPolygon(
basegfx::utils::createPolygonFromRect(
aOffscreenBufferRange)),
drawinglayer::primitive2d::Primitive2DContainer { xNewContent });
}
// redefine target. Use TransparencePrimitive2D with created mask // geometry
rTarget = drawinglayer::primitive2d::Primitive2DContainer { xNewContent };
} else
{ // content is geometrically empty
rTarget.clear();
}
} else
{ // An empty clipping path will completely clip away the element that had // the clip-path property applied. (Svg spec)
rTarget.clear();
}
}
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.