File: System\Windows\Media\textformatting\CharacterHit.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\PresentationCore\PresentationCore.csproj (PresentationCore)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
//
// 
//
// Description: The CharacterHit structure represents information about a character hit
// within a glyph run - the index of the first character that got hit and the information
// about leading or trailing edge.
//
//              See spec at "Glyph Run hit testing and caret placement API.htm#CharacterHit.doc"
// 
//
//
 
#region Using directives
 
using System;
 
#endregion
 
namespace System.Windows.Media.TextFormatting
{
    /// <summary>
    /// The CharacterHit structure represents information about a character hit within a glyph run
    /// - the index of the first character that got hit and the information about leading or trailing edge.
    /// </summary>
    public struct CharacterHit : IEquatable<CharacterHit>
    {
        /// <summary>
        /// Constructs a new CharacterHit structure.
        /// </summary>
        /// <param name="firstCharacterIndex">Index of the first character that got hit.</param>
        /// <param name="trailingLength">In case of leading edge this value is 0.
        /// In case of trailing edge this value is the number of codepoints until the next valid caret position.</param>
        public CharacterHit(int firstCharacterIndex, int trailingLength)
        {
            _firstCharacterIndex = firstCharacterIndex;
            _trailingLength = trailingLength;
        }
 
        /// <summary>
        /// Index of the first character that got hit.
        /// </summary>
        public int FirstCharacterIndex
        {
            get
            {
                return _firstCharacterIndex;
            }
        }
 
        /// <summary>
        /// In case of leading edge this value is 0.
        /// In case of trailing edge this value is the number of codepoints until the next valid caret position.
        /// </summary>
        public int TrailingLength
        {
            get
            {
                return _trailingLength;
            }
        }
 
        /// <summary>
        /// Checks whether two character hit objects are equal.
        /// </summary>
        /// <param name="left">First object to compare.</param>
        /// <param name="right">Second object to compare.</param>
        /// <returns>Returns true when the values of FirstCharacterIndex and TrailingLength are equal for both objects,
        /// and false otherwise.</returns>
        public static bool operator==(CharacterHit left, CharacterHit right)
        {
            return left._firstCharacterIndex == right._firstCharacterIndex &&
                left._trailingLength == right._trailingLength;
        }
 
        /// <summary>
        /// Checks whether two character hit objects are not equal.
        /// </summary>
        /// <param name="left">First object to compare.</param>
        /// <param name="right">Second object to compare.</param>
        /// <returns>Returns false when the values of FirstCharacterIndex and TrailingLength are equal for both objects,
        /// and true otherwise.</returns>
        public static bool operator!=(CharacterHit left, CharacterHit right)
        {
            return !(left == right);
        }
 
        /// <summary>
        /// Checks whether an object is equal to another character hit object.
        /// </summary>
        /// <param name="obj">CharacterHit object to compare with.</param>
        /// <returns>Returns true when the object is equal to the input object,
        /// and false otherwise.</returns>
        public bool Equals(CharacterHit obj)
        {
            return this == obj;
        }
 
        /// <summary>
        /// Checks whether an object is equal to another character hit object.
        /// </summary>
        /// <param name="obj">CharacterHit object to compare with.</param>
        /// <returns>Returns true when the object is equal to the input object,
        /// and false otherwise.</returns>
        public override bool Equals(object obj)
        {
            if (!(obj is CharacterHit))
                return false;
            return this == (CharacterHit)obj;
        }
 
        /// <summary>
        /// Compute hash code for this object.
        /// </summary>
        /// <returns>A 32-bit signed integer hash code.</returns>
        public override int GetHashCode()
        {
            return _firstCharacterIndex.GetHashCode() ^ _trailingLength.GetHashCode();
        }
 
        private int _firstCharacterIndex;
        private int _trailingLength;
    }
}