diff --git a/EduNetworkBuilder/NetworkDevice.cs b/EduNetworkBuilder/NetworkDevice.cs index 1f32b7b..e690540 100644 --- a/EduNetworkBuilder/NetworkDevice.cs +++ b/EduNetworkBuilder/NetworkDevice.cs @@ -692,6 +692,59 @@ namespace EduNetworkBuilder return b; } + /// + /// We concoct a burn image overlay the same shape of the object we are drawing. Loop through the image + /// and turn the burn-image transparent everywhere the original image is transparent. Then, draw the + /// shaped burn-image on top of the original image. + /// + /// + /// A burnt-looking network device. + public Image BurnedImage(Image BaseImage) + { + Bitmap b = new Bitmap(BaseImage); + //Make a burn image that is the same size as the base image + Bitmap Burn = new Bitmap(b.Width, b.Height); + Graphics.FromImage(Burn).DrawImage(Properties.Resources.BurnMark, new Rectangle(0, 0, b.Width, b.Height)); + + BitmapData bData = b.LockBits(new Rectangle(0, 0, BaseImage.Width, BaseImage.Height), ImageLockMode.ReadWrite, b.PixelFormat); + BitmapData burnData = Burn.LockBits(new Rectangle(0, 0, BaseImage.Width, BaseImage.Height), ImageLockMode.ReadWrite, b.PixelFormat); + + /* GetBitsPerPixel just does a switch on the PixelFormat and returns the number */ + int bitsPerPixel = Image.GetPixelFormatSize(bData.PixelFormat); + + /*the size of the image in bytes */ + int size = bData.Stride * bData.Height; + + /*Allocate buffer for image*/ + byte[] OrigImagedata = new byte[size]; + byte[] BurnImagedata = new byte[size]; + + /*This overload copies data of /size/ into /data/ from location specified (/Scan0/)*/ + System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, OrigImagedata, 0, size); + System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, BurnImagedata, 0, size); + + for (int i = 0; i < size; i += bitsPerPixel / 8) + { + //double magnitude = 1 / 3d * (data[i] + data[i + 1] + data[i + 2]); + if (OrigImagedata[i + 3] == 0) //If the original image is transparent, make the burn image transparent + { + BurnImagedata[i + 3] = 0;//Make it transparent + } + } + + /* This override copies the data back into the location specified */ + System.Runtime.InteropServices.Marshal.Copy(OrigImagedata, 0, bData.Scan0, OrigImagedata.Length); + System.Runtime.InteropServices.Marshal.Copy(BurnImagedata, 0, burnData.Scan0, OrigImagedata.Length); + + b.UnlockBits(bData); + Burn.UnlockBits(burnData); + + Graphics.FromImage(b).DrawImage(Burn,new Point(0,0)); + + return b; + } + + public bool AtLocation(Point location) { if (location.X >= MyLocation.X && location.X <= MyLocation.X + Size &&