in win/Qt4/qt4map.cpp [234:452]
bool NetHackQtMapViewport::DrawWalls(
QPainter& painter,
int x, int y, int w, int h,
unsigned ch)
{
enum
{
w_left = 0x01,
w_right = 0x02,
w_up = 0x04,
w_down = 0x08,
w_sq_top = 0x10,
w_sq_bottom = 0x20,
w_sq_left = 0x40,
w_sq_right = 0x80
};
unsigned linewidth;
unsigned walls;
int x1, y1, x2, y2, x3, y3;
linewidth = ((w < h) ? w : h)/8;
if (linewidth == 0) linewidth = 1;
// Single walls
walls = 0;
switch (ch)
{
case 0x2500: // BOX DRAWINGS LIGHT HORIZONTAL
walls = w_left | w_right;
break;
case 0x2502: // BOX DRAWINGS LIGHT VERTICAL
walls = w_up | w_down;
break;
case 0x250C: // BOX DRAWINGS LIGHT DOWN AND RIGHT
walls = w_down | w_right;
break;
case 0x2510: // BOX DRAWINGS LIGHT DOWN AND LEFT
walls = w_down | w_left;
break;
case 0x2514: // BOX DRAWINGS LIGHT UP AND RIGHT
walls = w_up | w_right;
break;
case 0x2518: // BOX DRAWINGS LIGHT UP AND LEFT
walls = w_up | w_left;
break;
case 0x251C: // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
walls = w_up | w_down | w_right;
break;
case 0x2524: // BOX DRAWINGS LIGHT VERTICAL AND LEFT
walls = w_up | w_down | w_left;
break;
case 0x252C: // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
walls = w_down | w_left | w_right;
break;
case 0x2534: // BOX DRAWINGS LIGHT UP AND HORIZONTAL
walls = w_up | w_left | w_right;
break;
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))
{
case w_up:
painter.drawLine(x1, y, x1, y+h/2);
break;
case w_down:
painter.drawLine(x1, y+h/2, x1, y+h-1);
break;
case w_up | w_down:
painter.drawLine(x1, y, x1, y+h-1);
break;
}
y1 = y + h/2;
switch (walls & (w_left | w_right))
{
case w_left:
painter.drawLine(x, y1, x+w/2, y1);
break;
case w_right:
painter.drawLine(x+w/2, y1, x+w-1, y1);
break;
case w_left | w_right:
painter.drawLine(x, y1, x+w-1, y1);
break;
}
return true;
}
// Double walls
walls = 0;
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
walls = w_up | w_down | w_sq_left | w_sq_right;
break;
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
walls = w_down | w_left | w_sq_top | w_sq_right;
break;
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
walls = w_up | w_left | w_sq_bottom | w_sq_right;
break;
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
walls = w_up | w_down | w_left | w_sq_right;
break;
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
walls = w_up | w_left | w_right | w_sq_bottom;
break;
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;
x3 = x + w - 1;
y1 = y + h/2 - linewidth;
y2 = y + h/2 + linewidth;
y3 = y + h - 1;
if (walls & w_up)
{
painter.drawLine(x1, y, x1, y1);
painter.drawLine(x2, y, x2, y1);
}
if (walls & w_down)
{
painter.drawLine(x1, y2, x1, y3);
painter.drawLine(x2, y2, x2, y3);
}
if (walls & w_left)
{
painter.drawLine(x, y1, x1, y1);
painter.drawLine(x, y2, x1, y2);
}
if (walls & w_right)
{
painter.drawLine(x2, y1, x3, y1);
painter.drawLine(x2, y2, x3, y2);
}
if (walls & w_sq_top)
{
painter.drawLine(x1, y1, x2, y1);
}
if (walls & w_sq_bottom)
{
painter.drawLine(x1, y2, x2, y2);
}
if (walls & w_sq_left)
{
painter.drawLine(x1, y1, x1, y2);
}
if (walls & w_sq_right)
{
painter.drawLine(x2, y1, x2, y2);
}
return true;
}
// Solid blocks
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);
painter.fillRect(x, y, w, h, rgb2);
return true;
}
return false;
}