From: PatR Date: Mon, 28 Dec 2020 18:01:43 +0000 (-0800) Subject: Qt map's "ttychar" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=524f9dd82bdc1b9fdf8768d45442e6af0972a796;p=nethack Qt map's "ttychar" Change the glyphttychar[ROWNO][COLNO] array from uchar to unsighed short. DrawWalls() has handling for values in over 2000. This also reformats pretty much all of the NetHackQtMapViewport portion of qt_map.cpp. --- diff --git a/win/Qt/qt_map.cpp b/win/Qt/qt_map.cpp index 34a55eb1f..01047e83a 100644 --- a/win/Qt/qt_map.cpp +++ b/win/Qt/qt_map.cpp @@ -126,11 +126,11 @@ NetHackQtMapViewport::NetHackQtMapViewport(NetHackQtClickBuffer& click_sink) : NetHackQtMapViewport::~NetHackQtMapViewport(void) { - delete rogue_font; + delete rogue_font; //rogue_font = NULL; } // pick a font to use for text map; rogue level is always displayed as text -void NetHackQtMapViewport::SetRogueFont(QPainter &painter) +void NetHackQtMapViewport::SetupTextmapFont(QPainter &painter) { QString fontfamily = iflags.wc_font_map ? iflags.wc_font_map : "Monospace"; @@ -167,7 +167,6 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) std::min(ROWNO - 1, area.bottom() / gH)); QPainter painter; - painter.begin(this); if (Is_rogue_level(&u.uz) || iflags.wc_ascii_map) { @@ -177,11 +176,11 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) painter.fillRect( event->rect(), Qt::black ); if (!rogue_font) - SetRogueFont(painter); + SetupTextmapFont(painter); painter.setFont(*rogue_font); - for (int j=garea.top(); j<=garea.bottom(); j++) { - for (int i=garea.left(); i<=garea.right(); i++) { + for (int j = garea.top(); j <= garea.bottom(); j++) { + for (int i = garea.left(); i <= garea.right(); i++) { #if 0 unsigned short g = Glyph(i, j); int colortmp; @@ -189,10 +188,11 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) unsigned special; /* map glyph to character and color */ mapglyph(g, &chtmp, &colortmp, &special, i, j, 0); - uchar ch = (uchar) chtmp, color = (uchar) colortmp; + unsigned short ch = (unsigned short) chtmp, + color = (unsigned short) colortmp; #else - uchar color = Glyphcolor(i, j); - uchar ch = Glyphttychar(i, j); + unsigned short color = Glyphcolor(i, j); + unsigned short ch = Glyphttychar(i, j); unsigned special = Glyphflags(i, j); #endif ch = cp437(ch); @@ -220,9 +220,9 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) painter.setFont(font()); } else { // tiles - for (int j=garea.top(); j<=garea.bottom(); j++) { - for (int i=garea.left(); i<=garea.right(); i++) { - unsigned short g=Glyph(i,j); + for (int j = garea.top(); j <= garea.bottom(); j++) { + for (int i = garea.left(); i <= garea.right(); i++) { + unsigned short g = Glyph(i,j); #if 0 int color; int ch; @@ -293,10 +293,8 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) painter.end(); } -bool NetHackQtMapViewport::DrawWalls( - QPainter& painter, - int x, int y, int w, int h, - unsigned ch) +bool NetHackQtMapViewport::DrawWalls(QPainter& painter, int x, int y, + int w, int h, unsigned short ch) { enum wallbits { w_left = 0x01, @@ -312,89 +310,72 @@ bool NetHackQtMapViewport::DrawWalls( unsigned walls; int x1, y1, x2, y2, x3, y3; - linewidth = ((w < h) ? w : h)/8; - if (linewidth == 0) linewidth = 1; + linewidth = ((w < h) ? w : h) / 8; + if (linewidth == 0) + linewidth = 1; // Single walls walls = 0; - switch (ch) - { - case 0x2500: // BOX DRAWINGS LIGHT HORIZONTAL + switch (ch) { + case 0x2500: // box drawings light horizontal walls = w_left | w_right; break; - - case 0x2502: // BOX DRAWINGS LIGHT VERTICAL + case 0x2502: // box drawings light vertical walls = w_up | w_down; break; - - case 0x250C: // BOX DRAWINGS LIGHT DOWN AND RIGHT + case 0x250C: // box drawings light down and right walls = w_down | w_right; break; - - case 0x2510: // BOX DRAWINGS LIGHT DOWN AND LEFT + case 0x2510: // box drawings light down and left walls = w_down | w_left; break; - - case 0x2514: // BOX DRAWINGS LIGHT UP AND RIGHT + case 0x2514: // box drawings light up and right walls = w_up | w_right; break; - - case 0x2518: // BOX DRAWINGS LIGHT UP AND LEFT + case 0x2518: // box drawings light up and left walls = w_up | w_left; break; - - case 0x251C: // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + case 0x251C: // box drawings light vertical and right walls = w_up | w_down | w_right; break; - - case 0x2524: // BOX DRAWINGS LIGHT VERTICAL AND LEFT + case 0x2524: // box drawings light vertical and left walls = w_up | w_down | w_left; break; - - case 0x252C: // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + case 0x252C: // box drawings light down and horizontal walls = w_down | w_left | w_right; break; - - case 0x2534: // BOX DRAWINGS LIGHT UP AND HORIZONTAL + case 0x2534: // box drawings light up and horizontal walls = w_up | w_left | w_right; break; - - case 0x253C: // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + case 0x253C: // box drawings light vertical and horizontal walls = w_up | w_down | w_left | w_right; break; } - if (walls != 0) - { - x1 = x + w/2; - switch (walls & (w_up | w_down)) - { + if (walls != 0) { + x1 = x + w / 2; + switch (walls & (w_up | w_down)) { case w_up: - painter.drawLine(x1, y, x1, y+h/2); + painter.drawLine(x1, y, x1, y + h / 2); break; - case w_down: - painter.drawLine(x1, y+h/2, x1, y+h-1); + painter.drawLine(x1, y + h / 2, x1, y + h - 1); break; - case w_up | w_down: - painter.drawLine(x1, y, x1, y+h-1); + painter.drawLine(x1, y, x1, y + h - 1); break; } - y1 = y + h/2; - switch (walls & (w_left | w_right)) - { + y1 = y + h / 2; + switch (walls & (w_left | w_right)) { case w_left: - painter.drawLine(x, y1, x+w/2, y1); + painter.drawLine(x, y1, x + w / 2, y1); break; - case w_right: - painter.drawLine(x+w/2, y1, x+w-1, y1); + painter.drawLine(x + w / 2, y1, x + w - 1, y1); break; - case w_left | w_right: - painter.drawLine(x, y1, x+w-1, y1); + painter.drawLine(x, y1, x + w - 1, y1); break; } @@ -403,108 +384,88 @@ bool NetHackQtMapViewport::DrawWalls( // Double walls walls = 0; - switch (ch) - { - case 0x2550: // BOX DRAWINGS DOUBLE HORIZONTAL + switch (ch) { + case 0x2550: // box drawings double horizontal walls = w_left | w_right | w_sq_top | w_sq_bottom; break; - - case 0x2551: // BOX DRAWINGS DOUBLE VERTICAL + case 0x2551: // box drawings double vertical walls = w_up | w_down | w_sq_left | w_sq_right; break; - - case 0x2554: // BOX DRAWINGS DOUBLE DOWN AND RIGHT + case 0x2554: // box drawings double down and right walls = w_down | w_right | w_sq_top | w_sq_left; break; - - case 0x2557: // BOX DRAWINGS DOUBLE DOWN AND LEFT + case 0x2557: // box drawings double down and left walls = w_down | w_left | w_sq_top | w_sq_right; break; - - case 0x255A: // BOX DRAWINGS DOUBLE UP AND RIGHT + case 0x255A: // box drawings double up and right walls = w_up | w_right | w_sq_bottom | w_sq_left; break; - - case 0x255D: // BOX DRAWINGS DOUBLE UP AND LEFT + case 0x255D: // box drawings double up and left walls = w_up | w_left | w_sq_bottom | w_sq_right; break; - - case 0x2560: // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + case 0x2560: // box drawings double vertical and right walls = w_up | w_down | w_right | w_sq_left; break; - - case 0x2563: // BOX DRAWINGS DOUBLE VERTICAL AND LEFT + case 0x2563: // box drawings double vertical and left walls = w_up | w_down | w_left | w_sq_right; break; - - case 0x2566: // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + case 0x2566: // box drawings double down and horizontal walls = w_down | w_left | w_right | w_sq_top; break; - - case 0x2569: // BOX DRAWINGS DOUBLE UP AND HORIZONTAL + case 0x2569: // box drawings double up and horizontal walls = w_up | w_left | w_right | w_sq_bottom; break; - - case 0x256C: // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + case 0x256C: // box drawings double vertical and horizontal walls = w_up | w_down | w_left | w_right; break; } - if (walls != 0) - { - x1 = x + w/2 - linewidth; - x2 = x + w/2 + linewidth; + + if (walls != 0) { + x1 = x + w / 2 - linewidth; + x2 = x + w / 2 + linewidth; x3 = x + w - 1; - y1 = y + h/2 - linewidth; - y2 = y + h/2 + linewidth; + y1 = y + h / 2 - linewidth; + y2 = y + h / 2 + linewidth; y3 = y + h - 1; - if (walls & w_up) - { + if (walls & w_up) { painter.drawLine(x1, y, x1, y1); painter.drawLine(x2, y, x2, y1); } - if (walls & w_down) - { + if (walls & w_down) { painter.drawLine(x1, y2, x1, y3); painter.drawLine(x2, y2, x2, y3); } - if (walls & w_left) - { + if (walls & w_left) { painter.drawLine(x, y1, x1, y1); painter.drawLine(x, y2, x1, y2); } - if (walls & w_right) - { + if (walls & w_right) { painter.drawLine(x2, y1, x3, y1); painter.drawLine(x2, y2, x3, y2); } - if (walls & w_sq_top) - { + if (walls & w_sq_top) { painter.drawLine(x1, y1, x2, y1); } - if (walls & w_sq_bottom) - { + if (walls & w_sq_bottom) { painter.drawLine(x1, y2, x2, y2); } - if (walls & w_sq_left) - { + if (walls & w_sq_left) { painter.drawLine(x1, y1, x1, y2); } - if (walls & w_sq_right) - { + if (walls & w_sq_right) { painter.drawLine(x2, y1, x2, y2); } + return true; } // Solid blocks - if (0x2591 <= ch && ch <= 0x2593) - { + if (0x2591 <= ch && ch <= 0x2593) { unsigned shade = ch - 0x2590; QColor rgb(painter.pen().color()); - QColor rgb2( - rgb.red()*shade/4, - rgb.green()*shade/4, - rgb.blue()*shade/4); + QColor rgb2(rgb.red() * shade / 4, + rgb.green() * shade / 4, + rgb.blue() * shade / 4); painter.fillRect(x, y, w, h, rgb2); return true; } @@ -514,26 +475,23 @@ bool NetHackQtMapViewport::DrawWalls( void NetHackQtMapViewport::mousePressEvent(QMouseEvent* event) { - clicksink.Put( - event->pos().x()/qt_settings->glyphs().width(), - event->pos().y()/qt_settings->glyphs().height(), - event->button()==Qt::LeftButton ? CLICK_1 : CLICK_2 - ); + clicksink.Put(event->pos().x() / qt_settings->glyphs().width(), + event->pos().y() / qt_settings->glyphs().height(), + (event->button() == Qt::LeftButton) ? CLICK_1 : CLICK_2); qApp->exit(); } void NetHackQtMapViewport::updateTiles() { change.clear(); - change.add(0,0,COLNO,ROWNO); + change.add(0, 0, COLNO, ROWNO); delete rogue_font; rogue_font = NULL; } QSize NetHackQtMapViewport::sizeHint() const { - return QSize( - qt_settings->glyphs().width() * COLNO, - qt_settings->glyphs().height() * ROWNO); + return QSize(qt_settings->glyphs().width() * COLNO, + qt_settings->glyphs().height() * ROWNO); } QSize NetHackQtMapViewport::minimumSizeHint() const @@ -543,7 +501,7 @@ QSize NetHackQtMapViewport::minimumSizeHint() const void NetHackQtMapViewport::clickCursor() { - clicksink.Put(cursor.x(),cursor.y(),CLICK_1); + clicksink.Put(cursor.x(), cursor.y(), CLICK_1); qApp->exit(); } @@ -557,65 +515,63 @@ void NetHackQtMapViewport::Clear() Glyph(0, j) = GLYPH_NOTHING; Glyphttychar(0, j) = ' '; Glyphcolor(0, j) = NO_COLOR; - Glyphflags(0, j) = 0; + Glyphflags(0, j) = 0U; for (int i = 1; i < COLNO; ++i) { Glyph(i, j) = GLYPH_UNEXPLORED; Glyphttychar(i, j) = ' '; Glyphcolor(i, j) = NO_COLOR; - Glyphflags(i, j) = 0; + Glyphflags(i, j) = 0U; } } change.clear(); - change.add(0,0,COLNO,ROWNO); + change.add(0, 0, COLNO, ROWNO); } void NetHackQtMapViewport::Display(bool block) { - for (int i=0; iglyphs().width(), - ch.y()*qt_settings->glyphs().height(), - ch.width()*qt_settings->glyphs().width(), - ch.height()*qt_settings->glyphs().height() - ); - } + int gW = qt_settings->glyphs().width(), + gH = qt_settings->glyphs().height(); + for (int i = 0; i < change.clusters(); i++) { + const QRect& chg = change[i]; + repaint(chg.x() * gW, chg.y() * gH, + chg.width() * gW, chg.height() * gH); + } change.clear(); if (block) { - yn_function("Press a key when done viewing",0,'\0'); + yn_function("Press a key when done viewing", NULL, '\0'); } } void NetHackQtMapViewport::CursorTo(int x,int y) { - Changed(cursor.x(),cursor.y()); + Changed(cursor.x(), cursor.y()); cursor.setX(x); cursor.setY(y); - Changed(cursor.x(),cursor.y()); + Changed(cursor.x(), cursor.y()); } void NetHackQtMapViewport::PrintGlyph(int x, int y, int theglyph, unsigned *glyphmod) { - Glyph(x, y) = theglyph; - Glyphttychar(x, y) = (uchar) glyphmod[GM_TTYCHAR]; - Glyphcolor(x, y) = (uchar) glyphmod[GM_COLOR]; + Glyph(x, y) = (unsigned short) theglyph; + Glyphttychar(x, y) = (unsigned short) glyphmod[GM_TTYCHAR]; + Glyphcolor(x, y) = (unsigned short) glyphmod[GM_COLOR]; Glyphflags(x, y) = glyphmod[GM_FLAGS]; Changed(x, y); } void NetHackQtMapViewport::Changed(int x, int y) { - change.add(x,y); + change.add(x, y); } NetHackQtMapWindow2::NetHackQtMapWindow2(NetHackQtClickBuffer& click_sink) : - QScrollArea(NULL), - m_viewport(new NetHackQtMapViewport(click_sink)) + QScrollArea(NULL), + m_viewport(new NetHackQtMapViewport(click_sink)) { QPalette palette; palette.setColor(backgroundRole(), Qt::black); @@ -623,22 +579,22 @@ NetHackQtMapWindow2::NetHackQtMapWindow2(NetHackQtClickBuffer& click_sink) : setWidget(m_viewport); - connect(qt_settings,SIGNAL(tilesChanged()),this,SLOT(updateTiles())); + connect(qt_settings, SIGNAL(tilesChanged()), this, SLOT(updateTiles())); updateTiles(); } void NetHackQtMapWindow2::updateTiles() { NetHackQtGlyphs& glyphs = qt_settings->glyphs(); - int gw = glyphs.width(); - int gh = glyphs.height(); + int gW = glyphs.width(); + int gH = glyphs.height(); // Be exactly the size we want to be - full map... - m_viewport->resize(COLNO*gw,ROWNO*gh); + m_viewport->resize(COLNO * gW, ROWNO * gH); - verticalScrollBar()->setSingleStep(gh); - verticalScrollBar()->setPageStep(gh); - horizontalScrollBar()->setSingleStep(gw); - horizontalScrollBar()->setPageStep(gw); + verticalScrollBar()->setSingleStep(gH); + verticalScrollBar()->setPageStep(gH); + horizontalScrollBar()->setSingleStep(gW); + horizontalScrollBar()->setPageStep(gW); m_viewport->updateTiles(); Display(false); diff --git a/win/Qt/qt_map.h b/win/Qt/qt_map.h index 0c6937bae..82050dc98 100644 --- a/win/Qt/qt_map.h +++ b/win/Qt/qt_map.h @@ -23,26 +23,34 @@ public: protected: virtual void paintEvent(QPaintEvent* event); bool DrawWalls(QPainter& painter, int x, int y, - int w, int h, unsigned ch); + int w, int h, unsigned short ch); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void mousePressEvent(QMouseEvent* event); private: - QFont *rogue_font; - unsigned short glyph[ROWNO][COLNO]; - unsigned short& Glyph(int x, int y) { return glyph[y][x]; } - uchar glyphttychar[ROWNO][COLNO]; - uchar& Glyphttychar(int x, int y) { return glyphttychar[y][x]; } - uchar glyphcolor[ROWNO][COLNO]; - uchar& Glyphcolor(int x, int y) { return glyphcolor[y][x]; } - unsigned int glyphflags[ROWNO][COLNO]; - unsigned int& Glyphflags(int x, int y) { return glyphflags[y][x]; } - QPoint cursor; - QPixmap pet_annotation; + QFont *rogue_font; + unsigned short glyph[ROWNO][COLNO]; + unsigned short &Glyph(int x, int y) { + return glyph[y][x]; + } + unsigned short glyphttychar[ROWNO][COLNO]; + unsigned short &Glyphttychar(int x, int y) { + return glyphttychar[y][x]; + } + unsigned short glyphcolor[ROWNO][COLNO]; + unsigned short &Glyphcolor(int x, int y) { + return glyphcolor[y][x]; + } + unsigned int glyphflags[ROWNO][COLNO]; + unsigned int &Glyphflags(int x, int y) { + return glyphflags[y][x]; + } + QPoint cursor; + QPixmap pet_annotation; QPixmap pile_annotation; - NetHackQtClickBuffer& clicksink; - Clusterizer change; + NetHackQtClickBuffer &clicksink; + Clusterizer change; void clickCursor(); void Clear(); @@ -51,7 +59,7 @@ private: void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod); void Changed(int x, int y); void updateTiles(); - void SetRogueFont(QPainter &painter); + void SetupTextmapFont(QPainter &painter); // NetHackQtMapWindow2 passes through many calls to the viewport friend class NetHackQtMapWindow2;