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 { fn is(value: &Value) -> bool {
matches!(value, Value::Dict(_)) || T::is(value) matches!(value, Value::Dict(_)) || T::is(value)
} }

View File

@ -28,7 +28,7 @@ impl Rect {
res.push(Shape { res.push(Shape {
geometry: self.fill_geometry(), geometry: self.fill_geometry(),
fill, 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)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
enum Connection { enum Connection {
None, None,
@ -183,6 +185,9 @@ enum Connection {
} }
impl 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 { pub fn advance(self, right: bool) -> Self {
match self { match self {
Self::Right | Self::Both => { Self::Right | Self::Both => {
@ -202,10 +207,12 @@ impl Connection {
} }
} }
/// Whether there is a connection on the left.
fn left(self) -> bool { fn left(self) -> bool {
matches!(self, Self::Left | Self::Both) matches!(self, Self::Left | Self::Both)
} }
/// Whether there is a connection on the right.
fn right(self) -> bool { fn right(self) -> bool {
matches!(self, Self::Right | Self::Both) 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, frame.size.y + outset.top + outset.bottom,
); );
let radius = styles.get(Self::RADIUS); let radius = styles
let radius = Sides { .get(Self::RADIUS)
left: radius.left.relative_to(size.x / 2.0), .map(|side| side.relative_to(size.x.min(size.y) / 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 pos = Point::new(-outset.left, -outset.top); 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) #set text(8pt)
But, soft! what light through yonder window breaks? 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(stroke: blue)
#sq(fill: teal, stroke: blue) #sq(fill: teal, stroke: blue)
#sq(fill: teal, stroke: 2pt + 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("d6cd67"))
#rect(width: 0.5in, height: 7pt, fill: rgb("edd466")) #rect(width: 0.5in, height: 7pt, fill: rgb("edd466"))
#rect(width: 0.5in, height: 7pt, fill: rgb("e3be62"))\} #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))