void GaugeVario::RenderVarioLine(Canvas &canvas, int i, int sink, bool clear) { dirty = true; if (i == sink) return; canvas.Select(clear ? look.thick_background_pen : (i > sink ? look.thick_lift_pen : look.thick_sink_pen)); if (i > sink) canvas.DrawPolyline(lines + gmax + sink, i - sink); else canvas.DrawPolyline(lines + gmax + i, sink - i); if (!clear) { canvas.SelectNullPen(); // clear up naked (sink) edge of polygon, this gives it a nice // taper look if (look.inverse) { canvas.SelectBlackBrush(); } else { canvas.SelectWhiteBrush(); } canvas.DrawTriangleFan(getPolygon(sink), 3); } }
void InfoBoxWindow::PaintTitle(Canvas &canvas) { if (data.title.empty()) return; if (!pressed && !HasFocus() && !dragging && !force_draw_selector && settings.border_style == InfoBoxSettings::BorderStyle::SHADED) canvas.DrawFilledRectangle(title_rect, look.caption_background_color); canvas.SetTextColor(look.GetTitleColor(data.title_color)); const Font &font = look.title_font; canvas.Select(font); PixelSize tsize = canvas.CalcTextSize(data.title); PixelScalar halftextwidth = (title_rect.left + title_rect.right - tsize.cx) / 2; PixelScalar x = std::max(PixelScalar(1), PixelScalar(title_rect.left + halftextwidth)); PixelScalar y = title_rect.top; canvas.TextAutoClipped(x, y, data.title); if (settings.border_style == InfoBoxSettings::BorderStyle::TAB && halftextwidth > Layout::Scale(3)) { PixelScalar ytop = title_rect.top + font.GetCapitalHeight() / 2; PixelScalar ytopedge = ytop + Layout::GetTextPadding(); PixelScalar ybottom = title_rect.top + Layout::Scale(6) + font.GetCapitalHeight(); canvas.Select(look.border_pen); RasterPoint tab[8]; tab[0].x = tab[1].x = title_rect.left; tab[0].y = tab[7].y = ybottom; tab[2].x = title_rect.left + Layout::GetTextPadding(); tab[2].y = tab[5].y = tab[3].y = tab[4].y = ytop; tab[1].y = tab[6].y = ytopedge; tab[5].x = title_rect.right - Layout::GetTextPadding(); tab[6].x = tab[7].x = title_rect.right; tab[3].x = title_rect.left + halftextwidth - Layout::Scale(1); tab[4].x = title_rect.right - halftextwidth + Layout::Scale(1); canvas.DrawPolyline(tab, 4); canvas.DrawPolyline(tab + 4, 4); } }
void TrailRenderer::DrawPreparedPolyline(Canvas &canvas, unsigned n) { assert(points.size() >= n); canvas.DrawPolyline(points.begin(), n); }
void InfoBoxWindow::PaintTitle(Canvas &canvas) { if (data.title.empty()) return; canvas.SetTextColor(look.GetTitleColor(data.title_color)); const Font &font = *look.title.font; canvas.Select(font); PixelSize tsize = canvas.CalcTextSize(data.title); PixelScalar halftextwidth = (title_rect.left + title_rect.right - tsize.cx) / 2; PixelScalar x = max(PixelScalar(1), PixelScalar(title_rect.left + halftextwidth)); PixelScalar y = title_rect.top + 1 + font.GetCapitalHeight() - font.GetAscentHeight(); canvas.TextAutoClipped(x, y, data.title); if (settings.border_style == apIbTab && halftextwidth > Layout::Scale(3)) { PixelScalar ytop = title_rect.top + font.GetCapitalHeight() / 2; PixelScalar ytopedge = ytop + Layout::Scale(2); PixelScalar ybottom = title_rect.top + Layout::Scale(6) + font.GetCapitalHeight(); canvas.Select(look.border_pen); RasterPoint tab[8]; tab[0].x = tab[1].x = title_rect.left; tab[0].y = tab[7].y = ybottom; tab[2].x = title_rect.left + Layout::Scale(2); tab[2].y = tab[5].y = tab[3].y = tab[4].y = ytop; tab[1].y = tab[6].y = ytopedge; tab[5].x = title_rect.right - Layout::Scale(2); tab[6].x = tab[7].x = title_rect.right; tab[3].x = title_rect.left + halftextwidth - Layout::Scale(1); tab[4].x = title_rect.right - halftextwidth + Layout::Scale(1); canvas.DrawPolyline(tab, 4); canvas.DrawPolyline(tab + 4, 4); } }
void FinishPolyline(Canvas &canvas) { if (mode != OUTLINE) { canvas.Select(*pen); mode = OUTLINE; } canvas.DrawPolyline(points.begin(), num_points); num_points = 0; }
static void DrawPolyline(Canvas &canvas, PixelOperations operations, const Pen &pen, const BulkPixelPoint *lppt, unsigned n_points, bool loop) { const unsigned thickness = pen.GetWidth(); const unsigned mask = pen.GetMask(); const auto color = canvas.Import(pen.GetColor()); canvas.DrawPolyline(lppt, n_points, loop, color, thickness, mask); }
void TrailRenderer::Draw(Canvas &canvas, const WindowProjection &projection, const ContestTraceVector &trace) { points.GrowDiscard(trace.size()); unsigned n = 0; for (auto i = trace.begin(), end = trace.end(); i != end; ++i) points[n++] = projection.GeoToScreen(i->get_location()); canvas.DrawPolyline(points.begin(), n); }
static void DrawPolyline(Canvas &canvas, PixelOperations operations, const Pen &pen, const RasterPoint *lppt, unsigned n_points, bool loop) { const unsigned thickness = pen.GetWidth(); const unsigned mask = pen.GetMask(); const auto color = canvas.Import(pen.GetColor()); const SDLRasterCanvas::Point *points = reinterpret_cast<const SDLRasterCanvas::Point *>(lppt); canvas.DrawPolyline(points, n_points, loop, color, thickness, mask); }
void MapWindow::DrawRoute(Canvas &canvas) { const auto &route = Calculated().planned_route; const auto r_size = route.size(); RasterPoint p[r_size], *pp = &p[0]; for (auto i = route.begin(), end = route.end(); i != end; ++i, ++pp) *pp = render_projection.GeoToScreen(*i); ScreenClosestPoint(p[r_size-1], p[r_size-2], p[r_size-1], &p[r_size-1], Layout::Scale(20)); canvas.Select(look.task.bearing_pen); canvas.DrawPolyline(p, r_size); }
void GaugeVario::RenderNeedle(Canvas &canvas, int i, bool average, bool clear) { dirty = true; canvas.SelectNullPen(); // legacy behaviour if (clear ^ look.inverse) { canvas.SelectWhiteBrush(); } else { canvas.SelectBlackBrush(); } if (average) canvas.DrawPolyline(getPolygon(i), 3); else canvas.DrawTriangleFan(getPolygon(i), 3); }
void TrackLineRenderer::DrawProjected(Canvas &canvas, const WindowProjection &projection, const NMEAInfo &basic, const DerivedInfo &calculated, const MapSettings &settings, bool wind_relative) { // projection.GetMapScale() <= 6000; GeoPoint traildrift; if (calculated.wind_available && !wind_relative) { GeoPoint tp1 = FindLatitudeLongitude(basic.location, calculated.wind.bearing, calculated.wind.norm); traildrift = basic.location - tp1; } else { traildrift = GeoPoint(Angle::Zero(), Angle::Zero()); } auto dt = ARC_SWEEP/ARC_STEPS/ std::max(MIN_RATE,calculated.turn_rate_heading_smoothed.Absolute()); Angle heading = basic.attitude.heading; GeoPoint loc = basic.location; RasterPoint pts[ARC_STEPS+1]; pts[0] = projection.GeoToScreen(loc); int i = 1; while (i <= ARC_STEPS) { GeoVector v(basic.true_airspeed*dt, heading); loc = v.EndPoint(loc.Parametric(traildrift, dt)); pts[i] = projection.GeoToScreen(loc); heading += calculated.turn_rate_heading_smoothed*dt; i++; } canvas.Select(look.track_line_pen); canvas.DrawPolyline(pts, i); }
static void OnTextPaint(gcc_unused WndOwnerDrawFrame *Sender, Canvas &canvas) { const PixelRect rc = Sender->GetClientRect(); canvas.Clear(Color(0x40, 0x40, 0x00)); // Do the actual painting of the text const DialogLook &look = UIGlobals::GetDialogLook(); canvas.Select(*look.text_font); PixelSize tsize = canvas.CalcTextSize(edittext); PixelSize tsizec = canvas.CalcTextSize(edittext, cursor); PixelSize tsizea = canvas.CalcTextSize(edittext, cursor + 1); RasterPoint p[5]; p[0].x = 10; p[0].y = (rc.bottom - rc.top - tsize.cy - 5) / 2; p[2].x = p[0].x + tsizec.cx; p[2].y = p[0].y + tsize.cy + 5; p[3].x = p[0].x + tsizea.cx; p[3].y = p[0].y + tsize.cy + 5; p[1].x = p[2].x; p[1].y = p[2].y - 2; p[4].x = p[3].x; p[4].y = p[3].y - 2; canvas.SelectWhitePen(); canvas.DrawPolyline(p + 1, 4); canvas.SetBackgroundTransparent(); canvas.SetTextColor(COLOR_WHITE); canvas.DrawText(p[0].x, p[0].y, edittext); }
void KnobTextEntryWindow::OnPaint(Canvas &canvas) { const PixelRect rc = GetClientRect(); canvas.Clear(Color(0x40, 0x40, 0x00)); // Do the actual painting of the text const DialogLook &look = UIGlobals::GetDialogLook(); canvas.Select(look.text_font); PixelSize tsize = canvas.CalcTextSize(buffer); PixelSize tsizec = canvas.CalcTextSize(buffer, cursor); PixelSize tsizea = canvas.CalcTextSize(buffer, cursor + 1); BulkPixelPoint p[5]; p[0].x = 10; p[0].y = (rc.GetHeight() - tsize.cy - 5) / 2; p[2].x = p[0].x + tsizec.cx; p[2].y = p[0].y + tsize.cy + 5; p[3].x = p[0].x + tsizea.cx; p[3].y = p[0].y + tsize.cy + 5; p[1].x = p[2].x; p[1].y = p[2].y - 2; p[4].x = p[3].x; p[4].y = p[3].y - 2; canvas.SelectWhitePen(); canvas.DrawPolyline(p + 1, 4); canvas.SetBackgroundTransparent(); canvas.SetTextColor(COLOR_WHITE); canvas.DrawText(p[0].x, p[0].y, buffer); }
//------------------------------------------------------------------------------ int main(int argc, char *argv[]) { QApplication app(argc, argv); Canvas c; Pen(Pen::SOLID, 1, Color(0, 0, 0)); { c.Select(Brush(Color(128, 128, 0, Color::TRANSPARENT))); c.DrawKeyhole(200, 100, 50, 100, Angle::Degrees(-20), Angle::Degrees(20)); c.DrawKeyhole(400, 100, 50, 100, Angle::Degrees(70), Angle::Degrees(110)); c.DrawKeyhole(200, 300, 50, 100, Angle::Degrees(160), Angle::Degrees(200)); c.DrawKeyhole(400, 300, 50, 100, Angle::Degrees(-110), Angle::Degrees(-70)); c.show(); app.exec(); } { c.Clear(); c.DrawKeyhole(200, 100, 50, 100, Angle::Degrees(35), Angle::Degrees(55)); c.DrawKeyhole(400, 100, 50, 100, Angle::Degrees(125), Angle::Degrees(145)); c.DrawKeyhole(200, 300, 50, 100, Angle::Degrees(215), Angle::Degrees(235)); c.DrawKeyhole(400, 300, 50, 100, Angle::Degrees(305), Angle::Degrees(325)); c.show(); app.exec(); } { c.Clear(); c.DrawFilledRectangle(0, 0, 100, 100, Color(128, 128, 128, Color::TRANSPARENT)); c.DrawFilledRectangle(100, 100, 200, 200, Color(128, 0, 0, Color::TRANSPARENT)); c.DrawFilledRectangle(150, 150, 250, 250, Color(0, 128, 0, Color::TRANSPARENT)); c.DrawFilledRectangle(200, 200, 300, 300, Color(0, 0, 128, Color::TRANSPARENT)); c.DrawTransparentText(0, 0, "0"); c.DrawTransparentText(0, 100, "100"); c.DrawTransparentText(0, 200, "200"); c.DrawTransparentText(0, 300, "300"); c.DrawTransparentText(0, 400, "400"); c.DrawTransparentText(0, 500, "500"); c.DrawTransparentText(100, c.GetFontHeight(), "100"); c.DrawTransparentText(200, c.GetFontHeight(), "200"); c.DrawTransparentText(300, c.GetFontHeight(), "300"); c.DrawTransparentText(400, c.GetFontHeight(), "400"); c.DrawTransparentText(500, c.GetFontHeight(), "500"); c.show(); app.exec(); } { c.Clear(); c.DrawOutlineRectangle(100, 100, 200, 200, Color(255, 0, 0)); c.show(); app.exec(); } { c.Clear(); c.DrawRoundRectangle(100, 100, 200, 200, 10, 10); c.DrawRoundRectangle(200, 200, 300, 300, 100, 100); c.DrawRoundRectangle(300, 300, 400, 400, 50, 50); c.show(); app.exec(); } { c.Clear(); PixelRect rc; rc.left = 100; rc.top = 100; rc.right = 200; rc.bottom = 200; c.DrawRaisedEdge(rc); c.show(); app.exec(); } { c.Clear(); RasterPoint rp[4]; rp[0] = {100, 100}; rp[1] = {200, 200}; rp[2] = {200, 300}; rp[3] = {300, 400}; c.DrawPolyline(rp, 4); c.show(); app.exec(); } { c.Clear(); RasterPoint rp[6]; rp[0] = {100, 100}; rp[1] = {150, 50}; rp[2] = {200, 100}; rp[3] = {200, 200}; rp[4] = {150, 200}; rp[5] = {100, 100}; c.DrawPolygon(rp, 6); c.show(); app.exec(); } { c.Clear(); RasterPoint rp[4]; rp[0] = {100, 100}; rp[1] = {200, 50}; rp[2] = {200, 150}; rp[3] = {150, 200}; c.DrawTriangleFan(rp, 4); c.show(); app.exec(); } { c.Clear(); c.DrawHLine(100, 200, 100, Color(255, 0, 0)); c.DrawHLine(100, 200, 200, Color(0, 255, 0)); c.DrawHLine(100, 200, 300, Color(0, 0, 255)); c.show(); app.exec(); } { c.Clear(); c.DrawLine(100, 100, 200, 200); c.DrawCircle(250, 250, 50); c.DrawSegment(100, 250, 50, Angle::Degrees(10), Angle::Degrees(30), false); c.show(); app.exec(); } { c.Clear(); c.DrawAnnulus(100, 100, 50, 100, Angle::Degrees(10), Angle::Degrees(60)); c.DrawAnnulus(300, 100, 50, 100, Angle::Degrees(0), Angle::Degrees(360)); c.DrawAnnulus(100, 300, 50, 100, Angle::Degrees(0), Angle::Degrees(0)); c.show(); app.exec(); } { PixelSize rc = c.CalcTextSize("Hello"); std::cout << "Size of \"Hello\": " << rc.cx << ", " << rc.cy << std::endl; c.DrawClippedText(100, 100, rc.cx / 2, "Hello"); c.show(); app.exec(); } { std::cout << "Height of font: " << c.GetFontHeight() << std::endl; } { c.Clear(); c.DrawText(0, 50, "50"); c.Clear(); c.show(); return app.exec(); } }