Clone in a terminal:
Commit 0e2d170
Johan Mattsson - 2015-12-17T23:11:53+00:00
0e2d1709ec7e3b9aadcfdd83afa0e526756bc769johan.mattsson.m@gmail.com

Allow changing proportions when glyphs are resized

Changed files (8)

Diff

diff --git a/libbirdfont/CircleTool.vala b/libbirdfont/CircleTool.valaindex 81e333a..656b4f6 100644--- a/libbirdfont/CircleTool.vala+++ b/libbirdfont/CircleTool.vala@@ -73,7 +73,7 @@ public class CircleTool : Tool { 			ratio = 2 * radius / diameter; 			 			if (diameter * ratio > 0.5) {-				circle.resize (ratio);+				circle.resize (ratio, ratio); 			} 			 			get_boundaries (out xmin, out xmax, out ymin);diff --git a/libbirdfont/DrawingTools.vala b/libbirdfont/DrawingTools.valaindex 0a650ab..771f81c 100644--- a/libbirdfont/DrawingTools.vala+++ b/libbirdfont/DrawingTools.vala@@ -419,7 +419,7 @@ public class DrawingTools : ToolCollection  { 			new_size = self.get_value () / w; 			 			if (self.get_value () > 0 && new_size != 1) {-				resize_tool.resize_selected_paths (new_size);+				resize_tool.resize_selected_paths (new_size, new_size); 			} 			 			GlyphCanvas.redraw ();@@ -444,7 +444,7 @@ public class DrawingTools : ToolCollection  { 			new_size = self.get_value () / h; 			 			if (self.get_value () > 0 && new_size != 1) {-				resize_tool.resize_selected_paths (new_size);+				resize_tool.resize_selected_paths (new_size, new_size); 			} 						 			GlyphCanvas.redraw ();diff --git a/libbirdfont/EditPoint.vala b/libbirdfont/EditPoint.valaindex 337c3d6..d5d6be7 100644--- a/libbirdfont/EditPoint.vala+++ b/libbirdfont/EditPoint.vala@@ -145,8 +145,8 @@ public class EditPoint : GLib.Object { 		set {  			double d = value - x; 			x = value;-			right_handle.x -= d;-			left_handle.x -= d;+			right_handle.independent_x -= d;+			left_handle.independent_x -= d; 		} 	} @@ -158,8 +158,8 @@ public class EditPoint : GLib.Object { 		set {  			double d = value - y; 			y = value;-			right_handle.y -= d;-			left_handle.y -= d;+			right_handle.independent_y -= d;+			left_handle.independent_y -= d; 		} 	} 	diff --git a/libbirdfont/EditPointHandle.vala b/libbirdfont/EditPointHandle.valaindex 6ba7c02..f550122 100644--- a/libbirdfont/EditPointHandle.vala+++ b/libbirdfont/EditPointHandle.vala@@ -77,7 +77,41 @@ public class EditPointHandle : GLib.Object { 			} 		} 	}-	++	public double independent_x {+		get { +			double r = px ();	+			+			if (unlikely (r <= -100000)) {+				print_position ();+				move_to (0, 0);+			}+		+			return r;+		}+		+		set { +			move_to_coordinate_internal (value, py ());+		}+	}++	public double independent_y {+		get {+			double r = py ();+		+			if (unlikely (r <= -100000)) {+				print_position ();+				move_to (0, 0);+			}+			+			return r;	+		}+		+		set { +			move_to_coordinate_internal (px (), value);	+		}+	}+		 	public EditPointHandle.empty() { 		this.parent = none; 		this.angle = 0;diff --git a/libbirdfont/OverviewTools.vala b/libbirdfont/OverviewTools.valaindex c6f9d78..d36d39c 100644--- a/libbirdfont/OverviewTools.vala+++ b/libbirdfont/OverviewTools.vala@@ -270,7 +270,7 @@ public class OverviewTools : ToolCollection  { 				 				if (resize.get_value () != 100) { 					double scale = resize.get_value () / 100;-					DrawingTools.resize_tool.resize_glyph (g, scale, false);+					DrawingTools.resize_tool.resize_glyph (g, scale, scale, false); 				} 			} 		}diff --git a/libbirdfont/Path.vala b/libbirdfont/Path.valaindex 6bd4f8f..c5fdcc2 100644--- a/libbirdfont/Path.vala+++ b/libbirdfont/Path.vala@@ -754,18 +754,20 @@ public class Path : GLib.Object { 	}  	/** Resize path relative to bottom left coordinates. */-	public void resize (double ratio) {	+	public void resize (double ratio_x, double ratio_y) {	 		foreach (EditPoint p in points) {-			p.x *= ratio;-			p.y *= ratio;-			p.right_handle.length *= ratio;-			p.left_handle.length *= ratio;-		}-		-		xmin *= ratio;	-		xmax *= ratio;-		ymin *= ratio;-		ymax *= ratio;+			p.independent_x *= ratio_x;+			p.independent_y *= ratio_y;+			p.get_right_handle ().independent_x *= ratio_x;+			p.get_right_handle ().independent_y *= ratio_y;+			p.get_left_handle ().independent_x *= ratio_x;+			p.get_left_handle ().independent_y *= ratio_y;+		}+		+		xmin *= ratio_x;	+		xmax *= ratio_x;+		ymin *= ratio_y;+		ymax *= ratio_y; 	}  	public void scale (double scale_x, double scale_y) {		diff --git a/libbirdfont/ResizeTool.vala b/libbirdfont/ResizeTool.valaindex 48f0139..8e22ca1 100644--- a/libbirdfont/ResizeTool.vala+++ b/libbirdfont/ResizeTool.vala@@ -18,8 +18,9 @@ using Cairo; namespace BirdFont {  public class ResizeTool : Tool {-	-	bool resize_path = false;+	bool resize_path_proportional = false;+	bool resize_width = false;+ 	Path? resized_path = null; 	double last_resize_y; 	double last_resize_x;@@ -41,8 +42,19 @@ public class ResizeTool : Tool { 	public signal void objects_rotated (double angle); 	public signal void objects_resized (double width, double height); 	+	Text proportional_handle;+	Text horizontal_handle;+	 	public ResizeTool (string n) { 		base (n, t_("Resize and rotate paths"));++		proportional_handle = new Text ("resize_handle", 60);+		proportional_handle.load_font ("icons.bf");+		Theme.text_color (proportional_handle, "Highlighted 1");++		horizontal_handle = new Text ("resize_handle_horizontal", 60);+		horizontal_handle.load_font ("icons.bf");+		Theme.text_color (horizontal_handle, "Highlighted 1"); 	 		select_action.connect((self) => { 		});@@ -59,17 +71,16 @@ public class ResizeTool : Tool { 			 			foreach (Path p in glyph.active_paths) { 				if (is_over_resize_handle (p, x, y)) {-					resize_path = true;+					resize_path_proportional = true; 					resized_path = p; 					last_resize_x = x; 					last_resize_y = y; 					return; 				}-			}-			-			if (resized_path != null) {-				if (is_over_resize_handle ((!) resized_path, x, y)) {-					resize_path = true;++				if (is_over_horizontal_resize_handle (p, x, y)) {+					resize_width = true;+					resized_path = p; 					last_resize_x = x; 					last_resize_y = y; 					return;					@@ -85,14 +96,16 @@ public class ResizeTool : Tool {  			if (glyph.active_paths.size > 0) { 				last_path = glyph.active_paths.get (glyph.active_paths.size - 1);-				last_rotate = last_path.rotation ;+				last_rotate = last_path.rotation; 			} 					 			rotation = last_rotate; 			last_resize_x = x; 			last_rotate_y = y; 			-			DrawingTools.move_tool.press (b, x, y);+			if (!resize_path_proportional && !resize_width && !rotate_path) {+				DrawingTools.move_tool.press (b, x, y);+			} 			 			move_paths = true; 			@@ -100,7 +113,8 @@ public class ResizeTool : Tool { 		});  		release_action.connect((self, b, x, y) => {-			resize_path = false;+			resize_path_proportional = false;+			resize_width = false; 			rotate_path = false; 			move_paths = false; 			DrawingTools.move_tool.release (b, x, y);@@ -115,22 +129,32 @@ public class ResizeTool : Tool { 		move_action.connect ((self, x, y)	 => { 			Glyph glyph; 			-			if (resize_path && can_resize (x, y)) {-				resize (x, y);+			if (resize_path_proportional && can_resize (x, y)) {+				resize_proportional (x, y);+				update_selection_box ();+			}++			if (resize_width && can_resize (x, y)) {+				resize_horizontal (x, y);+				update_selection_box (); 			}  			if (rotate_path) { 				rotate (x, y);+				update_selection_box (); 			} -			if (move_paths || rotate_path || resize_path) {+			if (move_paths +				|| rotate_path+				|| resize_path_proportional+				|| resize_width) {+				 				glyph = MainWindow.get_current_glyph (); 				 				foreach (Path selected_path in glyph.active_paths) { 					selected_path.reset_stroke (); 				} 				-				update_selection_box (); 				GlyphCanvas.redraw (); 			} 			@@ -142,19 +166,32 @@ public class ResizeTool : Tool { 			Glyph g = MainWindow.get_current_glyph (); 			 			if (!rotate_path) {-				handle = new Text ("resize_handle", 60 * MainWindow.units);-				handle.load_font ("icons.bf");-				-				get_reseize_handle_position (out handle.widget_x, out handle.widget_y);-				-				handle.widget_x -= handle.get_sidebearing_extent () / 2;-				handle.widget_y -= handle.get_height () / 2;+				if (!resize_width) {+					handle = proportional_handle;+					get_resize_handle_position (out handle.widget_x, out handle.widget_y);+					+					handle.widget_x -= handle.get_sidebearing_extent () / 2;+					handle.widget_y -= handle.get_height () / 2;+					+					handle.draw (cr);+				}  				-				Theme.text_color (handle, "Highlighted 1");-				handle.draw (cr);+				if (!resize_path_proportional) {+					handle = horizontal_handle;+					+					get_horizontal_reseize_handle_position (out handle.widget_x, +						out handle.widget_y);+					+					handle.widget_x -= handle.get_sidebearing_extent () / 2;+					handle.widget_y -= handle.get_height () / 2;+					+					handle.draw (cr);+				} 			}-			-			if (!resize_path && g.active_paths.size > 0) {++			if (!resize_path_proportional && !resize_width +				&& g.active_paths.size > 0) {+				 				draw_rotate_handle (cr); 			} 		@@ -166,11 +203,17 @@ public class ResizeTool : Tool { 		}); 	} -	public static void get_reseize_handle_position (out double px, out double py) {+	public static void get_resize_handle_position (out double px, out double py) { 		px = Glyph.reverse_path_coordinate_x (selection_box_center_x + selection_box_width / 2); 		py = Glyph.reverse_path_coordinate_y (selection_box_center_y + selection_box_height / 2); 	} +	public static void get_horizontal_reseize_handle_position (out double px, out double py) {+		px = Glyph.reverse_path_coordinate_x (selection_box_center_x + selection_box_width / 2);+		px += 40;+		py = Glyph.reverse_path_coordinate_y (selection_box_center_y);+	}+ 	public static double get_rotated_handle_length () { 		double s, hx, hy; 		double d;@@ -306,12 +349,14 @@ public class ResizeTool : Tool { 		return ratio; 	} -	public void resize_selected_paths (double ratio) {+	public void resize_selected_paths (double ratio_x, double ratio_y) { 		Glyph g = MainWindow.get_current_glyph ();-		resize_glyph (g, ratio, true);+		resize_glyph (g, ratio_x, ratio_y, true); 	} 	-	public void resize_glyph (Glyph glyph, double ratio, bool selected = true) {+	public void resize_glyph (Glyph glyph, double ratio_x,+			double ratio_y, bool selected = true) {+					 		double resize_pos_x = 0; 		double resize_pos_y = 0; 		double selection_minx, selection_miny, dx, dy;@@ -328,7 +373,7 @@ public class ResizeTool : Tool { 		 		// resize paths 		foreach (Path selected_path in glyph.active_paths) {-			selected_path.resize (ratio);+			selected_path.resize (ratio_x, ratio_y); 			selected_path.reset_stroke (); 		} 		@@ -348,7 +393,7 @@ public class ResizeTool : Tool {  		if (!selected) { 			double w;-			w = (ratio * glyph.get_width () - glyph.get_width ()) / 2.0;+			w = (ratio_x * glyph.get_width () - glyph.get_width ()) / 2.0; 			glyph.left_limit -= w;  			glyph.right_limit += w; 			glyph.clear_active_paths ();@@ -365,18 +410,35 @@ public class ResizeTool : Tool { 	}  	/** Move resize handle to pixel x,y. */-	void resize (double px, double py) {+	void resize_proportional (double px, double py) { 		double ratio; 		 		ratio = get_resize_ratio (px, py); 		 		if (ratio != 1) {-			resize_selected_paths (ratio);+			resize_selected_paths (ratio, ratio); 			last_resize_x = px; 			last_resize_y = py; 		} 	} +	/** Move resize handle to pixel x,y. */+	void resize_horizontal (double px, double py) {+		double ratio, x, y, w, h;++		Glyph glyph = MainWindow.get_current_glyph ();+		glyph.selection_boundaries (out x, out y, out w, out h);+				+		ratio = 1 + (Glyph.path_coordinate_x (px) +			- Glyph.path_coordinate_x (last_resize_x)) / w;+		+		if (ratio != 1) {+			resize_selected_paths (ratio, 1);+			last_resize_x = px;+			last_resize_y = py;+		}+	}+	 	public void full_height () { 		double xc, yc, w, h; 		Glyph glyph = MainWindow.get_current_glyph ();@@ -395,7 +457,7 @@ public class ResizeTool : Tool { 		double font_height = font.top_position - font.base_line; 		double scale = font_height / (h - descender); 		-		resize_selected_paths (scale);+		resize_selected_paths (scale, scale); 		PenTool.reset_stroke ();  		MoveTool.update_boundaries_for_selection ();@@ -406,10 +468,8 @@ public class ResizeTool : Tool { 											   out selection_box_width, 											   out selection_box_height); 		-		 		DrawingTools.move_tool.move_to_baseline (); -		 		foreach (Path path in glyph.active_paths) { 			path.move (0, -descender * scale); 		}@@ -455,10 +515,16 @@ public class ResizeTool : Tool {  	bool is_over_resize_handle (Path p, double x, double y) { 		double handle_x, handle_y;-		get_reseize_handle_position (out handle_x, out handle_y);+		get_resize_handle_position (out handle_x, out handle_y); 		return Path.distance (handle_x, x, handle_y, y) < 12 * MainWindow.units; 	} +	bool is_over_horizontal_resize_handle (Path p, double x, double y) {+		double handle_x, handle_y;+		get_horizontal_reseize_handle_position (out handle_x, out handle_y);+		return Path.distance (handle_x, x, handle_y, y) < 12 * MainWindow.units;		+	}+ 	public void skew (double skew) { 		Glyph glyph = MainWindow.get_current_glyph (); 		skew_glyph (glyph, skew, last_skew, true);diff --git a/resources/icons.bf b/resources/icons.bfindex 5196dd6..5463d1b 100644--- a/resources/icons.bf+++ b/resources/icons.bf@@ -1249,6 +1249,15 @@ GNU Lesser General Public License</copyright> 	</glyph> </collection> +<collection name="resize_handle_horizontal">+	<selected id="0"/>+	<glyph id="0" left="-28" right="20.375000000000004">+		<layer name= "Layer" visible="true">+			<path data="S 13.0974637156,26.9541020266 L -15.4077784009,-1.5511400900 L -15.4077784009,55.4593441432 L 13.0974637156,26.9541020266" />+		</layer>+	</glyph>+</collection>+ <collection name="resize_overview"> 	<selected id="0"/> 	<glyph id="0" left="-28" right="28">@@ -1746,107 +1755,108 @@ GNU Lesser General Public License</copyright> <ligature sequence="o r i e n t a t i o n _ c o u n t e r _ c l o c k w i s e" replacement="orientation_counter_clockwise"/> <ligature sequence="i n s e r t _ g l y p h _ f r o m _ o v e r v i e w" replacement="insert_glyph_from_overview"/> <ligature sequence="h i g h _ c o n t r a s t _ b a c k g r o u n d" replacement="high_contrast_background"/>+<ligature sequence="r e s i z e _ h a n d l e _ h o r i z o n t a l" replacement="resize_handle_horizontal"/> <ligature sequence="p r e v i o u s _ k e r n i n g _ s t r i n g" replacement="previous_kerning_string"/>-<ligature sequence="s h o w _ x h e i g h t _ h e l p l i n e s" replacement="show_xheight_helplines"/> <ligature sequence="g e n e r a t e _ h t m l _ d o c u m e n t" replacement="generate_html_document"/>-<ligature sequence="s h o w _ a l l _ l i n e _ h a n d l e s" replacement="show_all_line_handles"/>-<ligature sequence="b a c k g r o u n d _ h e l p _ l i n e s" replacement="background_help_lines"/>-<ligature sequence="a u t o _ t r a c e _ r e s o l u t i o n" replacement="auto_trace_resolution"/>-<ligature sequence="z o o m _ b a c k g r o u n d _ i m a g e" replacement="zoom_background_image"/>+<ligature sequence="s h o w _ x h e i g h t _ h e l p l i n e s" replacement="show_xheight_helplines"/> <ligature sequence="o r i e n t a t i o n _ c l o c k w i s e" replacement="orientation_clockwise"/>-<ligature sequence="a u t o _ t r a c e _ s i m p l i f y" replacement="auto_trace_simplify"/>+<ligature sequence="z o o m _ b a c k g r o u n d _ i m a g e" replacement="zoom_background_image"/>+<ligature sequence="a u t o _ t r a c e _ r e s o l u t i o n" replacement="auto_trace_resolution"/>+<ligature sequence="b a c k g r o u n d _ h e l p _ l i n e s" replacement="background_help_lines"/>+<ligature sequence="s h o w _ a l l _ l i n e _ h a n d l e s" replacement="show_all_line_handles"/> <ligature sequence="n e x t _ k e r n i n g _ s t r i n g" replacement="next_kerning_string"/>-<ligature sequence="k e r n i n g _ t e x t _ i n p u t" replacement="kerning_text_input"/>+<ligature sequence="a u t o _ t r a c e _ s i m p l i f y" replacement="auto_trace_simplify"/> <ligature sequence="c o n t r a s t _ t h r e s h o l d" replacement="contrast_threshold"/>-<ligature sequence="o r i e n t a t i o n _ a r r o w" replacement="orientation_arrow"/>-<ligature sequence="d e l e t e _ b a c k g r o u n d" replacement="delete_background"/>-<ligature sequence="n e w _ p o i n t _ o n _ p a t h" replacement="new_point_on_path"/>-<ligature sequence="i n s e r t _ b a c k g r o u n d" replacement="insert_background"/>-<ligature sequence="s e l e c t _ b a c k g r o u n d" replacement="select_background"/>-<ligature sequence="s t r o k e _ t o _ o u t l i n e" replacement="stroke_to_outline"/>+<ligature sequence="k e r n i n g _ t e x t _ i n p u t" replacement="kerning_text_input"/> <ligature sequence="c u r v e _ o r i e n t a t i o n" replacement="curve_orientation"/>-<ligature sequence="s c a l e _ b a c k g r o u n d" replacement="scale_background"/>-<ligature sequence="q u a d r a t i c _ p o i n t s" replacement="quadratic_points"/>+<ligature sequence="s t r o k e _ t o _ o u t l i n e" replacement="stroke_to_outline"/>+<ligature sequence="s e l e c t _ b a c k g r o u n d" replacement="select_background"/>+<ligature sequence="i n s e r t _ b a c k g r o u n d" replacement="insert_background"/>+<ligature sequence="n e w _ p o i n t _ o n _ p a t h" replacement="new_point_on_path"/>+<ligature sequence="d e l e t e _ b a c k g r o u n d" replacement="delete_background"/>+<ligature sequence="o r i e n t a t i o n _ a r r o w" replacement="orientation_arrow"/> <ligature sequence="o r i e n t a t i o n _ b o t h" replacement="orientation_both"/>-<ligature sequence="r e s i z e _ o v e r v i e w" replacement="resize_overview"/>-<ligature sequence="l i n e _ c a p _ s q u a r e" replacement="line_cap_square"/>-<ligature sequence="m o v e _ b a c k g r o u n d" replacement="move_background"/>-<ligature sequence="f l i p _ h o r i z o n t a l" replacement="flip_horizontal"/>-<ligature sequence="s h o w _ b a c k g r o u n d" replacement="show_background"/>+<ligature sequence="q u a d r a t i c _ p o i n t s" replacement="quadratic_points"/>+<ligature sequence="s c a l e _ b a c k g r o u n d" replacement="scale_background"/> <ligature sequence="z o o m _ b o u n d a r i e s" replacement="zoom_boundaries"/>-<ligature sequence="l i n e _ c a p _ r o u n d" replacement="line_cap_round"/>-<ligature sequence="i n s e r t _ u n i c h a r" replacement="insert_unichar"/>-<ligature sequence="c u t _ b a c k g r o u n d" replacement="cut_background"/>-<ligature sequence="u p d a t e _ w e b v i e w" replacement="update_webview"/>+<ligature sequence="s h o w _ b a c k g r o u n d" replacement="show_background"/>+<ligature sequence="f l i p _ h o r i z o n t a l" replacement="flip_horizontal"/>+<ligature sequence="m o v e _ b a c k g r o u n d" replacement="move_background"/>+<ligature sequence="l i n e _ c a p _ s q u a r e" replacement="line_cap_square"/>+<ligature sequence="r e s i z e _ o v e r v i e w" replacement="resize_overview"/> <ligature sequence="f i l l _ o p e n _ p a t h" replacement="fill_open_path"/>-<ligature sequence="s k e w _ o v e r v i e w" replacement="skew_overview"/>-<ligature sequence="l a y e r _ v i s i b l e" replacement="layer_visible"/>-<ligature sequence="l i n e _ c a p _ b u t t" replacement="line_cap_butt"/>-<ligature sequence="r e s i z e _ h a n d l e" replacement="resize_handle"/>-<ligature sequence="d r o p d o w n _ m e n u" replacement="dropdown_menu"/>-<ligature sequence="f l i p _ v e r t i c a l" replacement="flip_vertical"/>-<ligature sequence="d e l e t e _ b u t t o n" replacement="delete_button"/>-<ligature sequence="c o n v e r t _ p o i n t" replacement="convert_point"/>-<ligature sequence="d o u b l e _ p o i n t s" replacement="double_points"/>-<ligature sequence="k e r n i n g _ c l a s s" replacement="kerning_class"/>+<ligature sequence="u p d a t e _ w e b v i e w" replacement="update_webview"/>+<ligature sequence="c u t _ b a c k g r o u n d" replacement="cut_background"/>+<ligature sequence="i n s e r t _ u n i c h a r" replacement="insert_unichar"/>+<ligature sequence="l i n e _ c a p _ r o u n d" replacement="line_cap_round"/> <ligature sequence="a d d _ n e w _ t h e m e" replacement="add_new_theme"/>-<ligature sequence="l a y e r _ h i d d e n" replacement="layer_hidden"/>-<ligature sequence="y _ c o o r d i n a t e" replacement="y_coordinate"/>-<ligature sequence="x _ c o o r d i n a t e" replacement="x_coordinate"/>-<ligature sequence="c u b i c _ p o i n t s" replacement="cubic_points"/>-<ligature sequence="r e v e r s e _ p a t h" replacement="reverse_path"/>-<ligature sequence="e x p o r t _ f o n t s" replacement="export_fonts"/>+<ligature sequence="k e r n i n g _ c l a s s" replacement="kerning_class"/>+<ligature sequence="d o u b l e _ p o i n t s" replacement="double_points"/>+<ligature sequence="c o n v e r t _ p o i n t" replacement="convert_point"/>+<ligature sequence="d e l e t e _ b u t t o n" replacement="delete_button"/>+<ligature sequence="f l i p _ v e r t i c a l" replacement="flip_vertical"/>+<ligature sequence="d r o p d o w n _ m e n u" replacement="dropdown_menu"/>+<ligature sequence="r e s i z e _ h a n d l e" replacement="resize_handle"/>+<ligature sequence="l i n e _ c a p _ b u t t" replacement="line_cap_butt"/>+<ligature sequence="l a y e r _ v i s i b l e" replacement="layer_visible"/>+<ligature sequence="s k e w _ o v e r v i e w" replacement="skew_overview"/> <ligature sequence="a p p l y _ s t r o k e" replacement="apply_stroke"/>-<ligature sequence="f u l l _ h e i g h t" replacement="full_height"/>-<ligature sequence="s h o w _ l a y e r s" replacement="show_layers"/>-<ligature sequence="b e z i e r _ t o o l" replacement="bezier_tool"/>-<ligature sequence="r i g h t _ a r r o w" replacement="right_arrow"/>-<ligature sequence="b e z i e r _ l i n e" replacement="bezier_line"/>-<ligature sequence="c r e a t e _ l i n e" replacement="create_line"/>-<ligature sequence="s p i n _ b u t t o n" replacement="spin_button"/>+<ligature sequence="e x p o r t _ f o n t s" replacement="export_fonts"/>+<ligature sequence="r e v e r s e _ p a t h" replacement="reverse_path"/>+<ligature sequence="c u b i c _ p o i n t s" replacement="cubic_points"/>+<ligature sequence="x _ c o o r d i n a t e" replacement="x_coordinate"/>+<ligature sequence="y _ c o o r d i n a t e" replacement="y_coordinate"/>+<ligature sequence="l a y e r _ h i d d e n" replacement="layer_hidden"/> <ligature sequence="m o v e _ c a n v a s" replacement="move_canvas"/>-<ligature sequence="c l o s e _ p a t h" replacement="close_path"/>-<ligature sequence="l e f t _ a r r o w" replacement="left_arrow"/>-<ligature sequence="h e l p _ l i n e s" replacement="help_lines"/>-<ligature sequence="m o v e _ l a y e r" replacement="move_layer"/>-<ligature sequence="s e l e c t _ a l l" replacement="select_all"/>-<ligature sequence="p o i n t _ t o o l" replacement="point_tool"/>+<ligature sequence="s p i n _ b u t t o n" replacement="spin_button"/>+<ligature sequence="c r e a t e _ l i n e" replacement="create_line"/>+<ligature sequence="b e z i e r _ l i n e" replacement="bezier_line"/>+<ligature sequence="r i g h t _ a r r o w" replacement="right_arrow"/>+<ligature sequence="b e z i e r _ t o o l" replacement="bezier_tool"/>+<ligature sequence="s h o w _ l a y e r s" replacement="show_layers"/>+<ligature sequence="f u l l _ h e i g h t" replacement="full_height"/> <ligature sequence="f u l l _ g l y p h" replacement="full_glyph"/>-<ligature sequence="a l t e r n a t e" replacement="alternate"/>-<ligature sequence="l o c k _ g r i d" replacement="lock_grid"/>-<ligature sequence="s a v e _ f o n t" replacement="save_font"/>-<ligature sequence="i n f o _ i c o n" replacement="info_icon"/>-<ligature sequence="s h o w _ g r i d" replacement="show_grid"/>-<ligature sequence="a u t o t r a c e" replacement="autotrace"/>-<ligature sequence="u n d o _ t o o l" replacement="undo_tool"/>-<ligature sequence="t i e _ p o i n t" replacement="tie_point"/>-<ligature sequence="s y m m e t r i c" replacement="symmetric"/>-<ligature sequence="z o o m _ t o o l" replacement="zoom_tool"/>-<ligature sequence="r e c t a n g l e" replacement="rectangle"/>-<ligature sequence="t t f _ u n i t s" replacement="ttf_units"/>-<ligature sequence="m e n u _ i c o n" replacement="menu_icon"/>-<ligature sequence="o p e n _ f o n t" replacement="open_font"/>-<ligature sequence="a d d _ l a y e r" replacement="add_layer"/>+<ligature sequence="p o i n t _ t o o l" replacement="point_tool"/>+<ligature sequence="s e l e c t _ a l l" replacement="select_all"/>+<ligature sequence="m o v e _ l a y e r" replacement="move_layer"/>+<ligature sequence="h e l p _ l i n e s" replacement="help_lines"/>+<ligature sequence="l e f t _ a r r o w" replacement="left_arrow"/>+<ligature sequence="c l o s e _ p a t h" replacement="close_path"/> <ligature sequence="t r a n s f o r m" replacement="transform"/>-<ligature sequence="s e t t i n g s" replacement="settings"/>-<ligature sequence="z o o m _ o u t" replacement="zoom_out"/>-<ligature sequence="r o t a t i o n" replacement="rotation"/>-<ligature sequence="p e n _ t o o l" replacement="pen_tool"/>-<ligature sequence="z o o m _ 1 _ 1" replacement="zoom_1_1"/>-<ligature sequence="p r o g r e s s" replacement="progress"/>+<ligature sequence="a d d _ l a y e r" replacement="add_layer"/>+<ligature sequence="o p e n _ f o n t" replacement="open_font"/>+<ligature sequence="m e n u _ i c o n" replacement="menu_icon"/>+<ligature sequence="t t f _ u n i t s" replacement="ttf_units"/>+<ligature sequence="r e c t a n g l e" replacement="rectangle"/>+<ligature sequence="z o o m _ t o o l" replacement="zoom_tool"/>+<ligature sequence="s y m m e t r i c" replacement="symmetric"/>+<ligature sequence="t i e _ p o i n t" replacement="tie_point"/>+<ligature sequence="u n d o _ t o o l" replacement="undo_tool"/>+<ligature sequence="a u t o t r a c e" replacement="autotrace"/>+<ligature sequence="s h o w _ g r i d" replacement="show_grid"/>+<ligature sequence="i n f o _ i c o n" replacement="info_icon"/>+<ligature sequence="s a v e _ f o n t" replacement="save_font"/>+<ligature sequence="l o c k _ g r i d" replacement="lock_grid"/>+<ligature sequence="a l t e r n a t e" replacement="alternate"/> <ligature sequence="n e w _ f o n t" replacement="new_font"/>+<ligature sequence="p r o g r e s s" replacement="progress"/>+<ligature sequence="z o o m _ 1 _ 1" replacement="zoom_1_1"/>+<ligature sequence="p e n _ t o o l" replacement="pen_tool"/>+<ligature sequence="r o t a t i o n" replacement="rotation"/>+<ligature sequence="z o o m _ o u t" replacement="zoom_out"/>+<ligature sequence="s e t t i n g s" replacement="settings"/> <ligature sequence="z o o m _ i n" replacement="zoom_in"/>-<ligature sequence="h e i g h t" replacement="height"/>-<ligature sequence="r e s i z e" replacement="resize"/> <ligature sequence="c i r c l e" replacement="circle"/>-<ligature sequence="t h e m e" replacement="theme"/>-<ligature sequence="w i d t h" replacement="width"/>+<ligature sequence="r e s i z e" replacement="resize"/>+<ligature sequence="h e i g h t" replacement="height"/> <ligature sequence="t r a c k" replacement="track"/>-<ligature sequence="s k e w" replacement="skew"/>-<ligature sequence="m o v e" replacement="move"/>-<ligature sequence="p r e v" replacement="prev"/>-<ligature sequence="n e x t" replacement="next"/>+<ligature sequence="w i d t h" replacement="width"/>+<ligature sequence="t h e m e" replacement="theme"/> <ligature sequence="s t o p" replacement="stop"/>+<ligature sequence="n e x t" replacement="next"/>+<ligature sequence="p r e v" replacement="prev"/>+<ligature sequence="m o v e" replacement="move"/>+<ligature sequence="s k e w" replacement="skew"/>  <kerning left="settings" right="l" hadjustment="3.8289794922" /> </font>

Contact

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