From 42e008f69cc2e8c2a023e7dd3300b662a3cef49a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sat, 6 Jul 2024 21:56:57 +0900 Subject: [PATCH] renderer: rectified render update flags. Image update flag has been missed, when the image is copied with a surface. This fixed it. Also try to skip update if any properties were not changed. --- src/renderer/tvgPicture.h | 8 +++++--- src/renderer/tvgShape.h | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/renderer/tvgPicture.h b/src/renderer/tvgPicture.h index 91c16eb4..bd702121 100644 --- a/src/renderer/tvgPicture.h +++ b/src/renderer/tvgPicture.h @@ -92,18 +92,19 @@ struct Picture::Impl RenderData update(RenderMethod* renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) { - auto flag = load(); + auto flag = static_cast(pFlag | load()); if (surface) { + if (flag == RenderUpdateFlag::None) return rd; auto transform = resizeTransform(pTransform); - rd = renderer->prepare(surface, &rm, rd, &transform, clips, opacity, static_cast(pFlag | flag)); + rd = renderer->prepare(surface, &rm, rd, &transform, clips, opacity, flag); } else if (paint) { if (resizing) { loader->resize(paint, w, h); resizing = false; } needComp = needComposition(opacity) ? true : false; - rd = paint->pImpl->update(renderer, pTransform, clips, opacity, static_cast(pFlag | flag), clipper); + rd = paint->pImpl->update(renderer, pTransform, clips, opacity, flag, clipper); } return rd; } @@ -200,6 +201,7 @@ struct Picture::Impl if (loader) { dup->loader = loader; ++dup->loader->sharing; + PP(ret)->renderFlag |= RenderUpdateFlag::Image; } dup->surface = surface; diff --git a/src/renderer/tvgShape.h b/src/renderer/tvgShape.h index ecc58b6c..ebc0b304 100644 --- a/src/renderer/tvgShape.h +++ b/src/renderer/tvgShape.h @@ -96,7 +96,9 @@ struct Shape::Impl } RenderData update(RenderMethod* renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) - { + { + if (static_cast(pFlag | flag) == RenderUpdateFlag::None) return rd; + if ((needComp = needComposition(opacity))) { /* Overriding opacity value. If this scene is half-translucent, It must do intermeidate composition with that opacity value. */