public override HistoryMemento OnExecute(IHistoryWorkspace historyWorkspace) { if ((this.layerIndex < 1) || (this.layerIndex >= historyWorkspace.Document.Layers.Count)) { object[] objArray1 = new object[] { "layerIndex must be greater than or equal to 1, and a valid layer index. layerIndex=", this.layerIndex, ", allowableRange=[0,", historyWorkspace.Document.Layers.Count, ")" }; throw new ArgumentException(string.Concat(objArray1)); } int layerIndex = this.layerIndex - 1; RectInt32 rect = historyWorkspace.Document.Bounds(); GeometryList list = new GeometryList(); list.AddRect(rect); RectInt32[] changedRegion = list.EnumerateInteriorScans().ToArrayEx <RectInt32>(); BitmapHistoryMemento memento = new BitmapHistoryMemento(null, null, historyWorkspace, layerIndex, changedRegion); BitmapLayer layer = (BitmapLayer)historyWorkspace.Document.Layers[this.layerIndex]; BitmapLayer layer2 = (BitmapLayer)historyWorkspace.Document.Layers[layerIndex]; RenderArgs args = new RenderArgs(layer2.Surface); base.EnterCriticalRegion(); foreach (RectInt32 num4 in changedRegion) { layer.Render(args, num4.ToGdipRectangle()); } layer2.Invalidate(); args.Dispose(); args = null; list = null; HistoryMemento memento2 = new DeleteLayerFunction(this.layerIndex).Execute(historyWorkspace); return(new CompoundHistoryMemento(StaticName, StaticImage, new HistoryMemento[] { memento, memento2 })); }
private static BitVector2D PixelatedGeometryListToBitVector2D(GeometryList geometry, int width, int height, CancellationToken cancellationToken) { BitVector2D vectord = new BitVector2D(width, height); foreach (RectInt32 num in geometry.EnumerateInteriorScans()) { cancellationToken.ThrowIfCancellationRequested(); vectord.Set(num, true); } return(vectord); }
public override HistoryMemento OnExecute(IHistoryWorkspace historyWorkspace) { if (historyWorkspace.Selection.IsEmpty) { return(null); } SelectionHistoryMemento memento = new SelectionHistoryMemento(StaticName, StaticImage, historyWorkspace); GeometryList selectedPath = historyWorkspace.Selection.GetCachedGeometryList(); SelectionRenderingQuality selectionRenderingQuality = historyWorkspace.ToolSettings.Selection.RenderingQuality.Value; Result <IReadOnlyList <RectInt32> > selectedPathScansLazy = historyWorkspace.Selection.GetCachedLazyClippingMaskScans(); RectInt32 documentBounds = historyWorkspace.Document.Bounds(); Func <GeometryList> invertedPathFn = delegate { if ((selectionRenderingQuality == SelectionRenderingQuality.Aliased) || selectedPath.IsPixelated) { GeometryList list2 = GeometryList.FromNonOverlappingSortedScans(selectedPathScansLazy.Value); list2.AddRect(documentBounds); SegmentedList <RectInt32> scans = new SegmentedList <RectInt32>(); foreach (RectInt32 num in list2.EnumerateInteriorScans()) { if (documentBounds.Contains(num)) { scans.Add(num); } else if (documentBounds.IntersectsWith(num)) { scans.Add(RectInt32.Intersect(documentBounds, num)); } } return(GeometryList.FromNonOverlappingScans(scans)); } GeometryList lhs = documentBounds.Contains(selectedPath.Bounds) ? selectedPath : GeometryList.ClipToRect(selectedPath, documentBounds); return(GeometryList.Combine(lhs, GeometryCombineMode.Xor, documentBounds)); }; ThreadTask <GeometryList> task = historyWorkspace.TaskManager.StartNewThreadTask <GeometryList>(task => invertedPathFn(), ApartmentState.MTA); ManualResetEvent taskFinishedEvent = new ManualResetEvent(false); task.ResultAsync <GeometryList>().Receive(delegate(Result <GeometryList> r) { taskFinishedEvent.Set(); }).Observe(); if (!taskFinishedEvent.WaitOne(0x3e8)) { using (TaskProgressDialog dialog = new TaskProgressDialog()) { dialog.Task = task; dialog.Text = StaticName; dialog.Icon = StaticImage.Reference.ToIcon(); dialog.HeaderText = PdnResources.GetString("SaveConfigDialog.Finishing.Text"); dialog.ShowDialog(historyWorkspace.Window); } } Result <GeometryList> taskResult = task.TaskResult; if (taskResult.IsError) { if (taskResult.Error is OutOfMemoryException) { throw new OutOfMemoryException(null, taskResult.Error); } throw new AggregateException(null, taskResult.Error); } GeometryList geometry = task.TaskResult.Value; base.EnterCriticalRegion(); using (historyWorkspace.Selection.UseChangeScope()) { historyWorkspace.Selection.Reset(); geometry.Freeze(); historyWorkspace.Selection.SetContinuation(geometry, SelectionCombineMode.Replace); historyWorkspace.Selection.CommitContinuation(); } return(memento); }