// ========================================================== // 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: FIRGBAF.cs,v 1.3 2009/02/20 07:41:08 cklein05 Exp $ // ========================================================== using System; using System.Drawing; using System.Runtime.InteropServices; namespace FreeImageAPI { /// /// The FIRGBAF structure describes a color consisting of relative /// intensities of red, green, blue and alpha value. Each single color /// component consumes 32 bits and takes values in the range from 0 to 1. /// /// /// /// The FIRGBAF structure provides access to an underlying FreeImage FIRGBAF /// 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 FIRGBAF structure implements implicit conversion operators to /// convert the represented color to and from the /// type. This makes the type a real replacement /// for the FIRGBAF structure and my be used in all situations which require /// an FIRGBAF type. /// /// /// Each color component alpha, red, green or blue of FIRGBAF is translated /// into it's corresponding color component A, R, G or B of /// by linearly mapping the values of one range /// into the other range and vice versa. /// /// /// Conversion from System.Drawing.Color to FIRGBAF /// /// FIRGBAF.component = (float)Color.component / 255f /// /// Conversion from FIRGBAF to System.Drawing.Color /// /// Color.component = (int)(FIRGBAF.component * 255f) /// /// The same conversion is also applied when the /// property or the constructor /// is invoked. /// /// /// /// The following code example demonstrates the various conversions between the /// FIRGBAF structure and the structure. /// /// FIRGBAF firgbaf; /// // Initialize the structure using a native .NET Color structure. /// firgbaf = new FIRGBAF(Color.Indigo); /// // Initialize the structure using the implicit operator. /// firgbaf = Color.DarkSeaGreen; /// // Convert the FIRGBAF instance into a native .NET Color /// // using its implicit operator. /// Color color = firgbaf; /// // Using the structure's Color property for converting it /// // into a native .NET Color. /// Color another = firgbaf.Color; /// /// [Serializable, StructLayout(LayoutKind.Sequential)] public struct FIRGBAF : IComparable, IComparable, IEquatable { /// /// The red color component. /// public float red; /// /// The green color component. /// public float green; /// /// The blue color component. /// public float blue; /// /// The alpha color component. /// public float alpha; /// /// Initializes a new instance based on the specified . /// /// to initialize with. public FIRGBAF(Color color) { red = (float)color.R / 255f; green = (float)color.G / 255f; blue = (float)color.B / 255f; alpha = (float)color.A / 255f; } /// /// 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 ==(FIRGBAF left, FIRGBAF 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 !=(FIRGBAF left, FIRGBAF 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 FIRGBAF(Color value) { return new FIRGBAF(value); } /// /// Converts the value of a structure to a structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator Color(FIRGBAF value) { return value.Color; } /// /// Gets or sets the of the structure. /// public Color Color { get { return Color.FromArgb( (int)(alpha * 255f), (int)(red * 255f), (int)(green * 255f), (int)(blue * 255f)); } set { red = (float)value.R / 255f; green = (float)value.G / 255f; blue = (float)value.B / 255f; alpha = (float)value.A / 255f; } } /// /// 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 FIRGBAF)) { throw new ArgumentException("obj"); } return CompareTo((FIRGBAF)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(FIRGBAF 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 FIRGBAF) && (this == ((FIRGBAF)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(FIRGBAF 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); } } }