//============================================================================ //ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# //Copyright © 2004 John Champion // //This library is free software; you can redistribute it and/or //modify it under the terms of the GNU Lesser General Public //License as published by the Free Software Foundation; either //version 2.1 of the License, or (at your option) any later version. // //This library is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //Lesser General Public License for more details. // //You should have received a copy of the GNU Lesser General Public //License along with this library; if not, write to the Free Software //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //============================================================================= #region Using directives using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.Runtime.Serialization; using System.Security.Permissions; #endregion namespace DrawGraph { /// /// A class that represents an image object on the graph. A list of /// objects is maintained by the /// collection class. /// /// /// John Champion /// $Revision: 3.2 $ $Date: 2006/09/09 17:32:01 $ [Serializable] public class ImageObj : GraphObj, ICloneable, ISerializable { #region Fields /// /// Private field that stores the image. Use the public property /// to access this value. /// private Image _image; /// /// Private field that determines if the image will be scaled to the output rectangle. /// /// true to scale the image, false to draw the image unscaled, but clipped /// to the destination rectangle private bool _isScaled; #endregion #region Defaults /// /// A simple struct that defines the /// default property values for the class. /// new public struct Default { // Default text item properties /// /// Default value for the /// property. /// public static bool IsScaled = true; } #endregion #region Properties /// /// The object. /// /// A class reference. public Image Image { get { return _image; } set { _image = value; } } /// /// Gets or sets a property that determines if the image will be scaled to the /// output rectangle (see ). /// /// true to scale the image, false to draw the image unscaled, but clipped /// to the destination rectangle public bool IsScaled { get { return _isScaled; } set { _isScaled = value; } } #endregion #region Constructors /// Constructors for the object /// /// A default constructor that places a null at a /// default of (0,0,1,1) /// public ImageObj() : this( null, 0, 0, 1, 1 ) { } /// /// A constructor that allows the and /// location for the /// to be pre-specified. /// /// A class that defines /// the image /// A struct that defines the /// image location, specifed in units based on the /// property. public ImageObj( Image image, RectangleF rect ) : this( image, rect.X, rect.Y, rect.Width, rect.Height ) { } /// Constructors for the object /// /// A constructor that allows the and /// location for the /// to be pre-specified. /// /// A class that defines /// the image /// A struct that defines the /// image location, specifed in units based on the /// property. /// The enum value that /// indicates what type of coordinate system the x and y parameters are /// referenced to. /// The enum that specifies /// the horizontal alignment of the object with respect to the (x,y) location /// The enum that specifies /// the vertical alignment of the object with respect to the (x,y) location public ImageObj( Image image, RectangleF rect, CoordType coordType, AlignH alignH, AlignV alignV ) : base( rect.X, rect.Y, rect.Width, rect.Height, coordType, alignH, alignV ) { _image = image; _isScaled = Default.IsScaled; } /// Constructors for the object /// /// A constructor that allows the and /// individual coordinate locations for the /// to be pre-specified. /// /// A class that defines /// the image /// The position of the left side of the rectangle that defines the /// location. The units of this position are specified by the /// property. /// The position of the top side of the rectangle that defines the /// location. The units of this position are specified by the /// property. /// The width of the rectangle that defines the /// location. The units of this position are specified by the /// property. /// The height of the rectangle that defines the /// location. The units of this position are specified by the /// property. public ImageObj( Image image, double left, double top, double width, double height ) : base( left, top, width, height ) { _image = image; _isScaled = Default.IsScaled; } /// /// The Copy Constructor /// /// The object from which to copy public ImageObj( ImageObj rhs ) : base( rhs ) { _image = rhs._image; _isScaled = rhs.IsScaled; } /// /// Implement the interface in a typesafe manner by just /// calling the typed version of /// /// A deep copy of this object object ICloneable.Clone() { return this.Clone(); } /// /// Typesafe, deep-copy clone method. /// /// A new, independent copy of this class public ImageObj Clone() { return new ImageObj( this ); } #endregion #region Serialization /// /// Current schema value that defines the version of the serialized file /// public const int schema2 = 10; /// /// Constructor for deserializing objects /// /// A instance that defines the serialized data /// /// A instance that contains the serialized data /// protected ImageObj( SerializationInfo info, StreamingContext context ) : base( info, context ) { // The schema value is just a file version parameter. You can use it to make future versions // backwards compatible as new member variables are added to classes int sch = info.GetInt32( "schema2" ); _image = (Image) info.GetValue( "image", typeof(Image) ); _isScaled = info.GetBoolean( "isScaled" ); } /// /// Populates a instance with the data needed to serialize the target object /// /// A instance that defines the serialized data /// A instance that contains the serialized data [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] public override void GetObjectData( SerializationInfo info, StreamingContext context ) { base.GetObjectData( info, context ); info.AddValue( "schema2", schema2 ); info.AddValue( "image", _image ); info.AddValue( "isScaled", _isScaled ); } #endregion #region Rendering Methods /// /// Render this object to the specified device /// This method is normally only called by the Draw method /// of the parent collection object. /// /// /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// /// /// A reference to the object that is the parent or /// owner of this object. /// /// /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent object using the /// method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) { if ( _image != null ) { // Convert the rectangle coordinates from the user coordinate system // to the screen coordinate system RectangleF tmpRect = _location.TransformRect( pane ); if ( _isScaled ) g.DrawImage( _image, tmpRect ); else { Region clip = g.Clip; g.SetClip( tmpRect ); g.DrawImageUnscaled( _image, Rectangle.Round( tmpRect ) ); g.SetClip( clip, CombineMode.Replace ); //g.DrawImageUnscaledAndClipped( image, Rectangle.Round( tmpRect ) ); } } } /// /// Determine if the specified screen point lies inside the bounding box of this /// . The bounding box is calculated assuming a distance /// of pixels around the arrow segment. /// /// The screen point, in pixels /// /// A reference to the object that is the parent or /// owner of this object. /// /// /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// /// /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent object using the /// method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// /// true if the point lies in the bounding box, false otherwise override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) { if ( _image != null ) { if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) return false; // transform the x,y location from the user-defined // coordinate frame to the screen pixel location RectangleF tmpRect = _location.TransformRect( pane ); return tmpRect.Contains( pt ); } else return false; } /// /// Determines the shape type and Coords values for this GraphObj /// override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, out string shape, out string coords ) { // transform the x,y location from the user-defined // coordinate frame to the screen pixel location RectangleF pixRect = _location.TransformRect( pane ); shape = "rect"; coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", pixRect.Left, pixRect.Top, pixRect.Right, pixRect.Bottom ); } #endregion } }