From 720280dd433b8b15b2cabb3eb3826c793a64c25e Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Mar 05 2018 12:25:17 +0000 Subject: assistance: ToolFull --- diff --git a/mono/Assistance/Assistance.csproj b/mono/Assistance/Assistance.csproj index fd7d1c5..c23bc66 100644 --- a/mono/Assistance/Assistance.csproj +++ b/mono/Assistance/Assistance.csproj @@ -58,6 +58,8 @@ + + diff --git a/mono/Assistance/Canvas.cs b/mono/Assistance/Canvas.cs index 9ee910d..cf2360a 100644 --- a/mono/Assistance/Canvas.cs +++ b/mono/Assistance/Canvas.cs @@ -2,73 +2,7 @@ using System; using System.Collections.Generic; namespace Assistance { - public class Canvas { - public static readonly int initialSize = 100; - public static readonly double incrementScale = 1.2; - - private int offsetX = -initialSize/2; - private int offsetY = -initialSize/2; - private Cairo.ImageSurface surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, initialSize, initialSize); - - public void draw(Cairo.Context context) { - context.Save(); - context.Translate(offsetX, offsetY); - context.SetSource(surface); - context.Paint(); - context.Restore(); - } - - public void expand(Rectangle rect) { - int l = offsetX; - int t = offsetY; - int r = l + surface.Width; - int b = t + surface.Height; - - int rl = (int)Math.Floor(rect.x0); - int rt = (int)Math.Floor(rect.y0); - int rr = Math.Max(rl, (int)Math.Ceiling(rect.x1)); - int rb = Math.Max(rt, (int)Math.Ceiling(rect.y1)); - - int incX = (int)Math.Ceiling(surface.Width*incrementScale); - int incY = (int)Math.Ceiling(surface.Height*incrementScale); - - if (rl < l) l = rl - incX; - if (rt < t) t = rt - incY; - if (rr > r) r = rr + incX; - if (rb > b) b = rb + incY; - - int w = r - l; - int h = b - t; - if (l != offsetX || t != offsetY || w != surface.Width || h != surface.Height) { - Cairo.ImageSurface newSurface = new Cairo.ImageSurface(Cairo.Format.ARGB32, w, h); - Cairo.Context context = new Cairo.Context(newSurface); - context.Translate(offsetX - l, offsetY - t); - context.SetSource(surface); - context.Paint(); - context.GetTarget().Flush(); - context.Dispose(); - surface.Dispose(); - - offsetX = l; - offsetY = t; - surface = newSurface; - } - } - - private Cairo.Context getContext() { - Cairo.Context context = new Cairo.Context(surface); - context.Antialias = Cairo.Antialias.Gray; - context.Translate(-offsetX, -offsetY); - return context; - } - - public void paintTrack(Track track) { - expand(track.getBounds()); - Cairo.Context context = getContext(); - track.draw(context); - context.GetTarget().Flush(); - context.Dispose(); - } + public class Canvas: DynamicSurface { } } diff --git a/mono/Assistance/InputManager.cs b/mono/Assistance/InputManager.cs index ddd1903..2023aff 100644 --- a/mono/Assistance/InputManager.cs +++ b/mono/Assistance/InputManager.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; namespace Assistance { public class InputManager: Track.IOwner { public static readonly Drawing.Pen penPreview = new Drawing.Pen("Dark Green", 1.0, 0.25); + public static readonly double levelAlpha = 0.8; public class TrackHandler: Track.Handler { public readonly List keys = new List(); @@ -116,7 +117,9 @@ namespace Assistance { if (level < keyPointsSent) { // apply - keyPointsSent -= tool.paintApply(keyPointsSent - level); + int applied = tool.paintApply(keyPointsSent - level); + applied = Math.Max(0, Math.Min(keyPointsSent - level, applied)); + keyPointsSent -= applied; foreach(Track track in subTracks) { TrackHandler handler = (TrackHandler)track.handler; handler.keys.RemoveRange(keyPointsSent, handler.keys.Count - keyPointsSent); @@ -185,7 +188,7 @@ namespace Assistance { } // send to tool - if (keyPointsSent == keyPoints.Count) + if (keyPointsSent == keyPoints.Count && subTracks.Count > 0) tool.paintTracks(subTracks); // is paint finished? @@ -365,9 +368,21 @@ namespace Assistance { TrackHandler handler = (TrackHandler)track.handler; int start = handler.keys[keyPointsSent]; if (start < track.points.Count) { + Drawing.Color color = penPreview.color; + int level = keyPointsSent; + + color.apply(context); context.MoveTo(track.points[start].point.position.x, track.points[start].point.position.y); - for(int i = start + 1; i < track.points.Count; ++i) - context.MoveTo(track.points[i].point.position.x, track.points[i].point.position.y); + for(int i = start + 1; i < track.points.Count; ++i) { + while(level < handler.keys.Count && handler.keys[level] <= i) { + context.Stroke(); + context.MoveTo(track.points[i-1].point.position.x, track.points[i-1].point.position.y); + color.a *= levelAlpha; + color.apply(context); + ++level; + } + context.LineTo(track.points[i].point.position.x, track.points[i].point.position.y); + } } } context.Stroke(); diff --git a/mono/Assistance/Tool.cs b/mono/Assistance/Tool.cs index 2740d17..710faa0 100644 --- a/mono/Assistance/Tool.cs +++ b/mono/Assistance/Tool.cs @@ -9,8 +9,16 @@ namespace Assistance { Tangents = 1, Interpolation = 2, Guideline = 4, - Multiline = 8 + Multiline = 8, + All = 15 }; + + + public readonly Workarea workarea; + + + public Tool(Workarea workarea) + { this.workarea = workarea; } public virtual ModifierTypes getAvailableModifierTypes() { return ModifierTypes.None; } @@ -30,7 +38,7 @@ namespace Assistance { // become: ------O-------O------------ public virtual void paintTracks(List tracks) { } - // try to merge N top painting levels and return true, or do nothing and return false + // try to merge N top painting levels and return count of levels that actually merged // was: ------O-------O------O------ // become (N = 2): ------O--------------------- public virtual int paintApply(int count) { return 0; } diff --git a/mono/Assistance/Track.cs b/mono/Assistance/Track.cs index 66cac1f..93f0b3d 100644 --- a/mono/Assistance/Track.cs +++ b/mono/Assistance/Track.cs @@ -138,6 +138,8 @@ namespace Assistance { { get { return modifier != null ? modifier.original : null; } } public double timeOffset { get { return modifier != null ? modifier.timeOffset : 0.0; } } + public long ticks + { get { return keyHistory.ticks; } } public bool isChanged { get { return wayPointsAdded != 0 || wayPointsRemoved != 0; } } @@ -168,7 +170,7 @@ namespace Assistance { public int floorIndex(double index) { return clampIndex((int)Math.Floor(index + Geometry.precision)); } public int ceilIndex(double index) - { return clampIndex((int)Math.Floor(index + Geometry.precision)); } + { return clampIndex((int)Math.Ceiling(index - Geometry.precision)); } public WayPoint getWayPoint(int index) { index = clampIndex(index);