void CGradientStatic::CreateGradient(CDC *pDC, CRect *pRect) { m_Mem.cx = pRect->Width(); m_Mem.cy = pRect->Height(); if(m_Mem.dc.GetSafeHdc()) { if(m_Mem.bmp.GetSafeHandle() && m_Mem.pold) m_Mem.dc.SelectObject(m_Mem.pold); m_Mem.dc.DeleteDC(); } m_Mem.dc.CreateCompatibleDC(pDC); if(m_Mem.bmp.GetSafeHandle()) m_Mem.bmp.DeleteObject(); m_Mem.bmp.CreateCompatibleBitmap(pDC, m_Mem.cx, m_Mem.cy); m_Mem.pold = m_Mem.dc.SelectObject(&m_Mem.bmp); //----------------------------------------------------------------- if(m_bHorizontal) { DrawHorizontalGradient(); DrawHorizontalText(pRect); } else { DrawVerticalGradient(); DrawVerticalText(pRect); } }
void CrossSectionRenderer::Paint(Canvas &canvas, const PixelRect rc) const { DrawVerticalGradient(canvas, rc, look.sky_color, look.background_color, look.background_color); canvas.SetTextColor(look.text_color); canvas.Select(*look.grid_font); ChartRenderer chart(chart_look, canvas, rc); if (!vec.IsValid() || !start.IsValid()) { chart.DrawNoData(); return; } const fixed nav_altitude = gps_info.NavAltitudeAvailable() ? gps_info.nav_altitude : fixed(0); fixed hmin = std::max(fixed(0), nav_altitude - fixed(3300)); fixed hmax = std::max(fixed(3300), nav_altitude + fixed(1000)); chart.ResetScale(); chart.ScaleXFromValue(fixed(0)); chart.ScaleXFromValue(vec.distance); chart.ScaleYFromValue(hmin); chart.ScaleYFromValue(hmax); short elevations[NUM_SLICES]; UpdateTerrain(elevations); if (airspace_database != nullptr) { const AircraftState aircraft = ToAircraftState(Basic(), Calculated()); airspace_renderer.Draw(canvas, chart, *airspace_database, start, vec, aircraft); } terrain_renderer.Draw(canvas, chart, elevations); PaintGlide(chart); PaintAircraft(canvas, chart, rc); PaintGrid(canvas, chart); }
void RenderVarioHistogram(Canvas &canvas, const PixelRect rc, const ChartLook &chart_look, const FlightStatistics &fs, const GlidePolar &glide_polar) { ChartRenderer chart(chart_look, canvas, rc); const auto acc = std::max(fs.vario_cruise_histogram.GetAccumulator(), fs.vario_circling_histogram.GetAccumulator()); if (!acc) { chart.DrawNoData(); return; } const auto scale = std::max(fs.vario_cruise_histogram.GetMaxY(), fs.vario_circling_histogram.GetMaxY()) * 1.2; chart.ScaleXFromValue(0); chart.ScaleXFromValue(scale); const auto s = -glide_polar.GetSBestLD(); const auto mc = glide_polar.GetMC(); chart.ScaleYFromValue(fs.vario_cruise_histogram.GetMinX()); chart.ScaleYFromValue(fs.vario_cruise_histogram.GetMaxX()); chart.ScaleYFromValue(s); chart.ScaleYFromValue(mc); // draw red area at higher than cruise sink rate, blue area above mc { PixelRect rc_upper = chart.GetChartRect(); rc_upper.bottom = chart.ScreenY(mc); DrawVerticalGradient(canvas, rc_upper, chart_look.color_positive, COLOR_WHITE, COLOR_WHITE); } { PixelRect rc_lower = chart.GetChartRect(); rc_lower.top = chart.ScreenY(s); DrawVerticalGradient(canvas, rc_lower, COLOR_WHITE, chart_look.color_negative, COLOR_WHITE); } canvas.SelectNullPen(); canvas.Select(chart_look.black_brush); chart.DrawFilledLineGraph(fs.vario_circling_histogram, true); canvas.Select(chart_look.blank_brush); chart.DrawFilledLineGraph(fs.vario_cruise_histogram, true); // draw these after shaded regions, so they overlay chart.DrawLineGraph(fs.vario_cruise_histogram, ChartLook::STYLE_GREEN, true); chart.DrawLineGraph(fs.vario_circling_histogram, ChartLook::STYLE_RED, true); // draw current MC setting chart.DrawLine(0, mc, scale, mc, ChartLook::STYLE_REDTHICKDASH); chart.DrawLine(0, s, scale, s, ChartLook::STYLE_BLUETHINDASH); // draw labels and other overlays chart.DrawYGrid(Units::ToSysVSpeed(1), 1, ChartRenderer::UnitFormat::NUMERIC); const double tref = chart.GetXMin()*0.1+chart.GetXMax()*0.9; chart.DrawLabel(_T("MC"), tref, mc); chart.DrawLabel(_T("S cruise"), tref, s); chart.DrawYLabel(_T("w"), Units::GetVerticalSpeedName()); }
void RenderBarograph(Canvas &canvas, const PixelRect rc, const ChartLook &chart_look, const CrossSectionLook &cross_section_look, const FlightStatistics &fs, const NMEAInfo &nmea_info, const DerivedInfo &derived_info, const ProtectedTaskManager *_task) { ChartRenderer chart(chart_look, canvas, rc); if (!fs.altitude.HasResult()) { chart.DrawNoData(); return; } DrawVerticalGradient(canvas, chart.GetChartRect(), cross_section_look.sky_color, cross_section_look.background_color, cross_section_look.background_color); chart.ScaleXFromData(fs.altitude); chart.ScaleYFromData(fs.altitude); chart.ScaleYFromValue(0); chart.ScaleXFromValue(fs.altitude.GetMinX()); if (derived_info.flight.flying) chart.ScaleXFromValue(derived_info.flight.flight_time/3600); if (!fs.altitude_ceiling.IsEmpty()) { chart.ScaleYFromValue(fs.altitude_ceiling.GetMaxY()); } if (_task != nullptr) { ProtectedTaskManager::Lease task(*_task); RenderTaskLegs(chart, task, nmea_info, derived_info, 0.33); } canvas.SelectNullPen(); canvas.Select(cross_section_look.terrain_brush); chart.DrawFilledLineGraph(fs.altitude_terrain); canvas.SelectWhitePen(); canvas.SelectWhiteBrush(); chart.DrawXGrid(0.25, 0.25, ChartRenderer::UnitFormat::TIME); chart.DrawYGrid(Units::ToSysAltitude(1000), 1000, ChartRenderer::UnitFormat::NUMERIC); if (fs.altitude_base.HasResult()) { chart.DrawLineGraph(fs.altitude_base, ChartLook::STYLE_REDTHICKDASH); } else if (!fs.altitude_base.IsEmpty()) { chart.DrawTrend(fs.altitude_base, ChartLook::STYLE_REDTHICKDASH); } if (fs.altitude_ceiling.HasResult()) { chart.DrawLineGraph(fs.altitude_ceiling, ChartLook::STYLE_BLUETHINDASH); } else if (!fs.altitude_ceiling.IsEmpty()) { chart.DrawTrend(fs.altitude_ceiling, ChartLook::STYLE_BLUETHINDASH); } chart.DrawLineGraph(fs.altitude, ChartLook::STYLE_BLACK); chart.DrawXLabel(_T("t"), _T("hr")); chart.DrawYLabel(_T("h"), Units::GetAltitudeName()); }