@@ -8,107 +8,111 @@ use glifparser::glif::{ContourOperations, MFEKContour, MFEKOutline};
88
99use log;
1010
11- fn unknown_op ( ) -> Option < ContourOperations < MFEKGlifPointData > > {
11+ fn unknown_op ( ) {
1212 log:: warn!( "Found unknown contour operation attached to contour. File was generated with newer MFEKglif, please upgrade to edit properly." ) ;
13- None
1413}
1514
1615fn unknown_op_outline ( ) -> MFEKOutline < MFEKGlifPointData > {
1716 unknown_op ( ) ;
1817 MFEKOutline :: new ( )
1918}
2019
21- pub trait ContourOperation {
20+ pub trait ContourOperationData {
2221 fn build ( & self , contour : & MFEKContour < MFEKGlifPointData > ) -> MFEKOutline < MFEKGlifPointData > ;
23- fn sub ( & self , contour : & MFEKContour < MFEKGlifPointData > , begin : usize , end : usize ) -> Self ;
22+ fn sub ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , begin : usize , end : usize ) ;
2423 fn append (
25- & self ,
24+ & mut self ,
2625 contour : & MFEKContour < MFEKGlifPointData > ,
2726 append : & MFEKContour < MFEKGlifPointData > ,
28- ) -> Self ;
29- fn insert ( & self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) -> Self ;
27+ ) ;
28+ fn remove ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) ;
29+ fn insert ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) ;
3030}
3131
32- pub fn sub (
33- contour : & MFEKContour < MFEKGlifPointData > ,
34- begin : usize ,
35- end : usize ,
36- ) -> Option < ContourOperations < MFEKGlifPointData > > {
37- let op = contour. operation . clone ( ) ;
38- op. as_ref ( ) ?;
32+ pub trait ContourOperation {
33+ fn build ( & self , contour : & MFEKContour < MFEKGlifPointData > ) -> MFEKOutline < MFEKGlifPointData > ;
34+ fn sub ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , begin : usize , end : usize ) ;
35+ fn append (
36+ & mut self ,
37+ contour : & MFEKContour < MFEKGlifPointData > ,
38+ append : & MFEKContour < MFEKGlifPointData > ,
39+ ) ;
40+ fn remove_op ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) ;
41+ fn insert_op ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) ;
42+ }
3943
40- match op. unwrap ( ) {
41- ContourOperations :: VariableWidthStroke { data } => {
42- Some ( ContourOperations :: VariableWidthStroke {
43- data : data. sub ( contour, begin, end) ,
44- } )
44+ impl ContourOperation for Option < ContourOperations < MFEKGlifPointData > > {
45+ fn sub ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , begin : usize , end : usize ) {
46+ if let Some ( op) = self . as_mut ( ) {
47+ match op {
48+ ContourOperations :: VariableWidthStroke { ref mut data } => {
49+ data. sub ( contour, begin, end)
50+ }
51+ ContourOperations :: PatternAlongPath { ref mut data } => {
52+ data. sub ( contour, begin, end)
53+ }
54+ ContourOperations :: DashAlongPath { ref mut data } => data. sub ( contour, begin, end) ,
55+ _ => unknown_op ( ) ,
56+ }
4557 }
46- ContourOperations :: PatternAlongPath { data } => Some ( ContourOperations :: PatternAlongPath {
47- data : data. sub ( contour, begin, end) ,
48- } ) ,
49- ContourOperations :: DashAlongPath { data } => Some ( ContourOperations :: DashAlongPath {
50- data : data. sub ( contour, begin, end) ,
51- } ) ,
52- _ => unknown_op ( ) ,
5358 }
54- }
5559
56- pub fn append (
57- contour : & MFEKContour < MFEKGlifPointData > ,
58- append : & MFEKContour < MFEKGlifPointData > ,
59- ) -> Option < ContourOperations < MFEKGlifPointData > > {
60- let op = contour. operation . clone ( ) ;
61- op. as_ref ( ) ?;
62-
63- match op. unwrap ( ) {
64- ContourOperations :: VariableWidthStroke { data } => {
65- Some ( ContourOperations :: VariableWidthStroke {
66- data : data. append ( contour, append) ,
67- } )
60+ fn append (
61+ & mut self ,
62+ contour : & MFEKContour < MFEKGlifPointData > ,
63+ append : & MFEKContour < MFEKGlifPointData > ,
64+ ) {
65+ if let Some ( op) = self . as_mut ( ) {
66+ match op {
67+ ContourOperations :: VariableWidthStroke { ref mut data } => {
68+ data. append ( contour, append)
69+ }
70+ ContourOperations :: PatternAlongPath { ref mut data } => {
71+ data. append ( contour, append)
72+ }
73+ ContourOperations :: DashAlongPath { ref mut data } => data. append ( contour, append) ,
74+ _ => unknown_op ( ) ,
75+ }
6876 }
69- ContourOperations :: PatternAlongPath { data } => Some ( ContourOperations :: PatternAlongPath {
70- data : data. append ( contour, append) ,
71- } ) ,
72- ContourOperations :: DashAlongPath { data } => Some ( ContourOperations :: DashAlongPath {
73- data : data. append ( contour, append) ,
74- } ) ,
75- _ => unknown_op ( ) ,
7677 }
77- }
7878
79- pub fn build ( contour : & MFEKContour < MFEKGlifPointData > ) -> MFEKOutline < MFEKGlifPointData > {
80- let op = contour. operation . clone ( ) ;
81- if op. is_none ( ) {
82- return vec ! [ contour. clone( ) ] ;
83- }
79+ fn build ( & self , contour : & MFEKContour < MFEKGlifPointData > ) -> MFEKOutline < MFEKGlifPointData > {
80+ let op = contour. operation . clone ( ) ;
81+ if op. is_none ( ) {
82+ return vec ! [ contour. clone( ) ] ;
83+ }
8484
85- match op. unwrap ( ) {
86- ContourOperations :: VariableWidthStroke { data } => data. build ( contour) ,
87- ContourOperations :: PatternAlongPath { data } => data. build ( contour) ,
88- ContourOperations :: DashAlongPath { data } => data. build ( contour) ,
89- _ => unknown_op_outline ( ) ,
85+ match op. unwrap ( ) {
86+ ContourOperations :: VariableWidthStroke { data } => data. build ( contour) ,
87+ ContourOperations :: PatternAlongPath { data } => data. build ( contour) ,
88+ ContourOperations :: DashAlongPath { data } => data. build ( contour) ,
89+ _ => unknown_op_outline ( ) ,
90+ }
9091 }
91- }
9292
93- pub fn insert (
94- contour : & MFEKContour < MFEKGlifPointData > ,
95- idx : usize ,
96- ) -> Option < ContourOperations < MFEKGlifPointData > > {
97- let op = contour. operation . clone ( ) ;
98- op. as_ref ( ) ?;
93+ fn insert_op ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) {
94+ if let Some ( op) = self . as_mut ( ) {
95+ match op {
96+ ContourOperations :: VariableWidthStroke { ref mut data } => {
97+ data. insert ( contour, idx)
98+ }
99+ ContourOperations :: PatternAlongPath { ref mut data } => data. insert ( contour, idx) ,
100+ ContourOperations :: DashAlongPath { ref mut data } => data. insert ( contour, idx) ,
101+ _ => unknown_op ( ) ,
102+ }
103+ }
104+ }
99105
100- match op. unwrap ( ) {
101- ContourOperations :: VariableWidthStroke { data } => {
102- Some ( ContourOperations :: VariableWidthStroke {
103- data : data. insert ( contour, idx) ,
104- } )
106+ fn remove_op ( & mut self , contour : & MFEKContour < MFEKGlifPointData > , idx : usize ) {
107+ if let Some ( op) = self . as_mut ( ) {
108+ match op {
109+ ContourOperations :: VariableWidthStroke { ref mut data } => {
110+ data. remove ( contour, idx)
111+ }
112+ ContourOperations :: PatternAlongPath { ref mut data } => data. remove ( contour, idx) ,
113+ ContourOperations :: DashAlongPath { ref mut data } => data. remove ( contour, idx) ,
114+ _ => unknown_op ( ) ,
115+ }
105116 }
106- ContourOperations :: PatternAlongPath { data } => Some ( ContourOperations :: PatternAlongPath {
107- data : data. insert ( contour, idx) ,
108- } ) ,
109- ContourOperations :: DashAlongPath { data } => Some ( ContourOperations :: DashAlongPath {
110- data : data. insert ( contour, idx) ,
111- } ) ,
112- _ => unknown_op ( ) ,
113117 }
114118}
0 commit comments