public void CopyTo_ShouldCopyAllPixels()
        {
            FastBitmap src = FastBmp;
            FastBitmap dst = new FastBitmap(src.Width, src.Height);

            src.CopyTo(dst);
            for (int i = 0; i < src.Length; i++)
            {
                Assert.Equal(src.Data[i], dst.Data[i]);
            }
        }
        public void CopyTo_ShouldCopyASimpleRegion()
        {
            FastBitmap src = FastBmp;
            FastBitmap dst = new FastBitmap(2, 2);

            src.CopyTo(dst, 1, 1);
            Assert.Equal(ColorData[4], dst.Data[0]);
            Assert.Equal(ColorData[5], dst.Data[1]);
            Assert.Equal(ColorData[7], dst.Data[2]);
            Assert.Equal(ColorData[8], dst.Data[3]);
        }
        public void CopyTo_ShouldCopyARegion()
        {
            FastBitmap src = FastBmp;
            FastBitmap dst = new FastBitmap(3, 3);

            src.CopyTo(dst, 1, 2, 2, 2);
            Assert.Equal(ColorData[7], dst.Data[0]);
            Assert.Equal(ColorData[8], dst.Data[1]);
            Assert.Equal(ColorData[10], dst.Data[3]);
            Assert.Equal(ColorData[11], dst.Data[4]);
        }
        public void CopyTo_ShouldCopyAPartialRegion(int dstX, int dstY, int x, int y, int width, int height, int expected, int[] expectedData)
        {
            FastBitmap src = FastBmp;
            FastBitmap dst = new FastBitmap(2, 2);

            Assert.Equal(expected, src.CopyTo(dst, dstX, dstY, x, y, width, height));
            for (int i = 0; i < dst.Length; i++)
            {
                Assert.Equal(expectedData[i], dst.Data[i]);
            }
        }
        /// <summary>
        /// Creates the files to build a shadow arround a picture.
        /// </summary>
        /// <param name="imgCfg">the shadow configuration of the picture</param>
        /// <param name="path">the directory where the files should be located</param>
        public void CreateShadowParts(ImageBrowserConfig.ImageCfg imgCfg, String path)
        {
            // Values for building Shadow.
            Int32 shadowwidth = imgCfg.ShadowWidth;
            Int32 margin      = shadowwidth / 2;

            // background
            LayeredImage image = new LayeredImage(shadowwidth * 2 + margin + 1, shadowwidth * 2 + margin + 1);
            Layer        bg    = image.Layers.Add();

            bg.Clear(Color.FromArgb(imgCfg.BackgroundColor));

            // shadow -- layer must be larger because of blur
            Layer      shadow = image.Layers.Add(shadowwidth * 2 + margin, shadowwidth * 2 + margin);
            SolidBrush brush  = new SolidBrush(Color.FromArgb(imgCfg.ShadowColor));

            shadow.FillRectangle(margin, margin, shadowwidth + margin + 1, shadowwidth + margin + 1, brush);
            if (imgCfg.SoftShadow)
            {
                shadow.Blur(margin * 2, margin * 2);
            }
            brush.Dispose();
            shadow.Opacity = 1.0 - imgCfg.ShadowTransparency;

            // Result with all the parts.
            FastBitmap totalResult = image.Flatten();

            // Create Directory if necessary.
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            // Save Shadow into splittet files.
            // Top-right.
            FastBitmap imgTR = new FastBitmap(shadowwidth, shadowwidth, PixelFormat.Format32bppArgb);

            totalResult.CopyTo(imgTR, 0, 0, margin + shadowwidth + 1, 0, shadowwidth, shadowwidth);
            imgTR.Save(path + "/tr.jpg", ImageFormat.Jpeg);

            // Right.
            FastBitmap imgR = new FastBitmap(shadowwidth, 1, PixelFormat.Format32bppArgb);

            totalResult.CopyTo(imgR, 0, 0, margin + shadowwidth + 1, margin + shadowwidth, shadowwidth, 1);
            imgR.Save(path + "/r.jpg", ImageFormat.Jpeg);

            // Bottom-right.
            FastBitmap imgBR = new FastBitmap(shadowwidth, shadowwidth, PixelFormat.Format32bppArgb);

            totalResult.CopyTo(imgBR, 0, 0, margin + shadowwidth + 1, margin + shadowwidth + 1, shadowwidth, shadowwidth);
            imgBR.Save(path + "/br.jpg", ImageFormat.Jpeg);

            // Bottom.
            FastBitmap imgB = new FastBitmap(1, shadowwidth, PixelFormat.Format32bppArgb);

            totalResult.CopyTo(imgB, 0, 0, margin + shadowwidth, margin + shadowwidth + 1, 1, shadowwidth);
            imgB.Save(path + "/b.jpg", ImageFormat.Jpeg);


            // Bottom-left.
            FastBitmap imgBL = new FastBitmap(shadowwidth, shadowwidth, PixelFormat.Format32bppArgb);

            totalResult.CopyTo(imgBL, 0, 0, 0, margin + shadowwidth + 1, shadowwidth, shadowwidth);
            imgBL.Save(path + "/bl.jpg", ImageFormat.Jpeg);
        }
        /// <summary>
        /// Creates a new image of the specified size from the source image
        /// </summary>
        /// <param name="src">Source image path</param>
        /// <param name="dest">Destination image path</param>
        /// <param name="imgCfg">The configuration of the image</param>
        /// <param name="forceUpdate">Update in every case</param>
        /// <param name="jpegQuality">The Quality for the JPEG File 0..100</param>
        public void CreateShadowedImage(string src, string dest, ImageBrowserConfig.ImageCfg imgCfg, bool forceUpdate, byte jpegQuality)
        {
            try
            {
                if (!forceUpdate && File.Exists(cfg.PictureRootDirectory + "/" + dest))
                {
                    return;
                }

                string path = Directory.GetParent(cfg.PictureRootDirectory + "/" + dest).FullName;

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                // Values for building Shadow.
                Int32   shadowwidth = imgCfg.ShadowWidth;
                Int32   borderwidth = imgCfg.BorderWidth;
                Int32   margin      = shadowwidth / 2;
                Int32   shadowdir   = 0;
                Double  shadowtrans = imgCfg.ShadowTransparency;
                Color   bkcolor     = Color.FromArgb(imgCfg.BackgroundColor);
                Color   shadowcolor = Color.FromArgb(imgCfg.ShadowColor);
                Color   bordercolor = Color.FromArgb(imgCfg.BorderColor);
                Boolean softshadow  = imgCfg.SoftShadow;

                Image thumb = CreateImageInternal(src, imgCfg.MaxSize);
                if (thumb != null)
                {
                    FastBitmap tmp = new FastBitmap(thumb);

                    FastBitmap bmp = new FastBitmap(tmp.Width + borderwidth * 2, tmp.Height + borderwidth * 2,
                                                    PixelFormat.Format32bppArgb);

                    // add border if necessary
                    if (borderwidth > 0)
                    {
                        using (SolidBrush br = new SolidBrush(bordercolor))
                            using (Graphics g = Graphics.FromImage(bmp._bitmap))
                            {
                                g.FillRectangle(br, 0, 0, borderwidth * 2 + tmp.Width, borderwidth * 2 + tmp.Height);
                            }
                    }

                    tmp.CopyTo(bmp, borderwidth, borderwidth, 0, 0, tmp.Width, tmp.Height);
                    tmp.Dispose();

                    // create image

                    Int32        width  = bmp.Width + shadowwidth + margin * 2;
                    Int32        height = bmp.Height + shadowwidth + margin * 2;
                    LayeredImage image  = new LayeredImage(width, height);

                    Int32 shadowx = 0, shadowy = 0, imgx = 0, imgy = 0;

                    if (softshadow)
                    {
                        switch (shadowdir)
                        {
                        case 0:
                            shadowx = margin - shadowwidth / 2;
                            shadowy = margin - shadowwidth / 2;
                            imgx    = margin;
                            imgy    = margin;
                            break;

                        case 1:
                            shadowx = margin + shadowwidth - 3 * (shadowwidth / 2);
                            shadowy = margin - shadowwidth / 2;
                            imgx    = margin + shadowwidth;
                            imgy    = margin;
                            break;

                        case 2:
                            shadowx = margin + shadowwidth - 3 * (shadowwidth / 2);
                            shadowy = margin + shadowwidth - 3 * (shadowwidth / 2);
                            imgx    = margin + shadowwidth;
                            imgy    = margin + shadowwidth;
                            break;

                        case 3:
                            shadowx = margin - shadowwidth / 2;
                            shadowy = margin + shadowwidth - 3 * (shadowwidth / 2);
                            imgx    = margin;
                            imgy    = margin + shadowwidth;
                            break;
                        }
                    }
                    else
                    {
                        switch (shadowdir)
                        {
                        case 0:
                            shadowx = margin;
                            shadowy = margin;
                            imgx    = margin;
                            imgy    = margin;
                            break;

                        case 1:
                            shadowx = margin - shadowwidth;
                            shadowy = margin;
                            imgx    = margin + shadowwidth;
                            imgy    = margin;
                            break;

                        case 2:
                            shadowx = margin - shadowwidth;
                            shadowy = margin - shadowwidth;
                            imgx    = margin + shadowwidth;
                            imgy    = margin + shadowwidth;
                            break;

                        case 3:
                            shadowx = margin;
                            shadowy = margin - shadowwidth;
                            imgx    = margin;
                            imgy    = margin + shadowwidth;
                            break;
                        }
                    }

                    // background
                    Layer bg = image.Layers.Add();
                    bg.Clear(bkcolor);

                    // shadow -- layer must be larger because of blur
                    Layer      shadow = image.Layers.Add(width + shadowwidth, height + shadowwidth);
                    SolidBrush brush  = new SolidBrush(shadowcolor);
                    shadow.FillRectangle(shadowwidth, shadowwidth, bmp.Width, bmp.Height, brush);
                    if (softshadow)
                    {
                        shadow.Blur(shadowwidth, shadowwidth);
                    }
                    brush.Dispose();
                    shadow.OffsetX = shadowx;
                    shadow.OffsetY = shadowy;
                    shadow.Opacity = 1.0 - shadowtrans;

                    // image
                    Layer img = image.Layers.Add(bmp);
                    img.OffsetX = imgx;
                    img.OffsetY = imgy;

                    // result
                    FastBitmap result = image.Flatten();

                    EncoderParameters encParams = new EncoderParameters(1);
                    encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)jpegQuality);
                    result.Save(cfg.PictureRootDirectory + "/" + dest, GetEncoder(ImageFormat.Jpeg), encParams);
                    result.Dispose();
                }
            }
            catch (Exception) {}
        }