Clone in a terminal:
Commit ed62e87
Johan Mattsson - 2015-05-30T13:14:38+00:00
ed62e8738176cfe9e5c9ec39d6216accad3bc056johan.mattsson.m@gmail.com

Faster overview

Changed files (6)

Diff

diff --git a/libbirdfont/FileTools.vala b/libbirdfont/FileTools.valaindex 91c9bf5..600a218 100644--- a/libbirdfont/FileTools.vala+++ b/libbirdfont/FileTools.vala@@ -65,6 +65,7 @@ public class FileTools : ToolCollection  { 			 			theme_label.select_action.connect((self) => { 				LabelTool s = (LabelTool) self;+				Toolbox toolbox = MainWindow.get_toolbox (); 				string theme_file = s.data; 				TabBar tb = MainWindow.get_tab_bar (); 				Preferences.set ("theme", theme_file);@@ -77,7 +78,9 @@ public class FileTools : ToolCollection  { 				font_name.redraw (); 				tb.redraw (0, 0, tb.width, tb.height); 				-				OverviewTools.zoom_expander.redraw ();+				foreach (ToolCollection tc in toolbox.tool_sets) {+					tc.redraw ();+				} 			}); 			 			if (!theme.has_prefix ("generated_")) {diff --git a/libbirdfont/OverView.vala b/libbirdfont/OverView.valaindex 94ae2e8..fc2c895 100644--- a/libbirdfont/OverView.vala+++ b/libbirdfont/OverView.vala@@ -215,6 +215,7 @@ public class OverView : FontDisplay { 		z.store_current_view (); 		MainWindow.get_current_glyph ().default_zoom (); 		z.store_current_view ();+		OverViewItem.reset_label (); 	}  	public double get_height () {@@ -294,6 +295,7 @@ public class OverView : FontDisplay { 		OverViewItem.height = OverViewItem.DEFAULT_HEIGHT * z; 		OverViewItem.margin = OverViewItem.DEFAULT_MARGIN * z; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw ();	 	} 	@@ -302,6 +304,7 @@ public class OverView : FontDisplay { 		OverViewItem.height = OverViewItem.DEFAULT_HEIGHT * 0.5; 		OverViewItem.margin = OverViewItem.DEFAULT_MARGIN * 0.5; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw (); 		update_zoom_bar (); 	}@@ -311,6 +314,7 @@ public class OverView : FontDisplay { 		OverViewItem.height = OverViewItem.DEFAULT_HEIGHT; 		OverViewItem.margin = OverViewItem.DEFAULT_MARGIN; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw (); 		update_zoom_bar (); 	}@@ -319,6 +323,7 @@ public class OverView : FontDisplay { 		OverViewItem.width = allocation.width; 		OverViewItem.height = allocation.height; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw (); 	} 	@@ -327,6 +332,7 @@ public class OverView : FontDisplay { 		OverViewItem.height *= 1.1; 		OverViewItem.margin *= 1.1; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw (); 		update_zoom_bar (); 	}@@ -336,6 +342,7 @@ public class OverView : FontDisplay { 		OverViewItem.height *= 0.9; 		OverViewItem.margin *= 0.9; 		update_item_list ();+		OverViewItem.reset_label (); 		GlyphCanvas.redraw (); 		update_zoom_bar (); 	}@@ -391,7 +398,7 @@ public class OverView : FontDisplay { 		} 		return i - 1; 	}-		+	 	public void update_item_list (int item_list_length = -1) { 		string character_string; 		Font f = BirdFont.get_current_font ();@@ -488,11 +495,11 @@ public class OverView : FontDisplay { 			i.draw (allocation, cr); 		} 		-		if (visible_items.size == 0) {+		if (unlikely (visible_items.size == 0)) { 			draw_empty_canvas (allocation, cr); 		} 		-		if (character_info != null) {+		if (unlikely (character_info != null)) { 			draw_character_info (cr); 		} 	}diff --git a/libbirdfont/OverViewItem.vala b/libbirdfont/OverViewItem.valaindex 5f6ecb6..bef363c 100644--- a/libbirdfont/OverViewItem.vala+++ b/libbirdfont/OverViewItem.vala@@ -36,7 +36,12 @@ public class OverViewItem : GLib.Object { 	public static double glyph_scale = 1.0; 	 	public VersionList version_menu;-	Text icon;+	Text label;+	+	static Surface? label_background = null;+	static Surface? selected_label_background = null;+	static Surface? label_background_no_menu = null;+	static Surface? selected_label_background_no_menu = null; 	 	public OverViewItem (GlyphCollection? glyphs, unichar character, double x, double y) {	 		this.x = x;@@ -45,10 +50,9 @@ public class OverViewItem : GLib.Object { 		this.glyphs = glyphs; 		this.info = new CharacterInfo (character, glyphs); -		icon = new Text ("dropdown_menu", 17);-		icon.load_font ("icons.bf");-		icon.use_cache (true);-		+		label = new Text ((!) character.to_string (), 17);		+		truncate_label ();+			 		if (glyphs != null) { 			version_menu = new VersionList ((!) glyphs); 			version_menu.add_glyph_item.connect ((glyph) => {@@ -66,6 +70,16 @@ public class OverViewItem : GLib.Object { 		} 	} +	public static void reset_label () {+		label_background = null;+		selected_label_background = null;+	}+	+	void truncate_label () {+		double w = has_icons () ? width - 43 : width;+		label.truncate (w);+	}+ 	public string get_name () { 		StringBuilder s; 		@@ -95,10 +109,11 @@ public class OverViewItem : GLib.Object { 		bool a; 		GlyphCollection g; 		bool s = (x <= px <= x + width) && (y <= py <= y + height);-		+	 		if (has_icons () && glyphs != null) { 			g = (!) glyphs;-+			+			version_menu.set_position (x + width - 21, y + height - 18); 			a = version_menu.menu_item_action (px, py); // select one item on the menu 			if (a) { 				return s;@@ -142,7 +157,7 @@ public class OverViewItem : GLib.Object { 		cr.restore (); 		 		draw_thumbnail (cr, glyphs, x, y + height); 	-		draw_caption (cr);	+		draw_caption (cr); 	}  	public void adjust_scale () {@@ -240,53 +255,133 @@ public class OverViewItem : GLib.Object { 	}  	public void draw_caption (Context cr) {-		StringBuilder name = new StringBuilder ();-		Cairo.Pattern p;-		string text;-		Text label;-		-		name.append_unichar (character);+		draw_label_background (cr); 		 		cr.save (); 		-		cr.rectangle (x + 1, y + height - 20, width - 2, 20 - 1);--		if (!selected) {-			p = new Cairo.Pattern.linear (0.0, y + height - 20, 0.0, y + height);-			Theme.gradient (p, "Overview Item 1", "Overview Item 2");-			cr.set_source (p);-		} else {-			Theme.color (cr, "Selected Overview Item");+		if (glyphs != null) {+			if (selected) {+				Theme.text_color (label, "Overview Selected Foreground");+			} else {+				Theme.text_color (label, "Overview Foreground");+			}+		+			label.draw_at_baseline (cr, x + 0.08 * width, y + height - 6); 		} 		-		cr.fill ();+		draw_menu (cr);+		cr.restore ();+	}+	+	public void create_label_background_cache (Context cr) {+		Context cc;+		Cairo.Pattern p;+		Surface cache;+			+		// unselected item+		cache = new Surface.similar (cr.get_target (), Cairo.Content.COLOR_ALPHA, (int) width, 20);+		cc = new Context (cache);+		cc.rectangle (0, 0, width - 1, 20 - 1);+		p = new Cairo.Pattern.linear (0.0, 0, 0.0, 20);+		Theme.gradient (p, "Overview Item 1", "Overview Item 2");+		cc.set_source (p);+			+		cc.fill (); 		 		if (has_icons ()) {-			draw_menu (cr);-			draw_character_info_icon (cr);+			draw_menu_icon (cc, false);+			draw_character_info_icon (cc); 		} -		if (glyphs != null) {-			text = name.str;-					-			double w = has_icons () ? width - 43 : width;-			label = new Text (text, 17);-			label.truncate (w);-			label.use_cache (true);+		label_background = (!) cache;	++		// selected item+		cache = new Surface.similar (cr.get_target (), Cairo.Content.COLOR_ALPHA, (int) width, 20);+		cc = new Context (cache);++		cc.rectangle (0, 0, width - 1, 20 - 1);++		Theme.color (cc, "Selected Overview Item"); 			-			if (selected) {-				Theme.text_color (label, "Overview Selected Foreground");+		cc.fill ();+		+		if (has_icons ()) {+			draw_menu_icon (cc, true);+			draw_character_info_icon (cc);+		}++		selected_label_background = (!) cache;	+	+		// unselected item without menu icon+		cache = new Surface.similar (cr.get_target (), Cairo.Content.COLOR_ALPHA, (int) width, 20);+		cc = new Context (cache);++		cc.rectangle (0, 0, width - 1, 20 - 1);+		p = new Cairo.Pattern.linear (0.0, 0, 0.0, 20);+		Theme.gradient (p, "Overview Item 1", "Overview Item 2");+		cc.set_source (p);+		cc.fill ();++		if (has_icons ()) {+			draw_character_info_icon (cc);+		}+		+		label_background_no_menu = (!) cache;++		// selected item+		cache = new Surface.similar (cr.get_target (), Cairo.Content.COLOR_ALPHA, (int) width, 20);+		cc = new Context (cache);+		cc.rectangle (0, 0, width - 1, 20 - 1);+		Theme.color (cc, "Selected Overview Item");+		cc.fill ();++		if (has_icons ()) {+			draw_character_info_icon (cc);+		}+				+		selected_label_background_no_menu = (!) cache;		+	}+	+	bool has_menu () {+		return glyphs != null;+	}+	+	public void draw_label_background (Context cr) {+		Surface cache;+		bool icon;+		+		if (unlikely (label_background == null)) {+			create_label_background_cache (cr);+		}+		+		if (label_background != null +			&& selected_label_background != null+			&& label_background_no_menu != null+			&& selected_label_background_no_menu != null) {+			+			icon = has_menu ();+			if (selected && icon) {+				cache = (!) selected_label_background;+			} else if (!selected && icon) {+				cache = (!) label_background;+			} else if (selected && !icon) {+				cache = (!) selected_label_background_no_menu; 			} else {-				Theme.text_color (label, "Overview Foreground");+				cache = (!) label_background_no_menu; 			} 			-			label.draw_at_baseline (cr, x + 0.08 * width, y + height - 6);+			cr.save ();+			cr.set_antialias (Cairo.Antialias.NONE);+			cr.set_source_surface (cache, (int) (x + 1), (int) (y + height - 20));+			cr.paint ();+			cr.restore (); 		} 	}-+	 	private void draw_character_info_icon (Context cr) {-		double px = x + width - 17;-		double py = y + height - 21;+		double px = width - 17;+		double py = -2.5;+				 		info.set_position (px, py); 		info.draw_icon (cr, selected); 	}@@ -295,20 +390,26 @@ public class OverViewItem : GLib.Object { 		version_menu.menu_visible = false; 	} 	-	private void draw_menu (Context cr) {-		if (glyphs == null) {-			return;-		}-		+	private void draw_menu_icon (Context cc, bool selected) {+		Text icon;++		icon = new Text ("dropdown_menu", 17);+		icon.load_font ("icons.bf");+ 		if (selected) { 			Theme.text_color (icon, "Overview Selected Foreground"); 		} else { 			Theme.text_color (icon, "Overview Foreground"); 		} 		-		icon.draw_at_top (cr, x + width - 32, y + height - 19);+		icon.draw_at_top (cc, width - 32, 0);+	}+	+	private void draw_menu (Context cr) {+		if (likely (glyphs == null || !version_menu.menu_visible)) {+			return;+		} 		-		version_menu.set_position (x + width - 21, y + height - 18); 		version_menu.draw_menu (cr); 	} }diff --git a/libbirdfont/ToolCollection.vala b/libbirdfont/ToolCollection.valaindex 29cb98a..626874e 100644--- a/libbirdfont/ToolCollection.vala+++ b/libbirdfont/ToolCollection.vala@@ -26,6 +26,12 @@ public abstract class ToolCollection : GLib.Object  { 	public virtual Gee.ArrayList<string> get_displays () { 		return new Gee.ArrayList<string> (); 	}+	+	public void redraw () {+		foreach (Expander e in get_expanders ()) {+			e.redraw ();+		}+	} }  }diff --git a/libbirdfont/Toolbox.vala b/libbirdfont/Toolbox.valaindex 0c41adb..f03fb48 100644--- a/libbirdfont/Toolbox.vala+++ b/libbirdfont/Toolbox.vala@@ -45,13 +45,14 @@ public class Toolbox : GLib.Object  { 	bool scrolling_touch = false; 	double scroll_y = 0; -	public List<ToolCollection> tool_sets = new List<ToolCollection> ();+	public Gee.ArrayList<ToolCollection> tool_sets;  	string? tool_tip = null; 	double tool_tip_x = 0; 	double tool_tip_y = 0; 	 	public Toolbox (GlyphCanvas glyph_canvas, TabBar tab_bar) {+		tool_sets = new Gee.ArrayList<ToolCollection> (); 		current_tool = new Tool ("no_icon"); 		press_tool = new Tool (null); @@ -64,13 +65,13 @@ public class Toolbox : GLib.Object  { 		spacing_tools = new SpacingTools (); 		file_tools = new FileTools (); 		-		tool_sets.append (drawing_tools);-		tool_sets.append (kerning_tools);-		tool_sets.append (preview_tools);-		tool_sets.append (overview_tools);-		tool_sets.append (background_tools);+		tool_sets.add (drawing_tools);+		tool_sets.add (kerning_tools);+		tool_sets.add (preview_tools);+		tool_sets.add (overview_tools);+		tool_sets.add (background_tools); 		// the menu has all the file_tools commands, it won't be added here-		tool_sets.append (hidden_tools); // tools without a button+		tool_sets.add (hidden_tools); // tools without a button 		 		current_set = file_tools; 		diff --git a/resources/icons.bf b/resources/icons.bfindex 4303f61..2f5e13f 100644--- a/resources/icons.bf+++ b/resources/icons.bf@@ -417,7 +417,7 @@ GNU Lesser General Public License</copyright> 	<glyph id="1" left="-28" right="33.597883597883616"> 		<path data="B 33.4557723114,27.7602470013 C 33.4557723114,10.8486376087 19.7651712298,-2.8868862385 2.8535762171,-2.8868862385 C -14.0580336070,-2.8868862385 -27.7935573823,10.8486376087 -27.7935573823,27.7602470013 C -27.7935573823,44.6718405761 -14.0580336070,58.4073788032 2.8535762171,58.4073788032 C 19.7651712298,58.4073788032 33.4557723114,44.6718405761 33.4557723114,27.7602470013" /> 		<path data="B -22.9372197969,27.6712637687 C -22.9372197969,13.3872582207 -11.3620694169,1.8121082225 2.9219361312,1.8121082225 C 17.2059289484,1.8121082225 28.7413083611,13.3872582207 28.7413083611,27.6712637687 C 28.7413083611,41.9552553130 17.2059289484,53.5304180417 2.9219361312,53.5304180417 C -11.3620694169,53.5304180417 -22.9372197969,41.9552553130 -22.9372197969,27.6712637687" />-		<path data="B -0.7322863839,39.7818352495 C 0.6722544235,39.7818352495 4.1050139259,39.7818352495 6.5236640807,39.7818352495 M 6.5236640807,39.7818352495 M 6.5236640807,45.1175621773 M -0.7322863839,45.1175621773 C -0.7322863839,43.3389865347 -0.7322863839,41.5604108921 -0.7322863839,39.7818352495" />+		<path data="B -0.7322863839,41.5840330517 C 0.6722544235,41.5840330517 4.1050139259,41.5840330517 6.5236640807,41.5840330517 M 6.5236640807,41.5840330517 M 6.5236640807,46.9197599795 M -0.7322863839,46.9197599795 C -0.7322863839,45.1411843369 -0.7322863839,43.3626086943 -0.7322863839,41.5840330517" /> 		<path data="B -0.7322863839,35.1331149086 C 0.6722544235,35.1331149086 4.1050139259,35.1331149086 6.5236640807,35.1331149086 M 6.5236640807,9.4849784247 M -0.7322863839,9.4849784247 M -0.7322863839,35.1331149086" /> 	</glyph> </collection>@@ -1083,94 +1083,94 @@ GNU Lesser General Public License</copyright> <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="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="k e r n i n g _ t e x t _ i n p u t" replacement="kerning_text_input"/> <ligature sequence="s t r o k e _ t o _ o u t l i n e" replacement="stroke_to_outline"/>-<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 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="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="f i l l _ o p e n _ p a t h" replacement="fill_open_path"/>-<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="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="a p p l y _ s t r o k e" replacement="apply_stroke"/>-<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="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="f u l l _ g l y p h" replacement="full_glyph"/>-<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="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="o p e n _ f o n t" replacement="open_font"/>-<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="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="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="w i d t h" replacement="width"/>+<ligature sequence="t h e m e" replacement="theme"/> <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