terminal/tools/ConsoleTypes.natvis
Leonard Hecker 89c39b06ed
Fix horizontal scrolling bugs in AtlasEngine/DxEngine (#15707)
This commit fixes a number of issues around horizontal scrolling.
DxEngine only had one bug, where the clip rect would cause any content
outside of the actual viewport to be invisible. AtlasEngine had more
bugs, mostly around the conversion from textbuffer-relative coordinates
to viewport-relative coordinates, since AtlasEngine stores things like
the cursor position, attributes, etc., relative to the viewport.

It also renames `cellCount` to `viewportCellCount`, because I realized
that it might have to deal with a `textBufferCellCount` or similar in
the future. I hope that the new name is more descriptive of what it
refers to.

Future improvements to AtlasEngine in particular would be to not copy
the entire `Settings` struct every time the horizontal scroll offset
changes, and to trim trailing whitespace before shaping text.

This is in preparation for #1860

## Validation Steps Performed
* Patch `RenderingTests` to run in the main (and not alt) buffer
* Horizontal scrolling of line renditions and attributes works 
* Selection retains its position (mostly) 
2023-07-18 13:35:18 -05:00

164 lines
6.9 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<!-- See https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2017#BKMK_Syntax_reference for documentation -->
<Type Name="TextColor">
<DisplayString Condition="_meta==ColorType::IsIndex256">{{Index256:{_index}}}</DisplayString>
<DisplayString Condition="_meta==ColorType::IsIndex16">{{Index16:{_index}}}</DisplayString>
<DisplayString Condition="_meta==ColorType::IsDefault">{{Default}}</DisplayString>
<DisplayString Condition="_meta==ColorType::IsRgb">{{RGB:{_red},{_green},{_blue}}}</DisplayString>
<Expand></Expand>
</Type>
<Type Name="TextAttribute">
<DisplayString Condition="_hyperlinkId == 0">{{FG: {_foreground}, BG: {_background}, Attr: {_attrs}}</DisplayString>
<DisplayString Condition="_hyperlinkId != 0">{{FG: {_foreground}, BG: {_background}, Attr: {_attrs}, Hyperlink: {_hyperlinkId}}</DisplayString>
</Type>
<Type Name="Microsoft::Console::Types::Viewport">
<!-- Can't call functions in here -->
<DisplayString>{{LT({_sr.left}, {_sr.top}) RB({_sr.right}, {_sr.bottom}) [{_sr.right-_sr.left+1} x { _sr.bottom-_sr.top+1}]}}</DisplayString>
<Expand>
<ExpandedItem>_sr</ExpandedItem>
</Expand>
</Type>
<Type Name="_COORD">
<DisplayString>{{{X},{Y}}}</DisplayString>
</Type>
<Type Name="_SMALL_RECT">
<DisplayString>{{LT({Left}, {Top}) RB({Right}, {Bottom}) In:[{Right-Left+1} x {Bottom-Top+1}] Ex:[{Right-Left} x {Bottom-Top}]}}</DisplayString>
</Type>
<Type Name="ROW">
<DisplayString>{_chars.data(),[_charOffsets[_columnCount]]}</DisplayString>
<StringView>_chars.data(),[_charOffsets[_columnCount]]</StringView>
<Expand>
<Item Name="_chars">_chars.data(),[_charOffsets[_columnCount]]</Item>
<Item Name="_charOffsets">_charOffsets.data(),[_charOffsets.size()]</Item>
</Expand>
</Type>
<Type Name="std::unique_ptr&lt;TextBuffer,std::default_delete&lt;TextBuffer&gt;&gt;">
<Expand>
<ExpandedItem>_Mypair._Myval2</ExpandedItem>
</Expand>
</Type>
<Type Name="KeyEvent">
<DisplayString Condition="_keyDown">{{↓ wch:{_charData} mod:{_activeModifierKeys} repeat:{_repeatCount} vk:{_virtualKeyCode} vsc:{_virtualScanCode}}</DisplayString>
<DisplayString Condition="!_keyDown">{{↑ wch:{_charData} mod:{_activeModifierKeys} repeat:{_repeatCount} vk:{_virtualKeyCode} vsc:{_virtualScanCode}}</DisplayString>
</Type>
<Type Name="til::size">
<DisplayString>{{W: {width} x H: {height} -> A: {width * height}}}</DisplayString>
</Type>
<Type Name="til::point">
<DisplayString>{{X: {x}, Y: {y}}}</DisplayString>
</Type>
<Type Name="til::rect">
<DisplayString>{{L: {left}, T: {top}, R: {right} B: {bottom} [W: {right - left} x H: {bottom - top} -> A: {(right - left) * (bottom - top)}]}}</DisplayString>
</Type>
<Type Name="til::color">
<DisplayString>{{RGB: {(int)r,d}, {(int)g,d}, {(int)b,d}; α: {(int)a,d}}}</DisplayString>
</Type>
<Type Name="til::rle&lt;*&gt;">
<DisplayString>{{Size: {_total_length,d}}}</DisplayString>
<Expand>
<Item Name="[size]">_total_length</Item>
<ExpandedItem>_runs</ExpandedItem>
</Expand>
</Type>
<Type Name="til::details::rle_const_iterator&lt;*&gt;">
<DisplayString>{{run of {_it->first,d} for {_it->second,d} at {_usage,d}}}</DisplayString>
</Type>
<Type Name="til::small_vector&lt;*&gt;">
<DisplayString>{{ size={_size} }}</DisplayString>
<Expand>
<Item Name="[capacity]" ExcludeView="simple">_capacity</Item>
<Item Name="[size]" ExcludeView="simple">_size</Item>
<ArrayItems>
<Size>_size</Size>
<ValuePointer>_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="til::small_vector_iterator&lt;*&gt;">
<AlternativeType Name="til::small_vector_const_iterator&lt;*&gt;" />
<SmartPointer Usage="Indexable">_ptr,na</SmartPointer>
<Expand>
<Item Name="[ptr]">_ptr</Item>
</Expand>
</Type>
<Type Name="til::generational&lt;*&gt;">
<AlternativeType Name="$T1" />
<SmartPointer Usage="Minimal">&amp;_value</SmartPointer>
<DisplayString>{{ generation={_generation._value} }}</DisplayString>
</Type>
<Type Name="til::linear_flat_set&lt;*,*&gt;">
<DisplayString>{{ size={_load / $T2} }}</DisplayString>
<Expand>
<ArrayItems>
<Size>_capacity</Size>
<ValuePointer>_map._Mypair._Myval2</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="TextBuffer">
<DisplayString>{{ width={_width}, height={_height} }}</DisplayString>
<Expand>
<Item Name="_firstRow">_firstRow</Item>
<Item Name="scratchpad">*(ROW*)_buffer.__ptr_.__value_</Item>
<IndexListItems>
<Size>(_commitWatermark - _buffer.__ptr_.__value_ - 1) / _bufferRowStride</Size>
<ValueNode>*(ROW*)(_buffer.__ptr_.__value_ + _bufferRowStride * ($i + 1))</ValueNode>
</IndexListItems>
</Expand>
</Type>
<Type Name="Microsoft::Console::Render::Atlas::Buffer&lt;*&gt;">
<DisplayString>{{ size={_size} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">_size</Item>
<ArrayItems>
<Size>_size</Size>
<ValuePointer>_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="Microsoft::Console::Render::Atlas::ShapedRow">
<DisplayString>{{ dirtyTop={dirtyTop}, dirtyBottom={dirtyBottom} }}</DisplayString>
</Type>
<Type Name="Microsoft::Console::Render::Atlas::BackendD3D::AtlasGlyphEntry">
<DisplayString Condition="!_occupied">(empty)</DisplayString>
<DisplayString Condition="_occupied">{glyphIndex}</DisplayString>
</Type>
<Type Name="Microsoft::Console::Render::Atlas::BackendD3D::AtlasFontFaceEntryInner">
<DisplayString>{(void*)fontFace.m_ptr}, {lineRendition}</DisplayString>
<Expand>
<ExpandedItem>glyphs</ExpandedItem>
</Expand>
</Type>
<Type Name="Microsoft::Console::Render::Atlas::BackendD3D::AtlasFontFaceEntry">
<DisplayString Condition="!inner._Mypair._Myval2">(empty)</DisplayString>
<DisplayString Condition="inner._Mypair._Myval2">{*inner._Mypair._Myval2}</DisplayString>
<Expand>
<ExpandedItem>*inner._Mypair._Myval2</ExpandedItem>
</Expand>
</Type>
</AutoVisualizer>