mirror of
https://github.com/microsoft/terminal.git
synced 2026-04-13 09:41:02 +00:00
Previously this project used a great variety of types to present text buffer coordinates: `short`, `unsigned short`, `int`, `unsigned int`, `size_t`, `ptrdiff_t`, `COORD`/`SMALL_RECT` (aka `short`), and more. This massive commit migrates almost all use of those types over to the centralized types `til::point`/`size`/`rect`/`inclusive_rect` and their underlying type `til::CoordType` (aka `int32_t`). Due to the size of the changeset and statistics I expect it to contain bugs. The biggest risk I see is that some code potentially, maybe implicitly, expected arithmetic to be mod 2^16 and that this code now allows it to be mod 2^32. Any narrowing into `short` later on would then throw exceptions. ## PR Checklist * [x] Closes #4015 * [x] I work here * [x] Tests added/passed ## Validation Steps Performed Casual usage of OpenConsole and Windows Terminal. ✅
96 lines
3.0 KiB
C++
96 lines
3.0 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "OutputCellRect.hpp"
|
|
|
|
// Routine Description:
|
|
// - Constructs an empty in-memory region for holding output buffer cell data.
|
|
OutputCellRect::OutputCellRect() noexcept :
|
|
_rows(0),
|
|
_cols(0)
|
|
{
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Constructs an in-memory region for holding a copy of output buffer cell data.
|
|
// - NOTE: This creatively skips the constructors for every cell. You must fill
|
|
// every single cell in this rectangle before iterating/reading for it to be valid.
|
|
// - NOTE: This is designed for perf-sensitive paths ONLY. Take care.
|
|
// Arguments:
|
|
// - rows - Rows in the rectangle (height)
|
|
// - cols - Columns in the rectangle (width)
|
|
OutputCellRect::OutputCellRect(const til::CoordType rows, const til::CoordType cols) :
|
|
_rows(rows),
|
|
_cols(cols)
|
|
{
|
|
_storage.resize(gsl::narrow<size_t>(rows * cols));
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Gets a read/write span over a single row inside the rectangle.
|
|
// Arguments:
|
|
// - row - The Y position or row index in the buffer.
|
|
// Return Value:
|
|
// - Read/write span of OutputCells
|
|
gsl::span<OutputCell> OutputCellRect::GetRow(const til::CoordType row)
|
|
{
|
|
return gsl::span<OutputCell>(_FindRowOffset(row), _cols);
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Gets a read-only iterator view over a single row of the rectangle.
|
|
// Arguments:
|
|
// - row - The Y position or row index in the buffer.
|
|
// Return Value:
|
|
// - Read-only iterator of OutputCells
|
|
OutputCellIterator OutputCellRect::GetRowIter(const til::CoordType row) const
|
|
{
|
|
const gsl::span<const OutputCell> view(_FindRowOffset(row), _cols);
|
|
|
|
return OutputCellIterator(view);
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Internal helper to find the pointer to the specific row offset in the giant
|
|
// contiguous block of memory allocated for this rectangle.
|
|
// Arguments:
|
|
// - row - The Y position or row index in the buffer.
|
|
// Return Value:
|
|
// - Pointer to the location in the rectangle that represents the start of the requested row.
|
|
OutputCell* OutputCellRect::_FindRowOffset(const til::CoordType row)
|
|
{
|
|
return &_storage.at(gsl::narrow_cast<size_t>(row * _cols));
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Internal helper to find the pointer to the specific row offset in the giant
|
|
// contiguous block of memory allocated for this rectangle.
|
|
// Arguments:
|
|
// - row - The Y position or row index in the buffer.
|
|
// Return Value:
|
|
// - Pointer to the location in the rectangle that represents the start of the requested row.
|
|
const OutputCell* OutputCellRect::_FindRowOffset(const til::CoordType row) const
|
|
{
|
|
return &_storage.at(gsl::narrow_cast<size_t>(row * _cols));
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Gets the height of the rectangle
|
|
// Return Value:
|
|
// - Height
|
|
til::CoordType OutputCellRect::Height() const noexcept
|
|
{
|
|
return _rows;
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Gets the width of the rectangle
|
|
// Return Value:
|
|
// - Width
|
|
til::CoordType OutputCellRect::Width() const noexcept
|
|
{
|
|
return _cols;
|
|
}
|