// ========================================================== // 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: RGBTRIPLE.cs,v 1.3 2009/02/20 07:41:08 cklein05 Exp $ // ========================================================== using System; using System.Drawing; using System.Runtime.InteropServices; namespace FreeImageAPI { /// /// The RGBTRIPLE structure describes a color consisting of relative /// intensities of red, green and blue value. Each single color component /// consumes 8 bits and so, takes values in the range from 0 to 255. /// /// /// /// The RGBTRIPLE structure provides access to an underlying Win32 RGBTRIPLE /// structure. To determine the red, green or blue component of a color, use the /// rgbtRed, rgbtGreen or rgbtBlue fields, respectively. /// /// For easy integration of the underlying structure into the .NET framework, /// the RGBTRIPLE structure implements implicit conversion operators to /// convert the represented color to and from the /// type. This makes the type a real replacement /// for the RGBTRIPLE structure and my be used in all situations which require /// an RGBTRIPLE type. /// /// /// Each of the color components rgbtRed, rgbtGreen or rgbtBlue of RGBTRIPLE is /// translated into it's corresponding color component R, G or B of /// by an one-to-one manner and vice versa. /// When converting from into RGBTRIPLE, the /// color's alpha value is ignored and assumed to be 255 when converting from /// RGBTRIPLE into , creating a fully /// opaque color. /// /// /// Conversion from System.Drawing.Color to RGBTRIPLE /// /// RGBTRIPLE.component = Color.component /// /// Conversion from RGBTRIPLE to System.Drawing.Color /// /// Color.component = RGBTRIPLE.component /// /// The same conversion is also applied when the /// property or the constructor /// is invoked. /// /// /// /// The following code example demonstrates the various conversions between the /// RGBTRIPLE structure and the structure. /// /// RGBTRIPLE rgbt; /// // Initialize the structure using a native .NET Color structure. /// rgbt = new RGBTRIPLE(Color.Indigo); /// // Initialize the structure using the implicit operator. /// rgbt = Color.DarkSeaGreen; /// // Convert the RGBTRIPLE instance into a native .NET Color /// // using its implicit operator. /// Color color = rgbt; /// // Using the structure's Color property for converting it /// // into a native .NET Color. /// Color another = rgbt.Color; /// /// [Serializable, StructLayout(LayoutKind.Sequential)] public struct RGBTRIPLE : IComparable, IComparable, IEquatable { /// /// The blue color component. /// public byte rgbtBlue; /// /// The green color component. /// public byte rgbtGreen; /// /// The red color component. /// public byte rgbtRed; /// /// Initializes a new instance based on the specified . /// /// to initialize with. public RGBTRIPLE(Color color) { rgbtBlue = color.B; rgbtGreen = color.G; rgbtRed = color.R; } /// /// 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 ==(RGBTRIPLE left, RGBTRIPLE right) { return left.rgbtBlue == right.rgbtBlue && left.rgbtGreen == right.rgbtGreen && left.rgbtRed == right.rgbtRed; } /// /// 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 !=(RGBTRIPLE left, RGBTRIPLE 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 RGBTRIPLE(Color value) { return new RGBTRIPLE(value); } /// /// Converts the value of a structure to a structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator Color(RGBTRIPLE value) { return value.Color; } /// /// Converts the value of an structure to a structure. /// /// An structure. /// A new instance of initialized to . public static implicit operator RGBTRIPLE(uint value) { RGBTRIPLE result = new RGBTRIPLE(); result.rgbtBlue = (byte)(value & 0xFF); result.rgbtGreen = (byte)((value >> 8) & 0xFF); result.rgbtRed = (byte)((value >> 16) & 0xFF); return result; } /// /// Converts the value of a structure to an structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator uint(RGBTRIPLE value) { return (uint)((value.rgbtRed << 16) | (value.rgbtGreen << 8) | (value.rgbtBlue)); } /// /// Gets or sets the of the structure. /// public Color Color { get { return Color.FromArgb( rgbtRed, rgbtGreen, rgbtBlue); } set { rgbtBlue = value.B; rgbtGreen = value.G; rgbtRed = value.R; } } /// /// 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 RGBTRIPLE)) { throw new ArgumentException("obj"); } return CompareTo((RGBTRIPLE)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(RGBTRIPLE 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 RGBTRIPLE) && (this == ((RGBTRIPLE)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(RGBTRIPLE 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); } } }