diff --git a/src/lib/decorations/path.typ b/src/lib/decorations/path.typ index 05c7a16bb..8d76a356b 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 fe5a348bc..9f000f0ff 100644 Binary files a/tests/decorations/path/ref/1.png and b/tests/decorations/path/ref/1.png differ diff --git a/tests/decorations/path/test.typ b/tests/decorations/path/test.typ index 25938c8a0..1a66d01d7 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