@@ -277,6 +277,7 @@ fn test_dashed_path_element() {
277
277
/// It's similar to [`PathElement`] but use a marker function to draw markers with spacing.
278
278
pub struct DottedPathElement < I : Iterator + Clone , Size : SizeDesc , Marker > {
279
279
points : I ,
280
+ shift : Size ,
280
281
spacing : Size ,
281
282
func : Box < dyn Fn ( BackendCoord ) -> Marker > ,
282
283
}
@@ -287,13 +288,14 @@ impl<I: Iterator + Clone, Size: SizeDesc, Marker> DottedPathElement<I, Size, Mar
287
288
/// - `spacing`: The spacing between markers
288
289
/// - `func`: The marker function
289
290
/// - returns the created element
290
- pub fn new < I0 , F > ( points : I0 , spacing : Size , func : F ) -> Self
291
+ pub fn new < I0 , F > ( points : I0 , shift : Size , spacing : Size , func : F ) -> Self
291
292
where
292
293
I0 : IntoIterator < IntoIter = I > ,
293
294
F : Fn ( BackendCoord ) -> Marker + ' static ,
294
295
{
295
296
Self {
296
297
points : points. into_iter ( ) ,
298
+ shift,
297
299
spacing,
298
300
func : Box :: new ( func) ,
299
301
}
@@ -324,25 +326,19 @@ where
324
326
ps : ( u32 , u32 ) ,
325
327
) -> Result < ( ) , DrawingErrorKind < DB :: ErrorType > > {
326
328
let mut start = match points. next ( ) {
327
- Some ( start_i) => {
328
- ( self . func ) ( start_i)
329
- . into_dyn ( )
330
- . draw ( std:: iter:: once ( start_i) , backend, ps) ?;
331
- to_f ( start_i)
332
- }
329
+ Some ( c) => to_f ( c) ,
333
330
None => return Ok ( ( ) ) ,
334
331
} ;
332
+ let mut shift = self . shift . in_pixels ( & ps) . max ( 0 ) as f32 ;
335
333
let spacing = self . spacing . in_pixels ( & ps) . max ( 0 ) as f32 ;
336
- if spacing == 0. {
337
- return Ok ( ( ) ) ;
338
- }
339
334
let mut dist = 0. ;
340
335
for curr in points {
341
336
let end = to_f ( curr) ;
342
337
// Loop for spacing
343
338
while start != end {
344
339
let ( dx, dy) = ( end. 0 - start. 0 , end. 1 - start. 1 ) ;
345
340
let d = dx. hypot ( dy) ;
341
+ let spacing = if shift == 0. { spacing } else { shift } ;
346
342
let left = spacing - dist;
347
343
// Set next point to `start`
348
344
if left < d {
@@ -360,6 +356,7 @@ where
360
356
. into_dyn ( )
361
357
. draw ( std:: iter:: once ( start_i) , backend, ps) ?;
362
358
dist = 0. ;
359
+ shift = 0. ;
363
360
}
364
361
}
365
362
}
@@ -374,11 +371,12 @@ fn test_dotted_path_element() {
374
371
let da = crate :: create_mocked_drawing_area ( 300 , 300 , |m| {
375
372
m. drop_check ( |b| {
376
373
assert_eq ! ( b. num_draw_path_call, 0 ) ;
377
- assert_eq ! ( b. draw_count, 8 ) ;
374
+ assert_eq ! ( b. draw_count, 7 ) ;
378
375
} ) ;
379
376
} ) ;
380
377
da. draw ( & DottedPathElement :: new (
381
378
vec ! [ ( 100 , 100 ) , ( 105 , 105 ) , ( 150 , 150 ) ] ,
379
+ 5 ,
382
380
10 ,
383
381
|c| Circle :: new ( c, 5 , Into :: < ShapeStyle > :: into ( RED ) . filled ( ) ) ,
384
382
) )
0 commit comments