/// <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);
    }
 public Layers(LayeredImage image)
 {
     _image = image;
 }
    /// <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){}
    }
 public Layers(LayeredImage image)
 {
   _image = image;
 }