mirror of
https://github.com/typst/typst
synced 2025-07-27 14:27:56 +08:00
Compare commits
5 Commits
fa41e1e07d
...
2a15199505
Author | SHA1 | Date | |
---|---|---|---|
|
2a15199505 | ||
|
7278d887cf | ||
|
c9cf6bab92 | ||
|
084a3dd0f2 | ||
|
2166f257c8 |
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(),
|
||||||
|
BIN
tests/ref/curve-stroke-gradient-sharp.png
Normal file
BIN
tests/ref/curve-stroke-gradient-sharp.png
Normal file
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 |
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user