diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 84a73bcb..e8b0030f 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -1233,6 +1233,18 @@ bool GlRenderer::viewport(const RenderRegion& vp) } +bool GlRenderer::preUpdate() +{ + return true; +} + + +bool GlRenderer::postUpdate() +{ + return true; +} + + int GlRenderer::init(uint32_t threads) { if ((initEngineCnt++) > 0) return true; diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index d3d39d37..a4f745ae 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -63,8 +63,10 @@ public: RT_None, }; + bool preUpdate() override; RenderData prepare(const RenderShape& rshape, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override; RenderData prepare(RenderSurface* surface, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; + bool postUpdate() override; bool preRender() override; bool renderShape(RenderData data) override; bool renderImage(RenderData data) override; diff --git a/src/renderer/sw_engine/tvgSwRenderer.cpp b/src/renderer/sw_engine/tvgSwRenderer.cpp index a11ca570..94e2c2c1 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -363,6 +363,18 @@ bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, } +bool SwRenderer::preUpdate() +{ + return true; +} + + +bool SwRenderer::postUpdate() +{ + return true; +} + + bool SwRenderer::preRender() { return true; diff --git a/src/renderer/sw_engine/tvgSwRenderer.h b/src/renderer/sw_engine/tvgSwRenderer.h index a15fdb57..0e4cd8cd 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.h +++ b/src/renderer/sw_engine/tvgSwRenderer.h @@ -36,8 +36,10 @@ namespace tvg class SwRenderer : public RenderMethod { public: + bool preUpdate() override; RenderData prepare(const RenderShape& rshape, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override; RenderData prepare(RenderSurface* surface, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; + bool postUpdate() override; bool preRender() override; bool renderShape(RenderData data) override; bool renderImage(RenderData data) override; diff --git a/src/renderer/tvgCanvas.h b/src/renderer/tvgCanvas.h index 35085b66..61e21856 100644 --- a/src/renderer/tvgCanvas.h +++ b/src/renderer/tvgCanvas.h @@ -76,9 +76,13 @@ struct Canvas::Impl auto m = Matrix{1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (!renderer->preUpdate()) return Result::InsufficientCondition; + if (paint) PAINT(paint)->update(renderer, m, clips, 255, flag); else PAINT(scene)->update(renderer, m, clips, 255, flag); + if (!renderer->postUpdate()) return Result::InsufficientCondition; + status = Status::Updating; return Result::Success; } diff --git a/src/renderer/tvgRender.h b/src/renderer/tvgRender.h index 6442b89a..5a0d407e 100644 --- a/src/renderer/tvgRender.h +++ b/src/renderer/tvgRender.h @@ -383,8 +383,10 @@ public: uint32_t unref(); virtual ~RenderMethod() {} + virtual bool preUpdate() = 0; virtual RenderData prepare(const RenderShape& rshape, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0; virtual RenderData prepare(RenderSurface* surface, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) = 0; + virtual bool postUpdate() = 0; virtual bool preRender() = 0; virtual bool renderShape(RenderData data) = 0; virtual bool renderImage(RenderData data) = 0; diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index dadb666b..ea3d139b 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -480,6 +480,18 @@ bool WgRenderer::effect(TVG_UNUSED RenderCompositor* cmp, TVG_UNUSED const Rende } +bool WgRenderer::preUpdate() +{ + return true; +} + + +bool WgRenderer::postUpdate() +{ + return true; +} + + WgRenderer* WgRenderer::gen() { return new WgRenderer(); diff --git a/src/renderer/wg_engine/tvgWgRenderer.h b/src/renderer/wg_engine/tvgWgRenderer.h index 85aea67e..ff2e1d3e 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.h +++ b/src/renderer/wg_engine/tvgWgRenderer.h @@ -28,8 +28,10 @@ class WgRenderer : public RenderMethod { public: + bool preUpdate() override; RenderData prepare(const RenderShape& rshape, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override; RenderData prepare(RenderSurface* surface, RenderData data, const Matrix& transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; + bool postUpdate() override; bool preRender() override; bool renderShape(RenderData data) override; bool renderImage(RenderData data) override;