Clone in a terminal:
Commit b69e2e1
Johan Mattsson - 2015-05-01T07:23:00+00:00
b69e2e1d3ea1e3d73d5f8b5a9180c67fb03c53b0johan.mattsson.m@gmail.com

Select paths

Changed files (2)

Diff

diff --git a/libbirdfont/ClickMap.vala b/libbirdfont/ClickMap.valadeleted file mode 100644index 180dff8..0000000--- a/libbirdfont/ClickMap.vala+++ /dev/null@@ -1,118 +0,0 @@-/*-    Copyright (C) 2014 2015 Johan Mattsson--    This library is free software; you can redistribute it and/or modify -    it under the terms of the GNU Lesser General Public License as -    published by the Free Software Foundation; either version 3 of the -    License, or (at your option) any later version.--    This library is distributed in the hope that it will be useful, but -    WITHOUT ANY WARRANTY; without even the implied warranty of -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -    Lesser General Public License for more details.-*/--using Cairo;--namespace BirdFont {--public class ClickMap : GLib.Object {-	public ImageSurface map;-	public int width;-	-	public double xmax;-	public double ymax;-	public double xmin;-	public double ymin;-		-	public ClickMap (int width) {-		this.width = width;-		map = new Cairo.ImageSurface (Cairo.Format.ARGB32, width, width);-		xmax = 0;-		ymax = 0;-		xmin = 0;-		ymin = 0;-	}-		-	public bool get_value (int x, int y) {-		unowned uchar[] d = map.get_data ();-		bool transparent;--		Context c;-		-		c = new Context (map);-		c.set_fill_rule (Cairo.FillRule.WINDING);-		-		if (unlikely (!(0 <= x < width && 0 <= y < width))) {-			warning (@"Array index out of bounds. x: $x  y: $y size: $width");-			return true;-		}-		-		transparent = d[y * map.get_stride () + 4 * x + 3] == 0;-		-		return !transparent;-	}-	-	bool add_point (Context c, double cx, double cy) {-		int px = (int) (width * ((cx - xmin) / (xmax - xmin)));-		int py = (int) (width * ((cy - ymin) / (ymax - ymin)));-		c.line_to (px, py);-		return true;-	}-	-	public void create_click_map (Path path, Path? counter = null) { // FIXME: clean up-		Path p;-		Context c;-		-		c = new Context (map);-		-		if (counter == null) {-			xmax = path.xmax;-			ymax = path.ymax;-			xmin = path.xmin;-			ymin = path.ymin;-		} else {-			p = (!) counter;-			-			xmax = fmax (p.xmax, path.xmax);-			ymax = fmax (p.ymax, path.ymax);-			xmin = fmin (p.xmin, path.xmin);-			ymin = fmin (p.ymin, path.ymin);-		}-		-		c.save ();-		c.set_fill_rule (FillRule.EVEN_ODD);-		c.set_source_rgba (0, 0, 0, 1);-		c.new_path ();-		path.all_of_path ((cx, cy) => {-			add_point (c, cx, cy);-			return true;-		}, 2 * width);-		c.close_path ();	-		-		if (counter != null) {-			c.new_path ();-		-			p = (!) counter;-			p.all_of_path ((cx, cy) => {-				add_point (c, cx, cy);-				return true;-			}, 2 * width);-			-			c.close_path ();-		}-		-		c.fill ();-		c.restore ();-	}  -}--static double fmin (double a, double b) {-	return a < b ? a : b;-}--static double fmax (double a, double b) {-	return a > b ? a : b;-}-	-}diff --git a/libbirdfont/Path.vala b/libbirdfont/Path.valaindex 6a7c489..0560368 100644--- a/libbirdfont/Path.vala+++ b/libbirdfont/Path.vala@@ -817,44 +817,23 @@ public class Path {  	/** Variable precision */ 	public bool is_over_coordinate_var (double x, double y) {-		PathList pathlist;-		int width;-		ClickMap click_map;-		int px, py;-		int click_x, click_y;+		int insides = 0; 		-		if (points.size < 2) {-			return false;-		}- 		if (stroke > 0) {-			pathlist = get_stroke_fast (); // FIXME: add to clickmap instead-			-			if (pathlist.paths.size > 1) {-				if (pathlist.paths.get (1).is_over_coordinate_var (x, y)) {-					return false;+			foreach (Path p in get_stroke_fast ().paths) {+				if (StrokeTool.is_inside (new EditPoint (x, y), p)) {+					insides++; 				} 			} 			-			return pathlist.get_first_path ().is_over_coordinate_var (x, y);-		}	-		-		if (!is_over_boundry (x, y)) {-			return false;+			if (insides % 2 == 1) {+				return true;+			}+		} else if (is_over_boundry (x, y)) {+			return StrokeTool.is_inside (new EditPoint (x, y), this); 		}-			-		// generate a rasterized image of the object-		width = 160;-		click_map = new ClickMap (width);-		px = 0;-		py = 0; 		-		click_map.create_click_map (this);--		click_x = (int) (width * ((x - xmin) / (xmax - xmin)));-		click_y = (int) (width * ((y - ymin) / (ymax - ymin)));--		return click_map.get_value (click_x, click_y);+		return false; 	} 	 	public bool is_over_boundry (double x, double y) {

Contact

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