inline void AirspaceRenderer::DrawFillCached(Canvas &canvas, Canvas &stencil_canvas, const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspaceWarningCopy &awc, const AirspacePredicate &visible) { if (awc.GetSerial() != last_warning_serial || !fill_cache.Check(projection)) { last_warning_serial = awc.GetSerial(); Canvas &buffer_canvas = fill_cache.Begin(canvas, projection); if (DrawFill(buffer_canvas, stencil_canvas, projection, settings, awc, visible)) fill_cache.Commit(canvas, projection); else fill_cache.CommitEmpty(); } #ifdef HAVE_ALPHA_BLEND #ifdef HAVE_HATCHED_BRUSH if (settings.transparency && AlphaBlendAvailable()) #endif fill_cache.AlphaBlendTo(canvas, projection, 60); #ifdef HAVE_HATCHED_BRUSH else #endif #endif #ifdef HAVE_HATCHED_BRUSH fill_cache.CopyAndTo(canvas, projection); #endif }
void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &stencil_canvas, #endif const WindowProjection &projection, const MoreData &basic, const DerivedInfo &calculated, const AirspaceComputerSettings &computer_settings, const AirspaceRendererSettings &settings) { if (airspaces == NULL) return; AirspaceWarningCopy awc; if (warning_manager != NULL) awc.Visit(*warning_manager); const AircraftState aircraft = ToAircraftState(basic, calculated); const AirspaceMapVisible visible(computer_settings, settings, aircraft, awc); Draw(canvas, #ifndef ENABLE_OPENGL stencil_canvas, #endif projection, settings, awc, visible); }
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(); }
void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &stencil_canvas, #endif const WindowProjection &projection, const AirspaceRendererSettings &settings) { if (airspaces == NULL) return; AirspaceWarningCopy awc; if (warning_manager != NULL) awc.Visit(*warning_manager); Draw(canvas, #ifndef ENABLE_OPENGL stencil_canvas, #endif projection, settings, awc, AirspacePredicateTrue()); }
void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &buffer_canvas, Canvas &stencil_canvas, #endif const WindowProjection &projection, const AirspaceRendererSettings &settings) { if (airspace_database == NULL) return; AirspaceWarningCopy awc; if (airspace_warnings != NULL) awc.Visit(*airspace_warnings); Draw(canvas, #ifndef ENABLE_OPENGL buffer_canvas, stencil_canvas, #endif projection, settings, awc, AirspacePredicateTrue()); }
void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &stencil_canvas, #endif const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspaceWarningCopy &awc, const AirspacePredicate &visible) { if (airspaces == nullptr || airspaces->IsEmpty()) return; DrawInternal(canvas, #ifndef ENABLE_OPENGL stencil_canvas, #endif projection, settings, awc, visible); intersections = awc.GetLocations(); }
void AirspaceRenderer::Draw(Canvas &canvas, #ifndef ENABLE_OPENGL Canvas &stencil_canvas, #endif const WindowProjection &projection, const AirspaceRendererSettings &settings, const AirspaceWarningCopy &awc, const AirspacePredicate &visible) { if (airspaces == NULL || airspaces->IsEmpty()) return; #ifdef ENABLE_OPENGL if (settings.fill_mode == AirspaceRendererSettings::FillMode::ALL || settings.fill_mode == AirspaceRendererSettings::FillMode::NONE) { AirspaceFillRenderer renderer(canvas, projection, look, awc, settings); airspaces->VisitWithinRange(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), renderer, visible); } else { AirspaceVisitorRenderer renderer(canvas, projection, look, awc, settings); airspaces->VisitWithinRange(projection.GetGeoScreenCenter(), projection.GetScreenDistanceMeters(), renderer, visible); } #else if (settings.fill_mode != AirspaceRendererSettings::FillMode::NONE) DrawFillCached(canvas, stencil_canvas, projection, settings, awc, visible); DrawOutline(canvas, projection, settings, visible); #endif intersections = awc.GetLocations(); }