mirror of
https://github.com/typst/typst
synced 2025-05-13 12:36:23 +08:00
Tests for the new shape API
This commit is contained in:
parent
f07395f9a4
commit
9b4397cdab
@ -596,7 +596,10 @@ impl<T: Cast> Cast for Smart<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Cast + Default + Clone> Cast for Sides<T> {
|
||||
impl<T> Cast for Sides<T>
|
||||
where
|
||||
T: Cast + Default + Clone,
|
||||
{
|
||||
fn is(value: &Value) -> bool {
|
||||
matches!(value, Value::Dict(_)) || T::is(value)
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ impl Rect {
|
||||
res.push(Shape {
|
||||
geometry: self.fill_geometry(),
|
||||
fill,
|
||||
stroke: stroke.left,
|
||||
stroke: stroke.is_uniform().then(|| stroke.top).flatten(),
|
||||
});
|
||||
}
|
||||
|
||||
@ -174,6 +174,8 @@ fn draw_side(
|
||||
}
|
||||
}
|
||||
|
||||
/// A state machine that indicates which sides of the border strokes in a 2D
|
||||
/// polygon are connected to their neighboring sides.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
enum Connection {
|
||||
None,
|
||||
@ -183,6 +185,9 @@ enum Connection {
|
||||
}
|
||||
|
||||
impl Connection {
|
||||
/// Advance to the next clockwise side of the polygon. The argument
|
||||
/// indicates whether the border is connected on the right side of the next
|
||||
/// edge.
|
||||
pub fn advance(self, right: bool) -> Self {
|
||||
match self {
|
||||
Self::Right | Self::Both => {
|
||||
@ -202,10 +207,12 @@ impl Connection {
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether there is a connection on the left.
|
||||
fn left(self) -> bool {
|
||||
matches!(self, Self::Left | Self::Both)
|
||||
}
|
||||
|
||||
/// Whether there is a connection on the right.
|
||||
fn right(self) -> bool {
|
||||
matches!(self, Self::Right | Self::Both)
|
||||
}
|
||||
|
@ -171,13 +171,9 @@ impl<const S: ShapeKind> Layout for ShapeNode<S> {
|
||||
frame.size.y + outset.top + outset.bottom,
|
||||
);
|
||||
|
||||
let radius = styles.get(Self::RADIUS);
|
||||
let radius = Sides {
|
||||
left: radius.left.relative_to(size.x / 2.0),
|
||||
top: radius.top.relative_to(size.y / 2.0),
|
||||
right: radius.right.relative_to(size.x / 2.0),
|
||||
bottom: radius.bottom.relative_to(size.y / 2.0),
|
||||
};
|
||||
let radius = styles
|
||||
.get(Self::RADIUS)
|
||||
.map(|side| side.relative_to(size.x.min(size.y) / 2.0));
|
||||
|
||||
let pos = Point::new(-outset.left, -outset.top);
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 6.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 14 KiB |
@ -21,3 +21,6 @@ Auto-sized ellipse. \
|
||||
#set text(8pt)
|
||||
But, soft! what light through yonder window breaks?
|
||||
]
|
||||
|
||||
|
||||
An inline #ellipse(width: 8pt, height: 6pt, outset: (top: 3pt, rest: 5.5pt)) ellipse.
|
@ -38,3 +38,13 @@
|
||||
#sq(stroke: blue)
|
||||
#sq(fill: teal, stroke: blue)
|
||||
#sq(fill: teal, stroke: 2pt + blue)
|
||||
|
||||
---
|
||||
// Test stroke composition.
|
||||
#set square(stroke: 4pt)
|
||||
#set text("Roboto")
|
||||
#square(
|
||||
stroke: (left: red, top: yellow, right: green, bottom: blue),
|
||||
radius: 100%, align(center+horizon)[*G*],
|
||||
inset: 8pt
|
||||
)
|
||||
|
@ -27,3 +27,30 @@
|
||||
\{#rect(width: 0.5in, height: 7pt, fill: rgb("d6cd67"))
|
||||
#rect(width: 0.5in, height: 7pt, fill: rgb("edd466"))
|
||||
#rect(width: 0.5in, height: 7pt, fill: rgb("e3be62"))\}
|
||||
|
||||
// Rounded corners.
|
||||
#rect(width: 2cm, radius: 60%)
|
||||
#rect(width: 1cm, radius: (x: 5pt, y: 10pt))
|
||||
#rect(width: 1.25cm, radius: (left: 2pt, top: 5pt, right: 8pt, bottom: 11pt))
|
||||
|
||||
// Different strokes.
|
||||
[
|
||||
#set rect(stroke: (right: red,))
|
||||
#rect(width: 100%, fill: lime, stroke: (x: 5pt, y: 1pt))
|
||||
]
|
||||
|
||||
---
|
||||
// Outset padding.
|
||||
#let inline-code(body) = [
|
||||
#set text("IBM Plex Mono", 8pt)
|
||||
#h(.7em, weak: true)
|
||||
#rect(radius: 3pt, outset: (y: 3pt, x: 2.5pt), fill: rgb(239, 241, 243), body)
|
||||
#h(.7em, weak: true)
|
||||
]
|
||||
|
||||
Use the #inline-code[\*const ptr] pointer.
|
||||
|
||||
---
|
||||
// Error: 15-38 unexpected key "cake"
|
||||
#rect(radius: (left: 10pt, cake: 5pt))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user