48 lines
2.0 KiB
Rust
48 lines
2.0 KiB
Rust
//! Dashes fitted to corners are written as the canvas's filled outlines; exact dashes stay a
|
|
//! PDF dash array.
|
|
|
|
use vectorcraft_color::{Color, Paint};
|
|
use vectorcraft_doc::{Appearance, AppearanceItem, Dash, Document, Node, NodeId, StrokeLayer};
|
|
use vectorcraft_geom::{Rect, shapes};
|
|
use vectorcraft_testkit::raster::{assert_similar, render_artboard};
|
|
|
|
use crate::tests_stroke::{line_doc, painted_boxes};
|
|
use crate::*;
|
|
|
|
fn dashed(align_corners: bool) -> StrokeLayer {
|
|
let mut st = StrokeLayer::new(Paint::solid(Color::BLACK), 4.0);
|
|
st.dash = Some(Dash { pattern: vec![10.0, 10.0], offset: 0.0, align_corners });
|
|
st
|
|
}
|
|
|
|
#[test]
|
|
fn fitted_dashes_are_written_as_fills_and_exact_ones_as_a_dash_array() {
|
|
// 60 pt: three periods with half a dash at each end, so the dashes reach both end points.
|
|
let (fills, strokes) = painted_boxes(&line_doc(dashed(true)).0);
|
|
assert!(strokes.is_empty(), "{strokes:?}");
|
|
assert_eq!(fills.len(), 1);
|
|
let b = fills[0];
|
|
assert!((b.x0 - 20.0).abs() < 0.01 && (b.x1 - 80.0).abs() < 0.01 && (b.height() - 4.0).abs() < 0.01, "{b:?}");
|
|
let (d, _) = line_doc(dashed(false));
|
|
let back = import(&export(&d, &PdfOptions::default()).unwrap()).unwrap();
|
|
let mut dashes = vec![];
|
|
back.walk(|m| dashes.extend(m.appearance.stroke().and_then(|s| s.dash.clone())));
|
|
assert_eq!(dashes.len(), 1);
|
|
assert_eq!(dashes[0].pattern, vec![10.0, 10.0]);
|
|
}
|
|
|
|
#[test]
|
|
fn fitted_dashes_on_a_rectangle_look_as_on_the_canvas() {
|
|
let mut d = Document::new(140.0, 90.0);
|
|
let mut n = Node::path(
|
|
NodeId(0),
|
|
shapes::rectangle(Rect::new(20.0, 20.0, 120.0, 70.0)),
|
|
Appearance { items: vec![AppearanceItem::Stroke(dashed(true))], ..Default::default() },
|
|
);
|
|
n.id = d.alloc_id();
|
|
let layer = d.default_layer().unwrap();
|
|
d.insert(Some(layer), 0, n).unwrap();
|
|
let back = import(&export(&d, &PdfOptions::default()).unwrap()).unwrap();
|
|
assert_similar(&render_artboard(&d), &render_artboard(&back), 24.0, 0.002);
|
|
}
|