private void Activate() { this._active = true; this.HandCursor = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursor.cur")); this.HandCursorMouseDown = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorMouseDown.cur")); this.HandCursorInvalid = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorInvalid.cur")); this.HandCursor = Cursors.Hand; this.HandCursorMouseDown = Cursors.Arrow; this.HandCursorInvalid = Cursors.Arrow; this._mouseDownCount = 0; this._savedTiles = null; this._saveRegion = null; this._scratchSurface = DocumentWorkspace.BorrowScratchSurface(); // // Selection.Changing += new EventHandler(SelectionChangingHandler); // Selection.Changed += new EventHandler(SelectionChangedHandler); // HistoryStack.ExecutingHistoryMemento += new ExecutingHistoryMementoEventHandler(ExecutingHistoryMemento); // HistoryStack.ExecutedHistoryMemento += new ExecutedHistoryMementoEventHandler(ExecutedHistoryMemento); // HistoryStack.FinishedStepGroup += new EventHandler(FinishedHistoryStepGroup); this._trackingNub = new MoveNubRenderer(this.RendererList); this._trackingNub.Visible = false; this._trackingNub.Size = new SizeF(10, 10); this._trackingNub.Shape = MoveNubShape.Compass; this.RendererList.Add(this._trackingNub, false); OnActivate(); }
private void Activate() { Debug.Assert(this.active != true, "already active!"); this.active = true; this.handCursor = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursor.cur")); this.handCursorMouseDown = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorMouseDown.cur")); this.handCursorInvalid = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorInvalid.cur")); this.panTracking = false; this.panMode = false; this.mouseDown = 0; this.savedTiles = null; this.saveRegion = null; this.scratchSurface = DocumentWorkspace.BorrowScratchSurface(this.GetType().Name + ": Tool.Activate()"); #if DEBUG this.haveClearedScratch = false; #endif Selection.Changing += new EventHandler(SelectionChangingHandler); Selection.Changed += new EventHandler(SelectionChangedHandler); HistoryStack.ExecutingHistoryMemento += new ExecutingHistoryMementoEventHandler(ExecutingHistoryMemento); HistoryStack.ExecutedHistoryMemento += new ExecutedHistoryMementoEventHandler(ExecutedHistoryMemento); HistoryStack.FinishedStepGroup += new EventHandler(FinishedHistoryStepGroup); this.trackingNub = new MoveNubRenderer(this.RendererList); this.trackingNub.Visible = false; this.trackingNub.Size = new SizeF(10, 10); this.trackingNub.Shape = MoveNubShape.Compass; this.RendererList.Add(this.trackingNub, false); OnActivate(); }
private void RepeatEffectMenuItem_Click(object sender, EventArgs e) { Exception exception = null; Effect effect = null; DocumentWorkspace activeDW = AppWorkspace.ActiveDocumentWorkspace; if (activeDW != null) { using (new PushNullToolMode(activeDW)) { Surface copy = activeDW.BorrowScratchSurface(this.GetType() + ".RepeatEffectMenuItem_Click() utilizing scratch for rendering"); try { using (new WaitCursorChanger(AppWorkspace)) { copy.CopySurface(((BitmapLayer)activeDW.ActiveLayer).Surface); } PdnRegion selectedRegion = activeDW.Selection.CreateRegion(); EffectEnvironmentParameters eep = new EffectEnvironmentParameters( AppWorkspace.AppEnvironment.PrimaryColor, AppWorkspace.AppEnvironment.SecondaryColor, AppWorkspace.AppEnvironment.PenInfo.Width, selectedRegion, copy); effect = (Effect)Activator.CreateInstance(this.lastEffect.GetType()); effect.EnvironmentParameters = eep; EffectConfigToken token; if (this.lastEffectToken == null) { token = null; } else { token = (EffectConfigToken)this.lastEffectToken.Clone(); } DoEffect(effect, token, selectedRegion, selectedRegion, copy, out exception); } finally { activeDW.ReturnScratchSurface(copy); } } } if (exception != null) { HandleEffectException(AppWorkspace, effect, exception); } }
public override HistoryMemento PerformAction(DocumentWorkspace documentWorkspace) { if (!ScanningAndPrinting.CanPrint) { Utility.ShowWiaError(documentWorkspace); return null; } using (new PushNullToolMode(documentWorkspace)) { // render image to a bitmap, save it to disk Surface scratch = documentWorkspace.BorrowScratchSurface(this.GetType().Name + ".PerformAction()"); try { scratch.Clear(); RenderArgs ra = new RenderArgs(scratch); documentWorkspace.Update(); using (new WaitCursorChanger(documentWorkspace)) { ra.Surface.Clear(ColorBgra.White); documentWorkspace.Document.Render(ra, false); } string tempName = Path.GetTempFileName() + ".bmp"; ra.Bitmap.Save(tempName, ImageFormat.Bmp); try { ScanningAndPrinting.Print(documentWorkspace, tempName); } catch (Exception ex) { Utility.ShowWiaError(documentWorkspace); Tracing.Ping(ex.ToString()); // TODO: do a "better" error dialog here } // Try to delete the temp file but don't worry if we can't bool result = FileSystem.TryDeleteFile(tempName); } finally { documentWorkspace.ReturnScratchSurface(scratch); } } return null; }
public override HistoryMemento PerformAction(DocumentWorkspace documentWorkspace) { if (!ScanningAndPrinting.CanPrint) { Utility.ShowWiaError(documentWorkspace); return(null); } using (new PushNullToolMode(documentWorkspace)) { // render image to a bitmap, save it to disk Surface scratch = documentWorkspace.BorrowScratchSurface(this.GetType().Name + ".PerformAction()"); try { scratch.Clear(); RenderArgs ra = new RenderArgs(scratch); documentWorkspace.Update(); using (new WaitCursorChanger(documentWorkspace)) { ra.Surface.Clear(ColorBgra.White); documentWorkspace.Document.Render(ra, false); } string tempName = Path.GetTempFileName() + ".bmp"; ra.Bitmap.Save(tempName, ImageFormat.Bmp); try { ScanningAndPrinting.Print(documentWorkspace, tempName); } catch (Exception ex) { Utility.ShowWiaError(documentWorkspace); Tracing.Ping(ex.ToString()); // TODO: do a "better" error dialog here } // Try to delete the temp file but don't worry if we can't bool result = FileSystem.TryDeleteFile(tempName); } finally { documentWorkspace.ReturnScratchSurface(scratch); } } return(null); }
public override HistoryMemento PerformAction(DocumentWorkspace documentWorkspace) { if (!ScanningAndPrinting.CanPrint) { ShowWiaError(documentWorkspace); return(null); } using (new PushNullToolMode(documentWorkspace)) { Surface surface = documentWorkspace.BorrowScratchSurface(base.GetType().Name + ".PerformAction()"); try { surface.Clear(); RenderArgs args = new RenderArgs(surface); documentWorkspace.QueueUpdate(); using (new WaitCursorChanger(documentWorkspace)) { args.Surface.Clear(ColorBgra.White); documentWorkspace.Document.Render(args, false); } string filename = Path.GetTempFileName() + ".bmp"; args.Bitmap.Save(filename, ImageFormat.Bmp); try { ScanningAndPrinting.Print(documentWorkspace, filename); } catch (Exception) { ShowWiaError(documentWorkspace); } bool flag = FileSystem.TryDeleteFile(filename); } catch (Exception exception) { ExceptionDialog.ShowErrorDialog(documentWorkspace, exception); } finally { documentWorkspace.ReturnScratchSurface(surface); } } return(null); }
public void RunEffect(Type effectType) { bool oldDirtyValue = AppWorkspace.ActiveDocumentWorkspace.Document.Dirty; bool resetDirtyValue = false; AppWorkspace.Update(); // make sure the window is done 'closing' AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); DocumentWorkspace activeDW = AppWorkspace.ActiveDocumentWorkspace; PdnRegion selectedRegion; if (activeDW.Selection.IsEmpty) { selectedRegion = new PdnRegion(activeDW.Document.Bounds); } else { selectedRegion = activeDW.Selection.CreateRegion(); } BitmapLayer layer = (BitmapLayer)activeDW.ActiveLayer; using (new PushNullToolMode(activeDW)) { try { Effect effect = (Effect)Activator.CreateInstance(effectType); EffectEnvironmentParameters eep = new EffectEnvironmentParameters( AppWorkspace.AppEnvironment.PrimaryColor, AppWorkspace.AppEnvironment.SecondaryColor, AppWorkspace.AppEnvironment.PenInfo.Width, selectedRegion); string name = effect.Name; EffectConfigToken newLastToken = null; effect.EnvironmentParameters = eep; if (!(effect.IsConfigurable)) { Surface copy = activeDW.BorrowScratchSurface(this.GetType() + ".RunEffect() using scratch surface for non-configurable rendering"); try { using (new WaitCursorChanger(AppWorkspace)) { copy.CopySurface(layer.Surface); } DoEffect(effect, null, selectedRegion, selectedRegion, copy); } finally { activeDW.ReturnScratchSurface(copy); } } else { PdnRegion previewRegion = (PdnRegion)selectedRegion.Clone(); previewRegion.Intersect(RectangleF.Inflate(activeDW.VisibleDocumentRectangleF, 1, 1)); Surface originalSurface = activeDW.BorrowScratchSurface(this.GetType() + ".RunEffect() using scratch surface for rendering during configuration"); try { using (new WaitCursorChanger(AppWorkspace)) { originalSurface.CopySurface(layer.Surface); } // AppWorkspace.SuspendThumbnailUpdates(); // using (EffectConfigDialog configDialog = effect.CreateConfigDialog()) { configDialog.Opacity = 0.9; configDialog.Effect = effect; configDialog.EffectSourceSurface = originalSurface; configDialog.Selection = selectedRegion; EventHandler eh = new EventHandler(EffectConfigTokenChangedHandler); configDialog.EffectTokenChanged += eh; if (this.effectTokens.ContainsKey(effectType)) { EffectConfigToken oldToken = (EffectConfigToken)effectTokens[effectType].Clone(); configDialog.EffectToken = oldToken; } BackgroundEffectRenderer ber = new BackgroundEffectRenderer( effect, configDialog.EffectToken, new RenderArgs(layer.Surface), new RenderArgs(originalSurface), previewRegion, tilesPerCpu * renderingThreadCount, renderingThreadCount); ber.RenderedTile += new RenderedTileEventHandler(RenderedTileHandler); ber.StartingRendering += new EventHandler(StartingRenderingHandler); ber.FinishedRendering += new EventHandler(FinishedRenderingHandler); configDialog.Tag = ber; invalidateTimer.Enabled = true; DialogResult dr = Utility.ShowDialog(configDialog, AppWorkspace); invalidateTimer.Enabled = false; this.InvalidateTimer_Tick(invalidateTimer, EventArgs.Empty); if (dr == DialogResult.OK) { this.effectTokens[effectType] = (EffectConfigToken)configDialog.EffectToken.Clone(); } using (new WaitCursorChanger(AppWorkspace)) { ber.Abort(); ber.Join(); ber.Dispose(); ber = null; if (dr != DialogResult.OK) { ((BitmapLayer)activeDW.ActiveLayer).Surface.CopySurface(originalSurface); activeDW.ActiveLayer.Invalidate(); } configDialog.EffectTokenChanged -= eh; configDialog.Hide(); AppWorkspace.Update(); previewRegion.Dispose(); } // AppWorkspace.ResumeThumbnailUpdates(); // if (dr == DialogResult.OK) { PdnRegion remainingToRender = selectedRegion.Clone(); PdnRegion alreadyRendered = PdnRegion.CreateEmpty(); for (int i = 0; i < this.progressRegions.Length; ++i) { if (this.progressRegions[i] == null) { break; } else { remainingToRender.Exclude(this.progressRegions[i]); alreadyRendered.Union(this.progressRegions[i]); } } activeDW.ActiveLayer.Invalidate(alreadyRendered); newLastToken = (EffectConfigToken)configDialog.EffectToken.Clone(); AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); DoEffect(effect, newLastToken, selectedRegion, remainingToRender, originalSurface); } else // if (dr == DialogResult.Cancel) { using (new WaitCursorChanger(AppWorkspace)) { activeDW.ActiveLayer.Invalidate(); Utility.GCFullCollect(); } resetDirtyValue = true; return; } } } finally { activeDW.ReturnScratchSurface(originalSurface); } } // if it was from the Effects menu, save it as the "Repeat ...." item if (effect.Category == EffectCategory.Effect) { this.lastEffect = effect; if (newLastToken == null) { this.lastEffectToken = null; } else { this.lastEffectToken = (EffectConfigToken)newLastToken.Clone(); } PopulateMenu(true); } } finally { selectedRegion.Dispose(); AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); AppWorkspace.Widgets.StatusBarProgress.EraseProgressStatusBar(); AppWorkspace.ActiveDocumentWorkspace.EnableOutlineAnimation = true; for (int i = 0; i < this.progressRegions.Length; ++i) { if (this.progressRegions[i] != null) { this.progressRegions[i].Dispose(); this.progressRegions[i] = null; } } if (resetDirtyValue) { AppWorkspace.ActiveDocumentWorkspace.Document.Dirty = oldDirtyValue; } } } }
public void RunEffect(Type effectType) { bool oldDirtyValue = AppWorkspace.ActiveDocumentWorkspace.Document.Dirty; bool resetDirtyValue = false; AppWorkspace.Update(); // make sure the window is done 'closing' AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); DocumentWorkspace activeDW = AppWorkspace.ActiveDocumentWorkspace; PdnRegion selectedRegion; if (activeDW.Selection.IsEmpty) { selectedRegion = new PdnRegion(activeDW.Document.Bounds); } else { selectedRegion = activeDW.Selection.CreateRegion(); } Exception exception = null; Effect effect = null; BitmapLayer layer = (BitmapLayer)activeDW.ActiveLayer; using (new PushNullToolMode(activeDW)) { try { effect = (Effect)Activator.CreateInstance(effectType); string name = effect.Name; EffectConfigToken newLastToken = null; if (!(effect.CheckForEffectFlags(EffectFlags.Configurable))) { Surface copy = activeDW.BorrowScratchSurface(GetType() + ".RunEffect() using scratch surface for non-configurable rendering"); try { using (new WaitCursorChanger(AppWorkspace)) { copy.CopySurface(layer.Surface); } EffectEnvironmentParameters eep = new EffectEnvironmentParameters( AppWorkspace.AppEnvironment.PrimaryColor, AppWorkspace.AppEnvironment.SecondaryColor, AppWorkspace.AppEnvironment.PenInfo.Width, selectedRegion, copy); effect.EnvironmentParameters = eep; DoEffect(effect, null, selectedRegion, selectedRegion, copy, out exception); } finally { activeDW.ReturnScratchSurface(copy); } } else { PdnRegion previewRegion = (PdnRegion)selectedRegion.Clone(); previewRegion.Intersect(RectangleF.Inflate(activeDW.VisibleDocumentRectangleF, 1, 1)); Surface originalSurface = activeDW.BorrowScratchSurface(GetType() + ".RunEffect() using scratch surface for rendering during configuration"); try { using (new WaitCursorChanger(AppWorkspace)) { originalSurface.CopySurface(layer.Surface); } EffectEnvironmentParameters eep = new EffectEnvironmentParameters( AppWorkspace.AppEnvironment.PrimaryColor, AppWorkspace.AppEnvironment.SecondaryColor, AppWorkspace.AppEnvironment.PenInfo.Width, selectedRegion, originalSurface); effect.EnvironmentParameters = eep; // IDisposable resumeTUFn = AppWorkspace.SuspendThumbnailUpdates(); // using (EffectConfigDialog configDialog = effect.CreateConfigDialog()) { configDialog.Opacity = 0.9; configDialog.Effect = effect; configDialog.EffectSourceSurface = originalSurface; configDialog.Selection = selectedRegion; BackgroundEffectRenderer ber = null; void OnEffectTokenChanged(object sender, EventArgs e) { EffectConfigDialog ecf = (EffectConfigDialog)sender; if (ber != null) { AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBarAsync(); try { ber.Start(); } catch (Exception ex) { exception = ex; ecf.Close(); } } } configDialog.EffectTokenChanged += OnEffectTokenChanged; if (EffectTokens.ContainsKey(effectType)) { EffectConfigToken oldToken = (EffectConfigToken)EffectTokens[effectType].Clone(); configDialog.EffectToken = oldToken; } int pixelCount = layer.Surface.Height; int threadCount = effect.CheckForEffectFlags(EffectFlags.SingleThreaded) ? 1 : RenderingThreadCount; int maxTiles = TilesPerCpu * threadCount; int tileCount = Math.Min(maxTiles, pixelCount); ber = new BackgroundEffectRenderer( effect, configDialog.EffectToken, new RenderArgs(layer.Surface), new RenderArgs(originalSurface), previewRegion, tileCount, threadCount); ber.RenderedTile += new RenderedTileEventHandler(RenderedTileHandler); ber.StartingRendering += new EventHandler(StartingRenderingHandler); ber.FinishedRendering += new EventHandler(FinishedRenderingHandler); InvalidateTimer.Enabled = true; DialogResult dr; try { dr = Utility.ShowDialog(configDialog, AppWorkspace); } catch (Exception ex) { dr = DialogResult.None; exception = ex; } InvalidateTimer.Enabled = false; InvalidateTimer_Tick(InvalidateTimer, EventArgs.Empty); if (dr == DialogResult.OK) { EffectTokens[effectType] = (EffectConfigToken)configDialog.EffectToken.Clone(); } using (new WaitCursorChanger(AppWorkspace)) { try { ber.Abort(); ber.Join(); } catch (Exception ex) { exception = ex; } ber.Dispose(); ber = null; if (dr != DialogResult.OK) { ((BitmapLayer)activeDW.ActiveLayer).Surface.CopySurface(originalSurface); activeDW.ActiveLayer.Invalidate(); } configDialog.EffectTokenChanged -= OnEffectTokenChanged; configDialog.Hide(); AppWorkspace.Update(); previewRegion.Dispose(); } // resumeTUFn.Dispose(); resumeTUFn = null; // if (dr == DialogResult.OK) { PdnRegion remainingToRender = selectedRegion.Clone(); PdnRegion alreadyRendered = PdnRegion.CreateEmpty(); for (int i = 0; i < ProgressRegions.Length; ++i) { if (ProgressRegions[i] == null) { break; } else { remainingToRender.Exclude(ProgressRegions[i]); alreadyRendered.Union(ProgressRegions[i]); } } activeDW.ActiveLayer.Invalidate(alreadyRendered); newLastToken = (EffectConfigToken)configDialog.EffectToken.Clone(); AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); DoEffect(effect, newLastToken, selectedRegion, remainingToRender, originalSurface, out exception); } else // if (dr == DialogResult.Cancel) { using (new WaitCursorChanger(AppWorkspace)) { activeDW.ActiveLayer.Invalidate(); Utility.GCFullCollect(); } resetDirtyValue = true; return; } } } catch (Exception ex) { exception = ex; } finally { activeDW.ReturnScratchSurface(originalSurface); } } // if it was from the Effects menu, save it as the "Repeat ...." item if (effect.Category == EffectCategory.Effect) { LastEffect = effect; LastEffectToken = newLastToken == null ? null : (EffectConfigToken)newLastToken.Clone(); PopulateMenu(true); } } catch (Exception ex) { exception = ex; } finally { selectedRegion.Dispose(); AppWorkspace.Widgets.StatusBarProgress.ResetProgressStatusBar(); AppWorkspace.Widgets.StatusBarProgress.EraseProgressStatusBar(); AppWorkspace.ActiveDocumentWorkspace.EnableOutlineAnimation = true; if (ProgressRegions != null) { for (int i = 0; i < ProgressRegions.Length; ++i) { ProgressRegions[i]?.Dispose(); ProgressRegions[i] = null; } } if (resetDirtyValue) { AppWorkspace.ActiveDocumentWorkspace.Document.Dirty = oldDirtyValue; } if (exception != null) { HandleEffectException(AppWorkspace, effect, exception); } } } }