Clone in a terminal:
Commit c644206
Johan Mattsson - 2014-04-15T11:37:53+00:00
c644206a5f89ba1b9d98c3c0c337f69b71395e89johan.mattsson.m@gmail.com

Fix memory leaks

Changed files (6)

Diff

diff --git a/libbirdfont/BirdFontFile.vala b/libbirdfont/BirdFontFile.valaindex 3b7399e..0cc6a7c 100644--- a/libbirdfont/BirdFontFile.vala+++ b/libbirdfont/BirdFontFile.vala@@ -221,24 +221,24 @@ class BirdFontFile : GLib.Object { 			uint num_kerning_pairs; 			string range; 			-			num_kerning_pairs = KerningClasses.get_instance ().classes_first.length ();+			num_kerning_pairs = KerningClasses.get_instance ().classes_first.size; -			for (uint i = 0; i < num_kerning_pairs; i++) {-				range = KerningClasses.get_instance ().classes_first.nth (i).data.get_all_ranges ();+			for (int i = 0; i < num_kerning_pairs; i++) {+				range = KerningClasses.get_instance ().classes_first.get (i).get_all_ranges (); 				 				os.put_string ("<kerning "); 				os.put_string ("left=\""); 				os.put_string (range); 				os.put_string ("\" "); 				-				range = KerningClasses.get_instance ().classes_last.nth (i).data.get_all_ranges ();+				range = KerningClasses.get_instance ().classes_last.get (i).get_all_ranges (); 				 				os.put_string ("right=\""); 				os.put_string (range); 				os.put_string ("\" "); 				 				os.put_string ("hadjustment=\"");-				os.put_string (float_point (KerningClasses.get_instance ().classes_kerning.nth (i).data.val));+				os.put_string (float_point (KerningClasses.get_instance ().classes_kerning.get (i).val)); 				os.put_string ("\" />\n");  				Tool.yield ();diff --git a/libbirdfont/KerningClasses.vala b/libbirdfont/KerningClasses.valaindex b19761e..1db75a0 100644--- a/libbirdfont/KerningClasses.vala+++ b/libbirdfont/KerningClasses.vala@@ -22,14 +22,14 @@ namespace BirdFont { public class KerningClasses : GLib.Object { 	 	// kerning for classes-	public GLib.List<GlyphRange> classes_first;-	public GLib.List<GlyphRange> classes_last;-	public GLib.List<Kerning> classes_kerning;+	public Gee.ArrayList<GlyphRange> classes_first;+	public Gee.ArrayList<GlyphRange> classes_last;+	public Gee.ArrayList<Kerning> classes_kerning;  	// kerning for single glyphs 	Gee.HashMap<string, double?> single_kerning;-	public GLib.List<string> single_kerning_letters_left; // FIXME: this needs to be fast and sorted-	public GLib.List<string> single_kerning_letters_right; +	public Gee.ArrayList<string> single_kerning_letters_left; // FIXME: this needs to be fast and sorted+	public Gee.ArrayList<string> single_kerning_letters_right;  	 	public delegate void KerningIterator (KerningPair list); 	public delegate void KerningClassIterator (string left, string right, double kerning);@@ -38,9 +38,12 @@ public class KerningClasses : GLib.Object { 	bool protect_map = false;  	public KerningClasses () {-		classes_first = new GLib.List<GlyphRange> ();-		classes_last = new GLib.List<GlyphRange> ();-		classes_kerning = new GLib.List<Kerning> ();+		classes_first = new Gee.ArrayList<GlyphRange> ();+		classes_last = new Gee.ArrayList<GlyphRange> ();+		classes_kerning = new Gee.ArrayList<Kerning> ();+		+		single_kerning_letters_left = new Gee.ArrayList<string> ();+		single_kerning_letters_right = new Gee.ArrayList<string> (); 		 		single_kerning = new HashMap<string, double?> (); 	}@@ -66,12 +69,12 @@ public class KerningClasses : GLib.Object { 			return; 		} 		-		if (single_kerning_letters_left.index (cleft) < 0) {-			single_kerning_letters_left.append (cleft);+		if (!single_kerning_letters_left.contains (cleft)) {+			single_kerning_letters_left.add (cleft); 		} -		if (single_kerning_letters_right.index (cright) < 0) {-			single_kerning_letters_right.append (cright);+		if (!single_kerning_letters_right.contains (cright)) {+			single_kerning_letters_right.add (cright); 		} 				 		single_kerning.set (@"$left - $right", k);@@ -99,23 +102,23 @@ public class KerningClasses : GLib.Object { 		 		// keep the list sorted (classes first then single glyphs) 		if (index == -1) {-			classes_first.append (left_range);-			classes_last.append (right_range);-			classes_kerning.append (new Kerning (k));+			classes_first.add (left_range);+			classes_last.add (right_range);+			classes_kerning.add (new Kerning (k)); 		} else {-			return_if_fail (0 <= index <= classes_first.length ());-			classes_kerning.nth (index).data.val = k;+			return_if_fail (0 <= index <= classes_first.size);+			classes_kerning.get (index).val = k; 		} 	}  	public double get_kerning_for_range (GlyphRange range_first, GlyphRange range_last) {-		unowned GLib.List<GlyphRange> r;-		unowned GLib.List<GlyphRange> l;-		int len = (int) classes_first.length ();+		GlyphRange r;+		GlyphRange l;+		int len = (int) classes_first.size; 		-		len = (int) classes_first.length ();-		return_val_if_fail (len == classes_last.length (), 0);-		return_val_if_fail (len == classes_kerning.length (), 0);+		len = (int) classes_first.size;+		return_val_if_fail (len == classes_last.size, 0);+		return_val_if_fail (len == classes_kerning.size, 0);  		if (!(range_first.is_class () || range_last.is_class ())) { 			get_kerning_for_single_glyphs (range_first.get_all_ranges (), range_last.get_all_ranges ());@@ -123,12 +126,12 @@ public class KerningClasses : GLib.Object { 		} 		 		for (int i = len - 1; i >= 0; i--) {-			l = classes_first.nth (i);-			r = classes_last.nth (i);+			l = classes_first.get (i);+			r = classes_last.get (i); 	-			if (l.data.get_all_ranges () == range_first.get_all_ranges ()-				&& r.data.get_all_ranges () == range_last.get_all_ranges ()) {-				return classes_kerning.nth (i).data.val;+			if (l.get_all_ranges () == range_first.get_all_ranges ()+				&& r.get_all_ranges () == range_last.get_all_ranges ()) {+				return classes_kerning.get (i).val; 			} 		} 		@@ -136,13 +139,13 @@ public class KerningClasses : GLib.Object { 	}  	public int get_kerning_item_index (GlyphRange range_first, GlyphRange range_last) {-		unowned GLib.List<GlyphRange> r;-		unowned GLib.List<GlyphRange> l;-		int len = (int) classes_first.length ();+		GlyphRange r;+		GlyphRange l;+		int len = (int) classes_first.size; 		-		len = (int)classes_first.length ();-		return_val_if_fail (len == classes_last.length (), 0);-		return_val_if_fail (len == classes_kerning.length (), 0);+		len = (int)classes_first.size;+		return_val_if_fail (len == classes_last.size, 0);+		return_val_if_fail (len == classes_kerning.size, 0);  		if (!(range_first.is_class () || range_last.is_class ())) { 			warning (@"Expecting a class, $(range_first.get_all_ranges ()) and $(range_last.get_all_ranges ())");@@ -150,11 +153,11 @@ public class KerningClasses : GLib.Object { 		} 		 		for (int i = len - 1; i >= 0; i--) {-			l = classes_first.nth (i);-			r = classes_last.nth (i);+			l = classes_first.get (i);+			r = classes_last.get (i); 			-			if (l.data.get_all_ranges () == range_first.get_all_ranges ()-				&& r.data.get_all_ranges () == range_last.get_all_ranges ()) {+			if (l.get_all_ranges () == range_first.get_all_ranges ()+				&& r.get_all_ranges () == range_last.get_all_ranges ()) { 				return i; 			} 		}@@ -163,9 +166,9 @@ public class KerningClasses : GLib.Object { 	} 		 	public double get_kerning (string left_glyph, string right_glyph) {-		unowned GLib.List<GlyphRange> r;-		unowned GLib.List<GlyphRange> l;-		int len = (int) classes_first.length ();+		GlyphRange r;+		GlyphRange l;+		int len = (int) classes_first.size; 		double? d; 		double time; 		@@ -176,18 +179,18 @@ public class KerningClasses : GLib.Object {  		time = GLib.get_real_time (); 		-		len = (int)classes_first.length ();-		return_val_if_fail (len == classes_last.length (), 0);-		return_val_if_fail (len == classes_kerning.length (), 0);+		len = (int)classes_first.size;+		return_val_if_fail (len == classes_last.size, 0);+		return_val_if_fail (len == classes_kerning.size, 0); 		 		for (int i = len - 1; i >= 0; i--) {-			l = classes_first.nth (i);-			r = classes_last.nth (i);+			l = classes_first.get (i);+			r = classes_last.get (i); 			-			if (l.data.has_character (left_glyph)-				&& r.data.has_character (right_glyph)) {+			if (l.has_character (left_glyph)+				&& r.has_character (right_glyph)) { -				return classes_kerning.nth (i).data.val;+				return classes_kerning.get (i).val; 			} 		} 	@@ -195,13 +198,13 @@ public class KerningClasses : GLib.Object { 	}  	public double get_kern_for_range_to_char (GlyphRange left_range, string right_char) {-		unowned GLib.List<GlyphRange> r;-		unowned GLib.List<GlyphRange> l;-		int len = (int) classes_first.length ();+		GlyphRange r;+		GlyphRange l;+		int len = (int) classes_first.size; 		-		len = (int)classes_first.length ();-		return_val_if_fail (len == classes_last.length (), 0);-		return_val_if_fail (len == classes_kerning.length (), 0);+		len = (int)classes_first.size;+		return_val_if_fail (len == classes_last.size, 0);+		return_val_if_fail (len == classes_kerning.size, 0); 		 		if (unlikely (!left_range.is_class ())) { 			warning (@"Expecting a class, $(left_range.get_all_ranges ())");@@ -209,12 +212,12 @@ public class KerningClasses : GLib.Object { 		} 		 		for (int i = len - 1; i >= 0; i--) {-			l = classes_first.nth (i);-			r = classes_last.nth (i);+			l = classes_first.get (i);+			r = classes_last.get (i); 			-			if (l.data.get_all_ranges () == left_range.get_all_ranges ()-				&& r.data.has_character (right_char)) {-				return classes_kerning.nth (i).data.val;+			if (l.get_all_ranges () == left_range.get_all_ranges ()+				&& r.has_character (right_char)) {+				return classes_kerning.get (i).val; 			} 		} 		@@ -222,13 +225,13 @@ public class KerningClasses : GLib.Object { 	}  	public double get_kern_for_char_to_range (string left_char, GlyphRange right_range) {-		unowned GLib.List<GlyphRange> r;-		unowned GLib.List<GlyphRange> l;-		int len = (int) classes_first.length ();+		GlyphRange r;+		GlyphRange l;+		int len = (int) classes_first.size; -		len = (int)classes_first.length ();-		return_val_if_fail (len == classes_last.length (), 0);-		return_val_if_fail (len == classes_kerning.length (), 0);+		len = (int)classes_first.size;+		return_val_if_fail (len == classes_last.size, 0);+		return_val_if_fail (len == classes_kerning.size, 0); 		 		if (!right_range.is_class ()) { 			warning ("Expecting a class");@@ -236,12 +239,12 @@ public class KerningClasses : GLib.Object { 		} 		 		for (int i = len - 1; i >= 0; i--) {-			l = classes_first.nth (i);-			r = classes_last.nth (i);+			l = classes_first.get (i);+			r = classes_last.get (i); 			-			if (l.data.has_character (left_char)-				&& r.data.get_all_ranges () == right_range.get_all_ranges ()) {-				return classes_kerning.nth (i).data.val;+			if (l.has_character (left_char)+				&& r.get_all_ranges () == right_range.get_all_ranges ()) {+				return classes_kerning.get (i).val; 			} 		} 		@@ -250,15 +253,15 @@ public class KerningClasses : GLib.Object { 	 	public void print_all () { 		print ("Kernings classes:\n");-		for (int i = 0; i < classes_first.length (); i++) {-			print (classes_first.nth (i).data.get_all_ranges ());+		for (int i = 0; i < classes_first.size; i++) {+			print (classes_first.get (i).get_all_ranges ()); 			print ("\t\t");-			print (classes_last.nth (i).data.get_all_ranges ());+			print (classes_last.get (i).get_all_ranges ()); 			print ("\t\t");-			print (@"$(classes_kerning.nth (i).data.val)");+			print (@"$(classes_kerning.get (i).val)"); 			print ("\t\t"); 			-			if (classes_first.nth (i).data.is_class () || classes_last.nth (i).data.is_class ()) {+			if (classes_first.get (i).is_class () || classes_last.get (i).is_class ()) { 				print ("class"); 			} 			@@ -280,10 +283,10 @@ public class KerningClasses : GLib.Object { 	}  	public void get_classes (KerningClassIterator kerningIterator) {-		for (int i = 0; i < classes_first.length (); i++) {-			kerningIterator (classes_first.nth (i).data.get_all_ranges (),-				classes_last.nth (i).data.get_all_ranges (),-				classes_kerning.nth (i).data.val);+		for (int i = 0; i < classes_first.size; i++) {+			kerningIterator (classes_first.get (i).get_all_ranges (),+				classes_last.get (i).get_all_ranges (),+				classes_kerning.get (i).val); 		} 	} 	@@ -313,24 +316,23 @@ public class KerningClasses : GLib.Object { 			Glyph g2; 			KerningPair kerning_list = kl; 			string g1 = kerning_list.character.get_name ();-			unowned GLib.List<Kerning> kerning = kerning_list.kerning.first ();-			-			if (unlikely (is_null (kerning))) {-				warning ("No kerning values.");-			}+			Kerning kerning;+			int i = 0; 			+			return_if_fail (kerning_list.kerning.size > 0);+ 			foreach (Kerning k in kerning_list.kerning) { 				g2 = k.get_glyph ();-				iter (g1, g2.get_name (), kerning.data.val);-				kerning = kerning.next;+				kerning = kerning_list.kerning.get (i);+				iter (g1, g2.get_name (), kerning.val); 			} 		}); 	} 	 	public void all_pairs (KerningIterator kerningIterator) { 		Font font = BirdFont.get_current_font ();-		GLib.List<Glyph> left_glyphs = new GLib.List<Glyph> ();-		GLib.List<KerningPair> pairs = new GLib.List<KerningPair> ();+		Gee.ArrayList<Glyph> left_glyphs = new Gee.ArrayList<Glyph> ();+		Gee.ArrayList<KerningPair> pairs = new Gee.ArrayList<KerningPair> (); 		double kerning; 		string right; 		@@ -340,8 +342,8 @@ public class KerningClasses : GLib.Object { 				for (unichar c = u.start; c <= u.stop; c++) { 					string name = (!)c.to_string (); 					Glyph? g = font.get_glyph (name);-					if (g != null && left_glyphs.index ((!) g) < 0) {-						left_glyphs.append ((!) g);+					if (g != null && !left_glyphs.contains ((!) g)) {+						left_glyphs.add ((!) g); 					} 				} 			}@@ -351,8 +353,8 @@ public class KerningClasses : GLib.Object { 		 		foreach (string name in single_kerning_letters_left) { 			Glyph? g = font.get_glyph (name);-			if (g != null && left_glyphs.index ((!) g) < 0) {-				left_glyphs.append ((!) g);+			if (g != null && !left_glyphs.contains ((!) g)) {+				left_glyphs.add ((!) g); 			} 		} 		@@ -363,7 +365,7 @@ public class KerningClasses : GLib.Object { 		// add the right hand glyph and the kerning value 		foreach (Glyph character in left_glyphs) { 			KerningPair kl = new KerningPair (character);-			pairs.append (kl);+			pairs.add (kl);  			foreach (GlyphRange r in classes_last) { 				foreach (UniRange u in r.ranges) {@@ -412,29 +414,12 @@ public class KerningClasses : GLib.Object { 			warning ("Map is protected."); 			return; 		}-		-		print ("Remove all kerning pairs\n");-		-		while (classes_first.length () > 0) {-			classes_first.remove_link (classes_first.first ());-		} -		while (classes_last.length () > 0) {-			classes_last.remove_link (classes_last.first ());-		}-		-		while (classes_kerning.length () > 0) {-			classes_kerning.remove_link (classes_kerning.first ());-		}--		while (single_kerning_letters_left.length () > 0) {-			single_kerning_letters_left.remove_link (single_kerning_letters_left.first ());-		}		--		while (single_kerning_letters_right.length () > 0) {-			single_kerning_letters_right.remove_link (single_kerning_letters_right.first ());-		}		-		+		classes_first.clear ();+		classes_last.clear ();+		classes_kerning.clear ();+		single_kerning_letters_left.clear ();+		single_kerning_letters_right.clear (); 				 		GlyphCanvas.redraw (); 		@@ -446,7 +431,7 @@ public class KerningClasses : GLib.Object { 	} 	 	public uint get_number_of_pairs () {-		return single_kerning.keys.size + classes_first.length ();+		return single_kerning.keys.size + classes_first.size; 	} } diff --git a/libbirdfont/KerningPair.vala b/libbirdfont/KerningPair.valaindex d345d9d..cc65190 100644--- a/libbirdfont/KerningPair.vala+++ b/libbirdfont/KerningPair.vala@@ -20,20 +20,20 @@ namespace BirdFont { /** A list of all kerning pairs for one glyph. */ public class KerningPair : GLib.Object { 	public Glyph character;-	public GLib.List<Kerning> kerning;+	public Gee.ArrayList<Kerning> kerning; -	GLib.List<Glyph> right; // FIXME: should be fast and sorted+	Gee.ArrayList<Glyph> right; // FIXME: should be fast and sorted 	 	public KerningPair (Glyph left) { 		character = left;-		right = new GLib.List<Glyph> ();-		kerning = new GLib.List<Kerning> ();+		right = new Gee.ArrayList<Glyph> ();+		kerning = new Gee.ArrayList<Kerning> (); 	} 	 	public void add_unique (Glyph g, double k) {-		if (right.index ((!) g) < 0) {-			right.append ((!) g);-			kerning.append (new Kerning.for_glyph (g, k));+		if (right.contains ((!) g)) {+			right.add ((!) g);+			kerning.add (new Kerning.for_glyph (g, k)); 		} 	} 	diff --git a/libbirdfont/KerningTools.vala b/libbirdfont/KerningTools.valaindex 1ff421a..0a85038 100644--- a/libbirdfont/KerningTools.vala+++ b/libbirdfont/KerningTools.vala@@ -147,15 +147,15 @@ public class KerningTools : ToolCollection  { 		 		remove_all_kerning_classes (); 		-		for (i = 0; i < k.classes_first.length (); i++) {-			r = k.classes_first.nth (i).data;+		for (i = 0; i < k.classes_first.size; i++) {+			r = k.classes_first.get (i); 			if (r.is_class ()) { 				kr = new KerningRange (); 				kr.set_ranges (r.get_all_ranges ()); 				add_unique_class (kr); 			} 			-			r = k.classes_last.nth (i).data;+			r = k.classes_last.get (i); 			if (r.is_class ()) { 				kr = new KerningRange (); 				kr.set_ranges (r.get_all_ranges ());diff --git a/libbirdfont/OpenFontFormat/KernList.vala b/libbirdfont/OpenFontFormat/KernList.valaindex 3354461..614fe4c 100644--- a/libbirdfont/OpenFontFormat/KernList.vala+++ b/libbirdfont/OpenFontFormat/KernList.vala@@ -43,8 +43,9 @@ public class KernList : GLib.Object { 		 		KerningClasses.get_instance ().all_pairs ((kp) => { 			uint16 gid_left, gid_right;-			unowned List<Kerning> kerning;+			Kerning kerning; 			KerningPair kerning_pair = kp;+			int i; 			 			if (unlikely (kerning_pair.character.get_name () == "")) { 				warning ("No name for glyph");@@ -55,21 +56,16 @@ public class KernList : GLib.Object { 			current_pairs.left = gid_left; 			pairs.append (current_pairs); 			-			kerning = kerning_pair.kerning.first ();-			-			if (unlikely (is_null (kerning))) {-				warning ("No kerning");-			}-			-			if (unlikely (kerning_pair.kerning.length () == 0)) {+			if (unlikely (kerning_pair.kerning.size == 0)) { 				warning ("No pairs."); 			} 			-			num_pairs += kerning_pair.kerning.length ();+			i = 0;+			num_pairs += kerning_pair.kerning.size; 			foreach (Kerning k in kerning_pair.kerning) {+				kerning = kerning_pair.kerning.get (i); 				gid_right = (uint16) glyf_table.get_gid (k.get_glyph ().get_name ());-				current_pairs.pairs.append (new Kern (gid_left, gid_right, (int16) (kerning.data.val * HeadTable.UNITS)));-				kerning = kerning.next;+				current_pairs.pairs.append (new Kern (gid_left, gid_right, (int16) (kerning.val * HeadTable.UNITS))); 			} 		}); 		diff --git a/libbirdfont/TrackTool.vala b/libbirdfont/TrackTool.valaindex 5493185..80b9458 100644--- a/libbirdfont/TrackTool.vala+++ b/libbirdfont/TrackTool.vala@@ -458,6 +458,7 @@ public class TrackTool : Tool { 		EditPoint average; 		Path p; 		Glyph glyph;+		Gee.ArrayList<EditPoint> points = new Gee.ArrayList<EditPoint> (); 		 		if (added_points == 0) { 			warning ("No points to add.");@@ -481,15 +482,13 @@ public class TrackTool : Tool { 		sum_x = 0; 		sum_y = 0; 		-		List<EditPoint> points = new List<EditPoint> ();-		 		last_point = p.points.last ().data; 		 		for (int i = 0; i < added_points; i++) { 			ep = p.delete_last_point (); 			sum_x += ep.x; 			sum_y += ep.y;			-			points.append (ep);+			points.add (ep); 		} 		 		nx = sum_x / added_points;

Contact

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