mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Fix clipping with outset (#5295)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
This commit is contained in:
parent
6dd05cc17a
commit
45377f25ec
@ -84,8 +84,7 @@ pub fn layout_single_block(
|
|||||||
|
|
||||||
// Clip the contents, if requested.
|
// Clip the contents, if requested.
|
||||||
if elem.clip(styles) {
|
if elem.clip(styles) {
|
||||||
let size = frame.size() + outset.relative_to(frame.size()).sum_by_axis();
|
frame.clip(clip_rect(frame.size(), &radius, &stroke, &outset));
|
||||||
frame.clip(clip_rect(size, &radius, &stroke));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add fill and/or stroke.
|
// Add fill and/or stroke.
|
||||||
@ -231,8 +230,7 @@ pub fn layout_multi_block(
|
|||||||
|
|
||||||
// Clip the contents, if requested.
|
// Clip the contents, if requested.
|
||||||
if clip {
|
if clip {
|
||||||
let size = frame.size() + outset.relative_to(frame.size()).sum_by_axis();
|
frame.clip(clip_rect(frame.size(), &radius, &stroke, &outset));
|
||||||
frame.clip(clip_rect(size, &radius, &stroke));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add fill and/or stroke.
|
// Add fill and/or stroke.
|
||||||
|
@ -61,8 +61,7 @@ pub fn layout_box(
|
|||||||
|
|
||||||
// Clip the contents, if requested.
|
// Clip the contents, if requested.
|
||||||
if elem.clip(styles) {
|
if elem.clip(styles) {
|
||||||
let size = frame.size() + outset.relative_to(frame.size()).sum_by_axis();
|
frame.clip(clip_rect(frame.size(), &radius, &stroke, &outset));
|
||||||
frame.clip(clip_rect(size, &radius, &stroke));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add fill and/or stroke.
|
// Add fill and/or stroke.
|
||||||
|
@ -412,7 +412,11 @@ pub fn clip_rect(
|
|||||||
size: Size,
|
size: Size,
|
||||||
radius: &Corners<Rel<Abs>>,
|
radius: &Corners<Rel<Abs>>,
|
||||||
stroke: &Sides<Option<FixedStroke>>,
|
stroke: &Sides<Option<FixedStroke>>,
|
||||||
|
outset: &Sides<Rel<Abs>>,
|
||||||
) -> Path {
|
) -> Path {
|
||||||
|
let outset = outset.relative_to(size);
|
||||||
|
let size = size + outset.sum_by_axis();
|
||||||
|
|
||||||
let stroke_widths = stroke
|
let stroke_widths = stroke
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0));
|
.map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0));
|
||||||
@ -441,6 +445,7 @@ pub fn clip_rect(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
path.close_path();
|
path.close_path();
|
||||||
|
path.translate(Point::new(-outset.left, -outset.top));
|
||||||
path
|
path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use kurbo::ParamCurveExtrema;
|
use kurbo::ParamCurveExtrema;
|
||||||
|
use typst_utils::Numeric;
|
||||||
|
|
||||||
use self::PathVertex::{AllControlPoints, MirroredControlPoint, Vertex};
|
use self::PathVertex::{AllControlPoints, MirroredControlPoint, Vertex};
|
||||||
use crate::diag::{bail, SourceResult};
|
use crate::diag::{bail, SourceResult};
|
||||||
@ -228,6 +229,25 @@ impl Path {
|
|||||||
self.0.push(PathItem::ClosePath);
|
self.0.push(PathItem::ClosePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Translate all points in this path by the given offset.
|
||||||
|
pub fn translate(&mut self, offset: Point) {
|
||||||
|
if offset.is_zero() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for item in self.0.iter_mut() {
|
||||||
|
match item {
|
||||||
|
PathItem::MoveTo(p) => *p += offset,
|
||||||
|
PathItem::LineTo(p) => *p += offset,
|
||||||
|
PathItem::CubicTo(p1, p2, p3) => {
|
||||||
|
*p1 += offset;
|
||||||
|
*p2 += offset;
|
||||||
|
*p3 += offset;
|
||||||
|
}
|
||||||
|
PathItem::ClosePath => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Computes the size of bounding box of this path.
|
/// Computes the size of bounding box of this path.
|
||||||
pub fn bbox_size(&self) -> Size {
|
pub fn bbox_size(&self) -> Size {
|
||||||
let mut min_x = Abs::inf();
|
let mut min_x = Abs::inf();
|
||||||
|
BIN
tests/ref/box-clip-outset.png
Normal file
BIN
tests/ref/box-clip-outset.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
@ -251,6 +251,19 @@ First!
|
|||||||
image("/assets/images/rhino.png", width: 30pt)
|
image("/assets/images/rhino.png", width: 30pt)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
--- box-clip-outset ---
|
||||||
|
// Test clipping with `outset`.
|
||||||
|
#set page(height: 60pt)
|
||||||
|
|
||||||
|
#box(
|
||||||
|
outset: 5pt,
|
||||||
|
stroke: 2pt + black,
|
||||||
|
width: 20pt,
|
||||||
|
height: 20pt,
|
||||||
|
clip: true,
|
||||||
|
image("/assets/images/rhino.png", width: 30pt)
|
||||||
|
)
|
||||||
|
|
||||||
--- container-layoutable-child ---
|
--- container-layoutable-child ---
|
||||||
// Test box/block sizing with directly layoutable child.
|
// Test box/block sizing with directly layoutable child.
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user