// ========================================================== // 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: FI16RGB565.cs,v 1.3 2009/02/20 07:41:08 cklein05 Exp $ // ========================================================== using System; using System.Drawing; using System.Runtime.InteropServices; namespace FreeImageAPI { /// /// The FI16RGB565 structure describes a color consisting of relative /// intensities of red, green, blue and alpha value. Each single color /// component consumes 5 bits and so, takes values in the range from 0 to 31. /// /// /// For easy integration of the underlying structure into the .NET framework, /// the FI16RGB565 structure implements implicit conversion operators to /// convert the represented color to and from the /// type. This makes the type a real replacement /// for the FI16RGB565 structure and my be used in all situations which require /// an FI16RGB565 type. /// /// /// /// The following code example demonstrates the various conversions between the /// FI16RGB565 structure and the structure. /// /// FI16RGB565 fi16rgb; /// // Initialize the structure using a native .NET Color structure. /// fi16rgb = new FI16RGB565(Color.Indigo); /// // Initialize the structure using the implicit operator. /// fi16rgb = Color.DarkSeaGreen; /// // Convert the FI16RGB565 instance into a native .NET Color /// // using its implicit operator. /// Color color = fi16rgb; /// // Using the structure's Color property for converting it /// // into a native .NET Color. /// Color another = fi16rgb.Color; /// /// [Serializable, StructLayout(LayoutKind.Sequential)] public struct FI16RGB565 : IComparable, IComparable, IEquatable { /// /// The value of the color. /// private ushort value; /// /// Initializes a new instance based on the specified . /// /// to initialize with. public FI16RGB565(Color color) { value = (ushort)( (((color.R * 31) / 255) << FreeImage.FI16_565_RED_SHIFT) + (((color.G * 63) / 255) << FreeImage.FI16_565_GREEN_SHIFT) + (((color.B * 31) / 255) << FreeImage.FI16_565_BLUE_SHIFT)); } /// /// 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 ==(FI16RGB565 left, FI16RGB565 right) { return (left.value == right.value); } /// /// 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 !=(FI16RGB565 left, FI16RGB565 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 FI16RGB565(Color value) { return new FI16RGB565(value); } /// /// Converts the value of a structure to a structure. /// /// A structure. /// A new instance of initialized to . public static implicit operator Color(FI16RGB565 value) { return value.Color; } /// /// Gets or sets the of the structure. /// public Color Color { get { return Color.FromArgb( ((value & FreeImage.FI16_565_RED_MASK) >> FreeImage.FI16_565_RED_SHIFT) * 255 / 31, ((value & FreeImage.FI16_565_GREEN_MASK) >> FreeImage.FI16_565_GREEN_SHIFT) * 255 / 63, ((value & FreeImage.FI16_565_BLUE_MASK) >> FreeImage.FI16_565_BLUE_SHIFT) * 255 / 31); } set { this.value = (ushort)( (((value.R * 31) / 255) << FreeImage.FI16_565_RED_SHIFT) + (((value.G * 63) / 255) << FreeImage.FI16_565_GREEN_SHIFT) + (((value.B * 31) / 255) << FreeImage.FI16_565_BLUE_SHIFT)); } } /// /// Gets or sets the red color component. /// public byte Red { get { return (byte)(((value & FreeImage.FI16_565_RED_MASK) >> FreeImage.FI16_565_RED_SHIFT) * 255 / 31); } set { this.value = (ushort)((this.value & (~FreeImage.FI16_565_RED_MASK)) | (((value * 31) / 255) << FreeImage.FI16_565_RED_SHIFT)); } } /// /// Gets or sets the green color component. /// public byte Green { get { return (byte)(((value & FreeImage.FI16_565_GREEN_MASK) >> FreeImage.FI16_565_GREEN_SHIFT) * 255 / 63); } set { this.value = (ushort)((this.value & (~FreeImage.FI16_565_GREEN_MASK)) | (((value * 63) / 255) << FreeImage.FI16_565_GREEN_SHIFT)); } } /// /// Gets or sets the blue color component. /// public byte Blue { get { return (byte)(((value & FreeImage.FI16_565_BLUE_MASK) >> FreeImage.FI16_565_BLUE_SHIFT) * 255 / 31); } set { this.value = (ushort)((this.value & (~FreeImage.FI16_565_BLUE_MASK)) | (((value * 31) / 255) << FreeImage.FI16_565_BLUE_SHIFT)); } } /// /// 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 FI16RGB565)) { throw new ArgumentException("obj"); } return CompareTo((FI16RGB565)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(FI16RGB565 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 base.Equals(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(FI16RGB565 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); } } }