bool NetHackQtMapViewport::DrawWalls()

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;
}