|
|
Donner
C++20 SVG rendering library
|
Represents an SVG entity belonging to an SVGDocument. More...
#include "donner/svg/SVGElement.h"
Public Member Functions | |
| SVGElement (const SVGElement &other) | |
| Create another reference to the same SVGElement. | |
| SVGElement (SVGElement &&other) noexcept | |
| Move constructor. | |
| ~SVGElement () noexcept=default | |
| Destructor. | |
| SVGElement & | operator= (const SVGElement &other) |
| Create another reference to the same SVGElement. | |
| SVGElement & | operator= (SVGElement &&other) noexcept |
| Move assignment operator. | |
| ElementType | type () const |
| Get the ElementType for known XML element types. | |
| xml::XMLQualifiedNameRef | tagName () const |
| Get the XML tag name string for this element. | |
| bool | isKnownType () const |
| Returns true if this is a known element type, returns false if this is an SVGUnknownElement. | |
| EntityHandle | entityHandle () const |
| Get the underlying EntityHandle, for advanced use-cases that require direct access to the ECS. | |
| RcString | id () const |
| Get the element id, the value of the "id" attribute. | |
| void | setId (std::string_view id) |
| Set the element id, the value of the "id" attribute. | |
| RcString | className () const |
| Get the element class name, the value of the "class" attribute. | |
| void | setClassName (std::string_view name) |
| Set the element class name, the value of the "class" attribute. | |
| void | setStyle (std::string_view style) |
| Set the element style, the value of the "style" attribute. | |
| void | updateStyle (std::string_view style) |
| Update the element style, adding new attributes or overridding existing ones (without removing them). | |
| ParseResult< bool > | trySetPresentationAttribute (std::string_view name, std::string_view value) |
| Set the value of a presentation attribute, such as "fill" or "stroke". | |
| bool | hasAttribute (const xml::XMLQualifiedNameRef &name) const |
| Returns true if the element has an attribute with the given name. | |
| std::optional< RcString > | getAttribute (const xml::XMLQualifiedNameRef &name) const |
| Get the value of an attribute, if it exists. | |
| SmallVector< xml::XMLQualifiedNameRef, 1 > | findMatchingAttributes (const xml::XMLQualifiedNameRef &matcher) const |
| Find attributes matching the given name matcher. | |
| void | setAttribute (const xml::XMLQualifiedNameRef &name, std::string_view value) |
| Set the value of a generic XML attribute, which may be either a presentation attribute or custom user-provided attribute. | |
| void | removeAttribute (const xml::XMLQualifiedNameRef &name) |
| Remove an attribute, which may be either a presentation attribute or custom user-provided attribute. | |
| SVGDocument | ownerDocument () |
| Get an owning reference to the SVGDocument containing this element. | |
| std::optional< SVGElement > | parentElement () const |
| Get this element's parent, if it exists. | |
| std::optional< SVGElement > | firstChild () const |
| Get the first child of this element, if it exists. | |
| std::optional< SVGElement > | lastChild () const |
| Get the last child of this element, if it exists. | |
| std::optional< SVGElement > | previousSibling () const |
| Get the previous sibling of this element, if it exists. | |
| std::optional< SVGElement > | nextSibling () const |
| Get the next sibling of this element, if it exists. | |
| void | insertBefore (const SVGElement &newNode, std::optional< SVGElement > referenceNode) |
Insert newNode as a child, before referenceNode. | |
| void | appendChild (const SVGElement &child) |
Append child as a child of the current node. | |
| void | replaceChild (const SVGElement &newChild, const SVGElement &oldChild) |
Replace oldChild with newChild in the tree, removing oldChild and inserting newChild in its place. | |
| void | removeChild (const SVGElement &child) |
Remove child from this node. | |
| void | remove () |
| Remove this node from its parent, if it has one. | |
| bool | operator== (const SVGElement &other) const |
| Returns true if the two SVGElement handles reference the same underlying document. | |
| bool | operator!= (const SVGElement &other) const |
| Returns true if the two SVGElement handles reference the same underlying document. | |
| template<typename Derived> | |
| bool | isa () const |
| Return true if this element "is a" instance of type, if it be cast to a specific type with cast. | |
| template<typename Derived> | |
| Derived | cast () |
| Cast this element to its derived type. | |
| template<typename Derived> | |
| Derived | cast () const |
| Cast this element to its derived type (const version). | |
| template<typename Derived> | |
| std::optional< Derived > | tryCast () |
| Cast this element to its derived type, if possible. | |
| template<typename Derived> | |
| std::optional< const Derived > | tryCast () const |
| Cast this element to its derived type, if possible. | |
| std::optional< SVGElement > | querySelector (std::string_view selector) |
| Find the first element in the tree that matches the given CSS selector. | |
| const PropertyRegistry & | getComputedStyle () const |
| Get the computed CSS style of this element, after the CSS cascade. | |
Protected Member Functions | |
| SVGElement (EntityHandle handle) | |
| Internal constructor to create an SVGElement from an EntityHandle. | |
| Registry & | registry () const |
| Get the underlying ECS Registry, which holds all data for the document, for advanced use. | |
| EntityHandle | toHandle (Entity entity) const |
| Convert an Entity to an EntityHandle, for advanced use. | |
Static Protected Member Functions | |
| static EntityHandle | CreateEmptyEntity (SVGDocument &document) |
| Create a new Entity within the document ECS, and return a handle to it. | |
| static void | CreateEntityOn (EntityHandle handle, const xml::XMLQualifiedNameRef &tagName, ElementType Type) |
| Create a new SVG element instance on a given Entity. | |
Protected Attributes | |
| EntityHandle | handle_ |
| The underlying ECS Entity for this element, which holds all data. | |
Friends | |
| class | DonnerController |
Represents an SVG entity belonging to an SVGDocument.
Each SVGElement may only belong to a single document, and each document can have only one root. SVGDocument is responsible for managing the lifetime of all elements in the document, by storing a shared pointer to the internal Registry data-store.
Data is stored using the Entity Component System (Entity Component System (ECS)) pattern, which is a data-oriented design optimized for fast data access and cache locality, particularly during rendering.
SVGDocument and SVGElement provide a facade over the ECS, and surface a familiar Document Object Model (DOM) API to traverse and manipulate the document tree, which is internally stored within Components in the ECS. This makes SVGElement a thin wrapper around an Entity, making the object lightweight and usable on the stack.
|
explicitprotected |
Internal constructor to create an SVGElement from an EntityHandle.
To create an SVGElement, use the static Create methods on the derived class, such as SVGCircleElement::Create.
| handle | EntityHandle to wrap. |
| void donner::svg::SVGElement::appendChild | ( | const SVGElement & | child | ) |
Append child as a child of the current node.
If child is already in the tree, it is first removed from its parent. However, if inserting the child will create a cycle, the behavior is undefined.
| child | Node to append. |
|
inline |
Cast this element to its derived type.
Derived::Type.
|
inline |
Cast this element to its derived type (const version).
Derived::Type.
|
staticprotected |
Create a new Entity within the document ECS, and return a handle to it.
| document | Containing document. |
|
staticprotected |
| SmallVector< xml::XMLQualifiedNameRef, 1 > donner::svg::SVGElement::findMatchingAttributes | ( | const xml::XMLQualifiedNameRef & | matcher | ) | const |
Find attributes matching the given name matcher.
| matcher | Matcher to use to find attributes. If XMLQualifiedNameRef::namespacePrefix is "*", the matcher will match any namespace with the given attribute name. |
| std::optional< SVGElement > donner::svg::SVGElement::firstChild | ( | ) | const |
Get the first child of this element, if it exists.
std::nullopt if the element has no children. | std::optional< RcString > donner::svg::SVGElement::getAttribute | ( | const xml::XMLQualifiedNameRef & | name | ) | const |
Get the value of an attribute, if it exists.
| name | Name of the attribute to get. |
std::nullopt if the attribute does not exist. | bool donner::svg::SVGElement::hasAttribute | ( | const xml::XMLQualifiedNameRef & | name | ) | const |
Returns true if the element has an attribute with the given name.
| name | Name of the attribute to check. |
| void donner::svg::SVGElement::insertBefore | ( | const SVGElement & | newNode, |
| std::optional< SVGElement > | referenceNode ) |
Insert newNode as a child, before referenceNode.
If referenceNode is std::nullopt, append the child.
If newNode is already in the tree, it is first removed from its parent. However, if inserting the child will create a cycle, the behavior is undefined.
| newNode | New node to insert. |
| referenceNode | A child of this node to insert newNode before, or std::nullopt. Must be a child of the current node. |
|
inline |
Return true if this element "is a" instance of type, if it be cast to a specific type with cast.
| Derived | Type to check. |
| std::optional< SVGElement > donner::svg::SVGElement::lastChild | ( | ) | const |
Get the last child of this element, if it exists.
std::nullopt if the element has no children. | std::optional< SVGElement > donner::svg::SVGElement::nextSibling | ( | ) | const |
Get the next sibling of this element, if it exists.
std::nullopt if the element has no next sibling. | std::optional< SVGElement > donner::svg::SVGElement::parentElement | ( | ) | const |
Get this element's parent, if it exists.
If the parent is not set, this document is either the root element or has not been inserted into the document tree.
std::nullopt if the parent is not set. | std::optional< SVGElement > donner::svg::SVGElement::previousSibling | ( | ) | const |
Get the previous sibling of this element, if it exists.
std::nullopt if the element has no previous sibling. | std::optional< SVGElement > donner::svg::SVGElement::querySelector | ( | std::string_view | selector | ) |
Find the first element in the tree that matches the given CSS selector.
To find things relative to the current element, use :scope:
| selector | CSS selector to match. |
| void donner::svg::SVGElement::remove | ( | ) |
Remove this node from its parent, if it has one.
Has no effect if this has no parent.
| void donner::svg::SVGElement::removeAttribute | ( | const xml::XMLQualifiedNameRef & | name | ) |
Remove an attribute, which may be either a presentation attribute or custom user-provided attribute.
If this is a presentation attribute, the presentation attributes value will be removed (internally by setting the value to 'inherit').
| name | Name of the attribute to remove. |
| void donner::svg::SVGElement::removeChild | ( | const SVGElement & | child | ) |
Remove child from this node.
| child | Child to remove, must be a child of the current node. |
| void donner::svg::SVGElement::replaceChild | ( | const SVGElement & | newChild, |
| const SVGElement & | oldChild ) |
Replace oldChild with newChild in the tree, removing oldChild and inserting newChild in its place.
If newChild is already in the tree, it is first removed from its parent. However, if inserting the child will create a cycle, the behavior is undefined.
| newChild | New child to insert. |
| oldChild | Old child to remove, must be a child of the current node. |
| void donner::svg::SVGElement::setAttribute | ( | const xml::XMLQualifiedNameRef & | name, |
| std::string_view | value ) |
Set the value of a generic XML attribute, which may be either a presentation attribute or custom user-provided attribute.
This API supports a superset of trySetPresentationAttribute, however its parse errors are ignored. If the attribute is not a presentation attribute, or there are parse errors the attribute will be stored as a custom attribute instead.
| name | Name of the attribute to set. |
| value | New value to set. |
| void donner::svg::SVGElement::setClassName | ( | std::string_view | name | ) |
Set the element class name, the value of the "class" attribute.
| name | New class name to set. |
| void donner::svg::SVGElement::setId | ( | std::string_view | id | ) |
Set the element id, the value of the "id" attribute.
| id | New id to set. |
| void donner::svg::SVGElement::setStyle | ( | std::string_view | style | ) |
Set the element style, the value of the "style" attribute.
| style | New style to set. |
|
inlineprotected |
Convert an Entity to an EntityHandle, for advanced use.
| entity | Entity to convert. |
|
inline |
Cast this element to its derived type, if possible.
Return std::nullopt otherwise.
std::nullopt if the element is not of the correct type.
|
inline |
Cast this element to its derived type, if possible.
Return std::nullopt otherwise (const version).
std::nullopt if the element is not of the correct type. | ParseResult< bool > donner::svg::SVGElement::trySetPresentationAttribute | ( | std::string_view | name, |
| std::string_view | value ) |
Set the value of a presentation attribute, such as "fill" or "stroke".
Note that this accepts the CSS value, not the XML attribute value.
For example, for the following XML attributes they need to be mapped as follows before calling:
| name | Name of the attribute to set. |
| value | New value to set. |
| void donner::svg::SVGElement::updateStyle | ( | std::string_view | style | ) |
Update the element style, adding new attributes or overridding existing ones (without removing them).
| style | Style updates to apply, as a CSS style string (e.g. "fill:red;"). |