private bool EmitChangeEvent(Range currentRange, bool textChanged, bool propertiesChanged)
        {
            MarkerSnapshot oldState = PreviousEventState;

            currentRange = currentRange ?? GetRange();

            if (!propertiesChanged &&
                oldState.Valid == Valid &&
                oldState.Tailed == Tailed &&
                oldState.Reversed == Reversed &&
                oldState.Range.CompareTo(currentRange) == 0)
            {
                return(false);
            }

            MarkerSnapshot newState = PreviousEventState = GetSnapshot(currentRange);

            Point oldHeadPosition, oldTailPosition, newHeadPosition, newTailPosition;

            if (oldState.Reversed)
            {
                oldHeadPosition = oldState.Range.Start;
                oldTailPosition = oldState.Range.End;
            }
            else
            {
                oldHeadPosition = oldState.Range.End;
                oldTailPosition = oldState.Range.Start;
            }

            if (newState.Reversed)
            {
                newHeadPosition = newState.Range.Start;
                newTailPosition = newState.Range.End;
            }
            else
            {
                newHeadPosition = newState.Range.End;
                newTailPosition = newState.Range.Start;
            }

            OnDidChange.Invoke(
                new OnDidChangeEventArgs(
                    oldState.Valid, newState.Valid, oldState.Tailed, newState.Tailed,
                    oldState.Properties, newState.Properties,
                    oldHeadPosition, newHeadPosition,
                    oldTailPosition, newTailPosition,
                    textChanged));
            return(true);
        }
        /// <summary>
        /// Creates and returns a new {Marker} with the same properties as this
        /// marker.
        /// </summary>
        public Marker Copy(MarkerOptions options)
        {
            MarkerSnapshot snapshot = GetSnapshot(null);

            return(Layer.CreateMarker(GetRange(), snapshot.MergeOptions(options)));
        }