Compare commits

...

5 Commits

Author SHA1 Message Date
Niklas Eicker
2a15199505
Merge c9cf6bab92e5d08f4f42dc9ce2da579bf0fbe7e2 into 7278d887cf05fadc9a96478830e5876739b78f53 2025-07-24 00:54:24 -04:00
Tobias Schmitz
7278d887cf
Fix bounding box computation for lines in curves (#6647)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
2025-07-23 14:17:03 +00:00
Niklas Eicker
c9cf6bab92 Clarifications in docs 2025-07-19 10:12:17 +02:00
Niklas Eicker
084a3dd0f2
Merge branch 'main' into constructors-for-manifest-types 2025-07-18 16:50:12 +02:00
Niklas Eicker
2166f257c8 Create constructor methods for manifest types 2025-07-17 22:39:50 +02:00
5 changed files with 72 additions and 33 deletions

View File

@ -476,26 +476,18 @@ impl Curve {
/// Computes the size of the bounding box of this curve. /// Computes the size of the bounding box of this curve.
pub fn bbox_size(&self) -> Size { pub fn bbox_size(&self) -> Size {
let mut min_x = Abs::inf(); let mut min = Point::splat(Abs::inf());
let mut min_y = Abs::inf(); let mut max = Point::splat(-Abs::inf());
let mut max_x = -Abs::inf();
let mut max_y = -Abs::inf();
let mut cursor = Point::zero(); let mut cursor = Point::zero();
for item in self.0.iter() { for item in self.0.iter() {
match item { match item {
CurveItem::Move(to) => { CurveItem::Move(to) => {
min_x = min_x.min(cursor.x);
min_y = min_y.min(cursor.y);
max_x = max_x.max(cursor.x);
max_y = max_y.max(cursor.y);
cursor = *to; cursor = *to;
} }
CurveItem::Line(to) => { CurveItem::Line(to) => {
min_x = min_x.min(cursor.x); min = min.min(cursor).min(*to);
min_y = min_y.min(cursor.y); max = max.max(cursor).max(*to);
max_x = max_x.max(cursor.x);
max_y = max_y.max(cursor.y);
cursor = *to; cursor = *to;
} }
CurveItem::Cubic(c0, c1, end) => { CurveItem::Cubic(c0, c1, end) => {
@ -507,17 +499,17 @@ impl Curve {
); );
let bbox = cubic.bounding_box(); let bbox = cubic.bounding_box();
min_x = min_x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1)); min.x = min.x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1));
min_y = min_y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1)); min.y = min.y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1));
max_x = max_x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1)); max.x = max.x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1));
max_y = max_y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1)); max.y = max.y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1));
cursor = *end; cursor = *end;
} }
CurveItem::Close => (), CurveItem::Close => (),
} }
} }
Size::new(max_x - min_x, max_y - min_y) Size::new(max.x - min.x, max.y - min.y)
} }
} }

View File

@ -143,6 +143,16 @@ pub struct PackageInfo {
} }
impl PackageManifest { impl PackageManifest {
/// Create a new package manifest with the given package info.
pub fn new(package: PackageInfo) -> Self {
PackageManifest {
package,
template: None,
tool: ToolInfo::default(),
unknown_fields: UnknownFields::new(),
}
}
/// Ensure that this manifest is indeed for the specified package. /// Ensure that this manifest is indeed for the specified package.
pub fn validate(&self, spec: &PackageSpec) -> Result<(), EcoString> { pub fn validate(&self, spec: &PackageSpec) -> Result<(), EcoString> {
if self.package.name != spec.name { if self.package.name != spec.name {
@ -173,6 +183,44 @@ impl PackageManifest {
} }
} }
impl TemplateInfo {
/// Create a new template info with only required fields.
pub fn new(path: impl Into<EcoString>, entrypoint: impl Into<EcoString>) -> Self {
TemplateInfo {
path: path.into(),
entrypoint: entrypoint.into(),
thumbnail: None,
unknown_fields: UnknownFields::new(),
}
}
}
impl PackageInfo {
/// Create a new package info with only required fields.
pub fn new(
name: impl Into<EcoString>,
version: PackageVersion,
entrypoint: impl Into<EcoString>,
) -> Self {
PackageInfo {
name: name.into(),
version,
entrypoint: entrypoint.into(),
authors: vec![],
categories: vec![],
compiler: None,
description: None,
disciplines: vec![],
exclude: vec![],
homepage: None,
keywords: vec![],
license: None,
repository: None,
unknown_fields: BTreeMap::new(),
}
}
}
/// Identifies a package. /// Identifies a package.
#[derive(Clone, Eq, PartialEq, Hash)] #[derive(Clone, Eq, PartialEq, Hash)]
pub struct PackageSpec { pub struct PackageSpec {
@ -535,22 +583,11 @@ mod tests {
"# "#
), ),
Ok(PackageManifest { Ok(PackageManifest {
package: PackageInfo { package: PackageInfo::new(
name: "package".into(), "package",
version: PackageVersion { major: 0, minor: 1, patch: 0 }, PackageVersion { major: 0, minor: 1, patch: 0 },
entrypoint: "src/lib.typ".into(), "src/lib.typ"
authors: vec![], ),
license: None,
description: None,
homepage: None,
repository: None,
keywords: vec![],
categories: vec![],
disciplines: vec![],
compiler: None,
exclude: vec![],
unknown_fields: BTreeMap::new(),
},
template: None, template: None,
tool: ToolInfo { sections: BTreeMap::new() }, tool: ToolInfo { sections: BTreeMap::new() },
unknown_fields: BTreeMap::new(), unknown_fields: BTreeMap::new(),

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -130,6 +130,16 @@
down, up, down, up, down, down, up, down, up, down,
) )
--- curve-stroke-gradient-sharp ---
#set page(width: auto)
#let down = curve.line((40pt, 40pt), relative: true)
#let up = curve.line((40pt, -40pt), relative: true)
#curve(
stroke: 4pt + gradient.linear(red, blue).sharp(3),
down, up, down, up, down,
)
--- curve-fill-rule --- --- curve-fill-rule ---
#stack( #stack(
dir: ltr, dir: ltr,