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 {
|
fn is(value: &Value) -> bool {
|
||||||
matches!(value, Value::Dict(_)) || T::is(value)
|
matches!(value, Value::Dict(_)) || T::is(value)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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 |
@ -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.
|
@ -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
|
||||||
|
)
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user