Clone in a terminal:
Commit 1c06696
Johan Mattsson - 2016-06-18T19:08:49+00:00
1c06696a91146c878fb6fc4a31d293b415a8fe0bjohan.mattsson.m@gmail.com

Bounding box for SVG rectangles

Changed files (17)

Diff

diff --git a/libbirdfont/EmbeddedSvg.vala b/libbirdfont/EmbeddedSvg.valaindex 38c5add..9ca2bde 100644--- a/libbirdfont/EmbeddedSvg.vala+++ b/libbirdfont/EmbeddedSvg.vala@@ -25,49 +25,18 @@ public class EmbeddedSvg : SvgBird.Object { 	 	public double x { get; set; } 	public double y { get; set; }--	public override double left { -		get {-			return x + drawing.left;-		}-		-		set {-		}-	}-	-	public override double right { -		get {-			return x + drawing.right;-		}-		-		set {-		}-	}--	public override double top {-		get {-			return drawing.top - y;-		}-		-		set {-		}-	}--	public override double bottom {-		get {-			return drawing.bottom - y;-		}-		-		set {-		}-	} 		 	public EmbeddedSvg (SvgDrawing drawing) { 		this.drawing = drawing; 	} -	public override void update_region_boundaries () {-		drawing.update_region_boundaries ();+	public override void update_boundaries (Matrix view_matrix) {+		drawing.update_boundaries (view_matrix);+		+		left = x + drawing.left;+		right = x + drawing.right;+		top = -y + drawing.top;+		bottom = -y + drawing.bottom; 	}  	public override bool is_over (double x, double y) {@@ -88,6 +57,7 @@ public class EmbeddedSvg : SvgBird.Object { 	public override void move (double dx, double dy) { 		x += dx; 		y += dy;+		move_bounding_box (dx, -dy); 	} 	 	public override void rotate (double theta, double xc, double yc) {diff --git a/libbirdfont/MenuTab.vala b/libbirdfont/MenuTab.valaindex 6283739..fbd03af 100644--- a/libbirdfont/MenuTab.vala+++ b/libbirdfont/MenuTab.vala@@ -89,7 +89,7 @@ public class MenuTab : FontDisplay { 			GlyphCanvas.redraw ();			 			return false; 		});-		idle.attach (null);+		idle.attach (MainContext.default ()); 	} 	 	public static bool validate_metadata () {diff --git a/libbirdfont/MoveTool.vala b/libbirdfont/MoveTool.valaindex f6c6bfd..bfb3ca0 100644--- a/libbirdfont/MoveTool.vala+++ b/libbirdfont/MoveTool.vala@@ -127,7 +127,7 @@ public class MoveTool : Tool { 			moved = true;  			delta_x = -dx;-			delta_y = -dy;+			delta_y = dy; 			 			foreach (SvgBird.Object object in glyph.active_paths) { 				object.move (delta_x, delta_y);diff --git a/libbirdfont/PathObject.vala b/libbirdfont/PathObject.valaindex cd6269a..3e4a135 100644--- a/libbirdfont/PathObject.vala+++ b/libbirdfont/PathObject.vala@@ -70,7 +70,6 @@ public class PathObject : SvgBird.Object { 	public PathObject () { 		base (); 		path = new Path ();-		update_region_boundaries (); 	}  	public PathObject.create_copy (PathObject p) {@@ -114,7 +113,7 @@ public class PathObject : SvgBird.Object { 		return path; 	} -	public override void update_region_boundaries () {+	public override void update_boundaries (Matrix matrix) { 		xmin = Glyph.CANVAS_MAX; 		xmax = Glyph.CANVAS_MIN; 		ymin = Glyph.CANVAS_MAX;diff --git a/libbirdfont/ResizeTool.vala b/libbirdfont/ResizeTool.valaindex 1a67b82..3640854 100644--- a/libbirdfont/ResizeTool.vala+++ b/libbirdfont/ResizeTool.vala@@ -555,7 +555,7 @@ public class ResizeTool : Tool { 				Path p = ((PathObject) path).get_path (); 				SvgParser.apply_matrix (p, 1, 0, s, 1, 0, 0); 				p.skew = skew;-				path.update_region_boundaries ();+				path.update_boundaries (Matrix.identity ()); 			} 		} 		diff --git a/libbirdfont/SvgParser.vala b/libbirdfont/SvgParser.valaindex 58f2486..851e429 100644--- a/libbirdfont/SvgParser.vala+++ b/libbirdfont/SvgParser.vala@@ -155,7 +155,7 @@ public class SvgParser { 			PathObject path = new PathObject.for_path (p); 			glyph.add_object (path); 			glyph.add_active_object (null, path); // FIXME: groups-			path.update_region_boundaries ();+			path.update_boundaries (Cairo.Matrix.identity ()); 		} 		 		glyph.close_path ();	diff --git a/libsvgbird/Circle.vala b/libsvgbird/Circle.valaindex a16dac0..e0728c7 100644--- a/libsvgbird/Circle.vala+++ b/libsvgbird/Circle.vala@@ -36,9 +36,6 @@ public class Circle : Object {  	public override void move (double dx, double dy) { 	}-	-	public override void update_region_boundaries () {-	}  	public override void rotate (double theta, double xc, double yc) { 	}diff --git a/libsvgbird/Ellipse.vala b/libsvgbird/Ellipse.valaindex 24eef9d..db2cb43 100644--- a/libsvgbird/Ellipse.vala+++ b/libsvgbird/Ellipse.vala@@ -42,9 +42,6 @@ public class Ellipse : Object {  	public override void move (double dx, double dy) { 	}-	-	public override void update_region_boundaries () {-	}  	public override void rotate (double theta, double xc, double yc) { 	}diff --git a/libsvgbird/EmptyObject.vala b/libsvgbird/EmptyObject.valaindex fb1bc4d..cd0545e 100644--- a/libsvgbird/EmptyObject.vala+++ b/libsvgbird/EmptyObject.vala@@ -31,9 +31,6 @@ public class EmptyObject : Object { 	public override void move (double dx, double dy) { 	} 	-	public override void update_region_boundaries () {-	}- 	public override void rotate (double theta, double xc, double yc) { 	} 	diff --git a/libsvgbird/Layer.vala b/libsvgbird/Layer.valaindex 70d8146..6686cb7 100644--- a/libsvgbird/Layer.vala+++ b/libsvgbird/Layer.vala@@ -194,9 +194,6 @@ public class Layer : Object { 		 	public override void move (double dx, double dy) { 	}-	-	public override void update_region_boundaries () {-	}  	public override void rotate (double theta, double xc, double yc) { 	}diff --git a/libsvgbird/Line.vala b/libsvgbird/Line.valaindex d43416a..5b0d0b2 100644--- a/libsvgbird/Line.vala+++ b/libsvgbird/Line.vala@@ -47,9 +47,6 @@ public class Line : Object { 	public override void move (double dx, double dy) { 	} 	-	public override void update_region_boundaries () {-	}- 	public override void rotate (double theta, double xc, double yc) { 	} 	diff --git a/libsvgbird/Object.vala b/libsvgbird/Object.valaindex 1c15e7c..173ea48 100644--- a/libsvgbird/Object.vala+++ b/libsvgbird/Object.vala@@ -114,15 +114,21 @@ public abstract class Object : GLib.Object { 		return open; 	} -	public abstract void update_region_boundaries (); 	public abstract bool is_over (double x, double y); 	public abstract void draw_outline (Context cr);  	public abstract Object copy ();-	public abstract void move (double dx, double dy); 	public abstract void rotate (double theta, double xc, double yc); 	public abstract bool is_empty (); 	public abstract void resize (double ratio_x, double ratio_y);+	public abstract void move (double dx, double dy);+	+	public virtual void move_bounding_box (double dx, double dy) {+		top += dy;+		bottom += dy;+		left += dx;+		right += dx;+	}  	public static void copy_attributes (Object from, Object to) { 		to.open = from.open;diff --git a/libsvgbird/Polygon.vala b/libsvgbird/Polygon.valaindex c7c38fc..c62d678 100644--- a/libsvgbird/Polygon.vala+++ b/libsvgbird/Polygon.vala@@ -43,9 +43,6 @@ public class Polygon : Object { 	public override void move (double dx, double dy) { 	} 	-	public override void update_region_boundaries () {-	}- 	public override void rotate (double theta, double xc, double yc) { 	} 	diff --git a/libsvgbird/Polyline.vala b/libsvgbird/Polyline.valaindex 4128b6e..c0ee474 100644--- a/libsvgbird/Polyline.vala+++ b/libsvgbird/Polyline.vala@@ -40,9 +40,6 @@ public class Polyline : Object { 	 	public override void move (double dx, double dy) { 	}-	-	public override void update_region_boundaries () {-	}  	public override void rotate (double theta, double xc, double yc) { 	}diff --git a/libsvgbird/Rectangle.vala b/libsvgbird/Rectangle.valaindex e80a591..58bfbc4 100644--- a/libsvgbird/Rectangle.vala+++ b/libsvgbird/Rectangle.vala@@ -64,9 +64,6 @@ public class Rectangle : Object { 		x += dx; 		y += dy; 	}-	-	public override void update_region_boundaries () {-	}  	public override void rotate (double theta, double xc, double yc) { 	}@@ -96,6 +93,74 @@ public class Rectangle : Object { 	public override string to_string () { 		return "Rectangle"; 	}++	public override void update_boundaries (Matrix view_matrix) {+		Matrix object_matrix = transforms.get_matrix ();+		object_matrix.multiply (object_matrix, view_matrix);++		double x0, x1, x2, x3;+		double y0, y1, y2, y3;++		double half_stroke_width = style.stroke_width / 2;+		+		x0 = x - half_stroke_width;+		y0 = y - half_stroke_width;++		x1 = x + width + half_stroke_width;+		y1 = y - half_stroke_width;++		x2 = x + width + half_stroke_width;+		y2 = y + height + half_stroke_width;++		x3 = x - half_stroke_width;+		y3 = y + height + half_stroke_width;+		+		object_matrix.transform_point (ref x0, ref y0);+		object_matrix.transform_point (ref x1, ref y1);+		object_matrix.transform_point (ref x2, ref y2);+		object_matrix.transform_point (ref x3, ref y3);+		+		top = min (y0, y1, y2, y3);+		bottom = max (y0, y1, y2, y3);+		left = min (x0, x1, x2, x3);+		right = max (x0, x1, x2, x3);+	}+	+	double min (double x0, double x1, double x2, double x3) {+		double m = x0;+		+		if (x1 < m) {+			m = x1;+		}+		+		if (x2 < m) {+			m = x2;+		}+		+		if (x3 < m) {+			m = x3;+		}+		+		return m;+	}+	+	double max (double x0, double x1, double x2, double x3) {+		double m = x0;+		+		if (x1 > m) {+			m = x1;+		}+		+		if (x2 > m) {+			m = x2;+		}+		+		if (x3 > m) {+			m = x3;+		}++		return m;+	} }  }diff --git a/libsvgbird/SvgDrawing.vala b/libsvgbird/SvgDrawing.valaindex 5b870b1..d1e820c 100644--- a/libsvgbird/SvgDrawing.vala+++ b/libsvgbird/SvgDrawing.vala@@ -49,43 +49,13 @@ public class SvgDrawing : Object { 	public double svg_width = 0; 	public double svg_height = 0; -	public override double left {-		get {-			return root_layer.left;-		}--		set {-		}-	}--	public override double right {-		get {-			return root_layer.right;-		}+	public override void update_boundaries (Matrix view_matrix) {+		root_layer.update_boundaries (view_matrix); 		-		set {-		}-	}--	public override double top {-		get {-			return root_layer.top;-		}-		-		set {-		}-	}--	public override double bottom {-		get {-			return root_layer.bottom;-		}-		-		set {-		}-	}--	public override void update_region_boundaries () {+		left = x + root_layer.left;+		right = x + root_layer.right;+		top = y + root_layer.top;+		bottom = y + root_layer.bottom; 	} 	 	public override bool is_over (double x, double y) {@@ -116,6 +86,7 @@ public class SvgDrawing : Object { 	public override void move (double dx, double dy) { 		x += dx; 		y += dy;+		move_bounding_box (dx, dy); 	} 	 	public override void rotate (double theta, double xc, double yc) {diff --git a/libsvgbird/SvgPath.vala b/libsvgbird/SvgPath.valaindex 831bd8b..936d638 100644--- a/libsvgbird/SvgPath.vala+++ b/libsvgbird/SvgPath.vala@@ -95,9 +95,6 @@ public class SvgPath : Object { 	public override void move (double dx, double dy) { 	} 	-	public override void update_region_boundaries () {-	}- 	public override void rotate (double theta, double xc, double yc) { 	} 	

Contact

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