public static bool AdditiveColor(Bitmap bmpDst, Bitmap bmpSrc,
                                    RGBSelection rgb, int dstX, int dstY)
        {
            if (bmpDst.PixelFormat != PixelFormat.Format24bppRgb)
                return false;

            if (bmpSrc.PixelFormat != PixelFormat.Format24bppRgb)
                return false;

            Rectangle dstRect = new Rectangle(0, 0,
                                            bmpDst.Width, bmpDst.Height);
            Rectangle srcRect = new Rectangle(dstX, dstY,
                                            bmpSrc.Width, bmpSrc.Height);

            if (!dstRect.IntersectsWith(srcRect)) return true;

            dstRect.Intersect(srcRect);

            int scanX = dstRect.X;
            int scanY = dstRect.Y;
            int scanEndX = scanX + dstRect.Width;
            int scanEndY = scanY + dstRect.Height;

            BmpProc24 src = new BmpProc24(bmpSrc);
            BmpProc24 dst = new BmpProc24(bmpDst);

            switch (rgb)
            {
                case RGBSelection.all:
                    for (int y = scanY; y < scanEndY; y++)
                        for (int x = scanX; x < scanEndX; x++)
                        {
                            src.SetXY(x - dstX, y - dstY);
                            dst.SetXY(x, y);

                            dst.R = AdjustByte(dst.R + src.R);
                            dst.G = AdjustByte(dst.G + src.G);
                            dst.B = AdjustByte(dst.B + src.B);
                        }
                    break;

                case RGBSelection.red:
                    for (int y = scanY; y < scanEndY; y++)
                        for (int x = scanX; x < scanEndX; x++)
                        {
                            src.SetXY(x - dstX, y - dstY);
                            dst.SetXY(x, y);

                            dst.R = AdjustByte(dst.R + src.R);
                        }
                    break;

                case RGBSelection.green:
                    for (int y = scanY; y < scanEndY; y++)
                        for (int x = scanX; x < scanEndX; x++)
                        {
                            src.SetXY(x - dstX, y - dstY);
                            dst.SetXY(x, y);

                            dst.G = AdjustByte(dst.G + src.G);
                        }
                    break;

                case RGBSelection.blue:
                    for (int y = scanY; y < scanEndY; y++)
                        for (int x = scanX; x < scanEndX; x++)
                        {
                            src.SetXY(x - dstX, y - dstY);
                            dst.SetXY(x, y);

                            dst.B = AdjustByte(dst.B + src.B);
                        }
                    break;
            }

            CallDispose(dst, src);

            return true;
        }
        public static bool AdditiveColor(Bitmap bmpDst, Bitmap bmpSrc,
            RGBSelection rgb)
        {
            if (bmpDst.PixelFormat != PixelFormat.Format24bppRgb)
                return false;

            if (bmpSrc.PixelFormat != PixelFormat.Format24bppRgb)
                return false;

            int w = bmpDst.Width;
            int h = bmpDst.Height;

            if ((bmpSrc.Width != w) | (bmpSrc.Height != h)) return false;

            BmpProc24 src = new BmpProc24(bmpSrc);
            BmpProc24 dst = new BmpProc24(bmpDst);

            switch (rgb)
            {
                case RGBSelection.all:
                    for (int y = 0; y < h; y++)
                        for (int x = 0; x < w; x++)
                        {
                            src.SetXY(x, y);
                            dst.SetXY(x, y);

                            dst.R = AdjustByte(dst.R + src.R);
                            dst.G = AdjustByte(dst.G + src.G);
                            dst.B = AdjustByte(dst.B + src.B);
                        }
                    break;

                case RGBSelection.red:
                    for (int y = 0; y < h; y++)
                        for (int x = 0; x < w; x++)
                        {
                            src.SetXY(x, y);
                            dst.SetXY(x, y);

                            dst.R = AdjustByte(dst.R + src.R);
                        }
                    break;

                case RGBSelection.green:
                    for (int y = 0; y < h; y++)
                        for (int x = 0; x < w; x++)
                        {
                            src.SetXY(x, y);
                            dst.SetXY(x, y);

                            dst.G = AdjustByte(dst.G + src.G);
                        }
                    break;

                case RGBSelection.blue:
                    for (int y = 0; y < h; y++)
                        for (int x = 0; x < w; x++)
                        {
                            src.SetXY(x, y);
                            dst.SetXY(x, y);

                            dst.B = AdjustByte(dst.B + src.B);
                        }
                    break;
            }

            CallDispose(dst, src);

            return true;
        }