public override HexBufferLine GetLineFromPosition(HexBufferPoint position) { position = FilterAndVerify(position); ResetBuilderFields(); var linePosition = startPosition + (position.Position - startPosition).ToUInt64() / bytesPerLine * bytesPerLine; var lineEnd = HexPosition.Min(linePosition + bytesPerLine, endPosition); var lineSpan = HexSpan.FromBounds(linePosition, lineEnd); var logicalOffset = ToLogicalPosition(lineSpan.Start); var hexBytes = buffer.ReadHexBytes(lineSpan.Start, (long)lineSpan.Length.ToUInt64()); var offsetSpan = default(VST.Span); var fullValuesSpan = default(VST.Span); var visibleValuesSpan = default(VST.Span); var fullAsciiSpan = default(VST.Span); var visibleAsciiSpan = default(VST.Span); var valueCells = Array.Empty <HexCell>(); var asciiCells = Array.Empty <HexCell>(); bool needSep = false; foreach (var column in columnOrder) { switch (column) { case HexColumnType.Offset: if (showOffset) { if (needSep) { stringBuilder.Append(' '); } needSep = true; WriteOffset(logicalOffset, out offsetSpan); } break; case HexColumnType.Values: if (showValues) { if (needSep) { stringBuilder.Append(' '); } needSep = true; valueCells = WriteValues(hexBytes, lineSpan, out fullValuesSpan, out visibleValuesSpan); } break; case HexColumnType.Ascii: if (showAscii) { if (needSep) { stringBuilder.Append(' '); } needSep = true; asciiCells = WriteAscii(hexBytes, lineSpan, out fullAsciiSpan, out visibleAsciiSpan); } break; default: throw new InvalidOperationException(); } } var text = stringBuilder.ToString(); if (text.Length != CharsPerLine) { throw new InvalidOperationException(); } var valueCellColl = valueCells.Length == 0 ? HexCellCollection.Empty : new HexCellCollection(valueCells); var asciiCellColl = asciiCells.Length == 0 ? HexCellCollection.Empty : new HexCellCollection(asciiCells); var lineNumber = GetLineNumberFromPosition(new HexBufferPoint(Buffer, lineSpan.Start)); var res = new HexBufferLineImpl(this, lineNumber, columnOrder, new HexBufferSpan(buffer, lineSpan), hexBytes, text, showOffset, showValues, showAscii, logicalOffset, valueCellColl, asciiCellColl, offsetSpan, fullValuesSpan, visibleValuesSpan, fullAsciiSpan, visibleAsciiSpan); ResetBuilderFields(); return(res); }
public override HexBufferLine GetLineFromPosition(HexBufferPoint position) { position = FilterAndVerify(position); ResetBuilderFields(); var linePosition = startPosition + (position.Position - startPosition).ToUInt64() / bytesPerLine * bytesPerLine; var lineEnd = HexPosition.Min(linePosition + bytesPerLine, endPosition); var lineSpan = HexSpan.FromBounds(linePosition, lineEnd); var logicalOffset = ToLogicalPosition(lineSpan.Start); var hexBytes = buffer.ReadHexBytes(lineSpan.Start, (long)lineSpan.Length.ToUInt64()); var offsetSpan = default(VST.Span); var fullValuesSpan = default(VST.Span); var visibleValuesSpan = default(VST.Span); var fullAsciiSpan = default(VST.Span); var visibleAsciiSpan = default(VST.Span); var valueCells = Array.Empty<HexCell>(); var asciiCells = Array.Empty<HexCell>(); bool needSep = false; foreach (var column in columnOrder) { switch (column) { case HexColumnType.Offset: if (showOffset) { if (needSep) stringBuilder.Append(' '); needSep = true; WriteOffset(logicalOffset, out offsetSpan); } break; case HexColumnType.Values: if (showValues) { if (needSep) stringBuilder.Append(' '); needSep = true; valueCells = WriteValues(hexBytes, lineSpan, out fullValuesSpan, out visibleValuesSpan); } break; case HexColumnType.Ascii: if (showAscii) { if (needSep) stringBuilder.Append(' '); needSep = true; asciiCells = WriteAscii(hexBytes, lineSpan, out fullAsciiSpan, out visibleAsciiSpan); } break; default: throw new InvalidOperationException(); } } var text = stringBuilder.ToString(); if (text.Length != CharsPerLine) throw new InvalidOperationException(); var valueCellColl = valueCells.Length == 0 ? HexCellCollection.Empty : new HexCellCollection(valueCells); var asciiCellColl = asciiCells.Length == 0 ? HexCellCollection.Empty : new HexCellCollection(asciiCells); var lineNumber = GetLineNumberFromPosition(new HexBufferPoint(Buffer, lineSpan.Start)); var res = new HexBufferLineImpl(this, lineNumber, columnOrder, new HexBufferSpan(buffer, lineSpan), hexBytes, text, showOffset, showValues, showAscii, logicalOffset, valueCellColl, asciiCellColl, offsetSpan, fullValuesSpan, visibleValuesSpan, fullAsciiSpan, visibleAsciiSpan); ResetBuilderFields(); return res; }