add TextPort, move size to textPort.

git-svn-id: svn://qnap.local/TwoTerm/trunk@1897 5590a31f-7b70-45f8-8c82-aa3a8e5f4507
This commit is contained in:
Kelvin Sherlock 2010-12-23 20:41:58 +00:00
parent 35918005de
commit 10ee324572
2 changed files with 108 additions and 116 deletions

View File

@ -13,17 +13,21 @@
Screen::Screen(unsigned height, unsigned width) Screen::Screen(unsigned height, unsigned width)
{ {
_height = height;
_width = width; _port.frame = iRect(0, 0, width, height);
_port.rightMargin = TextPort::RMTruncate;
_port.advanceCursor = true;
_port.scroll = true;
_flag = 0; _flag = 0;
_screen.resize(_height); _screen.resize(height);
for (ScreenIterator iter = _screen.begin(); iter != _screen.end(); ++iter) for (ScreenIterator iter = _screen.begin(); iter != _screen.end(); ++iter)
{ {
iter->resize(_width); iter->resize(width);
} }
@ -45,8 +49,8 @@ iRect Screen::endUpdate()
{ {
int maxX = -1; int maxX = -1;
int maxY = -1; int maxY = -1;
int minX = _width; int minX = width();
int minY = _height; int minY = height();
if (_cursor != _updateCursor) if (_cursor != _updateCursor)
@ -86,13 +90,13 @@ void Screen::clearFlagBit(uint8_t bit)
void Screen::putc(uint8_t c, bool incrementX) void Screen::putc(uint8_t c, bool incrementX)
{ {
if (_cursor.x < _width) if (_cursor.x < width())
{ {
_updates.push_back(_cursor); _updates.push_back(_cursor);
_screen[_cursor.y][_cursor.x] = CharInfo(c, _flag); _screen[_cursor.y][_cursor.x] = CharInfo(c, _flag);
if (incrementX && _cursor.x < _width - 1) ++_cursor.x; if (incrementX && _cursor.x < width() - 1) ++_cursor.x;
} }
} }
@ -102,10 +106,10 @@ void Screen::deletec()
// move following character up // move following character up
// set final character to ' ' (retaining flags from previous char) // set final character to ' ' (retaining flags from previous char)
if (_cursor.x >= _width) return; if (_cursor.x >= width()) return;
_updates.push_back(_cursor); _updates.push_back(_cursor);
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
CharInfoIterator end = _screen[_cursor.y].end() - 1; CharInfoIterator end = _screen[_cursor.y].end() - 1;
@ -126,10 +130,10 @@ void Screen::insertc(uint8_t c)
// insert character at cursor. // insert character at cursor.
// move following characters up (retaining flags). // move following characters up (retaining flags).
if (_cursor.x >= _width) return; if (_cursor.x >= width()) return;
_updates.push_back(_cursor); _updates.push_back(_cursor);
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
CharInfoIterator end = _screen[_cursor.y].end() - 1; CharInfoIterator end = _screen[_cursor.y].end() - 1;
CharInfoIterator iter = _screen[_cursor.y].begin() + _cursor.x; CharInfoIterator iter = _screen[_cursor.y].begin() + _cursor.x;
@ -148,7 +152,7 @@ void Screen::tabTo(unsigned xPos)
CharInfo clear(' ', _flag); CharInfo clear(' ', _flag);
CharInfoIterator iter; CharInfoIterator iter;
xPos = std::min(xPos, _width - 1); xPos = std::min(xPos, width() - 1);
_updates.push_back(_cursor); _updates.push_back(_cursor);
@ -169,9 +173,9 @@ void Screen::setX(int x, bool clamp)
if (clamp) _cursor.x = 0; if (clamp) _cursor.x = 0;
return; return;
} }
if (x >= _width) if (x >= width())
{ {
if (clamp) _cursor.x = _width - 1; if (clamp) _cursor.x = width() - 1;
return; return;
} }
@ -186,9 +190,9 @@ void Screen::setY(int y, bool clamp)
if (clamp) _cursor.y = 0; if (clamp) _cursor.y = 0;
return; return;
} }
if (y >= _height) if (y >= height())
{ {
if (clamp) _cursor.y = _height - 1; if (clamp) _cursor.y = height() - 1;
return; return;
} }
@ -238,7 +242,7 @@ void Screen::erase(EraseRegion region)
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0)); std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
} }
_updates.push_back(iPoint(0,0)); _updates.push_back(iPoint(0,0));
_updates.push_back(iPoint(_width - 1, _height - 1)); _updates.push_back(iPoint(width() - 1, height() - 1));
return; return;
} }
@ -253,7 +257,7 @@ void Screen::erase(EraseRegion region)
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0)); std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
} }
_updates.push_back(iPoint(0,0)); _updates.push_back(iPoint(0,0));
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
region = EraseLineBeforeCursor; region = EraseLineBeforeCursor;
} }
@ -266,7 +270,7 @@ void Screen::erase(EraseRegion region)
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0)); std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
} }
_updates.push_back(iPoint(0,_cursor.y + 1)); _updates.push_back(iPoint(0,_cursor.y + 1));
_updates.push_back(iPoint(_width - 1, _height - 1)); _updates.push_back(iPoint(width() - 1, height() - 1));
region = EraseLineAfterCursor; region = EraseLineAfterCursor;
} }
@ -278,7 +282,7 @@ void Screen::erase(EraseRegion region)
std::fill(_screen[y].begin(), _screen[y].end(), CharInfo(0,0)); std::fill(_screen[y].begin(), _screen[y].end(), CharInfo(0,0));
_updates.push_back(iPoint(0, _cursor.y)); _updates.push_back(iPoint(0, _cursor.y));
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
return; return;
} }
@ -300,7 +304,7 @@ void Screen::erase(EraseRegion region)
std::fill(_screen[y].begin() + _cursor.x, _screen[y].end(), CharInfo(0,0)); std::fill(_screen[y].begin() + _cursor.x, _screen[y].end(), CharInfo(0,0));
_updates.push_back(_cursor); _updates.push_back(_cursor);
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
} }
@ -317,7 +321,7 @@ void Screen::eraseLine()
} }
_updates.push_back(_cursor); _updates.push_back(_cursor);
_updates.push_back(iPoint(_width - 1, _cursor.y)); _updates.push_back(iPoint(width() - 1, _cursor.y));
} }
void Screen::eraseScreen() void Screen::eraseScreen()
{ {
@ -325,7 +329,7 @@ void Screen::eraseScreen()
eraseLine(); eraseLine();
if (_cursor.y == _height -1) return; if (_cursor.y == height() -1) return;
for (ScreenIterator iter = _screen.begin() + _cursor.y; iter < _screen.end(); ++iter) for (ScreenIterator iter = _screen.begin() + _cursor.y; iter < _screen.end(); ++iter)
{ {
@ -337,15 +341,15 @@ void Screen::eraseScreen()
} }
_updates.push_back(iPoint(0, _cursor.y + 1)); _updates.push_back(iPoint(0, _cursor.y + 1));
_updates.push_back(iPoint(_width - 1, _height - 1)); _updates.push_back(iPoint(width() - 1, height() - 1));
} }
void Screen::eraseRect(iRect rect) void Screen::eraseRect(iRect rect)
{ {
unsigned maxX = std::min(_width, (unsigned)rect.maxX()); unsigned maxX = std::min(width(), (unsigned)rect.maxX());
unsigned maxY = std::min(_height, (unsigned)rect.maxY()); unsigned maxY = std::min(height(), (unsigned)rect.maxY());
CharInfo clear; CharInfo clear;
@ -367,29 +371,9 @@ void Screen::lineFeed()
{ {
// moves the screen up one row, inserting a blank line at the bottom. // moves the screen up one row, inserting a blank line at the bottom.
if (_cursor.y == _height - 1) if (_cursor.y == height() - 1)
{ {
/* deleteLine(0);
// move lines 1..end up 1 line.
for (ScreenIterator iter = _screen.begin() + 1; iter < _screen.end(); ++iter)
{
iter[-1] = *iter;
}
// reset the bottom line
//_screen.back().clear();
//_screen.back().resize(_width);
for (CharInfoIterator ciIter = _screen.back().begin(); ciIter < _screen.back().end(); ++ciIter)
{
*ciIter = CharInfo(0, 0);
}
_updates.push_back(iPoint(0, 0));
_updates.push_back(iPoint(_width - 1, _height - 1));
*/
removeLine(0);
} }
else else
{ {
@ -397,6 +381,31 @@ void Screen::lineFeed()
} }
} }
void Screen::lineFeed(TextPort *textPort)
{
int maxY;
if (!textPort)
{
lineFeed();
return;
}
maxY = textPort->frame.maxY();
maxY = std::min(maxY, (int)height());
if (_cursor.y < maxY)
{
_cursor.y++;
}
else if (textPort->scroll)
{
_cursor.y++;
}
}
void Screen::reverseLineFeed() void Screen::reverseLineFeed()
{ {
@ -404,26 +413,7 @@ void Screen::reverseLineFeed()
if (_cursor.y == 0) if (_cursor.y == 0)
{ {
/* insertLine(0);
for (ReverseScreenIterator iter = _screen.rbegin() + 1; iter < _screen.rend(); ++iter)
{
iter[-1] = *iter;
}
// reset the top line
//_screen.front().clear();
//_screen.front().resize(_width);
for (CharInfoIterator ciIter = _screen.front().begin(); ciIter < _screen.front().end(); ++ciIter)
{
*ciIter = CharInfo(0, 0);
}
_updates.push_back(iPoint(0, 0));
_updates.push_back(iPoint(_width - 1, _height - 1));
*/
addLine(0);
} }
else else
{ {
@ -434,15 +424,15 @@ void Screen::reverseLineFeed()
void Screen::addLine(unsigned line) void Screen::insertLine(unsigned line)
{ {
if (line >= _height) return; if (line >= height()) return;
if (line == _height - 1) if (line == height() - 1)
{ {
_screen.back().clear(); _screen.back().clear();
_screen.back().resize(_width); _screen.back().resize(width());
} }
else else
{ {
@ -451,19 +441,19 @@ void Screen::addLine(unsigned line)
_screen.pop_back(); _screen.pop_back();
iter = _screen.insert(_screen.begin() + line, newLine); iter = _screen.insert(_screen.begin() + line, newLine);
iter->resize(_width); iter->resize(width());
} }
_updates.push_back(iPoint(0, line)); _updates.push_back(iPoint(0, line));
_updates.push_back(iPoint(_width - 1, _height - 1)); _updates.push_back(iPoint(width() - 1, height() - 1));
} }
void Screen::removeLine(unsigned line) void Screen::deleteLine(unsigned line)
{ {
if (line >= _height) return; if (line >= height()) return;
if (line == _height - 1) if (line == height() - 1)
{ {
_screen.back().clear(); _screen.back().clear();
@ -477,11 +467,11 @@ void Screen::removeLine(unsigned line)
_screen.push_back(newLine); _screen.push_back(newLine);
} }
_screen.back().resize(_width); _screen.back().resize(width());
_updates.push_back(iPoint(0, line)); _updates.push_back(iPoint(0, line));
_updates.push_back(iPoint(_width - 1, _height - 1)); _updates.push_back(iPoint(width() - 1, height() - 1));
} }
@ -489,18 +479,18 @@ void Screen::removeLine(unsigned line)
void Screen::setSize(unsigned width, unsigned height) void Screen::setSize(unsigned w, unsigned h)
{ {
if ((_height == height) && (_width == width)) return; if ((height() == h) && (width() == w)) return;
if (_height < height) if (height() < h)
{ {
_screen.resize(height); _screen.resize(h);
} }
else if (_height > height) else if (height() > h)
{ {
unsigned count = _height - height; unsigned count = height() - h;
// erase lines from the top. // erase lines from the top.
_screen.erase(_screen.begin(), _screen.begin() + count); _screen.erase(_screen.begin(), _screen.begin() + count);
} }
@ -511,17 +501,16 @@ void Screen::setSize(unsigned width, unsigned height)
ScreenIterator iter; ScreenIterator iter;
for (iter = _screen.begin(); iter != _screen.end(); ++iter) for (iter = _screen.begin(); iter != _screen.end(); ++iter)
{ {
iter->resize(width); iter->resize(w);
} }
} }
_height = height; _port.frame.size = iSize(w, h);
_width = width;
if (_cursor.y >= height) _cursor.y = height - 1; if (_cursor.y >= h) _cursor.y = h - 1;
if (_cursor.x >= width) _cursor.x = width - 1; if (_cursor.x >= w) _cursor.x = w - 1;
//fprintf(stderr, "setSize(%u, %u)\n", width, height); //fprintf(stderr, "setSize(%u, %u)\n", width, height);

View File

@ -28,27 +28,26 @@ typedef struct CharInfo {
} CharInfo; } CharInfo;
typedef struct ViewPort { typedef struct TextPort {
enum RightMargin {
RMTruncate,
RMWrap,
RMOverwrite
};
iRect frame; iRect frame;
union flags
{
unsigned wrap:1;
unsigned advance:1;
unsigned lineFeed:1;
unsigned scroll:1;
flags() RightMargin rightMargin;
{
wrap = 0; bool advanceCursor;
advance = 0; //bool lineFeed;
lineFeed = 0; bool scroll;
scroll = 0;
}
} flags;
}; };
class Screen { class Screen {
@ -128,11 +127,15 @@ public:
void lineFeed(); void lineFeed();
void lineFeed(TextPort *textPort);
void reverseLineFeed(); void reverseLineFeed();
void reverseLineFeed(TextPort *textPort);
void addLine(unsigned line);
void removeLine(unsigned line); void deleteLine(unsigned line);
void insertLine(unsigned line);
void beginUpdate(); void beginUpdate();
@ -150,8 +153,8 @@ private:
iPoint _cursor; iPoint _cursor;
unsigned _height; TextPort _port;
unsigned _width;
uint8_t _flag; uint8_t _flag;
@ -195,12 +198,12 @@ inline uint8_t Screen::flag() const
inline unsigned Screen::height() const inline unsigned Screen::height() const
{ {
return _height; return _port.frame.size.height;
} }
inline unsigned Screen::width() const inline unsigned Screen::width() const
{ {
return _width; return _port.frame.size.width;
} }
inline void Screen::setCursor(iPoint point, bool clampX, bool clampY) inline void Screen::setCursor(iPoint point, bool clampX, bool clampY)
@ -230,7 +233,7 @@ inline void Screen::unlock()
inline CharInfo Screen::getc(int x, int y) const inline CharInfo Screen::getc(int x, int y) const
{ {
if (x < 0 || y < 0) return CharInfo(0,0); if (x < 0 || y < 0) return CharInfo(0,0);
if (x >= _width || y >= _height) return CharInfo(0,0); if (x >= width() || y >= height()) return CharInfo(0,0);
return _screen[y][x]; return _screen[y][x];
} }