43extern wxColor GetDimColor(wxColor c);
59 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
68 wxColour hi_colour = pen->GetColour();
69 unsigned char transparency = 100;
72 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
73 hilitebox.height, radius, hi_colour, transparency);
76void TrackGui::Finalize() {
77 if (m_track.SubTracks.size())
82 int n = m_track.TrackPoints.size() - 1;
85 std::vector<SubTrack> new_level;
88 for (
int i = 0; i < n; i++) {
89 new_level[i].m_box.SetFromSegment(m_track.TrackPoints[i]->m_lat,
90 m_track.TrackPoints[i]->m_lon,
91 m_track.TrackPoints[i + 1]->m_lat,
92 m_track.TrackPoints[i + 1]->m_lon);
93 new_level[i].m_scale = 0;
96 for (
int i = 0; i < n; i++) {
98 new_level[i].m_box = m_track.SubTracks[level - 1][p].m_box;
99 if (p + 1 < (
int)m_track.SubTracks[level - 1].size())
100 new_level[i].m_box.Expand(m_track.SubTracks[level - 1][p + 1].m_box);
102 int left = i << level;
103 int right = wxMin(left + (1 << level), m_track.TrackPoints.size() - 1);
104 new_level[i].m_scale = m_track.ComputeScale(left, right);
107 m_track.SubTracks.push_back(new_level);
109 if (n > 1 && n & 1) n++;
119 std::list<std::list<wxPoint> > &pointlists,
121 if (!m_track.IsVisible() || m_track.GetnPoints() == 0)
return;
126 if(GetnPoints() > 40000) {
127 double t = sw.GetTime();
129 for(std::list< std::list<wxPoint> >::iterator lines = pointlists.begin();
130 lines != pointlists.end(); lines++) {
131 if(lines->size() > 1)
135 printf(
"assemble time %f %f segments %f seg/ms\n", sw.GetTime(), c, c/t);
141 if (m_track.IsRunning()) {
142 std::list<wxPoint> new_list;
143 pointlists.push_back(new_list);
144 AddPointToList(cc, pointlists, m_track.TrackPoints.size() - 1);
147 pointlists.back().push_back(r);
153 std::list<std::list<wxPoint> > pointlists;
154 GetPointLists(cc, pointlists, VP, box);
156 if (!pointlists.size())
return;
159 wxColour basic_colour;
160 if (m_track.IsRunning())
161 basic_colour = GetGlobalColor(
"URED");
163 basic_colour = GetDimColor(g_colourTrackLineColour);
165 wxPenStyle style = wxPENSTYLE_SOLID;
166 int width =
g_pRouteMan->GetTrackPen()->GetWidth();
168 if (m_track.m_style != wxPENSTYLE_INVALID) style = m_track.m_style;
169 if (m_track.m_width != WIDTH_UNDEFINED) width = m_track.m_width;
170 if (m_track.m_Colour ==
"") {
174 if (m_track.GetName().StartsWith(
"AIS")) col = GetGlobalColor(
"TEAL1");
176 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
178 if (m_track.m_Colour == ::GpxxColorNames[i]) {
179 col = ::GpxxColors[i];
186 if (g_bHighliteTracks) {
187 double radius_meters = 20;
189 radius = wxMax((radius_meters * wxMin(
scale, 1.1)), 6.0);
190 if (
scale < 0.004) radius = 0;
194 wxPen p = *wxThePenList->FindOrCreatePen(col, width, style);
196 if (glChartCanvas::dash_map.find(style) != glChartCanvas::dash_map.end()) {
197 p.SetDashes(2, &glChartCanvas::dash_map[style][0]);
201 dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(col, wxBRUSHSTYLE_SOLID));
202 for (std::list<std::list<wxPoint> >::iterator lines = pointlists.begin();
203 lines != pointlists.end(); lines++) {
205 wxPoint *points =
new wxPoint[lines->size()];
207 for (std::list<wxPoint>::iterator line = lines->begin();
208 line != lines->end(); line++) {
213 int hilite_width = radius;
214 if (hilite_width >= 1.0) {
216 wxPen psave = dc.GetPen();
218 wxColor trackLine_dim_colour = GetDimColor(g_colourTrackLineColour);
219 wxColour hilt(trackLine_dim_colour.Red(), trackLine_dim_colour.Green(),
220 trackLine_dim_colour.Blue(), 128);
221 wxPen HiPen(hilt, hilite_width, wxPENSTYLE_SOLID);
224 dc.StrokeLines(i, points);
228 dc.StrokeLines(i, points);
230 dc.StrokeLines(i, points);
236 if (m_track.m_HighlightedTrackPoint >= 0)
237 TrackPointGui(m_track.TrackPoints[m_track.m_HighlightedTrackPoint])
243 std::list<std::list<wxPoint> > &pointlists,
244 const LLBBox &box,
double scale) {
245 if (!m_track.SubTracks.size())
return;
247 int level = m_track.SubTracks.size() - 1, last = -2;
248 Assemble(cc, pointlists, box, 1 /
scale /
scale, last, level, 0);
254 std::list<std::list<wxPoint> > &pointlists,
255 const LLBBox &box,
double scale,
int &last,
int level,
257 if (pos == (
int)m_track.SubTracks[level].size())
return;
259 SubTrack &s = m_track.SubTracks[level][pos];
260 if (box.IntersectOut(s.m_box))
return;
262 if (s.m_scale <
scale) {
265 if (last < pos - 1) {
266 std::list<wxPoint> new_list;
267 pointlists.push_back(new_list);
270 if (last < pos) AddPointToList(cc, pointlists, pos);
271 last = wxMin(pos + (1 << level), m_track.TrackPoints.size() - 1);
272 AddPointToList(cc, pointlists, last);
274 Assemble(cc, pointlists, box,
scale, last, level - 1, pos << 1);
275 Assemble(cc, pointlists, box,
scale, last, level - 1, (pos << 1) + 1);
280 std::list<std::list<wxPoint> > &pointlists,
282 wxPoint r(INVALID_COORD, INVALID_COORD);
283 if ((
size_t)n < m_track.TrackPoints.size())
285 m_track.TrackPoints[n]->m_lon, &r);
287 std::list<wxPoint> &pointlist = pointlists.back();
288 if (r.x == INVALID_COORD) {
289 if (pointlist.size()) {
290 std::list<wxPoint> new_list;
291 pointlists.push_back(new_list);
296 if (pointlist.size() == 0)
297 pointlist.push_back(r);
299 wxPoint l = pointlist.back();
301 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.
Global variables stored in configuration file.
OpenGL chart rendering canvas.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
double gLat
Vessel's current latitude in decimal degrees.
double gLon
Vessel's current longitude in decimal degrees.
Position, course, speed, etc.
Routeman * g_pRouteMan
Global instance.
Track and Trackpoint drawing stuff.