// ========================================================== // FreeImage 3 .NET wrapper // Original FreeImage 3 functions and .NET compatible derived functions // // Design and implementation by // - Jean-Philippe Goerke (jpgoerke@users.sourceforge.net) // - Carsten Klein (cklein05@users.sourceforge.net) // // Contributors: // - David Boland (davidboland@vodafone.ie) // // Main reference : MSDN Knowlede Base // // This file is part of FreeImage 3 // // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER // THIS DISCLAIMER. // // Use at your own risk! // ========================================================== // ========================================================== // CVS // $Revision: 1.3 $ // $Date: 2009/02/20 07:41:08 $ // $Id: FIRGBA16.cs,v 1.3 2009/02/20 07:41:08 cklein05 Exp $ // ========================================================== using System; using System.Drawing; using System.Runtime.InteropServices; namespace FreeImageAPI { /// /// The FIRGBA16 structure describes a color consisting of relative /// intensities of red, green, blue and alpha value. Each single color /// component consumes 16 bits and so, takes values in the range from 0 to 65535. /// /// /// /// The FIRGBA16 structure provides access to an underlying FreeImage FIRGBA16 /// structure. To determine the alpha, red, green or blue component of a color, /// use the alpha, red, green or blue fields, respectively. /// /// For easy integration of the underlying structure into the .NET framework, /// the FIRGBA16 structure implements implicit conversion operators to /// convert the represented color to and from the /// type. This makes the type a real replacement /// for the FIRGBA16 structure and my be used in all situations which require /// an FIRGBA16 type. /// /// /// Each color component alpha, red, green or blue of FIRGBA16 /// is translated into it's corresponding color component A, R, G or B of /// by an 8 bit right shift and vice versa. /// /// /// Conversion from System.Drawing.Color to FIRGBA16 /// /// FIRGBA16.component = Color.component << 8 /// /// Conversion from FIRGBA16 to System.Drawing.Color /// /// Color.component = FIRGBA16.component >> 8 /// /// The same conversion is also applied when the /// property or the constructor /// is invoked. /// /// /// /// The following code example demonstrates the various conversions between the /// FIRGBA16 structure and the structure. /// /// FIRGBA16 firgba16; /// // Initialize the structure using a native .NET Color structure. /// firgba16 = new FIRGBA16(Color.Indigo); /// // Initialize the structure using the implicit operator. /// firgba16 = Color.DarkSeaGreen; /// // Convert the FIRGBA16 instance into a native .NET Color /// // using its implicit operator. /// Color color = firgba16; /// // Using the structure's Color property for converting it /// // into a native .NET Color. /// Color another = firgba16.Color; /// /// [Serializable, StructLayout(LayoutKind.Sequential)] public struct FIRGBA16 : IComparable, IComparable, IEquatable { /// /// The red color component. /// public ushort red; /// /// The green color component. /// public ushort green; /// /// The blue color component. /// public ushort blue; /// /// The alpha color component. /// public ushort alpha; /// /// Initializes a new instance based on the specified . /// /// to initialize with. public FIRGBA16(Color color) { red = (ushort)(color.R << 8); green = (ushort)(color.G << 8); blue = (ushort)(color.B << 8); alpha = (ushort)(color.A << 8); } /// /// Tests whether two specified structures are equivalent. /// /// The that is to the left of the equality operator. /// The that is to the right of the equality operator. /// /// true if the two structures are equal; otherwise, false. /// public static bool operator ==(FIRGBA16 left, FIRGBA16 right) { return ((left.alpha == right.alpha) && (left.blue == right.blue) && (left.green == right.green) && (left.red == right.red)); } /// /// Tests whether two specified structures are different. /// /// The that is to the left of the inequality operator. /// The that is to the right of the inequality operator. /// /// true if the two structures are different; otherwise, false. /// public static bool operator !=(FIRGBA16 left, FIRGBA16 right) { return !(left == right); } /// /// Converts the value of a structure to a structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator FIRGBA16(Color value) { return new FIRGBA16(value); } /// /// Converts the value of a structure to a structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator Color(FIRGBA16 value) { return value.Color; } /// /// Gets or sets the of the structure. /// public Color Color { get { return Color.FromArgb((alpha >> 8), (red >> 8), (green >> 8), (blue >> 8)); } set { red = (ushort)(value.R << 8); green = (ushort)(value.G << 8); blue = (ushort)(value.B << 8); alpha = (ushort)(value.A << 8); } } /// /// Compares this instance with a specified . /// /// An object to compare with this instance. /// A 32-bit signed integer indicating the lexical relationship between the two comparands. /// is not a . public int CompareTo(object obj) { if (obj == null) { return 1; } if (!(obj is FIRGBA16)) { throw new ArgumentException("obj"); } return CompareTo((FIRGBA16)obj); } /// /// Compares this instance with a specified object. /// /// A to compare. /// A signed number indicating the relative values of this instance /// and . public int CompareTo(FIRGBA16 other) { return this.Color.ToArgb().CompareTo(other.Color.ToArgb()); } /// /// Tests whether the specified object is a structure /// and is equivalent to this structure. /// /// The object to test. /// true if is a structure /// equivalent to this structure; otherwise, false. public override bool Equals(object obj) { return ((obj is FIRGBA16) && (this == ((FIRGBA16)obj))); } /// /// Tests whether the specified structure is equivalent to this structure. /// /// A structure to compare to this instance. /// true if is a structure /// equivalent to this structure; otherwise, false. public bool Equals(FIRGBA16 other) { return (this == other); } /// /// Returns a hash code for this structure. /// /// An integer value that specifies the hash code for this . public override int GetHashCode() { return base.GetHashCode(); } /// /// Converts the numeric value of the object /// to its equivalent string representation. /// /// The string representation of the value of this instance. public override string ToString() { return FreeImage.ColorToString(Color); } } }