mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +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
dd48a4155e
commit
c2fa4a728b
9 changed files with 43 additions and 66 deletions
Binary file not shown.
|
@ -39,8 +39,25 @@ struct Canvas::Impl
|
||||||
|
|
||||||
~Impl()
|
~Impl()
|
||||||
{
|
{
|
||||||
clear(true);
|
//make it sure any deffered jobs
|
||||||
delete(renderer);
|
if (renderer) {
|
||||||
|
renderer->sync();
|
||||||
|
renderer->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
clearPaints();
|
||||||
|
|
||||||
|
if (renderer) {
|
||||||
|
if ((--renderer->refCnt) == 0) delete(renderer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearPaints()
|
||||||
|
{
|
||||||
|
for (auto paint : paints) {
|
||||||
|
if (P(paint)->unref() == 0) delete(paint);
|
||||||
|
}
|
||||||
|
paints.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result push(unique_ptr<Paint> paint)
|
Result push(unique_ptr<Paint> paint)
|
||||||
|
@ -62,15 +79,8 @@ struct Canvas::Impl
|
||||||
if (!renderer || !renderer->clear()) return Result::InsufficientCondition;
|
if (!renderer || !renderer->clear()) return Result::InsufficientCondition;
|
||||||
|
|
||||||
//Free paints
|
//Free paints
|
||||||
if (free) {
|
if (free) clearPaints();
|
||||||
for (auto paint : paints) {
|
|
||||||
P(paint)->unref();
|
|
||||||
if (paint->pImpl->dispose(renderer) && P(paint)->refCnt == 0) {
|
|
||||||
delete(paint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
paints.clear();
|
|
||||||
}
|
|
||||||
drawing = false;
|
drawing = false;
|
||||||
|
|
||||||
return Result::Success;
|
return Result::Success;
|
||||||
|
|
|
@ -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* Paint::Impl::iterator()
|
||||||
{
|
{
|
||||||
Iterator* ret;
|
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)
|
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 (renderFlag & RenderUpdateFlag::Transform) {
|
||||||
if (!rTransform) return nullptr;
|
if (!rTransform) return nullptr;
|
||||||
rTransform->update();
|
rTransform->update();
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace tvg
|
||||||
Paint* paint = nullptr;
|
Paint* paint = nullptr;
|
||||||
RenderTransform* rTransform = nullptr;
|
RenderTransform* rTransform = nullptr;
|
||||||
Composite* compData = nullptr;
|
Composite* compData = nullptr;
|
||||||
|
RenderMethod* renderer = nullptr;
|
||||||
BlendMethod blendMethod = BlendMethod::Normal; //uint8_t
|
BlendMethod blendMethod = BlendMethod::Normal; //uint8_t
|
||||||
uint8_t renderFlag = RenderUpdateFlag::None;
|
uint8_t renderFlag = RenderUpdateFlag::None;
|
||||||
uint8_t ctxFlag = ContextFlag::Invalid;
|
uint8_t ctxFlag = ContextFlag::Invalid;
|
||||||
|
@ -57,9 +58,7 @@ namespace tvg
|
||||||
uint8_t opacity = 255;
|
uint8_t opacity = 255;
|
||||||
uint8_t refCnt = 0;
|
uint8_t refCnt = 0;
|
||||||
|
|
||||||
Impl(Paint* pnt) : paint(pnt)
|
Impl(Paint* pnt) : paint(pnt) {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~Impl()
|
~Impl()
|
||||||
{
|
{
|
||||||
|
@ -132,7 +131,6 @@ namespace tvg
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderRegion bounds(RenderMethod* renderer) const;
|
RenderRegion bounds(RenderMethod* renderer) const;
|
||||||
bool dispose(RenderMethod* renderer);
|
|
||||||
Iterator* iterator();
|
Iterator* iterator();
|
||||||
bool rotate(float degree);
|
bool rotate(float degree);
|
||||||
bool scale(float factor);
|
bool scale(float factor);
|
||||||
|
|
|
@ -82,15 +82,12 @@ struct Picture::Impl
|
||||||
~Impl()
|
~Impl()
|
||||||
{
|
{
|
||||||
LoaderMgr::retrieve(loader);
|
LoaderMgr::retrieve(loader);
|
||||||
delete(paint);
|
if (surface) {
|
||||||
|
if (auto renderer = PP(picture)->renderer) {
|
||||||
|
renderer->dispose(rd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
bool dispose(RenderMethod* renderer)
|
delete(paint);
|
||||||
{
|
|
||||||
if (paint) paint->pImpl->dispose(renderer);
|
|
||||||
else if (surface) renderer->dispose(rd);
|
|
||||||
rd = nullptr;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderData update(RenderMethod* renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
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
|
struct Scene::Impl
|
||||||
{
|
{
|
||||||
list<Paint*> paints;
|
list<Paint*> paints;
|
||||||
RenderMethod* renderer = nullptr; //keep it for explicit clear
|
|
||||||
RenderData rd = nullptr;
|
RenderData rd = nullptr;
|
||||||
Scene* scene = nullptr;
|
Scene* scene = nullptr;
|
||||||
uint8_t opacity; //for composition
|
uint8_t opacity; //for composition
|
||||||
|
@ -74,19 +73,10 @@ struct Scene::Impl
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
if (P(paint)->unref() == 0) delete(paint);
|
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);
|
renderer->dispose(rd);
|
||||||
this->renderer = nullptr;
|
}
|
||||||
this->rd = nullptr;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needComposition(uint8_t opacity)
|
bool needComposition(uint8_t opacity)
|
||||||
|
@ -120,8 +110,6 @@ struct Scene::Impl
|
||||||
opacity = 255;
|
opacity = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->renderer = renderer;
|
|
||||||
|
|
||||||
if (clipper) {
|
if (clipper) {
|
||||||
Array<RenderData> rds(paints.size());
|
Array<RenderData> rds(paints.size());
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
|
@ -226,14 +214,10 @@ struct Scene::Impl
|
||||||
|
|
||||||
void clear(bool free)
|
void clear(bool free)
|
||||||
{
|
{
|
||||||
auto dispose = renderer ? true : false;
|
|
||||||
|
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
if (dispose) free &= P(paint)->dispose(renderer);
|
|
||||||
if (P(paint)->unref() == 0 && free) delete(paint);
|
if (P(paint)->unref() == 0 && free) delete(paint);
|
||||||
}
|
}
|
||||||
paints.clear();
|
paints.clear();
|
||||||
renderer = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Iterator* iterator()
|
Iterator* iterator()
|
||||||
|
|
|
@ -41,11 +41,11 @@ struct Shape::Impl
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dispose(RenderMethod* renderer)
|
~Impl()
|
||||||
{
|
{
|
||||||
|
if (auto renderer = PP(shape)->renderer) {
|
||||||
renderer->dispose(rd);
|
renderer->dispose(rd);
|
||||||
rd = nullptr;
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool render(RenderMethod* renderer)
|
bool render(RenderMethod* renderer)
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
|
|
||||||
struct Text::Impl
|
struct Text::Impl
|
||||||
{
|
{
|
||||||
RenderData rd = nullptr;
|
|
||||||
FontLoader* loader = nullptr;
|
FontLoader* loader = nullptr;
|
||||||
Shape* paint = nullptr;
|
Shape* paint = nullptr;
|
||||||
char* utf8 = nullptr;
|
char* utf8 = nullptr;
|
||||||
|
@ -94,7 +93,8 @@ struct Text::Impl
|
||||||
|
|
||||||
RenderRegion bounds(RenderMethod* renderer)
|
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)
|
bool render(RenderMethod* renderer)
|
||||||
|
@ -142,8 +142,7 @@ struct Text::Impl
|
||||||
P(static_cast<RadialGradient*>(fill))->fr *= scale;
|
P(static_cast<RadialGradient*>(fill))->fr *= scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rd = PP(paint)->update(renderer, transform, clips, opacity, pFlag, clipper);
|
return PP(paint)->update(renderer, transform, clips, opacity, pFlag, clipper);
|
||||||
return rd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bounds(float* x, float* y, float* w, float* h, TVG_UNUSED bool stroking)
|
bool bounds(float* x, float* y, float* w, float* h, TVG_UNUSED bool stroking)
|
||||||
|
@ -153,13 +152,6 @@ struct Text::Impl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dispose(RenderMethod* renderer)
|
|
||||||
{
|
|
||||||
renderer->dispose(rd);
|
|
||||||
this->rd = nullptr;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Paint* duplicate()
|
Paint* duplicate()
|
||||||
{
|
{
|
||||||
load();
|
load();
|
||||||
|
|
Binary file not shown.
Loading…
Add table
Reference in a new issue