Util.cs

Top Previous Topic Next Topic  Print this topic

using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

namespace Ecrion.Silverlight.Sample.Plugin

{

  public class Util

   {

      /// <summary>

      /// calculate inverse of a matrix

      /// </summary>

      /// <param name="matrix">matrix</param>

      /// <returns>matrix inverse</returns>

      public static Matrix Inverse(Matrix matrix)

       {

          Matrix result = Matrix.Identity;

 

          double m11 = matrix.M11;

          double m12 = matrix.M12;

          double m21 = matrix.M21;

          double m22 = matrix.M22;

          double offsetX = matrix.OffsetX;

          double offsetY = matrix.OffsetY;

 

          double det = m11 * m22 - m12 * m21;

 

          if (det == 0)

              return result; //return identity matrix

 

           result = new Matrix(m22 / det, -m12 / det, -m21 / det, m11 / det, (-m22 * offsetX + m21 * offsetY) / det, (m12 * offsetX - m11 * offsetY) / det);

          return result;

       }

 

      /// <summary>

      /// multiply to matrix

      /// </summary>

      /// <param name="firstMatrix">first matrix to multiply</param>

      /// <param name="secondMatrix">second matri to multiply</param>

      /// <returns>multiply result</returns>

      public static Matrix Multiply(Matrix firstMatrix, Matrix secondMatrix)

       {

          return new Matrix(firstMatrix.M11 * secondMatrix.M11 + firstMatrix.M12 * secondMatrix.M21,

                           firstMatrix.M11 * secondMatrix.M12 + firstMatrix.M12 * secondMatrix.M22,

                           firstMatrix.M21 * secondMatrix.M11 + firstMatrix.M22 * secondMatrix.M21,

                           firstMatrix.M21 * secondMatrix.M12 + firstMatrix.M22 * secondMatrix.M22,

                           firstMatrix.OffsetX * secondMatrix.M11 + firstMatrix.OffsetY * secondMatrix.M21 + secondMatrix.OffsetX,

                           firstMatrix.OffsetX * secondMatrix.M12 + firstMatrix.OffsetY * secondMatrix.M22 + secondMatrix.OffsetY);

       }

 

      /// <summary>

      /// invert a brush (solid brush or gradient brush)

      /// </summary>

      /// <param name="brush">brush to be inverted</param>

      /// <returns>inverted brush</returns>

      public static Brush BrushInvert(Brush brush)

       {

          Brush brushInvert = null;

          if (brush.GetType() == typeof(SolidColorBrush))

           {

              Color color = ((SolidColorBrush)brush).Color;

 

               color.A = 255;

               color.R = (byte)(255 - color.R);

               color.G = (byte)(255 - color.G);

               color.B = (byte)(255 - color.B);

 

               brushInvert = new SolidColorBrush(color);

               brushInvert.Opacity = brush.Opacity;

 

              return brushInvert;

           }

          if (brush.GetType() == typeof(LinearGradientBrush))

           {

              LinearGradientBrush linearGradientBrush = (LinearGradientBrush)brush;

 

              LinearGradientBrush linearGradientBrushInvert = new LinearGradientBrush();

 

               linearGradientBrushInvert.StartPoint = linearGradientBrush.StartPoint;

               linearGradientBrushInvert.EndPoint = linearGradientBrush.EndPoint;

               linearGradientBrushInvert.ColorInterpolationMode = linearGradientBrush.ColorInterpolationMode;

               linearGradientBrushInvert.MappingMode = linearGradientBrush.MappingMode;

               linearGradientBrushInvert.SpreadMethod = linearGradientBrush.SpreadMethod;

               linearGradientBrushInvert.Opacity = linearGradientBrush.Opacity;

               linearGradientBrushInvert.RelativeTransform = linearGradientBrush.RelativeTransform;

 

              foreach (GradientStop gradientStop in linearGradientBrush.GradientStops)

               {

                  GradientStop gradientStopInvert = new GradientStop();

                   gradientStopInvert.Offset = gradientStop.Offset;

 

                  Color color = new Color();

                   color.A = gradientStop.Color.A;

                   color.R = (byte)(255 - gradientStop.Color.R);

                   color.G = (byte)(255 - gradientStop.Color.G);

                   color.B = (byte)(255 - gradientStop.Color.B);

 

                   gradientStopInvert.Color = color;

                   linearGradientBrushInvert.GradientStops.Add(gradientStopInvert);

               }

 

              return linearGradientBrushInvert;

           }

          return new SolidColorBrush();

       }

 

      /// <summary>

      /// create brush clone

      /// </summary>

      /// <param name="brush">brush to be cloned</param>

      /// <returns>brush cloned</returns>

      public static Brush BrushClone(Brush brush)

       {

          if (brush.GetType() == typeof(SolidColorBrush))

           {

              SolidColorBrush brushClone = null;

              Color color = new Color();

 

               color.A = ((SolidColorBrush)brush).Color.A;

               color.R = ((SolidColorBrush)brush).Color.R;

               color.G = ((SolidColorBrush)brush).Color.G;

               color.B = ((SolidColorBrush)brush).Color.B;

 

               brushClone = new SolidColorBrush(color);

               brushClone.Opacity = brush.Opacity;

 

              return brushClone;

           }

          if (brush.GetType() == typeof(LinearGradientBrush))

           {

              LinearGradientBrush linearGradientBrush = (LinearGradientBrush)brush;

 

              LinearGradientBrush linearGradientBrushInvert = new LinearGradientBrush();

 

               linearGradientBrushInvert.StartPoint = linearGradientBrush.StartPoint;

               linearGradientBrushInvert.EndPoint = linearGradientBrush.EndPoint;

               linearGradientBrushInvert.ColorInterpolationMode = linearGradientBrush.ColorInterpolationMode;

               linearGradientBrushInvert.MappingMode = linearGradientBrush.MappingMode;

               linearGradientBrushInvert.SpreadMethod = linearGradientBrush.SpreadMethod;

               linearGradientBrushInvert.Opacity = linearGradientBrush.Opacity;

               linearGradientBrushInvert.RelativeTransform = linearGradientBrush.RelativeTransform;

 

              foreach (GradientStop gradientStop in linearGradientBrush.GradientStops)

               {

                  GradientStop gradientStopInvert = new GradientStop();

                   gradientStopInvert.Offset = gradientStop.Offset;

 

                  Color color = new Color();

                   color.A = gradientStop.Color.A;

                   color.R = gradientStop.Color.R;

                   color.G = gradientStop.Color.G;

                   color.B = gradientStop.Color.B;

 

                   gradientStopInvert.Color = color;

                   linearGradientBrushInvert.GradientStops.Add(gradientStopInvert);

               }

 

              return linearGradientBrushInvert;

           }

 

          return new SolidColorBrush(Colors.Yellow);

       }

   }

}