Blame mono/Assistance/Canvas.cs

Ivan Mahonin ebcc4f
using System;
Ivan Mahonin ebcc4f
using System.Drawing;
Ivan Mahonin ebcc4f
using System.Drawing.Imaging;
Ivan Mahonin ebcc4f
using System.Collections.Generic;
Ivan Mahonin ebcc4f
Ivan Mahonin ebcc4f
namespace Assistance {
Ivan Mahonin ebcc4f
	public class Canvas {
Ivan Mahonin b1ff53
		public static readonly int initialSize = 100;
Ivan Mahonin b1ff53
		public static readonly double incrementScale = 1.2;
Ivan Mahonin b1ff53
	
Ivan Mahonin b1ff53
		private System.Drawing.Point offset = new System.Drawing.Point(-initialSize/2, -initialSize/2);
Ivan Mahonin b1ff53
		private Bitmap bitmap = new Bitmap(initialSize, initialSize);
Ivan Mahonin b1ff53
Ivan Mahonin b1ff53
		public void draw(Graphics g) {
Ivan Mahonin b1ff53
			g.DrawImageUnscaled(bitmap, offset);
Ivan Mahonin ebcc4f
		}
Ivan Mahonin ebcc4f
Ivan Mahonin b1ff53
		public void expand(Rectangle rect) {
Ivan Mahonin b1ff53
			System.Drawing.Point lt = offset;
Ivan Mahonin b1ff53
			System.Drawing.Point rb = lt + bitmap.Size;
Ivan Mahonin b1ff53
		    System.Drawing.Rectangle recti = rect.toInt();
Ivan Mahonin b1ff53
		    
Ivan Mahonin b1ff53
		    int incX = (int)Math.Ceiling(bitmap.Width*incrementScale);
Ivan Mahonin b1ff53
		    int incY = (int)Math.Ceiling(bitmap.Height*incrementScale);
Ivan Mahonin b1ff53
Ivan Mahonin b1ff53
		    if (recti.Left   < lt.X) lt.X = recti.Left   - incX;
Ivan Mahonin b1ff53
		    if (recti.Top    < lt.Y) lt.Y = recti.Top    - incY;
Ivan Mahonin b1ff53
		    if (recti.Right  > rb.X) rb.X = recti.Right  + incX;
Ivan Mahonin b1ff53
		    if (recti.Bottom > rb.Y) rb.Y = recti.Bottom + incY;
Ivan Mahonin b1ff53
		    
Ivan Mahonin b1ff53
		    Size size = new Size(rb.X - lt.X, rb.Y - lt.Y);
Ivan Mahonin b1ff53
		    if (lt != offset || size != bitmap.Size) {
Ivan Mahonin b1ff53
				Bitmap newBitmap = new Bitmap(size.Width, size.Height);
Ivan Mahonin b1ff53
				Graphics g = Graphics.FromImage(newBitmap);
Ivan Mahonin b1ff53
				g.DrawImageUnscaled(bitmap, new System.Drawing.Point(offset.X - lt.X, offset.Y - lt.Y));
Ivan Mahonin b1ff53
				g.Flush();
Ivan Mahonin b1ff53
				
Ivan Mahonin b1ff53
				offset = lt;
Ivan Mahonin b1ff53
				bitmap = newBitmap;
Ivan Mahonin b1ff53
			}
Ivan Mahonin ebcc4f
		}
Ivan Mahonin ebcc4f
Ivan Mahonin b1ff53
		private Graphics getGraphics() {
Ivan Mahonin b1ff53
			Graphics g = Graphics.FromImage(bitmap);
Ivan Mahonin b1ff53
			g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
Ivan Mahonin b1ff53
			g.TranslateTransform(-offset.X, -offset.Y);
Ivan Mahonin b1ff53
			return g;
Ivan Mahonin ebcc4f
		}
Ivan Mahonin ebcc4f
Ivan Mahonin b1ff53
		public void paintTrack(Track track) {
Ivan Mahonin b1ff53
			expand(track.getBounds());
Ivan Mahonin b1ff53
			Graphics g = getGraphics();
Ivan Mahonin b1ff53
			track.draw(g);
Ivan Mahonin b1ff53
			g.Flush();
Ivan Mahonin ebcc4f
		}
Ivan Mahonin ebcc4f
	}
Ivan Mahonin ebcc4f
}
Ivan Mahonin ebcc4f