From 97e34ad0a0c0d04a56cf85a0dc410bf08f71bbf7 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 10 Apr 2025 15:50:35 +0900 Subject: [PATCH] renderer/path: added point on path return a point at the given position. --- src/renderer/tvgRender.cpp | 50 ++++++++++++++++++++++++++++++++++++++ src/renderer/tvgRender.h | 1 + 2 files changed, 51 insertions(+) diff --git a/src/renderer/tvgRender.cpp b/src/renderer/tvgRender.cpp index 2a4ee4cc..f8a63ad2 100644 --- a/src/renderer/tvgRender.cpp +++ b/src/renderer/tvgRender.cpp @@ -44,6 +44,56 @@ uint32_t RenderMethod::unref() /* RenderPath Class Implementation */ /************************************************************************/ +Point RenderPath::point(float progress) +{ + if (progress <= 0.0f) return pts.first(); + if (progress >= 1.0f) return pts.last(); + + auto p = pts.data; + auto c = cmds.data; + auto pleng = tvg::length(cmds.data, cmds.count, pts.data, pts.count) * progress; + auto cleng = 0.0f; + Point curr{}, start{}, next{}; + + while (c < cmds.data + cmds.count) { + switch (*c) { + case PathCommand::MoveTo: { + curr = start = *p; + ++p; + ++c; + break; + } + case PathCommand::LineTo: { + next = *p; + float segLen = tvg::length(&curr, &next); + if (cleng + segLen >= pleng) return lerp(curr, next, (pleng - cleng) / segLen); + cleng += segLen; + curr = next; + ++p; + break; + } + case PathCommand::CubicTo: { + Bezier bz = {curr, *p++, *p++, *p++}; + auto segLen = bz.length(); + if (cleng + segLen >= pleng) return bz.at((pleng - cleng) / segLen); + cleng += segLen; + curr = bz.end; + break; + } + case PathCommand::Close: { + auto segLen = tvg::length(&curr, &start); + if (cleng + segLen >= pleng) return (curr + (start - curr)) * ((pleng - cleng) / segLen); + cleng += segLen; + curr = start; + break; + } + } + ++c; + } + return {}; +} + + bool RenderPath::bounds(Matrix* m, float* x, float* y, float* w, float* h) { //unexpected diff --git a/src/renderer/tvgRender.h b/src/renderer/tvgRender.h index f1a18cd8..22657b0e 100644 --- a/src/renderer/tvgRender.h +++ b/src/renderer/tvgRender.h @@ -118,6 +118,7 @@ struct RenderPath } bool bounds(Matrix* m, float* x, float* y, float* w, float* h); + Point point(float progress); }; struct RenderTrimPath