Clone in a terminal:
Commit f509f14
Johan Mattsson - 2015-08-11T17:06:12+00:00
f509f1457190763abf12d911ebda20135c3d1b69johan.mattsson.m@gmail.com

Merge counters with outlines

Changed files (2)

Diff

diff --git a/libbirdfont/Intersection.vala b/libbirdfont/Intersection.valaindex a6dc77d..fdfb34b 100644--- a/libbirdfont/Intersection.vala+++ b/libbirdfont/Intersection.vala@@ -94,15 +94,27 @@ public class IntersectionList : GLib.Object { 	public Intersection get_point (EditPoint ep, out bool other) { 		other = false; 		foreach (Intersection i in points) {-			if (i.other_point == ep || i.point == ep) {+			if (likely (i.other_point == ep || i.point == ep)) { 				other = (i.other_point == ep); 				return i; 			}	 		} 		-		warning ("No intersection found for point.");+		warning (@"No intersection found for point ($(ep.x), $(ep.y)).\n");+		 		return new Intersection.empty (); 	}++	public bool has_point (EditPoint ep) {+		foreach (Intersection i in points) {+			if (i.other_point == ep || i.point == ep) {+				return true;+			}	+		}+		+		return false;+	}+ }  }diff --git a/libbirdfont/StrokeTool.vala b/libbirdfont/StrokeTool.valaindex b6ad0d7..bbbba2d 100644--- a/libbirdfont/StrokeTool.vala+++ b/libbirdfont/StrokeTool.vala@@ -125,9 +125,18 @@ public class StrokeTool : Tool { 				if (i == j) { 					continue; 				}-				+						 				r = merge_selected (p1, p2); +				// FIXME: delete+				foreach (Path p in r.paths) {+					((!) BirdFont.get_current_font ().get_glyph_by_name ("c")).add_path (p.copy ());+				}+				+				// FIXME: delete+				((!) BirdFont.get_current_font ().get_glyph_by_name ("d")).add_path (p1.copy ());+				((!) BirdFont.get_current_font ().get_glyph_by_name ("d")).add_path (p2.copy ());+				 				remove_merged_curve_parts (r); 				 				// FIXME: delete@@ -145,10 +154,7 @@ public class StrokeTool : Tool { 					} 					 					new_paths.append (r);-					/*o.paths.remove (p1);-					o.paths.remove (p2);-					*/-					+			 					removed_paths.add (p1); 					removed_paths.add (p2); 					@@ -164,8 +170,6 @@ public class StrokeTool : Tool { 			} 		} 		-		//o.append (new_paths);-		 		foreach (Path p in removed_paths.paths) { 			g.delete_path (p); 		}@@ -212,13 +216,13 @@ public class StrokeTool : Tool { 			if (p.is_clockwise ()) { 				int c = clockwise - counters; 				if (c % 2 == 0) {-					//remove.add (p);+					remove.add (p); 					break; 				} 			} else { 				int c = clockwise - counters; 				if (c % 2 == 1) {-					//remove.add (p);+					remove.add (p); 					break; 				} 			}@@ -261,6 +265,10 @@ public class StrokeTool : Tool { 		foreach (Path p in flat.paths) { 			foreach (EditPoint ep in p.points) { 				if ((ep.flags & EditPoint.SPLIT_POINT) > 0) {+					+					// FIXME: DELETE+					ep.color = Color.pink ();+					 					foreach (Path pp in o.paths) { 						EditPoint lep = new EditPoint (); 						pp.get_closest_point_on_path (lep, ep.x, ep.y, null, null);@@ -363,6 +371,7 @@ public class StrokeTool : Tool { 			} 		} +		// FIXME: delete 		foreach (Path p in o.paths) { 			((!) BirdFont.get_current_font ().get_glyph_by_name ("a")).add_path (p); 		}@@ -476,6 +485,7 @@ public class StrokeTool : Tool { 				 				found.flags |= EditPoint.COPIED; 				+				print (@"Intersection in $(path1.points.size) ($(ep1.x),$(ep1.y)) and $(path2.points.size) ($(found.x),$(found.y))\n"); 				ep1.tie_handles = false; 				ep1.reflective_point = false; 				found.tie_handles = false;@@ -547,56 +557,57 @@ public class StrokeTool : Tool { 					 					previous = ep1; 					-					print (@"INTERSECTION: $(ep1.x), $(ep1.y)\n");-					new_start = intersections.get_point (ep1, out other);-					current = new_start.get_other_path (current);-					i = index_of (current, new_start.get_point (current));-					-					if (!(0 <= i < current.points.size)) {-						warning (@"Index out of bounds. ($i)");-						return r;-					}-					-					ep1 = current.points.get (i);-					ep2 = current.points.get ((i + 1) % current.points.size); -				-					double px, py;-					-					Path.get_point_for_step (ep1, ep2, 0.5, out px, out py);--					// FIXME: merging outline with counters-					-					bool inside = (current == path1 && flat2.is_over_coordinate (px, py))-						|| (current == path2 && flat1.is_over_coordinate (px, py));-					-					bool other_inside = (current != path1 && flat2.is_over_coordinate (px, py))-						|| (current != path2 && flat1.is_over_coordinate (px, py));-										-					if (inside && !other_inside) {+					if (intersections.has_point (ep1)) {+						print (@"INTERSECTION: $(ep1.x), $(ep1.y)\n");+						new_start = intersections.get_point (ep1, out other); 						current = new_start.get_other_path (current); 						i = index_of (current, new_start.get_point (current)); 						 						if (!(0 <= i < current.points.size)) {-							warning (@"Index out of bounds. ($i >= $(current.points.size)) ");+							warning (@"Index out of bounds. ($i)"); 							return r; 						} 						-						new_start.done = true; 						ep1 = current.points.get (i);-					} +						ep2 = current.points.get ((i + 1) % current.points.size);  					-					inside = (current == path1 && flat2.is_over_coordinate (px, py))-						|| (current == path2 && flat1.is_over_coordinate (px, py));-	-					if (first) {-						previous = new_start.get_other_path (current).get_first_point ();-						first = false;+						double px, py;+						+						Path.get_point_for_step (ep1, ep2, 0.5, out px, out py);+						bool inside = (current == path1 && flat2.is_over_coordinate (px, py))+							|| (current == path2 && flat1.is_over_coordinate (px, py));+						+						bool other_inside = (current != path1 && flat2.is_over_coordinate (px, py))+							|| (current != path2 && flat1.is_over_coordinate (px, py));+											+						if (inside && !other_inside) {+							current = new_start.get_other_path (current);+							i = index_of (current, new_start.get_point (current));++							if (!(0 <= i < current.points.size)) {+								warning (@"Index out of bounds. ($i >= $(current.points.size)) ");+								return r;+							}+							+							new_start.done = true;+							ep1 = current.points.get (i);+						} +						+						inside = (current == path1 && flat2.is_over_coordinate (px, py))+							|| (current == path2 && flat1.is_over_coordinate (px, py));+		+						if (first) {+							previous = new_start.get_other_path (current).get_first_point ();+							first = false;+						}+					} else {+						warning (@"Intersection not in list, $(ep1.x), $(ep1.y)\n"); 					} 				} 				 				if ((ep1.flags & EditPoint.SELF_INTERSECTION) > 0) { 					bool other;-					print ("SELF_INTERSECTION:\n");+					print (@"SELF_INTERSECTION: $(ep1.x), $(ep1.y)\n"); 					new_start = intersections.get_point (ep1, out other); 					i = index_of (current, other ? new_start.point : new_start.other_point); 					

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112