diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ref/coma.png | bin | 55412 -> 55410 bytes | |||
| -rw-r--r-- | tests/ref/elements/circle.png | bin | 12498 -> 12498 bytes | |||
| -rw-r--r-- | tests/ref/elements/image.png | bin | 209747 -> 185125 bytes | |||
| -rw-r--r-- | tests/ref/layout/grid-3.png | bin | 36802 -> 36819 bytes | |||
| -rw-r--r-- | tests/ref/layout/grid-5.png | bin | 2561 -> 2565 bytes | |||
| -rw-r--r-- | tests/ref/layout/page.png | bin | 6908 -> 6907 bytes | |||
| -rw-r--r-- | tests/ref/layout/stack-1.png | bin | 319 -> 317 bytes | |||
| -rw-r--r-- | tests/ref/layout/stack-2.png | bin | 3298 -> 3298 bytes | |||
| -rw-r--r-- | tests/ref/markup/enums.png | bin | 4123 -> 4123 bytes | |||
| -rw-r--r-- | tests/ref/markup/escape.png | bin | 5202 -> 5203 bytes | |||
| -rw-r--r-- | tests/ref/markup/lists.png | bin | 14701 -> 14701 bytes | |||
| -rw-r--r-- | tests/ref/text/basic.png | bin | 35196 -> 35194 bytes | |||
| -rw-r--r-- | tests/ref/text/links.png | bin | 9284 -> 9282 bytes | |||
| -rw-r--r-- | tests/ref/text/whitespace.png | bin | 5322 -> 5322 bytes | |||
| -rw-r--r-- | tests/typ/elements/image.typ | 30 | ||||
| -rw-r--r-- | tests/typ/layout/grid-3.typ | 2 | ||||
| -rw-r--r-- | tests/typ/layout/stack-1.typ | 1 | ||||
| -rw-r--r-- | tests/typeset.rs | 149 |
18 files changed, 114 insertions, 68 deletions
diff --git a/tests/ref/coma.png b/tests/ref/coma.png Binary files differindex d4c6c3de..04356991 100644 --- a/tests/ref/coma.png +++ b/tests/ref/coma.png diff --git a/tests/ref/elements/circle.png b/tests/ref/elements/circle.png Binary files differindex 2b938c89..efc0b8ec 100644 --- a/tests/ref/elements/circle.png +++ b/tests/ref/elements/circle.png diff --git a/tests/ref/elements/image.png b/tests/ref/elements/image.png Binary files differindex 943d43b1..2385d820 100644 --- a/tests/ref/elements/image.png +++ b/tests/ref/elements/image.png diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png Binary files differindex f4d450f8..7ef5df73 100644 --- a/tests/ref/layout/grid-3.png +++ b/tests/ref/layout/grid-3.png diff --git a/tests/ref/layout/grid-5.png b/tests/ref/layout/grid-5.png Binary files differindex 1b29e0bd..51703b11 100644 --- a/tests/ref/layout/grid-5.png +++ b/tests/ref/layout/grid-5.png diff --git a/tests/ref/layout/page.png b/tests/ref/layout/page.png Binary files differindex 71c3f18a..75ad00d1 100644 --- a/tests/ref/layout/page.png +++ b/tests/ref/layout/page.png diff --git a/tests/ref/layout/stack-1.png b/tests/ref/layout/stack-1.png Binary files differindex 78f7ed77..535632c4 100644 --- a/tests/ref/layout/stack-1.png +++ b/tests/ref/layout/stack-1.png diff --git a/tests/ref/layout/stack-2.png b/tests/ref/layout/stack-2.png Binary files differindex 3e503e65..470b57ec 100644 --- a/tests/ref/layout/stack-2.png +++ b/tests/ref/layout/stack-2.png diff --git a/tests/ref/markup/enums.png b/tests/ref/markup/enums.png Binary files differindex f1d3855b..a201131f 100644 --- a/tests/ref/markup/enums.png +++ b/tests/ref/markup/enums.png diff --git a/tests/ref/markup/escape.png b/tests/ref/markup/escape.png Binary files differindex 3f41a516..41b8c4d6 100644 --- a/tests/ref/markup/escape.png +++ b/tests/ref/markup/escape.png diff --git a/tests/ref/markup/lists.png b/tests/ref/markup/lists.png Binary files differindex fef578ae..1405b95e 100644 --- a/tests/ref/markup/lists.png +++ b/tests/ref/markup/lists.png diff --git a/tests/ref/text/basic.png b/tests/ref/text/basic.png Binary files differindex 1a5a1309..88d3059c 100644 --- a/tests/ref/text/basic.png +++ b/tests/ref/text/basic.png diff --git a/tests/ref/text/links.png b/tests/ref/text/links.png Binary files differindex 38abf0c5..43b77c87 100644 --- a/tests/ref/text/links.png +++ b/tests/ref/text/links.png diff --git a/tests/ref/text/whitespace.png b/tests/ref/text/whitespace.png Binary files differindex f1421bfe..7e79c177 100644 --- a/tests/ref/text/whitespace.png +++ b/tests/ref/text/whitespace.png diff --git a/tests/typ/elements/image.typ b/tests/typ/elements/image.typ index c0e6a3ef..43f93baf 100644 --- a/tests/typ/elements/image.typ +++ b/tests/typ/elements/image.typ @@ -5,30 +5,42 @@ // Load an RGBA PNG image. #image("../../res/rhino.png") -#pagebreak() // Load an RGB JPEG image. +#page(height: 60pt) #image("../../res/tiger.jpg") --- // Test configuring the size and fitting behaviour of images. -// Set width explicitly. -#image("../../res/rhino.png", width: 50pt) - -// Set height explicitly. -#image("../../res/rhino.png", height: 50pt) +// Set width and height explicitly. +#image("../../res/rhino.png", width: 30pt) +#image("../../res/rhino.png", height: 30pt) // Set width and height explicitly and force stretching. -#image("../../res/rhino.png", width: 25pt, height: 50pt) +#image("../../res/tiger.jpg", width: 100%, height: 20pt, fit: "stretch") // Make sure the bounding-box of the image is correct. #align(bottom, right) -#image("../../res/tiger.jpg", width: 60pt) +#image("../../res/tiger.jpg", width: 40pt) + +--- +// Test all three fit modes. +#page(height: 50pt, margins: 0pt) +#grid( + columns: 3, + rows: 100%, + gutter: 3pt, + image("../../res/tiger.jpg", fit: "contain"), + image("../../res/tiger.jpg", fit: "cover"), + image("../../res/tiger.jpg", fit: "stretch"), +) --- -// Does not fit to height of page. +// Does not fit to remaining height of page. #page(height: 60pt) +Stuff \ +Stuff #image("../../res/rhino.png") --- diff --git a/tests/typ/layout/grid-3.typ b/tests/typ/layout/grid-3.typ index af971875..82472e55 100644 --- a/tests/typ/layout/grid-3.typ +++ b/tests/typ/layout/grid-3.typ @@ -23,7 +23,7 @@ columns: 4 * (1fr,), row-gutter: 10pt, column-gutter: (0pt, 10%), - image("../../res/rhino.png"), + align(top, image("../../res/rhino.png")), align(right, rect(width: 100%, fill: eastern)[LoL]), [rofl], [\ A] * 3, diff --git a/tests/typ/layout/stack-1.typ b/tests/typ/layout/stack-1.typ index 42a0137d..2fbe22e3 100644 --- a/tests/typ/layout/stack-1.typ +++ b/tests/typ/layout/stack-1.typ @@ -17,7 +17,6 @@ #page(width: 50pt, margins: 0pt) #stack(dir: btt, ..items) -#pagebreak() --- // Test spacing. diff --git a/tests/typeset.rs b/tests/typeset.rs index aa4d250b..a287638a 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -13,9 +13,7 @@ use typst::diag::Error; use typst::eval::Value; use typst::font::Face; use typst::frame::{Element, Frame, Geometry, Text}; -use typst::geom::{ - self, Color, Length, Paint, PathElement, Point, RgbaColor, Sides, Size, -}; +use typst::geom::{self, Color, Length, Paint, PathElement, RgbaColor, Sides, Size}; use typst::image::Image; use typst::layout::layout; #[cfg(feature = "layout-cache")] @@ -390,66 +388,96 @@ fn draw(ctx: &Context, frames: &[Rc<Frame>], dpp: f32) -> sk::Pixmap { let width = 2.0 * pad + frames.iter().map(|l| l.size.w).max().unwrap_or_default(); let height = pad + frames.iter().map(|l| l.size.h + pad).sum::<Length>(); - let pixel_width = (dpp * width.to_pt() as f32) as u32; - let pixel_height = (dpp * height.to_pt() as f32) as u32; - if pixel_width > 4000 || pixel_height > 4000 { + let pxw = (dpp * width.to_pt() as f32) as u32; + let pxh = (dpp * height.to_pt() as f32) as u32; + if pxw > 4000 || pxh > 4000 { panic!( "overlarge image: {} by {} ({:?} x {:?})", - pixel_width, pixel_height, width, height, + pxw, pxh, width, height, ); } - let mut canvas = sk::Pixmap::new(pixel_width, pixel_height).unwrap(); - let ts = sk::Transform::from_scale(dpp, dpp); + let mut canvas = sk::Pixmap::new(pxw, pxh).unwrap(); canvas.fill(sk::Color::BLACK); - let mut origin = Point::splat(pad); + let mut mask = sk::ClipMask::new(); + let rect = sk::Rect::from_xywh(0.0, 0.0, pxw as f32, pxh as f32).unwrap(); + let path = sk::PathBuilder::from_rect(rect); + mask.set_path(pxw, pxh, &path, sk::FillRule::default(), false); + + let mut ts = sk::Transform::from_scale(dpp, dpp) + .pre_translate(pad.to_pt() as f32, pad.to_pt() as f32); + for frame in frames { - let mut paint = sk::Paint::default(); - paint.set_color(sk::Color::WHITE); - canvas.fill_rect( - sk::Rect::from_xywh( - origin.x.to_pt() as f32, - origin.y.to_pt() as f32, - frame.size.w.to_pt() as f32, - frame.size.h.to_pt() as f32, - ) - .unwrap(), - &paint, - ts, - None, - ); + let mut background = sk::Paint::default(); + background.set_color(sk::Color::WHITE); - for (pos, element) in frame.elements() { - let global = origin + pos; - let x = global.x.to_pt() as f32; - let y = global.y.to_pt() as f32; - let ts = ts.pre_translate(x, y); - match *element { - Element::Text(ref text) => { - draw_text(&mut canvas, ts, ctx.fonts.get(text.face_id), text); - } - Element::Geometry(ref geometry, paint) => { - draw_geometry(&mut canvas, ts, geometry, paint); - } - Element::Image(id, size) => { - draw_image(&mut canvas, ts, ctx.images.get(id), size); - } - Element::Link(_, s) => { - let outline = Geometry::Rect(s); - let paint = Paint::Color(Color::Rgba(RgbaColor::new(40, 54, 99, 40))); - draw_geometry(&mut canvas, ts, &outline, paint); - } - } - } + let w = frame.size.w.to_pt() as f32; + let h = frame.size.h.to_pt() as f32; + let rect = sk::Rect::from_xywh(0.0, 0.0, w, h).unwrap(); + canvas.fill_rect(rect, &background, ts, None); - origin.y += frame.size.h + pad; + draw_frame(&mut canvas, ts, &mask, ctx, frame); + ts = ts.pre_translate(0.0, (frame.size.h + pad).to_pt() as f32); } canvas } -fn draw_text(canvas: &mut sk::Pixmap, ts: sk::Transform, face: &Face, text: &Text) { +fn draw_frame( + canvas: &mut sk::Pixmap, + ts: sk::Transform, + mask: &sk::ClipMask, + ctx: &Context, + frame: &Frame, +) { + let mut storage; + let mask = if frame.clips { + let w = frame.size.w.to_pt() as f32; + let h = frame.size.h.to_pt() as f32; + let rect = sk::Rect::from_xywh(0.0, 0.0, w, h).unwrap(); + let path = sk::PathBuilder::from_rect(rect).transform(ts).unwrap(); + storage = mask.clone(); + storage.intersect_path(&path, sk::FillRule::default(), false); + &storage + } else { + mask + }; + + for (pos, element) in &frame.elements { + let x = pos.x.to_pt() as f32; + let y = pos.y.to_pt() as f32; + let ts = ts.pre_translate(x, y); + + match *element { + Element::Text(ref text) => { + draw_text(canvas, ts, mask, ctx.fonts.get(text.face_id), text); + } + Element::Geometry(ref geometry, paint) => { + draw_geometry(canvas, ts, mask, geometry, paint); + } + Element::Image(id, size) => { + draw_image(canvas, ts, mask, ctx.images.get(id), size); + } + Element::Link(_, s) => { + let outline = Geometry::Rect(s); + let paint = Paint::Color(Color::Rgba(RgbaColor::new(40, 54, 99, 40))); + draw_geometry(canvas, ts, mask, &outline, paint); + } + Element::Frame(ref frame) => { + draw_frame(canvas, ts, mask, ctx, frame); + } + } + } +} + +fn draw_text( + canvas: &mut sk::Pixmap, + ts: sk::Transform, + mask: &sk::ClipMask, + face: &Face, + text: &Text, +) { let ttf = face.ttf(); let size = text.size.to_pt() as f32; let units_per_em = ttf.units_per_em() as f32; @@ -481,7 +509,7 @@ fn draw_text(canvas: &mut sk::Pixmap, ts: sk::Transform, face: &Face, text: &Tex if let Some(fill) = &node.fill { let path = convert_usvg_path(&node.data); let (paint, fill_rule) = convert_usvg_fill(fill); - canvas.fill_path(&path, &paint, fill_rule, ts, None); + canvas.fill_path(&path, &paint, fill_rule, ts, Some(mask)); } } } @@ -497,7 +525,7 @@ fn draw_text(canvas: &mut sk::Pixmap, ts: sk::Transform, face: &Face, text: &Tex let dx = (raster.x as f32) / (img.width() as f32) * size; let dy = (raster.y as f32) / (img.height() as f32) * size; let ts = ts.pre_translate(dx, -size - dy); - draw_image(canvas, ts, &img, Size::new(w, h)); + draw_image(canvas, ts, mask, &img, Size::new(w, h)); } else { // Otherwise, draw normal outline. let mut builder = WrappedPathBuilder(sk::PathBuilder::new()); @@ -507,7 +535,7 @@ fn draw_text(canvas: &mut sk::Pixmap, ts: sk::Transform, face: &Face, text: &Tex let path = builder.0.finish().unwrap(); let mut paint = convert_typst_paint(text.fill); paint.anti_alias = true; - canvas.fill_path(&path, &paint, sk::FillRule::default(), ts, None); + canvas.fill_path(&path, &paint, sk::FillRule::default(), ts, Some(mask)); } } @@ -518,6 +546,7 @@ fn draw_text(canvas: &mut sk::Pixmap, ts: sk::Transform, face: &Face, text: &Tex fn draw_geometry( canvas: &mut sk::Pixmap, ts: sk::Transform, + mask: &sk::ClipMask, geometry: &Geometry, paint: Paint, ) { @@ -529,11 +558,11 @@ fn draw_geometry( let w = width.to_pt() as f32; let h = height.to_pt() as f32; let rect = sk::Rect::from_xywh(0.0, 0.0, w, h).unwrap(); - canvas.fill_rect(rect, &paint, ts, None); + canvas.fill_rect(rect, &paint, ts, Some(mask)); } Geometry::Ellipse(size) => { let path = convert_typst_path(&geom::Path::ellipse(size)); - canvas.fill_path(&path, &paint, rule, ts, None); + canvas.fill_path(&path, &paint, rule, ts, Some(mask)); } Geometry::Line(target, thickness) => { let path = { @@ -544,16 +573,22 @@ fn draw_geometry( let mut stroke = sk::Stroke::default(); stroke.width = thickness.to_pt() as f32; - canvas.stroke_path(&path, &paint, &stroke, ts, None); + canvas.stroke_path(&path, &paint, &stroke, ts, Some(mask)); } Geometry::Path(ref path) => { let path = convert_typst_path(path); - canvas.fill_path(&path, &paint, rule, ts, None); + canvas.fill_path(&path, &paint, rule, ts, Some(mask)); } }; } -fn draw_image(canvas: &mut sk::Pixmap, ts: sk::Transform, img: &Image, size: Size) { +fn draw_image( + canvas: &mut sk::Pixmap, + ts: sk::Transform, + mask: &sk::ClipMask, + img: &Image, + size: Size, +) { let mut pixmap = sk::Pixmap::new(img.buf.width(), img.buf.height()).unwrap(); for ((_, _, src), dest) in img.buf.pixels().zip(pixmap.pixels_mut()) { let Rgba([r, g, b, a]) = src; @@ -575,7 +610,7 @@ fn draw_image(canvas: &mut sk::Pixmap, ts: sk::Transform, img: &Image, size: Siz ); let rect = sk::Rect::from_xywh(0.0, 0.0, view_width, view_height).unwrap(); - canvas.fill_rect(rect, &paint, ts, None); + canvas.fill_rect(rect, &paint, ts, Some(mask)); } fn convert_typst_paint(paint: Paint) -> sk::Paint<'static> { |
