void RasterRenderer::GenerateUnshadedImage(unsigned height_scale, const unsigned contour_height_scale) { const short *src = height_matrix.GetData(); const BGRColor *oColorBuf = color_table + 64 * 256; BGRColor *dest = image->GetTopRow(); for (unsigned y = height_matrix.GetHeight(); y > 0; --y) { BGRColor *p = dest; dest = image->GetNextRow(dest); unsigned contour_row_base = ContourInterval(*src, contour_height_scale); unsigned char *contour_this_column_base = contour_column_base; for (unsigned x = height_matrix.GetWidth(); x > 0; --x) { int h = *src++; if (gcc_likely(!RasterBuffer::IsSpecial(h))) { if (h < 0) h = 0; const unsigned contour_interval = ContourInterval(h, contour_height_scale); h = std::min(254, h >> height_scale); if (gcc_unlikely((contour_interval != contour_row_base) || (contour_interval != *contour_this_column_base))) { *p++ = oColorBuf[h-64*256]; *contour_this_column_base = contour_row_base = contour_interval; } else { *p++ = oColorBuf[h]; } } else if (RasterBuffer::IsWater(h)) { // we're in the water, so look up the color for water *p++ = oColorBuf[255]; } else { /* outside the terrain file bounds: white background */ *p++ = BGRColor(0xff, 0xff, 0xff); } contour_this_column_base++; } }
gcc_const static unsigned ContourInterval(const TerrainHeight h, const unsigned contour_height_scale) { if (gcc_unlikely(h.IsSpecial()) || h.GetValue() <= 0) return 0; return ContourInterval(h.GetValue(), contour_height_scale); }