internal void SetSnapshotAndUpdate(ITextSnapshot snapshot, double deltaX, double deltaY, IList <ITextViewLine> newOrReformattedLines, IList <ITextViewLine> translatedLines) { //Go through all the added visuals and invalidate or transform as appropriate. List <AdornmentAndData> newVisuals = new List <AdornmentAndData>(_elements.Count); for (int i = 0; (i < _elements.Count); ++i) { AdornmentAndData data = _elements[i]; if (!data.VisualSpan.HasValue) { newVisuals.Add(data); if (data.Behavior == AdornmentPositioningBehavior.ViewportRelative) { data.Translate(deltaX, deltaY); } } else { data.SetSnapshot(snapshot); SnapshotSpan span = data.VisualSpan.Value; if ((!_view.TextViewLines.IntersectsBufferSpan(span)) || (GetCrossingLine(newOrReformattedLines, span) != null)) { //Either visual is no longer visible or it crosses a line //that was reformatted. this.RemoveTranslatableVisual(data); } else { newVisuals.Add(data); switch (data.Behavior) { case AdornmentPositioningBehavior.TextRelative: case (AdornmentPositioningBehavior)(AdornmentPositioningBehavior2.TextRelativeVerticalOnly): { ITextViewLine line = GetCrossingLine(translatedLines, span); if (line != null) { data.Translate((data.Behavior == AdornmentPositioningBehavior.TextRelative) ? 0.0 : deltaX, line.DeltaY); } else if (data.Behavior == (AdornmentPositioningBehavior)(AdornmentPositioningBehavior2.TextRelativeVerticalOnly)) { data.Translate(deltaX, 0.0); } break; } case AdornmentPositioningBehavior.ViewportRelative: { data.Translate(deltaX, deltaY); break; } } } } } _elements = newVisuals; }