void ChartControl::on_paint(Canvas &canvas) { assert(glide_computer != NULL); const ComputerSettings &settings_computer = blackboard->GetComputerSettings(); const MapSettings &settings_map = blackboard->GetMapSettings(); const MoreData &basic = blackboard->Basic(); const DerivedInfo &calculated = blackboard->Calculated(); #ifdef ENABLE_OPENGL /* enable clipping */ GLCanvasScissor scissor(canvas); #endif canvas.clear(COLOR_WHITE); canvas.SetTextColor(COLOR_BLACK); canvas.Select(Fonts::map); PixelRect rcgfx = get_client_rect(); // background is painted in the base-class const FlightStatisticsRenderer fs(glide_computer->GetFlightStats(), chart_look, look->map); switch (page) { case ANALYSIS_PAGE_BAROGRAPH: fs.RenderBarograph(canvas, rcgfx, basic, calculated, protected_task_manager); break; case ANALYSIS_PAGE_CLIMB: fs.RenderClimb(canvas, rcgfx, settings_computer.glide_polar_task); break; case ANALYSIS_PAGE_THERMAL_BAND: { OrderedTaskBehaviour otb; if (protected_task_manager != NULL) { otb = protected_task_manager->GetOrderedTaskBehaviour(); } ThermalBandRenderer renderer(thermal_band_look, chart_look); renderer.DrawThermalBand(basic, calculated, settings_computer, canvas, rcgfx, settings_computer.task, false, &otb); } break; case ANALYSIS_PAGE_WIND: fs.RenderWind(canvas, rcgfx, basic, glide_computer->GetWindStore()); break; case ANALYSIS_PAGE_POLAR: fs.RenderGlidePolar(canvas, rcgfx, calculated.climb_history, settings_computer, settings_computer.glide_polar_task); break; case ANALYSIS_PAGE_TEMPTRACE: fs.RenderTemperature(canvas, rcgfx, glide_computer->GetCuSonde()); break; case ANALYSIS_PAGE_TASK: if (protected_task_manager != NULL) { const TraceComputer *trace_computer = glide_computer != NULL ? &glide_computer->GetTraceComputer() : NULL; fs.RenderTask(canvas, rcgfx, basic, calculated, settings_computer, settings_map, *protected_task_manager, trace_computer); } break; case ANALYSIS_PAGE_OLC: if (glide_computer != NULL) { fs.RenderOLC(canvas, rcgfx, basic, calculated, settings_computer, settings_map, calculated.contest_stats, glide_computer->GetTraceComputer()); } break; case ANALYSIS_PAGE_TASK_SPEED: if (protected_task_manager != NULL) { ProtectedTaskManager::Lease task(*protected_task_manager); fs.RenderSpeed(canvas, rcgfx, basic, calculated, task); } break; default: // should never get here! break; } }