/** * Renders the AbstractAirspace on the canvas * @param as AbstractAirspace to render */ void Render(const AbstractAirspace& as) { int type = as.GetType(); if (type <= 0) return; // No intersections for this airspace if (m_intersections.empty()) return; // Select pens and brushes #ifndef USE_GDI Color color = airspace_look.colors[settings.colours[type]]; #ifdef ENABLE_OPENGL color = color.WithAlpha(48); #endif Brush brush(color); #else const Brush &brush = airspace_look.brushes[settings.brushes[type]]; canvas.SetTextColor(LightColor(airspace_look.colors[settings.colours[type]])); #endif PixelRect rcd; // Calculate top and bottom coordinate rcd.top = chart.screenY(as.GetTopAltitude(state)); if (as.IsBaseTerrain()) rcd.bottom = chart.screenY(fixed_zero); else rcd.bottom = chart.screenY(as.GetBaseAltitude(state)); // Iterate through the intersections for (auto it = m_intersections.begin(); it != m_intersections.end(); ++it) { const GeoPoint p_start = it->first; const GeoPoint p_end = it->second; const fixed distance_start = start.Distance(p_start); const fixed distance_end = start.Distance(p_end); // Determine left and right coordinate rcd.left = chart.screenX(distance_start); rcd.right = chart.screenX(distance_end); // only one edge found, next edge must be beyond screen if ((rcd.left == rcd.right) && (p_start == p_end)) { rcd.right = chart.screenX(chart.getXmax()); } // Draw the airspace RenderBox(rcd, brush, settings.black_outline, type); } }
inline void AirspaceIntersectionVisitorSlice::Render(const AbstractAirspace &as) const { AirspaceClass type = as.GetType(); // No intersections for this airspace if (intersections.empty()) return; PixelRect rcd; // Calculate top and bottom coordinate rcd.top = chart.ScreenY(as.GetTopAltitude(state)); if (as.IsBaseTerrain()) rcd.bottom = chart.ScreenY(fixed(0)); else rcd.bottom = chart.ScreenY(as.GetBaseAltitude(state)); int min_x = 1024, max_x = 0; // Iterate through the intersections for (const auto &i : intersections) { const GeoPoint &p_start = i.first; const GeoPoint &p_end = i.second; rcd.left = chart.ScreenX(start.Distance(p_start)); // only one edge found, next edge must be beyond screen if (p_start == p_end) rcd.right = chart.ScreenX(chart.GetXMax()); else rcd.right = chart.ScreenX(start.Distance(p_end)); if (rcd.left < min_x) min_x = rcd.left; if (rcd.right > max_x) max_x = rcd.right; // Draw the airspace RenderBox(rcd, type); } min_x += Layout::GetTextPadding(); max_x -= Layout::GetTextPadding(); /* draw the airspace name */ const TCHAR *name = as.GetName(); if (name != nullptr && !StringIsEmpty(name) && min_x < max_x) { canvas.SetBackgroundTransparent(); canvas.SetTextColor(COLOR_BLACK); const unsigned max_width = max_x - min_x; const PixelSize name_size = canvas.CalcTextSize(name); const int x = unsigned(name_size.cx) >= max_width ? min_x : (min_x + max_x - name_size.cx) / 2; const int y = (rcd.top + rcd.bottom - name_size.cy) / 2; canvas.DrawClippedText(x, y, max_x - x, name); } }