void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &buffer_canvas, Canvas &stencil_canvas, #endif const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspaceWarningCopy &awc, const AirspacePredicate &visible) { if (airspace_database == NULL) return; #ifdef ENABLE_OPENGL if (settings.fill_mode == AirspaceRendererSettings::AS_FILL_ALL) { AirspaceFillRenderer renderer(canvas, projection, airspace_look, awc, settings); airspace_database->visit_within_range(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), renderer, visible); } else { AirspaceVisitorRenderer renderer(canvas, projection, airspace_look, awc, settings); airspace_database->visit_within_range(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), renderer, visible); } #else MapDrawHelper helper(canvas, buffer_canvas, stencil_canvas, projection, settings); AirspaceVisitorMap v(helper, awc, settings, airspace_look); // JMW TODO wasteful to draw twice, can't it be drawn once? // we are using two draws so borders go on top of everything airspace_database->visit_within_range(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), v, visible); awc.visit_warned(v); awc.visit_inside(v); v.draw_intercepts(); AirspaceOutlineRenderer outline_renderer(canvas, projection, airspace_look, settings.black_outline); airspace_database->visit_within_range(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), outline_renderer, visible); awc.visit_warned(outline_renderer); awc.visit_inside(outline_renderer); #endif m_airspace_intersections = awc.get_locations(); }
inline void AirspaceRenderer::DrawOutline(Canvas &canvas, const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspacePredicate &visible) const { AirspaceOutlineRenderer outline_renderer(canvas, projection, look, settings); airspaces->VisitWithinRange(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), outline_renderer, visible); }
inline void AirspaceRenderer::DrawOutline(Canvas &canvas, const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspacePredicate &visible) const { const auto range = airspaces->QueryWithinRange(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters()); AirspaceOutlineRenderer outline_renderer(canvas, projection, look, settings); for (const auto &i : range) { const AbstractAirspace &airspace = i.GetAirspace(); if (visible(airspace)) outline_renderer.Visit(airspace); } }