ES-DE/source/markerelement.cpp
Leon Styhre fd498ff35e Squashed 'external/lunasvg/' changes from e0f786c9b..ead790126
ead790126 fix name conflict with rlottie #100
6192f2536 Fix fill default color #105
be5ec7a4f Release v2.3.4
29c32978d Fix std::clamp bug #105
41f21ccb1 Release v2.3.3

git-subtree-dir: external/lunasvg
git-subtree-split: ead790126004b86a2dbbe9f4aaf27e82e419721e
2022-10-16 12:31:43 +02:00

99 lines
2.9 KiB
C++

#include "markerelement.h"
#include "parser.h"
#include "layoutcontext.h"
namespace lunasvg {
MarkerElement::MarkerElement()
: StyledElement(ElementID::Marker)
{
}
Length MarkerElement::refX() const
{
auto& value = get(PropertyID::RefX);
return Parser::parseLength(value, AllowNegativeLengths, Length::Zero);
}
Length MarkerElement::refY() const
{
auto& value = get(PropertyID::RefY);
return Parser::parseLength(value, AllowNegativeLengths, Length::Zero);
}
Length MarkerElement::markerWidth() const
{
auto& value = get(PropertyID::MarkerWidth);
return Parser::parseLength(value, ForbidNegativeLengths, Length::ThreePercent);
}
Length MarkerElement::markerHeight() const
{
auto& value = get(PropertyID::MarkerHeight);
return Parser::parseLength(value, ForbidNegativeLengths, Length::ThreePercent);
}
Angle MarkerElement::orient() const
{
auto& value = get(PropertyID::Orient);
return Parser::parseAngle(value);
}
MarkerUnits MarkerElement::markerUnits() const
{
auto& value = get(PropertyID::MarkerUnits);
return Parser::parseMarkerUnits(value);
}
Rect MarkerElement::viewBox() const
{
auto& value = get(PropertyID::ViewBox);
return Parser::parseViewBox(value);
}
PreserveAspectRatio MarkerElement::preserveAspectRatio() const
{
auto& value = get(PropertyID::PreserveAspectRatio);
return Parser::parsePreserveAspectRatio(value);
}
std::unique_ptr<LayoutMarker> MarkerElement::getMarker(LayoutContext* context) const
{
auto markerWidth = this->markerWidth();
auto markerHeight = this->markerHeight();
if(markerWidth.isZero() || markerHeight.isZero() || context->hasReference(this))
return nullptr;
LengthContext lengthContext(this);
auto _refX = lengthContext.valueForLength(refX(), LengthMode::Width);
auto _refY = lengthContext.valueForLength(refY(), LengthMode::Height);
auto _markerWidth = lengthContext.valueForLength(markerWidth, LengthMode::Width);
auto _markerHeight = lengthContext.valueForLength(markerHeight, LengthMode::Height);
auto viewBox = this->viewBox();
auto preserveAspectRatio = this->preserveAspectRatio();
auto viewTransform = preserveAspectRatio.getMatrix(_markerWidth, _markerHeight, viewBox);
viewTransform.map(_refX, _refY, &_refX, &_refY);
LayoutBreaker layoutBreaker(context, this);
auto marker = std::make_unique<LayoutMarker>();
marker->refX = _refX;
marker->refY = _refY;
marker->transform = viewTransform;
marker->orient = orient();
marker->units = markerUnits();
marker->clip = isOverflowHidden() ? preserveAspectRatio.getClip(_markerWidth, _markerHeight, viewBox) : Rect::Invalid;
marker->opacity = opacity();
marker->masker = context->getMasker(mask());
marker->clipper = context->getClipper(clip_path());
layoutChildren(context, marker.get());
return marker;
}
std::unique_ptr<Node> MarkerElement::clone() const
{
return cloneElement<MarkerElement>();
}
} // namespace lunasvg