From 3ed021feccbe4d3735d1287e24175c7ca6ac598d Mon Sep 17 00:00:00 2001 From: Joseph Wilson Date: Fri, 6 Dec 2024 22:52:20 +0000 Subject: [PATCH] decoration: Allow specifying amplitudes as lengths (#767) --- src/lib/decorations/path.typ | 19 ++++++++++--------- tests/decorations/path/ref/1.png | Bin 124990 -> 150122 bytes tests/decorations/path/test.typ | 10 ++++++++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/lib/decorations/path.typ b/src/lib/decorations/path.typ index 05c7a16b..8d76a356 100644 --- a/src/lib/decorations/path.typ +++ b/src/lib/decorations/path.typ @@ -70,15 +70,16 @@ factor: 50%, ) -#let resolve-amplitude(amplitude, segment, num-segments) = { +#let resolve-amplitude(ctx, amplitude, segment, num-segments) = { segment = calc.max(0, calc.min(segment, num-segments)) - return if type(amplitude) == function { + let amp = if type(amplitude) == function { (amplitude)(segment / num-segments * 100%) } else if type(amplitude) == array { amplitude.at(calc.rem(int(2*segment), amplitude.len()), default: 0) } else { amplitude } + return util.resolve-number(ctx, amp) } #let resolve-style(ctx, segments, style) = { @@ -245,8 +246,8 @@ let ab = vector.sub(b, a) let f = .25 - (50% - style.factor) / 50% * .25 let q-dir = vector.scale(ab, f) - let up = vector.scale(norm, resolve-amplitude(style.amplitude, i + .25, num-segments) / 2) - let down = vector.scale(norm, -resolve-amplitude(style.amplitude, i + .75, num-segments) / 2) + let up = vector.scale(norm, resolve-amplitude(ctx, style.amplitude, i + .25, num-segments) / 2) + let down = vector.scale(norm, -resolve-amplitude(ctx, style.amplitude, i + .75, num-segments) / 2) let m1 = vector.add(vector.add(a, q-dir), up) let m2 = vector.add(vector.sub(b, q-dir), down) @@ -322,7 +323,7 @@ // let fn(i, a, b, norm) = { let ab = vector.sub(b, a) - let amplitude = resolve-amplitude(style.amplitude, i, num-segments) + let amplitude = resolve-amplitude(ctx, style.amplitude, i, num-segments) let up = vector.scale(norm, amplitude / 2) let dist = vector.dist(a, b) @@ -403,8 +404,8 @@ // let fn(i, a, b, norm) = { let ab = vector.sub(b, a) - let up = vector.scale(norm, +resolve-amplitude(style.amplitude, i + .25, num-segments) / 2) - let down = vector.scale(norm, -resolve-amplitude(style.amplitude, i + .75, num-segments) / 2) + let up = vector.scale(norm, +resolve-amplitude(ctx, style.amplitude, i + .25, num-segments) / 2) + let down = vector.scale(norm, -resolve-amplitude(ctx, style.amplitude, i + .75, num-segments) / 2) let ma = vector.add(vector.add(a, vector.scale(ab, .25)), up) let m = vector.add(a, vector.scale(ab, .50)) @@ -467,8 +468,8 @@ // let fn(i, a, b, norm) = { let ab = vector.sub(b, a) - let up = vector.scale(norm, +resolve-amplitude(style.amplitude, i + .25, num-segments) / 2) - let down = vector.scale(norm, -resolve-amplitude(style.amplitude, i + .75, num-segments) / 2) + let up = vector.scale(norm, +resolve-amplitude(ctx, style.amplitude, i + .25, num-segments) / 2) + let down = vector.scale(norm, -resolve-amplitude(ctx, style.amplitude, i + .75, num-segments) / 2) let m = vector.add(a, vector.scale(ab, factor)) if not close { diff --git a/tests/decorations/path/ref/1.png b/tests/decorations/path/ref/1.png index fe5a348bc97d91cb5aca8c256da3a48b88ff9b31..9f000f0ffc85b4c558e2e3308d96ff87c4550d67 100644 GIT binary patch delta 25464 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 delta 461 zcmaDgg>&Bp_6cJAf}$Ku3=9lYb@V4NFuq`IRNbn|nE$N)|F>5YfWiz87ye(rXK;X} zo1sCK8HgCB@qkc-5eOxm1R*jdyczHqR8JKvz^*0Bsr97$j-tRo4_94m0SmNYgMeK{ VvEcR2N;y#Ec)I$ztaD0e0s!1ucI*HE diff --git a/tests/decorations/path/test.typ b/tests/decorations/path/test.typ index 25938c8a..1a66d01d 100644 --- a/tests/decorations/path/test.typ +++ b/tests/decorations/path/test.typ @@ -72,3 +72,13 @@ segment-length: .22, amplitude: .8) } }) + +#test-case(fn => { + import draw: * + + // Amplitudes of type length + fn(line((0,0), (4,0)), amplitude: 0.25) + fn(line((0,1), (4,1)), amplitude: 2.5mm) + fn(line((0,2), (4,2)), amplitude: t => 1em*calc.sin(float(t)*calc.pi)) + fn(line((0,3), (4,3)), amplitude: (5mm, 0, 2mm, 0)) +}, args: all-fns) \ No newline at end of file