corrade-vassal – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace Baker
{
        public static class Oven
        {
                public static Bitmap ModifyAlphaMask(Bitmap alpha, byte weight, float ramp)
                {
                        // Create the new modifiable image (our canvas)
                        int width = alpha.Width;
                        int height = alpha.Height;
                        int pixelFormatSize = Image.GetPixelFormatSize(alpha.PixelFormat) / 8;
                        int stride = width * pixelFormatSize;
                        byte[] data = new byte[stride * height];
                        //GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
                        IntPtr pointer = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0);
                        Bitmap modified = new Bitmap(width, height, stride, alpha.PixelFormat, pointer);
                        
                        // Copy the existing alpha mask to the canvas
                        Graphics g = Graphics.FromImage(modified);
                        g.DrawImageUnscaledAndClipped(alpha, new Rectangle(0, 0, width, height));
                        g.Dispose();
                        
                        // Modify the canvas based on the input weight and ramp values
                        // TODO: use the ramp
                        // TODO: only bother with the alpha values
                        for (int i = 0; i < data.Length; i++)
                        {
                                if (data[i] < weight) data[i] = 0;
                        }
                        
                        return modified;
                }
                
                public static Bitmap ApplyAlphaMask(Bitmap source, Bitmap alpha)
                {
                        // Create the new modifiable image (our canvas)
                        int width = source.Width;
                        int height = source.Height;
                        
                        if (alpha.Width != width || alpha.Height != height ||
                            alpha.PixelFormat != source.PixelFormat)
                        {
                                throw new Exception("Source image and alpha mask formats do not match");
                        }
                        
                        int pixelFormatSize = Image.GetPixelFormatSize(source.PixelFormat) / 8;
                        int stride = width * pixelFormatSize;
                        byte[] data = new byte[stride * height];
                        //GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
                        IntPtr pointer = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0);
                        Bitmap modified = new Bitmap(width, height, stride, source.PixelFormat, pointer);
                        
                        // Copy the source image to the canvas
                        Graphics g = Graphics.FromImage(modified);
                        g.DrawImageUnscaledAndClipped(source, new Rectangle(0, 0, width, height));
                        g.Dispose();
                        
                        // Get access to the pixel data for the alpha mask (probably using lockbits)
                        
                        // Combine the alpha mask alpha bytes in to the canvas
                        
                        return modified;
                }
        }
}