File: Core\CSharp\System\Windows\Media\Effects\DropShadowEffect.cs
Project: wpf\src\PresentationCore.csproj (PresentationCore)
//------------------------------------------------------------------------------
//  Microsoft Avalon
//  Copyright (c) Microsoft Corporation, 2007
//
//  File:       DropShadowEffect.cs
//------------------------------------------------------------------------------
 
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media;
 
namespace System.Windows.Media.Effects
{
 
    /// <summary>
    /// DropShadowEffect
    /// </summary>
    public partial class DropShadowEffect
    {
 
        #region Constructors
        /// <summary>
        /// Constructor
        /// </summary>
        public DropShadowEffect()
        {
            
        }
 
        #endregion
 
        /// <summary>
        /// Takes in content bounds, and returns the bounds of the rendered
        /// output of that content after the Effect is applied.
        /// </summary>
        internal override Rect GetRenderBounds(Rect contentBounds)
        {
            Point topLeft = new Point();
            Point bottomRight = new Point();
 
            double radius = BlurRadius;
            topLeft.X = contentBounds.TopLeft.X - radius;
            topLeft.Y = contentBounds.TopLeft.Y - radius;
            bottomRight.X = contentBounds.BottomRight.X + radius;
            bottomRight.Y = contentBounds.BottomRight.Y + radius;
 
            double depth = ShadowDepth;
            double direction = Math.PI/180 * Direction;
            double offsetX = depth * Math.Cos(direction);
            double offsetY = depth * Math.Sin(direction);
 
            // If the shadow is horizontally aligned or to the right of the original element...
            if (offsetX >= 0.0f)
            {
                bottomRight.X += offsetX;
            }
            // If the shadow is to the left of the original element...
            else
            {
                topLeft.X += offsetX;
            }
 
            // If the shadow is above the original element...
            if (offsetY >= 0.0f)
            {
                topLeft.Y -= offsetY;
            }
            // If the shadow is below the original element...
            else 
            {
                bottomRight.Y -= offsetY;
            }
 
            return new Rect(topLeft, bottomRight);
        }
    }
}