Tests for the new shape API

This commit is contained in:
Martin Haug 2022-05-02 18:25:53 +02:00
parent f07395f9a4
commit 9b4397cdab
9 changed files with 55 additions and 9 deletions

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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

View File

@ -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.

View File

@ -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
)

View File

@ -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))