diff --git a/crates/typst-pdf/src/pattern.rs b/crates/typst-pdf/src/pattern.rs index 965ce370a..906100665 100644 --- a/crates/typst-pdf/src/pattern.rs +++ b/crates/typst-pdf/src/pattern.rs @@ -1,7 +1,7 @@ use ecow::eco_format; use pdf_writer::types::{ColorSpaceOperand, PaintType, TilingType}; use pdf_writer::{Filter, Finish, Name, Rect}; -use typst::layout::{Abs, Transform}; +use typst::layout::{Abs, Ratio, Transform}; use typst::util::Numeric; use typst::visualize::{Pattern, RelativeTo}; @@ -73,7 +73,9 @@ pub(crate) fn write_patterns(ctx: &mut PdfContext) { resources_map.finish(); tiling_pattern - .matrix(transform_to_array(*transform)) + .matrix(transform_to_array( + transform.post_concat(Transform::scale(Ratio::one(), -Ratio::one())), + )) .filter(Filter::FlateDecode); } } diff --git a/tests/ref/visualize/pattern-simple.png b/tests/ref/visualize/pattern-simple.png new file mode 100644 index 000000000..ac473a756 Binary files /dev/null and b/tests/ref/visualize/pattern-simple.png differ diff --git a/tests/typ/visualize/pattern-simple.typ b/tests/typ/visualize/pattern-simple.typ new file mode 100644 index 000000000..9c41067d5 --- /dev/null +++ b/tests/typ/visualize/pattern-simple.typ @@ -0,0 +1,18 @@ +// Tests that simple patterns work. + +--- +#set page(width: auto, height: auto, margin: 0pt) +#let pat = pattern(size: (10pt, 10pt), line(stroke: 4pt, start: (0%, 0%), end: (100%, 100%))) +#rect(width: 50pt, height: 50pt, fill: pat) + +--- +#set page(width: auto, height: auto, margin: 0pt) + +#let pat = pattern(size: (10pt, 10pt), { + place(line(stroke: 4pt, start: (0%, 0%), end: (100%, 100%))) + place(line(stroke: 4pt, start: (100%,0%), end: (200%, 100%))) + place(line(stroke: 4pt, start: (0%,100%), end: (100%, 200%))) + place(line(stroke: 4pt, start: (-100%,0%), end: (0%, 100%))) + place(line(stroke: 4pt, start: (0%,-100%), end: (100%, 0%))) +}) +#rect(width: 50pt, height: 50pt, fill: pat)