context: using System;
  namespace HazTech.Util.QR4bit.Geom
  {
  	
  	/// <summary> This class is used for sampling grid
  	/// It allows one area to have a different size from another area
  	/// </summary>
  	public class SamplingGrid
  	{
  		virtual public int TotalWidth
  		{
  			get
  			{
  				int total = 0;
  				for (int i = 0; i < grid.Length; i++)
  				{
  					total += grid[i][0].Width;
  					if (i > 0)
  						total -= 1;
  				}
  				return total;
  			}
  			
  		}
  		virtual public int TotalHeight
  		{
  			get
  			{
  				int total = 0;
  				for (int i = 0; i < grid[0].Length; i++)
  				{
  					total += grid[0][i].Height;
  					if (i > 0)
  						total -= 1;
  				}
  				return total;
  			}
  			
  		}
  	
          /// <summary> A grid for a single area</summary>
  		private class AreaGrid
  		{
              private SamplingGrid enclosingInstance;
              private Line[] xLine;
              private Line[] yLine;
  
  			private void  InitBlock(SamplingGrid enclosingInstance)
  			{
  				this.enclosingInstance = enclosingInstance;
  			}
  			
  			virtual public int Width
  			{
  				get
  				{
  					return (xLine.Length);
  				}
  				
  			}
  			virtual public int Height
  			{
  				get
  				{
  					return (yLine.Length);
  				}
  				
  			}
  			virtual public Line[] XLines
  			{
  				get
  				{
  					return xLine;
  				}
  				
  			}
  			virtual public Line[] YLines
  			{
  				get
  				{
  					return yLine;
  				}
  				
  			}
  			public SamplingGrid Enclosing_Instance
  			{
  				get
  				{
  					return enclosingInstance;
  				}
  				
  			}
  		
  			
  			public AreaGrid(SamplingGrid enclosingInstance, int width, int height)
  			{
  				InitBlock(enclosingInstance);
  				xLine = new Line[width];
  				yLine = new Line[height];
  			}
  			
  			public virtual Line getXLine(int x)
  			{
  				return xLine[x];
  			}
  			
  			public virtual Line getYLine(int y)
  			{
  				return yLine[y];
  			}
  			
  			public virtual void  setXLine(int x, Line line)
  			{
  				xLine[x] = line;
  			}
  			
  			public virtual void  setYLine(int y, Line line)
  			{
  				yLine[y] = line;
  			}
  		}
  		
  		
  		private AreaGrid[][] grid;
  		
  		public SamplingGrid(int sqrtNumArea)
  		{
  			grid = new AreaGrid[sqrtNumArea][];
  			for (int i = 0; i < sqrtNumArea; i++)
  			{
  				grid[i] = new AreaGrid[sqrtNumArea];
  			}
  		}
  		
  		public virtual void  initGrid(int ax, int ay, int width, int height)
  		{
  			grid[ax][ay] = new AreaGrid(this, width, height);
  		}
  		
  		public virtual void  setXLine(int ax, int ay, int x, Line line)
  		{
  			grid[ax][ay].setXLine(x, line);
  		}
  		
  		public virtual void  setYLine(int ax, int ay, int y, Line line)
  		{
  			grid[ax][ay].setYLine(y, line);
  		}
  		
  		public virtual Line getXLine(int ax, int ay, int x)
  		{
  			return (grid[ax][ay].getXLine(x));
  		}
  		
  		public virtual Line getYLine(int ax, int ay, int y)
  		{
  			return (grid[ax][ay].getYLine(y));
  		}
  		
  		public virtual Line[] getXLines(int ax, int ay)
  		{
  			return (grid[ax][ay].XLines);
  		}
  		
  		public virtual Line[] getYLines(int ax, int ay)
  		{
  			return (grid[ax][ay].YLines);
  		}
  		
  		public virtual int getWidth()
  		{
  			return (grid[0].Length);
  		}
  		
  		public virtual int getHeight()
  		{
  			return (grid.Length);
  		}
  		
  		public virtual int getWidth(int ax, int ay)
  		{
  			return (grid[ax][ay].Width);
  		}
  		
  		public virtual int getHeight(int ax, int ay)
  		{
  			return (grid[ax][ay].Height);
  		}
  		
  		
  		public virtual int getX(int ax, int x)
  		{
  			int total = x;
  			for (int i = 0; i < ax; i++)
  			{
  				total += grid[i][0].Width - 1;
  			}
  			return total;
  		}
  		
  		public virtual int getY(int ay, int y)
  		{
  			int total = y;
  			for (int i = 0; i < ay; i++)
  			{
  				total += grid[0][i].Height - 1;
  			}
  			return total;
  		}
  		
  		public virtual void  adjust(Point adjust)
  		{
  
gt: 			int dx = adjust.X, dy = adjust.Y;