mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-14 12:04:29 +00:00
renderer: revise the internal logic.
dispose of the resources at the end of the paint deletion. This will help retain the resources of the retained paints and reuse them after reconstructing the next scene.
This commit is contained in:
parent
22b8b014e2
commit
14048cbe19
7 changed files with 27 additions and 60 deletions
|
@ -43,16 +43,16 @@ struct Canvas::Impl
|
|||
if (renderer) renderer->sync();
|
||||
|
||||
clearPaints();
|
||||
delete(renderer);
|
||||
|
||||
if (renderer) {
|
||||
if ((--renderer->refCnt) == 0) delete(renderer);
|
||||
}
|
||||
}
|
||||
|
||||
void clearPaints()
|
||||
{
|
||||
for (auto paint : paints) {
|
||||
P(paint)->unref();
|
||||
if (paint->pImpl->dispose(renderer) && P(paint)->refCnt == 0) {
|
||||
delete(paint);
|
||||
}
|
||||
if (P(paint)->unref() == 0) delete(paint);
|
||||
}
|
||||
paints.clear();
|
||||
}
|
||||
|
|
|
@ -114,16 +114,6 @@ RenderRegion Paint::Impl::bounds(RenderMethod* renderer) const
|
|||
}
|
||||
|
||||
|
||||
bool Paint::Impl::dispose(RenderMethod* renderer)
|
||||
{
|
||||
if (compData) compData->target->pImpl->dispose(renderer);
|
||||
|
||||
bool ret;
|
||||
PAINT_METHOD(ret, dispose(renderer));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Iterator* Paint::Impl::iterator()
|
||||
{
|
||||
Iterator* ret;
|
||||
|
@ -231,6 +221,12 @@ bool Paint::Impl::render(RenderMethod* renderer)
|
|||
|
||||
RenderData Paint::Impl::update(RenderMethod* renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
||||
{
|
||||
if (this->renderer != renderer) {
|
||||
if (this->renderer) TVGERR("RENDERER", "paint's renderer has been changed!");
|
||||
++renderer->refCnt;
|
||||
this->renderer = renderer;
|
||||
}
|
||||
|
||||
if (renderFlag & RenderUpdateFlag::Transform) {
|
||||
if (!rTransform) return nullptr;
|
||||
rTransform->update();
|
||||
|
|
|
@ -50,6 +50,7 @@ namespace tvg
|
|||
Paint* paint = nullptr;
|
||||
RenderTransform* rTransform = nullptr;
|
||||
Composite* compData = nullptr;
|
||||
RenderMethod* renderer = nullptr;
|
||||
BlendMethod blendMethod = BlendMethod::Normal; //uint8_t
|
||||
uint8_t renderFlag = RenderUpdateFlag::None;
|
||||
uint8_t ctxFlag = ContextFlag::Invalid;
|
||||
|
@ -57,9 +58,7 @@ namespace tvg
|
|||
uint8_t opacity = 255;
|
||||
uint8_t refCnt = 0;
|
||||
|
||||
Impl(Paint* pnt) : paint(pnt)
|
||||
{
|
||||
}
|
||||
Impl(Paint* pnt) : paint(pnt) {}
|
||||
|
||||
~Impl()
|
||||
{
|
||||
|
@ -132,7 +131,6 @@ namespace tvg
|
|||
}
|
||||
|
||||
RenderRegion bounds(RenderMethod* renderer) const;
|
||||
bool dispose(RenderMethod* renderer);
|
||||
Iterator* iterator();
|
||||
bool rotate(float degree);
|
||||
bool scale(float factor);
|
||||
|
|
|
@ -82,15 +82,12 @@ struct Picture::Impl
|
|||
~Impl()
|
||||
{
|
||||
LoaderMgr::retrieve(loader);
|
||||
delete(paint);
|
||||
if (surface) {
|
||||
if (auto renderer = PP(picture)->renderer) {
|
||||
renderer->dispose(rd);
|
||||
}
|
||||
|
||||
bool dispose(RenderMethod* renderer)
|
||||
{
|
||||
if (paint) paint->pImpl->dispose(renderer);
|
||||
else if (surface) renderer->dispose(rd);
|
||||
rd = nullptr;
|
||||
return true;
|
||||
}
|
||||
delete(paint);
|
||||
}
|
||||
|
||||
RenderData update(RenderMethod* renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
||||
|
|
|
@ -59,7 +59,6 @@ struct SceneIterator : Iterator
|
|||
struct Scene::Impl
|
||||
{
|
||||
list<Paint*> paints;
|
||||
RenderMethod* renderer = nullptr; //keep it for explicit clear
|
||||
RenderData rd = nullptr;
|
||||
Scene* scene = nullptr;
|
||||
uint8_t opacity; //for composition
|
||||
|
@ -74,19 +73,10 @@ struct Scene::Impl
|
|||
for (auto paint : paints) {
|
||||
if (P(paint)->unref() == 0) delete(paint);
|
||||
}
|
||||
}
|
||||
|
||||
bool dispose(RenderMethod* renderer)
|
||||
{
|
||||
for (auto paint : paints) {
|
||||
paint->pImpl->dispose(renderer);
|
||||
}
|
||||
|
||||
if (auto renderer = PP(scene)->renderer) {
|
||||
renderer->dispose(rd);
|
||||
this->renderer = nullptr;
|
||||
this->rd = nullptr;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool needComposition(uint8_t opacity)
|
||||
|
@ -120,8 +110,6 @@ struct Scene::Impl
|
|||
opacity = 255;
|
||||
}
|
||||
|
||||
this->renderer = renderer;
|
||||
|
||||
if (clipper) {
|
||||
Array<RenderData> rds(paints.size());
|
||||
for (auto paint : paints) {
|
||||
|
@ -226,14 +214,10 @@ struct Scene::Impl
|
|||
|
||||
void clear(bool free)
|
||||
{
|
||||
auto dispose = renderer ? true : false;
|
||||
|
||||
for (auto paint : paints) {
|
||||
if (dispose) free &= P(paint)->dispose(renderer);
|
||||
if (P(paint)->unref() == 0 && free) delete(paint);
|
||||
}
|
||||
paints.clear();
|
||||
renderer = nullptr;
|
||||
}
|
||||
|
||||
Iterator* iterator()
|
||||
|
|
|
@ -41,11 +41,11 @@ struct Shape::Impl
|
|||
{
|
||||
}
|
||||
|
||||
bool dispose(RenderMethod* renderer)
|
||||
~Impl()
|
||||
{
|
||||
if (auto renderer = PP(shape)->renderer) {
|
||||
renderer->dispose(rd);
|
||||
rd = nullptr;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool render(RenderMethod* renderer)
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
|
||||
struct Text::Impl
|
||||
{
|
||||
RenderData rd = nullptr;
|
||||
FontLoader* loader = nullptr;
|
||||
Shape* paint = nullptr;
|
||||
char* utf8 = nullptr;
|
||||
|
@ -94,7 +93,8 @@ struct Text::Impl
|
|||
|
||||
RenderRegion bounds(RenderMethod* renderer)
|
||||
{
|
||||
return renderer->region(rd);
|
||||
if (paint) return P(paint)->bounds(renderer);
|
||||
else return {0, 0, 0, 0};
|
||||
}
|
||||
|
||||
bool render(RenderMethod* renderer)
|
||||
|
@ -142,8 +142,7 @@ struct Text::Impl
|
|||
P(static_cast<RadialGradient*>(fill))->fr *= scale;
|
||||
}
|
||||
}
|
||||
rd = PP(paint)->update(renderer, transform, clips, opacity, pFlag, clipper);
|
||||
return rd;
|
||||
return PP(paint)->update(renderer, transform, clips, opacity, pFlag, clipper);
|
||||
}
|
||||
|
||||
bool bounds(float* x, float* y, float* w, float* h, TVG_UNUSED bool stroking)
|
||||
|
@ -153,13 +152,6 @@ struct Text::Impl
|
|||
return true;
|
||||
}
|
||||
|
||||
bool dispose(RenderMethod* renderer)
|
||||
{
|
||||
renderer->dispose(rd);
|
||||
this->rd = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
Paint* duplicate()
|
||||
{
|
||||
load();
|
||||
|
|
Loading…
Add table
Reference in a new issue