// // System.Drawing.Size.cs // // Author: // Mike Kestner (mkestner@speakeasy.net) // // Copyright (C) 2001 Mike Kestner // Copyright (C) 2004 Novell, Inc. http://www.novell.com // // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.Serialization; using System.Runtime.InteropServices; using System.ComponentModel; namespace System.Drawing { [Serializable] [ComVisible (true)] [TypeConverter (typeof (SizeConverter))] public struct Size { // Private Height and width fields. private int width, height; // ----------------------- // Public Shared Members // ----------------------- /// /// Empty Shared Field /// /// /// /// An uninitialized Size Structure. /// public static readonly Size Empty; /// /// Ceiling Shared Method /// /// /// /// Produces a Size structure from a SizeF structure by /// taking the ceiling of the Width and Height properties. /// public static Size Ceiling (SizeF value) { int w, h; checked { w = (int) Math.Ceiling (value.Width); h = (int) Math.Ceiling (value.Height); } return new Size (w, h); } /// /// Round Shared Method /// /// /// /// Produces a Size structure from a SizeF structure by /// rounding the Width and Height properties. /// public static Size Round (SizeF value) { int w, h; checked { w = (int) Math.Round (value.Width); h = (int) Math.Round (value.Height); } return new Size (w, h); } /// /// Truncate Shared Method /// /// /// /// Produces a Size structure from a SizeF structure by /// truncating the Width and Height properties. /// public static Size Truncate (SizeF value) { int w, h; checked { w = (int) value.Width; h = (int) value.Height; } return new Size (w, h); } /// /// Addition Operator /// /// /// /// Addition of two Size structures. /// public static Size operator + (Size sz1, Size sz2) { return new Size (sz1.Width + sz2.Width, sz1.Height + sz2.Height); } /// /// Equality Operator /// /// /// /// Compares two Size objects. The return value is /// based on the equivalence of the Width and Height /// properties of the two Sizes. /// public static bool operator == (Size sz_a, Size sz_b) { return ((sz_a.Width == sz_b.Width) && (sz_a.Height == sz_b.Height)); } /// /// Inequality Operator /// /// /// /// Compares two Size objects. The return value is /// based on the equivalence of the Width and Height /// properties of the two Sizes. /// public static bool operator != (Size sz_a, Size sz_b) { return ((sz_a.Width != sz_b.Width) || (sz_a.Height != sz_b.Height)); } /// /// Subtraction Operator /// /// /// /// Subtracts two Size structures. /// public static Size operator - (Size sz1, Size sz2) { return new Size (sz1.Width - sz2.Width, sz1.Height - sz2.Height); } /// /// Size to Point Conversion /// /// /// /// Returns a Point based on the dimensions of a given /// Size. Requires explicit cast. /// public static explicit operator Point (Size sz) { return new Point (sz.Width, sz.Height); } /// /// Size to SizeF Conversion /// /// /// /// Creates a SizeF based on the dimensions of a given /// Size. No explicit cast is required. /// public static implicit operator SizeF (Size sz) { return new SizeF (sz.Width, sz.Height); } // ----------------------- // Public Constructors // ----------------------- /// /// Size Constructor /// /// /// /// Creates a Size from a Point value. /// public Size (Point pt) { width = pt.X; height = pt.Y; } /// /// Size Constructor /// /// /// /// Creates a Size from specified dimensions. /// public Size (int width, int height) { this.width = width; this.height = height; } // ----------------------- // Public Instance Members // ----------------------- /// /// IsEmpty Property /// /// /// /// Indicates if both Width and Height are zero. /// [Browsable (false)] public bool IsEmpty { get { return ((width == 0) && (height == 0)); } } /// /// Width Property /// /// /// /// The Width coordinate of the Size. /// public int Width { get { return width; } set { width = value; } } /// /// Height Property /// /// /// /// The Height coordinate of the Size. /// public int Height { get { return height; } set { height = value; } } /// /// Equals Method /// /// /// /// Checks equivalence of this Size and another object. /// public override bool Equals (object o) { if (!(o is Size)) return false; return (this == (Size) o); } /// /// GetHashCode Method /// /// /// /// Calculates a hashing value. /// public override int GetHashCode () { return width^height; } /// /// ToString Method /// /// /// /// Formats the Size as a string in coordinate notation. /// public override string ToString () { return String.Format ("{{Width={0}, Height={1}}}", width, height); } } }