mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +00:00
common Accessor: Add access api that with data parameter
It supports data parameters that can pass user data to the callback function. std::unique_ptr<Picture> access(std::unique_ptr<Picture> picture, bool(*func)(const Paint* paint, void* data), void* data) noexcept;
This commit is contained in:
parent
a863f29512
commit
6e26aab1b6
2 changed files with 51 additions and 0 deletions
13
inc/thorvg.h
13
inc/thorvg.h
|
@ -1614,6 +1614,19 @@ public:
|
||||||
*/
|
*/
|
||||||
std::unique_ptr<Picture> access(std::unique_ptr<Picture> picture, bool(*func)(const Paint* paint)) noexcept;
|
std::unique_ptr<Picture> access(std::unique_ptr<Picture> picture, bool(*func)(const Paint* paint)) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Access the Picture scene stree nodes.
|
||||||
|
*
|
||||||
|
* @param[in] picture The picture node to traverse the internal scene-tree.
|
||||||
|
* @param[in] func The callback function calling for every paint nodes of the Picture.
|
||||||
|
* @param[in] data Data will be passed to callback function.
|
||||||
|
*
|
||||||
|
* @return Return the given @p picture instance.
|
||||||
|
*
|
||||||
|
* @note The bitmap based picture might not have the scene-tree.
|
||||||
|
*/
|
||||||
|
std::unique_ptr<Picture> access(std::unique_ptr<Picture> picture, bool(*func)(const Paint* paint, void* data), void* data) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a new Accessor object.
|
* @brief Creates a new Accessor object.
|
||||||
*
|
*
|
||||||
|
|
|
@ -42,6 +42,24 @@ static bool accessChildren(Iterator* it, bool(*func)(const Paint* paint), Iterat
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool accessChildren(Iterator* it, bool(*func)(const Paint* paint, void* data), IteratorAccessor& itrAccessor, void* data)
|
||||||
|
{
|
||||||
|
while (auto child = it->next()) {
|
||||||
|
//Access the child
|
||||||
|
if (!func(child, data)) return false;
|
||||||
|
|
||||||
|
//Access the children of the child
|
||||||
|
if (auto it2 = itrAccessor.iterator(child)) {
|
||||||
|
if (!accessChildren(it2, func, itrAccessor, data)) {
|
||||||
|
delete(it2);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
delete(it2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* External Class Implementation */
|
/* External Class Implementation */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -66,6 +84,26 @@ unique_ptr<Picture> Accessor::access(unique_ptr<Picture> picture, bool(*func)(co
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unique_ptr<Picture> Accessor::access(unique_ptr<Picture> picture, bool(*func)(const Paint* paint, void* data), void* data) noexcept
|
||||||
|
{
|
||||||
|
auto p = picture.get();
|
||||||
|
if (!p || !func) return picture;
|
||||||
|
|
||||||
|
//Use the Preorder Tree-Search
|
||||||
|
|
||||||
|
//Root
|
||||||
|
if (!func(p, data)) return picture;
|
||||||
|
|
||||||
|
//Children
|
||||||
|
IteratorAccessor itrAccessor;
|
||||||
|
if (auto it = itrAccessor.iterator(p)) {
|
||||||
|
accessChildren(it, func, itrAccessor, data);
|
||||||
|
delete(it);
|
||||||
|
}
|
||||||
|
return picture;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Accessor::~Accessor()
|
Accessor::~Accessor()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue