From 93ebd388c7be10d01a2bf40c4191c05a91cccbc8 Mon Sep 17 00:00:00 2001 From: Sergii Liebodkin Date: Thu, 31 Oct 2024 20:17:16 +0000 Subject: [PATCH] wg_engine: implement dash offset Introduced dash offset param for stroke dashes Issue https://github.com/thorvg/thorvg/issues/2592 --- src/renderer/wg_engine/tvgWgGeometry.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/renderer/wg_engine/tvgWgGeometry.h b/src/renderer/wg_engine/tvgWgGeometry.h index 5d698d79..01379828 100755 --- a/src/renderer/wg_engine/tvgWgGeometry.h +++ b/src/renderer/wg_engine/tvgWgGeometry.h @@ -293,6 +293,21 @@ struct WgVertexBufferInd // starting state uint32_t index_dash = 0; float len_total = dashPattern[index_dash]; + // get dashes length + float dashes_lenth{}; + for (uint32_t i = 0; i < dashCnt; i++) + dashes_lenth += dashPattern[i]; + if (dashes_lenth == 0) return; + // normalize dash offset + float dashOffset = rstroke->dashOffset; + while(dashOffset < 0) dashOffset += dashes_lenth; + while(dashOffset > dashes_lenth) dashOffset -= dashes_lenth; + // scip dashes by offset + while(len_total < dashOffset) { + index_dash = (index_dash + 1) % dashCnt; + len_total += dashPattern[index_dash]; + } + len_total -= dashOffset; // iterate by polyline points for (uint32_t i = 0; i < buff.vcount - 1; i++) { // append current polyline point @@ -301,8 +316,7 @@ struct WgVertexBufferInd // move inside polyline segment while(len_total < buff.vdist[i+1]) { // get current point - float t = len_total / buff.vdist[i+1]; - dashed.append(buff.vbuff[i] + (buff.vbuff[i+1] - buff.vbuff[i]) * t); + dashed.append(tvg::lerp(buff.vbuff[i], buff.vbuff[i+1], len_total / buff.vdist[i+1])); // update current state index_dash = (index_dash + 1) % dashCnt; len_total += dashPattern[index_dash];