summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-11-16 21:32:29 +0100
committerLaurenz <laurmaedje@gmail.com>2021-11-16 21:32:29 +0100
commit9a800daa82833c57eee04e92c701ca9a05a67d3b (patch)
treea2c790f606037319393e9da3150bf58b44d4171d /tests
parent0cdf17216f47312f634d2dea8db237118ede72ce (diff)
Image fit modes
Diffstat (limited to 'tests')
-rw-r--r--tests/ref/coma.pngbin55412 -> 55410 bytes
-rw-r--r--tests/ref/elements/circle.pngbin12498 -> 12498 bytes
-rw-r--r--tests/ref/elements/image.pngbin209747 -> 185125 bytes
-rw-r--r--tests/ref/layout/grid-3.pngbin36802 -> 36819 bytes
-rw-r--r--tests/ref/layout/grid-5.pngbin2561 -> 2565 bytes
-rw-r--r--tests/ref/layout/page.pngbin6908 -> 6907 bytes
-rw-r--r--tests/ref/layout/stack-1.pngbin319 -> 317 bytes
-rw-r--r--tests/ref/layout/stack-2.pngbin3298 -> 3298 bytes
-rw-r--r--tests/ref/markup/enums.pngbin4123 -> 4123 bytes
-rw-r--r--tests/ref/markup/escape.pngbin5202 -> 5203 bytes
-rw-r--r--tests/ref/markup/lists.pngbin14701 -> 14701 bytes
-rw-r--r--tests/ref/text/basic.pngbin35196 -> 35194 bytes
-rw-r--r--tests/ref/text/links.pngbin9284 -> 9282 bytes
-rw-r--r--tests/ref/text/whitespace.pngbin5322 -> 5322 bytes
-rw-r--r--tests/typ/elements/image.typ30
-rw-r--r--tests/typ/layout/grid-3.typ2
-rw-r--r--tests/typ/layout/stack-1.typ1
-rw-r--r--tests/typeset.rs149
18 files changed, 114 insertions, 68 deletions
diff --git a/tests/ref/coma.png b/tests/ref/coma.png
index d4c6c3de..04356991 100644
--- a/tests/ref/coma.png
+++ b/tests/ref/coma.png
Binary files differ
diff --git a/tests/ref/elements/circle.png b/tests/ref/elements/circle.png
index 2b938c89..efc0b8ec 100644
--- a/tests/ref/elements/circle.png
+++ b/tests/ref/elements/circle.png
Binary files differ
diff --git a/tests/ref/elements/image.png b/tests/ref/elements/image.png
index 943d43b1..2385d820 100644
--- a/tests/ref/elements/image.png
+++ b/tests/ref/elements/image.png
Binary files differ
diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png
index f4d450f8..7ef5df73 100644
--- a/tests/ref/layout/grid-3.png
+++ b/tests/ref/layout/grid-3.png
Binary files differ
diff --git a/tests/ref/layout/grid-5.png b/tests/ref/layout/grid-5.png
index 1b29e0bd..51703b11 100644
--- a/tests/ref/layout/grid-5.png
+++ b/tests/ref/layout/grid-5.png
Binary files differ
diff --git a/tests/ref/layout/page.png b/tests/ref/layout/page.png
index 71c3f18a..75ad00d1 100644
--- a/tests/ref/layout/page.png
+++ b/tests/ref/layout/page.png
Binary files differ
diff --git a/tests/ref/layout/stack-1.png b/tests/ref/layout/stack-1.png
index 78f7ed77..535632c4 100644
--- a/tests/ref/layout/stack-1.png
+++ b/tests/ref/layout/stack-1.png
Binary files differ
diff --git a/tests/ref/layout/stack-2.png b/tests/ref/layout/stack-2.png
index 3e503e65..470b57ec 100644
--- a/tests/ref/layout/stack-2.png
+++ b/tests/ref/layout/stack-2.png
Binary files differ
diff --git a/tests/ref/markup/enums.png b/tests/ref/markup/enums.png
index f1d3855b..a201131f 100644
--- a/tests/ref/markup/enums.png
+++ b/tests/ref/markup/enums.png
Binary files differ
diff --git a/tests/ref/markup/escape.png b/tests/ref/markup/escape.png
index 3f41a516..41b8c4d6 100644
--- a/tests/ref/markup/escape.png
+++ b/tests/ref/markup/escape.png
Binary files differ
diff --git a/tests/ref/markup/lists.png b/tests/ref/markup/lists.png
index fef578ae..1405b95e 100644
--- a/tests/ref/markup/lists.png
+++ b/tests/ref/markup/lists.png
Binary files differ
diff --git a/tests/ref/text/basic.png b/tests/ref/text/basic.png
index 1a5a1309..88d3059c 100644
--- a/tests/ref/text/basic.png
+++ b/tests/ref/text/basic.png
Binary files differ
diff --git a/tests/ref/text/links.png b/tests/ref/text/links.png
index 38abf0c5..43b77c87 100644
--- a/tests/ref/text/links.png
+++ b/tests/ref/text/links.png
Binary files differ
diff --git a/tests/ref/text/whitespace.png b/tests/ref/text/whitespace.png
index f1421bfe..7e79c177 100644
--- a/tests/ref/text/whitespace.png
+++ b/tests/ref/text/whitespace.png
Binary files differ
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> {