From 85c858cbda910b5c7bd63611433a3a634e81a902 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sun, 4 Feb 2024 13:01:01 +0900 Subject: [PATCH] renderer: ensure canvas rendering continues despite invalid scene parts Previously, the logic was set to halt rendering when any part of the paints, particularly bitmap-based images, failed to render. This update modifies the behavior to continue drawing the scene, allowing for the successful rendering of other elements. issue: https://github.com/thorvg/thorvg/issues/1951 --- src/renderer/sw_engine/tvgSwRaster.cpp | 4 ++-- src/renderer/tvgScene.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/renderer/sw_engine/tvgSwRaster.cpp b/src/renderer/sw_engine/tvgSwRaster.cpp index 049318c7..a3118b83 100644 --- a/src/renderer/sw_engine/tvgSwRaster.cpp +++ b/src/renderer/sw_engine/tvgSwRaster.cpp @@ -1928,8 +1928,8 @@ bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint8_t opacity) { - //Verify Boundary - if (bbox.max.x < 0 || bbox.max.y < 0 || bbox.min.x >= static_cast(surface->w) || bbox.min.y >= static_cast(surface->h)) return false; + //Outside of the viewport, skip the rendering + if (bbox.max.x < 0 || bbox.max.y < 0 || bbox.min.x >= static_cast(surface->w) || bbox.min.y >= static_cast(surface->h)) return true; if (mesh && mesh->triangleCnt > 0) return _rasterTexmapPolygonMesh(surface, image, mesh, transform, &bbox, opacity); else return _rasterImage(surface, image, transform, bbox, opacity); diff --git a/src/renderer/tvgScene.h b/src/renderer/tvgScene.h index 2267a2f7..5fb6e45c 100644 --- a/src/renderer/tvgScene.h +++ b/src/renderer/tvgScene.h @@ -128,6 +128,7 @@ struct Scene::Impl bool render(RenderMethod* renderer) { Compositor* cmp = nullptr; + auto ret = true; if (needComp) { cmp = renderer->target(bounds(renderer), renderer->colorSpace()); @@ -136,12 +137,12 @@ struct Scene::Impl } for (auto paint : paints) { - if (!paint->pImpl->render(renderer)) return false; + ret &= paint->pImpl->render(renderer); } if (cmp) renderer->endComposite(cmp); - return true; + return ret; } RenderRegion bounds(RenderMethod* renderer) const