| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "LargeConsoleRead.h" |
| |
|
| | #include <stdlib.h> |
| |
|
| | #include "../shared/WindowsVersion.h" |
| | #include "Scraper.h" |
| | #include "Win32ConsoleBuffer.h" |
| |
|
| | LargeConsoleReadBuffer::LargeConsoleReadBuffer() : |
| | m_rect(0, 0, 0, 0), m_rectWidth(0) |
| | { |
| | } |
| |
|
| | void largeConsoleRead(LargeConsoleReadBuffer &out, |
| | Win32ConsoleBuffer &buffer, |
| | const SmallRect &readArea, |
| | WORD attributesMask) { |
| | ASSERT(readArea.Left >= 0 && |
| | readArea.Top >= 0 && |
| | readArea.Right >= readArea.Left && |
| | readArea.Bottom >= readArea.Top && |
| | readArea.width() <= MAX_CONSOLE_WIDTH); |
| | const size_t count = readArea.width() * readArea.height(); |
| | if (out.m_data.size() < count) { |
| | out.m_data.resize(count); |
| | } |
| | out.m_rect = readArea; |
| | out.m_rectWidth = readArea.width(); |
| |
|
| | static const bool useLargeReads = isAtLeastWindows8(); |
| | if (useLargeReads) { |
| | buffer.read(readArea, out.m_data.data()); |
| | } else { |
| | const int maxReadLines = std::max(1, MAX_CONSOLE_WIDTH / readArea.width()); |
| | int curLine = readArea.Top; |
| | while (curLine <= readArea.Bottom) { |
| | const SmallRect subReadArea( |
| | readArea.Left, |
| | curLine, |
| | readArea.width(), |
| | std::min(maxReadLines, readArea.Bottom + 1 - curLine)); |
| | buffer.read(subReadArea, out.lineDataMut(curLine)); |
| | curLine = subReadArea.Bottom + 1; |
| | } |
| | } |
| | if (attributesMask != static_cast<WORD>(~0)) { |
| | for (size_t i = 0; i < count; ++i) { |
| | out.m_data[i].Attributes &= attributesMask; |
| | } |
| | } |
| | } |
| |
|