using System; using System.Drawing; namespace PaintDotNet { public abstract class StitchSurfaceBoxRenderer : IDisposable { private bool disposed = false; private StitchSurfaceBoxRendererList ownerList; private bool visible; public const int MinXCoordinate = -131072; public const int MaxXCoordinate = +131072; public const int MinYCoordinate = -131072; public const int MaxYCoordinate = +131072; public bool IsDisposed { get { return this.disposed; } } public static Rectangle MaxBounds { get { return Rectangle.FromLTRB(MinXCoordinate, MinYCoordinate, MaxXCoordinate + 1, MaxYCoordinate + 1); } } protected object SyncRoot { get { return OwnerList.SyncRoot; } } protected StitchSurfaceBoxRendererList OwnerList { get { return this.ownerList; } } public virtual void OnSourceSizeChanged() { } public virtual void OnDestinationSizeChanged() { } public Size SourceSize { get { return this.OwnerList.SourceSize; } } public Size DestinationSize { get { return this.OwnerList.DestinationSize; } } protected virtual void OnVisibleChanging() { } protected abstract void OnVisibleChanged(); public bool Visible { get { return this.visible; } set { if (this.visible != value) { OnVisibleChanging(); this.visible = value; OnVisibleChanged(); } } } protected delegate void RenderDelegate(StitchSurface dst, Point offset); /// /// Renders, at the appropriate scale, the layer's imagery. /// /// The Surface to render to. /// The (x,y) location of the upper-left corner of dst within DestinationSize. public abstract void Render(StitchSurface dst, Point offset); protected virtual void OnInvalidate(Rectangle rect) { this.OwnerList.Invalidate(rect); } public void Invalidate(Rectangle rect) { OnInvalidate(rect); } public void Invalidate(RectangleF rectF) { Rectangle rect = Utility.RoundRectangle(rectF); Invalidate(rect); } public void Invalidate(PdnRegion region) { foreach (Rectangle rect in region.GetRegionScansReadOnlyInt()) { Invalidate(rect); } } public void Invalidate() { Invalidate(Rectangle.FromLTRB(MinXCoordinate, MinYCoordinate, MaxXCoordinate + 1, MaxYCoordinate + 1)); } public StitchSurfaceBoxRenderer(StitchSurfaceBoxRendererList ownerList) { this.ownerList = ownerList; this.visible = true; } ~StitchSurfaceBoxRenderer() { this.Dispose(false); } public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { this.disposed = true; } } }