void VisitCircle(const AirspaceCircle &airspace) { RasterPoint screen_center = projection.GeoToScreen(airspace.GetCenter()); unsigned screen_radius = projection.GeoToScreenDistance(airspace.GetRadius()); GLEnable stencil(GL_STENCIL_TEST); if (!warning_manager.IsAcked(airspace) && settings.classes[airspace.GetType()].fill_mode != AirspaceClassRendererSettings::FillMode::NONE) { GLEnable blend(GL_BLEND); SetupInterior(airspace); if (warning_manager.HasWarning(airspace) || warning_manager.IsInside(airspace) || look.thick_pen.GetWidth() >= 2 * screen_radius || settings.classes[airspace.GetType()].fill_mode == AirspaceClassRendererSettings::FillMode::ALL) { // fill whole circle canvas.DrawCircle(screen_center.x, screen_center.y, screen_radius); } else { // draw a ring inside the circle Color color = settings.classes[airspace.GetType()].fill_color; Pen pen_donut(look.thick_pen.GetWidth() / 2, color.WithAlpha(90)); canvas.SelectHollowBrush(); canvas.Select(pen_donut); canvas.DrawCircle(screen_center.x, screen_center.y, screen_radius - look.thick_pen.GetWidth() / 4); } } // draw outline if (SetupOutline(airspace)) canvas.DrawCircle(screen_center.x, screen_center.y, screen_radius); }
void VisitCircle(const AirspaceCircle &airspace) { RasterPoint screen_center = projection.GeoToScreen(airspace.GetCenter()); unsigned screen_radius = projection.GeoToScreenDistance(airspace.GetRadius()); if (!warning_manager.IsAcked(airspace) && SetupInterior(airspace)) { GLEnable blend(GL_BLEND); canvas.DrawCircle(screen_center.x, screen_center.y, screen_radius); } // draw outline if (SetupOutline(airspace)) canvas.DrawCircle(screen_center.x, screen_center.y, screen_radius); }
void VisitPolygon(const AirspacePolygon &airspace) { if (!PreparePolygon(airspace.GetPoints())) return; if (!warning_manager.IsAcked(airspace) && SetupInterior(airspace)) { // fill interior without overpainting any previous outlines GLEnable blend(GL_BLEND); DrawPrepared(); } // draw outline if (SetupOutline(airspace)) DrawPrepared(); }
void VisitPolygon(const AirspacePolygon &airspace) { if (!PreparePolygon(airspace.GetPoints())) return; const AirspaceClassRendererSettings &class_settings = settings.classes[airspace.GetType()]; bool fill_airspace = warning_manager.HasWarning(airspace) || warning_manager.IsInside(airspace) || class_settings.fill_mode == AirspaceClassRendererSettings::FillMode::ALL; if (!warning_manager.IsAcked(airspace) && class_settings.fill_mode != AirspaceClassRendererSettings::FillMode::NONE) { GLEnable stencil(GL_STENCIL_TEST); if (!fill_airspace) { // set stencil for filling (bit 0) SetFillStencil(); DrawPrepared(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } // fill interior without overpainting any previous outlines { SetupInterior(airspace, !fill_airspace); GLEnable blend(GL_BLEND); DrawPrepared(); } if (!fill_airspace) { // clear fill stencil (bit 0) ClearFillStencil(); DrawPrepared(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } // draw outline if (SetupOutline(airspace)) DrawPrepared(); }