9#include "model/own_ship.h"
10#include "model/routeman.h"
15extern wxColour g_colourTrackLineColour;
17extern wxColor GetDimColor(wxColor c);
18extern bool g_bHighliteTracks;
29 pen = g_pRouteMan->GetRoutePointPen();
34 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
43 wxColour hi_colour = pen->GetColour();
44 unsigned char transparency = 100;
47 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
48 hilitebox.height, radius, hi_colour, transparency);
51void TrackGui::Finalize() {
52 if (m_track.SubTracks.size())
57 int n = m_track.TrackPoints.size() - 1;
60 std::vector<SubTrack> new_level;
63 for (
int i = 0; i < n; i++) {
64 new_level[i].m_box.SetFromSegment(m_track.TrackPoints[i]->m_lat,
65 m_track.TrackPoints[i]->m_lon,
66 m_track.TrackPoints[i + 1]->m_lat,
67 m_track.TrackPoints[i + 1]->m_lon);
68 new_level[i].m_scale = 0;
71 for (
int i = 0; i < n; i++) {
73 new_level[i].m_box = m_track.SubTracks[level - 1][p].m_box;
74 if (p + 1 < (
int)m_track.SubTracks[level - 1].size())
75 new_level[i].m_box.Expand(m_track.SubTracks[level - 1][p + 1].m_box);
77 int left = i << level;
78 int right = wxMin(left + (1 << level), m_track.TrackPoints.size() - 1);
79 new_level[i].m_scale = m_track.ComputeScale(left, right);
82 m_track.SubTracks.push_back(new_level);
84 if (n > 1 && n & 1) n++;
94 std::list<std::list<wxPoint> > &pointlists,
96 if (!m_track.IsVisible() || m_track.GetnPoints() == 0)
return;
101 if(GetnPoints() > 40000) {
102 double t = sw.GetTime();
104 for(std::list< std::list<wxPoint> >::iterator lines = pointlists.begin();
105 lines != pointlists.end(); lines++) {
106 if(lines->size() > 1)
110 printf(
"assemble time %f %f segments %f seg/ms\n", sw.GetTime(), c, c/t);
116 if (m_track.IsRunning()) {
117 std::list<wxPoint> new_list;
118 pointlists.push_back(new_list);
119 AddPointToList(cc, pointlists, m_track.TrackPoints.size() - 1);
122 pointlists.back().push_back(r);
128 std::list<std::list<wxPoint> > pointlists;
129 GetPointLists(cc, pointlists, VP, box);
131 if (!pointlists.size())
return;
134 wxColour basic_colour;
135 if (m_track.IsRunning())
136 basic_colour = GetGlobalColor(_T (
"URED" ));
138 basic_colour = GetDimColor(g_colourTrackLineColour);
140 wxPenStyle style = wxPENSTYLE_SOLID;
141 int width = g_pRouteMan->GetTrackPen()->GetWidth();
143 if (m_track.m_style != wxPENSTYLE_INVALID) style = m_track.m_style;
144 if (m_track.m_width != WIDTH_UNDEFINED) width = m_track.m_width;
145 if (m_track.m_Colour == wxEmptyString) {
149 if (m_track.GetName().StartsWith(
"AIS"))
150 col = GetGlobalColor(_T (
"TEAL1" ));
152 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
154 if (m_track.m_Colour == ::GpxxColorNames[i]) {
155 col = ::GpxxColors[i];
162 if (g_bHighliteTracks) {
163 double radius_meters = 20;
165 radius = wxMax((radius_meters * wxMin(
scale, 1.1)), 6.0);
166 if (
scale < 0.004) radius = 0;
170 wxPen p = *wxThePenList->FindOrCreatePen(col, width, style);
172 if (glChartCanvas::dash_map.find(style) != glChartCanvas::dash_map.end()) {
173 p.SetDashes(2, &glChartCanvas::dash_map[style][0]);
177 dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(col, wxBRUSHSTYLE_SOLID));
178 for (std::list<std::list<wxPoint> >::iterator lines = pointlists.begin();
179 lines != pointlists.end(); lines++) {
181 wxPoint *points =
new wxPoint[lines->size()];
183 for (std::list<wxPoint>::iterator line = lines->begin();
184 line != lines->end(); line++) {
189 int hilite_width = radius;
190 if (hilite_width >= 1.0) {
192 wxPen psave = dc.GetPen();
194 wxColor trackLine_dim_colour = GetDimColor(g_colourTrackLineColour);
195 wxColour hilt(trackLine_dim_colour.Red(), trackLine_dim_colour.Green(),
196 trackLine_dim_colour.Blue(), 128);
197 wxPen HiPen(hilt, hilite_width, wxPENSTYLE_SOLID);
200 dc.StrokeLines(i, points);
204 dc.StrokeLines(i, points);
206 dc.StrokeLines(i, points);
212 if (m_track.m_HighlightedTrackPoint >= 0)
213 TrackPointGui(m_track.TrackPoints[m_track.m_HighlightedTrackPoint])
219 std::list<std::list<wxPoint> > &pointlists,
220 const LLBBox &box,
double scale) {
221 if (!m_track.SubTracks.size())
return;
223 int level = m_track.SubTracks.size() - 1, last = -2;
224 Assemble(cc, pointlists, box, 1 /
scale /
scale, last, level, 0);
230 std::list<std::list<wxPoint> > &pointlists,
231 const LLBBox &box,
double scale,
int &last,
int level,
233 if (pos == (
int)m_track.SubTracks[level].size())
return;
235 SubTrack &s = m_track.SubTracks[level][pos];
236 if (box.IntersectOut(s.m_box))
return;
238 if (s.m_scale <
scale) {
241 if (last < pos - 1) {
242 std::list<wxPoint> new_list;
243 pointlists.push_back(new_list);
246 if (last < pos) AddPointToList(cc, pointlists, pos);
247 last = wxMin(pos + (1 << level), m_track.TrackPoints.size() - 1);
248 AddPointToList(cc, pointlists, last);
250 Assemble(cc, pointlists, box,
scale, last, level - 1, pos << 1);
251 Assemble(cc, pointlists, box,
scale, last, level - 1, (pos << 1) + 1);
256 std::list<std::list<wxPoint> > &pointlists,
258 wxPoint r(INVALID_COORD, INVALID_COORD);
259 if ((
size_t)n < m_track.TrackPoints.size())
261 m_track.TrackPoints[n]->m_lon, &r);
263 std::list<wxPoint> &pointlist = pointlists.back();
264 if (r.x == INVALID_COORD) {
265 if (pointlist.size()) {
266 std::list<wxPoint> new_list;
267 pointlists.push_back(new_list);
272 if (pointlist.size() == 0)
273 pointlist.push_back(r);
275 wxPoint l = pointlist.back();
277 if ((abs(r.x - l.x) > 1) || (abs(r.y - l.y) > 1)) pointlist.push_back(r);
ChartCanvas - Main chart display and interaction component.
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
ViewPort - Core geographic projection and coordinate transformation engine.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
Device context class that can use either wxDC or OpenGL for drawing.
Global color handling by name.
OpenGL chart rendering canvas.