using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
namespace RegionBuilder
{
public static class Tools
{
public static Region NewRegionForm(Color cTrans, string filename, Rectangle clientRec)
{
if (File.Exists(filename))
{
Bitmap bmp = new Bitmap(filename);
return NewRegionForm(cTrans,bmp,clientRec);
}
return new Region(clientRec);
}
public static Region NewRegionForm(Color cTrans, Bitmap b, Rectangle clientRec)
{
int ct = cTrans.ToArgb();
Rectangle r = new Rectangle(0, 0, 1, 1);
GraphicsPath gpRemoved = new GraphicsPath(FillMode.Winding);
BitmapData bd = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
int h = b.Height;
int w = b.Width;
int[,] mat = new int[h, w];
int curj = 0;
int nb = 0;
bool canAdd = false;
unsafe
{
int* pi = (int*)bd.Scan0.ToInt32() - 1;
for (int i = 0; i < h; i += 1)
{
for (int j = 0; j < w; j += 1)
{
pi++;
if (*pi == ct)
{
r.X = j;
r.Y = i;
mat[i, j] = 1;
if (canAdd)
{
mat[i, j] = 0;
nb++;
}
else
{
mat[i, curj] = nb;
curj = j;
canAdd = true;
nb = 1;
}
}
else
{
mat[i, j] = -1;
if (canAdd)
{
canAdd = false;
mat[i, curj] = nb;
nb = 0;
}
curj = j;
}
}
if (canAdd)
{
canAdd = false;
mat[i, curj] = nb;
nb = 0;
curj = 0;
}
}
}
for (int i = 0; i < h; i += 1)
{
for (int j = 0; j < w; j += 1)
{
if (mat[i, j] > 1)
{
r.Width = mat[i, j];
r.X = j;
r.Y = i;
j += (mat[i, j] - 1);
gpRemoved.AddRectangle(r);
}
else if (mat[i, j] == 1)
{
r.Width = 1;
r.X = j;
r.Y = i;
gpRemoved.AddRectangle(r);
}
}
}
b.UnlockBits(bd);
Region a = null;
a = new Region(clientRec);
a.Exclude(gpRemoved);
gpRemoved.Dispose();
return a;
}
}
}