using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Runtime.Serialization;
namespace SharpMap.Utilities
{
public partial class Surrogates
{
#region Nested type: MatrixSurrogate
///
/// Surrogate class used for serializing System.Drawing.Drawing2D.Matrix
///
public class MatrixSurrogate : ISerializationSurrogate
{
///
/// Matrix-Stub class
///
[Serializable]
public class MatrixRef : IObjectReference, ISerializable
{
private readonly Matrix _matrix;
///
/// Serialization constructor
///
/// The streaming information
/// The streaming context
public MatrixRef(SerializationInfo info, StreamingContext context)
{
var elements = (float[])info.GetValue("Elements", typeof(float[]));
_matrix = new Matrix(elements[0], elements[1], elements[2],
elements[3], elements[4], elements[5]);
}
object IObjectReference.GetRealObject(StreamingContext context)
{
return _matrix;
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{ }
}
#region ISerializationSurrogate Members
///
/// Populates the provided SerializationInfo with the data needed to serialize the object.
///
/// The object to serialize.
/// The SerializationInfo to populate with data.
/// The destination for this serialization.
public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
var mat = (Matrix)obj;
info.SetType(typeof(MatrixRef));
info.AddValue("Elements", mat.Elements);
}
///
/// Populates the object using the information in the SerializationInfo
///
/// The object to populate.
/// The information to populate the object.
/// The source from which the object is deserialized.
/// The surrogate selector where the search for a compatible surrogate begins.
///
public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context,
ISurrogateSelector selector)
{
throw new NotSupportedException();
}
#endregion
}
#endregion
#region "Nested type: BlendSurrogate"
///
/// Surrogate class for
///
public class BlendSurrogate : ISerializationSurrogate
{
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var blend = (Blend)obj;
info.AddValue("Factors", blend.Factors);
info.AddValue("Positions", blend.Positions);
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
var blend = (Blend)obj;
blend.Factors = (float[])info.GetValue("Factors", typeof(float[]));
blend.Positions = new float[blend.Factors.Length];
var positions = (float[])info.GetValue("Positions", typeof(float[]));
Array.Copy(positions, 0, blend.Positions, 0, blend.Positions.Length);
return null;
}
}
#endregion
#region "Nested type: ColorBlendSurrogate"
///
/// Surrogate class for
///
public class ColorBlendSurrogate : ISerializationSurrogate
{
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var blend = (ColorBlend)obj;
info.AddValue("Colors", blend.Colors);
info.AddValue("Positions", blend.Positions);
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
var blend = (ColorBlend)obj;
blend.Colors = (Color[])info.GetValue("Colors", typeof(Color[]));
blend.Positions = (float[])info.GetValue("Positions", typeof(float[]));
return null;
}
}
#endregion
#region Nested type: GraphicsPathSurrogate
///
/// Serialization surrogate class for
///
public class GraphicsPathSurrogate : ISerializationSurrogate
{
///
/// Object reference class for
///
[Serializable]
public class GraphicsPathRef : IObjectReference, ISerializable
{
private readonly GraphicsPath _gp;
///
/// Serialization constructor
///
/// The streaming information
/// The streaming context
public GraphicsPathRef(SerializationInfo info, StreamingContext context)
{
var fillmode = (FillMode)info.GetInt32("FillMode");
var points = (PointF[])info.GetValue("PathPoints", typeof(PointF[]));
var types = (Byte[])info.GetValue("PathTypes", typeof(byte[]));
_gp = new GraphicsPath(points, types, fillmode);
}
object IObjectReference.GetRealObject(StreamingContext context)
{
return _gp;
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotSupportedException();
}
}
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var gp = (GraphicsPath)obj;
info.SetType(typeof(GraphicsPathRef));
info.AddValue("FillMode", (int)gp.FillMode);
info.AddValue("PathData", gp.PathPoints);
info.AddValue("PathTypes", gp.PathTypes);
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
throw new NotSupportedException();
}
}
#endregion
#region "Nested type: ColorMapSurrogate"
///
/// Surrogate class for
///
public class ColorMapSurrogate : ISerializationSurrogate
{
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var colorMap = (ColorMap)obj;
info.AddValue("old", colorMap.OldColor);
info.AddValue("new", colorMap.NewColor);
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
var blend = (ColorMap)obj;
blend.OldColor = (Color)info.GetValue("old", typeof(Color));
blend.NewColor = (Color)info.GetValue("new", typeof(Color));
return null;
}
}
#endregion
#region "Nested type: ColorMapSurrogate"
///
/// Surrogate class for
///
public class ColorMatrixSurrogate : ISerializationSurrogate
{
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var colorMatrix = (ColorMatrix)obj;
info.AddValue("cm", ToFloatArray(colorMatrix));
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
var colorMatrix = (ColorMatrix)obj;
var floatArray = (float[])info.GetValue("cm", typeof(float[]));
for (var i = 0; i < floatArray.Length; i++)
{
colorMatrix[i / 5, i % 5] = floatArray[i];
}
return null;
}
private static float[] ToFloatArray(ColorMatrix matrix)
{
return new[]
{
matrix.Matrix00, matrix.Matrix01, matrix.Matrix02, matrix.Matrix03, matrix.Matrix04,
matrix.Matrix10, matrix.Matrix11, matrix.Matrix12, matrix.Matrix13, matrix.Matrix14,
matrix.Matrix20, matrix.Matrix21, matrix.Matrix22, matrix.Matrix23, matrix.Matrix24,
matrix.Matrix30, matrix.Matrix31, matrix.Matrix32, matrix.Matrix33, matrix.Matrix34,
matrix.Matrix40, matrix.Matrix41, matrix.Matrix42, matrix.Matrix43, matrix.Matrix44
};
}
}
#endregion
}
}