using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SmartCoalApplication.Core { public sealed class RenderArgs : IDisposable { private Surface surface; private Bitmap bitmap; private Graphics graphics; private bool disposed = false; public Surface Surface { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } return this.surface; } } /// /// Gets a Bitmap reference that aliases the Surface. /// public Bitmap Bitmap { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } if (this.bitmap == null) { this.bitmap = surface.CreateAliasedBitmap(); } return this.bitmap; } } /// /// Retrieves a Graphics instance that can be used to draw on to the Surface. /// /// /// Use of this object is not thread-safe. You must wrap retrieval and consumption of this /// property with a critical section. /// public Graphics Graphics { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } if (this.graphics == null) { this.graphics = Graphics.FromImage(Bitmap); } return this.graphics; } } /// /// Gets the size of the associated Surface object. /// /// /// This is a convenience method equivalent to using RenderArgs.Surface.Bounds. /// public Rectangle Bounds { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } return this.Surface.Bounds; } } /// /// Gets the size of the associated Surface object. /// /// /// This is a convenient method equivalent to using RenderArgs.Surface.Size. /// public Size Size { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } return this.Surface.Size; } } /// /// Gets the width of the associated Surface object. /// /// /// This is a convenience method equivalent to using RenderArgs.Surface.Width. /// public int Width { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } return this.surface.Width; } } /// /// Gets the height of the associated Surface object. /// /// /// This is a convenience method equivalent to using RenderArgs.Surface.Height. /// public int Height { get { if (this.disposed) { throw new ObjectDisposedException("RenderArgs"); } return this.surface.Height; } } /// /// Creates an instance of the RenderArgs class. /// /// /// The Surface to associate with this instance. This instance of RenderArgs does not /// take ownership of this Surface. /// public RenderArgs(Surface surface) { this.surface = surface; this.bitmap = null; this.graphics = null; } ~RenderArgs() { Dispose(false); } /// /// Disposes of the contained Bitmap and Graphics instances, if necessary. /// /// /// Note that since this class does not take ownership of the Surface, it /// is not disposed. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this.disposed) { this.disposed = true; if (disposing) { if (this.graphics != null) { this.graphics.Dispose(); this.graphics = null; } if (this.bitmap != null) { this.bitmap.Dispose(); this.bitmap = null; } } } } } }