Blob Blame Raw
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;

namespace Assistance {
	public class Canvas {
		public static readonly int initialSize = 100;
		public static readonly double incrementScale = 1.2;
	
		private System.Drawing.Point offset = new System.Drawing.Point(-initialSize/2, -initialSize/2);
		private Bitmap bitmap = new Bitmap(initialSize, initialSize);

		public void draw(Graphics g) {
			g.DrawImageUnscaled(bitmap, offset);
		}

		public void expand(Rectangle rect) {
			System.Drawing.Point lt = offset;
			System.Drawing.Point rb = lt + bitmap.Size;
		    System.Drawing.Rectangle recti = rect.toInt();
		    
		    int incX = (int)Math.Ceiling(bitmap.Width*incrementScale);
		    int incY = (int)Math.Ceiling(bitmap.Height*incrementScale);

		    if (recti.Left   < lt.X) lt.X = recti.Left   - incX;
		    if (recti.Top    < lt.Y) lt.Y = recti.Top    - incY;
		    if (recti.Right  > rb.X) rb.X = recti.Right  + incX;
		    if (recti.Bottom > rb.Y) rb.Y = recti.Bottom + incY;
		    
		    Size size = new Size(rb.X - lt.X, rb.Y - lt.Y);
		    if (lt != offset || size != bitmap.Size) {
				Bitmap newBitmap = new Bitmap(size.Width, size.Height);
				Graphics g = Graphics.FromImage(newBitmap);
				g.DrawImageUnscaled(bitmap, new System.Drawing.Point(offset.X - lt.X, offset.Y - lt.Y));
				g.Flush();
				
				offset = lt;
				bitmap = newBitmap;
			}
		}

		private Graphics getGraphics() {
			Graphics g = Graphics.FromImage(bitmap);
			g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
			g.TranslateTransform(-offset.X, -offset.Y);
			return g;
		}

		public void paintTrack(Track track) {
			expand(track.getBounds());
			Graphics g = getGraphics();
			track.draw(g);
			g.Flush();
		}
	}
}